Commit e4458b7b by Jamie Madill Committed by Commit Bot

Fix glCopyTexSubImage3D.

Two bugs were present in our implementation. We were using the y offset for z in ensureSubImageInitialized. And for our D3D back-end we were potentially reading from the wrong image index. Bug: chromium:947342 Change-Id: If39671a911e08fcc641b9ba6f5910e3a2c16eb5d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1558671 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com>
parent a254fa28
...@@ -3726,10 +3726,11 @@ void Context::copyTexSubImage2D(TextureTarget target, ...@@ -3726,10 +3726,11 @@ void Context::copyTexSubImage2D(TextureTarget target,
Offset destOffset(xoffset, yoffset, 0); Offset destOffset(xoffset, yoffset, 0);
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
ImageIndex index = ImageIndex::MakeFromTarget(target, level);
Framebuffer *framebuffer = mState.getReadFramebuffer(); Framebuffer *framebuffer = mState.getReadFramebuffer();
Texture *texture = getTargetTexture(TextureTargetToType(target)); Texture *texture = getTargetTexture(TextureTargetToType(target));
ANGLE_CONTEXT_TRY( ANGLE_CONTEXT_TRY(texture->copySubImage(this, index, destOffset, sourceArea, framebuffer));
texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
} }
void Context::copyTexSubImage3D(TextureType target, void Context::copyTexSubImage3D(TextureType target,
...@@ -3753,10 +3754,11 @@ void Context::copyTexSubImage3D(TextureType target, ...@@ -3753,10 +3754,11 @@ void Context::copyTexSubImage3D(TextureType target,
Offset destOffset(xoffset, yoffset, zoffset); Offset destOffset(xoffset, yoffset, zoffset);
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
ImageIndex index = ImageIndex::MakeFromType(target, level, zoffset);
Framebuffer *framebuffer = mState.getReadFramebuffer(); Framebuffer *framebuffer = mState.getReadFramebuffer();
Texture *texture = getTargetTexture(target); Texture *texture = getTargetTexture(target);
ANGLE_CONTEXT_TRY(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level, ANGLE_CONTEXT_TRY(texture->copySubImage(this, index, destOffset, sourceArea, framebuffer));
destOffset, sourceArea, framebuffer));
} }
void Context::framebufferTexture2D(GLenum target, void Context::framebufferTexture2D(GLenum target,
......
...@@ -1147,24 +1147,22 @@ angle::Result Texture::copyImage(Context *context, ...@@ -1147,24 +1147,22 @@ angle::Result Texture::copyImage(Context *context,
} }
angle::Result Texture::copySubImage(Context *context, angle::Result Texture::copySubImage(Context *context,
TextureTarget target, const ImageIndex &index,
GLint level,
const Offset &destOffset, const Offset &destOffset,
const Rectangle &sourceArea, const Rectangle &sourceArea,
Framebuffer *source) Framebuffer *source)
{ {
ASSERT(TextureTargetToType(target) == mState.mType); ASSERT(TextureTargetToType(index.getTarget()) == mState.mType);
// Ensure source FBO is initialized. // Ensure source FBO is initialized.
ANGLE_TRY(source->ensureReadAttachmentInitialized(context, GL_COLOR_BUFFER_BIT)); ANGLE_TRY(source->ensureReadAttachmentInitialized(context, GL_COLOR_BUFFER_BIT));
Box destBox(destOffset.x, destOffset.y, destOffset.y, sourceArea.width, sourceArea.height, 1); Box destBox(destOffset.x, destOffset.y, destOffset.z, sourceArea.width, sourceArea.height, 1);
ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox)); ANGLE_TRY(
ensureSubImageInitialized(context, index.getTarget(), index.getLevelIndex(), destBox));
ImageIndex index = ImageIndex::MakeFromTarget(target, level);
ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source)); ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source));
ANGLE_TRY(handleMipmapGenerationHint(context, level)); ANGLE_TRY(handleMipmapGenerationHint(context, index.getLevelIndex()));
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -349,8 +349,7 @@ class Texture final : public RefCountObject, ...@@ -349,8 +349,7 @@ class Texture final : public RefCountObject,
GLenum internalFormat, GLenum internalFormat,
Framebuffer *source); Framebuffer *source);
angle::Result copySubImage(Context *context, angle::Result copySubImage(Context *context,
TextureTarget target, const ImageIndex &index,
GLint level,
const Offset &destOffset, const Offset &destOffset,
const Rectangle &sourceArea, const Rectangle &sourceArea,
Framebuffer *source); Framebuffer *source);
......
...@@ -512,6 +512,40 @@ TEST_P(CopyTexImageTestES3, ReadBufferIsNone) ...@@ -512,6 +512,40 @@ TEST_P(CopyTexImageTestES3, ReadBufferIsNone)
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
} }
// Test CopyTexImage3D with some simple parameters with a 2D array texture.
TEST_P(CopyTexImageTestES3, 2DArraySubImage)
{
// Seems to fail on AMD OpenGL Windows.
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() & IsWindows());
GLTexture tex;
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
constexpr GLsizei kTexSize = 4;
constexpr GLsizei kLayerOffset = 1;
constexpr GLsizei kLayers = 2;
// Clear screen to green.
glClearColor(0, 1, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
// Initialize a two-layer 2D array texture with red.
std::vector<GLColor> red(kTexSize * kTexSize * kLayers, GLColor::red);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, kTexSize, kTexSize, kLayers, 0, GL_RGBA,
GL_UNSIGNED_BYTE, red.data());
glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, kLayerOffset, 0, 0, kTexSize, kTexSize);
ASSERT_GL_NO_ERROR();
// Check level 0 (red from image data) and 1 (green from backbuffer clear).
GLFramebuffer fbo;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 1);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
ASSERT_GL_NO_ERROR();
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these // Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against. // tests should be run against.
ANGLE_INSTANTIATE_TEST(CopyTexImageTest, ANGLE_INSTANTIATE_TEST(CopyTexImageTest,
......
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