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 ...@@ -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]); 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) if(!renderTarget)
{ {
...@@ -724,16 +724,8 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -724,16 +724,8 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
if(width != 0 && height != 0) 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); 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]); copy(renderTarget, sourceRect, 0, 0, 0, image[level]);
} }
...@@ -741,7 +733,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei ...@@ -741,7 +733,7 @@ void Texture2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei
renderTarget->release(); 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]) if(!image[level])
{ {
...@@ -755,7 +747,7 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -755,7 +747,7 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
if(width > 0 && height > 0) if(width > 0 && height > 0)
{ {
egl::Image *renderTarget = source->getRenderTarget(0); egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget) if(!renderTarget)
{ {
...@@ -763,16 +755,8 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -763,16 +755,8 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
return error(GL_OUT_OF_MEMORY); 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); 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]); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]);
...@@ -1345,9 +1329,9 @@ void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint 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]); 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) if(!renderTarget)
{ {
...@@ -1373,16 +1357,8 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint ...@@ -1373,16 +1357,8 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint
if(width != 0 && height != 0) 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); 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]); copy(renderTarget, sourceRect, 0, 0, 0, image[face][level]);
} }
...@@ -1400,7 +1376,7 @@ egl::Image *TextureCubeMap::getImage(GLenum face, unsigned int level) ...@@ -1400,7 +1376,7 @@ egl::Image *TextureCubeMap::getImage(GLenum face, unsigned int level)
return image[CubeFaceIndex(face)][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); int face = CubeFaceIndex(target);
...@@ -1418,7 +1394,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi ...@@ -1418,7 +1394,7 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
if(width > 0 && height > 0) if(width > 0 && height > 0)
{ {
egl::Image *renderTarget = source->getRenderTarget(0); egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget) if(!renderTarget)
{ {
...@@ -1426,16 +1402,8 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi ...@@ -1426,16 +1402,8 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
return error(GL_OUT_OF_MEMORY); 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); 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]); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[face][level]);
...@@ -1700,9 +1668,9 @@ void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GL ...@@ -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]); 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) if(!renderTarget)
{ {
...@@ -1725,17 +1693,10 @@ void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, ...@@ -1725,17 +1693,10 @@ void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z,
if(width != 0 && height != 0 && depth != 0) 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); sw::SliceRect sourceRect(x, y, x + width, y + height, z);
sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight()); sourceRect.clip(0, 0, renderTarget->getWidth(), renderTarget->getHeight());
for(GLint sliceZ = 0; sliceZ < depth; ++sliceZ, ++sourceRect.slice)
for(GLint sliceZ = 0; sliceZ < depth; sliceZ++, sourceRect.slice++)
{ {
copy(renderTarget, sourceRect, 0, 0, sliceZ, image[level]); 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, ...@@ -1744,7 +1705,7 @@ void Texture3D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z,
renderTarget->release(); 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]) if(!image[level])
{ {
...@@ -1758,7 +1719,7 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1758,7 +1719,7 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
if(width > 0 && height > 0) if(width > 0 && height > 0)
{ {
egl::Image *renderTarget = source->getRenderTarget(0); egl::Image *renderTarget = source->getRenderTarget();
if(!renderTarget) if(!renderTarget)
{ {
...@@ -1766,16 +1727,8 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1766,16 +1727,8 @@ void Texture3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
return error(GL_OUT_OF_MEMORY); 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}; 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]); copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]);
......
...@@ -33,8 +33,6 @@ namespace gl { class Surface; } ...@@ -33,8 +33,6 @@ namespace gl { class Surface; }
namespace es2 namespace es2
{ {
class Framebuffer;
enum enum
{ {
IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS, IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,
...@@ -109,7 +107,7 @@ public: ...@@ -109,7 +107,7 @@ public:
virtual bool isShared(GLenum target, unsigned int level) const = 0; virtual bool isShared(GLenum target, unsigned int level) const = 0;
virtual void generateMipmaps() = 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: protected:
~Texture() override; ~Texture() override;
...@@ -166,8 +164,8 @@ public: ...@@ -166,8 +164,8 @@ public:
void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); 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 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 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 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, Framebuffer *source) override; 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); void setSharedImage(egl::Image *image);
...@@ -233,8 +231,8 @@ public: ...@@ -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 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 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 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, Framebuffer *source) override; 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 isSamplerComplete() const override;
bool isCompressed(GLenum target, GLint level) const override; bool isCompressed(GLenum target, GLint level) const override;
...@@ -294,8 +292,8 @@ public: ...@@ -294,8 +292,8 @@ public:
void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); 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 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 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 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, Framebuffer *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); void setSharedImage(egl::Image *image);
......
...@@ -1005,7 +1005,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, ...@@ -1005,7 +1005,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
return error(GL_INVALID_OPERATION); 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)) else if(es2::IsCubemapTextureTarget(target))
{ {
...@@ -1016,7 +1016,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, ...@@ -1016,7 +1016,7 @@ void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x,
return error(GL_INVALID_OPERATION); 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); else UNREACHABLE(target);
} }
...@@ -1084,7 +1084,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -1084,7 +1084,7 @@ void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
return error(validationError); 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 ...@@ -6353,7 +6353,7 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs
return error(validationError); 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 ...@@ -749,7 +749,7 @@ GL_APICALL void GL_APIENTRY glCopyTexSubImage3D(GLenum target, GLint level, GLin
return; 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