gallium/st: add pipe_context::get_timestamp()
authorBrian Paul <brianp@vmware.com>
Fri, 7 Aug 2015 20:54:24 +0000 (14:54 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 2 Sep 2015 15:05:23 +0000 (09:05 -0600)
The VMware svga driver doesn't directly support pipe_screen::get_timestamp()
but we can do a work-around.  However, we need a gallium context to do so.
This patch adds a new pipe_context::get_timestamp() function that will only
be called if the pipe_screen::get_timestamp() function is NULL.

Signed-off-by: Brian Paul <brianp@vmware.com>
src/gallium/include/pipe/p_context.h
src/mesa/state_tracker/st_cb_queryobj.c

index 9d8f5bdc8d264532abb9e27b6f4bb3be6b74fe97..6f9fe76740473fb6f266a129f726c95b37d313ab 100644 (file)
@@ -591,6 +591,13 @@ struct pipe_context {
                                unsigned sample_index,
                                float *out_value);
 
+   /**
+    * Query a timestamp in nanoseconds.  This is completely equivalent to
+    * pipe_screen::get_timestamp() but takes a context handle for drivers
+    * that require a context.
+    */
+   uint64_t (*get_timestamp)(struct pipe_context *);
+
    /**
     * Flush the resource cache, so that the resource can be used
     * by an external client. Possible usage:
index 71222e80b6b43bc3ae9aa29d21cce2e67f357e61..aafae16b2df95eaf2c2aabfc07e49e3781bc8b25 100644 (file)
@@ -289,9 +289,18 @@ 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;
+   struct pipe_context *pipe = st_context(ctx)->pipe;
+   struct pipe_screen *screen = pipe->screen;
 
-   return screen->get_timestamp(screen);
+   /* Prefer the per-screen function */
+   if (screen->get_timestamp) {
+      return screen->get_timestamp(screen);
+   }
+   else {
+      /* Fall back to the per-context function */
+      assert(pipe->get_timestamp);
+      return pipe->get_timestamp(pipe);
+   }
 }