From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_shader.c | 14 ++++++++++++--
 src/gallium/drivers/radeonsi/si_shader.h |  2 ++
 src/gallium/drivers/radeonsi/si_state.c  | 11 ++++++-----
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 5fb5f43..c6f33ee 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -485,32 +485,42 @@ static void declare_input_vs(
                                                    out[chan], ctx->f32, "");
                        out[chan] = LLVMBuildFMul(gallivm->builder, out[chan],
                                                  LLVMConstReal(ctx->f32, 1.0 / 
UINT_MAX), "");
                }
                /* RGBX UINT returns 1 in alpha, which would be rounded to 0 by 
normalizing. */
                if (fix_fetch == SI_FIX_FETCH_RGBX_32_UNORM)
                        out[3] = LLVMConstReal(ctx->f32, 1);
                break;
        case SI_FIX_FETCH_RGBA_32_SNORM:
        case SI_FIX_FETCH_RGBX_32_SNORM:
+       case SI_FIX_FETCH_RGBA_32_FIXED:
+       case SI_FIX_FETCH_RGBX_32_FIXED: {
+               double scale;
+               if (fix_fetch >= SI_FIX_FETCH_RGBA_32_FIXED)
+                       scale = 1.0 / 0x10000;
+               else
+                       scale = 1.0 / INT_MAX;
+
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = LLVMBuildBitCast(gallivm->builder, 
out[chan],
                                                     ctx->i32, "");
                        out[chan] = LLVMBuildSIToFP(gallivm->builder,
                                                    out[chan], ctx->f32, "");
                        out[chan] = LLVMBuildFMul(gallivm->builder, out[chan],
-                                                 LLVMConstReal(ctx->f32, 1.0 / 
INT_MAX), "");
+                                                 LLVMConstReal(ctx->f32, 
scale), "");
                }
                /* RGBX SINT returns 1 in alpha, which would be rounded to 0 by 
normalizing. */
-               if (fix_fetch == SI_FIX_FETCH_RGBX_32_SNORM)
+               if (fix_fetch == SI_FIX_FETCH_RGBX_32_SNORM ||
+                   fix_fetch == SI_FIX_FETCH_RGBX_32_FIXED)
                        out[3] = LLVMConstReal(ctx->f32, 1);
                break;
