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,35 +138,63 @@ static void TAG(emit)( GLcontext *ctx,
if (DO_TEX3) { if (DO_TEX3) {
const GLuint t3 = GET_TEXSOURCE(3); const GLuint t3 = GET_TEXSOURCE(3);
if (VB->TexCoordPtr[t3]) {
tc3 = VB->TexCoordPtr[t3]->data; tc3 = VB->TexCoordPtr[t3]->data;
tc3_stride = VB->TexCoordPtr[t3]->stride; tc3_stride = VB->TexCoordPtr[t3]->stride;
if (DO_PTEX) if (DO_PTEX)
tc3_size = VB->TexCoordPtr[t3]->size; 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);
if (VB->TexCoordPtr[t2]) {
tc2 = VB->TexCoordPtr[t2]->data; tc2 = VB->TexCoordPtr[t2]->data;
tc2_stride = VB->TexCoordPtr[t2]->stride; tc2_stride = VB->TexCoordPtr[t2]->stride;
if (DO_PTEX) if (DO_PTEX)
tc2_size = VB->TexCoordPtr[t2]->size; 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);
if (VB->TexCoordPtr[t1]) {
tc1 = VB->TexCoordPtr[t1]->data; tc1 = VB->TexCoordPtr[t1]->data;
tc1_stride = VB->TexCoordPtr[t1]->stride; tc1_stride = VB->TexCoordPtr[t1]->stride;
if (DO_PTEX) if (DO_PTEX)
tc1_size = VB->TexCoordPtr[t1]->size; 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);
if (VB->TexCoordPtr[t0]) {
tc0_stride = VB->TexCoordPtr[t0]->stride; tc0_stride = VB->TexCoordPtr[t0]->stride;
tc0 = VB->TexCoordPtr[t0]->data; tc0 = VB->TexCoordPtr[t0]->data;
if (DO_PTEX) if (DO_PTEX)
tc0_size = VB->TexCoordPtr[t0]->size; tc0_size = VB->TexCoordPtr[t0]->size;
} }
else {
tc0 = NULL;
tc0_stride = 0;
tc0_size = 0;
}
}
if (DO_RGBA) { if (DO_RGBA) {
col = VB->ColorPtr[0]->data; col = VB->ColorPtr[0]->data;
@ -189,12 +217,16 @@ static void TAG(emit)( GLcontext *ctx,
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)
if (tc0)
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride); tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
if (DO_TEX1) if (DO_TEX1)
if (tc1)
tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride); tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride);
if (DO_TEX2) if (DO_TEX2)
if (tc2)
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + start * tc2_stride); tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + start * tc2_stride);
if (DO_TEX3) if (DO_TEX3)
if (tc3)
tc3 = (GLfloat (*)[4])((GLubyte *)tc3 + start * tc3_stride); 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);
@ -237,6 +269,7 @@ static void TAG(emit)( GLcontext *ctx,
STRIDE_F(fog, fog_stride); STRIDE_F(fog, fog_stride);
} }
if (DO_TEX0) { if (DO_TEX0) {
if (tc0) {
v->v.u0 = tc0[0][0]; v->v.u0 = tc0[0][0];
v->v.v0 = tc0[0][1]; v->v.v0 = tc0[0][1];
if (DO_PTEX) { if (DO_PTEX) {
@ -255,7 +288,9 @@ static void TAG(emit)( GLcontext *ctx,
} }
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride); tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
} }
}
if (DO_TEX1) { if (DO_TEX1) {
if (tc1) {
if (DO_PTEX) { if (DO_PTEX) {
v->pv.u1 = tc1[0][0]; v->pv.u1 = tc1[0][0];
v->pv.v1 = tc1[0][1]; v->pv.v1 = tc1[0][1];
@ -270,10 +305,12 @@ static void TAG(emit)( GLcontext *ctx,
} }
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 (tc2) {
if (DO_PTEX) { if (DO_PTEX) {
v->pv.u2 = tc2[0][0]; v->pv.u2 = tc2[0][0];
v->pv.v2 = tc2[0][1]; v->pv.v2 = tc2[0][1];
@ -288,7 +325,9 @@ static void TAG(emit)( GLcontext *ctx,
} }
tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + tc2_stride); tc2 = (GLfloat (*)[4])((GLubyte *)tc2 + tc2_stride);
} }
}
if (DO_TEX3) { if (DO_TEX3) {
if (tc3) {
if (DO_PTEX) { if (DO_PTEX) {
v->pv.u3 = tc3[0][0]; v->pv.u3 = tc3[0][0];
v->pv.v3 = tc3[0][1]; v->pv.v3 = tc3[0][1];
@ -305,6 +344,7 @@ static void TAG(emit)( GLcontext *ctx,
} }
} }
} }
}
else { else {
for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) { for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) {
if (DO_XYZW) { if (DO_XYZW) {
@ -335,6 +375,7 @@ 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 (tc0) {
if (DO_PTEX) { if (DO_PTEX) {
v->pv.u0 = tc0[i][0]; v->pv.u0 = tc0[i][0];
v->pv.v0 = tc0[i][1]; v->pv.v0 = tc0[i][1];
@ -358,7 +399,9 @@ static void TAG(emit)( GLcontext *ctx,
v->v.v0 = tc0[i][1]; v->v.v0 = tc0[i][1];
} }
} }
}
if (DO_TEX1) { if (DO_TEX1) {
if (tc1) {
if (DO_PTEX) { if (DO_PTEX) {
v->pv.u1 = tc1[i][0]; v->pv.u1 = tc1[i][0];
v->pv.v1 = tc1[i][1]; v->pv.v1 = tc1[i][1];
@ -374,6 +417,7 @@ static void TAG(emit)( GLcontext *ctx,
} }
} }
} }
}
} }
#else #else
#if DO_XYZW #if DO_XYZW