summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/r300/r300_render.c94
1 files changed, 41 insertions, 53 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
index 1cb99915ff7..aaf1b8819a4 100644
--- a/src/mesa/drivers/dri/r300/r300_render.c
+++ b/src/mesa/drivers/dri/r300/r300_render.c
@@ -72,81 +72,69 @@ static int r300_get_primitive_type(r300ContextPtr rmesa,
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
GLuint i;
- int type=-1;
+ int type=-1, min_vertices=0;
+ char *name="UNKNOWN";
if(end<=start)return -1; /* do we need to watch for this ? */
- fprintf(stderr, "[%d-%d]", start, end);
switch (prim & PRIM_MODE_MASK) {
- case GL_LINES:
- fprintf(stderr, "L ");
+ case GL_POINTS:
+ name="P";
+ type=R300_VAP_VF_CNTL__PRIM_POINTS;
+ min_vertices=1;
+ break;
+ case GL_LINES:
+ name="L";
type=R300_VAP_VF_CNTL__PRIM_LINES;
- if(end<start+2){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
- break;
- case GL_LINE_STRIP:
- fprintf(stderr, "LS ");
+ min_vertices=2;
+ break;
+ case GL_LINE_STRIP:
+ name="LS";
type=R300_VAP_VF_CNTL__PRIM_LINE_STRIP;
- if(end<start+2){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=2;
break;
- case GL_LINE_LOOP:
- fprintf(stderr, "LL ");
+ case GL_LINE_LOOP:
+ name="LL";
+ min_vertices=2;
return -1;
- if(end<start+2){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
break;
- case GL_TRIANGLES:
- fprintf(stderr, "T ");
+ case GL_TRIANGLES:
+ name="T";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLES;
- if(end<start+3){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=3;
break;
- case GL_TRIANGLE_STRIP:
- fprintf(stderr, "TS ");
+ case GL_TRIANGLE_STRIP:
+ name="TS";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP;
- if(end<start+3){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=3;
break;
- case GL_TRIANGLE_FAN:
- fprintf(stderr, "TF ");
+ case GL_TRIANGLE_FAN:
+ name="TF";
type=R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN;
- if(end<start+3){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=3;
break;
- case GL_QUADS:
- fprintf(stderr, "Q ");
+ case GL_QUADS:
+ name="Q";
type=R300_VAP_VF_CNTL__PRIM_QUADS;
- if(end<start+4){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=4;
break;
- case GL_QUAD_STRIP:
- fprintf(stderr, "QS ");
+ case GL_QUAD_STRIP:
+ name="QS";
type=R300_VAP_VF_CNTL__PRIM_QUAD_STRIP;
- if(end<start+4){
- fprintf(stderr, "Not enough vertices\n");
- return -1; /* need enough vertices for Q */
- }
+ min_vertices=4;
break;
- default:
+ default:
fprintf(stderr, "Cannot handle primitive %02x ", prim & PRIM_MODE_MASK);
return -1;
break;
- }
+ }
+ #if 1
+ fprintf(stderr, "[%d-%d]%s ", start, end, name);
+ #endif
+ if(start+min_vertices>=end){
+ fprintf(stderr, "Not enough vertices\n");
+ return -1;
+ }
return type;
}