[Mesa-dev] [PATCH 1/3] radeonsi: move translate_colorswap to common code

Alex Deucher alexdeucher at gmail.com
Mon Mar 3 07:19:21 PST 2014


On Sun, Mar 2, 2014 at 8:25 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> Also translate the Y__X swizzle.

For the series:

Reviewed-by: Alex Deucher <alexander.deucher at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list