Creates helper function for common subimage param checking

TRAC #18802 Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/trunk@901 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 21f05d75
#define MAJOR_VERSION 1 #define MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#define BUILD_VERSION 0 #define BUILD_VERSION 0
#define BUILD_REVISION 900 #define BUILD_REVISION 901
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x) #define MACRO_STRINGIFY(x) STRINGIFY(x)
......
...@@ -53,6 +53,41 @@ bool validImageSize(GLint level, GLsizei width, GLsizei height) ...@@ -53,6 +53,41 @@ bool validImageSize(GLint level, GLsizei width, GLsizei height)
return false; return false;
} }
bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLint level, GLenum format, gl::Texture *texture)
{
if (!texture)
{
return error(GL_INVALID_OPERATION, false);
}
if (compressed != texture->isCompressed())
{
return error(GL_INVALID_OPERATION, false);
}
if (format != GL_NONE && format != texture->getInternalFormat())
{
return error(GL_INVALID_OPERATION, false);
}
if (compressed)
{
if ((width % 4 != 0 && width != texture->getWidth(0)) ||
(height % 4 != 0 && height != texture->getHeight(0)))
{
return error(GL_INVALID_OPERATION, false);
}
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{
return error(GL_INVALID_VALUE, false);
}
return true;
}
// check for combinations of format and type that are valid for ReadPixels // check for combinations of format and type that are valid for ReadPixels
bool validReadFormatType(GLenum format, GLenum type) bool validReadFormatType(GLenum format, GLenum type)
{ {
...@@ -1025,58 +1060,18 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs ...@@ -1025,58 +1060,18 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs
if (target == GL_TEXTURE_2D) if (target == GL_TEXTURE_2D)
{ {
gl::Texture2D *texture = context->getTexture2D(); gl::Texture2D *texture = context->getTexture2D();
if (validateSubImageParams(true, width, height, xoffset, yoffset, level, GL_NONE, texture))
if (!texture)
{ {
return error(GL_INVALID_OPERATION); texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
}
if (!texture->isCompressed())
{
return error(GL_INVALID_OPERATION);
}
if ((width % 4 != 0 && width != texture->getWidth(0)) ||
(height % 4 != 0 && height != texture->getHeight(0)))
{
return error(GL_INVALID_OPERATION);
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{
return error(GL_INVALID_VALUE);
} }
texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
} }
else if (gl::IsCubemapTextureTarget(target)) else if (gl::IsCubemapTextureTarget(target))
{ {
gl::TextureCubeMap *texture = context->getTextureCubeMap(); gl::TextureCubeMap *texture = context->getTextureCubeMap();
if (validateSubImageParams(true, width, height, xoffset, yoffset, level, GL_NONE, texture))
if (!texture)
{
return error(GL_INVALID_OPERATION);
}
if (!texture->isCompressed())
{
return error(GL_INVALID_OPERATION);
}
if ((width % 4 != 0 && width != texture->getWidth(0)) ||
(height % 4 != 0 && height != texture->getHeight(0)))
{
return error(GL_INVALID_OPERATION);
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{ {
return error(GL_INVALID_VALUE); texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
} }
texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
} }
else else
{ {
...@@ -1337,15 +1332,9 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL ...@@ -1337,15 +1332,9 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
} }
else UNREACHABLE(); else UNREACHABLE();
if (!texture) if (!validateSubImageParams(false, width, height, xoffset, yoffset, level, GL_NONE, texture))
{ {
return error(GL_INVALID_OPERATION); return; // error already registered by validateSubImageParams
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{
return error(GL_INVALID_VALUE);
} }
GLenum textureFormat = texture->getInternalFormat(); GLenum textureFormat = texture->getInternalFormat();
...@@ -5234,56 +5223,18 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint ...@@ -5234,56 +5223,18 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
if (target == GL_TEXTURE_2D) if (target == GL_TEXTURE_2D)
{ {
gl::Texture2D *texture = context->getTexture2D(); gl::Texture2D *texture = context->getTexture2D();
if (validateSubImageParams(false, width, height, xoffset, yoffset, level, format, texture))
if (!texture)
{ {
return error(GL_INVALID_OPERATION); texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
} }
if (texture->isCompressed())
{
return error(GL_INVALID_OPERATION);
}
if (format != texture->getInternalFormat())
{
return error(GL_INVALID_OPERATION);
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{
return error(GL_INVALID_VALUE);
}
texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
} }
else if (gl::IsCubemapTextureTarget(target)) else if (gl::IsCubemapTextureTarget(target))
{ {
gl::TextureCubeMap *texture = context->getTextureCubeMap(); gl::TextureCubeMap *texture = context->getTextureCubeMap();
if (validateSubImageParams(false, width, height, xoffset, yoffset, level, format, texture))
if (!texture)
{
return error(GL_INVALID_OPERATION);
}
if (texture->isCompressed())
{
return error(GL_INVALID_OPERATION);
}
if (format != texture->getInternalFormat())
{ {
return error(GL_INVALID_OPERATION); texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
} }
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
{
return error(GL_INVALID_VALUE);
}
texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
} }
else else
{ {
......
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