Mesa (master): r300g: remove tracking whether vertex buffers need to be validated

Marek Olšák mareko at kemper.freedesktop.org
Fri Feb 18 15:17:00 UTC 2011


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Fri Feb 18 15:29:00 2011 +0100

r300g: remove tracking whether vertex buffers need to be validated

This was getting hard to maintain and didn't really bring any real benefits.
Instead, validate buffers when the vertex array state is dirty.

---

 src/gallium/drivers/r300/r300_context.h          |    7 --
 src/gallium/drivers/r300/r300_emit.c             |    2 +-
 src/gallium/drivers/r300/r300_flush.c            |    4 -
 src/gallium/drivers/r300/r300_render.c           |   85 +++++++---------------
 src/gallium/drivers/r300/r300_render_translate.c |    3 -
 src/gallium/drivers/r300/r300_screen_buffer.c    |    5 --
 src/gallium/drivers/r300/r300_state.c            |    9 ---
 7 files changed, 27 insertions(+), 88 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 883b5f9..3007375 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -575,13 +575,6 @@ struct r300_context {
     boolean vertex_arrays_dirty;
     boolean vertex_arrays_indexed;
     int vertex_arrays_offset;
-
-    /* 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_emit.c b/src/gallium/drivers/r300/r300_emit.c
index bd864b9..e2e4719 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -1181,7 +1181,7 @@ validate:
         r300->rws->cs_add_reloc(r300->cs, r300_resource(r300->vbo)->cs_buf,
                                 r300_resource(r300->vbo)->domain, 0);
     /* ...vertex buffers for HWTCL path... */
-    if (do_validate_vertex_buffers) {
+    if (do_validate_vertex_buffers && r300->vertex_arrays_dirty) {
         struct pipe_resource **buf = r300->vbuf_mgr->real_vertex_buffer;
         struct pipe_resource **last = r300->vbuf_mgr->real_vertex_buffer +
                                       r300->vbuf_mgr->nr_real_vertex_buffers;
diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c
index c4bb332..c77cc08 100644
--- a/src/gallium/drivers/r300/r300_flush.c
+++ b/src/gallium/drivers/r300/r300_flush.c
@@ -77,10 +77,6 @@ static void r300_flush(struct pipe_context* pipe,
             r300->vs_state.dirty = FALSE;
             r300->vs_constants.dirty = FALSE;
         }
-
-        r300->validate_buffers = TRUE;
-        r300->upload_vb_validated = FALSE;
-        r300->upload_ib_validated = FALSE;
     } else {
         if (rfence) {
             /* We have to create a fence object, but the command stream is empty
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index 7dc8ff0..2ead866 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -239,8 +239,7 @@ static boolean r300_emit_states(struct r300_context *r300,
                                 enum r300_prepare_flags flags,
                                 struct pipe_resource *index_buffer,
                                 int buffer_offset,
-                                int index_bias,
-                                boolean user_buffers)
+                                int index_bias)
 {
     boolean first_draw     = flags & PREP_FIRST_DRAW;
     boolean emit_vertex_arrays       = flags & PREP_EMIT_AOS;
@@ -250,24 +249,11 @@ static boolean r300_emit_states(struct r300_context *r300,
 
     /* Validate buffers and emit dirty state if needed. */
     if (first_draw) {
-        if (r300->validate_buffers) {
-            if (!r300_emit_buffer_validate(r300, validate_vbos,
-                                           index_buffer)) {
-                fprintf(stderr, "r300: CS space validation failed. "
-                        "(not enough memory?) Skipping rendering.\n");
-                return FALSE;
-            }
-
-            /* Consider the validation done only if everything was validated. */
-            if (validate_vbos) {
-                r300->validate_buffers = FALSE;
-                if (user_buffers)
-                    r300->upload_vb_validated = TRUE;
-                if (r300->index_buffer.buffer &&
-                    r300_resource(r300->index_buffer.buffer)->b.user_ptr) {
-                    r300->upload_ib_validated = TRUE;
-                }
-            }
+        if (!r300_emit_buffer_validate(r300, validate_vbos,
+                                       index_buffer)) {
+           fprintf(stderr, "r300: CS space validation failed. "
+                   "(not enough memory?) Skipping rendering.\n");
+           return FALSE;
         }
 
         r300_emit_dirty_state(r300);
@@ -312,14 +298,13 @@ static boolean r300_prepare_for_rendering(struct r300_context *r300,
                                           struct pipe_resource *index_buffer,
                                           unsigned cs_dwords,
                                           int buffer_offset,
-                                          int index_bias,
-                                          boolean user_buffers)
+                                          int index_bias)
 {
     if (r300_reserve_cs_dwords(r300, flags, cs_dwords))
         flags |= PREP_FIRST_DRAW;
 
     return r300_emit_states(r300, flags, index_buffer, buffer_offset,
-                            index_bias, user_buffers);
+                            index_bias);
 }
 
 static boolean immd_is_good_idea(struct r300_context *r300,
@@ -394,8 +379,7 @@ static void r300_draw_arrays_immediate(struct r300_context *r300,
 
     CS_LOCALS(r300);
 
-    if (!r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0,
-                                    FALSE))
+    if (!r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0))
         return;
 
     /* Calculate the vertex size, offsets, strides etc. and map the buffers. */
@@ -545,8 +529,7 @@ static void r300_emit_draw_elements(struct r300_context *r300,
 static void r300_draw_elements_immediate(struct r300_context *r300,
                                          int indexBias, unsigned minIndex,
                                          unsigned maxIndex, unsigned mode,
-                                         unsigned start, unsigned count,
-                                         boolean user_buffers)
+                                         unsigned start, unsigned count)
 {
     uint8_t *ptr1;
     uint16_t *ptr2;
@@ -558,8 +541,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
     /* 19 dwords for r300_draw_elements_immediate. Give up if the function fails. */
     if (!r300_prepare_for_rendering(r300,
             PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS |
-            PREP_INDEXED, NULL, 2+count_dwords, 0, indexBias,
-            user_buffers))
+            PREP_INDEXED, NULL, 2+count_dwords, 0, indexBias))
         return;
 
     r300_emit_draw_init(r300, mode, minIndex, maxIndex);
@@ -632,8 +614,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
 
 static void r300_draw_elements(struct r300_context *r300, int indexBias,
                                unsigned minIndex, unsigned maxIndex,
-                               unsigned mode, unsigned start, unsigned count,
-                               boolean user_buffers)
+                               unsigned mode, unsigned start, unsigned count)
 {
     struct pipe_resource *indexBuffer = r300->index_buffer.buffer;
     unsigned indexSize = r300->index_buffer.index_size;
@@ -681,8 +662,7 @@ static void r300_draw_elements(struct r300_context *r300, int indexBias,
     /* 19 dwords for emit_draw_elements. Give up if the function fails. */
     if (!r300_prepare_for_rendering(r300,
             PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS |
-            PREP_INDEXED, indexBuffer, 19, buffer_offset, indexBias,
-            user_buffers))
+            PREP_INDEXED, indexBuffer, 19, buffer_offset, indexBias))
         goto done;
 
     if (alt_num_verts || count <= 65535) {
@@ -706,7 +686,7 @@ static void r300_draw_elements(struct r300_context *r300, int indexBias,
             if (count) {
                 if (!r300_prepare_for_rendering(r300,
                         PREP_VALIDATE_VBOS | PREP_EMIT_AOS | PREP_INDEXED,
-                        indexBuffer, 19, buffer_offset, indexBias, user_buffers))
+                        indexBuffer, 19, buffer_offset, indexBias))
                     goto done;
             }
         } while (count);
@@ -719,8 +699,7 @@ done:
 }
 
 static void r300_draw_arrays(struct r300_context *r300, unsigned mode,
-                             unsigned start, unsigned count,
-                             boolean user_buffers)
+                             unsigned start, unsigned count)
 {
     boolean alt_num_verts = r300->screen->caps.is_r500 &&
                             count > 65536 &&
@@ -730,7 +709,7 @@ static void r300_draw_arrays(struct r300_context *r300, unsigned mode,
     /* 9 spare dwords for emit_draw_arrays. Give up if the function fails. */
     if (!r300_prepare_for_rendering(r300,
                                     PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS,
-                                    NULL, 9, start, 0, user_buffers))
+                                    NULL, 9, start, 0))
         return;
 
     if (alt_num_verts || count <= 65535) {
@@ -747,7 +726,7 @@ static void r300_draw_arrays(struct r300_context *r300, unsigned mode,
             if (count) {
                 if (!r300_prepare_for_rendering(r300,
                                                 PREP_VALIDATE_VBOS | PREP_EMIT_AOS, NULL, 9,
-                                                start, 0, user_buffers))
+                                                start, 0))
                     return;
             }
         } while (count);
