summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_queryobj.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index cd9c8488ba4..03104791406 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -307,12 +307,6 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
struct brw_query_object *query = (struct brw_query_object *)q;
switch (query->Base.Target) {
- case GL_TIMESTAMP:
- drm_intel_bo_unreference(query->bo);
- query->bo = drm_intel_bo_alloc(intel->bufmgr, "timer query",
- 4096, 4096);
- /* FALLTHROUGH */
-
case GL_TIME_ELAPSED_EXT:
write_timestamp(intel, query->bo, 1);
break;
@@ -468,6 +462,26 @@ brw_emit_query_end(struct brw_context *brw)
brw->query.index++;
}
+/**
+ * Driver hook for glQueryCounter().
+ *
+ * This handles GL_TIMESTAMP queries, which perform a pipelined read of the
+ * current GPU time. This is unlike GL_TIME_ELAPSED, which measures the
+ * time while the query is active.
+ */
+static void
+brw_query_counter(struct gl_context *ctx, struct gl_query_object *q)
+{
+ struct intel_context *intel = intel_context(ctx);
+ struct brw_query_object *query = (struct brw_query_object *) q;
+
+ assert(q->Target == GL_TIMESTAMP);
+
+ drm_intel_bo_unreference(query->bo);
+ query->bo = drm_intel_bo_alloc(intel->bufmgr, "timestamp query", 4096, 4096);
+ write_timestamp(intel, query->bo, 1);
+}
+
static uint64_t
brw_get_timestamp(struct gl_context *ctx)
{
@@ -490,6 +504,7 @@ void brw_init_queryobj_functions(struct dd_function_table *functions)
functions->DeleteQuery = brw_delete_query;
functions->BeginQuery = brw_begin_query;
functions->EndQuery = brw_end_query;
+ functions->QueryCounter = brw_query_counter;
functions->CheckQuery = brw_check_query;
functions->WaitQuery = brw_wait_query;
functions->GetTimestamp = brw_get_timestamp;