Mesa (master): r300g: always emit the correct max vertex index to avoid DRM errors

Marek Olšák mareko at kemper.freedesktop.org
Sat Feb 27 17:41:45 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sat Feb 27 00:37:01 2010 +0100

r300g: always emit the correct max vertex index to avoid DRM errors

Fixing bizarre reports that a vertex buffer is not large enough.

---

 src/gallium/drivers/r300/r300_context.h |    1 +
 src/gallium/drivers/r300/r300_render.c  |    7 +++++--
 src/gallium/drivers/r300/r300_state.c   |    7 +++++++
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 3d4f652..8704f18 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -326,6 +326,7 @@ struct r300_context {
     /* Vertex buffers for Gallium. */
     struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
     int vertex_buffer_count;
+    int vertex_buffer_max_index;
     /* Vertex elements for Gallium. */
     struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
     int vertex_element_count;
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index d604bfb..e4f7615 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -452,8 +452,11 @@ void r300_draw_elements(struct pipe_context* pipe,
                         unsigned indexSize, unsigned mode,
                         unsigned start, unsigned count)
 {
-   pipe->draw_range_elements(pipe, indexBuffer, indexSize, 0, ~0,
-                             mode, start, count);
+    struct r300_context *r300 = r300_context(pipe);
+
+    pipe->draw_range_elements(pipe, indexBuffer, indexSize, 0,
+                              r300->vertex_buffer_max_index,
+                              mode, start, count);
 }
 
 void r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 0f14ccc..ee4409c 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1026,10 +1026,17 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
                                     const struct pipe_vertex_buffer* buffers)
 {
     struct r300_context* r300 = r300_context(pipe);
+    unsigned i, max_index = ~0;
 
     memcpy(r300->vertex_buffer, buffers,
         sizeof(struct pipe_vertex_buffer) * count);
+
+    for (i = 0; i < count; i++) {
+        max_index = MIN2(buffers[i].max_index, max_index);
+    }
+
     r300->vertex_buffer_count = count;
+    r300->vertex_buffer_max_index = max_index;
 
     if (r300->draw) {
         draw_flush(r300->draw);




More information about the mesa-commit mailing list