From ffbf3f4952fa9e7c2971a73d9540ed977fdc6c9a Mon Sep 17 00:00:00 2001 From: Corbin Simpson Date: Mon, 6 Apr 2009 23:17:33 -0700 Subject: [PATCH] r300-gallium: Properly setup HW/SW TCL controls. This keeps non-TCL chipsets from locking up, and also fully unbreaks RADEON_NO_TCL rendering. --- src/gallium/drivers/r300/r300_state.c | 21 ++++++++++----------- src/gallium/drivers/r300/r300_surface.c | 3 ++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 095df04630f..2a77fd17390 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -338,11 +338,17 @@ static void* r300_create_rs_state(struct pipe_context* pipe, { struct r300_rs_state* rs = CALLOC_STRUCT(r300_rs_state); - /* XXX endian control */ - if (r300_screen(pipe->screen)->caps->has_tcl) { - rs->vap_control_status = 0; - } else { + /* Copy rasterizer state for Draw. */ + rs->rs = *state; + + /* If bypassing TCL, or if no TCL engine is present, turn off the HW TCL. + * Else, enable HW TCL and force Draw's TCL off. */ + if (state->bypass_vs_clip_and_viewport || + !r300_screen(pipe->screen)->caps->has_tcl) { rs->vap_control_status = R300_VAP_TCL_BYPASS; + } else { + rs->rs.bypass_vs_clip_and_viewport = TRUE; + rs->vap_control_status = 0; } rs->point_size = pack_float_16_6x(state->point_size) | @@ -406,13 +412,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe, rs->color_control = R300_SHADE_MODEL_SMOOTH; } - rs->rs = *state; - - /* If using HW TCL, tell Draw to not do its magic. */ - if (r300_screen(pipe->screen)->caps->has_tcl) { - rs->rs.bypass_vs_clip_and_viewport = TRUE; - } - return (void*)rs; } diff --git a/src/gallium/drivers/r300/r300_surface.c b/src/gallium/drivers/r300/r300_surface.c index dc4b29eb40a..6bc39954b71 100644 --- a/src/gallium/drivers/r300/r300_surface.c +++ b/src/gallium/drivers/r300/r300_surface.c @@ -109,7 +109,8 @@ static void r300_surface_fill(struct pipe_context* pipe, if (caps->has_tcl) { r300_emit_vertex_shader(r300, &r300_passthrough_vertex_shader); } else { - BEGIN_CS(2); + BEGIN_CS(4); + OUT_CS_REG(R300_VAP_CNTL_STATUS, R300_VAP_TCL_BYPASS); OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(5) | R300_PVS_NUM_CNTLRS(5) | R300_PVS_NUM_FPUS(caps->num_vert_fpus) | -- 2.30.2