Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (C) 2013 Rob Clark <robclark@freedesktop.org>
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21.  * SOFTWARE.
  22.  *
  23.  */
  24.  
  25. #include "pipe/p_defines.h"
  26. #include "util/u_format.h"
  27.  
  28. #include "fd3_format.h"
  29.  
  30. /* Specifies the table of all the formats and their features. Also supplies
  31.  * the helpers that look up various data in those tables.
  32.  */
  33.  
  34. struct fd3_format {
  35.         enum a3xx_vtx_fmt vtx;
  36.         enum a3xx_tex_fmt tex;
  37.         enum a3xx_color_fmt rb;
  38.         enum a3xx_color_swap swap;
  39.         boolean present;
  40. };
  41.  
  42. #define RB_NONE ~0
  43.  
  44. /* vertex + texture */
  45. #define VT(pipe, fmt, rbfmt, swapfmt) \
  46.         [PIPE_FORMAT_ ## pipe] = { \
  47.                 .present = 1, \
  48.                 .vtx = VFMT_ ## fmt, \
  49.                 .tex = TFMT_ ## fmt, \
  50.                 .rb = RB_ ## rbfmt, \
  51.                 .swap = swapfmt \
  52.         }
  53.  
  54. /* texture-only */
  55. #define _T(pipe, fmt, rbfmt, swapfmt) \
  56.         [PIPE_FORMAT_ ## pipe] = { \
  57.                 .present = 1, \
  58.                 .vtx = ~0, \
  59.                 .tex = TFMT_ ## fmt, \
  60.                 .rb = RB_ ## rbfmt, \
  61.                 .swap = swapfmt \
  62.         }
  63.  
  64. /* vertex-only */
  65. #define V_(pipe, fmt, rbfmt, swapfmt) \
  66.         [PIPE_FORMAT_ ## pipe] = { \
  67.                 .present = 1, \
  68.                 .vtx = VFMT_ ## fmt, \
  69.                 .tex = ~0, \
  70.                 .rb = RB_ ## rbfmt, \
  71.                 .swap = swapfmt \
  72.         }
  73.  
  74. static struct fd3_format formats[PIPE_FORMAT_COUNT] = {
  75.         /* 8-bit */
  76.         VT(R8_UNORM,   8_UNORM, R8_UNORM, WZYX),
  77.         VT(R8_SNORM,   8_SNORM, NONE,     WZYX),
  78.         VT(R8_UINT,    8_UINT,  R8_UINT,  WZYX),
  79.         VT(R8_SINT,    8_SINT,  R8_SINT,  WZYX),
  80.         V_(R8_USCALED, 8_UINT,  NONE,     WZYX),
  81.         V_(R8_SSCALED, 8_UINT,  NONE,     WZYX),
  82.  
  83.         _T(A8_UNORM,   8_UNORM, A8_UNORM, WZYX),
  84.         _T(L8_UNORM,   8_UNORM, R8_UNORM, WZYX),
  85.         _T(I8_UNORM,   8_UNORM, NONE,     WZYX),
  86.  
  87.         _T(A8_UINT,    8_UINT,  NONE,     WZYX),
  88.         _T(A8_SINT,    8_SINT,  NONE,     WZYX),
  89.         _T(L8_UINT,    8_UINT,  NONE,     WZYX),
  90.         _T(L8_SINT,    8_SINT,  NONE,     WZYX),
  91.         _T(I8_UINT,    8_UINT,  NONE,     WZYX),
  92.         _T(I8_SINT,    8_SINT,  NONE,     WZYX),
  93.  
  94.         _T(S8_UINT,    8_UINT,  R8_UNORM, WZYX),
  95.  
  96.         /* 16-bit */
  97.         VT(R16_UNORM,   16_UNORM, NONE,     WZYX),
  98.         VT(R16_SNORM,   16_SNORM, NONE,     WZYX),
  99.         VT(R16_UINT,    16_UINT,  R16_UINT, WZYX),
  100.         VT(R16_SINT,    16_SINT,  R16_SINT, WZYX),
  101.         V_(R16_USCALED, 16_UINT,  NONE,     WZYX),
  102.         V_(R16_SSCALED, 16_UINT,  NONE,     WZYX),
  103.         VT(R16_FLOAT,   16_FLOAT, R16_FLOAT,WZYX),
  104.  
  105.         _T(A16_UINT,    16_UINT,  NONE,     WZYX),
  106.         _T(A16_SINT,    16_SINT,  NONE,     WZYX),
  107.         _T(L16_UINT,    16_UINT,  NONE,     WZYX),
  108.         _T(L16_SINT,    16_SINT,  NONE,     WZYX),
  109.         _T(I16_UINT,    16_UINT,  NONE,     WZYX),
  110.         _T(I16_SINT,    16_SINT,  NONE,     WZYX),
  111.  
  112.         VT(R8G8_UNORM,   8_8_UNORM, R8G8_UNORM, WZYX),
  113.         VT(R8G8_SNORM,   8_8_SNORM, R8G8_SNORM, WZYX),
  114.         VT(R8G8_UINT,    8_8_UINT,  NONE,       WZYX),
  115.         VT(R8G8_SINT,    8_8_SINT,  NONE,       WZYX),
  116.         V_(R8G8_USCALED, 8_8_UINT,  NONE,       WZYX),
  117.         V_(R8G8_SSCALED, 8_8_SINT,  NONE,       WZYX),
  118.  
  119.         _T(L8A8_UINT,    8_8_UINT,  NONE,       WZYX),
  120.         _T(L8A8_SINT,    8_8_SINT,  NONE,       WZYX),
  121.  
  122.         _T(Z16_UNORM,      Z16_UNORM,     R8G8_UNORM,     WZYX),
  123.         _T(B5G6R5_UNORM,   5_6_5_UNORM,   R5G6B5_UNORM,   WXYZ),
  124.         _T(B5G5R5A1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ),
  125.         _T(B5G5R5X1_UNORM, 5_5_5_1_UNORM, R5G5B5A1_UNORM, WXYZ),
  126.         _T(B4G4R4A4_UNORM, 4_4_4_4_UNORM, R4G4B4A4_UNORM, WXYZ),
  127.  
  128.         /* 24-bit */
  129.         V_(R8G8B8_UNORM,   8_8_8_UNORM, NONE, WZYX),
  130.         V_(R8G8B8_SNORM,   8_8_8_SNORM, NONE, WZYX),
  131.         V_(R8G8B8_UINT,    8_8_8_UINT,  NONE, WZYX),
  132.         V_(R8G8B8_SINT,    8_8_8_SINT,  NONE, WZYX),
  133.         V_(R8G8B8_USCALED, 8_8_8_UINT,  NONE, WZYX),
  134.         V_(R8G8B8_SSCALED, 8_8_8_SINT,  NONE, WZYX),
  135.  
  136.         /* 32-bit */
  137.         VT(R32_UINT,    32_UINT,  R32_UINT, WZYX),
  138.         VT(R32_SINT,    32_SINT,  R32_SINT, WZYX),
  139.         V_(R32_USCALED, 32_UINT,  NONE,     WZYX),
  140.         V_(R32_SSCALED, 32_UINT,  NONE,     WZYX),
  141.         VT(R32_FLOAT,   32_FLOAT, R32_FLOAT,WZYX),
  142.         V_(R32_FIXED,   32_FIXED, NONE,     WZYX),
  143.  
  144.         _T(A32_UINT,    32_UINT,  NONE,     WZYX),
  145.         _T(A32_SINT,    32_SINT,  NONE,     WZYX),
  146.         _T(L32_UINT,    32_UINT,  NONE,     WZYX),
  147.         _T(L32_SINT,    32_SINT,  NONE,     WZYX),
  148.         _T(I32_UINT,    32_UINT,  NONE,     WZYX),
  149.         _T(I32_SINT,    32_SINT,  NONE,     WZYX),
  150.  
  151.         VT(R16G16_UNORM,   16_16_UNORM, NONE,        WZYX),
  152.         VT(R16G16_SNORM,   16_16_SNORM, NONE,        WZYX),
  153.         VT(R16G16_UINT,    16_16_UINT,  R16G16_UINT, WZYX),
  154.         VT(R16G16_SINT,    16_16_SINT,  R16G16_SINT, WZYX),
  155.         V_(R16G16_USCALED, 16_16_UINT,  NONE,        WZYX),
  156.         V_(R16G16_SSCALED, 16_16_SINT,  NONE,        WZYX),
  157.         VT(R16G16_FLOAT,   16_16_FLOAT, R16G16_FLOAT,WZYX),
  158.  
  159.         _T(L16A16_UINT,    16_16_UINT,  NONE,        WZYX),
  160.         _T(L16A16_SINT,    16_16_SINT,  NONE,        WZYX),
  161.  
  162.         VT(R8G8B8A8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
  163.         _T(R8G8B8X8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
  164.         _T(R8G8B8A8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
  165.         _T(R8G8B8X8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WZYX),
  166.         VT(R8G8B8A8_SNORM,   8_8_8_8_SNORM, R8G8B8A8_SNORM, WZYX),
  167.         VT(R8G8B8A8_UINT,    8_8_8_8_UINT,  R8G8B8A8_UINT,  WZYX),
  168.         VT(R8G8B8A8_SINT,    8_8_8_8_SINT,  R8G8B8A8_SINT,  WZYX),
  169.         V_(R8G8B8A8_USCALED, 8_8_8_8_UINT,  NONE,           WZYX),
  170.         V_(R8G8B8A8_SSCALED, 8_8_8_8_SINT,  NONE,           WZYX),
  171.  
  172.         VT(B8G8R8A8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
  173.         _T(B8G8R8X8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
  174.         VT(B8G8R8A8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
  175.         _T(B8G8R8X8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, WXYZ),
  176.  
  177.         VT(A8B8G8R8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
  178.         _T(X8B8G8R8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
  179.         _T(A8B8G8R8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
  180.         _T(X8B8G8R8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, XYZW),
  181.  
  182.         VT(A8R8G8B8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
  183.         _T(X8R8G8B8_UNORM,   8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
  184.         _T(A8R8G8B8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
  185.         _T(X8R8G8B8_SRGB,    8_8_8_8_UNORM, R8G8B8A8_UNORM, ZYXW),
  186.  
  187.         VT(R10G10B10A2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WZYX),
  188.         VT(B10G10R10A2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WXYZ),
  189.         _T(B10G10R10X2_UNORM,   10_10_10_2_UNORM, R10G10B10A2_UNORM, WXYZ),
  190.         V_(R10G10B10A2_SNORM,   10_10_10_2_SNORM, NONE,              WZYX),
  191.         V_(R10G10B10A2_UINT,    10_10_10_2_UINT,  NONE,              WZYX),
  192.         V_(R10G10B10A2_USCALED, 10_10_10_2_UINT,  NONE,              WZYX),
  193.         V_(R10G10B10A2_SSCALED, 10_10_10_2_SINT,  NONE,              WZYX),
  194.  
  195.         _T(R11G11B10_FLOAT, 11_11_10_FLOAT, R11G11B10_FLOAT, WZYX),
  196.         _T(R9G9B9E5_FLOAT,  9_9_9_E5_FLOAT, NONE,            WZYX),
  197.  
  198.         _T(Z24X8_UNORM,       X8Z24_UNORM, R8G8B8A8_UNORM, WZYX),
  199.         _T(Z24_UNORM_S8_UINT, X8Z24_UNORM, R8G8B8A8_UNORM, WZYX),
  200.         _T(Z32_FLOAT,         Z32_FLOAT,   R8G8B8A8_UNORM, WZYX),
  201.         _T(Z32_FLOAT_S8X24_UINT, Z32_FLOAT,R8G8B8A8_UNORM, WZYX),
  202.  
  203.         /* 48-bit */
  204.         V_(R16G16B16_UNORM,   16_16_16_UNORM, NONE, WZYX),
  205.         V_(R16G16B16_SNORM,   16_16_16_SNORM, NONE, WZYX),
  206.         V_(R16G16B16_UINT,    16_16_16_UINT,  NONE, WZYX),
  207.         V_(R16G16B16_SINT,    16_16_16_SINT,  NONE, WZYX),
  208.         V_(R16G16B16_USCALED, 16_16_16_UINT,  NONE, WZYX),
  209.         V_(R16G16B16_SSCALED, 16_16_16_SINT,  NONE, WZYX),
  210.         V_(R16G16B16_FLOAT,   16_16_16_FLOAT, NONE, WZYX),
  211.  
  212.         /* 64-bit */
  213.         VT(R16G16B16A16_UNORM,   16_16_16_16_UNORM, NONE,               WZYX),
  214.         VT(R16G16B16A16_SNORM,   16_16_16_16_SNORM, NONE,               WZYX),
  215.         VT(R16G16B16A16_UINT,    16_16_16_16_UINT,  R16G16B16A16_UINT,  WZYX),
  216.         _T(R16G16B16X16_UINT,    16_16_16_16_UINT,  R16G16B16A16_UINT,  WZYX),
  217.         VT(R16G16B16A16_SINT,    16_16_16_16_SINT,  R16G16B16A16_SINT,  WZYX),
  218.         _T(R16G16B16X16_SINT,    16_16_16_16_SINT,  R16G16B16A16_SINT,  WZYX),
  219.         V_(R16G16B16A16_USCALED, 16_16_16_16_UINT,  NONE,               WZYX),
  220.         V_(R16G16B16A16_SSCALED, 16_16_16_16_SINT,  NONE,               WZYX),
  221.         VT(R16G16B16A16_FLOAT,   16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX),
  222.         _T(R16G16B16X16_FLOAT,   16_16_16_16_FLOAT, R16G16B16A16_FLOAT, WZYX),
  223.  
  224.         VT(R32G32_UINT,    32_32_UINT,  R32G32_UINT, WZYX),
  225.         VT(R32G32_SINT,    32_32_SINT,  R32G32_SINT, WZYX),
  226.         V_(R32G32_USCALED, 32_32_UINT,  NONE,        WZYX),
  227.         V_(R32G32_SSCALED, 32_32_SINT,  NONE,        WZYX),
  228.         VT(R32G32_FLOAT,   32_32_FLOAT, R32G32_FLOAT,WZYX),
  229.         V_(R32G32_FIXED,   32_32_FIXED, NONE,        WZYX),
  230.  
  231.         _T(L32A32_UINT,    32_32_UINT,  NONE,        WZYX),
  232.         _T(L32A32_SINT,    32_32_SINT,  NONE,        WZYX),
  233.  
  234.         /* 96-bit */
  235.         V_(R32G32B32_UINT,    32_32_32_UINT,  NONE, WZYX),
  236.         V_(R32G32B32_SINT,    32_32_32_SINT,  NONE, WZYX),
  237.         V_(R32G32B32_USCALED, 32_32_32_UINT,  NONE, WZYX),
  238.         V_(R32G32B32_SSCALED, 32_32_32_SINT,  NONE, WZYX),
  239.         V_(R32G32B32_FLOAT,   32_32_32_FLOAT, NONE, WZYX),
  240.         V_(R32G32B32_FIXED,   32_32_32_FIXED, NONE, WZYX),
  241.  
  242.         /* 128-bit */
  243.         VT(R32G32B32A32_UINT,    32_32_32_32_UINT,  R32G32B32A32_UINT,  WZYX),
  244.         _T(R32G32B32X32_UINT,    32_32_32_32_UINT,  R32G32B32A32_UINT,  WZYX),
  245.         VT(R32G32B32A32_SINT,    32_32_32_32_SINT,  R32G32B32A32_SINT,  WZYX),
  246.         _T(R32G32B32X32_SINT,    32_32_32_32_SINT,  R32G32B32A32_SINT,  WZYX),
  247.         V_(R32G32B32A32_USCALED, 32_32_32_32_UINT,  NONE,               WZYX),
  248.         V_(R32G32B32A32_SSCALED, 32_32_32_32_SINT,  NONE,               WZYX),
  249.         VT(R32G32B32A32_FLOAT,   32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX),
  250.         _T(R32G32B32X32_FLOAT,   32_32_32_32_FLOAT, R32G32B32A32_FLOAT, WZYX),
  251.         V_(R32G32B32A32_FIXED,   32_32_32_32_FIXED, NONE,               WZYX),
  252.  
  253.         /* compressed */
  254.         _T(ETC1_RGB8, ETC1, NONE, WZYX),
  255.         _T(ETC2_RGB8, ETC2_RGB8, NONE, WZYX),
  256.         _T(ETC2_SRGB8, ETC2_RGB8, NONE, WZYX),
  257.         _T(ETC2_RGB8A1, ETC2_RGB8A1, NONE, WZYX),
  258.         _T(ETC2_SRGB8A1, ETC2_RGB8A1, NONE, WZYX),
  259.         _T(ETC2_RGBA8, ETC2_RGBA8, NONE, WZYX),
  260.         _T(ETC2_SRGBA8, ETC2_RGBA8, NONE, WZYX),
  261.         _T(ETC2_R11_UNORM, ETC2_R11_UNORM, NONE, WZYX),
  262.         _T(ETC2_R11_SNORM, ETC2_R11_SNORM, NONE, WZYX),
  263.         _T(ETC2_RG11_UNORM, ETC2_RG11_UNORM, NONE, WZYX),
  264.         _T(ETC2_RG11_SNORM, ETC2_RG11_SNORM, NONE, WZYX),
  265. };
  266.  
  267. enum a3xx_vtx_fmt
  268. fd3_pipe2vtx(enum pipe_format format)
  269. {
  270.         if (!formats[format].present)
  271.                 return ~0;
  272.         return formats[format].vtx;
  273. }
  274.  
  275. enum a3xx_tex_fmt
  276. fd3_pipe2tex(enum pipe_format format)
  277. {
  278.         if (!formats[format].present)
  279.                 return ~0;
  280.         return formats[format].tex;
  281. }
  282.  
  283. enum a3xx_color_fmt
  284. fd3_pipe2color(enum pipe_format format)
  285. {
  286.         if (!formats[format].present)
  287.                 return ~0;
  288.         return formats[format].rb;
  289. }
  290.  
  291. enum a3xx_color_swap
  292. fd3_pipe2swap(enum pipe_format format)
  293. {
  294.         if (!formats[format].present)
  295.                 return WZYX;
  296.         return formats[format].swap;
  297. }
  298.  
  299. enum a3xx_tex_fetchsize
  300. fd3_pipe2fetchsize(enum pipe_format format)
  301. {
  302.         if (format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)
  303.                 format = PIPE_FORMAT_Z32_FLOAT;
  304.         switch (util_format_get_blocksizebits(format)) {
  305.         case 8: return TFETCH_1_BYTE;
  306.         case 16: return TFETCH_2_BYTE;
  307.         case 32: return TFETCH_4_BYTE;
  308.         case 64: return TFETCH_8_BYTE;
  309.         case 128: return TFETCH_16_BYTE;
  310.         default:
  311.                 debug_printf("Unknown block size for format %s: %d\n",
  312.                                          util_format_name(format),
  313.                                          util_format_get_blocksizebits(format));
  314.                 return TFETCH_DISABLE;
  315.         }
  316. }
  317.  
  318. /* we need to special case a bit the depth/stencil restore, because we are
  319.  * using the texture sampler to blit into the depth/stencil buffer, *not*
  320.  * into a color buffer.  Otherwise fd3_tex_swiz() will do the wrong thing,
  321.  * as it is assuming that you are sampling into normal render target..
  322.  */
  323. enum pipe_format
  324. fd3_gmem_restore_format(enum pipe_format format)
  325. {
  326.         switch (format) {
  327.         case PIPE_FORMAT_Z24X8_UNORM:
  328.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  329.                 return PIPE_FORMAT_R8G8B8A8_UNORM;
  330.         case PIPE_FORMAT_Z16_UNORM:
  331.                 return PIPE_FORMAT_R8G8_UNORM;
  332.         case PIPE_FORMAT_S8_UINT:
  333.                 return PIPE_FORMAT_R8_UNORM;
  334.         default:
  335.                 return format;
  336.         }
  337. }
  338.  
  339. enum a3xx_color_fmt
  340. fd3_fs_output_format(enum pipe_format format)
  341. {
  342.         if (util_format_is_srgb(format))
  343.                 return RB_R16G16B16A16_FLOAT;
  344.         switch (format) {
  345.         case PIPE_FORMAT_R16_FLOAT:
  346.         case PIPE_FORMAT_R16G16_FLOAT:
  347.         case PIPE_FORMAT_R11G11B10_FLOAT:
  348.                 return RB_R16G16B16A16_FLOAT;
  349.         default:
  350.                 return fd3_pipe2color(format);
  351.         }
  352. }
  353.  
  354. static inline enum a3xx_tex_swiz
  355. tex_swiz(unsigned swiz)
  356. {
  357.         switch (swiz) {
  358.         default:
  359.         case PIPE_SWIZZLE_RED:   return A3XX_TEX_X;
  360.         case PIPE_SWIZZLE_GREEN: return A3XX_TEX_Y;
  361.         case PIPE_SWIZZLE_BLUE:  return A3XX_TEX_Z;
  362.         case PIPE_SWIZZLE_ALPHA: return A3XX_TEX_W;
  363.         case PIPE_SWIZZLE_ZERO:  return A3XX_TEX_ZERO;
  364.         case PIPE_SWIZZLE_ONE:   return A3XX_TEX_ONE;
  365.         }
  366. }
  367.  
  368. uint32_t
  369. fd3_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g,
  370.                 unsigned swizzle_b, unsigned swizzle_a)
  371. {
  372.         const struct util_format_description *desc =
  373.                         util_format_description(format);
  374.         unsigned char swiz[4] = {
  375.                         swizzle_r, swizzle_g, swizzle_b, swizzle_a,
  376.         }, rswiz[4];
  377.  
  378.         util_format_compose_swizzles(desc->swizzle, swiz, rswiz);
  379.  
  380.         return A3XX_TEX_CONST_0_SWIZ_X(tex_swiz(rswiz[0])) |
  381.                         A3XX_TEX_CONST_0_SWIZ_Y(tex_swiz(rswiz[1])) |
  382.                         A3XX_TEX_CONST_0_SWIZ_Z(tex_swiz(rswiz[2])) |
  383.                         A3XX_TEX_CONST_0_SWIZ_W(tex_swiz(rswiz[3]));
  384. }
  385.