diff options
author | Michel Dänzer <[email protected]> | 2013-02-05 17:24:51 +0100 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2013-02-07 19:07:43 +0100 |
commit | c093f12406d3e6e053ed1f6f9b552cd696053748 (patch) | |
tree | b946209aa2db83a5140751effb116b66d897d552 /src/gallium/drivers | |
parent | 23405ef4679301a36694ffecbeaef38e3c7650fa (diff) |
radeonsi: Handle scaled and integer formats for samplers and vertex elements.
Also, add assertions to stress that render targets don't support scaled
formats.
20 more little piglits.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index ee8b765f30b..74284690f04 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -1647,15 +1647,19 @@ static void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4, if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) ntype = V_028C70_NUMBER_SRGB; else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { - if (desc->channel[i].normalized) - ntype = V_028C70_NUMBER_SNORM; - else if (desc->channel[i].pure_integer) + if (desc->channel[i].pure_integer) { ntype = V_028C70_NUMBER_SINT; + } else { + assert(desc->channel[i].normalized); + ntype = V_028C70_NUMBER_SNORM; + } } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { - if (desc->channel[i].normalized) - ntype = V_028C70_NUMBER_UNORM; - else if (desc->channel[i].pure_integer) + if (desc->channel[i].pure_integer) { ntype = V_028C70_NUMBER_UINT; + } else { + assert(desc->channel[i].normalized); + ntype = V_028C70_NUMBER_UNORM; + } } } @@ -2116,16 +2120,31 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx first_non_void = util_format_get_first_non_void_channel(pipe_format); if (first_non_void < 0) { num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; - } else switch (desc->channel[first_non_void].type) { - case UTIL_FORMAT_TYPE_FLOAT: - num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; - break; - case UTIL_FORMAT_TYPE_SIGNED: - num_format = V_008F14_IMG_NUM_FORMAT_SNORM; - break; - case UTIL_FORMAT_TYPE_UNSIGNED: - default: + } else if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { + num_format = V_008F14_IMG_NUM_FORMAT_SRGB; + } else { num_format = V_008F14_IMG_NUM_FORMAT_UNORM; + + switch (desc->channel[first_non_void].type) { + case UTIL_FORMAT_TYPE_FLOAT: + num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; + break; + case UTIL_FORMAT_TYPE_SIGNED: + if (desc->channel[first_non_void].normalized) + num_format = V_008F14_IMG_NUM_FORMAT_SNORM; + else if (desc->channel[first_non_void].pure_integer) + num_format = V_008F14_IMG_NUM_FORMAT_SINT; + else + num_format = V_008F14_IMG_NUM_FORMAT_SSCALED; + break; + case UTIL_FORMAT_TYPE_UNSIGNED: + if (desc->channel[first_non_void].normalized) + num_format = V_008F14_IMG_NUM_FORMAT_UNORM; + else if (desc->channel[first_non_void].pure_integer) + num_format = V_008F14_IMG_NUM_FORMAT_UINT; + else + num_format = V_008F14_IMG_NUM_FORMAT_USCALED; + } } format = si_translate_texformat(ctx->screen, pipe_format, desc, first_non_void); @@ -2499,10 +2518,20 @@ static void *si_create_vertex_elements(struct pipe_context *ctx, num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */ break; case UTIL_FORMAT_TYPE_SIGNED: - num_format = V_008F0C_BUF_NUM_FORMAT_SNORM; + if (desc->channel[first_non_void].normalized) + num_format = V_008F0C_BUF_NUM_FORMAT_SNORM; + else if (desc->channel[i].pure_integer) + num_format = V_008F0C_BUF_NUM_FORMAT_SINT; + else + num_format = V_008F0C_BUF_NUM_FORMAT_SSCALED; break; case UTIL_FORMAT_TYPE_UNSIGNED: - num_format = V_008F0C_BUF_NUM_FORMAT_UNORM; + if (desc->channel[first_non_void].normalized) + num_format = V_008F0C_BUF_NUM_FORMAT_UNORM; + else if (desc->channel[i].pure_integer) + num_format = V_008F0C_BUF_NUM_FORMAT_UINT; + else + num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; break; case UTIL_FORMAT_TYPE_FLOAT: default: |