r600g: get rid of dummy pixel shader
authorConstantine Kharlamov <Hi-Angel@yandex.ru>
Mon, 10 Apr 2017 20:04:37 +0000 (23:04 +0300)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 10 Apr 2017 20:45:22 +0000 (22:45 +0200)
The idea is taken from radeonsi. The code mostly was already checking for null
pixel shader, so little checks had to be added.

Interestingly, acc. to testing with GTAⅣ, though binding of null shader happens
a lot at the start (then just stops), but draw_vbo() never actually sees null
ps.

v2: added a check I missed because of a macros using a prefix to choose
a shader.

Signed-off-by: Constantine Kharlamov <Hi-Angel@yandex.ru>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state_common.c

index 5014f2525cf0cae9d9ecc7813cd7ca0cb161d76b..7d8efd2c9b3ebe465b4cf34e76737af2498bf66e 100644 (file)
@@ -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:
index 7f1ecc278b68949322ead605c7f7c3f13c82b397..e636ef002461bacb1d17dfa71ad1397fe0ab16f4 100644 (file)
@@ -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
index 5be49dcdfe94dc2bb6c1e3ab9e25cfdb27ad4497..0131ea80d27fe06f1519b0db020e948af3ebe323 100644 (file)
@@ -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) {