Browse Source

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

tags/mesa_7_7_rc1
Corbin Simpson 16 years ago
parent
commit
36ccdf09b8
1 changed files with 17 additions and 5 deletions
  1. 17
    5
      src/gallium/drivers/r300/r300_screen.c

+ 17
- 5
src/gallium/drivers/r300/r300_screen.c 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 */

Loading…
Cancel
Save