@@ -774,13 +753,6 @@ static void r300_draw_vbo(struct pipe_context* pipe,
                           &buffers_updated, &uploader_flushed);
     if (buffers_updated) {
         r300->vertex_arrays_dirty = TRUE;
-
-        if (uploader_flushed || !r300->upload_vb_validated) {
-            r300->upload_vb_validated = FALSE;
-            r300->validate_buffers = TRUE;
-        }
-    } else {
-        r300->upload_vb_validated = FALSE;
     }
 
     /* Draw. */
@@ -791,19 +763,16 @@ static void r300_draw_vbo(struct pipe_context* pipe,
             r300_resource(r300->index_buffer.buffer)->b.user_ptr) {
             r300_draw_elements_immediate(r300, info->index_bias,
                                          info->min_index, max_index,
-                                         info->mode, start_indexed, count,
-                                         buffers_updated);
+                                         info->mode, start_indexed, count);
         } else {
             r300_draw_elements(r300, info->index_bias, info->min_index,
-                               max_index, info->mode, start_indexed, count,
-                               buffers_updated);
+                               max_index, info->mode, start_indexed, count);
         }
     } else {
         if (immd_is_good_idea(r300, count)) {
             r300_draw_arrays_immediate(r300, info->mode, info->start, count);
         } else {
-            r300_draw_arrays(r300, info->mode, info->start, count,
-                             buffers_updated);
+            r300_draw_arrays(r300, info->mode, info->start, count);
         }
     }
 
