Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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