Commit a391674c by Mohan Maiya Committed by Commit Bot

Vulkan: Support VK_KHR_image_format_list for RenderBuffers

RenderBuffers are now created with VK_KHR_image_format_list extension support enabled. We only enable those tests where the EGL image's source is a RenderBuffer but not those tests where the EGL image's target is a RenderBuffer. There are some corner cases related to glReadPixles that need to be resolved to unblock those tests. Bug: angleproject:3756 Bug: angleproject:5281 Test: ImageTest.SourceRenderbuffer*Vulkan Change-Id: I643a9d74d14473cc7df59fa6e25acab7d1c9aad1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2528475Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent 98035e11
...@@ -78,6 +78,29 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -78,6 +78,29 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
mImageViews.init(renderer); mImageViews.init(renderer);
} }
// With the introduction of sRGB related GLES extensions any texture could be respecified
// causing it to be interpreted in a different colorspace. Create the VkImage accordingly.
VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr;
VkFormat vkImageFormat = vkFormat.vkImageFormat;
VkFormat vkImageListFormat = vkFormat.actualImageFormat().isSRGB
? vk::ConvertToLinear(vkImageFormat)
: vk::ConvertToSRGB(vkImageFormat);
VkImageFormatListCreateInfoKHR formatListInfo = {};
if (renderer->getFeatures().supportsImageFormatList.enabled)
{
// Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag
imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
// There is just 1 additional format we might use to create a VkImageView for this VkImage
formatListInfo.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
formatListInfo.pNext = nullptr;
formatListInfo.viewFormatCount = 1;
formatListInfo.pViewFormats = &vkImageListFormat;
additionalCreateInfo = &formatListInfo;
}
const angle::Format &textureFormat = vkFormat.actualImageFormat(); const angle::Format &textureFormat = vkFormat.actualImageFormat();
const bool isDepthStencilFormat = textureFormat.hasDepthOrStencilBits(); const bool isDepthStencilFormat = textureFormat.hasDepthOrStencilBits();
ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat); ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat);
...@@ -101,8 +124,10 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -101,8 +124,10 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
bool robustInit = contextVk->isRobustResourceInitEnabled(); bool robustInit = contextVk->isRobustResourceInitEnabled();
VkExtent3D extents = {static_cast<uint32_t>(width), static_cast<uint32_t>(height), 1u}; VkExtent3D extents = {static_cast<uint32_t>(width), static_cast<uint32_t>(height), 1u};
ANGLE_TRY(mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, imageSamples, usage, ANGLE_TRY(mImage->initExternal(contextVk, gl::TextureType::_2D, extents, vkFormat, imageSamples,
gl::LevelIndex(0), gl::LevelIndex(0), 1, 1, robustInit)); usage, imageCreateFlags, vk::ImageLayout::Undefined,
additionalCreateInfo, gl::LevelIndex(0), gl::LevelIndex(0), 1, 1,
robustInit));
VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags)); ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
......
...@@ -2707,8 +2707,6 @@ TEST_P(ImageTest, SourceRenderbufferTargetTexture) ...@@ -2707,8 +2707,6 @@ TEST_P(ImageTest, SourceRenderbufferTargetTexture)
TEST_P(ImageTest, SourceRenderbufferTargetTexture_Colorspace) TEST_P(ImageTest, SourceRenderbufferTargetTexture_Colorspace)
{ {
ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt()); ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
// Need to add support for VK_KHR_image_format_list to Renderbuffer: http://anglebug.com/5281
ANGLE_SKIP_TEST_IF(IsVulkan());
SourceRenderbufferTargetTexture_helper(kColorspaceAttribs); SourceRenderbufferTargetTexture_helper(kColorspaceAttribs);
} }
...@@ -2752,8 +2750,6 @@ TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal) ...@@ -2752,8 +2750,6 @@ TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal)
TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal_Colorspace) TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal_Colorspace)
{ {
ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt()); ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
// Need to add support for VK_KHR_image_format_list to Renderbuffer: http://anglebug.com/5281
ANGLE_SKIP_TEST_IF(IsVulkan());
SourceRenderbufferTargetTextureExternal_helper(kColorspaceAttribs); SourceRenderbufferTargetTextureExternal_helper(kColorspaceAttribs);
} }
...@@ -2800,8 +2796,6 @@ TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3) ...@@ -2800,8 +2796,6 @@ TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3)
TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3_Colorspace) TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3_Colorspace)
{ {
ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt()); ANGLE_SKIP_TEST_IF(!hasImageGLColorspaceExt());
// Need to add support for VK_KHR_image_format_list to Renderbuffer: http://anglebug.com/5281
ANGLE_SKIP_TEST_IF(IsVulkan());
SourceRenderbufferTargetTextureExternalESSL3_helper(kColorspaceAttribs); SourceRenderbufferTargetTextureExternalESSL3_helper(kColorspaceAttribs);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment