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 @@ ...@@ -166,39 +166,57 @@
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc":
"9f8b96b844a7116c3e45640e7acc21a4", "9f8b96b844a7116c3e45640e7acc21a4",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc":
"238308e0fc29966d6222d8de6fce9f0b", "3baacaf94b801b7113001036db5d52c6",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc":
"8c13eeced676451ef8a3e3ad2a9ab442", "90703088084deded06d8614aab19f100",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc":
"2201380521a799c7bbce4d6fd080fa57",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc":
"6804b2a2dd9687c1a7767bd272ff6713", "e018191c11f9df4679ded97771e096f5",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc": "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": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc":
"812de8d46a7f148dc0a3e79866dfc014", "186e561860cebb0a3e0fe466aaa32258",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc":
"e0fc7b89e5a02334c6bb5797a3a0cb0e", "b5e6c6c5eb7fb81c8da602e14e5d75cb",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc":
"8e24ff2f5567724ad1b44133f7e176f9", "6dc8679fea6b2253811d9498a0c225bb",
"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",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc":
"1c7457d47e0cc9b138878e2b6ea5d66a", "265b9f424ff343a9122da8f8eafe65ff",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc":
"0a5f833e77f9359361cf88b070f2c3c3", "fcb2a8f54a032c01228aa61b41b8db24",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc":
"22fff94fee349f85bed5f7b88a6e9525", "496ed8321d009d7b4be079a3c09307a7",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc":
"1ca10b29ac749cfef9fcc71c1ed15178",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc":
"147770b8d926602a70d9bb44b9b6d70e", "27ef1cec21f7c47353e8ae42f6598976",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc": "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": "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc":
"2c896a8346efa374e247602decd442db", "2c896a8346efa374e247602decd442db",
"src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc":
...@@ -250,9 +268,9 @@ ...@@ -250,9 +268,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json": "src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json":
"f3e0afbc2368002e8a1148edcbe709fa", "f3e0afbc2368002e8a1148edcbe709fa",
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag": "src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"5c283ab18acb54c2d236f6695086149c", "900796c40d8494da9d78a6c3fa53aea4",
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag.json": "src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag.json":
"55b1796c39747ae79ac73159c1750eba", "f6b69ba316a5565400c2875e5da14b73",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp": "src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp":
"c89a0d185f7723e0c221c135aa4f48a3", "c89a0d185f7723e0c221c135aa4f48a3",
"src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json":
...@@ -262,9 +280,9 @@ ...@@ -262,9 +280,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json":
"af79e5153c99cdb1e6b551b11bbf7f6b", "af79e5153c99cdb1e6b551b11bbf7f6b",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"8738cfbd39304c3cc0c115409ceae966", "ff29debe33758511b793e4eee2a70061",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"0199bc9cb7d6bc414c95cf9715154f06", "f2b4a6af004d1f0f06b01e370c202878",
"tools/glslang/glslang_validator.exe.sha1": "tools/glslang/glslang_validator.exe.sha1":
"8127ba41e0d354b516f6ce1188d3c145", "8127ba41e0d354b516f6ce1188d3c145",
"tools/glslang/glslang_validator.sha1": "tools/glslang/glslang_validator.sha1":
......
...@@ -1297,7 +1297,7 @@ angle::Result Texture::copyTexture(Context *context, ...@@ -1297,7 +1297,7 @@ angle::Result Texture::copyTexture(Context *context,
unpackPremultiplyAlpha, unpackUnmultiplyAlpha, source)); unpackPremultiplyAlpha, unpackUnmultiplyAlpha, source));
const auto &sourceDesc = const auto &sourceDesc =
source->mState.getImageDesc(NonCubeTextureTypeToTarget(source->getType()), 0); source->mState.getImageDesc(NonCubeTextureTypeToTarget(source->getType()), sourceLevel);
const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type); const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
mState.setImageDesc( mState.setImageDesc(
target, level, target, level,
......
...@@ -118,6 +118,27 @@ angle::Result RenderTargetVk::getImageView(ContextVk *contextVk, ...@@ -118,6 +118,27 @@ angle::Result RenderTargetVk::getImageView(ContextVk *contextVk,
imageViewOut); 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 const vk::Format &RenderTargetVk::getImageFormat() const
{ {
ASSERT(mImage && mImage->valid()); ASSERT(mImage && mImage->valid());
......
...@@ -57,12 +57,16 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget ...@@ -57,12 +57,16 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageHelper &getImage(); vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const; const vk::ImageHelper &getImage() const;
// getImageForRead will also transition the resource to the given layout.
vk::ImageHelper *getImageForWrite(ContextVk *contextVk) const; vk::ImageHelper *getImageForWrite(ContextVk *contextVk) const;
// For cube maps we use single-level single-layer 2D array views. // For cube maps we use single-level single-layer 2D array views.
angle::Result getImageView(ContextVk *contextVk, const vk::ImageView **imageViewOut) const; 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; const vk::Format &getImageFormat() const;
gl::Extents getExtents() const; gl::Extents getExtents() const;
uint32_t getLevelIndex() const { return mLevelIndex; } uint32_t getLevelIndex() const { return mLevelIndex; }
......
...@@ -85,7 +85,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -85,7 +85,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index, const gl::ImageIndex &index,
GLenum internalFormat, GLenum internalFormat,
GLenum type, GLenum type,
size_t sourceLevel, size_t sourceLevelGL,
bool unpackFlipY, bool unpackFlipY,
bool unpackPremultiplyAlpha, bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha, bool unpackUnmultiplyAlpha,
...@@ -93,7 +93,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -93,7 +93,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
angle::Result copySubTexture(const gl::Context *context, angle::Result copySubTexture(const gl::Context *context,
const gl::ImageIndex &index, const gl::ImageIndex &index,
const gl::Offset &destOffset, const gl::Offset &destOffset,
size_t sourceLevel, size_t sourceLevelGL,
const gl::Box &sourceBox, const gl::Box &sourceBox,
bool unpackFlipY, bool unpackFlipY,
bool unpackPremultiplyAlpha, bool unpackPremultiplyAlpha,
...@@ -264,7 +264,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -264,7 +264,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const vk::Format &vkFormat); const vk::Format &vkFormat);
angle::Result copyImageDataToBufferAndGetData(ContextVk *contextVk, angle::Result copyImageDataToBufferAndGetData(ContextVk *contextVk,
size_t sourceLevel, size_t sourceLevelGL,
uint32_t layerCount, uint32_t layerCount,
const gl::Box &sourceArea, const gl::Box &sourceArea,
uint8_t **outDataPtr); uint8_t **outDataPtr);
...@@ -302,8 +302,8 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -302,8 +302,8 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index, const gl::ImageIndex &index,
const gl::Offset &destOffset, const gl::Offset &destOffset,
const gl::InternalFormat &destFormat, const gl::InternalFormat &destFormat,
size_t sourceLevel, size_t sourceLevelGL,
const gl::Rectangle &sourceArea, const gl::Box &sourceBox,
bool unpackFlipY, bool unpackFlipY,
bool unpackPremultiplyAlpha, bool unpackPremultiplyAlpha,
bool unpackUnmultiplyAlpha, bool unpackUnmultiplyAlpha,
...@@ -313,17 +313,17 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -313,17 +313,17 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
const gl::ImageIndex &index, const gl::ImageIndex &index,
const gl::Offset &destOffset, const gl::Offset &destOffset,
const vk::Format &destFormat, const vk::Format &destFormat,
size_t sourceLevel, size_t sourceLevelGL,
size_t sourceLayer, size_t sourceLayer,
const gl::Rectangle &sourceArea, const gl::Box &sourceBox,
vk::ImageHelper *srcImage); vk::ImageHelper *srcImage);
angle::Result copySubImageImplWithDraw(ContextVk *contextVk, angle::Result copySubImageImplWithDraw(ContextVk *contextVk,
const gl::ImageIndex &index, const gl::ImageIndex &index,
const gl::Offset &destOffset, const gl::Offset &destOffset,
const vk::Format &destFormat, const vk::Format &destFormat,
size_t sourceLevel, size_t sourceLevelGL,
const gl::Rectangle &sourceArea, const gl::Box &sourceBox,
bool isSrcFlipY, bool isSrcFlipY,
bool unpackFlipY, bool unpackFlipY,
bool unpackPremultiplyAlpha, bool unpackPremultiplyAlpha,
......
...@@ -1674,7 +1674,18 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk, ...@@ -1674,7 +1674,18 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk,
} }
uint32_t flags = GetImageCopyFlags(srcFormat, dstFormat); 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; VkDescriptorSet descriptorSet;
vk::RefCountedDescriptorPoolBinding descriptorPoolBinding; vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
......
// 8.14.3766 // 8.14.3766
#pragma once #pragma once
const uint32_t kImageCopy_frag_00000013[] = { const uint32_t kImageCopy_frag_00000016[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b, 0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010, 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
......
// 8.14.3766 // 8.14.3766
#pragma once #pragma once
const uint32_t kImageCopy_frag_0000000D[] = { const uint32_t kImageCopy_frag_00000019[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b, 0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010, 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
......
// 8.14.3766 // 8.14.3766
#pragma once #pragma once
const uint32_t kImageCopy_frag_00000003[] = { const uint32_t kImageCopy_frag_00000024[] = {
0x07230203,0x00010000,0x00080008,0x000000ce,0x00000000,0x00020011,0x00000001,0x0006000b, 0x07230203,0x00010000,0x00080008,0x000000ce,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000026,0x000000cc,0x00030010, 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000026,0x000000cc,0x00030010,
...@@ -52,7 +52,7 @@ const uint32_t kImageCopy_frag_00000003[] = { ...@@ -52,7 +52,7 @@ const uint32_t kImageCopy_frag_00000003[] = {
0x00000009,0x0000002b,0x0004002b,0x0000002b,0x0000003a,0x00000000,0x0004002b,0x0000002b, 0x00000009,0x0000002b,0x0004002b,0x0000002b,0x0000003a,0x00000000,0x0004002b,0x0000002b,
0x0000003e,0x00000001,0x00040020,0x0000003f,0x00000007,0x00000020,0x00040017,0x00000044, 0x0000003e,0x00000001,0x00040020,0x0000003f,0x00000007,0x00000020,0x00040017,0x00000044,
0x00000020,0x00000004,0x00040020,0x00000045,0x00000007,0x00000044,0x00090019,0x00000047, 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, 0x00000048,0x00000000,0x00000047,0x0004003b,0x00000048,0x00000049,0x00000000,0x0004002b,
0x00000020,0x0000004b,0x00000000,0x0004002b,0x00000020,0x00000050,0x00000003,0x00040020, 0x00000020,0x0000004b,0x00000000,0x0004002b,0x00000020,0x00000050,0x00000003,0x00040020,
0x00000051,0x00000009,0x00000020,0x00040017,0x00000054,0x00000020,0x00000003,0x0004002b, 0x00000051,0x00000009,0x00000020,0x00040017,0x00000054,0x00000020,0x00000003,0x0004002b,
...@@ -173,7 +173,7 @@ const uint32_t kImageCopy_frag_00000003[] = { ...@@ -173,7 +173,7 @@ const uint32_t kImageCopy_frag_00000003[] = {
// //
// #extension GL_EXT_samplerless_texture_functions : require // #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(location = 0)out vec4 dest;
// //
// layout(push_constant)uniform PushConstants { // layout(push_constant)uniform PushConstants {
......
// 8.14.3766 // 8.14.3766
#pragma once #pragma once
const uint32_t kImageCopy_frag_0000000B[] = { const uint32_t kImageCopy_frag_00000025[] = {
0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b, 0x07230203,0x00010000,0x00080008,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010, 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000009c,0x00030010,
...@@ -45,8 +45,8 @@ const uint32_t kImageCopy_frag_0000000B[] = { ...@@ -45,8 +45,8 @@ const uint32_t kImageCopy_frag_0000000B[] = {
0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,0x0004002b, 0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,0x0004002b,
0x00000012,0x00000022,0x00000000,0x0004002b,0x00000012,0x00000026,0x00000001,0x00040020, 0x00000012,0x00000022,0x00000000,0x0004002b,0x00000012,0x00000026,0x00000001,0x00040020,
0x00000027,0x00000007,0x00000006,0x00040017,0x0000002c,0x00000006,0x00000004,0x00040020, 0x00000027,0x00000007,0x00000006,0x00040017,0x0000002c,0x00000006,0x00000004,0x00040020,
0x0000002d,0x00000007,0x0000002c,0x00090019,0x0000002f,0x00000006,0x00000001,0x00000000, 0x0000002d,0x00000007,0x0000002c,0x00090019,0x0000002f,0x00000006,0x00000002,0x00000000,
0x00000001,0x00000000,0x00000001,0x00000000,0x00040020,0x00000030,0x00000000,0x0000002f, 0x00000000,0x00000000,0x00000001,0x00000000,0x00040020,0x00000030,0x00000000,0x0000002f,
0x0004003b,0x00000030,0x00000031,0x00000000,0x0004002b,0x00000006,0x00000033,0x00000000, 0x0004003b,0x00000030,0x00000031,0x00000000,0x0004002b,0x00000006,0x00000033,0x00000000,
0x0004002b,0x00000006,0x00000038,0x00000003,0x00040020,0x00000039,0x00000009,0x00000006, 0x0004002b,0x00000006,0x00000038,0x00000003,0x00040020,0x00000039,0x00000009,0x00000006,
0x00040017,0x0000003c,0x00000006,0x00000003,0x0004002b,0x00000006,0x00000040,0x00000002, 0x00040017,0x0000003c,0x00000006,0x00000003,0x0004002b,0x00000006,0x00000040,0x00000002,
...@@ -142,7 +142,7 @@ const uint32_t kImageCopy_frag_0000000B[] = { ...@@ -142,7 +142,7 @@ const uint32_t kImageCopy_frag_0000000B[] = {
// //
// #extension GL_EXT_samplerless_texture_functions : require // #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(location = 0)out ivec4 dest;
// //
// layout(push_constant)uniform PushConstants { // layout(push_constant)uniform PushConstants {
......
...@@ -24,10 +24,14 @@ ...@@ -24,10 +24,14 @@
#error "Not all source formats are accounted for" #error "Not all source formats are accounted for"
#endif #endif
#if SrcIsArray #if SrcIs2D
#define SRC_RESOURCE_NAME texture2D
#elif SrcIs2DArray
#define SRC_RESOURCE_NAME texture2DArray #define SRC_RESOURCE_NAME texture2DArray
#elif SrcIs3D
#define SRC_RESOURCE_NAME texture3D
#else #else
#define SRC_RESOURCE_NAME texture2D #error "Not all source types are accounted for"
#endif #endif
#if DestIsFloat #if DestIsFloat
...@@ -117,10 +121,12 @@ void main() ...@@ -117,10 +121,12 @@ void main()
srcSubImageCoords.y = -srcSubImageCoords.y; 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); SrcType srcValue = texelFetch(src, ivec3(params.srcOffset + srcSubImageCoords, params.srcLayer), params.srcMip);
#else #else
SrcType srcValue = texelFetch(src, params.srcOffset + srcSubImageCoords, params.srcMip); #error "Not all source types are accounted for"
#endif #endif
// Note: sRGB formats are unorm, so SrcIsFloat must be necessarily set // Note: sRGB formats are unorm, so SrcIsFloat must be necessarily set
......
...@@ -10,8 +10,10 @@ ...@@ -10,8 +10,10 @@
" - Optimized ImageCopy shaders crash old AMD drivers. Optimization is tentatively", " - Optimized ImageCopy shaders crash old AMD drivers. Optimization is tentatively",
" disabled until ANGLE try bots are upgraded. http://anglebug.com/4720" " disabled until ANGLE try bots are upgraded. http://anglebug.com/4720"
], ],
"Flags": [ "SrcType": [
"SrcIsArray" "SrcIs2D",
"SrcIs2DArray",
"SrcIs3D"
], ],
"SrcFormat": [ "SrcFormat": [
[ "SrcIsFloat", "-Od" ], [ "SrcIsFloat", "-Od" ],
......
...@@ -84,6 +84,7 @@ void RendererVk::ensureCapsInitialized() const ...@@ -84,6 +84,7 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.framebufferBlit = true; mNativeExtensions.framebufferBlit = true;
mNativeExtensions.framebufferMultisample = true; mNativeExtensions.framebufferMultisample = true;
mNativeExtensions.copyTexture = true; mNativeExtensions.copyTexture = true;
mNativeExtensions.copyTexture3d = true;
mNativeExtensions.copyCompressedTexture = true; mNativeExtensions.copyCompressedTexture = true;
mNativeExtensions.debugMarker = true; mNativeExtensions.debugMarker = true;
mNativeExtensions.robustness = mNativeExtensions.robustness =
......
...@@ -437,7 +437,7 @@ uint32_t GetImageLayerCountForView(const ImageHelper &image) ...@@ -437,7 +437,7 @@ uint32_t GetImageLayerCountForView(const ImageHelper &image)
ImageView *GetLevelImageView(ImageViewVector *imageViews, uint32_t level, uint32_t levelCount) 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 // 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. // view pointers.
if (imageViews->empty()) if (imageViews->empty())
{ {
...@@ -4152,7 +4152,7 @@ bool ImageHelper::isUpdateStaged(uint32_t levelGL, uint32_t layer) ...@@ -4152,7 +4152,7 @@ bool ImageHelper::isUpdateStaged(uint32_t levelGL, uint32_t layer)
} }
angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
size_t sourceLevel, size_t sourceLevelGL,
uint32_t layerCount, uint32_t layerCount,
uint32_t baseLayer, uint32_t baseLayer,
const gl::Box &sourceArea, const gl::Box &sourceArea,
...@@ -4193,6 +4193,8 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, ...@@ -4193,6 +4193,8 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut)); ANGLE_TRY(contextVk->onBufferTransferWrite(*bufferOut));
ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer)); ANGLE_TRY(contextVk->endRenderPassAndGetCommandBuffer(&commandBuffer));
uint32_t sourceLevelVk = static_cast<uint32_t>(sourceLevelGL) - mBaseLevel;
VkBufferImageCopy regions[2] = {}; VkBufferImageCopy regions[2] = {};
// Default to non-combined DS case // Default to non-combined DS case
regions[0].bufferOffset = (*bufferOffsetsOut)[0]; regions[0].bufferOffset = (*bufferOffsetsOut)[0];
...@@ -4207,7 +4209,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, ...@@ -4207,7 +4209,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
regions[0].imageSubresource.aspectMask = aspectFlags; regions[0].imageSubresource.aspectMask = aspectFlags;
regions[0].imageSubresource.baseArrayLayer = baseLayer; regions[0].imageSubresource.baseArrayLayer = baseLayer;
regions[0].imageSubresource.layerCount = layerCount; regions[0].imageSubresource.layerCount = layerCount;
regions[0].imageSubresource.mipLevel = static_cast<uint32_t>(sourceLevel); regions[0].imageSubresource.mipLevel = sourceLevelVk;
if (isCombinedDepthStencilFormat()) if (isCombinedDepthStencilFormat())
{ {
...@@ -4238,7 +4240,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, ...@@ -4238,7 +4240,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk,
regions[1].imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; regions[1].imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
regions[1].imageSubresource.baseArrayLayer = baseLayer; regions[1].imageSubresource.baseArrayLayer = baseLayer;
regions[1].imageSubresource.layerCount = layerCount; regions[1].imageSubresource.layerCount = layerCount;
regions[1].imageSubresource.mipLevel = static_cast<uint32_t>(sourceLevel); regions[1].imageSubresource.mipLevel = sourceLevelVk;
commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(), commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(),
(*bufferOut)->getBuffer().getHandle(), 1, &regions[1]); (*bufferOut)->getBuffer().getHandle(), 1, &regions[1]);
} }
......
...@@ -1333,7 +1333,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1333,7 +1333,7 @@ class ImageHelper final : public Resource, public angle::Subject
void setBaseAndMaxLevels(uint32_t baseLevel, uint32_t maxLevel); void setBaseAndMaxLevels(uint32_t baseLevel, uint32_t maxLevel);
angle::Result copyImageDataToBuffer(ContextVk *contextVk, angle::Result copyImageDataToBuffer(ContextVk *contextVk,
size_t sourceLevel, size_t sourceLevelGL,
uint32_t layerCount, uint32_t layerCount,
uint32_t baseLayer, uint32_t baseLayer,
const gl::Box &sourceArea, const gl::Box &sourceArea,
......
...@@ -100,21 +100,30 @@ namespace ...@@ -100,21 +100,30 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc" #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.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.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.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.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.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.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.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.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.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.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.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.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.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc" #include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc" #include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc"
...@@ -237,25 +246,46 @@ constexpr ShaderBlob kImageCopy_frag_shaders[] = { ...@@ -237,25 +246,46 @@ constexpr ShaderBlob kImageCopy_frag_shaders[] = {
{kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)}, {kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)},
{kImageCopy_frag_00000001, sizeof(kImageCopy_frag_00000001)}, {kImageCopy_frag_00000001, sizeof(kImageCopy_frag_00000001)},
{kImageCopy_frag_00000002, sizeof(kImageCopy_frag_00000002)}, {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_00000004, sizeof(kImageCopy_frag_00000004)},
{kImageCopy_frag_00000005, sizeof(kImageCopy_frag_00000005)}, {kImageCopy_frag_00000005, sizeof(kImageCopy_frag_00000005)},
{nullptr, 0}, // 0x00000006 {kImageCopy_frag_00000006, sizeof(kImageCopy_frag_00000006)},
{nullptr, 0}, // 0x00000007 {nullptr, 0}, // 0x00000007
{kImageCopy_frag_00000008, sizeof(kImageCopy_frag_00000008)}, {kImageCopy_frag_00000008, sizeof(kImageCopy_frag_00000008)},
{kImageCopy_frag_00000009, sizeof(kImageCopy_frag_00000009)}, {kImageCopy_frag_00000009, sizeof(kImageCopy_frag_00000009)},
{kImageCopy_frag_0000000A, sizeof(kImageCopy_frag_0000000A)}, {kImageCopy_frag_0000000A, sizeof(kImageCopy_frag_0000000A)},
{kImageCopy_frag_0000000B, sizeof(kImageCopy_frag_0000000B)}, {nullptr, 0}, // 0x0000000B
{kImageCopy_frag_0000000C, sizeof(kImageCopy_frag_0000000C)}, {nullptr, 0}, // 0x0000000C
{kImageCopy_frag_0000000D, sizeof(kImageCopy_frag_0000000D)}, {nullptr, 0}, // 0x0000000D
{nullptr, 0}, // 0x0000000E {nullptr, 0}, // 0x0000000E
{nullptr, 0}, // 0x0000000F {nullptr, 0}, // 0x0000000F
{kImageCopy_frag_00000010, sizeof(kImageCopy_frag_00000010)}, {kImageCopy_frag_00000010, sizeof(kImageCopy_frag_00000010)},
{kImageCopy_frag_00000011, sizeof(kImageCopy_frag_00000011)}, {kImageCopy_frag_00000011, sizeof(kImageCopy_frag_00000011)},
{kImageCopy_frag_00000012, sizeof(kImageCopy_frag_00000012)}, {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_00000014, sizeof(kImageCopy_frag_00000014)},
{kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)}, {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[] = { constexpr ShaderBlob kOverlayCull_comp_shaders[] = {
{kOverlayCull_comp_00000000, sizeof(kOverlayCull_comp_00000000)}, {kOverlayCull_comp_00000000, sizeof(kOverlayCull_comp_00000000)},
......
...@@ -93,21 +93,30 @@ angle_vulkan_internal_shaders = [ ...@@ -93,21 +93,30 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ImageCopy.frag.00000000.inc", "shaders/gen/ImageCopy.frag.00000000.inc",
"shaders/gen/ImageCopy.frag.00000001.inc", "shaders/gen/ImageCopy.frag.00000001.inc",
"shaders/gen/ImageCopy.frag.00000002.inc", "shaders/gen/ImageCopy.frag.00000002.inc",
"shaders/gen/ImageCopy.frag.00000003.inc",
"shaders/gen/ImageCopy.frag.00000004.inc", "shaders/gen/ImageCopy.frag.00000004.inc",
"shaders/gen/ImageCopy.frag.00000005.inc", "shaders/gen/ImageCopy.frag.00000005.inc",
"shaders/gen/ImageCopy.frag.00000006.inc",
"shaders/gen/ImageCopy.frag.00000008.inc", "shaders/gen/ImageCopy.frag.00000008.inc",
"shaders/gen/ImageCopy.frag.00000009.inc", "shaders/gen/ImageCopy.frag.00000009.inc",
"shaders/gen/ImageCopy.frag.0000000A.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.00000010.inc",
"shaders/gen/ImageCopy.frag.00000011.inc", "shaders/gen/ImageCopy.frag.00000011.inc",
"shaders/gen/ImageCopy.frag.00000012.inc", "shaders/gen/ImageCopy.frag.00000012.inc",
"shaders/gen/ImageCopy.frag.00000013.inc",
"shaders/gen/ImageCopy.frag.00000014.inc", "shaders/gen/ImageCopy.frag.00000014.inc",
"shaders/gen/ImageCopy.frag.00000015.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.00000000.inc",
"shaders/gen/OverlayCull.comp.00000001.inc", "shaders/gen/OverlayCull.comp.00000001.inc",
"shaders/gen/OverlayCull.comp.00000002.inc", "shaders/gen/OverlayCull.comp.00000002.inc",
......
...@@ -139,23 +139,25 @@ constexpr size_t kArrayLen = 0x00000018; ...@@ -139,23 +139,25 @@ constexpr size_t kArrayLen = 0x00000018;
namespace ImageCopy_frag namespace ImageCopy_frag
{ {
enum flags enum DestFormat
{ {
kSrcIsArray = 0x00000001, kDestIsFloat = 0x00000000,
kDestIsSint = 0x00000001,
kDestIsUint = 0x00000002,
}; };
enum SrcFormat enum SrcFormat
{ {
kSrcIsFloat = 0x00000000, kSrcIsFloat = 0x00000000,
kSrcIsSint = 0x00000002, kSrcIsSint = 0x00000004,
kSrcIsUint = 0x00000004, kSrcIsUint = 0x00000008,
}; };
enum DestFormat enum SrcType
{ {
kDestIsFloat = 0x00000000, kSrcIs2D = 0x00000000,
kDestIsSint = 0x00000008, kSrcIs2DArray = 0x00000010,
kDestIsUint = 0x00000010, kSrcIs3D = 0x00000020,
}; };
constexpr size_t kArrayLen = 0x00000016; constexpr size_t kArrayLen = 0x0000002B;
} // namespace ImageCopy_frag } // namespace ImageCopy_frag
namespace OverlayCull_comp namespace OverlayCull_comp
......
...@@ -182,10 +182,65 @@ class CopyTexture3DTest : public ANGLETest ...@@ -182,10 +182,65 @@ class CopyTexture3DTest : public ANGLETest
if (renderType == GL_RGBA8) 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; GLColor actual;
glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R); glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
EXPECT_COLOR_NEAR(expectedColor, actual, 1); EXPECT_COLOR_NEAR(expectedColor, actual, tolerance);
return; return;
} }
else if (renderType == GL_RGBA32F) else if (renderType == GL_RGBA32F)
...@@ -655,15 +710,15 @@ void CopyTexture3DTest::testUnsignedByteFormats(const GLenum testTarget) ...@@ -655,15 +710,15 @@ void CopyTexture3DTest::testUnsignedByteFormats(const GLenum testTarget)
GLColor(244, 148, 78, 255)); GLColor(244, 148, 78, 255));
testCopy(testTarget, kColorPreAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, true, false, testCopy(testTarget, kColorPreAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, true, false,
GLColor(31, 19, 11, 255)); GLColor(31, 19, 11, 255));
testCopy(testTarget, kColorUnAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, false, true, testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,
GLColor(52, 253, 53, 255)); true, GLColor(49, 120, 228, 255));
testCopy(testTarget, kColorNoAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, false, testCopy(testTarget, kColorNoAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, false,
GLColor(244, 148, 78, 100)); GLColor(244, 148, 78, 100));
testCopy(testTarget, kColorPreAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, true, false, testCopy(testTarget, kColorPreAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, true, false,
GLColor(31, 19, 11, 100)); GLColor(31, 19, 11, 100));
testCopy(testTarget, kColorUnAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, true, testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
GLColor(52, 253, 53, 100)); false, true, GLColor(49, 120, 228, 210));
testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false, testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
false, false, GLColor(247, 198, 148, 255)); false, false, GLColor(247, 198, 148, 255));
...@@ -768,6 +823,10 @@ void CopyTexture3DTest::testFloatFormats(const GLenum testTarget) ...@@ -768,6 +823,10 @@ void CopyTexture3DTest::testFloatFormats(const GLenum testTarget)
GLColor(227, 217, 161, 255)); GLColor(227, 217, 161, 255));
} }
// TODO: Vulkan's CPU-path implementation doesn't handle 2DArray textures correctly yet.
// http://anglebug.com/4744
if (!(IsVulkan() && testTarget == GL_TEXTURE_2D_ARRAY))
{
if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV) if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
{ {
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false, testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false,
...@@ -778,6 +837,7 @@ void CopyTexture3DTest::testFloatFormats(const GLenum testTarget) ...@@ -778,6 +837,7 @@ void CopyTexture3DTest::testFloatFormats(const GLenum testTarget)
GLColor(227, 217, 161, 255)); GLColor(227, 217, 161, 255));
} }
} }
}
testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, false, GLColor(210, 0, 0, 255)); testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, false, GLColor(210, 0, 0, 255));
testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, true, false, GLColor(191, 0, 0, 255)); testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, true, false, GLColor(191, 0, 0, 255));
...@@ -809,6 +869,9 @@ TEST_P(Texture3DCopy, FloatFormats) ...@@ -809,6 +869,9 @@ TEST_P(Texture3DCopy, FloatFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); ANGLE_SKIP_TEST_IF(!checkExtensions());
// http://anglebug.com/4756
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
testFloatFormats(GL_TEXTURE_3D); testFloatFormats(GL_TEXTURE_3D);
} }
...@@ -878,6 +941,10 @@ TEST_P(Texture3DCopy, IntFormats) ...@@ -878,6 +941,10 @@ TEST_P(Texture3DCopy, IntFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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[] = constexpr char kFS[] =
"#version 300 es\n" "#version 300 es\n"
"precision highp float;\n" "precision highp float;\n"
...@@ -1000,6 +1067,10 @@ TEST_P(Texture3DCopy, UintFormats) ...@@ -1000,6 +1067,10 @@ TEST_P(Texture3DCopy, UintFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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[] = constexpr char kFS[] =
"#version 300 es\n" "#version 300 es\n"
"precision highp float;\n" "precision highp float;\n"
...@@ -1153,6 +1224,9 @@ TEST_P(Texture2DArrayCopy, OffsetSubCopy) ...@@ -1153,6 +1224,9 @@ TEST_P(Texture2DArrayCopy, OffsetSubCopy)
int width = getWindowWidth() - 1; int width = getWindowWidth() - 1;
int height = getWindowHeight() - 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(0, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green); EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green); EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
...@@ -1221,6 +1295,9 @@ TEST_P(Texture2DArrayCopy, FlipY) ...@@ -1221,6 +1295,9 @@ TEST_P(Texture2DArrayCopy, FlipY)
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
drawQuad(mProgram, "position", 1.0f); 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, 0, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green); EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green); EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
...@@ -1233,6 +1310,10 @@ TEST_P(Texture2DArrayCopy, UnsizedFormats) ...@@ -1233,6 +1310,10 @@ TEST_P(Texture2DArrayCopy, UnsizedFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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); testUnsizedFormats(GL_TEXTURE_2D_ARRAY);
} }
...@@ -1242,6 +1323,10 @@ TEST_P(Texture2DArrayCopy, SnormFormats) ...@@ -1242,6 +1323,10 @@ TEST_P(Texture2DArrayCopy, SnormFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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); testSnormFormats(GL_TEXTURE_2D_ARRAY);
} }
...@@ -1254,6 +1339,10 @@ TEST_P(Texture2DArrayCopy, UnsignedByteFormats) ...@@ -1254,6 +1339,10 @@ TEST_P(Texture2DArrayCopy, UnsignedByteFormats)
// Flay on Windows D3D11. http://anglebug.com/2896 // Flay on Windows D3D11. http://anglebug.com/2896
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11()); 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); testUnsignedByteFormats(GL_TEXTURE_2D_ARRAY);
} }
...@@ -1263,6 +1352,10 @@ TEST_P(Texture2DArrayCopy, FloatFormats) ...@@ -1263,6 +1352,10 @@ TEST_P(Texture2DArrayCopy, FloatFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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); testFloatFormats(GL_TEXTURE_2D_ARRAY);
} }
...@@ -1272,6 +1365,10 @@ TEST_P(Texture2DArrayCopy, IntFormats) ...@@ -1272,6 +1365,10 @@ TEST_P(Texture2DArrayCopy, IntFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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[] = constexpr char kFS[] =
"#version 300 es\n" "#version 300 es\n"
"precision highp float;\n" "precision highp float;\n"
...@@ -1298,6 +1395,10 @@ TEST_P(Texture2DArrayCopy, UintFormats) ...@@ -1298,6 +1395,10 @@ TEST_P(Texture2DArrayCopy, UintFormats)
{ {
ANGLE_SKIP_TEST_IF(!checkExtensions()); 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[] = constexpr char kFS[] =
"#version 300 es\n" "#version 300 es\n"
"precision highp float;\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