summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r600/r600_state_inlines.h
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-10-01 13:09:09 +1000
committerDave Airlie <airlied@redhat.com>2010-10-01 13:36:56 +1000
commitd662195f00fe60349cdda368eeb065910764842f (patch)
tree667cd52ad6656d5cdb05eae4f106d8eb302c57d1 /src/gallium/drivers/r600/r600_state_inlines.h
parente973221538d5edfad62abedf5b37a4fb774d71fc (diff)
r600g: fixup vertex format picking.
there are some vertex formats defined in r600c not in the docs.
Diffstat (limited to 'src/gallium/drivers/r600/r600_state_inlines.h')
-rw-r--r--src/gallium/drivers/r600/r600_state_inlines.h158
1 files changed, 135 insertions, 23 deletions
diff --git a/src/gallium/drivers/r600/r600_state_inlines.h b/src/gallium/drivers/r600/r600_state_inlines.h
index f41b6a0d7f..81f285027e 100644
--- a/src/gallium/drivers/r600/r600_state_inlines.h
+++ b/src/gallium/drivers/r600/r600_state_inlines.h
@@ -464,29 +464,6 @@ static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
}
}
-static INLINE void r600_translate_vertex_num_format(enum pipe_format format, uint32_t *num_format_p,
- uint32_t *format_comp_p)
-{
- uint32_t num_format = 0, format_comp = 0;
- switch (format) {
- case PIPE_FORMAT_R16G16B16A16_SSCALED:
- case PIPE_FORMAT_R16G16B16_SSCALED:
- case PIPE_FORMAT_R16G16_SSCALED:
- case PIPE_FORMAT_R32G32_SSCALED:
- format_comp = 1;
- case PIPE_FORMAT_R16G16B16A16_USCALED:
- case PIPE_FORMAT_R16G16B16_USCALED:
- case PIPE_FORMAT_R16G16_USCALED:
- case PIPE_FORMAT_R32G32_USCALED:
- num_format = V_038008_SQ_NUM_FORMAT_SCALED;
- break;
- default:
- break;
- }
- *num_format_p = num_format;
- *format_comp_p = format_comp;
-}
-
static INLINE boolean r600_is_sampler_format_supported(enum pipe_format format)
{
return r600_translate_texformat(format, NULL, NULL, NULL) != ~0;
@@ -508,4 +485,139 @@ static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
return r600_translate_colorformat(format) != ~0;
}
+static INLINE uint32_t r600_translate_vertex_data_type(enum pipe_format format)
+{
+ uint32_t result = 0;
+ const struct util_format_description *desc;
+ unsigned i;
+
+ desc = util_format_description(format);
+ if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
+ goto out_unknown;
+ }
+
+ /* Find the first non-VOID channel. */
+ for (i = 0; i < 4; i++) {
+ if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
+ break;
+ }
+ }
+
+ switch (desc->channel[i].type) {
+ /* Half-floats, floats, doubles */
+ case UTIL_FORMAT_TYPE_FLOAT:
+ switch (desc->channel[i].size) {
+ case 16:
+ switch (desc->nr_channels) {
+ case 1:
+ result = V_038008_FMT_16_FLOAT;
+ break;
+ case 2:
+ result = V_038008_FMT_16_16_FLOAT;
+ break;
+ case 3:
+ result = V_038008_FMT_16_16_16_FLOAT;
+ break;
+ case 4:
+ result = V_038008_FMT_16_16_16_16_FLOAT;
+ break;
+ }
+ break;
+ case 32:
+ switch (desc->nr_channels) {
+ case 1:
+ result = V_038008_FMT_32_FLOAT;
+ break;
+ case 2:
+ result = V_038008_FMT_32_32_FLOAT;
+ break;
+ case 3:
+ result = V_038008_FMT_32_32_32_FLOAT;
+ break;
+ case 4:
+ result = V_038008_FMT_32_32_32_32_FLOAT;
+ break;
+ }
+ break;
+ default:
+ goto out_unknown;
+ }
+ break;
+ /* Unsigned ints */
+ case UTIL_FORMAT_TYPE_UNSIGNED:
+ /* Signed ints */
+ case UTIL_FORMAT_TYPE_SIGNED:
+ switch (desc->channel[i].size) {
+ case 8:
+ switch (desc->nr_channels) {
+ case 1:
+ result = V_038008_FMT_8;
+ break;
+ case 2:
+ result = V_038008_FMT_8_8;
+ break;
+ case 3:
+ // result = V_038008_FMT_8_8_8; /* fails piglit draw-vertices test */
+ // break;
+ case 4:
+ result = V_038008_FMT_8_8_8_8;
+ break;
+ }
+ break;
+ case 16:
+ switch (desc->nr_channels) {
+ case 1:
+ result = V_038008_FMT_16;
+ break;
+ case 2:
+ result = V_038008_FMT_16_16;
+ break;
+ case 3:
+ // result = V_038008_FMT_16_16_16; /* fails piglit draw-vertices test */
+ // break;
+ case 4:
+ result = V_038008_FMT_16_16_16_16;
+ break;
+ }
+ break;
+ case 32:
+ switch (desc->nr_channels) {
+ case 1:
+ result = V_038008_FMT_32;
+ break;
+ case 2:
+ result = V_038008_FMT_32_32;
+ break;
+ case 3:
+ result = V_038008_FMT_32_32_32;
+ break;
+ case 4:
+ result = V_038008_FMT_32_32_32_32;
+ break;
+ }
+ break;
+ default:
+ goto out_unknown;
+ }
+ break;
+ default:
+ goto out_unknown;
+ }
+
+ result = S_038008_DATA_FORMAT(result);
+
+ if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
+ result |= S_038008_FORMAT_COMP_ALL(1);
+ }
+ if (desc->channel[i].normalized) {
+ result |= S_038008_NUM_FORMAT_ALL(0);
+ } else {
+ result |= S_038008_NUM_FORMAT_ALL(2);
+ }
+ return result;
+out_unknown:
+ R600_ERR("unsupported vertex format %s\n", util_format_name(format));
+ return ~0;
+}
+
#endif