Mesa (master): r600: make sure the number of indices is valid
Alex Deucher
agd5f at kemper.freedesktop.org
Mon Aug 17 21:49:32 UTC 2009
Module: Mesa
Branch: master
Commit: 66c632b5a1fe165718cc1fe3f2f9030ed05e4d01
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=66c632b5a1fe165718cc1fe3f2f9030ed05e4d01
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Mon Aug 17 17:47:27 2009 -0400
r600: make sure the number of indices is valid
make sure the number of indices is valid for the
requested prim type. glxgears sends invalid
quad strips with only 2 indices for example.
---
src/mesa/drivers/dri/r600/r700_render.c | 55 ++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/src/mesa/drivers/dri/r600/r700_render.c b/src/mesa/drivers/dri/r600/r700_render.c
index 6705dbc..9e2971a 100644
--- a/src/mesa/drivers/dri/r600/r700_render.c
+++ b/src/mesa/drivers/dri/r600/r700_render.c
@@ -223,18 +223,71 @@ static unsigned int r700PrimitiveType(int prim)
}
}
+static int r700NumVerts(int num_verts, int prim)
+{
+ int verts_off = 0;
+
+ switch (prim & PRIM_MODE_MASK) {
+ case GL_POINTS:
+ verts_off = 0;
+ break;
+ case GL_LINES:
+ verts_off = num_verts % 2;
+ break;
+ case GL_LINE_STRIP:
+ if (num_verts < 2)
+ verts_off = num_verts;
+ break;
+ case GL_LINE_LOOP:
+ if (num_verts < 2)
+ verts_off = num_verts;
+ break;
+ case GL_TRIANGLES:
+ verts_off = num_verts % 3;
+ break;
+ case GL_TRIANGLE_STRIP:
+ if (num_verts < 3)
+ verts_off = num_verts;
+ break;
+ case GL_TRIANGLE_FAN:
+ if (num_verts < 3)
+ verts_off = num_verts;
+ break;
+ case GL_QUADS:
+ verts_off = num_verts % 4;
+ break;
+ case GL_QUAD_STRIP:
+ if (num_verts < 4)
+ verts_off = num_verts;
+ else
+ verts_off = num_verts % 2;
+ break;
+ case GL_POLYGON:
+ if (num_verts < 3)
+ verts_off = num_verts;
+ break;
+ default:
+ assert(0);
+ return -1;
+ break;
+ }
+
+ return num_verts - verts_off;
+}
+
static void r700RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
{
context_t *context = R700_CONTEXT(ctx);
BATCH_LOCALS(&context->radeon);
int type, i, total_emit;
- int num_indices = end - start;
+ int num_indices;
uint32_t vgt_draw_initiator = 0;
uint32_t vgt_index_type = 0;
uint32_t vgt_primitive_type = 0;
uint32_t vgt_num_indices = 0;
type = r700PrimitiveType(prim);
+ num_indices = r700NumVerts(end - start, prim);
if (type < 0 || num_indices <= 0)
return;
More information about the mesa-commit
mailing list