aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-01-15 22:28:15 +0100
committerMarek Olšák <[email protected]>2017-01-16 15:35:30 +0100
commit1fe7c8d3c9f7ace602627d9574117d5b447accd3 (patch)
treecba63d5d1b510214d4bc7b749c843e67d9019b4b
parent5b2eddc40f141f40b9c152f6e45180932288b38e (diff)
gallium/hud: disable queries during HUD draw calls
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/gallium/auxiliary/hud/hud_context.c10
-rw-r--r--src/gallium/auxiliary/hud/hud_driver_query.c18
-rw-r--r--src/gallium/auxiliary/hud/hud_private.h2
3 files changed, 29 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c
index 9f067f3dfdb..fd9a7bc2fcb 100644
--- a/src/gallium/auxiliary/hud/hud_context.c
+++ b/src/gallium/auxiliary/hud/hud_context.c
@@ -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
diff --git a/src/gallium/auxiliary/hud/hud_driver_query.c b/src/gallium/auxiliary/hud/hud_driver_query.c
index d80b8eda60c..6a97dbd8812 100644
--- a/src/gallium/auxiliary/hud/hud_driver_query.c
+++ b/src/gallium/auxiliary/hud/hud_driver_query.c
@@ -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;
}
diff --git a/src/gallium/auxiliary/hud/hud_private.h b/src/gallium/auxiliary/hud/hud_private.h
index d719e5f5ebb..b23439e5c66 100644
--- a/src/gallium/auxiliary/hud/hud_private.h
+++ b/src/gallium/auxiliary/hud/hud_private.h
@@ -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);