gallium: add bool return to pipe_context::end_query
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 20 Apr 2016 14:22:48 +0000 (09:22 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 22 Apr 2016 03:32:50 +0000 (22:32 -0500)
Even when begin_query succeeds, there can still be failures in query handling.
For example for radeon, additional buffers may have to be allocated when
queries span multiple command buffers.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
19 files changed:
src/gallium/drivers/ddebug/dd_context.c
src/gallium/drivers/freedreno/freedreno_query.c
src/gallium/drivers/i915/i915_query.c
src/gallium/drivers/ilo/ilo_query.c
src/gallium/drivers/llvmpipe/lp_query.c
src/gallium/drivers/noop/noop_pipe.c
src/gallium/drivers/nouveau/nv30/nv30_query.c
src/gallium/drivers/nouveau/nv50/nv50_query.c
src/gallium/drivers/nouveau/nvc0/nvc0_query.c
src/gallium/drivers/r300/r300_query.c
src/gallium/drivers/radeon/r600_query.c
src/gallium/drivers/rbug/rbug_context.c
src/gallium/drivers/softpipe/sp_query.c
src/gallium/drivers/svga/svga_pipe_query.c
src/gallium/drivers/swr/swr_query.cpp
src/gallium/drivers/trace/tr_context.c
src/gallium/drivers/vc4/vc4_query.c
src/gallium/drivers/virgl/virgl_query.c
src/gallium/include/pipe/p_context.h

index 72a950a456ad0a383ef88e79c18c5d887322e78e..d06efbc0a1c0fd84935333d66c63490d27460c15 100644 (file)
@@ -104,13 +104,13 @@ dd_context_begin_query(struct pipe_context *_pipe, struct pipe_query *query)
    return pipe->begin_query(pipe, dd_query_unwrap(query));
 }
 
-static void
+static bool
 dd_context_end_query(struct pipe_context *_pipe, struct pipe_query *query)
 {
    struct dd_context *dctx = dd_context(_pipe);
    struct pipe_context *pipe = dctx->pipe;
 
-   pipe->end_query(pipe, dd_query_unwrap(query));
+   return pipe->end_query(pipe, dd_query_unwrap(query));
 }
 
 static boolean
index a9427058579dc1af711e28e03c90e7ba975853aa..18e0c793c51a2d93061a897939f6611b7d2cd129 100644 (file)
@@ -66,11 +66,12 @@ fd_begin_query(struct pipe_context *pctx, struct pipe_query *pq)
        return q->funcs->begin_query(fd_context(pctx), q);
 }
 
-static void
+static bool
 fd_end_query(struct pipe_context *pctx, struct pipe_query *pq)
 {
        struct fd_query *q = fd_query(pq);
        q->funcs->end_query(fd_context(pctx), q);
+       return true;
 }
 
 static boolean
index fa1b01d180427385d36d1ba328e9a52172024e1a..d6015a62f46c63015459ee3234dd04abe3b26560 100644 (file)
@@ -60,8 +60,9 @@ static boolean i915_begin_query(struct pipe_context *ctx,
    return true;
 }
 
-static void i915_end_query(struct pipe_context *ctx, struct pipe_query *query)
+static bool i915_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
+   return true;
 }
 
 static boolean i915_get_query_result(struct pipe_context *ctx,
index 8a42f58a87f5560e963c396bb375639f3264c7cc..3088c969787f0abbcbfb9f6ff7b13bbd59c049b9 100644 (file)
@@ -128,7 +128,7 @@ ilo_begin_query(struct pipe_context *pipe, struct pipe_query *query)
    return true;
 }
 
