r300: reorder fog coordinate and WPOS fp attributes
HW TCL path currently assumed fog, WPOS order. The order was inverted for SW TCL path. This hopefully fixes rest of fog and WPOS related bugs. Additionally fix some indentation, don't route unnecessary components of fog coordinates for performance reasons and simplify vertex attribute emitting for SW TCL path.
This commit is contained in:
committed by
Dave Airlie
parent
3b1d544001
commit
1ec0efa7d3
@@ -191,7 +191,7 @@ GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
|
||||
fprintf(stderr, "\tout of free texcoords to write fog coord\n");
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
ret |= 4 << (3 * first_free_texcoord);
|
||||
ret |= 1 << (3 * first_free_texcoord);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1510,9 +1510,9 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
||||
|
||||
/* with TCL we always seem to route 4 components */
|
||||
if (hw_tcl_on)
|
||||
count = 4;
|
||||
count = 4;
|
||||
else
|
||||
count = VB->AttribPtr[_TNL_ATTRIB_TEX(i)]->size;
|
||||
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;
|
||||
@@ -1530,28 +1530,28 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
||||
++fp_reg;
|
||||
}
|
||||
|
||||
if (InputsRead & FRAG_BIT_FOGC) {
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_FOGC, _TNL_ATTRIB_FOG)) {
|
||||
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_FOGC;
|
||||
rs_tex_count += 4;
|
||||
++tex_ip;
|
||||
++fp_reg;
|
||||
} else {
|
||||
WARN_ONCE("fragprog wants fogc, vp doesn't provide it\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (InputsRead & FRAG_BIT_WPOS) {
|
||||
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.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_WPOS;
|
||||
rs_tex_count += 4;
|
||||
++tex_ip;
|
||||
++fp_reg;
|
||||
}
|
||||
InputsRead &= ~FRAG_BIT_WPOS;
|
||||
|
||||
if (InputsRead & FRAG_BIT_FOGC) {
|
||||
if (R300_OUTPUTS_WRITTEN_TEST(OutputsWritten, VERT_RESULT_FOGC, _TNL_ATTRIB_FOG)) {
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_S(0) | R300_RS_SEL_T(R300_RS_SEL_K0) | R300_RS_SEL_R(R300_RS_SEL_K0);
|
||||
r300->hw.ri.cmd[R300_RI_INTERP_0 + tex_ip] |= R300_RS_SEL_Q(R300_RS_SEL_K1) | 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_FOGC;
|
||||
rs_tex_count += 1;
|
||||
++tex_ip;
|
||||
++fp_reg;
|
||||
} else {
|
||||
WARN_ONCE("fragprog wants fogc, vp doesn't provide it\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup default color if no color or tex was set */
|
||||
if (rs_tex_count == 0 && col_ip == 0) {
|
||||
@@ -1560,10 +1560,10 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
||||
}
|
||||
|
||||
high_rr = (col_ip > tex_ip) ? col_ip : tex_ip;
|
||||
r300->hw.rc.cmd[1] |= (rs_tex_count << R300_IT_COUNT_SHIFT) | (col_ip << R300_IC_COUNT_SHIFT) | R300_HIRES_EN;
|
||||
r300->hw.rc.cmd[1] |= (rs_tex_count << R300_IT_COUNT_SHIFT) | (col_ip << R300_IC_COUNT_SHIFT) | R300_HIRES_EN;
|
||||
r300->hw.rc.cmd[2] |= high_rr - 1;
|
||||
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, high_rr);
|
||||
r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, high_rr);
|
||||
|
||||
if (InputsRead)
|
||||
WARN_ONCE("Don't know how to satisfy InputsRead=0x%08x\n", InputsRead);
|
||||
|
||||
@@ -171,7 +171,7 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
||||
r300ContextPtr rmesa = R300_CONTEXT( ctx );
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
int fog_id = -1, vap_out_fmt_1 = 0;
|
||||
int first_free_tex = 0, vap_out_fmt_1 = 0;
|
||||
GLuint InputsRead = 0;
|
||||
GLuint OutputsWritten = 0;
|
||||
int num_attrs = 0;
|
||||
@@ -222,33 +222,6 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
||||
ADD_ATTR(VERT_ATTRIB_POINT_SIZE, EMIT_1F, SWTCL_OVM_POINT_SIZE, swiz, MASK_X);
|
||||
}
|
||||
|
||||
if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_FOG)) {
|
||||
/* find first free tex coord slot */
|
||||
if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
|
||||
int i;
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
if (!RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
|
||||
fog_id = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fog_id = 0;
|
||||
}
|
||||
|
||||
if (fog_id == -1) {
|
||||
fprintf(stderr, "\tout of free texcoords to do fog\n");
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
|
||||
InputsRead |= 1 << VERT_ATTRIB_FOG;
|
||||
OutputsWritten |= 1 << VERT_RESULT_FOGC;
|
||||
GLuint swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO);
|
||||
EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1F );
|
||||
ADD_ATTR(VERT_ATTRIB_FOG, EMIT_1F, SWTCL_OVM_TEX(fog_id), swiz, MASK_X);
|
||||
vap_out_fmt_1 |= 1 << (fog_id * 3);
|
||||
}
|
||||
|
||||
if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
|
||||
int i, size;
|
||||
GLuint swiz, mask, format;
|
||||
@@ -282,30 +255,14 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
||||
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);
|
||||
++first_free_tex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* RS can't put fragment position on the pixel stack, so stuff it in texcoord if needed */
|
||||
if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_POS) && (ctx->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_WPOS)) {
|
||||
int first_free_tex = -1;
|
||||
if (fog_id >= 0) {
|
||||
first_free_tex = fog_id+1;
|
||||
} else {
|
||||
if (RENDERINPUTS_TEST_RANGE(tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
|
||||
int i;
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
if (!RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX(i) )) {
|
||||
first_free_tex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
first_free_tex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (first_free_tex == -1) {
|
||||
if (first_free_tex >= ctx->Const.MaxTextureUnits) {
|
||||
fprintf(stderr, "\tout of free texcoords to write w pos\n");
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
@@ -315,6 +272,21 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
||||
EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F );
|
||||
ADD_ATTR(VERT_ATTRIB_POS, EMIT_4F, SWTCL_OVM_TEX(first_free_tex), SWIZZLE_XYZW, MASK_XYZW);
|
||||
vap_out_fmt_1 |= 4 << (first_free_tex * 3);
|
||||
++first_free_tex;
|
||||
}
|
||||
|
||||
if (RENDERINPUTS_TEST(tnl->render_inputs_bitset, _TNL_ATTRIB_FOG)) {
|
||||
if (first_free_tex >= ctx->Const.MaxTextureUnits) {
|
||||
fprintf(stderr, "\tout of free texcoords to write fog coordinate\n");
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
|
||||
InputsRead |= 1 << VERT_ATTRIB_FOG;
|
||||
OutputsWritten |= 1 << VERT_RESULT_FOGC;
|
||||
GLuint swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO);
|
||||
EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1F );
|
||||
ADD_ATTR(VERT_ATTRIB_FOG, EMIT_1F, SWTCL_OVM_TEX(first_free_tex), swiz, MASK_X);
|
||||
vap_out_fmt_1 |= 1 << (first_free_tex * 3);
|
||||
}
|
||||
|
||||
R300_NEWPRIM(rmesa);
|
||||
|
||||
Reference in New Issue
Block a user