@@ -935,7 +904,6 @@ static boolean r300_render_allocate_vertices(struct vbuf_render* render,
 				       R300_MAX_DRAW_VBO_SIZE);
         r300->draw_vbo_offset = 0;
         r300->draw_vbo_size = R300_MAX_DRAW_VBO_SIZE;
-        r300->validate_buffers = TRUE;
     }
 
     r300render->vertex_size = vertex_size;
@@ -1022,12 +990,12 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
     if (r300->draw_first_emitted) {
         if (!r300_prepare_for_rendering(r300,
                 PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
-                NULL, dwords, 0, 0, FALSE))
+                NULL, dwords, 0, 0))
             return;
     } else {
         if (!r300_emit_states(r300,
                 PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
-                NULL, 0, 0, FALSE))
+                NULL, 0, 0))
             return;
     }
 
@@ -1062,12 +1030,12 @@ static void r300_render_draw_elements(struct vbuf_render* render,
     if (r300->draw_first_emitted) {
         if (!r300_prepare_for_rendering(r300,
                 PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
-                NULL, 256, 0, 0, FALSE))
+                NULL, 256, 0, 0))
             return;
     } else {
         if (!r300_emit_states(r300,
                 PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
-                NULL, 0, 0, FALSE))
+                NULL, 0, 0))
             return;
     }
 
