aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/r600/r600_pipe.c9
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h3
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c58
3 files changed, 30 insertions, 40 deletions
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 5014f2525cf..7d8efd2c9b3 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -82,9 +82,6 @@ static void r600_destroy_context(struct pipe_context *context)
if (rctx->fixed_func_tcs_shader)
rctx->b.b.delete_tcs_state(&rctx->b.b, rctx->fixed_func_tcs_shader);
- if (rctx->dummy_pixel_shader) {
- rctx->b.b.delete_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
- }
if (rctx->custom_dsa_flush) {
rctx->b.b.delete_depth_stencil_alpha_state(&rctx->b.b, rctx->custom_dsa_flush);
}
@@ -209,12 +206,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen,
r600_begin_new_cs(rctx);
- rctx->dummy_pixel_shader =
- util_make_fragment_cloneinput_shader(&rctx->b.b, 0,
- TGSI_SEMANTIC_GENERIC,
- TGSI_INTERPOLATE_CONSTANT);
- rctx->b.b.bind_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
-
return &rctx->b.b;
fail:
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 7f1ecc278b6..e636ef00246 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -432,9 +432,6 @@ struct r600_context {
void *custom_blend_resolve;
void *custom_blend_decompress;
void *custom_blend_fastclear;
- /* With rasterizer discard, there doesn't have to be a pixel shader.
- * In that case, we bind this one: */
- void *dummy_pixel_shader;
/* These dummy CMASK and FMASK buffers are used to get around the R6xx hardware
* bug where valid CMASK and FMASK are required to be present to avoid
* a hardlock in certain operations but aren't actually used
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 5be49dcdfe9..0131ea80d27 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -725,7 +725,8 @@ static inline void r600_shader_selector_key(const struct pipe_context *ctx,
if (!key->vs.as_ls)
key->vs.as_es = (rctx->gs_shader != NULL);
- if (rctx->ps_shader->current->shader.gs_prim_id_input && !rctx->gs_shader) {
+ if (rctx->ps_shader && rctx->ps_shader->current->shader.gs_prim_id_input &&
+ !rctx->gs_shader) {
key->vs.as_gs_a = true;
key->vs.prim_id_out = rctx->ps_shader->current->shader.input[rctx->ps_shader->current->shader.ps_prim_id_input].spi_sid;
}
@@ -909,9 +910,6 @@ static void r600_bind_ps_state(struct pipe_context *ctx, void *state)
{
struct r600_context *rctx = (struct r600_context *)ctx;
- if (!state)
- state = rctx->dummy_pixel_shader;
-
rctx->ps_shader = (struct r600_pipe_shader_selector *)state;
}
@@ -1478,7 +1476,8 @@ static bool r600_update_derived_state(struct r600_context *rctx)
}
}
- SELECT_SHADER_OR_FAIL(ps);
+ if (rctx->ps_shader)
+ SELECT_SHADER_OR_FAIL(ps);
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
@@ -1555,37 +1554,40 @@ static bool r600_update_derived_state(struct r600_context *rctx)
rctx->b.streamout.enabled_stream_buffers_mask = clip_so_current->enabled_stream_buffers_mask;
}
- if (unlikely(ps_dirty || rctx->hw_shader_stages[R600_HW_STAGE_PS].shader != rctx->ps_shader->current ||
- rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable ||
- rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)) {
+ if (rctx->ps_shader) {
+ if (unlikely((ps_dirty || rctx->hw_shader_stages[R600_HW_STAGE_PS].shader != rctx->ps_shader->current ||
+ rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable ||
+ rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade))) {
- if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
- rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
- r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
- }
+ if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
+ rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
+ r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
+ }
- if (rctx->b.chip_class <= R700) {
- bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
+ if (rctx->b.chip_class <= R700) {
+ bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
- if (rctx->cb_misc_state.multiwrite != multiwrite) {
- rctx->cb_misc_state.multiwrite = multiwrite;
- r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
+ if (rctx->cb_misc_state.multiwrite != multiwrite) {
+ rctx->cb_misc_state.multiwrite = multiwrite;
+ r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
+ }
}
- }
- if (unlikely(!ps_dirty && rctx->ps_shader && rctx->rasterizer &&
- ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
- (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) {
+ if (unlikely(!ps_dirty && rctx->rasterizer &&
+ ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
+ (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) {
- if (rctx->b.chip_class >= EVERGREEN)
- evergreen_update_ps_state(ctx, rctx->ps_shader->current);
- else
- r600_update_ps_state(ctx, rctx->ps_shader->current);
+ if (rctx->b.chip_class >= EVERGREEN)
+ evergreen_update_ps_state(ctx, rctx->ps_shader->current);
+ else
+ r600_update_ps_state(ctx, rctx->ps_shader->current);
+ }
+
+ r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
}
- r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
+ UPDATE_SHADER(R600_HW_STAGE_PS, ps);
}
- UPDATE_SHADER(R600_HW_STAGE_PS, ps);
if (rctx->b.chip_class >= EVERGREEN) {
evergreen_update_db_shader_control(rctx);
@@ -1641,7 +1643,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
}
}
- blend_disable = (rctx->dual_src_blend &&
+ blend_disable = (rctx->dual_src_blend && rctx->ps_shader &&
rctx->ps_shader->current->nr_ps_color_outputs < 2);
if (blend_disable != rctx->force_blend_disable) {