r300g: report vertex format support in is_format_supported

This commit is contained in:
Marek Olšák 2010-05-28 02:53:47 +02:00
parent f2e05acac9
commit ebe2b54663
5 changed files with 39 additions and 23 deletions

View File

@ -30,6 +30,8 @@
#define R300_RESOURCE_FLAG_TRANSFER PIPE_RESOURCE_FLAG_DRV_PRIV
#define R300_INVALID_FORMAT (~0)
/* XXX: this is just a bandaid on larger problems in
* r300_screen_buffer.h which doesn't seem to be fully ported to
* gallium-resources.

View File

@ -28,6 +28,7 @@
#include "r300_context.h"
#include "r300_texture.h"
#include "r300_screen_buffer.h"
#include "r300_state_inlines.h"
#include "r300_winsys.h"
/* Return the identifier behind whom the brave coders responsible for this
@ -248,6 +249,7 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
uint32_t retval = 0;
boolean is_r500 = r300_screen(screen)->caps.is_r500;
boolean is_r400 = r300_screen(screen)->caps.is_r400;
boolean is_rv350 = r300_screen(screen)->caps.is_rv350;
boolean is_z24 = format == PIPE_FORMAT_X8Z24_UNORM ||
format == PIPE_FORMAT_S8_USCALED_Z24_UNORM;
boolean is_color2101010 = format == PIPE_FORMAT_R10G10B10A2_UNORM ||
@ -258,6 +260,10 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
format == PIPE_FORMAT_RGTC1_SNORM;
boolean is_ati2n = format == PIPE_FORMAT_RGTC2_UNORM ||
format == PIPE_FORMAT_RGTC2_SNORM;
boolean is_half_float = format == PIPE_FORMAT_R16_FLOAT ||
format == PIPE_FORMAT_R16G16_FLOAT ||
format == PIPE_FORMAT_R16G16B16_FLOAT ||
format == PIPE_FORMAT_R16G16B16A16_FLOAT;
if (target >= PIPE_MAX_TEXTURE_TYPES) {
fprintf(stderr, "r300: Implementation error: Received bogus texture "
@ -301,6 +307,14 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
retval |= PIPE_BIND_DEPTH_STENCIL;
}
/* Check vertex buffer format support. */
if (usage & PIPE_BIND_VERTEX_BUFFER &&
/* Half float is supported on >= RV350. */
(is_rv350 || !is_half_float) &&
r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
retval |= PIPE_BIND_VERTEX_BUFFER;
}
return retval == usage;
}

View File

@ -1250,8 +1250,15 @@ static void r300_vertex_psc(struct r300_vertex_element_state *velems)
for (i = 0; i < velems->count; i++) {
format = velems->velem[i].src_format;
type = r300_translate_vertex_data_type(format) |
(i << R300_DST_VEC_LOC_SHIFT);
type = r300_translate_vertex_data_type(format);
if (type == R300_INVALID_FORMAT) {
fprintf(stderr, "r300: Bad vertex format %s.\n",
util_format_short_name(format));
assert(0);
abort();
}
type |= i << R300_DST_VEC_LOC_SHIFT;
swizzle = r300_translate_vertex_data_swizzle(format);
if (i & 1) {

View File

@ -154,8 +154,15 @@ static void r300_swtcl_vertex_psc(struct r300_context *r300)
format = draw_translate_vinfo_format(vinfo->attrib[i].emit);
/* Obtain the type of data in this attribute. */
type = r300_translate_vertex_data_type(format) |
vs_output_tab[i] << R300_DST_VEC_LOC_SHIFT;
type = r300_translate_vertex_data_type(format);
if (type == R300_INVALID_FORMAT) {
fprintf(stderr, "r300: Bad vertex format %s.\n",
util_format_short_name(format));
assert(0);
abort();
}
type |= vs_output_tab[i] << R300_DST_VEC_LOC_SHIFT;
/* Obtain the swizzle for this attribute. Note that the default
* swizzle in the hardware is not XYZW! */

View File

@ -371,10 +371,7 @@ r300_translate_vertex_data_type(enum pipe_format format) {
desc = util_format_description(format);
if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
fprintf(stderr, "r300: Bad format %s in %s:%d\n", util_format_short_name(format),
__FUNCTION__, __LINE__);
assert(0);
abort();
return R300_INVALID_FORMAT;
}
switch (desc->channel[0].type) {
@ -382,7 +379,7 @@ r300_translate_vertex_data_type(enum pipe_format format) {
case UTIL_FORMAT_TYPE_FLOAT:
switch (desc->channel[0].size) {
case 16:
/* XXX Supported only on RV350 and later. */
/* Supported only on RV350 and later. */
if (desc->nr_channels > 2) {
result = R300_DATA_TYPE_FLT16_4;
} else {
@ -393,10 +390,7 @@ r300_translate_vertex_data_type(enum pipe_format format) {
result = R300_DATA_TYPE_FLOAT_1 + (desc->nr_channels - 1);
break;
default:
fprintf(stderr, "r300: Bad format %s in %s:%d\n",
util_format_short_name(format), __FUNCTION__, __LINE__);
assert(0);
abort();
return R300_INVALID_FORMAT;
}
break;
/* Unsigned ints */
@ -415,19 +409,11 @@ r300_translate_vertex_data_type(enum pipe_format format) {
}
break;
default:
fprintf(stderr, "r300: Bad format %s in %s:%d\n",
util_format_short_name(format), __FUNCTION__, __LINE__);
fprintf(stderr, "r300: desc->channel[0].size == %d\n",
desc->channel[0].size);
assert(0);
abort();
return R300_INVALID_FORMAT;
}
break;
default:
fprintf(stderr, "r300: Bad format %s in %s:%d\n",
util_format_short_name(format), __FUNCTION__, __LINE__);
assert(0);
abort();
return R300_INVALID_FORMAT;
}
if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {