Allow depth and depth-stencil formats and types for textures and update utility functions

Trac #20875 Signed-off-by: Nicolas Capens TexImage2D accepts format,internalformat=DEPTH_COMPONENT, type=UNSIGNED_SHORT format,internalformat=DEPTH_COMPONENT, type=UNSIGNED_INT format,internalformat=DEPTH_STENCIL_OES, type=UNSIGNED_INT_24_8_OES TexSubImage2D accepts format=DEPTH_COMPONENT, type=UNSIGNED_SHORT format=DEPTH_COMPONENT, type=UNSIGNED_INT format=DEPTH_STENCIL_OES, type=UNSIGNED_INT_24_8_OES TexStorage2DEXT accepts internalformat=DEPTH_COMPONENT16 internalformat=DEPTH_COMPONENT32_OES internalformat=DEPTH24_STENCIL8_OES git-svn-id: https://angleproject.googlecode.com/svn/trunk@1104 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 1c49f79d
......@@ -5131,6 +5131,25 @@ void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GL
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
break;
case GL_DEPTH_COMPONENT:
switch (type)
{
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH_STENCIL_OES:
switch (type)
{
case GL_UNSIGNED_INT_24_8_OES:
break;
default:
return error(GL_INVALID_ENUM);
}
break;
default:
return error(GL_INVALID_VALUE);
}
......@@ -5211,6 +5230,13 @@ void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GL
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL_OES:
if (!context->supportsDepthTextures())
{
return error(GL_INVALID_VALUE);
}
break;
default:
break;
}
......@@ -5481,6 +5507,16 @@ void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalf
return error(GL_INVALID_ENUM);
}
break;
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT32_OES:
case GL_DEPTH24_STENCIL8_OES:
if (!context->supportsDepthTextures())
{
return error(GL_INVALID_ENUM);
}
break;
default:
break;
}
if (target == GL_TEXTURE_2D)
......@@ -5582,6 +5618,13 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint
return error(GL_INVALID_ENUM);
}
}
else if (gl::IsDepthTexture(format))
{
if (!context->supportsDepthTextures())
{
return error(GL_INVALID_ENUM);
}
}
if (target == GL_TEXTURE_2D)
{
......
......@@ -274,6 +274,17 @@ bool IsCompressed(GLenum format)
}
}
bool IsDepthTexture(GLenum format)
{
if (format == GL_DEPTH_COMPONENT ||
format == GL_DEPTH_STENCIL_OES)
{
return true;
}
return false;
}
// Returns the size, in bytes, of a single texel in an Image
int ComputePixelSize(GLenum format, GLenum type)
{
......@@ -294,7 +305,11 @@ int ComputePixelSize(GLenum format, GLenum type)
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT:
return sizeof(unsigned short);
case GL_UNSIGNED_INT:
case GL_UNSIGNED_INT_24_8_OES:
return sizeof(unsigned int);
case GL_FLOAT:
switch (format)
{
......@@ -375,6 +390,13 @@ bool CheckTextureFormatType(GLenum format, GLenum type)
case GL_UNSIGNED_SHORT_5_6_5:
return (format == GL_RGB);
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
return (format == GL_DEPTH_COMPONENT);
case GL_UNSIGNED_INT_24_8_OES:
return (format == GL_DEPTH_STENCIL_OES);
default:
return false;
}
......@@ -407,6 +429,9 @@ GLenum ExtractFormat(GLenum internalformat)
case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
case GL_BGRA8_EXT: return GL_BGRA_EXT;
case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
default: return GL_NONE; // Unsupported
}
}
......@@ -438,6 +463,9 @@ GLenum ExtractType(GLenum internalformat)
case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
default: return GL_NONE; // Unsupported
}
}
......
......@@ -39,6 +39,7 @@ GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment)
GLsizei ComputeCompressedPitch(GLsizei width, GLenum format);
GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format);
bool IsCompressed(GLenum format);
bool IsDepthTexture(GLenum format);
bool IsCubemapTextureTarget(GLenum target);
bool IsInternalTextureTarget(GLenum target);
bool CheckTextureFormatType(GLenum format, GLenum type);
......
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