Make TextureCubeMap size/format/compressed checks explicit about the level and…

Make TextureCubeMap size/format/compressed checks explicit about the level and face they are checking Issue=306 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1082 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 92f49929
......@@ -163,22 +163,22 @@ IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
GLsizei RenderbufferTextureCubeMap::getWidth() const
{
return mTextureCubeMap->getWidth(0);
return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
}
GLsizei RenderbufferTextureCubeMap::getHeight() const
{
return mTextureCubeMap->getHeight(0);
return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
}
GLenum RenderbufferTextureCubeMap::getInternalFormat() const
{
return mTextureCubeMap->getInternalFormat();
return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
}
D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const
{
return mTextureCubeMap->getD3DFormat();
return mTextureCubeMap->getD3DFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
}
GLsizei RenderbufferTextureCubeMap::getSamples() const
......
......@@ -2483,30 +2483,36 @@ GLenum TextureCubeMap::getTarget() const
return GL_TEXTURE_CUBE_MAP;
}
GLsizei TextureCubeMap::getWidth(GLint level) const
GLsizei TextureCubeMap::getWidth(GLenum target, GLint level) const
{
if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[0][level].getWidth();
return mImageArray[faceIndex(target)][level].getWidth();
else
return 0;
}
GLsizei TextureCubeMap::getHeight(GLint level) const
GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const
{
if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[0][level].getHeight();
return mImageArray[faceIndex(target)][level].getHeight();
else
return 0;
}
GLenum TextureCubeMap::getInternalFormat() const
GLenum TextureCubeMap::getInternalFormat(GLenum target, GLint level) const
{
return mImageArray[0][0].getFormat();
if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[faceIndex(target)][level].getFormat();
else
return GL_NONE;
}
D3DFORMAT TextureCubeMap::getD3DFormat() const
D3DFORMAT TextureCubeMap::getD3DFormat(GLenum target, GLint level) const
{
return mImageArray[0][0].getD3DFormat();
if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[faceIndex(target)][level].getD3DFormat();
else
return D3DFMT_UNKNOWN;
}
void TextureCubeMap::setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
......@@ -2606,8 +2612,8 @@ bool TextureCubeMap::isSamplerComplete() const
return false;
}
if ((getInternalFormat() == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) ||
(getInternalFormat() == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16LinearFilter()))
if ((getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0) == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) ||
(getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0) == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16LinearFilter()))
{
if (mMagFilter != GL_NEAREST || (mMinFilter != GL_NEAREST && mMinFilter != GL_NEAREST_MIPMAP_NEAREST))
{
......@@ -2703,9 +2709,9 @@ bool TextureCubeMap::isMipmapCubeComplete() const
return true;
}
bool TextureCubeMap::isCompressed() const
bool TextureCubeMap::isCompressed(GLenum target, GLint level) const
{
return IsCompressed(getInternalFormat());
return IsCompressed(getInternalFormat(target, level));
}
IDirect3DBaseTexture9 *TextureCubeMap::getBaseTexture() const
......
......@@ -364,11 +364,11 @@ class TextureCubeMap : public Texture
virtual GLenum getTarget() const;
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLenum getInternalFormat() const;
D3DFORMAT getD3DFormat() const;
bool isCompressed() const;
GLsizei getWidth(GLenum target, GLint level) const;
GLsizei getHeight(GLenum target, GLint level) const;
GLenum getInternalFormat(GLenum target, GLint level) const;
D3DFORMAT getD3DFormat(GLenum target, GLint level) const;
bool isCompressed(GLenum target, GLint level) const;
void setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
void setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
......
......@@ -92,7 +92,7 @@ bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
}
bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
GLint xoffset, GLint yoffset, GLint level, GLenum format,
GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format,
gl::TextureCubeMap *texture)
{
if (!texture)
......@@ -100,27 +100,27 @@ bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
return error(GL_INVALID_OPERATION, false);
}
if (compressed != texture->isCompressed())
if (compressed != texture->isCompressed(target, level))
{
return error(GL_INVALID_OPERATION, false);
}
if (format != GL_NONE && format != texture->getInternalFormat())
if (format != GL_NONE && format != texture->getInternalFormat(target, level))
{
return error(GL_INVALID_OPERATION, false);
}
if (compressed)
{
if ((width % 4 != 0 && width != texture->getWidth(0)) ||
(height % 4 != 0 && height != texture->getHeight(0)))
if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
(height % 4 != 0 && height != texture->getHeight(target, 0)))
{
return error(GL_INVALID_OPERATION, false);
}
}
if (xoffset + width > texture->getWidth(level) ||
yoffset + height > texture->getHeight(level))
if (xoffset + width > texture->getWidth(target, level) ||
yoffset + height > texture->getHeight(target, level))
{
return error(GL_INVALID_VALUE, false);
}
......@@ -1141,7 +1141,7 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs
else if (gl::IsCubemapTextureTarget(target))
{
gl::TextureCubeMap *texture = context->getTextureCubeMap();
if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, level, format, texture))
if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, texture))
{
texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
}
......@@ -1411,11 +1411,11 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
{
gl::TextureCubeMap *texcube = context->getTextureCubeMap();
if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, GL_NONE, texcube))
if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, texcube))
{
return; // error already registered by validateSubImageParams
}
textureFormat = texcube->getInternalFormat();
textureFormat = texcube->getInternalFormat(target, level);
texture = texcube;
}
else UNREACHABLE();
......@@ -2381,7 +2381,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
return error(GL_INVALID_OPERATION);
}
gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
if (texcube->isCompressed())
if (texcube->isCompressed(textarget, level))
{
return error(GL_INVALID_OPERATION);
}
......@@ -2515,7 +2515,7 @@ void __stdcall glGenerateMipmap(GLenum target)
{
gl::TextureCubeMap *texcube = context->getTextureCubeMap();
if (texcube->isCompressed())
if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
{
return error(GL_INVALID_OPERATION);
}
......@@ -5594,7 +5594,7 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
else if (gl::IsCubemapTextureTarget(target))
{
gl::TextureCubeMap *texture = context->getTextureCubeMap();
if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, format, texture))
if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, texture))
{
texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
}
......
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