Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>

for the series.

On Fri, Jan 5, 2018 at 6:26 PM, Samuel Pitoiset
<samuel.pitoi...@gmail.com> wrote:
> For Vega10 and Raven that need a special workaround for the
> scissor bug.
>
> This seems to give a minor boost for Talos and Dota 2, at least.
>
> To reduce the cost of memcmp, the driver checks if it's
> really useful to do the comparison.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
> ---
>  src/amd/vulkan/radv_cmd_buffer.c | 39 +++++++++++++++++++++++++++++++++------
>  1 file changed, 33 insertions(+), 6 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c 
> b/src/amd/vulkan/radv_cmd_buffer.c
> index 665ee876a9..d8f780cfd7 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -2733,15 +2733,28 @@ void radv_CmdSetViewport(
>         const VkViewport*                           pViewports)
>  {
>         RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> +       struct radv_cmd_state *state = &cmd_buffer->state;
>         MAYBE_UNUSED const uint32_t total_count = firstViewport + 
> viewportCount;
>
>         assert(firstViewport < MAX_VIEWPORTS);
>         assert(total_count >= 1 && total_count <= MAX_VIEWPORTS);
>
> -       memcpy(cmd_buffer->state.dynamic.viewport.viewports + firstViewport,
> -              pViewports, viewportCount * sizeof(*pViewports));
> +       if (cmd_buffer->device->physical_device->has_scissor_bug) {
> +               /* Try to skip unnecessary PS partial flushes when the 
> viewports
> +                * don't change.
> +                */
> +               if (!(state->dirty & (RADV_CMD_DIRTY_DYNAMIC_VIEWPORT |
> +                                     RADV_CMD_DIRTY_DYNAMIC_SCISSOR)) &&
> +                   !memcmp(state->dynamic.viewport.viewports + firstViewport,
> +                           pViewports, viewportCount * sizeof(*pViewports))) 
> {
> +                       return;
> +               }
> +       }
> +
> +       memcpy(state->dynamic.viewport.viewports + firstViewport, pViewports,
> +              viewportCount * sizeof(*pViewports));
>
> -       cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_VIEWPORT;
> +       state->dirty |= RADV_CMD_DIRTY_DYNAMIC_VIEWPORT;
>  }
>
>  void radv_CmdSetScissor(
> @@ -2751,14 +2764,28 @@ void radv_CmdSetScissor(
>         const VkRect2D*                             pScissors)
>  {
>         RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> +       struct radv_cmd_state *state = &cmd_buffer->state;
>         MAYBE_UNUSED const uint32_t total_count = firstScissor + scissorCount;
>
>         assert(firstScissor < MAX_SCISSORS);
>         assert(total_count >= 1 && total_count <= MAX_SCISSORS);
>
> -       memcpy(cmd_buffer->state.dynamic.scissor.scissors + firstScissor,
> -              pScissors, scissorCount * sizeof(*pScissors));
> -       cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_SCISSOR;
> +       if (cmd_buffer->device->physical_device->has_scissor_bug) {
> +               /* Try to skip unnecessary PS partial flushes when the 
> scissors
> +                * don't change.
> +                */
> +               if (!(state->dirty & (RADV_CMD_DIRTY_DYNAMIC_VIEWPORT |
> +                                     RADV_CMD_DIRTY_DYNAMIC_SCISSOR)) &&
> +                   !memcmp(state->dynamic.scissor.scissors + firstScissor,
> +                           pScissors, scissorCount * sizeof(*pScissors))) {
> +                       return;
> +               }
> +       }
> +
> +       memcpy(state->dynamic.scissor.scissors + firstScissor, pScissors,
> +              scissorCount * sizeof(*pScissors));
> +
> +       state->dirty |= RADV_CMD_DIRTY_DYNAMIC_SCISSOR;
>  }
>
>  void radv_CmdSetLineWidth(
> --
> 2.15.1
>
> _______________________________________________
> 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