fixed segfaults when tex unit 1 enabled, but not unit 0 (conform)

This commit is contained in:
Brian Paul
2001-03-05 22:40:10 +00:00
parent 75280a2c74
commit ac859a4cbd

View File

@@ -112,8 +112,8 @@ static void TAG(emit)( GLcontext *ctx,
GLuint stride ) GLuint stride )
{ {
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
GLfloat (*tc0)[4], (*tc1)[4], *fog; GLfloat (*tc0)[4], (*tc1)[4], (*tc2)[4], (*tc3)[4];
GLfloat (*tc2)[4], (*tc3)[4]; GLfloat *fog;
GLubyte (*col)[4], (*spec)[4]; GLubyte (*col)[4], (*spec)[4];
GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride; GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride;
GLuint tc2_stride, tc3_stride; GLuint tc2_stride, tc3_stride;
@@ -138,34 +138,62 @@ static void TAG(emit)( GLcontext *ctx,
if (DO_TEX3) { if (DO_TEX3) {
const GLuint t3 = GET_TEXSOURCE(3); const GLuint t3 = GET_TEXSOURCE(3);
tc3 = VB->TexCoordPtr[t3]->data; if (VB->TexCoordPtr[t3]) {
tc3_stride = VB->TexCoordPtr[t3]->stride; tc3 = VB->TexCoordPtr[t3]->data;
if (DO_PTEX) tc3_stride = VB->TexCoordPtr[t3]->stride;
tc3_size = VB->TexCoordPtr[t3]->size; if (DO_PTEX)
tc3_size = VB->TexCoordPtr[t3]->size;
}
else {
tc3 = NULL;
tc3_stride = 0; /* just to silence warnings */
tc3_size = 0;
}
} }
if (DO_TEX2) { if (DO_TEX2) {
const GLuint t2 = GET_TEXSOURCE(2); const GLuint t2 = GET_TEXSOURCE(2);
tc2 = VB->TexCoordPtr[t2]->data; if (VB->TexCoordPtr[t2]) {
tc2_stride = VB->TexCoordPtr[t2]->stride; tc2 = VB->TexCoordPtr[t2]->data;
if (DO_PTEX) tc2_stride = VB->TexCoordPtr[t2]->stride;
tc2_size = VB->TexCoordPtr[t2]->size; if (DO_PTEX)
tc2_size = VB->TexCoordPtr[t2]->size;
}
else {
tc2 = NULL;
tc2_stride = 0;
tc2_size = 0;
}
} }
if (DO_TEX1) { if (DO_TEX1) {
const GLuint t1 = GET_TEXSOURCE(1); const GLuint t1 = GET_TEXSOURCE(1);
tc1 = VB->TexCoordPtr[t1]->data; if (VB->TexCoordPtr[t1]) {
tc1_stride = VB->TexCoordPtr[t1]->stride; tc1 = VB->TexCoordPtr[t1]->data;
if (DO_PTEX) tc1_stride = VB->TexCoordPtr[t1]->stride;
tc1_size = VB->TexCoordPtr[t1]->size; if (DO_PTEX)
tc1_size = VB->TexCoordPtr[t1]->size;
}
else {
tc1 = NULL;
tc1_stride = 0;
tc1_size = 0;
}
} }
if (DO_TEX0) { if (DO_TEX0) {
const GLuint t0 = GET_TEXSOURCE(0); const GLuint t0 = GET_TEXSOURCE(0);
tc0_stride = VB->TexCoordPtr[t0]->stride; if (VB->TexCoordPtr[t0]) {
tc0 = VB->TexCoordPtr[t0]->data; tc0_stride = VB->TexCoordPtr[t0]->stride;
if (DO_PTEX) tc0 = VB->TexCoordPtr[t0]->data;
tc0_size = VB->TexCoordPtr[t0]->size; if (DO_PTEX)
tc0_size = VB->TexCoordPtr[t0]->size;
}
else {
tc0 = NULL;
tc0_stride = 0;
tc0_size = 0;
}
} }
if (DO_RGBA) { if (DO_RGBA) {
@@ -187,15 +215,19 @@ static void TAG(emit)( GLcontext *ctx,
/* May have nonstandard strides: /* May have nonstandard strides:
*/ */
if (start) { if (start) {
coord = (GLfloat (*)[4])((GLubyte *)coord + start * coord_stride); coord = (GLfloat (*)[4])((GLubyte *)coord + start * coord_stride);
if (DO_TEX0) if (DO_TEX0)
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride); if (tc0)
if (DO_TEX1) tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride); if (DO_TEX1)
if (DO_TEX2) if (tc1)
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + start * tc2_stride); tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride);
if (DO_TEX3) if (DO_TEX2)
tc3 = (GLfloat (*)[4])((GLubyte *)tc3 + start * tc3_stride); if (tc2)
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + start * tc2_stride);
if (DO_TEX3)
if (tc3)
tc3 = (GLfloat (*)[4])((GLubyte *)tc3 + start * tc3_stride);
if (DO_RGBA) if (DO_RGBA)
STRIDE_4UB(col, start * col_stride); STRIDE_4UB(col, start * col_stride);
if (DO_SPEC) if (DO_SPEC)
@@ -237,71 +269,79 @@ static void TAG(emit)( GLcontext *ctx,
STRIDE_F(fog, fog_stride); STRIDE_F(fog, fog_stride);
} }
if (DO_TEX0) { if (DO_TEX0) {
v->v.u0 = tc0[0][0]; if (tc0) {
v->v.v0 = tc0[0][1]; v->v.u0 = tc0[0][0];
if (DO_PTEX) { v->v.v0 = tc0[0][1];
if (HAVE_PTEX_VERTICES) { if (DO_PTEX) {
if (tc0_size == 4) if (HAVE_PTEX_VERTICES) {
v->pv.q0 = tc0[0][3]; if (tc0_size == 4)
else v->pv.q0 = tc0[0][3];
v->pv.q0 = 1.0; else
} v->pv.q0 = 1.0;
else if (tc0_size == 4) { }
float rhw = 1.0 / tc0[0][3]; else if (tc0_size == 4) {
v->v.w *= tc0[0][3]; float rhw = 1.0 / tc0[0][3];
v->v.u0 *= rhw; v->v.w *= tc0[0][3];
v->v.v0 *= rhw; v->v.u0 *= rhw;
} v->v.v0 *= rhw;
} }
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride); }
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
}
} }
if (DO_TEX1) { if (DO_TEX1) {
if (DO_PTEX) { if (tc1) {
v->pv.u1 = tc1[0][0]; if (DO_PTEX) {
v->pv.v1 = tc1[0][1]; v->pv.u1 = tc1[0][0];
if (tc1_size == 4) v->pv.v1 = tc1[0][1];
v->pv.q1 = tc1[0][3]; if (tc1_size == 4)
else v->pv.q1 = tc1[0][3];
v->pv.q1 = 1.0; else
} v->pv.q1 = 1.0;
else { }
v->v.u1 = tc1[0][0]; else {
v->v.v1 = tc1[0][1]; v->v.u1 = tc1[0][0];
} v->v.v1 = tc1[0][1];
tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride); }
tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride);
}
} }
else if (DO_PTEX) { else if (DO_PTEX) {
*(GLuint *)&v->pv.q1 = 0; /* avoid culling on radeon */ *(GLuint *)&v->pv.q1 = 0; /* avoid culling on radeon */
} }
if (DO_TEX2) { if (DO_TEX2) {
if (DO_PTEX) { if (tc2) {
v->pv.u2 = tc2[0][0]; if (DO_PTEX) {
v->pv.v2 = tc2[0][1]; v->pv.u2 = tc2[0][0];
if (tc2_size == 4) v->pv.v2 = tc2[0][1];
v->pv.q2 = tc2[0][3]; if (tc2_size == 4)
else v->pv.q2 = tc2[0][3];
v->pv.q2 = 1.0; else
} v->pv.q2 = 1.0;
else { }
v->v.u2 = tc2[0][0]; else {
v->v.v2 = tc2[0][1]; v->v.u2 = tc2[0][0];
} v->v.v2 = tc2[0][1];
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + tc2_stride); }
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + tc2_stride);
}
} }
if (DO_TEX3) { if (DO_TEX3) {
if (DO_PTEX) { if (tc3) {
v->pv.u3 = tc3[0][0]; if (DO_PTEX) {
v->pv.v3 = tc3[0][1]; v->pv.u3 = tc3[0][0];
if (tc3_size == 4) v->pv.v3 = tc3[0][1];
v->pv.q3 = tc3[0][3]; if (tc3_size == 4)
else v->pv.q3 = tc3[0][3];
v->pv.q3 = 1.0; else
} v->pv.q3 = 1.0;
else { }
v->v.u3 = tc3[0][0]; else {
v->v.v3 = tc3[0][1]; v->v.u3 = tc3[0][0];
} v->v.v3 = tc3[0][1];
tc3 = (GLfloat (*)[4])((GLubyte *)tc3 + tc3_stride); }
tc3 = (GLfloat (*)[4])((GLubyte *)tc3 + tc3_stride);
}
} }
} }
} }
@@ -335,42 +375,46 @@ static void TAG(emit)( GLcontext *ctx,
v->v.specular.alpha = fog[i] * 255.0; v->v.specular.alpha = fog[i] * 255.0;
} }
if (DO_TEX0) { if (DO_TEX0) {
if (DO_PTEX) { if (tc0) {
v->pv.u0 = tc0[i][0]; if (DO_PTEX) {
v->pv.v0 = tc0[i][1]; v->pv.u0 = tc0[i][0];
if (HAVE_PTEX_VERTICES) { v->pv.v0 = tc0[i][1];
if (tc0_size == 4) if (HAVE_PTEX_VERTICES) {
v->pv.q0 = tc0[i][3]; if (tc0_size == 4)
else v->pv.q0 = tc0[i][3];
v->pv.q0 = 1.0; else
v->pv.q0 = 1.0;
v->pv.q1 = 0; /* radeon */ v->pv.q1 = 0; /* radeon */
} }
else if (tc0_size == 4) { else if (tc0_size == 4) {
float rhw = 1.0 / tc0[i][3]; float rhw = 1.0 / tc0[i][3];
v->v.w *= tc0[i][3]; v->v.w *= tc0[i][3];
v->v.u0 *= rhw; v->v.u0 *= rhw;
v->v.v0 *= rhw; v->v.v0 *= rhw;
} }
} }
else { else {
v->v.u0 = tc0[i][0]; v->v.u0 = tc0[i][0];
v->v.v0 = tc0[i][1]; v->v.v0 = tc0[i][1];
} }
}
} }
if (DO_TEX1) { if (DO_TEX1) {
if (DO_PTEX) { if (tc1) {
v->pv.u1 = tc1[i][0]; if (DO_PTEX) {
v->pv.v1 = tc1[i][1]; v->pv.u1 = tc1[i][0];
if (tc1_size == 4) v->pv.v1 = tc1[i][1];
v->pv.q1 = tc1[i][3]; if (tc1_size == 4)
else v->pv.q1 = tc1[i][3];
v->pv.q1 = 1.0; else
} v->pv.q1 = 1.0;
else { }
v->v.u1 = tc1[i][0]; else {
v->v.v1 = tc1[i][1]; v->v.u1 = tc1[i][0];
} v->v.v1 = tc1[i][1];
}
}
} }
} }
} }