Mesa (master): r300g: skip buffer validation of upload buffers when appropriate

Marek Olšák mareko at kemper.freedesktop.org
Thu Jan 6 16:02:44 UTC 2011


Module: Mesa
Branch: master
Commit: 31afa7616e3c11e9874f3297ac66ebdd50a67186
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=31afa7616e3c11e9874f3297ac66ebdd50a67186

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Dec 27 22:20:58 2010 +0100

r300g: skip buffer validation of upload buffers when appropriate

because the upload buffers are reused for subsequent draw operations.

---

 src/gallium/drivers/r300/r300_context.h       |    3 +++
 src/gallium/drivers/r300/r300_flush.c         |    2 ++
 src/gallium/drivers/r300/r300_render.c        |    6 ++++++
 src/gallium/drivers/r300/r300_screen_buffer.c |   13 +++++++++++--
 src/gallium/drivers/r300/r300_state.c         |   20 ++++++++++++++------
 5 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index f3a3df0..52556ec 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -619,6 +619,9 @@ struct r300_context {
     /* Whether any buffer (FB, textures, VBOs) has been set, but buffers
      * haven't been validated yet. */
     boolean validate_buffers;
+    /* Whether user buffers have been validated. */
+    boolean upload_vb_validated;
+    boolean upload_ib_validated;
 };
 
 #define foreach_atom(r300, atom) \
diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c
index 451fe52..7a26a86 100644
--- a/src/gallium/drivers/r300/r300_flush.c
+++ b/src/gallium/drivers/r300/r300_flush.c
@@ -70,6 +70,8 @@ static void r300_flush(struct pipe_context* pipe,
         }
 
         r300->validate_buffers = TRUE;
+        r300->upload_vb_validated = FALSE;
+        r300->upload_ib_validated = FALSE;
     }
 
     /* reset flushed query */
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index dd3b3c4..89f7892 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -253,6 +253,12 @@ static boolean r300_emit_states(struct r300_context *r300,
             /* Consider the validation done only if everything was validated. */
             if (validate_vbos) {
                 r300->validate_buffers = FALSE;
+                if (r300->any_user_vbs)
+                    r300->upload_vb_validated = TRUE;
+                if (r300->index_buffer.buffer &&
+                    r300_buffer_is_user_buffer(r300->index_buffer.buffer)) {
+                    r300->upload_ib_validated = TRUE;
+                }
             }
         }
 
diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c
index 11ad87e..d9c491f 100644
--- a/src/gallium/drivers/r300/r300_screen_buffer.c
+++ b/src/gallium/drivers/r300/r300_screen_buffer.c
@@ -62,8 +62,8 @@ void r300_upload_index_buffer(struct r300_context *r300,
 			      unsigned count)
 {
     unsigned index_offset;
-    boolean flushed;
     uint8_t *ptr = r300_buffer(*index_buffer)->user_buffer;
+    boolean flushed;
 
     *index_buffer = NULL;
 
@@ -74,6 +74,11 @@ void r300_upload_index_buffer(struct r300_context *r300,
                   index_buffer, &flushed);
 
     *start = index_offset / index_size;
+
+    if (flushed || !r300->upload_ib_validated) {
+        r300->upload_ib_validated = FALSE;
+        r300->validate_buffers = TRUE;
+    }
 }
 
 void r300_upload_user_buffers(struct r300_context *r300)
@@ -91,8 +96,12 @@ void r300_upload_user_buffers(struct r300_context *r300)
                           r300_buffer(vb->buffer)->user_buffer,
                           &vb->buffer_offset, &vb->buffer, &flushed);
 
-            r300->validate_buffers = TRUE;
             r300->vertex_arrays_dirty = TRUE;
+
+            if (flushed || !r300->upload_vb_validated) {
+                r300->upload_vb_validated = FALSE;
+                r300->validate_buffers = TRUE;
+            }
         }
     }
 }
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index f748fe5..01af633 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1468,6 +1468,7 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
     struct pipe_vertex_buffer *vbo;
     unsigned i, max_index = (1 << 24) - 1;
     boolean any_user_buffer = FALSE;
+    boolean any_nonuser_buffer = FALSE;
     struct pipe_vertex_buffer dummy_vb = {0};
 
     /* There must be at least one vertex buffer set, otherwise it locks up. */
@@ -1511,6 +1512,7 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
             if (r300_buffer_is_user_buffer(vbo->buffer)) {
                 any_user_buffer = TRUE;
             }
+            any_nonuser_buffer = TRUE;
 
             /* The stride of zero means we will be fetching only the first
              * vertex, so don't care about max_index. */
@@ -1528,7 +1530,10 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
         r300->any_user_vbs = any_user_buffer;
         r300->vertex_buffer_max_index = max_index;
         r300->vertex_arrays_dirty = TRUE;
-        r300->validate_buffers = TRUE;
+        if (any_nonuser_buffer)
+            r300->validate_buffers = TRUE;
+        if (!any_user_buffer)
+            r300->upload_vb_validated = FALSE;
     } else {
         /* SW TCL. */
         draw_set_vertex_buffers(r300->draw, count, buffers);
@@ -1554,19 +1559,22 @@ static void r300_set_index_buffer(struct pipe_context* pipe,
 {
     struct r300_context* r300 = r300_context(pipe);
 
-    if (ib) {
+    if (ib && ib->buffer) {
         pipe_resource_reference(&r300->index_buffer.buffer, ib->buffer);
         memcpy(&r300->index_buffer, ib, sizeof(r300->index_buffer));
+
+        if (r300->screen->caps.has_tcl &&
+            !r300_buffer_is_user_buffer(ib->buffer)) {
+            r300->validate_buffers = TRUE;
+            r300->upload_ib_validated = FALSE;
+        }
     }
     else {
         pipe_resource_reference(&r300->index_buffer.buffer, NULL);
         memset(&r300->index_buffer, 0, sizeof(r300->index_buffer));
     }
 
-    if (r300->screen->caps.has_tcl) {
-        r300->validate_buffers = TRUE;
-    }
-    else {
+    if (!r300->screen->caps.has_tcl) {
         draw_set_index_buffer(r300->draw, ib);
     }
 }




More information about the mesa-commit mailing list