Home | History | Annotate | Download | only in etnaviv
      1 /*
      2  * Copyright (c) 2016 Etnaviv Project
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sub license,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the
     12  * next paragraph) shall be included in all copies or substantial portions
     13  * of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Rob Clark <robclark (at) freedesktop.org>
     25  *    Christian Gmeiner <christian.gmeiner (at) gmail.com>
     26  */
     27 
     28 #include "os/os_time.h"
     29 #include "pipe/p_state.h"
     30 #include "util/u_inlines.h"
     31 #include "util/u_memory.h"
     32 #include "util/u_string.h"
     33 
     34 #include "etnaviv_context.h"
     35 #include "etnaviv_query_sw.h"
     36 
     37 static void
     38 etna_sw_destroy_query(struct etna_context *ctx, struct etna_query *q)
     39 {
     40    struct etna_sw_query *sq = etna_sw_query(q);
     41 
     42    FREE(sq);
     43 }
     44 
     45 static uint64_t
     46 read_counter(struct etna_context *ctx, int type)
     47 {
     48    switch (type) {
     49    case PIPE_QUERY_PRIMITIVES_EMITTED:
     50       return ctx->stats.prims_emitted;
     51    case ETNA_QUERY_DRAW_CALLS:
     52       return ctx->stats.draw_calls;
     53    }
     54 
     55    return 0;
     56 }
     57 
     58 static boolean
     59 etna_sw_begin_query(struct etna_context *ctx, struct etna_query *q)
     60 {
     61    struct etna_sw_query *sq = etna_sw_query(q);
     62 
     63    q->active = true;
     64    sq->begin_value = read_counter(ctx, q->type);
     65 
     66    return true;
     67 }
     68 
     69 static void
     70 etna_sw_end_query(struct etna_context *ctx, struct etna_query *q)
     71 {
     72    struct etna_sw_query *sq = etna_sw_query(q);
     73 
     74    q->active = false;
     75    sq->end_value = read_counter(ctx, q->type);
     76 }
     77 
     78 static boolean
     79 etna_sw_get_query_result(struct etna_context *ctx, struct etna_query *q,
     80                          boolean wait, union pipe_query_result *result)
     81 {
     82    struct etna_sw_query *sq = etna_sw_query(q);
     83 
     84    if (q->active)
     85       return false;
     86 
     87    util_query_clear_result(result, q->type);
     88    result->u64 = sq->end_value - sq->begin_value;
     89 
     90    return true;
     91 }
     92 
     93 static const struct etna_query_funcs sw_query_funcs = {
     94    .destroy_query = etna_sw_destroy_query,
     95    .begin_query = etna_sw_begin_query,
     96    .end_query = etna_sw_end_query,
     97    .get_query_result = etna_sw_get_query_result,
     98 };
     99 
    100 struct etna_query *
    101 etna_sw_create_query(struct etna_context *ctx, unsigned query_type)
    102 {
    103    struct etna_sw_query *sq;
    104    struct etna_query *q;
    105 
    106    switch (query_type) {
    107    case PIPE_QUERY_PRIMITIVES_EMITTED:
    108    case ETNA_QUERY_DRAW_CALLS:
    109       break;
    110    default:
    111       return NULL;
    112    }
    113 
    114    sq = CALLOC_STRUCT(etna_sw_query);
    115    if (!sq)
    116       return NULL;
    117 
    118    q = &sq->base;
    119    q->funcs = &sw_query_funcs;
    120    q->type = query_type;
    121 
    122    return q;
    123 }
    124