Commit e7ae237e by Shahbaz Youssefi Committed by Commit Bot

Vulkan: ANGLE_copy_texture_3d support

Bug: angleproject:4748 Test: CopyTexImage*Vulkan:Texture3DCopy*Vulkan:Texture2DArrayCopy*Vulkan Test: dEQP.KHR_GLES3/copy_tex_image_conversions_required_cubemap*cubemap* Change-Id: Ifdc3d455ca8c9e732d0adf4afa9e2809d780ae18 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2246320 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent c81f0b7b
......@@ -166,39 +166,57 @@
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc":
"9f8b96b844a7116c3e45640e7acc21a4",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc":
"238308e0fc29966d6222d8de6fce9f0b",
"3baacaf94b801b7113001036db5d52c6",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc":
"8c13eeced676451ef8a3e3ad2a9ab442",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc":
"2201380521a799c7bbce4d6fd080fa57",
"90703088084deded06d8614aab19f100",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc":
"6804b2a2dd9687c1a7767bd272ff6713",
"e018191c11f9df4679ded97771e096f5",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc":
"76a6663eb28ebd12f94a1ba0c85fa685",
"6e1f899780711b5728abd2696b786cd2",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000006.inc":
"d198c9cf0613b3b096a1e494a4513516",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc":
"812de8d46a7f148dc0a3e79866dfc014",
"186e561860cebb0a3e0fe466aaa32258",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc":
"e0fc7b89e5a02334c6bb5797a3a0cb0e",
"b5e6c6c5eb7fb81c8da602e14e5d75cb",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc":
"8e24ff2f5567724ad1b44133f7e176f9",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc":
"7eae9f9510a5b718a9dc27d25525b472",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc":
"2f17e13dcae16e671ef3b1999092f87c",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc":
"de095928dff56229991d99178662c5ac",
"6dc8679fea6b2253811d9498a0c225bb",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc":
"1c7457d47e0cc9b138878e2b6ea5d66a",
"265b9f424ff343a9122da8f8eafe65ff",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc":
"0a5f833e77f9359361cf88b070f2c3c3",
"fcb2a8f54a032c01228aa61b41b8db24",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc":
"22fff94fee349f85bed5f7b88a6e9525",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc":
"1ca10b29ac749cfef9fcc71c1ed15178",
"496ed8321d009d7b4be079a3c09307a7",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc":
"147770b8d926602a70d9bb44b9b6d70e",
"27ef1cec21f7c47353e8ae42f6598976",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc":
"9c8b20d4f007d0a268f25eb498d0d935",
"cc51b052d56e0f0a5d430ff0a0cfa1f6",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000016.inc":
"8dd1f734d387b6a44874ddb20f5aaff0",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000018.inc":
"166096c71c87cfb536490da7ac336556",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000019.inc":
"90eb18a6f34b5abef41f979605679e63",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000001A.inc":
"f2600b39b0c377f70c83754b8af45f49",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000020.inc":
"d18f1ce7cd705d6cc17efa044192be5e",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000021.inc":
"29838824b0a40c6fa87cbf262aab3d33",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000022.inc":
"910f5414d9aaef29ddb80cb21bb6c751",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000024.inc":
"9c0f40cbcc59da64fa0f93bbd833d336",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000025.inc":
"5411503e83c83424245e0ed5d6771654",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000026.inc":
"110e4c3802c2e37a2651946f2e766e71",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000028.inc":
"be62088cbc053fde229fc0bd7d424ea9",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000029.inc":
"dcfb76274270a8e8e2cdd99f0babcb33",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000002A.inc":
"2ec90c35f7d39a361b354ac37f634474",
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc":
"2c896a8346efa374e247602decd442db",
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc":
......@@ -250,9 +268,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json":
"f3e0afbc2368002e8a1148edcbe709fa",
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"5c283ab18acb54c2d236f6695086149c",
"900796c40d8494da9d78a6c3fa53aea4",
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag.json":
"55b1796c39747ae79ac73159c1750eba",
"f6b69ba316a5565400c2875e5da14b73",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp":
"c89a0d185f7723e0c221c135aa4f48a3",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json":
......@@ -262,9 +280,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json":
"af79e5153c99cdb1e6b551b11bbf7f6b",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"8738cfbd39304c3cc0c115409ceae966",
"ff29debe33758511b793e4eee2a70061",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"0199bc9cb7d6bc414c95cf9715154f06",
"f2b4a6af004d1f0f06b01e370c202878",
"tools/glslang/glslang_validator.exe.sha1":
"8127ba41e0d354b516f6ce1188d3c145",
"tools/glslang/glslang_validator.sha1":
......
......@@ -1297,7 +1297,7 @@ angle::Result Texture::copyTexture(Context *context,
unpackPremultiplyAlpha, unpackUnmultiplyAlpha, source));
const auto &sourceDesc =
source->mState.getImageDesc(NonCubeTextureTypeToTarget(source->getType()), 0);
source->mState.getImageDesc(NonCubeTextureTypeToTarget(source->getType()), sourceLevel);
const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
mState.setImageDesc(
target, level,
......
......@@ -118,6 +118,27 @@ angle::Result RenderTargetVk::getImageView(ContextVk *contextVk,
imageViewOut);
}
angle::Result RenderTargetVk::getAndRetainCopyImageView(ContextVk *contextVk,
const vk::ImageView **imageViewOut) const
{
retainImageViews(contextVk);
const vk::ImageViewHelper *imageViews = mImageViews;
const vk::ImageView &copyView = imageViews->getCopyImageView();
// If the source of render target is the texture, this will always be valid. This is also where
// 3D or 2DArray images could be the source of the render target.
if (copyView.valid())
{
*imageViewOut = &copyView;
return angle::Result::Continue;
}
// Otherwise, this must come from the surface, in which case the image is 2D, so the image view
// used to draw is just as good for fetching.
return getImageView(contextVk, imageViewOut);
}
const vk::Format &RenderTargetVk::getImageFormat() const
{
ASSERT(mImage && mImage->valid());
......
......@@ -57,12 +57,16 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const;
// getImageForRead will also transition the resource to the given layout.
vk::ImageHelper *getImageForWrite(ContextVk *contextVk) const;
// For cube maps we use single-level single-layer 2D array views.
angle::Result getImageView(ContextVk *contextVk, const vk::ImageView **imageViewOut) const;
// For 3D textures, the 2D view created for render target is invalid to read from. The
// following will return a view to the whole image (for all types, including 3D and 2DArray).
angle::Result getAndRetainCopyImageView(ContextVk *contextVk,
const vk::ImageView **imageViewOut) const;
const vk::Format &getImageFormat() const;
gl::Extents getExtents() const;
uint32_t getLevelIndex() const { return mLevelIndex; }
......
......@@ -85,7 +85,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index,
GLenum internalFormat,
GLenum type,
size_t sourceLevel,
size_t sourceLevelGL,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
......@@ -93,7 +93,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
angle::Result copySubTexture(const gl::Context *context,
const gl::ImageIndex &index,
const gl::Offset &destOffset,
size_t sourceLevel,
size_t sourceLevelGL,
const gl::Box &sourceBox,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
......@@ -264,7 +264,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const vk::Format &vkFormat);
angle::Result copyImageDataToBufferAndGetData(ContextVk *contextVk,
size_t sourceLevel,
size_t sourceLevelGL,
uint32_t layerCount,
const gl::Box &sourceArea,
uint8_t **outDataPtr);
......@@ -302,8 +302,8 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index,
const gl::Offset &destOffset,
const gl::InternalFormat &destFormat,
size_t sourceLevel,
const gl::Rectangle &sourceArea,
size_t sourceLevelGL,
const gl::Box &sourceBox,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha,
......@@ -313,17 +313,17 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index,
const gl::Offset &destOffset,
const vk::Format &destFormat,
size_t sourceLevel,
size_t sourceLevelGL,
size_t sourceLayer,
const gl::Rectangle &sourceArea,
const gl::Box &sourceBox,
vk::ImageHelper *srcImage);
angle::Result copySubImageImplWithDraw(ContextVk *contextVk,
const gl::ImageIndex &index,
const gl::Offset &destOffset,
const vk::Format &destFormat,
size_t sourceLevel,
const gl::Rectangle &sourceArea,
size_t sourceLevelGL,
const gl::Box &sourceBox,
bool isSrcFlipY,
bool unpackFlipY,
bool unpackPremultiplyAlpha,
......
......@@ -1674,7 +1674,18 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk,
}
uint32_t flags = GetImageCopyFlags(srcFormat, dstFormat);
flags |= src->getLayerCount() > 1 ? ImageCopy_frag::kSrcIsArray : 0;
if (src->getType() == VK_IMAGE_TYPE_3D)
{
flags |= ImageCopy_frag::kSrcIs3D;
}
else if (src->getLayerCount() > 1)
{
flags |= ImageCopy_frag::kSrcIs2DArray;
}
else
{
flags |= ImageCopy_frag::kSrcIs2D;
}
VkDescriptorSet descriptorSet;
vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
......
// 8.14.3766
#pragma once
const uint32_t kImageCopy_frag_00000013[] = {
const uint32_t kImageCopy_frag_00000016[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
......
// 8.14.3766
#pragma once
const uint32_t kImageCopy_frag_0000000D[] = {
const uint32_t kImageCopy_frag_00000019[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
......
// 8.14.3766
#pragma once
const uint32_t kImageCopy_frag_00000003[] = {
const uint32_t kImageCopy_frag_00000024[] = {
0x07230203,0x00010000,0x00080008,0x000000ce,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000026,0x000000cc,0x00030010,
......@@ -52,7 +52,7 @@ const uint32_t kImageCopy_frag_00000003[] = {
0x00000009,0x0000002b,0x0004002b,0x0000002b,0x0000003a,0x00000000,0x0004002b,0x0000002b,
0x0000003e,0x00000001,0x00040020,0x0000003f,0x00000007,0x00000020,0x00040017,0x00000044,
0x00000020,0x00000004,0x00040020,0x00000045,0x00000007,0x00000044,0x00090019,0x00000047,
0x00000020,0x00000001,0x00000000,0x00000001,0x00000000,0x00000001,0x00000000,0x00040020,
0x00000020,0x00000002,0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x00040020,
0x00000048,0x00000000,0x00000047,0x0004003b,0x00000048,0x00000049,0x00000000,0x0004002b,
0x00000020,0x0000004b,0x00000000,0x0004002b,0x00000020,0x00000050,0x00000003,0x00040020,
0x00000051,0x00000009,0x00000020,0x00040017,0x00000054,0x00000020,0x00000003,0x0004002b,
......@@ -173,7 +173,7 @@ const uint32_t kImageCopy_frag_00000003[] = {
//
// #extension GL_EXT_samplerless_texture_functions : require
//
// layout(set = 0, binding = 0)uniform itexture2DArray src;
// layout(set = 0, binding = 0)uniform itexture3D src;
// layout(location = 0)out vec4 dest;
//
// layout(push_constant)uniform PushConstants {
......
// 8.14.3766
#pragma once
const uint32_t kImageCopy_frag_0000000B[] = {
const uint32_t kImageCopy_frag_00000025[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
......@@ -45,8 +45,8 @@ const uint32_t kImageCopy_frag_0000000B[] = {
0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,0x0004002b,
0x00000012,0x00000022,0x00000000,0x0004002b,0x00000012,0x00000026,0x00000001,0x00040020,
0x00000027,0x00000007,0x00000006,0x00040017,0x0000002c,0x00000006,0x00000004,0x00040020,
0x0000002d,0x00000007,0x0000002c,0x00090019,0x0000002f,0x00000006,0x00000001,0x00000000,
0x00000001,0x00000000,0x00000001,0x00000000,0x00040020,0x00000030,0x00000000,0x0000002f,
0x0000002d,0x00000007,0x0000002c,0x00090019,0x0000002f,0x00000006,0x00000002,0x00000000,
0x00000000,0x00000000,0x00000001,0x00000000,0x00040020,0x00000030,0x00000000,0x0000002f,
0x0004003b,0x00000030,0x00000031,0x00000000,0x0004002b,0x00000006,0x00000033,0x00000000,
0x0004002b,0x00000006,0x00000038,0x00000003,0x00040020,0x00000039,0x00000009,0x00000006,
0x00040017,0x0000003c,0x00000006,0x00000003,0x0004002b,0x00000006,0x00000040,0x00000002,
......@@ -142,7 +142,7 @@ const uint32_t kImageCopy_frag_0000000B[] = {
//
// #extension GL_EXT_samplerless_texture_functions : require
//
// layout(set = 0, binding = 0)uniform itexture2DArray src;
// layout(set = 0, binding = 0)uniform itexture3D src;
// layout(location = 0)out ivec4 dest;
//
// layout(push_constant)uniform PushConstants {
......
......@@ -24,10 +24,14 @@
#error "Not all source formats are accounted for"
#endif
#if SrcIsArray
#if SrcIs2D
#define SRC_RESOURCE_NAME texture2D
#elif SrcIs2DArray
#define SRC_RESOURCE_NAME texture2DArray
#elif SrcIs3D
#define SRC_RESOURCE_NAME texture3D
#else
#define SRC_RESOURCE_NAME texture2D
#error "Not all source types are accounted for"
#endif
#if DestIsFloat
......@@ -117,10 +121,12 @@ void main()
srcSubImageCoords.y = -srcSubImageCoords.y;
}
#if SrcIsArray
#if SrcIs2D
SrcType srcValue = texelFetch(src, params.srcOffset + srcSubImageCoords, params.srcMip);
#elif SrcIs2DArray || SrcIs3D
SrcType srcValue = texelFetch(src, ivec3(params.srcOffset + srcSubImageCoords, params.srcLayer), params.srcMip);
#else
SrcType srcValue = texelFetch(src, params.srcOffset + srcSubImageCoords, params.srcMip);
#error "Not all source types are accounted for"
#endif
// Note: sRGB formats are unorm, so SrcIsFloat must be necessarily set
......
......@@ -10,8 +10,10 @@
" - Optimized ImageCopy shaders crash old AMD drivers. Optimization is tentatively",
" disabled until ANGLE try bots are upgraded. http://anglebug.com/4720"
],
"Flags": [
"SrcIsArray"
"SrcType": [
"SrcIs2D",
"SrcIs2DArray",
"SrcIs3D"
],
"SrcFormat": [
[ "SrcIsFloat", "-Od" ],
......
......@@ -84,6 +84,7 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.framebufferBlit = true;
mNativeExtensions.framebufferMultisample = true;
mNativeExtensions.copyTexture = true;
mNativeExtensions.copyTexture3d = true;
mNativeExtensions.copyCompressedTexture = true;
mNativeExtensions.debugMarker = true;
mNativeExtensions.robustness =
......
......@@ -437,7 +437,7 @@ uint32_t GetImageLayerCountForView(const ImageHelper &image)
ImageView *GetLevelImageView(ImageViewVector *imageViews, uint32_t level, uint32_t levelCount)
{
// Lazily allocate the storage for image views. We allocate the full level count because we
// don't want to trigger any std::vecotr reallocations. Reallocations could invalidate our
// don't want to trigger any std::vector reallocations. Reallocations could invalidate our
// view pointers.
if (imageViews->empty())
{
......@@ -4152,7 +4152,7 @@ bool ImageHelper::isUpdateStaged(uint32_t levelGL, uint32_t layer)
}
angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
size_t sourceLevel,
size_t sourceLevelGL,
uint32_t layerCount,
uint32_t baseLayer,
const gl::Box &sourceArea,
......@@ -4193,6 +4193,8 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut));
ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer));
uint32_t sourceLevelVk = static_cast<uint32_t>(sourceLevelGL) - mBaseLevel;
VkBufferImageCopy regions[2] = {};
// Default to non-combined DS case
regions[0].bufferOffset = (*bufferOffsetsOut)[0];
......@@ -4207,7 +4209,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
regions[0].imageSubresource.aspectMask = aspectFlags;
regions[0].imageSubresource.baseArrayLayer = baseLayer;
regions[0].imageSubresource.layerCount = layerCount;
regions[0].imageSubresource.mipLevel = static_cast<uint32_t>(sourceLevel);
regions[0].imageSubresource.mipLevel = sourceLevelVk;
if (isCombinedDepthStencilFormat())
{
......@@ -4238,7 +4240,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
regions[1].imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
regions[1].imageSubresource.baseArrayLayer = baseLayer;
regions[1].imageSubresource.layerCount = layerCount;
regions[1].imageSubresource.mipLevel = static_cast<uint32_t>(sourceLevel);
regions[1].imageSubresource.mipLevel = sourceLevelVk;
commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(),
(*bufferOut)->getBuffer().getHandle(), 1, &regions[1]);
}
......
......@@ -1333,7 +1333,7 @@ class ImageHelper final : public Resource, public angle::Subject
void setBaseAndMaxLevels(uint32_t baseLevel, uint32_t maxLevel);
angle::Result copyImageDataToBuffer(ContextVk *contextVk,
size_t sourceLevel,
size_t sourceLevelGL,
uint32_t layerCount,
uint32_t baseLayer,
const gl::Box &sourceArea,
......
......@@ -100,21 +100,30 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000016.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000018.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000019.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000001A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000020.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000021.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000022.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000024.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000025.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000026.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000028.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000029.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000002A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc"
......@@ -237,25 +246,46 @@ constexpr ShaderBlob kImageCopy_frag_shaders[] = {
{kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)},
{kImageCopy_frag_00000001, sizeof(kImageCopy_frag_00000001)},
{kImageCopy_frag_00000002, sizeof(kImageCopy_frag_00000002)},
{kImageCopy_frag_00000003, sizeof(kImageCopy_frag_00000003)},
{nullptr, 0}, // 0x00000003
{kImageCopy_frag_00000004, sizeof(kImageCopy_frag_00000004)},
{kImageCopy_frag_00000005, sizeof(kImageCopy_frag_00000005)},
{nullptr, 0}, // 0x00000006
{kImageCopy_frag_00000006, sizeof(kImageCopy_frag_00000006)},
{nullptr, 0}, // 0x00000007
{kImageCopy_frag_00000008, sizeof(kImageCopy_frag_00000008)},
{kImageCopy_frag_00000009, sizeof(kImageCopy_frag_00000009)},
{kImageCopy_frag_0000000A, sizeof(kImageCopy_frag_0000000A)},
{kImageCopy_frag_0000000B, sizeof(kImageCopy_frag_0000000B)},
{kImageCopy_frag_0000000C, sizeof(kImageCopy_frag_0000000C)},
{kImageCopy_frag_0000000D, sizeof(kImageCopy_frag_0000000D)},
{nullptr, 0}, // 0x0000000B
{nullptr, 0}, // 0x0000000C
{nullptr, 0}, // 0x0000000D
{nullptr, 0}, // 0x0000000E
{nullptr, 0}, // 0x0000000F
{kImageCopy_frag_00000010, sizeof(kImageCopy_frag_00000010)},
{kImageCopy_frag_00000011, sizeof(kImageCopy_frag_00000011)},
{kImageCopy_frag_00000012, sizeof(kImageCopy_frag_00000012)},
{kImageCopy_frag_00000013, sizeof(kImageCopy_frag_00000013)},
{nullptr, 0}, // 0x00000013
{kImageCopy_frag_00000014, sizeof(kImageCopy_frag_00000014)},
{kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)},
{kImageCopy_frag_00000016, sizeof(kImageCopy_frag_00000016)},
{nullptr, 0}, // 0x00000017
{kImageCopy_frag_00000018, sizeof(kImageCopy_frag_00000018)},
{kImageCopy_frag_00000019, sizeof(kImageCopy_frag_00000019)},
{kImageCopy_frag_0000001A, sizeof(kImageCopy_frag_0000001A)},
{nullptr, 0}, // 0x0000001B
{nullptr, 0}, // 0x0000001C
{nullptr, 0}, // 0x0000001D
{nullptr, 0}, // 0x0000001E
{nullptr, 0}, // 0x0000001F
{kImageCopy_frag_00000020, sizeof(kImageCopy_frag_00000020)},
{kImageCopy_frag_00000021, sizeof(kImageCopy_frag_00000021)},
{kImageCopy_frag_00000022, sizeof(kImageCopy_frag_00000022)},
{nullptr, 0}, // 0x00000023
{kImageCopy_frag_00000024, sizeof(kImageCopy_frag_00000024)},
{kImageCopy_frag_00000025, sizeof(kImageCopy_frag_00000025)},
{kImageCopy_frag_00000026, sizeof(kImageCopy_frag_00000026)},
{nullptr, 0}, // 0x00000027
{kImageCopy_frag_00000028, sizeof(kImageCopy_frag_00000028)},
{kImageCopy_frag_00000029, sizeof(kImageCopy_frag_00000029)},
{kImageCopy_frag_0000002A, sizeof(kImageCopy_frag_0000002A)},
};
constexpr ShaderBlob kOverlayCull_comp_shaders[] = {
{kOverlayCull_comp_00000000, sizeof(kOverlayCull_comp_00000000)},
......
......@@ -93,21 +93,30 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ImageCopy.frag.00000000.inc",
"shaders/gen/ImageCopy.frag.00000001.inc",
"shaders/gen/ImageCopy.frag.00000002.inc",
"shaders/gen/ImageCopy.frag.00000003.inc",
"shaders/gen/ImageCopy.frag.00000004.inc",
"shaders/gen/ImageCopy.frag.00000005.inc",
"shaders/gen/ImageCopy.frag.00000006.inc",
"shaders/gen/ImageCopy.frag.00000008.inc",
"shaders/gen/ImageCopy.frag.00000009.inc",
"shaders/gen/ImageCopy.frag.0000000A.inc",
"shaders/gen/ImageCopy.frag.0000000B.inc",
"shaders/gen/ImageCopy.frag.0000000C.inc",
"shaders/gen/ImageCopy.frag.0000000D.inc",
"shaders/gen/ImageCopy.frag.00000010.inc",
"shaders/gen/ImageCopy.frag.00000011.inc",
"shaders/gen/ImageCopy.frag.00000012.inc",
"shaders/gen/ImageCopy.frag.00000013.inc",
"shaders/gen/ImageCopy.frag.00000014.inc",
"shaders/gen/ImageCopy.frag.00000015.inc",
"shaders/gen/ImageCopy.frag.00000016.inc",
"shaders/gen/ImageCopy.frag.00000018.inc",
"shaders/gen/ImageCopy.frag.00000019.inc",
"shaders/gen/ImageCopy.frag.0000001A.inc",
"shaders/gen/ImageCopy.frag.00000020.inc",
"shaders/gen/ImageCopy.frag.00000021.inc",
"shaders/gen/ImageCopy.frag.00000022.inc",
"shaders/gen/ImageCopy.frag.00000024.inc",
"shaders/gen/ImageCopy.frag.00000025.inc",
"shaders/gen/ImageCopy.frag.00000026.inc",
"shaders/gen/ImageCopy.frag.00000028.inc",
"shaders/gen/ImageCopy.frag.00000029.inc",
"shaders/gen/ImageCopy.frag.0000002A.inc",
"shaders/gen/OverlayCull.comp.00000000.inc",
"shaders/gen/OverlayCull.comp.00000001.inc",
"shaders/gen/OverlayCull.comp.00000002.inc",
......
......@@ -139,23 +139,25 @@ constexpr size_t kArrayLen = 0x00000018;
namespace ImageCopy_frag
{
enum flags
enum DestFormat
{
kSrcIsArray = 0x00000001,
kDestIsFloat = 0x00000000,
kDestIsSint = 0x00000001,
kDestIsUint = 0x00000002,
};
enum SrcFormat
{
kSrcIsFloat = 0x00000000,
kSrcIsSint = 0x00000002,
kSrcIsUint = 0x00000004,
kSrcIsSint = 0x00000004,
kSrcIsUint = 0x00000008,
};
enum DestFormat
enum SrcType
{
kDestIsFloat = 0x00000000,
kDestIsSint = 0x00000008,
kDestIsUint = 0x00000010,
kSrcIs2D = 0x00000000,
kSrcIs2DArray = 0x00000010,
kSrcIs3D = 0x00000020,
};
constexpr size_t kArrayLen = 0x00000016;
constexpr size_t kArrayLen = 0x0000002B;
} // namespace ImageCopy_frag
namespace OverlayCull_comp
......
......@@ -182,10 +182,65 @@ class CopyTexture3DTest : public ANGLETest
if (renderType == GL_RGBA8)
{
uint32_t tolerance = 1;
// The destination formats may be emulated, so the precision may be higher than
// required. Increase the tolerance to 2^(8-width) / 2. 8 is for the 8-bit format
// used for emulation, and divide by 2 because the value is expected to round to
// nearest.
switch (destType)
{
case GL_UNSIGNED_SHORT_5_6_5:
tolerance = 4;
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
tolerance = 4;
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
tolerance = 8;
break;
default:
break;
}
switch (destInternalFormat)
{
case GL_RGB565:
tolerance = 4;
break;
case GL_RGB5_A1:
tolerance = 4;
break;
case GL_RGBA4:
tolerance = 8;
break;
default:
break;
}
// If destination is SNORM, values in between representable values could round either
// way.
switch (destInternalFormat)
{
case GL_R8_SNORM:
case GL_RG8_SNORM:
case GL_RGB8_SNORM:
case GL_RGBA8_SNORM:
tolerance *= 2;
break;
default:
break;
}
if (tolerance != 1 && (IsNVIDIA() || IsAndroid()) && IsVulkan())
{
// Note: on Nvidia/Vulkan, the round is not done to nearest in all cases, so bring
// the tolerance to the full-range of precision. http://anglebug.com/4742
tolerance *= 2;
}
GLColor actual;
glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R);
EXPECT_GL_NO_ERROR();
EXPECT_COLOR_NEAR(expectedColor, actual, 1);
EXPECT_COLOR_NEAR(expectedColor, actual, tolerance);
return;
}
else if (renderType == GL_RGBA32F)
......@@ -655,15 +710,15 @@ void CopyTexture3DTest::testUnsignedByteFormats(const GLenum testTarget)
GLColor(244, 148, 78, 255));
testCopy(testTarget, kColorPreAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, true, false,
GLColor(31, 19, 11, 255));
testCopy(testTarget, kColorUnAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, false, true,
GLColor(52, 253, 53, 255));
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,
true, GLColor(49, 120, 228, 255));
testCopy(testTarget, kColorNoAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, false,
GLColor(244, 148, 78, 100));
testCopy(testTarget, kColorPreAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, true, false,
GLColor(31, 19, 11, 100));
testCopy(testTarget, kColorUnAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, true,
GLColor(52, 253, 53, 100));
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
false, true, GLColor(49, 120, 228, 210));
testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
false, false, GLColor(247, 198, 148, 255));
......@@ -768,14 +823,19 @@ void CopyTexture3DTest::testFloatFormats(const GLenum testTarget)
GLColor(227, 217, 161, 255));
}
if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
if (!(IsVulkan() && testTarget == GL_TEXTURE_2D_ARRAY))
{
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false,
GLColor(210, 200, 148, 255));
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, true, false,
GLColor(192, 184, 138, 255));
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, true,
GLColor(227, 217, 161, 255));
if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
{
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false,
GLColor(210, 200, 148, 255));
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, true, false,
GLColor(192, 184, 138, 255));
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, true,
GLColor(227, 217, 161, 255));
}
}
}
......@@ -809,6 +869,9 @@ TEST_P(Texture3DCopy, FloatFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// http://anglebug.com/4756
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
testFloatFormats(GL_TEXTURE_3D);
}
......@@ -878,6 +941,10 @@ TEST_P(Texture3DCopy, IntFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.
// http://anglebug.com/4741
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr char kFS[] =
"#version 300 es\n"
"precision highp float;\n"
......@@ -1000,6 +1067,10 @@ TEST_P(Texture3DCopy, UintFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer
// formats. http://anglebug.com/4741
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr char kFS[] =
"#version 300 es\n"
"precision highp float;\n"
......@@ -1153,6 +1224,9 @@ TEST_P(Texture2DArrayCopy, OffsetSubCopy)
int width = getWindowWidth() - 1;
int height = getWindowHeight() - 1;
// http://anglebug.com/TODO
ANGLE_SKIP_TEST_IF(isSwiftshader());
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
......@@ -1221,6 +1295,9 @@ TEST_P(Texture2DArrayCopy, FlipY)
EXPECT_GL_NO_ERROR();
drawQuad(mProgram, "position", 1.0f);
// http://anglebug.com/TODO
ANGLE_SKIP_TEST_IF(isSwiftshader());
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
......@@ -1233,6 +1310,10 @@ TEST_P(Texture2DArrayCopy, UnsizedFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel());
testUnsizedFormats(GL_TEXTURE_2D_ARRAY);
}
......@@ -1242,6 +1323,10 @@ TEST_P(Texture2DArrayCopy, SnormFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
ANGLE_SKIP_TEST_IF(IsVulkan() && (IsIntel() || isSwiftshader() || IsAndroid()));
testSnormFormats(GL_TEXTURE_2D_ARRAY);
}
......@@ -1254,6 +1339,10 @@ TEST_P(Texture2DArrayCopy, UnsignedByteFormats)
// Flay on Windows D3D11. http://anglebug.com/2896
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
ANGLE_SKIP_TEST_IF(IsVulkan() && (IsIntel() || IsAndroid()));
testUnsignedByteFormats(GL_TEXTURE_2D_ARRAY);
}
......@@ -1263,6 +1352,10 @@ TEST_P(Texture2DArrayCopy, FloatFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
ANGLE_SKIP_TEST_IF(IsVulkan() && (IsIntel() || IsAndroid()));
testFloatFormats(GL_TEXTURE_2D_ARRAY);
}
......@@ -1272,6 +1365,10 @@ TEST_P(Texture2DArrayCopy, IntFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.
// http://anglebug.com/4741
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr char kFS[] =
"#version 300 es\n"
"precision highp float;\n"
......@@ -1298,6 +1395,10 @@ TEST_P(Texture2DArrayCopy, UintFormats)
{
ANGLE_SKIP_TEST_IF(!checkExtensions());
// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer
// formats. http://anglebug.com/4741
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr char kFS[] =
"#version 300 es\n"
"precision highp float;\n"
......
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