st/mesa: implement ARB_timer_query
authorMarek Olšák <maraeo@gmail.com>
Thu, 5 Jul 2012 18:27:01 +0000 (20:27 +0200)
committerMarek Olšák <maraeo@gmail.com>
Tue, 10 Jul 2012 17:04:12 +0000 (19:04 +0200)
src/mesa/state_tracker/st_cb_queryobj.c
src/mesa/state_tracker/st_extensions.c

index b6a236e8d99efbc9a20b4634d86c0584db1c7755..e5e4a81dcad4ffb0c2bd1ebafbe340833e4c3d40 100644 (file)
@@ -39,6 +39,7 @@
 
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_screen.h"
 #include "st_context.h"
 #include "st_cb_queryobj.h"
 #include "st_cb_bitmap.h"
@@ -133,6 +134,11 @@ st_EndQuery(struct gl_context *ctx, struct gl_query_object *q)
 
    st_flush_bitmap_cache(st_context(ctx));
 
+   if (q->Target == GL_TIMESTAMP && !stq->pq) {
+      stq->pq = pipe->create_query(pipe, PIPE_QUERY_TIMESTAMP);
+      stq->type = PIPE_QUERY_TIMESTAMP;
+   }
+
    pipe->end_query(pipe, stq->pq);
 }
 
@@ -169,6 +175,13 @@ st_CheckQuery(struct gl_context *ctx, struct gl_query_object *q)
 }
 
 
+static uint64_t
+st_GetTimestamp(struct gl_context *ctx)
+{
+   struct pipe_screen *screen = st_context(ctx)->pipe->screen;
+
+   return screen->get_timestamp(screen);
+}
 
 
 void st_init_query_functions(struct dd_function_table *functions)
@@ -179,6 +192,7 @@ void st_init_query_functions(struct dd_function_table *functions)
    functions->EndQuery = st_EndQuery;
    functions->WaitQuery = st_WaitQuery;
    functions->CheckQuery = st_CheckQuery;
+   functions->GetTimestamp = st_GetTimestamp;
 }
 
 #endif /* FEATURE_queryobj */
index fd95075368a75598da5b8b409c91f0c68ed9e8cd..5b333ad2c820c303a1c7ecba15c0dc1e6dd5cbd8 100644 (file)
@@ -636,4 +636,9 @@ void st_init_extensions(struct st_context *st)
 
    if (ctx->Const.MaxDualSourceDrawBuffers > 0)
       ctx->Extensions.ARB_blend_func_extended = GL_TRUE;
+
+   if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY) &&
+       screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP)) {
+      ctx->Extensions.ARB_timer_query = GL_TRUE;
+   }
 }