r300-gallium: Make UCP and clip work again for SW TCL.

SW TCL: tri-clip works, tri-userclip works
HW TCL: tri-clip fails, tri-userclip works

That is a 200% improvement over the previous situation. Woot.
This commit is contained in:
Corbin Simpson 2009-06-08 20:01:57 -07:00
parent ffa1972efb
commit cb3b91f2d6
2 changed files with 21 additions and 19 deletions

View file

@ -149,8 +149,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
r300->draw = draw_create();
/* Enable our renderer. */
draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300));
/* Tell Draw that we can always do non-UCP clipping. */
draw_set_driver_clipping(r300->draw, TRUE);
/* Disable Draw's clipping if TCL is present. */
draw_set_driver_clipping(r300->draw, r300_screen(screen)->caps->has_tcl);
/* Force Draw to never do viewport transform, since (again) we can do
* transform in hardware, always. */
draw_set_viewport_state(r300->draw, &r300_viewport_identity);

View file

@ -63,25 +63,27 @@ void r300_emit_clip_state(struct r300_context* r300,
struct r300_screen* r300screen = r300_screen(r300->context.screen);
CS_LOCALS(r300);
if (!r300screen->caps->has_tcl) {
return;
if (r300screen->caps->has_tcl) {
BEGIN_CS(5 + (6 * 4));
OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
(r300screen->caps->is_r500 ?
R500_PVS_UCP_START : R300_PVS_UCP_START));
OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, 6 * 4);
for (i = 0; i < 6; i++) {
OUT_CS_32F(clip->ucp[i][0]);
OUT_CS_32F(clip->ucp[i][1]);
OUT_CS_32F(clip->ucp[i][2]);
OUT_CS_32F(clip->ucp[i][3]);
}
OUT_CS_REG(R300_VAP_CLIP_CNTL, ((1 << clip->nr) - 1) |
R300_PS_UCP_MODE_CLIP_AS_TRIFAN);
END_CS;
} else {
BEGIN_CS(2);
OUT_CS_REG(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE);
END_CS;
}
BEGIN_CS(5 + (6 * 4));
OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
(r300screen->caps->is_r500 ?
R500_PVS_UCP_START : R300_PVS_UCP_START));
OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, 6 * 4);
for (i = 0; i < 6; i++) {
OUT_CS_32F(clip->ucp[i][0]);
OUT_CS_32F(clip->ucp[i][1]);
OUT_CS_32F(clip->ucp[i][2]);
OUT_CS_32F(clip->ucp[i][3]);
}
OUT_CS_REG(R300_VAP_CLIP_CNTL, ((1 << clip->nr) - 1) |
R300_PS_UCP_MODE_CLIP_AS_TRIFAN);
END_CS;
}
void r300_emit_dsa_state(struct r300_context* r300,