r300g: add conditional rendering
authorMarek Olšák <maraeo@gmail.com>
Sun, 4 Apr 2010 06:59:09 +0000 (08:59 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 4 Apr 2010 06:59:09 +0000 (08:59 +0200)
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_query.c
src/gallium/drivers/r300/r300_render.c

index 0a82484e89d6dd937998adfe7ebe793909a9c15c..031092312db7ae09852f918980cb972a0fa1a3e7 100644 (file)
@@ -377,6 +377,8 @@ struct r300_context {
     uint32_t zbuffer_bpp;
     /* Whether scissor is enabled. */
     boolean scissor_enabled;
+    /* Whether rendering is conditional and should be skipped. */
+    boolean skip_rendering;
     /* upload managers */
     struct u_upload_mgr *upload_vb;
     struct u_upload_mgr *upload_ib;
index f8b52d593d526baaef487d2c6cc590dfacc99717..1778dc9ccaa36991b52f0d9b459271af15c7dbf9 100644 (file)
@@ -159,10 +159,33 @@ static boolean r300_get_query_result(struct pipe_context* pipe,
     return TRUE;
 }
 
+static void r300_render_condition(struct pipe_context *pipe,
+                                  struct pipe_query *query,
+                                  uint mode)
+{
+    struct r300_context *r300 = r300_context(pipe);
+    uint64_t result;
+    boolean wait;
+
+    if (query) {
+        wait = mode == PIPE_RENDER_COND_WAIT ||
+               mode == PIPE_RENDER_COND_BY_REGION_WAIT;
+
+        if (!r300_get_query_result(pipe, query, wait, &result)) {
+            r300->skip_rendering = FALSE;
+        }
+
+        r300->skip_rendering = result == 0;
+    } else {
+        r300->skip_rendering = FALSE;
+    }
+}
+
 void r300_init_query_functions(struct r300_context* r300) {
     r300->context.create_query = r300_create_query;
     r300->context.destroy_query = r300_destroy_query;
     r300->context.begin_query = r300_begin_query;
     r300->context.end_query = r300_end_query;
     r300->context.get_query_result = r300_get_query_result;
+    r300->context.render_condition = r300_render_condition;
 }
index 1fb7eac2b344f9b5ef0abf4c754f21d614793f4e..7898329771efd58fd44778926a15a6ae974f979f 100644 (file)
@@ -427,6 +427,10 @@ void r300_draw_range_elements(struct pipe_context* pipe,
 #endif
     unsigned short_count;
 
+    if (r300->skip_rendering) {
+        return;
+    }
+
     if (!u_trim_pipe_prim(mode, &count)) {
         return;
     }
@@ -503,6 +507,10 @@ void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
 #endif
     unsigned short_count;
 
+    if (r300->skip_rendering) {
+        return;
+    }
+
     if (!u_trim_pipe_prim(mode, &count)) {
         return;
     }