Commit 2b69462e by Mohan Maiya Committed by Commit Bot

Vulkan: Consolidate image format list initialization code

HardwareBufferImageSiblingVkAndroid, RenderbufferVk, SurfaceVk and TextureVk all had similar code to initialize VkImage with VK_KHR_image_format_list extension support. Consolidate all of them into a helper. Bug: angleproject:5520 Change-Id: Ib7ac582a35a26c0da15879e688bcaf0c2a92ea87 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2692641Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent d7037aa2
...@@ -78,28 +78,15 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -78,28 +78,15 @@ 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; VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr;
angle::FormatID imageFormat = format.actualImageFormatID; VkImageFormatListCreateInfoKHR formatListInfo = {};
angle::FormatID imageListFormat = format.actualImageFormat().isSRGB VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
? ConvertToLinear(imageFormat) VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
: ConvertToSRGB(imageFormat);
VkFormat vkFormat = vk::GetVkFormatFromFormatID(imageListFormat); if (FillImageFormatListInfo(renderer, format, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
VkImageFormatListCreateInfoKHR formatListInfo = {};
if (renderer->getFeatures().supportsImageFormatList.enabled)
{ {
// Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag additionalCreateInfo = &formatListInfo;
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 = &vkFormat;
additionalCreateInfo = &formatListInfo;
} }
const angle::Format &textureFormat = format.actualImageFormat(); const angle::Format &textureFormat = format.actualImageFormat();
......
...@@ -132,28 +132,15 @@ angle::Result InitImageHelper(DisplayVk *displayVk, ...@@ -132,28 +132,15 @@ angle::Result InitImageHelper(DisplayVk *displayVk,
VkExtent3D extents = {std::max(static_cast<uint32_t>(width), 1u), VkExtent3D extents = {std::max(static_cast<uint32_t>(width), 1u),
std::max(static_cast<uint32_t>(height), 1u), 1u}; std::max(static_cast<uint32_t>(height), 1u), 1u};
// 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; VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr;
angle::FormatID imageFormat = vkFormat.actualImageFormatID; VkImageFormatListCreateInfoKHR formatListInfo = {};
angle::FormatID imageListFormat = vkFormat.actualImageFormat().isSRGB VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
? ConvertToLinear(imageFormat) VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
: ConvertToSRGB(imageFormat);
VkFormat imageListVkFormat = vk::GetVkFormatFromFormatID(imageListFormat); if (FillImageFormatListInfo(renderer, vkFormat, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
VkImageFormatListCreateInfoKHR formatListInfo = {}; {
if (renderer->getFeatures().supportsImageFormatList.enabled) additionalCreateInfo = &formatListInfo;
{
// 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 = &imageListVkFormat;
additionalCreateInfo = &formatListInfo;
} }
ANGLE_TRY(imageHelper->initExternal(displayVk, gl::TextureType::_2D, extents, vkFormat, samples, ANGLE_TRY(imageHelper->initExternal(displayVk, gl::TextureType::_2D, extents, vkFormat, samples,
......
...@@ -2666,30 +2666,15 @@ angle::Result TextureVk::initImage(ContextVk *contextVk, ...@@ -2666,30 +2666,15 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
gl_vk::GetExtentsAndLayerCount(mState.getType(), extents, &vkExtent, &layerCount); gl_vk::GetExtentsAndLayerCount(mState.getType(), extents, &vkExtent, &layerCount);
GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1; GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1;
// 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.
VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr; VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr;
angle::FormatID imageFormat = format.actualImageFormatID; VkImageFormatListCreateInfoKHR formatListInfo = {};
angle::FormatID imageListFormat = format.actualImageFormat().isSRGB VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
? ConvertToLinear(imageFormat)
: ConvertToSRGB(imageFormat);
VkFormat vkFormat = vk::GetVkFormatFromFormatID(imageListFormat);
VkImageFormatListCreateInfoKHR formatListInfo = {}; if (FillImageFormatListInfo(renderer, format, &imageListVkFormat, &mImageCreateFlags,
if (renderer->getFeatures().supportsImageFormatList.enabled && &formatListInfo))
renderer->haveSameFormatFeatureBits(format.actualImageFormatID, imageListFormat))
{ {
mRequiresMutableStorage = true; mRequiresMutableStorage = true;
additionalCreateInfo = &formatListInfo;
// Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag
mImageCreateFlags |= 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 = &vkFormat;
additionalCreateInfo = &formatListInfo;
} }
ANGLE_TRY(mImage->initExternal(contextVk, mState.getType(), vkExtent, format, samples, ANGLE_TRY(mImage->initExternal(contextVk, mState.getType(), vkExtent, format, samples,
......
...@@ -204,26 +204,14 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk ...@@ -204,26 +204,14 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
imageTilingMode = VK_IMAGE_TILING_OPTIMAL; imageTilingMode = VK_IMAGE_TILING_OPTIMAL;
} }
// 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;
angle::FormatID imageFormatID = vkFormat.actualImageFormatID;
angle::FormatID imageListFormatID = vkFormat.actualImageFormat().isSRGB
? ConvertToLinear(imageFormatID)
: ConvertToSRGB(imageFormatID);
VkFormat imageListVkFormat = vk::GetVkFormatFromFormatID(imageListFormatID);
VkImageFormatListCreateInfoKHR formatListInfo = {}; VkImageFormatListCreateInfoKHR formatListInfo = {};
if (renderer->getFeatures().supportsImageFormatList.enabled) VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
if (FillImageFormatListInfo(renderer, vkFormat, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
{ {
// Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag externalFormat.pNext = &formatListInfo;
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.viewFormatCount = 1;
formatListInfo.pViewFormats = &imageListVkFormat;
externalFormat.pNext = &formatListInfo;
} }
VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {}; VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
......
...@@ -755,6 +755,39 @@ bool CanCopyWithTransfer(RendererVk *renderer, ...@@ -755,6 +755,39 @@ bool CanCopyWithTransfer(RendererVk *renderer,
return isTilingCompatible && srcFormatHasNecessaryFeature && dstFormatHasNecessaryFeature; return isTilingCompatible && srcFormatHasNecessaryFeature && dstFormatHasNecessaryFeature;
} }
bool FillImageFormatListInfo(RendererVk *rendererVk,
const vk::Format &format,
VkFormat *imageListVkFormat,
VkImageCreateFlags *imageCreateFlags,
VkImageFormatListCreateInfoKHR *imageFormatListCreateInfo)
{
// With the introduction of sRGB related GLES extensions any sample/render target could be
// respecified causing it to be interpreted in a different colorspace. Create the VkImage
// accordingly.
angle::FormatID imageFormat = format.actualImageFormatID;
angle::FormatID imageListFormat = format.actualImageFormat().isSRGB
? ConvertToLinear(imageFormat)
: ConvertToSRGB(imageFormat);
*imageListVkFormat = vk::GetVkFormatFromFormatID(imageListFormat);
if (rendererVk->getFeatures().supportsImageFormatList.enabled &&
rendererVk->haveSameFormatFeatureBits(imageFormat, imageListFormat))
{
// 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
imageFormatListCreateInfo->sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
imageFormatListCreateInfo->pNext = nullptr;
imageFormatListCreateInfo->viewFormatCount = 1;
imageFormatListCreateInfo->pViewFormats = imageListVkFormat;
return true;
}
return false;
}
// PackedClearValuesArray implementation // PackedClearValuesArray implementation
PackedClearValuesArray::PackedClearValuesArray() : mValues{} {} PackedClearValuesArray::PackedClearValuesArray() : mValues{} {}
PackedClearValuesArray::~PackedClearValuesArray() = default; PackedClearValuesArray::~PackedClearValuesArray() = default;
......
...@@ -1313,6 +1313,12 @@ bool CanCopyWithTransfer(RendererVk *renderer, ...@@ -1313,6 +1313,12 @@ bool CanCopyWithTransfer(RendererVk *renderer,
const Format &destFormat, const Format &destFormat,
VkImageTiling destTilingMode); VkImageTiling destTilingMode);
bool FillImageFormatListInfo(RendererVk *rendererVk,
const vk::Format &format,
VkFormat *imageListVkFormat,
VkImageCreateFlags *imageCreateFlags,
VkImageFormatListCreateInfoKHR *imageFormatListCreateInfo);
class ImageHelper final : public Resource, public angle::Subject class ImageHelper final : public Resource, public angle::Subject
{ {
public: public:
......
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