-static void
+static bool
 ilo_end_query(struct pipe_context *pipe, struct pipe_query *query)
 {
    struct ilo_query *q = ilo_query(query);
@@ -136,7 +136,7 @@ ilo_end_query(struct pipe_context *pipe, struct pipe_query *query)
    if (!q->active) {
       /* require ilo_begin_query() first */
       if (q->in_pairs)
-         return;
+         return false;
 
       ilo_begin_query(pipe, query);
    }
@@ -144,6 +144,8 @@ ilo_end_query(struct pipe_context *pipe, struct pipe_query *query)
    q->active = false;
 
    ilo_query_table[q->type].end(ilo_context(pipe), q);
+
+   return true;
 }
 
 /**
index 2fddc90503f2c19f79ffd17b0e9bc2c3737f0643..d5ed6561b8c09b604e067c1b6e7abb485ef96b07 100644 (file)
@@ -239,7 +239,7 @@ llvmpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
 }
 
 
-static void
+static bool
 llvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
 {
    struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe );
@@ -298,6 +298,8 @@ llvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
    default:
       break;
    }
+
+   return true;
 }
 
 boolean
index 55aca74628e41838570e413768f36d2dbf1df97c..99e5f1ae1a99a15e631996a0b23850700b5dd5fd 100644 (file)
@@ -63,8 +63,9 @@ static boolean noop_begin_query(struct pipe_context *ctx, struct pipe_query *que
    return true;
 }
 
-static void noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
+static bool noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
+   return true;
 }
 
 static boolean noop_get_query_result(struct pipe_context *ctx,
index cb53a3663e52d8379306e0ad54a8bc98566782f7..aa9a12fe3bd72c71a3137df44c618f29ca0944aa 100644 (file)
@@ -175,7 +175,7 @@ nv30_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
    return true;
 }
 
-static void
+static bool
 nv30_query_end(struct pipe_context *pipe, struct pipe_query *pq)
 {
    struct nv30_context *nv30 = nv30_context(pipe);
@@ -194,6 +194,7 @@ nv30_query_end(struct pipe_context *pipe, struct pipe_query *pq)
       PUSH_DATA (push, 0);
    }
    PUSH_KICK (push);
+   return true;
 }
 
 static boolean
index fa70fb6950e0ea98252d8d0a798b5a9bd2bcc628..9a1397a986016586e3f6777354ff6a40566a4206 100644 (file)
@@ -54,11 +54,12 @@ nv50_begin_query(struct pipe_context *pipe, struct pipe_query *pq)
    return q->funcs->begin_query(nv50_context(pipe), q);
 }
 
-static void
+static bool
 nv50_end_query(struct pipe_context *pipe, struct pipe_query *pq)
 {
    struct nv50_query *q = nv50_query(pq);
    q->funcs->end_query(nv50_context(pipe), q);
+   return true;
 }
 
 static boolean
index b34271c49117324696994ddcb63e74c7ebe74145..91fb72f90b567b4be8d24b1c510b73c6d438a7ef 100644 (file)
@@ -58,11 +58,12 @@ nvc0_begin_query(struct pipe_context *pipe, struct pipe_query *pq)
    return q->funcs->begin_query(nvc0_context(pipe), q);
 }
 
-static void
+static bool
 nvc0_end_query(struct pipe_context *pipe, struct pipe_query *pq)
 {
    struct nvc0_query *q = nvc0_query(pq);
    q->funcs->end_query(nvc0_context(pipe), q);
+   return true;
 }
 
 static boolean
index 7603985b14b6836c40b996d52e77f4ab9dd9a042..8557eb72141bc4ee634f959d8bbcbe41da96929d 100644 (file)
@@ -110,7 +110,7 @@ void r300_stop_query(struct r300_context *r300)
     r300->query_current = NULL;
 }
 
-static void r300_end_query(struct pipe_context* pipe,
+static bool r300_end_query(struct pipe_context* pipe,
                           struct pipe_query* query)
 {
     struct r300_context* r300 = r300_context(pipe);
@@ -120,16 +120,18 @@ static void r300_end_query(struct pipe_context* pipe,
         pb_reference(&q->buf, NULL);
         r300_flush(pipe, RADEON_FLUSH_ASYNC,
                    (struct pipe_fence_handle**)&q->buf);
-        return;
+        return true;
     }
 
     if (q != r300->query_current) {
         fprintf(stderr, "r300: end_query: Got invalid query.\n");
         assert(0);
-        return;
+        return false;
     }
 
     r300_stop_query(r300);
+
+    return true;
 }
 
 static boolean r300_get_query_result(struct pipe_context* pipe,
index 346238e0ff8a68d5c112595a478adf7409bdb9b0..e3b9de087ddca2dde83ab5e688fb90a437bdf290 100644 (file)
@@ -725,12 +725,13 @@ boolean r600_query_hw_begin(struct r600_common_context *rctx,
        return true;
 }
 
-static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
+static bool r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
        struct r600_common_context *rctx = (struct r600_common_context *)ctx;
        struct r600_query *rquery = (struct r600_query *)query;
 
        rquery->ops->end(rctx, rquery);
+       return true;
 }
 
 void r600_query_hw_end(struct r600_common_context *rctx,
index 1280c45b53922b67ab792515de9d6888d4a72f1e..38dee7434cb961a8aa39fe470401dd3171b20fd5 100644 (file)
@@ -178,17 +178,20 @@ rbug_begin_query(struct pipe_context *_pipe,
    return ret;
 }
 
-static void
+static bool
 rbug_end_query(struct pipe_context *_pipe,
                struct pipe_query *query)
 {
    struct rbug_context *rb_pipe = rbug_context(_pipe);
    struct pipe_context *pipe = rb_pipe->pipe;
+   bool ret;
 
    pipe_mutex_lock(rb_pipe->call_mutex);
-   pipe->end_query(pipe,
-                   query);
+   ret = pipe->end_query(pipe,
+                         query);
    pipe_mutex_unlock(rb_pipe->call_mutex);
+
+   return ret;
 }
 
 static boolean
index 81e97107d59ece36dc36acbb20ba46f261aba6e0..bec0116a56e103dc305047659ef456378e93b049 100644 (file)
@@ -134,7 +134,7 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
 }
 
 
-static void
+static bool
 softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
 {
    struct softpipe_context *softpipe = softpipe_context( pipe );
@@ -201,6 +201,7 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
       break;
    }
    softpipe->dirty |= SP_NEW_QUERY;
+   return true;
 }
 
 
index 75bc9ce092bb42abf4aac228aa0abc81dfb5bee9..05b756a71c7f33845a7e45d8dbc53ada1e7cb1fb 100644 (file)
@@ -945,7 +945,7 @@ svga_begin_query(struct pipe_context *pipe, struct pipe_query *q)
 }
 
 
-static void
+static bool
 svga_end_query(struct pipe_context *pipe, struct pipe_query *q)
 {
    struct svga_context *svga = svga_context(pipe);
@@ -1057,6 +1057,7 @@ svga_end_query(struct pipe_context *pipe, struct pipe_query *q)
       assert(!"unexpected query type in svga_end_query()");
    }
    svga->sq[sq->type] = NULL;
+   return true;
 }
 
 
index e4b8b683278d03f2b772264bf205955df4a00eb6..ff4d9b350185751b5d52a70c6fbc79f5d6863593 100644 (file)
@@ -281,7 +281,7 @@ swr_begin_query(struct pipe_context *pipe, struct pipe_query *q)
    return true;
 }
 
-static void
+static bool
 swr_end_query(struct pipe_context *pipe, struct pipe_query *q)
 {
    struct swr_context *ctx = swr_context(pipe);
@@ -295,6 +295,7 @@ swr_end_query(struct pipe_context *pipe, struct pipe_query *q)
    pq->result = &pq->end;
    pq->enable_stats = FALSE;
    swr_gather_stats(pipe, pq);
+   return true;
 }
 
 
index b575f2cdb347b1eaed3935b77bf2c44a1180cda2..7ed4f4988ddce1d995adcf63c358da72c94630ca 100644 (file)
@@ -218,12 +218,13 @@ trace_context_begin_query(struct pipe_context *_pipe,
 }
 
 
-static void
+static bool
 trace_context_end_query(struct pipe_context *_pipe,
                         struct pipe_query *query)
 {
    struct trace_context *tr_ctx = trace_context(_pipe);
    struct pipe_context *pipe = tr_ctx->pipe;
+   bool ret;
 
    query = trace_query_unwrap(query);
 
@@ -232,9 +233,10 @@ trace_context_end_query(struct pipe_context *_pipe,
    trace_dump_arg(ptr, pipe);
    trace_dump_arg(ptr, query);
 
-   pipe->end_query(pipe, query);
+   ret = pipe->end_query(pipe, query);
 
    trace_dump_call_end();
+   return ret;
 }
 
 
index 17400a37ca3884d3816c6f521ca8dafcf70b3ffc..ddf8f8fb0c2c1e51212014ae65e9bd401ac23bfc 100644 (file)
@@ -56,9 +56,10 @@ vc4_begin_query(struct pipe_context *ctx, struct pipe_query *query)
         return true;
 }
 
-static void
+static bool
 vc4_end_query(struct pipe_context *ctx, struct pipe_query *query)
 {
+        return true;
 }
 
 static boolean
index 5173bd39a45f2e7c7add58e22e1e98c0f896292f..4ddb925b3479119bea2c7e665ce173b09d06d726 100644 (file)
@@ -107,7 +107,7 @@ static boolean virgl_begin_query(struct pipe_context *ctx,
    return true;
 }
 
-static void virgl_end_query(struct pipe_context *ctx,
+static bool virgl_end_query(struct pipe_context *ctx,
                            struct pipe_query *q)
 {
    struct virgl_context *vctx = virgl_context(ctx);
@@ -121,6 +121,7 @@ static void virgl_end_query(struct pipe_context *ctx,
 
 
    virgl_encoder_end_query(vctx, query->handle);
+   return true;
 }
 
 static boolean virgl_get_query_result(struct pipe_context *ctx,
index 82efaf5d8a994f001bc3b51f61652ee8448ad32b..9d7a8eb76a99d6c24863b45aa0bd819414df35d4 100644 (file)
@@ -140,7 +140,7 @@ struct pipe_context {
                          struct pipe_query *q);
 
    boolean (*begin_query)(struct pipe_context *pipe, struct pipe_query *q);
-   void (*end_query)(struct pipe_context *pipe, struct pipe_query *q);
+   bool (*end_query)(struct pipe_context *pipe, struct pipe_query *q);
 
    /**
     * Get results of a query.