Mesa (master): r300g: cleanup the draw functions

Marek Olšák mareko at kemper.freedesktop.org
Mon Feb 14 10:49:37 UTC 2011


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Feb 14 10:11:50 2011 +0100

r300g: cleanup the draw functions

---

 src/gallium/drivers/r300/r300_render.c |  126 +++++++++++++-------------------
 src/gallium/drivers/r300/r300_state.c  |    3 +
 2 files changed, 53 insertions(+), 76 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index 37b9934..299038a 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -366,10 +366,9 @@ static boolean immd_is_good_idea(struct r300_context *r300,
  * The HWTCL draw functions.                                                 *
  ****************************************************************************/
 
-static void r300_emit_draw_arrays_immediate(struct r300_context *r300,
-                                            unsigned mode,
-                                            unsigned start,
-                                            unsigned count)
+static void r300_draw_arrays_immediate(struct r300_context *r300,
+                                       unsigned mode, unsigned start,
+                                       unsigned count)
 {
     struct pipe_vertex_element* velem;
     struct pipe_vertex_buffer* vbuf;
@@ -546,17 +545,11 @@ static void r300_emit_draw_elements(struct r300_context *r300,
     END_CS;
 }
 
-/* This is the fast-path drawing & emission for HW TCL. */
-static void r300_draw_range_elements(struct pipe_context* pipe,
-                                     int indexBias,
-                                     unsigned minIndex,
-                                     unsigned maxIndex,
-                                     unsigned mode,
-                                     unsigned start,
-                                     unsigned count,
-                                     boolean user_buffers)
+static void r300_draw_elements(struct r300_context *r300, int indexBias,
+                               unsigned minIndex, unsigned maxIndex,
+                               unsigned mode, unsigned start, unsigned count,
+                               boolean user_buffers)
 {
-    struct r300_context* r300 = r300_context(pipe);
     struct pipe_resource *indexBuffer = r300->index_buffer.buffer;
     unsigned indexSize = r300->index_buffer.index_size;
     struct pipe_resource* orgIndexBuffer = indexBuffer;
@@ -579,7 +572,7 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
         !r300_resource(indexBuffer)->b.user_ptr) {
         struct pipe_transfer *transfer;
 
-        uint16_t *ptr = pipe_buffer_map(pipe, indexBuffer,
+        uint16_t *ptr = pipe_buffer_map(&r300->context, indexBuffer,
                                         PIPE_TRANSFER_READ |
                                         PIPE_TRANSFER_UNSYNCHRONIZED,
                                         &transfer);
@@ -593,7 +586,7 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
             r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start,
                                      count, (uint8_t*)ptr);
         }
-        pipe_buffer_unmap(pipe, transfer);
+        pipe_buffer_unmap(&r300->context, transfer);
     } else {
         if (r300_resource(indexBuffer)->b.user_ptr)
             r300_upload_index_buffer(r300, &indexBuffer, indexSize,
@@ -604,7 +597,8 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
     /* 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,
+            user_buffers))
         goto done;
 
     if (alt_num_verts || count <= 65535) {
@@ -640,44 +634,39 @@ done:
     }
 }
 
-static void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
+static void r300_draw_arrays(struct r300_context *r300, unsigned mode,
                              unsigned start, unsigned count,
                              boolean user_buffers)
 {
-    struct r300_context* r300 = r300_context(pipe);
     boolean alt_num_verts = r300->screen->caps.is_r500 &&
                             count > 65536 &&
                             r300->rws->get_value(r300->rws, R300_VID_DRM_2_3_0);
     unsigned short_count;
 
-    if (immd_is_good_idea(r300, count)) {
-        r300_emit_draw_arrays_immediate(r300, mode, start, count);
-    } else {
-        /* 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))
-            return;
+    /* 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))
+        return;
 
-        if (alt_num_verts || count <= 65535) {
-            r300_emit_draw_arrays(r300, mode, count);
-        } else {
-            do {
-                short_count = MIN2(count, 65535);
-                r300_emit_draw_arrays(r300, mode, short_count);
+    if (alt_num_verts || count <= 65535) {
+        r300_emit_draw_arrays(r300, mode, count);
+    } else {
+        do {
+            short_count = MIN2(count, 65535);
+            r300_emit_draw_arrays(r300, mode, short_count);
 
-                start += short_count;
-                count -= short_count;
+            start += short_count;
+            count -= short_count;
 
-                /* 9 spare dwords for emit_draw_arrays. Give up if the function fails. */
-                if (count) {
-                    if (!r300_prepare_for_rendering(r300,
-                            PREP_VALIDATE_VBOS | PREP_EMIT_AOS, NULL, 9,
-                            start, 0, user_buffers))
-                        return;
-                }
-            } while (count);
-        }
+            /* 9 spare dwords for emit_draw_arrays. Give up if the function fails. */
+            if (count) {
+                if (!r300_prepare_for_rendering(r300,
+                                                PREP_VALIDATE_VBOS | PREP_EMIT_AOS, NULL, 9,
+                                                start, 0, user_buffers))
+                    return;
+            }
+        } while (count);
     }
 }
 
