Tracks sized internal formats for textures.

TRAC #21609 Signed-off-by: Daniel Koch Author: Shannon Woods <shannon.woods@transgaming.com> git-svn-id: https://angleproject.googlecode.com/svn/trunk@1301 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent c60c15c0
...@@ -2507,7 +2507,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2507,7 +2507,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment); GLsizei outputPitch = ComputePitch(width, ConvertSizedInternalFormat(format, type), mState.packAlignment);
// sized query sanity check // sized query sanity check
if (bufSize) if (bufSize)
{ {
......
...@@ -301,13 +301,14 @@ GLenum Framebuffer::completeness() ...@@ -301,13 +301,14 @@ GLenum Framebuffer::completeness()
} }
else if (IsInternalTextureTarget(mColorbufferType)) else if (IsInternalTextureTarget(mColorbufferType))
{ {
GLenum internalformat = colorbuffer->getInternalFormat(); GLint internalformat = colorbuffer->getInternalFormat();
GLenum format = gl::ExtractFormat(internalformat);
D3DFORMAT d3dformat = colorbuffer->getD3DFormat(); D3DFORMAT d3dformat = colorbuffer->getD3DFormat();
if (IsCompressed(internalformat) || if (IsCompressed(format) ||
internalformat == GL_ALPHA || format == GL_ALPHA ||
internalformat == GL_LUMINANCE || format == GL_LUMINANCE ||
internalformat == GL_LUMINANCE_ALPHA) format == GL_LUMINANCE_ALPHA)
{ {
return GL_FRAMEBUFFER_UNSUPPORTED; return GL_FRAMEBUFFER_UNSUPPORTED;
} }
......
...@@ -49,7 +49,7 @@ class Image ...@@ -49,7 +49,7 @@ class Image
Image(); Image();
~Image(); ~Image();
bool redefine(GLenum format, GLsizei width, GLsizei height, GLenum type, bool forceRelease); bool redefine(GLint internalformat, GLsizei width, GLsizei height, bool forceRelease);
void markDirty() {mDirty = true;} void markDirty() {mDirty = true;}
void markClean() {mDirty = false;} void markClean() {mDirty = false;}
...@@ -58,15 +58,14 @@ class Image ...@@ -58,15 +58,14 @@ class Image
GLsizei getWidth() const {return mWidth;} GLsizei getWidth() const {return mWidth;}
GLsizei getHeight() const {return mHeight;} GLsizei getHeight() const {return mHeight;}
GLenum getFormat() const {return mFormat;} GLenum getInternalFormat() const {return mInternalFormat;}
GLenum getType() const {return mType;}
bool isDirty() const {return mSurface && mDirty;} bool isDirty() const {return mSurface && mDirty;}
IDirect3DSurface9 *getSurface(); IDirect3DSurface9 *getSurface();
void setManagedSurface(IDirect3DSurface9 *surface); void setManagedSurface(IDirect3DSurface9 *surface);
void updateSurface(IDirect3DSurface9 *dest, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); void updateSurface(IDirect3DSurface9 *dest, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
void loadData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum type, void loadData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
GLint unpackAlignment, const void *input); GLint unpackAlignment, const void *input);
void loadAlphaData(GLsizei width, GLsizei height, void loadAlphaData(GLsizei width, GLsizei height,
...@@ -126,8 +125,7 @@ class Image ...@@ -126,8 +125,7 @@ class Image
GLsizei mWidth; GLsizei mWidth;
GLsizei mHeight; GLsizei mHeight;
GLenum mFormat; GLint mInternalFormat;
GLenum mType;
bool mDirty; bool mDirty;
...@@ -321,7 +319,7 @@ class Texture2D : public Texture ...@@ -321,7 +319,7 @@ class Texture2D : public Texture
bool isMipmapComplete() const; bool isMipmapComplete() const;
void redefineImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type); void redefineImage(GLint level, GLint internalformat, GLsizei width, GLsizei height);
void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
Image mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS]; Image mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
...@@ -416,7 +414,7 @@ class TextureCubeMap : public Texture ...@@ -416,7 +414,7 @@ class TextureCubeMap : public Texture
void setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); void setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height); void commitRect(int faceIndex, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
void redefineImage(int faceIndex, GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type); void redefineImage(int faceIndex, GLint level, GLint internalformat, GLsizei width, GLsizei height);
Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS]; Image mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
......
...@@ -229,22 +229,22 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig ...@@ -229,22 +229,22 @@ int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsig
return -1; return -1;
} }
GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment) GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
{ {
ASSERT(alignment > 0 && isPow2(alignment)); ASSERT(alignment > 0 && isPow2(alignment));
GLsizei rawPitch = ComputePixelSize(format, type) * width; GLsizei rawPitch = ComputePixelSize(internalformat) * width;
return (rawPitch + alignment - 1) & ~(alignment - 1); return (rawPitch + alignment - 1) & ~(alignment - 1);
} }
GLsizei ComputeCompressedPitch(GLsizei width, GLenum format) GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
{ {
return ComputeCompressedSize(width, 1, format); return ComputeCompressedSize(width, 1, internalformat);
} }
GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format) GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
{ {
switch (format) switch (internalformat)
{ {
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
...@@ -277,7 +277,10 @@ bool IsCompressed(GLenum format) ...@@ -277,7 +277,10 @@ bool IsCompressed(GLenum format)
bool IsDepthTexture(GLenum format) bool IsDepthTexture(GLenum format)
{ {
if (format == GL_DEPTH_COMPONENT || if (format == GL_DEPTH_COMPONENT ||
format == GL_DEPTH_STENCIL_OES) format == GL_DEPTH_STENCIL_OES ||
format == GL_DEPTH_COMPONENT16 ||
format == GL_DEPTH_COMPONENT32_OES ||
format == GL_DEPTH24_STENCIL8_OES)
{ {
return true; return true;
} }
...@@ -286,54 +289,29 @@ bool IsDepthTexture(GLenum format) ...@@ -286,54 +289,29 @@ bool IsDepthTexture(GLenum format)
} }
// Returns the size, in bytes, of a single texel in an Image // Returns the size, in bytes, of a single texel in an Image
int ComputePixelSize(GLenum format, GLenum type) int ComputePixelSize(GLint internalformat)
{ {
switch (type) switch (internalformat)
{ {
case GL_UNSIGNED_BYTE: case GL_ALPHA8_EXT: return sizeof(unsigned char);
switch (format) case GL_LUMINANCE8_EXT: return sizeof(unsigned char);
{ case GL_ALPHA32F_EXT: return sizeof(float);
case GL_ALPHA: return sizeof(unsigned char); case GL_LUMINANCE32F_EXT: return sizeof(float);
case GL_LUMINANCE: return sizeof(unsigned char); case GL_ALPHA16F_EXT: return sizeof(unsigned short);
case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2; case GL_LUMINANCE16F_EXT: return sizeof(unsigned short);
case GL_RGB: return sizeof(unsigned char) * 3; case GL_LUMINANCE8_ALPHA8_EXT: return sizeof(unsigned char) * 2;
case GL_RGBA: return sizeof(unsigned char) * 4; case GL_LUMINANCE_ALPHA32F_EXT: return sizeof(float) * 2;
case GL_BGRA_EXT: return sizeof(unsigned char) * 4; case GL_LUMINANCE_ALPHA16F_EXT: return sizeof(unsigned short) * 2;
default: UNREACHABLE(); case GL_RGB8_OES: return sizeof(unsigned char) * 3;
} case GL_RGB565: return sizeof(unsigned short);
break; case GL_RGB32F_EXT: return sizeof(float) * 3;
case GL_UNSIGNED_SHORT_4_4_4_4: case GL_RGB16F_EXT: return sizeof(unsigned short) * 3;
case GL_UNSIGNED_SHORT_5_5_5_1: case GL_RGBA8_OES: return sizeof(unsigned char) * 4;
case GL_UNSIGNED_SHORT_5_6_5: case GL_RGBA4: return sizeof(unsigned short);
case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: case GL_RGB5_A1: return sizeof(unsigned short);
case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: case GL_RGBA32F_EXT: return sizeof(float) * 4;
case GL_UNSIGNED_SHORT: case GL_RGBA16F_EXT: return sizeof(unsigned short) * 4;
return sizeof(unsigned short); case GL_BGRA8_EXT: return sizeof(unsigned char) * 4;
case GL_UNSIGNED_INT:
case GL_UNSIGNED_INT_24_8_OES:
return sizeof(unsigned int);
case GL_FLOAT:
switch (format)
{
case GL_ALPHA: return sizeof(float);
case GL_LUMINANCE: return sizeof(float);
case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
case GL_RGB: return sizeof(float) * 3;
case GL_RGBA: return sizeof(float) * 4;
default: UNREACHABLE();
}
break;
case GL_HALF_FLOAT_OES:
switch (format)
{
case GL_ALPHA: return sizeof(unsigned short);
case GL_LUMINANCE: return sizeof(unsigned short);
case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
case GL_RGB: return sizeof(unsigned short) * 3;
case GL_RGBA: return sizeof(unsigned short) * 4;
default: UNREACHABLE();
}
break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
...@@ -350,6 +328,94 @@ bool IsInternalTextureTarget(GLenum target) ...@@ -350,6 +328,94 @@ bool IsInternalTextureTarget(GLenum target)
return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
} }
GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
{
switch (format)
{
case GL_ALPHA:
switch (type)
{
case GL_UNSIGNED_BYTE: return GL_ALPHA8_EXT;
case GL_FLOAT: return GL_ALPHA32F_EXT;
case GL_HALF_FLOAT_OES: return GL_ALPHA16F_EXT;
default: UNIMPLEMENTED();
}
break;
case GL_LUMINANCE:
switch (type)
{
case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_EXT;
case GL_FLOAT: return GL_LUMINANCE32F_EXT;
case GL_HALF_FLOAT_OES: return GL_LUMINANCE16F_EXT;
default: UNIMPLEMENTED();
}
break;
case GL_LUMINANCE_ALPHA:
switch (type)
{
case GL_UNSIGNED_BYTE: return GL_LUMINANCE8_ALPHA8_EXT;
case GL_FLOAT: return GL_LUMINANCE_ALPHA32F_EXT;
case GL_HALF_FLOAT_OES: return GL_LUMINANCE_ALPHA16F_EXT;
default: UNIMPLEMENTED();
}
break;
case GL_RGB:
switch (type)
{
case GL_UNSIGNED_BYTE: return GL_RGB8_OES;
case GL_UNSIGNED_SHORT_5_6_5: return GL_RGB565;
case GL_FLOAT: return GL_RGB32F_EXT;
case GL_HALF_FLOAT_OES: return GL_RGB16F_EXT;
default: UNIMPLEMENTED();
}
break;
case GL_RGBA:
switch (type)
{
case GL_UNSIGNED_BYTE: return GL_RGBA8_OES;
case GL_UNSIGNED_SHORT_4_4_4_4: return GL_RGBA4;
case GL_UNSIGNED_SHORT_5_5_5_1: return GL_RGB5_A1;
case GL_FLOAT: return GL_RGBA32F_EXT;
case GL_HALF_FLOAT_OES: return GL_RGBA16F_EXT;
break;
default: UNIMPLEMENTED();
}
break;
case GL_BGRA_EXT:
switch (type)
{
// Are there sized internal formats for the packed BGRA types?
case GL_UNSIGNED_BYTE: return GL_BGRA8_EXT;
default: UNIMPLEMENTED();
}
break;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
return format;
case GL_DEPTH_COMPONENT:
switch (type)
{
case GL_UNSIGNED_SHORT: return GL_DEPTH_COMPONENT16;
case GL_UNSIGNED_INT: return GL_DEPTH_COMPONENT32_OES;
default: UNIMPLEMENTED();
}
break;
case GL_DEPTH_STENCIL_OES:
switch (type)
{
case GL_UNSIGNED_INT_24_8_OES: return GL_DEPTH24_STENCIL8_OES;
default: UNIMPLEMENTED();
}
break;
default:
UNIMPLEMENTED();
}
return GL_NONE;
}
GLenum ExtractFormat(GLenum internalformat) GLenum ExtractFormat(GLenum internalformat)
{ {
switch (internalformat) switch (internalformat)
......
...@@ -34,14 +34,15 @@ int VariableColumnCount(GLenum type); ...@@ -34,14 +34,15 @@ int VariableColumnCount(GLenum type);
int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize); int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
int ComputePixelSize(GLenum format, GLenum type); int ComputePixelSize(GLint internalformat);
GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment); GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment);
GLsizei ComputeCompressedPitch(GLsizei width, GLenum format); GLsizei ComputeCompressedPitch(GLsizei width, GLenum format);
GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format); GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format);
bool IsCompressed(GLenum format); bool IsCompressed(GLenum format);
bool IsDepthTexture(GLenum format); bool IsDepthTexture(GLenum format);
bool IsCubemapTextureTarget(GLenum target); bool IsCubemapTextureTarget(GLenum target);
bool IsInternalTextureTarget(GLenum target); bool IsInternalTextureTarget(GLenum target);
GLint ConvertSizedInternalFormat(GLenum format, GLenum type);
GLenum ExtractFormat(GLenum internalformat); GLenum ExtractFormat(GLenum internalformat);
GLenum ExtractType(GLenum internalformat); GLenum ExtractType(GLenum internalformat);
......
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