[Mesa-dev] [PATCH] r600g: fix crash in set_framebuffer_state

Marek Olšák maraeo at gmail.com
Fri Oct 11 17:37:04 CEST 2013


Pushed, thanks.

Marek

On Fri, Oct 11, 2013 at 1:23 AM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> We should be able to safely set the framebuffer state without a
> fragment shader bound. bind_ps_state will take care of updating the
> necessary state bits later.
>
> v2: check in update_db_shader_control
> ---
>  src/gallium/drivers/r600/evergreen_state.c | 23 +++++++++++++++--------
>  src/gallium/drivers/r600/r600_state.c      | 15 +++++++++++----
>  2 files changed, 26 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 83cb024..4535d21 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -3581,14 +3581,21 @@ void *evergreen_create_db_flush_dsa(struct r600_context *rctx)
>
>  void evergreen_update_db_shader_control(struct r600_context * rctx)
>  {
> -       bool dual_export = rctx->framebuffer.export_16bpc &&
> -                          !rctx->ps_shader->current->ps_depth_export;
> -
> -       unsigned db_shader_control = rctx->ps_shader->current->db_shader_control |
> -                       S_02880C_DUAL_EXPORT_ENABLE(dual_export) |
> -                       S_02880C_DB_SOURCE_FORMAT(dual_export ? V_02880C_EXPORT_DB_TWO :
> -                                                               V_02880C_EXPORT_DB_FULL) |
> -                       S_02880C_ALPHA_TO_MASK_DISABLE(rctx->framebuffer.cb0_is_integer);
> +       bool dual_export;
> +       unsigned db_shader_control;
> +
> +       if (!rctx->ps_shader) {
> +               return;
> +       }
> +
> +       dual_export = rctx->framebuffer.export_16bpc &&
> +                     !rctx->ps_shader->current->ps_depth_export;
> +
> +       db_shader_control = rctx->ps_shader->current->db_shader_control |
> +                           S_02880C_DUAL_EXPORT_ENABLE(dual_export) |
> +                           S_02880C_DB_SOURCE_FORMAT(dual_export ? V_02880C_EXPORT_DB_TWO :
> +                                                                   V_02880C_EXPORT_DB_FULL) |
> +                           S_02880C_ALPHA_TO_MASK_DISABLE(rctx->framebuffer.cb0_is_integer);
>
>         /* When alpha test is enabled we can't trust the hw to make the proper
>          * decision on the order in which ztest should be run related to fragment
> diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
> index b01ab9c..f148052 100644
> --- a/src/gallium/drivers/r600/r600_state.c
> +++ b/src/gallium/drivers/r600/r600_state.c
> @@ -2972,11 +2972,18 @@ void *r600_create_db_flush_dsa(struct r600_context *rctx)
>
>  void r600_update_db_shader_control(struct r600_context * rctx)
>  {
> -       bool dual_export = rctx->framebuffer.export_16bpc &&
> -                          !rctx->ps_shader->current->ps_depth_export;
> +       bool dual_export;
> +       unsigned db_shader_control;
>
> -       unsigned db_shader_control = rctx->ps_shader->current->db_shader_control |
> -                                    S_02880C_DUAL_EXPORT_ENABLE(dual_export);
> +       if (!rctx->ps_shader) {
> +               return;
> +       }
> +
> +       dual_export = rctx->framebuffer.export_16bpc &&
> +                     !rctx->ps_shader->current->ps_depth_export;
> +
> +       db_shader_control = rctx->ps_shader->current->db_shader_control |
> +                           S_02880C_DUAL_EXPORT_ENABLE(dual_export);
>
>         /* When alpha test is enabled we can't trust the hw to make the proper
>          * decision on the order in which ztest should be run related to fragment
> --
> 1.8.1.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list