Commit d9a88d63 by Hyunchang Kim Committed by Commit Bot

Vulkan: Support OES_texture_cube_map_array extension

Add support for GL_OES_texture_cube_map_array to the Vulkan backend if the underlying ICD supports creation of of cube array ImageViews Bug: angleproject:3584 Test: dEQP-GLES31.functional.fbo.color.texcubearray.* Change-Id: I636cbf347d718abfc1600119b312578370b8e02e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2437989 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent e53590f9
......@@ -155,6 +155,11 @@ struct FeaturesVk : FeatureSetBase
"VkDevice supports the EGL_ANDROID_native_fence_sync extension", &members,
"http://anglebug.com/2517"};
// Whether the VkDevice can support imageCubeArray feature properly.
Feature supportsImageCubeArray = {"supports_image_cube_array", FeatureCategory::VulkanFeatures,
"VkDevice supports the imageCubeArray feature properly",
&members, "http://anglebug.com/3584"};
// Whether the VkDevice supports the VK_EXT_shader_stencil_export extension, which is used to
// perform multisampled resolve of stencil buffer. A multi-step workaround is used instead if
// this extension is not available.
......
......@@ -64,6 +64,7 @@ bool IsArrayTarget(TextureTarget target)
{
case TextureTarget::_2DArray:
case TextureTarget::_2DMultisampleArray:
case TextureTarget::CubeMapArray:
return true;
default:
return false;
......
......@@ -1309,6 +1309,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
// Select additional features to be enabled.
VkPhysicalDeviceFeatures2KHR enabledFeatures = {};
enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
// Used to support cubemap array:
enabledFeatures.features.imageCubeArray = getFeatures().supportsImageCubeArray.enabled;
// Used to support framebuffers with multiple attachments:
enabledFeatures.features.independentBlend = mPhysicalDeviceFeatures.independentBlend;
// Used to support robust buffer access:
......@@ -1936,6 +1938,14 @@ void RendererVk::initFeatures(DisplayVk *displayVk, const ExtensionNameList &dev
ANGLE_FEATURE_CONDITION(&mFeatures, enableMultisampledRenderToTexture,
!(IsApple() && isSwiftShader) && !(IsWindows() && (isIntel || isAMD)));
// Feature disabled due to driver bugs:
//
// - Swiftshader: http://anglebug.com/5142
// - Qualcomm: http://anglebug.com/5143
ANGLE_FEATURE_CONDITION(
&mFeatures, supportsImageCubeArray,
mPhysicalDeviceFeatures.imageCubeArray == VK_TRUE && !isSwiftShader && !isQualcomm);
ANGLE_FEATURE_CONDITION(&mFeatures, preferredLargeHeapBlockSize4MB, !isQualcomm);
// Defer glFLush call causes manhattan 3.0 perf regression. Let Qualcomm driver opt out from
......
......@@ -186,6 +186,7 @@ void GetRenderTargetLayerCountAndIndex(vk::ImageHelper *image,
case gl::TextureType::_2DArray:
case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMapArray:
*layerIndex = index.hasLayer() ? index.getLayerIndex() : 0;
*layerCount = index.hasLayer() ? image->getLayerCount() : 1;
return;
......@@ -1454,25 +1455,8 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
ASSERT((offset & (kBufferOffsetMultiple - 1)) == 0);
gl::LevelIndex level = gl::LevelIndex(index.getLevelIndex());
GLuint layerCount = 0;
GLuint layerCount = index.getLayerCount();
GLuint layerIndex = 0;
GetRenderTargetLayerCountAndIndex(mImage, index, &layerCount, &layerIndex);
GLuint depth = sourceArea.depth;
if (index.getType() == gl::TextureType::_2DArray)
{
layerCount = depth;
depth = 1;
}
// Make sure the source is initialized and its images are flushed.
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer));
ANGLE_TRY(contextVk->onImageTransferWrite(level, 1, layerIndex, layerCount,
VK_IMAGE_ASPECT_COLOR_BIT, mImage));
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkBufferImageCopy region = {};
region.bufferOffset = offset;
......@@ -1480,15 +1464,31 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
region.bufferImageHeight = imageHeight;
region.imageExtent.width = sourceArea.width;
region.imageExtent.height = sourceArea.height;
region.imageExtent.depth = depth;
region.imageExtent.depth = sourceArea.depth;
region.imageOffset.x = sourceArea.x;
region.imageOffset.y = sourceArea.y;
region.imageOffset.z = sourceArea.z;
region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
region.imageSubresource.baseArrayLayer = layerIndex;
region.imageSubresource.layerCount = layerCount;
region.imageSubresource.mipLevel = mImage->toVkLevel(level).get();
if (gl::IsArrayTextureType(index.getType()))
{
layerIndex = sourceArea.z;
region.imageOffset.z = 0;
region.imageExtent.depth = 1;
}
region.imageSubresource.baseArrayLayer = layerIndex;
// Make sure the source is initialized and its images are flushed.
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
ANGLE_TRY(contextVk->onBufferTransferRead(srcBuffer));
ANGLE_TRY(contextVk->onImageTransferWrite(level, 1, layerIndex, layerCount,
VK_IMAGE_ASPECT_COLOR_BIT, mImage));
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer.copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(),
mImage->getCurrentLayout(), 1, &region);
......
......@@ -207,6 +207,10 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.textureFilteringCHROMIUM = getFeatures().supportsFilteringPrecision.enabled;
// Only expose texture cubemap array if the physical device supports it.
mNativeExtensions.textureCubeMapArrayOES = getFeatures().supportsImageCubeArray.enabled;
mNativeExtensions.textureCubeMapArrayEXT = mNativeExtensions.textureCubeMapArrayOES;
mNativeExtensions.shadowSamplersEXT = true;
// From the Vulkan specs:
......
......@@ -434,6 +434,7 @@ VkImageCreateFlags GetImageCreateFlags(gl::TextureType textureType)
switch (textureType)
{
case gl::TextureType::CubeMap:
case gl::TextureType::CubeMapArray:
return VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
case gl::TextureType::_3D:
......
......@@ -1210,6 +1210,7 @@ VkImageType GetImageType(gl::TextureType textureType)
case gl::TextureType::_2DMultisample:
case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMap:
case gl::TextureType::CubeMapArray:
case gl::TextureType::External:
return VK_IMAGE_TYPE_2D;
case gl::TextureType::_3D:
......@@ -1236,6 +1237,8 @@ VkImageViewType GetImageViewType(gl::TextureType textureType)
return VK_IMAGE_VIEW_TYPE_3D;
case gl::TextureType::CubeMap:
return VK_IMAGE_VIEW_TYPE_CUBE;
case gl::TextureType::CubeMapArray:
return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
default:
// We will need to implement all the texture types for ES3+.
UNIMPLEMENTED();
......@@ -1297,6 +1300,7 @@ void GetExtentsAndLayerCount(gl::TextureType textureType,
case gl::TextureType::_2DArray:
case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMapArray:
extentsOut->depth = 1;
*layerCountOut = extents.depth;
break;
......
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