Commit 4afd0f27 by Mohan Maiya Committed by Commit Bot

Vulkan: Add VK_KHR_image_format_list support to initExternal

The code for initializing a VkImage with VK_KHR_image_format_list extension support is now internal to initExternal. Also provides a flag to inform callers when VK_KHR_image_format_list support is enabled. Bug: angleproject:5520 Change-Id: Ie2ade93d1403ab3f9cbcf7d80684bbca201d5d8d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2702159Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent b50c0b01
...@@ -208,7 +208,7 @@ angle::Result MemoryObjectVk::createImage(ContextVk *contextVk, ...@@ -208,7 +208,7 @@ angle::Result MemoryObjectVk::createImage(ContextVk *contextVk,
contextVk, type, vkExtents, vkFormat, 1, imageUsageFlags, createFlags, contextVk, type, vkExtents, vkFormat, 1, imageUsageFlags, createFlags,
vk::ImageLayout::Undefined, &externalMemoryImageCreateInfo, gl::LevelIndex(0), vk::ImageLayout::Undefined, &externalMemoryImageCreateInfo, gl::LevelIndex(0),
gl::LevelIndex(static_cast<uint32_t>(levels) - 1), static_cast<uint32_t>(levels), gl::LevelIndex(static_cast<uint32_t>(levels) - 1), static_cast<uint32_t>(levels),
layerCount, contextVk->isRobustResourceInitEnabled())); layerCount, contextVk->isRobustResourceInitEnabled(), nullptr));
VkMemoryRequirements externalMemoryRequirements; VkMemoryRequirements externalMemoryRequirements;
image->getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements); image->getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements);
......
...@@ -78,17 +78,6 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -78,17 +78,6 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
mImageViews.init(renderer); mImageViews.init(renderer);
} }
VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr;
VkImageFormatListCreateInfoKHR formatListInfo = {};
VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
if (FillImageFormatListInfo(renderer, format, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
{
additionalCreateInfo = &formatListInfo;
}
const angle::Format &textureFormat = format.actualImageFormat(); const angle::Format &textureFormat = format.actualImageFormat();
const bool isDepthStencilFormat = textureFormat.hasDepthOrStencilBits(); const bool isDepthStencilFormat = textureFormat.hasDepthOrStencilBits();
ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat); ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat);
...@@ -113,9 +102,9 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -113,9 +102,9 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
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->initExternal(contextVk, gl::TextureType::_2D, extents, format, imageSamples, ANGLE_TRY(mImage->initExternal(contextVk, gl::TextureType::_2D, extents, format, imageSamples,
usage, imageCreateFlags, vk::ImageLayout::Undefined, usage, vk::kVkImageCreateFlagsNone, vk::ImageLayout::Undefined,
additionalCreateInfo, gl::LevelIndex(0), gl::LevelIndex(0), 1, 1, nullptr, gl::LevelIndex(0), gl::LevelIndex(0), 1, 1, robustInit,
robustInit)); nullptr));
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));
......
...@@ -123,7 +123,6 @@ angle::Result InitImageHelper(DisplayVk *displayVk, ...@@ -123,7 +123,6 @@ angle::Result InitImageHelper(DisplayVk *displayVk,
bool isRobustResourceInitEnabled, bool isRobustResourceInitEnabled,
vk::ImageHelper *imageHelper) vk::ImageHelper *imageHelper)
{ {
RendererVk *renderer = displayVk->getRenderer();
const angle::Format &textureFormat = vkFormat.actualImageFormat(); const angle::Format &textureFormat = vkFormat.actualImageFormat();
bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0; bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVkDepthStencilImageUsageFlags const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVkDepthStencilImageUsageFlags
...@@ -132,21 +131,10 @@ angle::Result InitImageHelper(DisplayVk *displayVk, ...@@ -132,21 +131,10 @@ 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};
VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr; ANGLE_TRY(imageHelper->initExternal(
VkImageFormatListCreateInfoKHR formatListInfo = {}; displayVk, gl::TextureType::_2D, extents, vkFormat, samples, usage,
VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED; vk::kVkImageCreateFlagsNone, vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(0),
VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone; gl::LevelIndex(0), 1, 1, isRobustResourceInitEnabled, nullptr));
if (FillImageFormatListInfo(renderer, vkFormat, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
{
additionalCreateInfo = &formatListInfo;
}
ANGLE_TRY(imageHelper->initExternal(displayVk, gl::TextureType::_2D, extents, vkFormat, samples,
usage, imageCreateFlags, vk::ImageLayout::Undefined,
additionalCreateInfo, gl::LevelIndex(0), gl::LevelIndex(0),
1, 1, isRobustResourceInitEnabled));
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -2666,24 +2666,19 @@ angle::Result TextureVk::initImage(ContextVk *contextVk, ...@@ -2666,24 +2666,19 @@ 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;
VkImageFormatListCreateInfoKHR *additionalCreateInfo = nullptr; bool imageFormatListEnabled = false;
VkImageFormatListCreateInfoKHR formatListInfo = {}; ANGLE_TRY(mImage->initExternal(
VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED; contextVk, mState.getType(), vkExtent, format, samples, mImageUsageFlags, mImageCreateFlags,
vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(mState.getEffectiveBaseLevel()),
gl::LevelIndex(mState.getEffectiveMaxLevel()), levelCount, layerCount,
contextVk->isRobustResourceInitEnabled(), &imageFormatListEnabled));
if (FillImageFormatListInfo(renderer, format, &imageListVkFormat, &mImageCreateFlags, if (imageFormatListEnabled)
&formatListInfo))
{ {
mImageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
mRequiresMutableStorage = true; mRequiresMutableStorage = true;
additionalCreateInfo = &formatListInfo;
} }
ANGLE_TRY(mImage->initExternal(contextVk, mState.getType(), vkExtent, format, samples,
mImageUsageFlags, mImageCreateFlags, vk::ImageLayout::Undefined,
additionalCreateInfo,
gl::LevelIndex(mState.getEffectiveBaseLevel()),
gl::LevelIndex(mState.getEffectiveMaxLevel()), levelCount,
layerCount, contextVk->isRobustResourceInitEnabled()));
const VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; const VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags)); ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
......
...@@ -204,18 +204,7 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk ...@@ -204,18 +204,7 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
imageTilingMode = VK_IMAGE_TILING_OPTIMAL; imageTilingMode = VK_IMAGE_TILING_OPTIMAL;
} }
VkImageFormatListCreateInfoKHR formatListInfo = {};
VkFormat imageListVkFormat = VK_FORMAT_UNDEFINED;
VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
if (FillImageFormatListInfo(renderer, vkFormat, &imageListVkFormat, &imageCreateFlags,
&formatListInfo))
{
externalFormat.pNext = &formatListInfo;
}
VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {}; VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
externalMemoryImageCreateInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO; externalMemoryImageCreateInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
externalMemoryImageCreateInfo.pNext = &externalFormat; externalMemoryImageCreateInfo.pNext = &externalFormat;
externalMemoryImageCreateInfo.handleTypes = externalMemoryImageCreateInfo.handleTypes =
...@@ -233,9 +222,9 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk ...@@ -233,9 +222,9 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
ANGLE_TRY(mImage->initExternal( ANGLE_TRY(mImage->initExternal(
displayVk, gl::TextureType::_2D, vkExtents, displayVk, gl::TextureType::_2D, vkExtents,
bufferFormatProperties.format == VK_FORMAT_UNDEFINED ? externalVkFormat : vkFormat, 1, bufferFormatProperties.format == VK_FORMAT_UNDEFINED ? externalVkFormat : vkFormat, 1,
usage, imageCreateFlags, vk::ImageLayout::ExternalPreInitialized, usage, vk::kVkImageCreateFlagsNone, vk::ImageLayout::ExternalPreInitialized,
&externalMemoryImageCreateInfo, gl::LevelIndex(0), gl::LevelIndex(0), 1, 1, &externalMemoryImageCreateInfo, gl::LevelIndex(0), gl::LevelIndex(0), 1, 1,
robustInitEnabled)); robustInitEnabled, nullptr));
VkImportAndroidHardwareBufferInfoANDROID importHardwareBufferInfo = {}; VkImportAndroidHardwareBufferInfoANDROID importHardwareBufferInfo = {};
importHardwareBufferInfo.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID; importHardwareBufferInfo.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
......
...@@ -755,39 +755,6 @@ bool CanCopyWithTransfer(RendererVk *renderer, ...@@ -755,39 +755,6 @@ 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;
...@@ -3640,7 +3607,7 @@ angle::Result ImageHelper::init(Context *context, ...@@ -3640,7 +3607,7 @@ angle::Result ImageHelper::init(Context *context,
{ {
return initExternal(context, textureType, extents, format, samples, usage, return initExternal(context, textureType, extents, format, samples, usage,
kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, baseLevel, kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, baseLevel,
maxLevel, mipLevels, layerCount, isRobustResourceInitEnabled); maxLevel, mipLevels, layerCount, isRobustResourceInitEnabled, nullptr);
} }
angle::Result ImageHelper::initMSAASwapchain(Context *context, angle::Result ImageHelper::initMSAASwapchain(Context *context,
...@@ -3658,7 +3625,7 @@ angle::Result ImageHelper::initMSAASwapchain(Context *context, ...@@ -3658,7 +3625,7 @@ angle::Result ImageHelper::initMSAASwapchain(Context *context,
{ {
ANGLE_TRY(initExternal(context, textureType, extents, format, samples, usage, ANGLE_TRY(initExternal(context, textureType, extents, format, samples, usage,
kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, baseLevel, kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, baseLevel,
maxLevel, mipLevels, layerCount, isRobustResourceInitEnabled)); maxLevel, mipLevels, layerCount, isRobustResourceInitEnabled, nullptr));
if (rotatedAspectRatio) if (rotatedAspectRatio)
{ {
std::swap(mExtents.width, mExtents.height); std::swap(mExtents.width, mExtents.height);
...@@ -3680,7 +3647,8 @@ angle::Result ImageHelper::initExternal(Context *context, ...@@ -3680,7 +3647,8 @@ angle::Result ImageHelper::initExternal(Context *context,
gl::LevelIndex maxLevel, gl::LevelIndex maxLevel,
uint32_t mipLevels, uint32_t mipLevels,
uint32_t layerCount, uint32_t layerCount,
bool isRobustResourceInitEnabled) bool isRobustResourceInitEnabled,
bool *imageFormatListEnabledOut)
{ {
ASSERT(!valid()); ASSERT(!valid());
ASSERT(!IsAnySubresourceContentDefined(mContentDefined)); ASSERT(!IsAnySubresourceContentDefined(mContentDefined));
...@@ -3705,14 +3673,46 @@ angle::Result ImageHelper::initExternal(Context *context, ...@@ -3705,14 +3673,46 @@ angle::Result ImageHelper::initExternal(Context *context,
ASSERT(textureType != gl::TextureType::Rectangle || mLayerCount == 1); ASSERT(textureType != gl::TextureType::Rectangle || mLayerCount == 1);
ASSERT(textureType != gl::TextureType::CubeMap || mLayerCount == gl::kCubeFaceCount); ASSERT(textureType != gl::TextureType::CubeMap || mLayerCount == gl::kCubeFaceCount);
VkImageCreateInfo imageInfo = {}; // With the introduction of sRGB related GLES extensions any sample/render target could be
imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; // respecified causing it to be interpreted in a different colorspace. Create the VkImage
imageInfo.pNext = externalImageCreateInfo; // accordingly.
imageInfo.flags = GetImageCreateFlags(textureType) | additionalCreateFlags; bool imageFormatListEnabled = false;
imageInfo.imageType = mImageType; RendererVk *rendererVk = context->getRenderer();
imageInfo.format = format.actualImageVkFormat(); VkImageFormatListCreateInfoKHR imageFormatListInfo = {};
imageInfo.extent = mExtents; angle::FormatID imageFormat = format.actualImageFormatID;
imageInfo.mipLevels = mipLevels; angle::FormatID imageListFormat = format.actualImageFormat().isSRGB
? ConvertToLinear(imageFormat)
: ConvertToSRGB(imageFormat);
VkFormat imageListVkFormat = vk::GetVkFormatFromFormatID(imageListFormat);
if (rendererVk->getFeatures().supportsImageFormatList.enabled &&
rendererVk->haveSameFormatFeatureBits(imageFormat, imageListFormat))
{
imageFormatListEnabled = true;
// Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag
additionalCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
// There is just 1 additional format we might use to create a VkImageView for this VkImage
imageFormatListInfo.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
imageFormatListInfo.pNext = externalImageCreateInfo;
imageFormatListInfo.viewFormatCount = 1;
imageFormatListInfo.pViewFormats = &imageListVkFormat;
}
if (imageFormatListEnabledOut)
{
*imageFormatListEnabledOut = imageFormatListEnabled;
}
VkImageCreateInfo imageInfo = {};
imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
imageInfo.pNext = (imageFormatListEnabled) ? &imageFormatListInfo : externalImageCreateInfo;
imageInfo.flags = GetImageCreateFlags(textureType) | additionalCreateFlags;
imageInfo.imageType = mImageType;
imageInfo.format = format.actualImageVkFormat();
imageInfo.extent = mExtents;
imageInfo.mipLevels = mipLevels;
imageInfo.arrayLayers = mLayerCount; imageInfo.arrayLayers = mLayerCount;
imageInfo.samples = gl_vk::GetSamples(mSamples); imageInfo.samples = gl_vk::GetSamples(mSamples);
imageInfo.tiling = mTilingMode; imageInfo.tiling = mTilingMode;
...@@ -4191,7 +4191,7 @@ angle::Result ImageHelper::initImplicitMultisampledRenderToTexture( ...@@ -4191,7 +4191,7 @@ angle::Result ImageHelper::initImplicitMultisampledRenderToTexture(
context, textureType, resolveImage.getExtents(), resolveImage.getFormat(), samples, context, textureType, resolveImage.getExtents(), resolveImage.getFormat(), samples,
kMultisampledUsageFlags, kMultisampledCreateFlags, ImageLayout::Undefined, nullptr, kMultisampledUsageFlags, kMultisampledCreateFlags, ImageLayout::Undefined, nullptr,
resolveImage.getBaseLevel(), resolveImage.getMaxLevel(), resolveImage.getLevelCount(), resolveImage.getBaseLevel(), resolveImage.getMaxLevel(), resolveImage.getLevelCount(),
resolveImage.getLayerCount(), isRobustResourceInitEnabled)); resolveImage.getLayerCount(), isRobustResourceInitEnabled, nullptr));
const VkMemoryPropertyFlags kMultisampledMemoryFlags = const VkMemoryPropertyFlags kMultisampledMemoryFlags =
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
......
...@@ -1315,12 +1315,6 @@ bool CanCopyWithTransfer(RendererVk *renderer, ...@@ -1315,12 +1315,6 @@ 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:
...@@ -1369,7 +1363,8 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1369,7 +1363,8 @@ class ImageHelper final : public Resource, public angle::Subject
gl::LevelIndex maxLevel, gl::LevelIndex maxLevel,
uint32_t mipLevels, uint32_t mipLevels,
uint32_t layerCount, uint32_t layerCount,
bool isRobustResourceInitEnabled); bool isRobustResourceInitEnabled,
bool *imageFormatListEnabledOut);
angle::Result initMemory(Context *context, angle::Result initMemory(Context *context,
const MemoryProperties &memoryProperties, const MemoryProperties &memoryProperties,
VkMemoryPropertyFlags flags); VkMemoryPropertyFlags flags);
......
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