mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 00:38:48 +02:00
r300: always route 4 texcoord components to RS
Routing <4 components may lead to lock up. Thanks to Alex Deucher for suggestion.
This commit is contained in:
parent
22c0652c38
commit
d014d7d1bb
2 changed files with 17 additions and 66 deletions
|
|
@ -1482,6 +1482,7 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
|||
}
|
||||
}
|
||||
|
||||
/* We always route 4 texcoord components */
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
if (! ( InputsRead & FRAG_BIT_TEX(i) ) )
|
||||
continue;
|
||||
|
|
@ -1491,26 +1492,10 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
|||
continue;
|
||||
}
|
||||
|
||||
int swiz;
|
||||
|
||||
/* with TCL we always seem to route 4 components */
|
||||
if (hw_tcl_on)
|
||||
count = 4;
|
||||
else
|
||||
count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
|
||||
|
||||
switch(count) {
|
||||
case 4: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3); break;
|
||||
case 3: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(R300_RS_SEL_K1); break;
|
||||
default:
|
||||
case 1:
|
||||
case 2: swiz = R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(R300_RS_SEL_K0) | R300_RS_SEL_Q(R300_RS_SEL_K1); break;
|
||||
};
|
||||
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= swiz | R300_RS_TEX_PTR(rs_tex_count);
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_S(0) | R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3) | R300_RS_TEX_PTR(rs_tex_count);
|
||||
r300->hw.rr.cmd[R300_RR_INST_0 + tex_ip] |= R300_RS_INST_TEX_ID(tex_ip) | R300_RS_INST_TEX_CN_WRITE | R300_RS_INST_TEX_ADDR(fp_reg);
|
||||
InputsRead &= ~(FRAG_BIT_TEX0 << i);
|
||||
rs_tex_count += count;
|
||||
rs_tex_count += 4;
|
||||
++tex_ip;
|
||||
++fp_reg;
|
||||
}
|
||||
|
|
@ -1633,7 +1618,7 @@ static void r500SetupRSUnit(GLcontext * ctx)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* We always route 4 texcoord components */
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
if (! ( InputsRead & FRAG_BIT_TEX(i) ) )
|
||||
continue;
|
||||
|
|
@ -1643,45 +1628,14 @@ static void r500SetupRSUnit(GLcontext * ctx)
|
|||
continue;
|
||||
}
|
||||
|
||||
int swiz = 0;
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= ((rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT) |
|
||||
((rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT) |
|
||||
((rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT) |
|
||||
((rs_tex_count + 3) << R500_RS_IP_TEX_PTR_Q_SHIFT);
|
||||
|
||||
/* with TCL we always seem to route 4 components */
|
||||
if (hw_tcl_on)
|
||||
count = 4;
|
||||
else
|
||||
count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
|
||||
|
||||
if (count == 4) {
|
||||
swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
|
||||
swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
|
||||
swiz |= (rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT;
|
||||
swiz |= (rs_tex_count + 3) << R500_RS_IP_TEX_PTR_Q_SHIFT;
|
||||
} else if (count == 3) {
|
||||
swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
|
||||
swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
|
||||
swiz |= (rs_tex_count + 2) << R500_RS_IP_TEX_PTR_R_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
|
||||
} else if (count == 2) {
|
||||
swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
|
||||
swiz |= (rs_tex_count + 1) << R500_RS_IP_TEX_PTR_T_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
|
||||
} else if (count == 1) {
|
||||
swiz |= (rs_tex_count + 0) << R500_RS_IP_TEX_PTR_S_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
|
||||
} else {
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_T_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT;
|
||||
swiz |= R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT;
|
||||
}
|
||||
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= swiz;
|
||||
r300->hw.rr.cmd[R300_RR_INST_0 + tex_ip] |= R500_RS_INST_TEX_ID(tex_ip) | R500_RS_INST_TEX_CN_WRITE | R500_RS_INST_TEX_ADDR(fp_reg);
|
||||
InputsRead &= ~(FRAG_BIT_TEX0 << i);
|
||||
rs_tex_count += count;
|
||||
rs_tex_count += 4;
|
||||
++tex_ip;
|
||||
++fp_reg;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,34 +204,31 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
|||
ADD_ATTR(VERT_ATTRIB_POINT_SIZE, EMIT_1F, SWTCL_OVM_POINT_SIZE, swiz, MASK_X);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sending only one texcoord component may lead to lock up,
|
||||
* so for all textures always output 4 texcoord components to RS.
|
||||
*/
|
||||
if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
|
||||
int i, size;
|
||||
GLuint swiz, mask, format;
|
||||
int i;
|
||||
GLuint swiz, format;
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
|
||||
switch (VB->TexCoordPtr[i]->size) {
|
||||
case 1:
|
||||
format = EMIT_1F;
|
||||
swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);
|
||||
mask = MASK_X;
|
||||
break;
|
||||
case 2:
|
||||
format = EMIT_2F;
|
||||
swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ZERO, SWIZZLE_ONE);
|
||||
mask = MASK_X | MASK_Y;
|
||||
size = 2;
|
||||
break;
|
||||
case 3:
|
||||
format = EMIT_3F;
|
||||
swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE);
|
||||
mask = MASK_X | MASK_Y | MASK_Z;
|
||||
size = 3;
|
||||
break;
|
||||
case 4:
|
||||
format = EMIT_4F;
|
||||
swiz = SWIZZLE_XYZW;
|
||||
mask = MASK_XYZW;
|
||||
size = 4;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
|
|
@ -239,8 +236,8 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
|||
InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i);
|
||||
OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
|
||||
EMIT_ATTR(_TNL_ATTRIB_TEX(i), format);
|
||||
ADD_ATTR(VERT_ATTRIB_TEX0 + i, format, SWTCL_OVM_TEX(i), swiz, mask);
|
||||
vap_out_fmt_1 |= size << (i * 3);
|
||||
ADD_ATTR(VERT_ATTRIB_TEX0 + i, format, SWTCL_OVM_TEX(i), swiz, MASK_XYZW);
|
||||
vap_out_fmt_1 |= 4 << (i * 3);
|
||||
++first_free_tex;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue