radeonsi: Properly translate vertex format swizzle.
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 11 May 2012 09:52:16 +0000 (11:52 +0200)
committerMichel Dänzer <michel@daenzer.net>
Fri, 11 May 2012 09:54:58 +0000 (11:54 +0200)
egltri_screen works correctly!

src/gallium/drivers/radeonsi/evergreen_state.c
src/gallium/drivers/radeonsi/r600_state_common.c
src/gallium/drivers/radeonsi/radeonsi_pipe.h

index c7e4a13f583d61282d67973e8bb006e4583557ae..6d345b0679f212de3607a4c2be569d48704a3a6a 100644 (file)
@@ -1166,24 +1166,6 @@ static void si_delete_sampler_state(struct pipe_context *ctx,
        free(state);
 }
 
-static unsigned si_map_swizzle(unsigned swizzle)
-{
-       switch (swizzle) {
-       case UTIL_FORMAT_SWIZZLE_Y:
-               return V_008F1C_SQ_SEL_Y;
-       case UTIL_FORMAT_SWIZZLE_Z:
-               return V_008F1C_SQ_SEL_Z;
-       case UTIL_FORMAT_SWIZZLE_W:
-               return V_008F1C_SQ_SEL_W;
-       case UTIL_FORMAT_SWIZZLE_0:
-               return V_008F1C_SQ_SEL_0;
-       case UTIL_FORMAT_SWIZZLE_1:
-               return V_008F1C_SQ_SEL_1;
-       default: /* UTIL_FORMAT_SWIZZLE_X */
-               return V_008F1C_SQ_SEL_X;
-       }
-}
-
 static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_context *ctx,
                                                        struct pipe_resource *texture,
                                                        const struct pipe_sampler_view *state)
index ebed5b36730d8fd0c1ab36af8fc8712e322b6814..416c89048e6d70d53c51a9aca830fdb12612eb5c 100644 (file)
@@ -630,11 +630,10 @@ static void r600_vertex_buffer_update(struct r600_context *rctx)
                                  vertex_buffer->stride);
                else
                        ptr[2] = vertex_buffer->buffer->width0 - offset;
-               /* XXX: Hardcoding RGBA */
-               ptr[3] = (S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
-                         S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
-                         S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
-                         S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
+               ptr[3] = (S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
+                         S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
+                         S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
+                         S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
                          S_008F0C_NUM_FORMAT(num_format) |
                          S_008F0C_DATA_FORMAT(data_format));
 
index 64ddd5de25321acc09c76cb70cbaabcc59f3ba56..3077f068017146a8effaba2f56a54ae54e3531ab 100644 (file)
@@ -37,6 +37,7 @@
 #include "r600.h"
 #include "radeonsi_public.h"
 #include "r600_resource.h"
+#include "sid.h"
 
 #define R600_MAX_CONST_BUFFERS 1
 #define R600_MAX_CONST_BUFFER_SIZE 4096
@@ -467,6 +468,24 @@ static INLINE uint32_t S_FIXED(float value, uint32_t frac_bits)
 }
 #define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y))
 
+static INLINE unsigned si_map_swizzle(unsigned swizzle)
+{
+       switch (swizzle) {
+       case UTIL_FORMAT_SWIZZLE_Y:
+               return V_008F0C_SQ_SEL_Y;
+       case UTIL_FORMAT_SWIZZLE_Z:
+               return V_008F0C_SQ_SEL_Z;
+       case UTIL_FORMAT_SWIZZLE_W:
+               return V_008F0C_SQ_SEL_W;
+       case UTIL_FORMAT_SWIZZLE_0:
+               return V_008F0C_SQ_SEL_0;
+       case UTIL_FORMAT_SWIZZLE_1:
+               return V_008F0C_SQ_SEL_1;
+       default: /* UTIL_FORMAT_SWIZZLE_X */
+               return V_008F0C_SQ_SEL_X;
+       }
+}
+
 static inline unsigned r600_tex_aniso_filter(unsigned filter)
 {
        if (filter <= 1)   return 0;