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 ...@@ -155,6 +155,11 @@ struct FeaturesVk : FeatureSetBase
"VkDevice supports the EGL_ANDROID_native_fence_sync extension", &members, "VkDevice supports the EGL_ANDROID_native_fence_sync extension", &members,
"http://anglebug.com/2517"}; "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 // 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 // perform multisampled resolve of stencil buffer. A multi-step workaround is used instead if
// this extension is not available. // this extension is not available.
......
...@@ -64,6 +64,7 @@ bool IsArrayTarget(TextureTarget target) ...@@ -64,6 +64,7 @@ bool IsArrayTarget(TextureTarget target)
{ {
case TextureTarget::_2DArray: case TextureTarget::_2DArray:
case TextureTarget::_2DMultisampleArray: case TextureTarget::_2DMultisampleArray:
case TextureTarget::CubeMapArray:
return true; return true;
default: default:
return false; return false;
......
...@@ -1309,6 +1309,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -1309,6 +1309,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
// Select additional features to be enabled. // Select additional features to be enabled.
VkPhysicalDeviceFeatures2KHR enabledFeatures = {}; VkPhysicalDeviceFeatures2KHR enabledFeatures = {};
enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; 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: // Used to support framebuffers with multiple attachments:
enabledFeatures.features.independentBlend = mPhysicalDeviceFeatures.independentBlend; enabledFeatures.features.independentBlend = mPhysicalDeviceFeatures.independentBlend;
// Used to support robust buffer access: // Used to support robust buffer access:
...@@ -1936,6 +1938,14 @@ void RendererVk::initFeatures(DisplayVk *displayVk, const ExtensionNameList &dev ...@@ -1936,6 +1938,14 @@ void RendererVk::initFeatures(DisplayVk *displayVk, const ExtensionNameList &dev
ANGLE_FEATURE_CONDITION(&mFeatures, enableMultisampledRenderToTexture, ANGLE_FEATURE_CONDITION(&mFeatures, enableMultisampledRenderToTexture,
!(IsApple() && isSwiftShader) && !(IsWindows() && (isIntel || isAMD))); !(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); ANGLE_FEATURE_CONDITION(&mFeatures, preferredLargeHeapBlockSize4MB, !isQualcomm);
// Defer glFLush call causes manhattan 3.0 perf regression. Let Qualcomm driver opt out from // Defer glFLush call causes manhattan 3.0 perf regression. Let Qualcomm driver opt out from
......
...@@ -186,6 +186,7 @@ void GetRenderTargetLayerCountAndIndex(vk::ImageHelper *image, ...@@ -186,6 +186,7 @@ void GetRenderTargetLayerCountAndIndex(vk::ImageHelper *image,
case gl::TextureType::_2DArray: case gl::TextureType::_2DArray:
case gl::TextureType::_2DMultisampleArray: case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMapArray:
*layerIndex = index.hasLayer() ? index.getLayerIndex() : 0; *layerIndex = index.hasLayer() ? index.getLayerIndex() : 0;
*layerCount = index.hasLayer() ? image->getLayerCount() : 1; *layerCount = index.hasLayer() ? image->getLayerCount() : 1;
return; return;
...@@ -1454,16 +1455,30 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, ...@@ -1454,16 +1455,30 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
ASSERT((offset & (kBufferOffsetMultiple - 1)) == 0); ASSERT((offset & (kBufferOffsetMultiple - 1)) == 0);
gl::LevelIndex level = gl::LevelIndex(index.getLevelIndex()); gl::LevelIndex level = gl::LevelIndex(index.getLevelIndex());
GLuint layerCount = 0; GLuint layerCount = index.getLayerCount();
GLuint layerIndex = 0; GLuint layerIndex = 0;
GetRenderTargetLayerCountAndIndex(mImage, index, &layerCount, &layerIndex);
GLuint depth = sourceArea.depth; VkBufferImageCopy region = {};
if (index.getType() == gl::TextureType::_2DArray) region.bufferOffset = offset;
{ region.bufferRowLength = rowLength;
layerCount = depth; region.bufferImageHeight = imageHeight;
depth = 1; region.imageExtent.width = sourceArea.width;
region.imageExtent.height = sourceArea.height;
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.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. // Make sure the source is initialized and its images are flushed.
ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
...@@ -1474,21 +1489,6 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, ...@@ -1474,21 +1489,6 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk,
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer(); vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
VkBufferImageCopy region = {};
region.bufferOffset = offset;
region.bufferRowLength = rowLength;
region.bufferImageHeight = imageHeight;
region.imageExtent.width = sourceArea.width;
region.imageExtent.height = sourceArea.height;
region.imageExtent.depth = 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();
commandBuffer.copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(), commandBuffer.copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(),
mImage->getCurrentLayout(), 1, &region); mImage->getCurrentLayout(), 1, &region);
......
...@@ -207,6 +207,10 @@ void RendererVk::ensureCapsInitialized() const ...@@ -207,6 +207,10 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.textureFilteringCHROMIUM = getFeatures().supportsFilteringPrecision.enabled; 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; mNativeExtensions.shadowSamplersEXT = true;
// From the Vulkan specs: // From the Vulkan specs:
......
...@@ -434,6 +434,7 @@ VkImageCreateFlags GetImageCreateFlags(gl::TextureType textureType) ...@@ -434,6 +434,7 @@ VkImageCreateFlags GetImageCreateFlags(gl::TextureType textureType)
switch (textureType) switch (textureType)
{ {
case gl::TextureType::CubeMap: case gl::TextureType::CubeMap:
case gl::TextureType::CubeMapArray:
return VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; return VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
case gl::TextureType::_3D: case gl::TextureType::_3D:
......
...@@ -1210,6 +1210,7 @@ VkImageType GetImageType(gl::TextureType textureType) ...@@ -1210,6 +1210,7 @@ VkImageType GetImageType(gl::TextureType textureType)
case gl::TextureType::_2DMultisample: case gl::TextureType::_2DMultisample:
case gl::TextureType::_2DMultisampleArray: case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMap: case gl::TextureType::CubeMap:
case gl::TextureType::CubeMapArray:
case gl::TextureType::External: case gl::TextureType::External:
return VK_IMAGE_TYPE_2D; return VK_IMAGE_TYPE_2D;
case gl::TextureType::_3D: case gl::TextureType::_3D:
...@@ -1236,6 +1237,8 @@ VkImageViewType GetImageViewType(gl::TextureType textureType) ...@@ -1236,6 +1237,8 @@ VkImageViewType GetImageViewType(gl::TextureType textureType)
return VK_IMAGE_VIEW_TYPE_3D; return VK_IMAGE_VIEW_TYPE_3D;
case gl::TextureType::CubeMap: case gl::TextureType::CubeMap:
return VK_IMAGE_VIEW_TYPE_CUBE; return VK_IMAGE_VIEW_TYPE_CUBE;
case gl::TextureType::CubeMapArray:
return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
default: default:
// We will need to implement all the texture types for ES3+. // We will need to implement all the texture types for ES3+.
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -1297,6 +1300,7 @@ void GetExtentsAndLayerCount(gl::TextureType textureType, ...@@ -1297,6 +1300,7 @@ void GetExtentsAndLayerCount(gl::TextureType textureType,
case gl::TextureType::_2DArray: case gl::TextureType::_2DArray:
case gl::TextureType::_2DMultisampleArray: case gl::TextureType::_2DMultisampleArray:
case gl::TextureType::CubeMapArray:
extentsOut->depth = 1; extentsOut->depth = 1;
*layerCountOut = extents.depth; *layerCountOut = extents.depth;
break; 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