[Mesa-dev] [PATCH] radv: disable binning state in some situations

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Thu Mar 22 23:13:12 UTC 2018


I'd rather we figure out a story of when it is faster. I tried a lot
of stuff with the currently available games, and getting it
consistently faster was difficult.

So if you have a raven ridge, feel free to try something, but I'm not
really a fan of copying it blindly without understanding it.

On Thu, Mar 22, 2018 at 6:40 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This is imported from RadeonSI/ADMVLK. That might or might not
> improve performance. Anyway, it's still disabled by default.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/amd/vulkan/radv_pipeline.c | 56 +++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 55 insertions(+), 1 deletion(-)
>
> diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
> index dd5baec117..6c0d552c81 100644
> --- a/src/amd/vulkan/radv_pipeline.c
> +++ b/src/amd/vulkan/radv_pipeline.c
> @@ -2134,6 +2134,59 @@ radv_compute_bin_size(struct radv_pipeline *pipeline, const VkGraphicsPipelineCr
>         return extent;
>  }
>
> +static bool
> +radv_is_depth_write_enabled(const VkPipelineDepthStencilStateCreateInfo *pCreateInfo)
> +{
> +       assert(pCreateInfo);
> +       return pCreateInfo->depthTestEnable &&
> +              pCreateInfo->depthWriteEnable &&
> +              pCreateInfo->depthCompareOp != VK_COMPARE_OP_NEVER;
> +}
> +
> +static bool
> +radv_is_stencil_write_enabled(const VkPipelineDepthStencilStateCreateInfo *pCreateInfo)
> +{
> +       assert(pCreateInfo);
> +       return pCreateInfo->stencilTestEnable &&
> +              (pCreateInfo->front.failOp != VK_STENCIL_OP_KEEP ||
> +               pCreateInfo->front.passOp != VK_STENCIL_OP_KEEP ||
> +               pCreateInfo->front.depthFailOp != VK_STENCIL_OP_KEEP ||
> +               pCreateInfo->back.failOp != VK_STENCIL_OP_KEEP ||
> +               pCreateInfo->back.passOp != VK_STENCIL_OP_KEEP ||
> +               pCreateInfo->back.depthFailOp != VK_STENCIL_OP_KEEP);
> +}
> +
> +static bool
> +radv_should_enable_pbb(struct radv_pipeline *pipeline,
> +                      const VkGraphicsPipelineCreateInfo *pCreateInfo)
> +{
> +       RADV_FROM_HANDLE(radv_render_pass, pass, pCreateInfo->renderPass);
> +       struct radv_subpass *subpass = pass->subpasses + pCreateInfo->subpass;
> +       struct radv_shader_variant *ps = pipeline->shaders[MESA_SHADER_FRAGMENT];
> +
> +       if (!pipeline->device->pbb_allowed)
> +               return false;
> +
> +       /* Whether we can disable binning state based on the pixel shader, MSAA
> +        * states and depth/stencil writes.
> +        */
> +       bool ps_can_kill = ps->info.fs.can_discard ||
> +                          ps->info.info.ps.writes_sample_mask ||
> +                          pCreateInfo->pMultisampleState;
> +       bool ps_can_reject_z_trivially = !ps->info.info.ps.writes_z;
> +       bool ds_write_enabled =
> +               pCreateInfo->pDepthStencilState &&
> +               subpass->depth_stencil_attachment.attachment != VK_ATTACHMENT_UNUSED &&
> +               (radv_is_depth_write_enabled(pCreateInfo->pDepthStencilState) ||
> +                radv_is_stencil_write_enabled(pCreateInfo->pDepthStencilState));
> +
> +       /* Disable binning state if PS can kill trivially with DB writes. */
> +       if (ps_can_kill && ps_can_reject_z_trivially && ds_write_enabled)
> +               return false;
> +
> +       return true;
> +}
> +
>  static void
>  radv_pipeline_generate_binning_state(struct radeon_winsys_cs *cs,
>                                      struct radv_pipeline *pipeline,
> @@ -2168,7 +2221,8 @@ radv_pipeline_generate_binning_state(struct radeon_winsys_cs *cs,
>                 unreachable("unhandled family while determining binning state.");
>         }
>
> -       if (pipeline->device->pbb_allowed && bin_size.width && bin_size.height) {
> +       if (radv_should_enable_pbb(pipeline, pCreateInfo) &&
> +           bin_size.width && bin_size.height) {
>                 pa_sc_binner_cntl_0 =
>                         S_028C44_BINNING_MODE(V_028C44_BINNING_ALLOWED) |
>                         S_028C44_BIN_SIZE_X(bin_size.width == 16) |
> --
> 2.16.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list