r300g: Prevent multiple-use textures from getting incorrectly approved.

This commit is contained in:
Corbin Simpson 2009-10-06 16:00:27 -07:00
parent 05fc9cdfdf
commit 36ccdf09b8
1 changed files with 17 additions and 5 deletions

View File

@ -182,16 +182,19 @@ static float r300_get_paramf(struct pipe_screen* pscreen, int param)
static boolean check_tex_2d_format(enum pipe_format format, uint32_t usage,
boolean is_r500)
{
uint32_t retval = 0;
switch (format) {
/* Supported formats. */
/* Colorbuffer */
case PIPE_FORMAT_A4R4G4B4_UNORM:
case PIPE_FORMAT_R5G6B5_UNORM:
case PIPE_FORMAT_A1R5G5B5_UNORM:
return usage &
retval = usage &
(PIPE_TEXTURE_USAGE_RENDER_TARGET |
PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
PIPE_TEXTURE_USAGE_PRIMARY);
break;
/* Texture */
case PIPE_FORMAT_A8R8G8B8_SRGB:
@ -201,7 +204,8 @@ static boolean check_tex_2d_format(enum pipe_format format, uint32_t usage,
case PIPE_FORMAT_DXT3_RGBA:
case PIPE_FORMAT_DXT5_RGBA:
case PIPE_FORMAT_YCBCR:
return usage & PIPE_TEXTURE_USAGE_SAMPLER;
retval = usage & PIPE_TEXTURE_USAGE_SAMPLER;
break;
/* Colorbuffer or texture */
case PIPE_FORMAT_A8R8G8B8_UNORM:
@ -209,19 +213,21 @@ static boolean check_tex_2d_format(enum pipe_format format, uint32_t usage,
case PIPE_FORMAT_R8G8B8A8_UNORM:
case PIPE_FORMAT_R8G8B8X8_UNORM:
case PIPE_FORMAT_I8_UNORM:
return usage &
retval = usage &
(PIPE_TEXTURE_USAGE_RENDER_TARGET |
PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
PIPE_TEXTURE_USAGE_PRIMARY |
PIPE_TEXTURE_USAGE_SAMPLER);
break;
/* Z buffer or texture */
case PIPE_FORMAT_Z16_UNORM:
/* Z buffer with stencil or texture */
case PIPE_FORMAT_Z24S8_UNORM:
return usage &
retval = usage &
(PIPE_TEXTURE_USAGE_DEPTH_STENCIL |
PIPE_TEXTURE_USAGE_SAMPLER);
break;
/* Definitely unsupported formats. */
/* Non-usable Z buffer/stencil formats. */
@ -259,7 +265,13 @@ static boolean check_tex_2d_format(enum pipe_format format, uint32_t usage,
break;
}
return FALSE;
/* If usage was a mask that contained multiple bits, and not all of them
* are supported, this will catch that and return FALSE.
* e.g. usage = 2 | 4; retval = 4; (retval >= usage) == FALSE
*
* This also returns FALSE for any unknown formats.
*/
return (retval >= usage);
}
/* XXX moar targets */