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);
}
}