diff options
author | Dave Airlie <airlied@redhat.com> | 2010-10-01 13:09:09 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-10-01 13:36:56 +1000 |
commit | d662195f00fe60349cdda368eeb065910764842f (patch) | |
tree | 667cd52ad6656d5cdb05eae4f106d8eb302c57d1 /src/gallium/drivers/r600/r600_state_inlines.h | |
parent | e973221538d5edfad62abedf5b37a4fb774d71fc (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.h | 158 |
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 |