radeon: reset query buffers for PIPE_QUERY_TIMESTAMP
authorNicolai Hähnle <nhaehnle@gmail.com>
Fri, 20 Nov 2015 10:46:26 +0000 (11:46 +0100)
committerNicolai Hähnle <nhaehnle@gmail.com>
Fri, 20 Nov 2015 21:46:11 +0000 (22:46 +0100)
Since begin_query is not called for this query type, we need to reset the
query buffer state in end_query instead.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93015
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Tested-by: Andy Furniss <adf.lists@gmail.com>
Tested-by: Mathias Tillman <master.homer@gmail.com>
src/gallium/drivers/radeon/r600_query.c

index 2797bcb76b73a45132a218315e93d96570b5720c..526be16aa89f858e75412557c2f9bf8119989509 100644 (file)
@@ -654,17 +654,11 @@ static boolean r600_begin_query(struct pipe_context *ctx,
        return rquery->ops->begin(rctx, rquery);
 }
 
-boolean r600_query_hw_begin(struct r600_common_context *rctx,
-                           struct r600_query *rquery)
+static void r600_query_hw_reset_buffers(struct r600_common_context *rctx,
+                                       struct r600_query_hw *query)
 {
-       struct r600_query_hw *query = (struct r600_query_hw *)rquery;
        struct r600_query_buffer *prev = query->buffer.previous;
 
-       if (query->flags & R600_QUERY_HW_FLAG_NO_START) {
-               assert(0);
-               return false;
-       }
-
        /* Discard the old query buffers. */
        while (prev) {
                struct r600_query_buffer *qbuf = prev;
@@ -682,6 +676,19 @@ boolean r600_query_hw_begin(struct r600_common_context *rctx,
 
        query->buffer.results_end = 0;
        query->buffer.previous = NULL;
+}
+
+boolean r600_query_hw_begin(struct r600_common_context *rctx,
+                           struct r600_query *rquery)
+{
+       struct r600_query_hw *query = (struct r600_query_hw *)rquery;
+
+       if (query->flags & R600_QUERY_HW_FLAG_NO_START) {
+               assert(0);
+               return false;
+       }
+
+       r600_query_hw_reset_buffers(rctx, query);
 
        r600_query_hw_emit_start(rctx, query);
 
@@ -705,6 +712,9 @@ void r600_query_hw_end(struct r600_common_context *rctx,
 {
        struct r600_query_hw *query = (struct r600_query_hw *)rquery;
 
+       if (query->flags & R600_QUERY_HW_FLAG_NO_START)
+               r600_query_hw_reset_buffers(rctx, query);
+
        r600_query_hw_emit_stop(rctx, query);
 
        if (!(query->flags & R600_QUERY_HW_FLAG_NO_START))