mesa: Don't report types for 0-sized components of textures.
The GL_TEXTURE_WHATEVER_SIZE entrypoints were checking if the specified base type of the texture allowed that channel to be present before reporting the size of the channel, so that GL_RGB didn't end up with an alpha size if the hardware driver had to store it that way. The GL_TEXTURE_WHATEVER_TYPE entrypoints weren't checking it, so you would end up with strange responses from the GL involving 0-bit floating-point alpha components in GL_RGB32F, even though it says GL_NONE as expected for other 0-sized channels. Make _TYPE check _BaseFormat the same as _SIZE, which results in fixing most of the GL_RGB* testcases of gl-3.0-required-sized-formats pass on i965. v2: Add a default case with a warning (suggestion by Brian Paul) Reviewed-by: Brian Paul <brianp@vmware.com> (v1)
This commit is contained in:
+69
-50
@@ -884,6 +884,70 @@ _mesa_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
|
||||
}
|
||||
|
||||
|
||||
static GLboolean
|
||||
base_format_has_channel(GLenum base_format, GLenum pname)
|
||||
{
|
||||
switch (pname) {
|
||||
case GL_TEXTURE_RED_SIZE:
|
||||
case GL_TEXTURE_RED_TYPE:
|
||||
if (base_format == GL_RED ||
|
||||
base_format == GL_RG ||
|
||||
base_format == GL_RGB ||
|
||||
base_format == GL_RGBA) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_GREEN_SIZE:
|
||||
case GL_TEXTURE_GREEN_TYPE:
|
||||
if (base_format == GL_RG ||
|
||||
base_format == GL_RGB ||
|
||||
base_format == GL_RGBA) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_BLUE_SIZE:
|
||||
case GL_TEXTURE_BLUE_TYPE:
|
||||
if (base_format == GL_RGB ||
|
||||
base_format == GL_RGBA) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_ALPHA_SIZE:
|
||||
case GL_TEXTURE_ALPHA_TYPE:
|
||||
if (base_format == GL_RGBA ||
|
||||
base_format == GL_ALPHA ||
|
||||
base_format == GL_LUMINANCE_ALPHA) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_LUMINANCE_SIZE:
|
||||
case GL_TEXTURE_LUMINANCE_TYPE:
|
||||
if (base_format == GL_LUMINANCE ||
|
||||
base_format == GL_LUMINANCE_ALPHA) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_INTENSITY_SIZE:
|
||||
case GL_TEXTURE_INTENSITY_TYPE:
|
||||
if (base_format == GL_INTENSITY) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
case GL_TEXTURE_DEPTH_SIZE:
|
||||
case GL_TEXTURE_DEPTH_TYPE:
|
||||
if (base_format == GL_DEPTH_STENCIL ||
|
||||
base_format == GL_DEPTH_COMPONENT) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
return GL_FALSE;
|
||||
default:
|
||||
_mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
|
||||
__FUNCTION__, pname);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
void GLAPIENTRY
|
||||
@@ -981,27 +1045,10 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
|
||||
*params = img->Border;
|
||||
break;
|
||||
case GL_TEXTURE_RED_SIZE:
|
||||
if (img->_BaseFormat == GL_RED) {
|
||||
*params = _mesa_get_format_bits(texFormat, pname);
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case GL_TEXTURE_GREEN_SIZE:
|
||||
if (img->_BaseFormat == GL_RG) {
|
||||
*params = _mesa_get_format_bits(texFormat, pname);
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case GL_TEXTURE_BLUE_SIZE:
|
||||
if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
|
||||
*params = _mesa_get_format_bits(texFormat, pname);
|
||||
else
|
||||
*params = 0;
|
||||
break;
|
||||
case GL_TEXTURE_ALPHA_SIZE:
|
||||
if (img->_BaseFormat == GL_ALPHA ||
|
||||
img->_BaseFormat == GL_LUMINANCE_ALPHA ||
|
||||
img->_BaseFormat == GL_RGBA)
|
||||
if (base_format_has_channel(img->_BaseFormat, pname))
|
||||
*params = _mesa_get_format_bits(texFormat, pname);
|
||||
else
|
||||
*params = 0;
|
||||
@@ -1067,46 +1114,18 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
|
||||
|
||||
/* GL_ARB_texture_float */
|
||||
case GL_TEXTURE_RED_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_RED_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_GREEN_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_GREEN_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_BLUE_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_BLUE_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_ALPHA_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_ALPHA_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_LUMINANCE_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_LUMINANCE_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_INTENSITY_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_INTENSITY_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
break;
|
||||
case GL_TEXTURE_DEPTH_TYPE_ARB:
|
||||
if (!ctx->Extensions.ARB_texture_float)
|
||||
goto invalid_pname;
|
||||
*params = _mesa_get_format_bits(texFormat, GL_TEXTURE_DEPTH_SIZE) ?
|
||||
_mesa_get_format_datatype(texFormat) : GL_NONE;
|
||||
if (base_format_has_channel(img->_BaseFormat, pname))
|
||||
*params = _mesa_get_format_datatype(texFormat);
|
||||
else
|
||||
*params = GL_NONE;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user