Fix the source buffer used by CopyTex[Sub]Image. We were passing the framebuffer to the texture's copying method, where the first render target was used, instead of the read buffer. Change-Id: I344b4082f675b7e5fc6a73af31a6764ab4d3b6a3 Reviewed-on: https://swiftshader-review.googlesource.com/17049 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp index 9b3a5f0..e6e5d63 100644 --- a/src/OpenGL/libGLESv2/Texture.cpp +++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -699,9 +699,9 @@ Texture::subImageCompressed(xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels, image[level]); } -void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) +void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -724,16 +724,8 @@ if(width != 0 && height != 0) { - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect(x, y, x + width, y + height, 0); - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); copy(renderTarget, sourceRect, 0, 0, 0, image[level]); } @@ -741,7 +733,7 @@ renderTarget->release(); } -void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) +void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) { if(!image[level]) { @@ -755,7 +747,7 @@ if(width > 0 && height > 0) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -763,16 +755,8 @@ return error(GL_OUT_OF_MEMORY); } - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect(x, y, x + width, y + height, 0); - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]); @@ -1345,9 +1329,9 @@ Texture::setImage(context, format, type, unpackInfo, pixels, image[face][level]); } -void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) +void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -1373,16 +1357,8 @@ if(width != 0 && height != 0) { - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect(x, y, x + width, y + height, 0); - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); copy(renderTarget, sourceRect, 0, 0, 0, image[face][level]); } @@ -1400,7 +1376,7 @@ return image[CubeFaceIndex(face)][level]; } -void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) +void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) { int face = CubeFaceIndex(target); @@ -1418,7 +1394,7 @@ if(width > 0 && height > 0) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -1426,16 +1402,8 @@ return error(GL_OUT_OF_MEMORY); } - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect(x, y, x + width, y + height, 0); - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[face][level]); @@ -1700,9 +1668,9 @@ Texture::subImageCompressed(xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels, image[level]); } -void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Framebuffer *source) +void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Renderbuffer *source) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -1725,17 +1693,10 @@ if(width != 0 && height != 0 && depth != 0) { - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect(x, y, x + width, y + height, z); - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); - for(GLint sliceZ = 0; sliceZ < depth; ++sliceZ, ++sourceRect.slice) + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); + + for(GLint sliceZ = 0; sliceZ < depth; sliceZ++, sourceRect.slice++) { copy(renderTarget, sourceRect, 0, 0, sliceZ, image[level]); } @@ -1744,7 +1705,7 @@ renderTarget->release(); } -void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) +void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) { if(!image[level]) { @@ -1758,7 +1719,7 @@ if(width > 0 && height > 0) { - egl::Image *renderTarget = source->getRenderTarget(0); + egl::Image *renderTarget = source->getRenderTarget(); if(!renderTarget) { @@ -1766,16 +1727,8 @@ return error(GL_OUT_OF_MEMORY); } - Renderbuffer* renderbuffer = source->getReadColorbuffer(); - - if(!renderbuffer) - { - ERR("Failed to retrieve the source colorbuffer."); - return; - } - sw::SliceRect sourceRect = {x, y, x + width, y + height, 0}; - sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); + sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight()); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]);
diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h index 026c75a..7bfa892 100644 --- a/src/OpenGL/libGLESv2/Texture.h +++ b/src/OpenGL/libGLESv2/Texture.h
@@ -33,8 +33,6 @@ namespace es2 { -class Framebuffer; - enum { IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS, @@ -109,7 +107,7 @@ virtual bool isShared(GLenum target, unsigned int level) const = 0; virtual void generateMipmaps() = 0; - virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; + virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) = 0; protected: ~Texture() override; @@ -166,8 +164,8 @@ void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); - void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); - void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) override; + void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); + void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override; void setSharedImage(egl::Image *image); @@ -233,8 +231,8 @@ void subImage(egl::Context *context, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); - void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); - void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) override; + void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); + void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override; bool isSamplerComplete() const override; bool isCompressed(GLenum target, GLint level) const override; @@ -294,8 +292,8 @@ void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); - void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Framebuffer *source); - void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); + void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Renderbuffer *source); + void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); void setSharedImage(egl::Image *image);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp index b39ff06..9908cbb 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.cpp +++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -1005,7 +1005,7 @@ return error(GL_INVALID_OPERATION); } - texture->copyImage(level, internalformat, x, y, width, height, framebuffer); + texture->copyImage(level, internalformat, x, y, width, height, source); } else if(es2::IsCubemapTextureTarget(target)) { @@ -1016,7 +1016,7 @@ return error(GL_INVALID_OPERATION); } - texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer); + texture->copyImage(target, level, internalformat, x, y, width, height, source); } else UNREACHABLE(target); } @@ -1084,7 +1084,7 @@ return error(validationError); } - texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer); + texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, source); } } @@ -6353,7 +6353,7 @@ return error(validationError); } - texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer); + texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, source); } }
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp index 12de6fb..0526254 100644 --- a/src/OpenGL/libGLESv2/libGLESv3.cpp +++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -749,7 +749,7 @@ return; } - texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer); + texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, source); } }