diff options
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 7 |
3 files changed, 9 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 92a35d51448..4d2b1531ad7 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -580,6 +580,7 @@ struct r300_context { /* Whether two-sided color selection is enabled (AKA light_twoside). */ boolean two_sided_color; boolean flatshade; + boolean clip_halfz; /* Whether fast color clear is enabled. */ boolean cbzb_clear; /* Whether fragment shader needs to be validated. */ diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index b201334cb95..b632963d187 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -1136,6 +1136,7 @@ void r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state) R300_PVS_NUM_CNTLRS(pvs_num_controllers) | R300_PVS_NUM_FPUS(r300screen->caps.num_vert_fpus) | R300_PVS_VF_MAX_VTX_NUM(12) | + (r300->clip_halfz ? R300_DX_CLIP_SPACE_DEF : 0) | (r300screen->caps.is_r500 ? R500_TCL_STATE_OPTIMIZATION : 0)); /* Emit flow control instructions. Even if there are no fc instructions, diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index fd67e35b258..cfcc19d1c68 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1390,6 +1390,7 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) boolean last_two_sided_color = r300->two_sided_color; boolean last_msaa_enable = r300->msaa_enable; boolean last_flatshade = r300->flatshade; + boolean last_clip_halfz = r300->clip_halfz; if (r300->draw && rs) { draw_set_rasterizer_state(r300->draw, &rs->rs_draw, state); @@ -1401,12 +1402,14 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) r300->two_sided_color = rs->rs.light_twoside; r300->msaa_enable = rs->rs.multisample; r300->flatshade = rs->rs.flatshade; + r300->clip_halfz = rs->rs.clip_halfz; } else { r300->polygon_offset_enabled = FALSE; r300->sprite_coord_enable = 0; r300->two_sided_color = FALSE; r300->msaa_enable = FALSE; r300->flatshade = FALSE; + r300->clip_halfz = FALSE; } UPDATE_STATE(state, r300->rs_state); @@ -1428,6 +1431,10 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) r300->fs_status = FRAGMENT_SHADER_MAYBE_DIRTY; } } + + if (last_clip_halfz != r300->clip_halfz) { + r300_mark_atom_dirty(r300, &r300->vs_state); + } } /* Free rasterizer state. */ |