@@ -688,18 +677,17 @@ static void r300_draw_vbo(struct pipe_context* pipe,
     unsigned count = info->count;
     boolean buffers_updated, uploader_flushed;
     boolean indexed = info->indexed && r300->index_buffer.buffer;
+    unsigned start_indexed = info->start + r300->index_buffer.offset;
+    int max_index = MIN2(r300->vbuf_mgr->max_index, info->max_index);
 
-    if (r300->skip_rendering) {
-        return;
-    }
-
-    if (!u_trim_pipe_prim(info->mode, &count)) {
+    if (r300->skip_rendering ||
+        !u_trim_pipe_prim(info->mode, &count)) {
         return;
     }
 
+    /* Start the vbuf manager and update buffers if needed. */
     u_vbuf_mgr_draw_begin(r300->vbuf_mgr, info,
                           &buffers_updated, &uploader_flushed);
-
     if (buffers_updated) {
         r300->vertex_arrays_dirty = TRUE;
 
@@ -711,34 +699,20 @@ static void r300_draw_vbo(struct pipe_context* pipe,
         r300->upload_vb_validated = FALSE;
     }
 
-    if (indexed) {
-        /* Compute the start for draw_elements, taking the offset into account. */
-        unsigned start_indexed =
-            info->start +
-            (r300->index_buffer.offset / r300->index_buffer.index_size);
-        int max_index = MIN2(r300->vbuf_mgr->max_index, info->max_index);
-
-        assert(r300->index_buffer.offset % r300->index_buffer.index_size == 0);
-
-        /* Index buffer range checking. */
-        if ((start_indexed + count) * r300->index_buffer.index_size >
-            r300->index_buffer.buffer->width0) {
-            fprintf(stderr, "r300: Invalid index buffer range. Skipping rendering.\n");
-            return;
-        }
-
-        if (max_index >= (1 << 24) - 1) {
-            fprintf(stderr, "r300: Invalid max_index: %i. Skipping rendering...\n", max_index);
-            return;
-        }
+    /* Draw. */
+    r300_update_derived_state(r300);
 
-        r300_update_derived_state(r300);
-        r300_draw_range_elements(pipe, info->index_bias, info->min_index,
-                                 max_index, info->mode, start_indexed, count,
-                                 buffers_updated);
+    if (indexed) {
+        r300_draw_elements(r300, info->index_bias, info->min_index,
+                           max_index, info->mode, start_indexed, count,
+                           buffers_updated);
     } else {
-        r300_update_derived_state(r300);
-        r300_draw_arrays(pipe, info->mode, info->start, count, buffers_updated);
+        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);
+        }
     }
 
     u_vbuf_mgr_draw_end(r300->vbuf_mgr);
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 2ec9600..242f883 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1510,9 +1510,12 @@ static void r300_set_index_buffer(struct pipe_context* pipe,
 {
     struct r300_context* r300 = r300_context(pipe);
 
+    assert(ib->offset % ib->index_size == 0);
+
     if (ib && ib->buffer) {
         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) {




More information about the mesa-commit mailing list