Commit 82bf0c5a by Jamie Madill

Use gl::Rectangle as a param to Image::copy.

BUG=angle:729 Change-Id: I13194760df35cb18db6ac43d567e6b393e838d56 Reviewed-on: https://chromium-review.googlesource.com/221268Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 00e5452a
......@@ -27,7 +27,7 @@ Image::Image()
mDirty = false;
}
void Image::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source)
void Image::copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &area, gl::Framebuffer *source)
{
gl::FramebufferAttachment *colorbuffer = source->getReadColorbuffer();
......@@ -38,7 +38,7 @@ void Image::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
RenderTarget *renderTarget = GetAttachmentRenderTarget(colorbuffer);
ASSERT(renderTarget);
copy(xoffset, yoffset, zoffset, x, y, width, height, renderTarget);
copy(xoffset, yoffset, zoffset, area, renderTarget);
}
}
......@@ -19,6 +19,7 @@
namespace gl
{
class Framebuffer;
struct Rectangle;
}
namespace rx
......@@ -51,8 +52,8 @@ class Image
virtual gl::Error loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
const void *input) = 0;
void copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderTarget *renderTarget) = 0;
void copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, gl::Framebuffer *source);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source) = 0;
protected:
GLsizei mWidth;
......
......@@ -549,9 +549,11 @@ void TextureD3D_2D::copyImage(GLenum target, GLint level, GLenum format, GLint x
GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
redefineImage(level, sizedInternalFormat, width, height);
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[level]->isRenderableFormat())
{
mImageArray[level]->copy(0, 0, 0, x, y, width, height, source);
mImageArray[level]->copy(0, 0, 0, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -561,12 +563,6 @@ void TextureD3D_2D::copyImage(GLenum target, GLint level, GLenum format, GLint x
if (width != 0 && height != 0 && isValidLevel(level))
{
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImage2D(source, sourceRect, format, 0, 0, mTexStorage, level);
}
}
......@@ -580,9 +576,11 @@ void TextureD3D_2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin
// the current level we're copying to is defined (with appropriate format, width & height)
bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0);
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[level]->isRenderableFormat() || (!mTexStorage && !canCreateRenderTarget))
{
mImageArray[level]->copy(xoffset, yoffset, 0, x, y, width, height, source);
mImageArray[level]->copy(xoffset, yoffset, 0, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -593,12 +591,6 @@ void TextureD3D_2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin
{
updateStorageLevel(level);
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImage2D(source, sourceRect,
gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
xoffset, yoffset, mTexStorage, level);
......@@ -1002,9 +994,11 @@ void TextureD3D_Cube::copyImage(GLenum target, GLint level, GLenum format, GLint
redefineImage(faceIndex, level, sizedInternalFormat, width, height);
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[faceIndex][level]->isRenderableFormat())
{
mImageArray[faceIndex][level]->copy(0, 0, 0, x, y, width, height, source);
mImageArray[faceIndex][level]->copy(0, 0, 0, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -1016,12 +1010,6 @@ void TextureD3D_Cube::copyImage(GLenum target, GLint level, GLenum format, GLint
if (width > 0 && isValidFaceLevel(faceIndex, level))
{
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImageCube(source, sourceRect, format, 0, 0, mTexStorage, target, level);
}
}
......@@ -1036,9 +1024,11 @@ void TextureD3D_Cube::copySubImage(GLenum target, GLint level, GLint xoffset, GL
// rely on the "getBaseLevel*" methods reliably otherwise.
bool canCreateRenderTarget = isFaceLevelComplete(faceIndex, level) && isCubeComplete();
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[faceIndex][level]->isRenderableFormat() || (!mTexStorage && !canCreateRenderTarget))
{
mImageArray[faceIndex][level]->copy(0, 0, 0, x, y, width, height, source);
mImageArray[faceIndex][level]->copy(0, 0, 0, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -1049,12 +1039,6 @@ void TextureD3D_Cube::copySubImage(GLenum target, GLint level, GLint xoffset, GL
{
updateStorageFaceLevel(faceIndex, level);
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImageCube(source, sourceRect, gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
xoffset, yoffset, mTexStorage, target, level);
}
......@@ -1565,9 +1549,11 @@ void TextureD3D_3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin
// the current level we're copying to is defined (with appropriate format, width & height)
bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0);
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[level]->isRenderableFormat() || (!mTexStorage && !canCreateRenderTarget))
{
mImageArray[level]->copy(xoffset, yoffset, zoffset, x, y, width, height, source);
mImageArray[level]->copy(xoffset, yoffset, zoffset, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -1578,12 +1564,6 @@ void TextureD3D_3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin
{
updateStorageLevel(level);
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImage3D(source, sourceRect,
gl::GetInternalFormatInfo(getBaseLevelInternalFormat()).format,
xoffset, yoffset, zoffset, mTexStorage, level);
......@@ -2036,9 +2016,11 @@ void TextureD3D_2DArray::copySubImage(GLenum target, GLint level, GLint xoffset,
// the current level we're copying to is defined (with appropriate format, width & height)
bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0);
gl::Rectangle sourceRect(x, y, width, height);
if (!mImageArray[level][0]->isRenderableFormat() || (!mTexStorage && !canCreateRenderTarget))
{
mImageArray[level][zoffset]->copy(xoffset, yoffset, 0, x, y, width, height, source);
mImageArray[level][zoffset]->copy(xoffset, yoffset, 0, sourceRect, source);
mDirtyImages = true;
}
else
......@@ -2049,12 +2031,6 @@ void TextureD3D_2DArray::copySubImage(GLenum target, GLint level, GLint xoffset,
{
updateStorageLevel(level);
gl::Rectangle sourceRect;
sourceRect.x = x;
sourceRect.width = width;
sourceRect.y = y;
sourceRect.height = height;
mRenderer->copyImage2DArray(source, sourceRect, gl::GetInternalFormatInfo(getInternalFormat(0)).format,
xoffset, yoffset, zoffset, mTexStorage, level);
}
......
......@@ -321,7 +321,7 @@ gl::Error Image11::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffse
return gl::Error(GL_NO_ERROR);
}
void Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderTarget *source)
void Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(source);
......@@ -376,10 +376,10 @@ void Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y
}
D3D11_BOX srcBox;
srcBox.left = x;
srcBox.right = x + width;
srcBox.top = y;
srcBox.bottom = y + height;
srcBox.left = sourceArea.x;
srcBox.right = sourceArea.x + sourceArea.width;
srcBox.top = sourceArea.y;
srcBox.bottom = sourceArea.y + sourceArea.height;
srcBox.front = 0;
srcBox.back = 1;
......@@ -405,8 +405,7 @@ void Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
gl::Rectangle area(x, y, width, height);
mRenderer->readTextureData(colorBufferTexture, subresourceIndex, area, formatInfo.format, formatInfo.type, mappedImage.RowPitch, gl::PixelPackState(), dataOffset);
mRenderer->readTextureData(colorBufferTexture, subresourceIndex, sourceArea, formatInfo.format, formatInfo.type, mappedImage.RowPitch, gl::PixelPackState(), dataOffset);
unmap();
}
......
......@@ -51,7 +51,7 @@ class Image11 : public ImageD3D
virtual gl::Error loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
const void *input);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderTarget *source);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source);
bool recoverFromAssociatedStorage();
bool isAssociatedStorageValid(TextureStorage11* textureStorage) const;
......
......@@ -466,7 +466,7 @@ gl::Error Image9::loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset
}
// This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures
void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, RenderTarget *source)
void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source)
{
ASSERT(source);
......@@ -512,8 +512,11 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
return gl::error(GL_OUT_OF_MEMORY);
}
RECT sourceRect = {x, y, x + width, y + height};
RECT destRect = {xoffset, yoffset, xoffset + width, yoffset + height};
int width = sourceArea.width;
int height = sourceArea.height;
RECT sourceRect = { sourceArea.x, sourceArea.y, sourceArea.x + width, sourceArea.y + height };
RECT destRect = { xoffset, yoffset, xoffset + width, yoffset + height };
D3DLOCKED_RECT sourceLock = {0};
result = renderTargetData->LockRect(&sourceLock, &sourceRect, 0);
......@@ -551,7 +554,7 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
{
case D3DFMT_X8R8G8B8:
case D3DFMT_A8R8G8B8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
memcpy(dest, source, 4 * width);
......@@ -560,9 +563,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_L8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
dest[x] = source[x * 4 + 2];
}
......@@ -572,9 +575,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_A8L8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
dest[x * 2 + 0] = source[x * 4 + 2];
dest[x * 2 + 1] = source[x * 4 + 3];
......@@ -592,9 +595,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
switch(getD3DFormat())
{
case D3DFMT_X8R8G8B8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned short rgb = ((unsigned short*)source)[x];
unsigned char red = (rgb & 0xF800) >> 8;
......@@ -611,9 +614,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_L8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned char red = source[x * 2 + 1] & 0xF8;
dest[x] = red | (red >> 5);
......@@ -628,12 +631,12 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_A1R5G5B5:
switch(getD3DFormat())
switch (getD3DFormat())
{
case D3DFMT_X8R8G8B8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned short argb = ((unsigned short*)source)[x];
unsigned char red = (argb & 0x7C00) >> 7;
......@@ -650,9 +653,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_A8R8G8B8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned short argb = ((unsigned short*)source)[x];
unsigned char red = (argb & 0x7C00) >> 7;
......@@ -670,9 +673,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_L8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned char red = source[x * 2 + 1] & 0x7C;
dest[x] = (red << 1) | (red >> 4);
......@@ -683,9 +686,9 @@ void Image9::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
}
break;
case D3DFMT_A8L8:
for(int y = 0; y < height; y++)
for (int y = 0; y < height; y++)
{
for(int x = 0; x < width; x++)
for (int x = 0; x < width; x++)
{
unsigned char red = source[x * 2 + 1] & 0x7C;
dest[x * 2 + 0] = (red << 1) | (red >> 4);
......
......@@ -54,7 +54,7 @@ class Image9 : public ImageD3D
virtual gl::Error loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
const void *input);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset,GLint x, GLint y, GLsizei width, GLsizei height, RenderTarget *source);
virtual void copy(GLint xoffset, GLint yoffset, GLint zoffset, const gl::Rectangle &sourceArea, RenderTarget *source);
private:
DISALLOW_COPY_AND_ASSIGN(Image9);
......
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