diff options
| author | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-04-06 23:17:33 -0700 | 
|---|---|---|
| committer | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-04-06 23:18:56 -0700 | 
| commit | ffbf3f4952fa9e7c2971a73d9540ed977fdc6c9a (patch) | |
| tree | 619d5a98b67f267636172a97759629538c4342eb /src | |
| parent | 3630da9916a4f24a03d3a63420690f8016a9b72a (diff) | |
r300-gallium: Properly setup HW/SW TCL controls.
This keeps non-TCL chipsets from locking up, and also fully unbreaks
RADEON_NO_TCL rendering.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 21 | ||||
| -rw-r--r-- | 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 095df04630..2a77fd1739 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 dc4b29eb40..6bc39954b7 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) | | 
