diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 715a089cb8c..2073c58154a 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -2357,6 +2357,22 @@ isl_swizzle_is_identity(struct isl_swizzle swizzle) swizzle.a == ISL_CHANNEL_SELECT_ALPHA; } +static inline bool +isl_swizzle_is_identity_for_format(enum isl_format format, + struct isl_swizzle swizzle) +{ + const struct isl_format_layout *layout = isl_format_get_layout(format); + +#define channel_id_or_zero(name, ID) \ + (swizzle.name == ISL_CHANNEL_SELECT_##ID || \ + layout->channels.name.bits == 0) + return channel_id_or_zero(r, RED) && + channel_id_or_zero(g, GREEN) && + channel_id_or_zero(b, BLUE) && + channel_id_or_zero(a, ALPHA); +#undef channel_id_or_zero +} + bool isl_swizzle_supports_rendering(const struct intel_device_info *devinfo, struct isl_swizzle swizzle); diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index bcc04a3853e..6fb8b43c6de 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -2566,7 +2566,7 @@ anv_image_fill_surface_state(struct anv_device *device, */ assert(isl_formats_have_same_bits_per_channel(lower_format, view.format) || - isl_swizzle_is_identity(view.swizzle)); + isl_swizzle_is_identity_for_format(view.format, view.swizzle)); view.format = lower_format; }