diff options
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 4 | ||||
-rw-r--r-- | src/gpu/vk/GrVkImage.cpp | 2 | ||||
-rw-r--r-- | src/gpu/vk/GrVkUtil.cpp | 57 | ||||
-rw-r--r-- | src/gpu/vk/GrVkUtil.h | 7 | ||||
-rw-r--r-- | tools/sk_app/VulkanWindowContext.cpp | 8 |
5 files changed, 71 insertions, 7 deletions
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 319e188ab3..5fdf58e406 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -898,7 +898,7 @@ static bool check_backend_texture(const GrBackendTexture& backendTex, return false; } - SkASSERT(config == GrVkFormatToPixelConfig(info->fFormat)); + SkASSERT(GrVkFormatPixelConfigPairIsValid(info->fFormat, config)); return true; } @@ -1072,7 +1072,7 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { } // setup memory barrier - SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(tex->imageFormat())); + SkASSERT(GrVkFormatIsSupported(tex->imageFormat())); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; VkImageMemoryBarrier imageMemoryBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType diff --git a/src/gpu/vk/GrVkImage.cpp b/src/gpu/vk/GrVkImage.cpp index c3a47dcfdc..d23ebfe360 100644 --- a/src/gpu/vk/GrVkImage.cpp +++ b/src/gpu/vk/GrVkImage.cpp @@ -20,7 +20,7 @@ VkImageAspectFlags vk_format_to_aspect_flags(VkFormat format) { case VK_FORMAT_D32_SFLOAT_S8_UINT: return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; default: - SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(format)); + SkASSERT(GrVkFormatIsSupported(format)); return VK_IMAGE_ASPECT_COLOR_BIT; } } diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp index 1b206050c7..cb0046e58c 100644 --- a/src/gpu/vk/GrVkUtil.cpp +++ b/src/gpu/vk/GrVkUtil.cpp @@ -106,6 +106,63 @@ GrPixelConfig GrVkFormatToPixelConfig(VkFormat format) { } } +bool GrVkFormatPixelConfigPairIsValid(VkFormat format, GrPixelConfig config) { + switch (format) { + case VK_FORMAT_R8G8B8A8_UNORM: + return kRGBA_8888_GrPixelConfig == config; + case VK_FORMAT_B8G8R8A8_UNORM: + return kBGRA_8888_GrPixelConfig == config; + case VK_FORMAT_R8G8B8A8_SRGB: + return kSRGBA_8888_GrPixelConfig == config; + case VK_FORMAT_B8G8R8A8_SRGB: + return kSBGRA_8888_GrPixelConfig == config; + case VK_FORMAT_R8G8B8A8_SINT: + return kRGBA_8888_sint_GrPixelConfig == config; + case VK_FORMAT_R5G6B5_UNORM_PACK16: + return kRGB_565_GrPixelConfig == config; + case VK_FORMAT_B4G4R4A4_UNORM_PACK16: + // R4G4B4A4 is not required to be supported so we actually + // store RGBA_4444 data as B4G4R4A4. + return kRGBA_4444_GrPixelConfig == config; + case VK_FORMAT_R8_UNORM: + return kAlpha_8_GrPixelConfig == config || + kAlpha_8_as_Red_GrPixelConfig == config || + kGray_8_GrPixelConfig == config || + kGray_8_as_Red_GrPixelConfig == config; + case VK_FORMAT_R32G32B32A32_SFLOAT: + return kRGBA_float_GrPixelConfig == config; + case VK_FORMAT_R32G32_SFLOAT: + return kRG_float_GrPixelConfig == config; + case VK_FORMAT_R16G16B16A16_SFLOAT: + return kRGBA_half_GrPixelConfig == config; + case VK_FORMAT_R16_SFLOAT: + return kAlpha_half_GrPixelConfig == config || + kAlpha_half_as_Red_GrPixelConfig == config; + default: + return false; + } +} + +bool GrVkFormatIsSupported(VkFormat format) { + switch (format) { + case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_B8G8R8A8_UNORM: + case VK_FORMAT_R8G8B8A8_SRGB: + case VK_FORMAT_B8G8R8A8_SRGB: + case VK_FORMAT_R8G8B8A8_SINT: + case VK_FORMAT_R5G6B5_UNORM_PACK16: + case VK_FORMAT_B4G4R4A4_UNORM_PACK16: + case VK_FORMAT_R8_UNORM: + case VK_FORMAT_R32G32B32A32_SFLOAT: + case VK_FORMAT_R32G32_SFLOAT: + case VK_FORMAT_R16G16B16A16_SFLOAT: + case VK_FORMAT_R16_SFLOAT: + return true; + default: + return false; + } +} + bool GrVkFormatIsSRGB(VkFormat format, VkFormat* linearFormat) { VkFormat linearFmt = format; switch (format) { diff --git a/src/gpu/vk/GrVkUtil.h b/src/gpu/vk/GrVkUtil.h index 72ed483d81..01688c8486 100644 --- a/src/gpu/vk/GrVkUtil.h +++ b/src/gpu/vk/GrVkUtil.h @@ -37,6 +37,13 @@ bool GrPixelConfigToVkFormat(GrPixelConfig config, VkFormat* format); */ GrPixelConfig GrVkFormatToPixelConfig(VkFormat format); +bool GrVkFormatIsSupported(VkFormat); + +/** + * Returns true if the passed in VkFormat and GrPixelConfig are compatible with each other. + */ +bool GrVkFormatPixelConfigPairIsValid(VkFormat, GrPixelConfig); + /** * Returns true if the given vulkan texture format is sRGB encoded. * Also provides the non-sRGB version, if there is one. diff --git a/tools/sk_app/VulkanWindowContext.cpp b/tools/sk_app/VulkanWindowContext.cpp index 35177494f7..711791df18 100644 --- a/tools/sk_app/VulkanWindowContext.cpp +++ b/tools/sk_app/VulkanWindowContext.cpp @@ -185,10 +185,10 @@ bool VulkanWindowContext::createSwapchain(int width, int height, auto srgbColorSpace = SkColorSpace::MakeSRGB(); bool wantSRGB = srgbColorSpace == params.fColorSpace; for (uint32_t i = 0; i < surfaceFormatCount; ++i) { - GrPixelConfig config = GrVkFormatToPixelConfig(surfaceFormats[i].format); - if (kUnknown_GrPixelConfig != config && - GrPixelConfigIsSRGB(config) == wantSRGB) { - surfaceFormat = surfaceFormats[i].format; + VkFormat localFormat = surfaceFormats[i].format; + if (GrVkFormatIsSupported(localFormat) && + GrVkFormatIsSRGB(localFormat, nullptr) == wantSRGB) { + surfaceFormat = localFormat; colorSpace = surfaceFormats[i].colorSpace; break; } |