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() ...@@ -163,22 +163,22 @@ IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
GLsizei RenderbufferTextureCubeMap::getWidth() const GLsizei RenderbufferTextureCubeMap::getWidth() const
{ {
return mTextureCubeMap->getWidth(0); return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
} }
GLsizei RenderbufferTextureCubeMap::getHeight() const GLsizei RenderbufferTextureCubeMap::getHeight() const
{ {
return mTextureCubeMap->getHeight(0); return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
} }
GLenum RenderbufferTextureCubeMap::getInternalFormat() const GLenum RenderbufferTextureCubeMap::getInternalFormat() const
{ {
return mTextureCubeMap->getInternalFormat(); return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
} }
D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const
{ {
return mTextureCubeMap->getD3DFormat(); return mTextureCubeMap->getD3DFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
} }
GLsizei RenderbufferTextureCubeMap::getSamples() const GLsizei RenderbufferTextureCubeMap::getSamples() const
......
...@@ -2483,30 +2483,36 @@ GLenum TextureCubeMap::getTarget() const ...@@ -2483,30 +2483,36 @@ GLenum TextureCubeMap::getTarget() const
return GL_TEXTURE_CUBE_MAP; 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) if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[0][level].getWidth(); return mImageArray[faceIndex(target)][level].getWidth();
else else
return 0; return 0;
} }
GLsizei TextureCubeMap::getHeight(GLint level) const GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const
{ {
if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS) if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
return mImageArray[0][level].getHeight(); return mImageArray[faceIndex(target)][level].getHeight();
else else
return 0; 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) 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 ...@@ -2606,8 +2612,8 @@ bool TextureCubeMap::isSamplerComplete() const
return false; return false;
} }
if ((getInternalFormat() == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) || if ((getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0) == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) ||
(getInternalFormat() == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16LinearFilter())) (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)) if (mMagFilter != GL_NEAREST || (mMinFilter != GL_NEAREST && mMinFilter != GL_NEAREST_MIPMAP_NEAREST))
{ {
...@@ -2703,9 +2709,9 @@ bool TextureCubeMap::isMipmapCubeComplete() const ...@@ -2703,9 +2709,9 @@ bool TextureCubeMap::isMipmapCubeComplete() const
return true; 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 IDirect3DBaseTexture9 *TextureCubeMap::getBaseTexture() const
......
...@@ -364,11 +364,11 @@ class TextureCubeMap : public Texture ...@@ -364,11 +364,11 @@ class TextureCubeMap : public Texture
virtual GLenum getTarget() const; virtual GLenum getTarget() const;
GLsizei getWidth(GLint level) const; GLsizei getWidth(GLenum target, GLint level) const;
GLsizei getHeight(GLint level) const; GLsizei getHeight(GLenum target, GLint level) const;
GLenum getInternalFormat() const; GLenum getInternalFormat(GLenum target, GLint level) const;
D3DFORMAT getD3DFormat() const; D3DFORMAT getD3DFormat(GLenum target, GLint level) const;
bool isCompressed() 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 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); 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, ...@@ -92,7 +92,7 @@ bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
} }
bool validateSubImageParamsCube(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) gl::TextureCubeMap *texture)
{ {
if (!texture) if (!texture)
...@@ -100,27 +100,27 @@ bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height, ...@@ -100,27 +100,27 @@ bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
return error(GL_INVALID_OPERATION, false); return error(GL_INVALID_OPERATION, false);
} }
if (compressed != texture->isCompressed()) if (compressed != texture->isCompressed(target, level))
{ {
return error(GL_INVALID_OPERATION, false); 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); return error(GL_INVALID_OPERATION, false);
} }
if (compressed) if (compressed)
{ {
if ((width % 4 != 0 && width != texture->getWidth(0)) || if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
(height % 4 != 0 && height != texture->getHeight(0))) (height % 4 != 0 && height != texture->getHeight(target, 0)))
{ {
return error(GL_INVALID_OPERATION, false); return error(GL_INVALID_OPERATION, false);
} }
} }
if (xoffset + width > texture->getWidth(level) || if (xoffset + width > texture->getWidth(target, level) ||
yoffset + height > texture->getHeight(level)) yoffset + height > texture->getHeight(target, level))
{ {
return error(GL_INVALID_VALUE, false); return error(GL_INVALID_VALUE, false);
} }
...@@ -1141,7 +1141,7 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs ...@@ -1141,7 +1141,7 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs
else if (gl::IsCubemapTextureTarget(target)) else if (gl::IsCubemapTextureTarget(target))
{ {
gl::TextureCubeMap *texture = context->getTextureCubeMap(); 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); 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 ...@@ -1411,11 +1411,11 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
{ {
gl::TextureCubeMap *texcube = context->getTextureCubeMap(); 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 return; // error already registered by validateSubImageParams
} }
textureFormat = texcube->getInternalFormat(); textureFormat = texcube->getInternalFormat(target, level);
texture = texcube; texture = texcube;
} }
else UNREACHABLE(); else UNREACHABLE();
...@@ -2381,7 +2381,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t ...@@ -2381,7 +2381,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex); gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
if (texcube->isCompressed()) if (texcube->isCompressed(textarget, level))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -2515,7 +2515,7 @@ void __stdcall glGenerateMipmap(GLenum target) ...@@ -2515,7 +2515,7 @@ void __stdcall glGenerateMipmap(GLenum target)
{ {
gl::TextureCubeMap *texcube = context->getTextureCubeMap(); gl::TextureCubeMap *texcube = context->getTextureCubeMap();
if (texcube->isCompressed()) if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -5594,7 +5594,7 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint ...@@ -5594,7 +5594,7 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
else if (gl::IsCubemapTextureTarget(target)) else if (gl::IsCubemapTextureTarget(target))
{ {
gl::TextureCubeMap *texture = context->getTextureCubeMap(); 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); 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