Mesa (master): r300g/swtcl: use memcpy to emit indices

Marek Olšák mareko at kemper.freedesktop.org
Fri Jan 4 20:11:24 UTC 2013


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Fri Jan  4 20:07:06 2013 +0100

r300g/swtcl: use memcpy to emit indices

---

 src/gallium/drivers/r300/r300_render.c |   21 +++++++++++----------
 1 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index d79d2a0..683fc03 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -978,6 +978,9 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
     CS_LOCALS(r300);
     (void) i; (void) ptr;
 
+    assert(start == 0);
+    assert(count < (1 << 16));
+
     DBG(r300, DBG_DRAW, "r300: render_draw_arrays (count: %d)\n", count);
 
     if (!r300_prepare_for_rendering(r300,
@@ -1002,7 +1005,7 @@ static void r300_render_draw_elements(struct vbuf_render* render,
 {
     struct r300_render* r300render = r300_render(render);
     struct r300_context* r300 = r300render->r300;
-    int i;
+    struct radeon_winsys_cs *cs = r300->cs;
     unsigned end_cs_dwords;
     unsigned max_index = (r300->vbo->size - r300->draw_vbo_offset) /
                          (r300render->r300->vertex_info.size * 4) - 1;
@@ -1025,25 +1028,23 @@ static void r300_render_draw_elements(struct vbuf_render* render,
     end_cs_dwords = r300_get_num_cs_end_dwords(r300);
 
     while (count) {
-        free_dwords = RADEON_MAX_CMDBUF_DWORDS - r300->cs->cdw;
+        free_dwords =
+            RADEON_MAX_CMDBUF_DWORDS - r300->cs->cdw - end_cs_dwords - 6;
 
-        short_count = MIN2(count, (free_dwords - end_cs_dwords - 6) * 2);
+        short_count = MIN2(count, free_dwords * 2);
 
-        BEGIN_CS(6 + (short_count+1)/2);
+        BEGIN_CS(6);
         OUT_CS_REG(R300_GA_COLOR_CONTROL,
                 r300_provoking_vertex_fixes(r300, r300render->prim));
         OUT_CS_REG(R300_VAP_VF_MAX_VTX_INDX, max_index);
         OUT_CS_PKT3(R300_PACKET3_3D_DRAW_INDX_2, (short_count+1)/2);
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (short_count << 16) |
                r300render->hwprim);
-        for (i = 0; i < short_count-1; i += 2) {
-            OUT_CS(indices[i+1] << 16 | indices[i]);
-        }
-        if (short_count % 2) {
-            OUT_CS(indices[short_count-1]);
-        }
         END_CS;
 
+        memcpy(cs->buf+cs->cdw, indices, short_count * 2);
+        cs->cdw += (short_count + 1) / 2;
+
         /* OK now subtract the emitted indices and see if we need to emit
          * another draw packet. */
         indices += short_count;




More information about the mesa-commit mailing list