[Mesa-dev] [PATCH] anv: Don't use bogus alpha swizzles

Anuj Phogat anuj.phogat at gmail.com
Wed Feb 1 21:32:11 UTC 2017


On Wed, Feb 1, 2017 at 12:39 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
>
> For RGB formats in Vulkan, we use the corresponding RGBA format with a
> swizzle of RGB1.  While this swizzle is exactly what we want for
> texturing, it's not allowed for rendering according to the docs.  While
> we haven't been getting hangs or anything, we should probably obey the
> docs.  This commit just sanitizes all render swizzles so that the alpha
> channel maps to ALPHA.
>
> Cc: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  src/intel/vulkan/anv_blorp.c       |  9 ++++++---
>  src/intel/vulkan/anv_private.h     | 15 +++++++++++++++
>  src/intel/vulkan/genX_cmd_buffer.c |  1 +
>  3 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index 2edd071..2cf972b 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -503,7 +503,8 @@ void anv_CmdBlitImage(
>           blorp_blit(&batch, &src, src_res->mipLevel, src_z,
>                      src_format.isl_format, src_format.swizzle,
>                      &dst, dst_res->mipLevel, dst_z,
> -                    dst_format.isl_format, dst_format.swizzle,
> +                    dst_format.isl_format,
> +                    anv_swizzle_for_render(dst_format.swizzle),
>                      src_x0, src_y0, src_x1, src_y1,
>                      dst_x0, dst_y0, dst_x1, dst_y1,
>                      gl_filter, flip_x, flip_y);
> @@ -831,7 +832,8 @@ void anv_CmdClearColorImage(
>           }
>
>           blorp_clear(&batch, &surf,
> -                     src_format.isl_format, src_format.swizzle,
> +                     src_format.isl_format,
> +                     anv_swizzle_for_render(src_format.swizzle),
>                       level, base_layer, layer_count,
>                       0, 0, level_width, level_height,
>                       vk_to_isl_color(*pColor), color_write_disable);
> @@ -1216,7 +1218,8 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
>           cmd_buffer->state.pending_pipe_bits |=
>              ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
>        } else {
> -         blorp_clear(&batch, &surf, iview->isl.format, iview->isl.swizzle,
> +         blorp_clear(&batch, &surf, iview->isl.format,
> +                     anv_swizzle_for_render(iview->isl.swizzle),
>                       iview->isl.base_level,
>                       iview->isl.base_array_layer, fb->layers,
>                       render_area.offset.x, render_area.offset.y,
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index 0cc6550..a0cb35c 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1552,6 +1552,21 @@ anv_get_isl_format(const struct gen_device_info *devinfo, VkFormat vk_format,
>     return anv_get_format(devinfo, vk_format, aspect, tiling).isl_format;
>  }
>
> +static inline struct isl_swizzle
> +anv_swizzle_for_render(struct isl_swizzle swizzle)
> +{
> +   /* Sometimes the swizzle will have alpha map to one.  We do this to fake
> +    * RGB as RGBA for texturing
> +    */
> +   assert(swizzle.a == ISL_CHANNEL_SELECT_ONE ||
> +          swizzle.a == ISL_CHANNEL_SELECT_ALPHA);
> +
> +   /* But it doesn't matter what we render to that channel */
> +   swizzle.a = ISL_CHANNEL_SELECT_ALPHA;
> +
> +   return swizzle;
> +}
> +
>  void
>  anv_pipeline_setup_l3_config(struct anv_pipeline *pipeline, bool needs_slm);
>
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
> index 0ad7cd5..b6b7f74 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -528,6 +528,7 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
>
>              struct isl_view view = iview->isl;
>              view.usage |= ISL_SURF_USAGE_RENDER_TARGET_BIT;
> +            view.swizzle = anv_swizzle_for_render(view.swizzle);
>              isl_surf_fill_state(isl_dev,
>                                  state->attachments[i].color_rt_state.map,
>                                  .surf = &iview->image->color_surface.isl,
> --
> 2.5.0.400.gff86faf
>
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list