On Sun, Mar 2, 2014 at 8:25 PM, Marek Olšák <mar...@gmail.com> wrote: > From: Marek Olšák <marek.ol...@amd.com> > > Also translate the Y__X swizzle.
For the series: Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> Candidate for the stable trees as part of the fix for srgb dark rendering? > --- > src/gallium/drivers/radeon/r600_pipe_common.h | 1 + > src/gallium/drivers/radeon/r600_texture.c | 54 ++++++++++++++++++++++++++ > src/gallium/drivers/radeon/r600d_common.h | 5 +++ > src/gallium/drivers/radeonsi/si_state.c | 56 > +-------------------------- > 4 files changed, 62 insertions(+), 54 deletions(-) > > diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h > b/src/gallium/drivers/radeon/r600_pipe_common.h > index 41af92d..2e545fc 100644 > --- a/src/gallium/drivers/radeon/r600_pipe_common.h > +++ b/src/gallium/drivers/radeon/r600_pipe_common.h > @@ -424,6 +424,7 @@ struct pipe_surface *r600_create_surface_custom(struct > pipe_context *pipe, > struct pipe_resource *texture, > const struct pipe_surface > *templ, > unsigned width, unsigned > height); > +unsigned r600_translate_colorswap(enum pipe_format format); > void r600_init_screen_texture_functions(struct r600_common_screen *rscreen); > void r600_init_context_texture_functions(struct r600_common_context *rctx); > > diff --git a/src/gallium/drivers/radeon/r600_texture.c > b/src/gallium/drivers/radeon/r600_texture.c > index b70b9f1..edb51a7 100644 > --- a/src/gallium/drivers/radeon/r600_texture.c > +++ b/src/gallium/drivers/radeon/r600_texture.c > @@ -1120,6 +1120,60 @@ static void r600_surface_destroy(struct pipe_context > *pipe, > FREE(surface); > } > > +unsigned r600_translate_colorswap(enum pipe_format format) > +{ > + const struct util_format_description *desc = > util_format_description(format); > + > +#define HAS_SWIZZLE(chan,swz) (desc->swizzle[chan] == > UTIL_FORMAT_SWIZZLE_##swz) > + > + if (format == PIPE_FORMAT_R11G11B10_FLOAT) /* isn't plain */ > + return V_0280A0_SWAP_STD; > + > + if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) > + return ~0U; > + > + switch (desc->nr_channels) { > + case 1: > + if (HAS_SWIZZLE(0,X)) > + return V_0280A0_SWAP_STD; /* X___ */ > + else if (HAS_SWIZZLE(3,X)) > + return V_0280A0_SWAP_ALT_REV; /* ___X */ > + break; > + case 2: > + if ((HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,Y)) || > + (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,NONE)) || > + (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,Y))) > + return V_0280A0_SWAP_STD; /* XY__ */ > + else if ((HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,X)) || > + (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,NONE)) || > + (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,X))) > + return V_0280A0_SWAP_STD_REV; /* YX__ */ > + else if (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(3,Y)) > + return V_0280A0_SWAP_ALT; /* X__Y */ > + else if (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(3,X)) > + return V_0280A0_SWAP_ALT_REV; /* Y__X */ > + break; > + case 3: > + if (HAS_SWIZZLE(0,X)) > + return V_0280A0_SWAP_STD; /* XYZ */ > + else if (HAS_SWIZZLE(0,Z)) > + return V_0280A0_SWAP_STD_REV; /* ZYX */ > + break; > + case 4: > + /* check the middle channels, the 1st and 4th channel can be > NONE */ > + if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z)) > + return V_0280A0_SWAP_STD; /* XYZW */ > + else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y)) > + return V_0280A0_SWAP_STD_REV; /* WZYX */ > + else if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,X)) > + return V_0280A0_SWAP_ALT; /* ZYXW */ > + else if (HAS_SWIZZLE(1,X) && HAS_SWIZZLE(2,Y)) > + return V_0280A0_SWAP_ALT_REV; /* WXYZ */ > + break; > + } > + return ~0U; > +} > + > void r600_init_screen_texture_functions(struct r600_common_screen *rscreen) > { > rscreen->b.resource_from_handle = r600_texture_from_handle; > diff --git a/src/gallium/drivers/radeon/r600d_common.h > b/src/gallium/drivers/radeon/r600d_common.h > index 357d26f..0b97d32 100644 > --- a/src/gallium/drivers/radeon/r600d_common.h > +++ b/src/gallium/drivers/radeon/r600d_common.h > @@ -116,6 +116,11 @@ > #define C_028B20_BUFFER_3_EN 0xFFFFFFF7 > #define R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 > 0x028AD0 > > +#define V_0280A0_SWAP_STD 0x00000000 > +#define V_0280A0_SWAP_ALT 0x00000001 > +#define V_0280A0_SWAP_STD_REV 0x00000002 > +#define V_0280A0_SWAP_ALT_REV 0x00000003 > + > /* EG+ */ > #define R_0084FC_CP_STRMOUT_CNTL 0x0084FC > #define S_0084FC_OFFSET_UPDATE_DONE(x) (((x) & 0x1) << 0) > diff --git a/src/gallium/drivers/radeonsi/si_state.c > b/src/gallium/drivers/radeonsi/si_state.c > index 45018a6..5591fb1 100644 > --- a/src/gallium/drivers/radeonsi/si_state.c > +++ b/src/gallium/drivers/radeonsi/si_state.c > @@ -905,58 +905,6 @@ static uint32_t si_translate_colorformat(enum > pipe_format format) > return V_028C70_COLOR_INVALID; > } > > -static uint32_t si_translate_colorswap(enum pipe_format format) > -{ > - const struct util_format_description *desc = > util_format_description(format); > - > -#define HAS_SWIZZLE(chan,swz) (desc->swizzle[chan] == > UTIL_FORMAT_SWIZZLE_##swz) > - > - if (format == PIPE_FORMAT_R11G11B10_FLOAT) /* isn't plain */ > - return V_028C70_SWAP_STD; > - > - if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) > - return ~0; > - > - switch (desc->nr_channels) { > - case 1: > - if (HAS_SWIZZLE(0,X)) > - return V_028C70_SWAP_STD; /* X___ */ > - else if (HAS_SWIZZLE(3,X)) > - return V_028C70_SWAP_ALT_REV; /* ___X */ > - break; > - case 2: > - if ((HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,Y)) || > - (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,NONE)) || > - (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,Y))) > - return V_028C70_SWAP_STD; /* XY__ */ > - else if ((HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,X)) || > - (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,NONE)) || > - (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,X))) > - return V_028C70_SWAP_STD_REV; /* YX__ */ > - else if (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(3,Y)) > - return V_028C70_SWAP_ALT; /* X__Y */ > - break; > - case 3: > - if (HAS_SWIZZLE(0,X)) > - return V_028C70_SWAP_STD; /* XYZ */ > - else if (HAS_SWIZZLE(0,Z)) > - return V_028C70_SWAP_STD_REV; /* ZYX */ > - break; > - case 4: > - /* check the middle channels, the 1st and 4th channel can be > NONE */ > - if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z)) > - return V_028C70_SWAP_STD; /* XYZW */ > - else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y)) > - return V_028C70_SWAP_STD_REV; /* WZYX */ > - else if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,X)) > - return V_028C70_SWAP_ALT; /* ZYXW */ > - else if (HAS_SWIZZLE(1,X) && HAS_SWIZZLE(2,Y)) > - return V_028C70_SWAP_ALT_REV; /* WXYZ */ > - break; > - } > - return ~0U; > -} > - > static uint32_t si_colorformat_endian_swap(uint32_t colorformat) > { > if (SI_BIG_ENDIAN) { > @@ -1473,7 +1421,7 @@ static bool si_is_vertex_format_supported(struct > pipe_screen *screen, enum pipe_ > static bool si_is_colorbuffer_format_supported(enum pipe_format format) > { > return si_translate_colorformat(format) != V_028C70_COLOR_INVALID && > - si_translate_colorswap(format) != ~0U; > + r600_translate_colorswap(format) != ~0U; > } > > static bool si_is_zs_format_supported(enum pipe_format format) > @@ -1641,7 +1589,7 @@ static void si_initialize_color_surface(struct > si_context *sctx, > R600_ERR("Invalid CB format: %d, disabling CB.\n", > surf->base.format); > } > assert(format != V_028C70_COLOR_INVALID); > - swap = si_translate_colorswap(surf->base.format); > + swap = r600_translate_colorswap(surf->base.format); > if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { > endian = V_028C70_ENDIAN_NONE; > } else { > -- > 1.8.3.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev