Commit 1529c2ce by Nicolas Capens Committed by Nicolas Capens

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/17049Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 3c1d6cf2
......@@ -699,9 +699,9 @@ void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GL
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 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
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 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
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 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
if(width > 0 && height > 0)
{
egl::Image *renderTarget = source->getRenderTarget(0);
egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget)
{
......@@ -763,16 +755,8 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
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 @@ void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level,
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 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
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 @@ egl::Image *TextureCubeMap::getImage(GLenum face, unsigned int level)
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 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
if(width > 0 && height > 0)
{
egl::Image *renderTarget = source->getRenderTarget(0);
egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget)
{
......@@ -1426,16 +1402,8 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
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 @@ void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GL
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 @@ void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z,
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 @@ void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z,
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 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
if(width > 0 && height > 0)
{
egl::Image *renderTarget = source->getRenderTarget(0);
egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget)
{
......@@ -1766,16 +1727,8 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
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]);
......
......@@ -33,8 +33,6 @@ namespace gl { class Surface; }
namespace es2
{
class Framebuffer;
enum
{
IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,
......@@ -109,7 +107,7 @@ public:
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 @@ public:
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 @@ public:
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 @@ public:
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);
......
......@@ -1005,7 +1005,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
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 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
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 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
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 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs
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);
}
}
......
......@@ -749,7 +749,7 @@ GL_APICALL void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLin
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);
}
}
......
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