gallium/hud: disable queries during HUD draw calls
authorMarek Olšák <marek.olsak@amd.com>
Sun, 15 Jan 2017 21:28:15 +0000 (22:28 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 16 Jan 2017 14:35:30 +0000 (15:35 +0100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/hud/hud_context.c
src/gallium/auxiliary/hud/hud_driver_query.c
src/gallium/auxiliary/hud/hud_private.h

index 9f067f3dfdb0833569097ab8934c9a82e87018b6..fd9a7bc2fcbd40c75894612b78521c2e60a3842e 100644 (file)
@@ -662,6 +662,16 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex)
    cso_restore_constant_buffer_slot0(cso, PIPE_SHADER_VERTEX);
 
    pipe_surface_reference(&surf, NULL);
+
+   /* Start queries. */
+   hud_batch_query_begin(hud->batch_query);
+
+   LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) {
+      LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
+         if (gr->begin_query)
+            gr->begin_query(gr);
+      }
+   }
 }
 
 static void
index d80b8eda60c65e443f1c4f89b589b8c484d3f62f..6a97dbd88126f2f1fbe924f1b44d5bc627407221 100644 (file)
@@ -116,8 +116,15 @@ hud_batch_query_update(struct hud_batch_query_context *bq)
          return;
       }
    }
+}
+
+void
+hud_batch_query_begin(struct hud_batch_query_context *bq)
+{
+   if (!bq || bq->failed || !bq->query[bq->head])
+      return;
 
-   if (!pipe->begin_query(pipe, bq->query[bq->head])) {
+   if (!bq->pipe->begin_query(bq->pipe, bq->query[bq->head])) {
       fprintf(stderr,
               "gallium_hud: could not begin batch query. You may have "
               "selected too many or incompatible queries.\n");
@@ -277,7 +284,15 @@ query_new_value_normal(struct query_info *info)
       /* initialize */
       info->query[info->head] = pipe->create_query(pipe, info->query_type, 0);
    }
+}
+
+static void
+begin_query(struct hud_graph *gr)
+{
+   struct query_info *info = gr->query_data;
+   struct pipe_context *pipe = info->pipe;
 
+   assert(!info->batch);
    if (info->query[info->head])
       pipe->begin_query(pipe, info->query[info->head]);
 }
@@ -374,6 +389,7 @@ hud_pipe_query_install(struct hud_batch_query_context **pbq,
          goto fail_info;
       info->batch = *pbq;
    } else {
+      gr->begin_query = begin_query;
       info->query_type = query_type;
       info->result_index = result_index;
    }
index d719e5f5ebbb0e9e1434b0dbb846b700eae392ff..b23439e5c662782bf82b76cfd28e8a0b75c1eb70 100644 (file)
@@ -41,6 +41,7 @@ struct hud_graph {
    /* name and query */
    char name[128];
    void *query_data;
+   void (*begin_query)(struct hud_graph *gr);
    void (*query_new_value)(struct hud_graph *gr);
    void (*free_query_data)(void *ptr); /**< do not use ordinary free() */
 
@@ -103,6 +104,7 @@ void hud_pipe_query_install(struct hud_batch_query_context **pbq,
 boolean hud_driver_query_install(struct hud_batch_query_context **pbq,
                                  struct hud_pane *pane,
                                  struct pipe_context *pipe, const char *name);
+void hud_batch_query_begin(struct hud_batch_query_context *bq);
 void hud_batch_query_update(struct hud_batch_query_context *bq);
 void hud_batch_query_cleanup(struct hud_batch_query_context **pbq);