For patches 2-3:

Reviewed-by: Marek Olšák <marek.ol...@amd.com>

Marek

On Mon, Apr 10, 2017 at 11:44 AM, Constantine Kharlamov
<hi-an...@yandex.ru> wrote:
> If that helps, I can split this patch to two: α) Adding checks for null ps, 
> and β) removing the dummy ps. I didn't do that originally, because the patch 
> was small anyway, it's in the 2-nd version that I had to re-indent a block of 
> code, and now it looks bigger.
>
> On 10.04.2017 00:09, Constantine Kharlamov wrote:
>> 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-an...@yandex.ru>
>> ---
>>  src/gallium/drivers/r600/r600_pipe.c         |  9 -----
>>  src/gallium/drivers/r600/r600_pipe.h         |  3 --
>>  src/gallium/drivers/r600/r600_state_common.c | 58 
>> ++++++++++++++--------------
>>  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 5014f2525c..7d8efd2c9b 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 7f1ecc278b..e636ef0024 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 c9b41517cc..8d1193360b 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;
>>  }
>>
>> @@ -1474,7 +1472,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);
>>
>> @@ -1551,37 +1550,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);
>> @@ -1637,7 +1639,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) {
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to