@@ -1104,7 +1072,7 @@ static void r300_render_draw_elements(struct vbuf_render* render,
         if (count) {
             if (!r300_prepare_for_rendering(r300,
                     PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
-                    NULL, 256, 0, 0, FALSE))
+                    NULL, 256, 0, 0))
                 return;
 
             end_cs_dwords = r300_get_num_cs_end_dwords(r300);
@@ -1208,8 +1176,7 @@ static void r300_blitter_draw_rectangle(struct blitter_context *blitter,
     r300->clip_state.dirty = FALSE;
     r300->viewport_state.dirty = FALSE;
 
-    if (!r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0,
-                                    FALSE))
+    if (!r300_prepare_for_rendering(r300, PREP_FIRST_DRAW, NULL, dwords, 0, 0))
         goto done;
 
     DBG(r300, DBG_DRAW, "r300: draw_rectangle\n");
diff --git a/src/gallium/drivers/r300/r300_render_translate.c b/src/gallium/drivers/r300/r300_render_translate.c
index 7778575..f8c7558 100644
--- a/src/gallium/drivers/r300/r300_render_translate.c
+++ b/src/gallium/drivers/r300/r300_render_translate.c
@@ -48,7 +48,6 @@ void r300_translate_index_buffer(struct r300_context *r300,
         pipe_resource_reference(index_buffer, out_buffer);
         *index_size = 2;
         *start = out_offset / 2;
-        r300->validate_buffers = TRUE;
         break;
 
     case 2:
@@ -63,7 +62,6 @@ void r300_translate_index_buffer(struct r300_context *r300,
 	    *index_buffer = NULL;
             pipe_resource_reference(index_buffer, out_buffer);
             *start = out_offset / 2;
-            r300->validate_buffers = TRUE;
         }
         break;
 
@@ -79,7 +77,6 @@ void r300_translate_index_buffer(struct r300_context *r300,
 	    *index_buffer = NULL;
             pipe_resource_reference(index_buffer, out_buffer);
             *start = out_offset / 4;
-            r300->validate_buffers = TRUE;
         }
         break;
     }
diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c
index 7855d70..1045911 100644
--- a/src/gallium/drivers/r300/r300_screen_buffer.c
+++ b/src/gallium/drivers/r300/r300_screen_buffer.c
@@ -65,11 +65,6 @@ 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;
-    }
 }
 
 static void r300_buffer_destroy(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 5d82983..09f18b3 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -783,7 +783,6 @@ r300_set_framebuffer_state(struct pipe_context* pipe,
     }
 
     r300_mark_fb_state_dirty(r300, R300_CHANGED_FB_STATE);
-    r300->validate_buffers = TRUE;
 
     if (state->zsbuf) {
         switch (util_format_get_blocksize(state->zsbuf->texture->format)) {
@@ -1359,7 +1358,6 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
     state->sampler_view_count = count;
 
     r300_mark_atom_dirty(r300, &r300->textures_state);
-    r300->validate_buffers = TRUE;
 
     if (dirty_tex) {
         r300_mark_atom_dirty(r300, &r300->texture_cache_inval);
@@ -1491,7 +1489,6 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
         for (i = 0; i < count; i++) {
             if (buffers[i].buffer &&
 		!r300_resource(buffers[i].buffer)->b.user_ptr) {
-                r300->validate_buffers = TRUE;
             }
         }
         r300->vertex_arrays_dirty = TRUE;
@@ -1512,12 +1509,6 @@ static void r300_set_index_buffer(struct pipe_context* pipe,
         pipe_resource_reference(&r300->index_buffer.buffer, ib->buffer);
         memcpy(&r300->index_buffer, ib, sizeof(r300->index_buffer));
         r300->index_buffer.offset /= r300->index_buffer.index_size;
-
-        if (r300->screen->caps.has_tcl &&
-            !r300_resource(ib->buffer)->b.user_ptr) {
-            r300->validate_buffers = TRUE;
-            r300->upload_ib_validated = FALSE;
-        }
     }
     else {
         pipe_resource_reference(&r300->index_buffer.buffer, NULL);




More information about the mesa-commit mailing list