r600g: correctly report supported vertex formats

This commit is contained in:
Marek Olšák 2011-02-07 03:46:25 +01:00
parent c95bc1224a
commit a22bda9f80
3 changed files with 38 additions and 10 deletions

View file

@ -501,9 +501,4 @@ static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
return r600_translate_dbformat(format) != ~0;
}
static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
{
return r600_translate_colorformat(format) != ~0;
}
#endif

View file

@ -440,9 +440,14 @@ static boolean r600_is_format_supported(struct pipe_screen* screen,
retval |= PIPE_BIND_DEPTH_STENCIL;
}
if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
r600_is_vertex_format_supported(format))
retval |= PIPE_BIND_VERTEX_BUFFER;
if (usage & PIPE_BIND_VERTEX_BUFFER) {
struct r600_screen *rscreen = (struct r600_screen *)screen;
enum radeon_family family = r600_get_family(rscreen->radeon);
if (r600_is_vertex_format_supported(format, family)) {
retval |= PIPE_BIND_VERTEX_BUFFER;
}
}
if (usage & PIPE_BIND_TRANSFER_READ)
retval |= PIPE_BIND_TRANSFER_READ;

View file

@ -495,9 +495,37 @@ static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
return r600_translate_dbformat(format) != ~0;
}
static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format,
enum radeon_family family)
{
return r600_translate_colorformat(format) != ~0;
unsigned i;
const struct util_format_description *desc = util_format_description(format);
if (!desc)
return FALSE;
/* Find the first non-VOID channel. */
for (i = 0; i < 4; i++) {
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
break;
}
}
if (i == 4)
return FALSE;
/* No fixed, no double. */
if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN ||
desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED ||
(desc->channel[i].size == 64 &&
desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))
return FALSE;
/* No scaled/norm formats with 32 bits per channel. */
if (desc->channel[i].size == 32 &&
(desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED))
return FALSE;
return TRUE;
}
#endif