diff options
author | Dave Airlie <[email protected]> | 2016-10-11 16:46:25 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2016-10-14 04:45:57 +1000 |
commit | 060e6f468a35bcf3fbc425b489ef1f39be808e81 (patch) | |
tree | cb88e2e060883f65a12b81390fd490ed2c6adce5 /src/amd/vulkan | |
parent | 8980ac041167fb5a80be76e2f912b96117afa2cf (diff) |
radv: fix identity swizzle handling
The identity swizzle should operate exactly
like an .r = R, .g = G, .b = B, .a = A swizzle.
This fixes a bunch of the 16-bit BGRA blit tests
dEQP-VK.api.copy_and_blit.blit_image.all_formats.b4g4r4a4*
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan')
-rw-r--r-- | src/amd/vulkan/vk_format.h | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/amd/vulkan/vk_format.h b/src/amd/vulkan/vk_format.h index 7b783739094..58ee3f71f06 100644 --- a/src/amd/vulkan/vk_format.h +++ b/src/amd/vulkan/vk_format.h @@ -32,6 +32,7 @@ extern "C" { #include <assert.h> #include <vulkan/vulkan.h> +#include <util/macros.h> enum vk_format_layout { /** * Formats with vk_format_block::width == vk_format_block::height == 1 @@ -257,12 +258,13 @@ vk_format_aspects(VkFormat format) } static inline enum vk_swizzle -radv_swizzle_conv(int idx, const unsigned char chan[4], VkComponentSwizzle vk_swiz) +radv_swizzle_conv(VkComponentSwizzle component, const unsigned char chan[4], VkComponentSwizzle vk_swiz) { int x; + + if (vk_swiz == VK_COMPONENT_SWIZZLE_IDENTITY) + vk_swiz = component; switch (vk_swiz) { - case VK_COMPONENT_SWIZZLE_IDENTITY: - return chan[idx]; case VK_COMPONENT_SWIZZLE_ZERO: return VK_SWIZZLE_0; case VK_COMPONENT_SWIZZLE_ONE: @@ -288,7 +290,7 @@ radv_swizzle_conv(int idx, const unsigned char chan[4], VkComponentSwizzle vk_sw return x; return VK_SWIZZLE_1; default: - return chan[idx]; + unreachable("Illegal swizzle"); } } @@ -296,10 +298,10 @@ static inline void vk_format_compose_swizzles(const VkComponentMapping *mapping, const unsigned char swz[4], enum vk_swizzle dst[4]) { - dst[0] = radv_swizzle_conv(0, swz, mapping->r); - dst[1] = radv_swizzle_conv(1, swz, mapping->g); - dst[2] = radv_swizzle_conv(2, swz, mapping->b); - dst[3] = radv_swizzle_conv(3, swz, mapping->a); + dst[0] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_R, swz, mapping->r); + dst[1] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_G, swz, mapping->g); + dst[2] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_B, swz, mapping->b); + dst[3] = radv_swizzle_conv(VK_COMPONENT_SWIZZLE_A, swz, mapping->a); } static inline bool |