+       }
        case SI_FIX_FETCH_RGBA_32_USCALED:
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = LLVMBuildBitCast(gallivm->builder, 
out[chan],
                                                     ctx->i32, "");
                        out[chan] = LLVMBuildUIToFP(gallivm->builder,
                                                    out[chan], ctx->f32, "");
                }
                break;
        case SI_FIX_FETCH_RGBA_32_SSCALED:
                for (chan = 0; chan < 4; chan++) {
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 5e554d9..7584035 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -238,20 +238,22 @@ enum {
        SI_FIX_FETCH_NONE = 0,
        SI_FIX_FETCH_A2_SNORM,
        SI_FIX_FETCH_A2_SSCALED,
        SI_FIX_FETCH_A2_SINT,
        SI_FIX_FETCH_RGBA_32_UNORM,
        SI_FIX_FETCH_RGBX_32_UNORM,
        SI_FIX_FETCH_RGBA_32_SNORM,
        SI_FIX_FETCH_RGBX_32_SNORM,
        SI_FIX_FETCH_RGBA_32_USCALED,
        SI_FIX_FETCH_RGBA_32_SSCALED,
+       SI_FIX_FETCH_RGBA_32_FIXED,
+       SI_FIX_FETCH_RGBX_32_FIXED,
 };
 
 struct si_shader;
 
 /* A shader selector is a gallium CSO and contains shader variants and
  * binaries for one TGSI program. This can be shared by multiple contexts.
  */
 struct si_shader_selector {
        struct si_screen        *screen;
        struct util_queue_fence ready;
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index c8d1099..865a75d 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1690,31 +1690,26 @@ static unsigned si_tex_dim(unsigned res_target, 
unsigned view_target,
 static bool si_is_sampler_format_supported(struct pipe_screen *screen, enum 
pipe_format format)
 {
        return si_translate_texformat(screen, format, 
util_format_description(format),
                                      
util_format_get_first_non_void_channel(format)) != ~0U;
 }
 
 static uint32_t si_translate_buffer_dataformat(struct pipe_screen *screen,
                                               const struct 
util_format_description *desc,
                                               int first_non_void)
 {
-       unsigned type;
        int i;
 
        if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
                return V_008F0C_BUF_DATA_FORMAT_10_11_11;
 
        assert(first_non_void >= 0);
-       type = desc->channel[first_non_void].type;
-
-       if (type == UTIL_FORMAT_TYPE_FIXED)
-               return V_008F0C_BUF_DATA_FORMAT_INVALID;
 
        if (desc->nr_channels == 4 &&
            desc->channel[0].size == 10 &&
            desc->channel[1].size == 10 &&
            desc->channel[2].size == 10 &&
            desc->channel[3].size == 2)
                return V_008F0C_BUF_DATA_FORMAT_2_10_10_10;
 
        /* See whether the components are of the same size. */
        for (i = 0; i < desc->nr_channels; i++) {
@@ -1766,20 +1761,21 @@ static uint32_t si_translate_buffer_numformat(struct 
pipe_screen *screen,
                                              const struct 
util_format_description *desc,
                                              int first_non_void)
 {
        if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
                return V_008F0C_BUF_NUM_FORMAT_FLOAT;
 
        assert(first_non_void >= 0);
 
        switch (desc->channel[first_non_void].type) {
        case UTIL_FORMAT_TYPE_SIGNED:
+       case UTIL_FORMAT_TYPE_FIXED:
                if (desc->channel[first_non_void].size >= 32 ||
                    desc->channel[first_non_void].pure_integer)
                        return V_008F0C_BUF_NUM_FORMAT_SINT;
                else if (desc->channel[first_non_void].normalized)
                        return V_008F0C_BUF_NUM_FORMAT_SNORM;
                else
                        return V_008F0C_BUF_NUM_FORMAT_SSCALED;
                break;
        case UTIL_FORMAT_TYPE_UNSIGNED:
                if (desc->channel[first_non_void].size >= 32 ||
@@ -3359,20 +3355,25 @@ static void *si_create_vertex_elements(struct 
pipe_context *ctx,
                 */
                if (data_format == V_008F0C_BUF_DATA_FORMAT_2_10_10_10) {
                        if (num_format == V_008F0C_BUF_NUM_FORMAT_SNORM) {
                                v->fix_fetch |= (uint64_t)SI_FIX_FETCH_A2_SNORM 
<< (4 * i);
                        } else if (num_format == 
V_008F0C_BUF_NUM_FORMAT_SSCALED) {
                                v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_A2_SSCALED << (4 * i);
                        } else if (num_format == V_008F0C_BUF_NUM_FORMAT_SINT) {
                                /* This isn't actually used in OpenGL. */
                                v->fix_fetch |= (uint64_t)SI_FIX_FETCH_A2_SINT 
<< (4 * i);
                        }
+               } else if (channel->type == UTIL_FORMAT_TYPE_FIXED) {
+                       if (desc->swizzle[3] == PIPE_SWIZZLE_1)
+                               v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_RGBX_32_FIXED << (4 * i);
+                       else
+                               v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_RGBA_32_FIXED << (4 * i);
                } else if (channel->size == 32 && !channel->pure_integer) {
                        if (channel->type == UTIL_FORMAT_TYPE_SIGNED) {
                                if (channel->normalized) {
                                        if (desc->swizzle[3] == PIPE_SWIZZLE_1)
                                                v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_RGBX_32_SNORM << (4 * i);
                                        else
                                                v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_RGBA_32_SNORM << (4 * i);
                                } else {
                                        v->fix_fetch |= 
(uint64_t)SI_FIX_FETCH_RGBA_32_SSCALED << (4 * i);
                                }
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to