Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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) 2013 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 "fd3_util.h"
  33.  
  34. /* convert pipe format to vertex buffer format: */
  35. enum a3xx_vtx_fmt
  36. fd3_pipe2vtx(enum pipe_format format)
  37. {
  38.         switch (format) {
  39.         /* 8-bit buffers. */
  40.         case PIPE_FORMAT_A8_UNORM:
  41.         case PIPE_FORMAT_I8_UNORM:
  42.         case PIPE_FORMAT_L8_UNORM:
  43.         case PIPE_FORMAT_R8_UNORM:
  44.         case PIPE_FORMAT_L8_SRGB:
  45.                 return VFMT_NORM_UBYTE_8;
  46.  
  47.         case PIPE_FORMAT_A8_SNORM:
  48.         case PIPE_FORMAT_I8_SNORM:
  49.         case PIPE_FORMAT_L8_SNORM:
  50.         case PIPE_FORMAT_R8_SNORM:
  51.                 return VFMT_NORM_BYTE_8;
  52.  
  53.         case PIPE_FORMAT_A8_UINT:
  54.         case PIPE_FORMAT_I8_UINT:
  55.         case PIPE_FORMAT_L8_UINT:
  56.         case PIPE_FORMAT_R8_UINT:
  57.                 return VFMT_UBYTE_8;
  58.  
  59.         case PIPE_FORMAT_A8_SINT:
  60.         case PIPE_FORMAT_I8_SINT:
  61.         case PIPE_FORMAT_L8_SINT:
  62.         case PIPE_FORMAT_R8_SINT:
  63.                 return VFMT_BYTE_8;
  64.  
  65.         /* 16-bit buffers. */
  66.         case PIPE_FORMAT_R16_UNORM:
  67.         case PIPE_FORMAT_A16_UNORM:
  68.         case PIPE_FORMAT_L16_UNORM:
  69.         case PIPE_FORMAT_I16_UNORM:
  70.         case PIPE_FORMAT_Z16_UNORM:
  71.                 return VFMT_NORM_USHORT_16;
  72.  
  73.         case PIPE_FORMAT_R16_SNORM:
  74.         case PIPE_FORMAT_A16_SNORM:
  75.         case PIPE_FORMAT_L16_SNORM:
  76.         case PIPE_FORMAT_I16_SNORM:
  77.                 return VFMT_NORM_SHORT_16;
  78.  
  79.         case PIPE_FORMAT_R16_UINT:
  80.         case PIPE_FORMAT_A16_UINT:
  81.         case PIPE_FORMAT_L16_UINT:
  82.         case PIPE_FORMAT_I16_UINT:
  83.                 return VFMT_USHORT_16;
  84.  
  85.         case PIPE_FORMAT_R16_SINT:
  86.         case PIPE_FORMAT_A16_SINT:
  87.         case PIPE_FORMAT_L16_SINT:
  88.         case PIPE_FORMAT_I16_SINT:
  89.                 return VFMT_SHORT_16;
  90.  
  91.         case PIPE_FORMAT_L8A8_UNORM:
  92.         case PIPE_FORMAT_R8G8_UNORM:
  93.                 return VFMT_NORM_UBYTE_8_8;
  94.  
  95.         case PIPE_FORMAT_L8A8_SNORM:
  96.         case PIPE_FORMAT_R8G8_SNORM:
  97.                 return VFMT_NORM_BYTE_8_8;
  98.  
  99.         case PIPE_FORMAT_L8A8_UINT:
  100.         case PIPE_FORMAT_R8G8_UINT:
  101.                 return VFMT_UBYTE_8_8;
  102.  
  103.         case PIPE_FORMAT_L8A8_SINT:
  104.         case PIPE_FORMAT_R8G8_SINT:
  105.                 return VFMT_BYTE_8_8;
  106.  
  107.         /* 24-bit buffers. */
  108.         case PIPE_FORMAT_R8G8B8_UNORM:
  109.                 return VFMT_NORM_UBYTE_8_8_8;
  110.  
  111.         case PIPE_FORMAT_R8G8B8_SNORM:
  112.                 return VFMT_NORM_BYTE_8_8_8;
  113.  
  114.         case PIPE_FORMAT_R8G8B8_UINT:
  115.                 return VFMT_UBYTE_8_8_8;
  116.  
  117.         case PIPE_FORMAT_R8G8B8_SINT:
  118.                 return VFMT_BYTE_8_8_8;
  119.  
  120.         /* 32-bit buffers. */
  121.         case PIPE_FORMAT_A8B8G8R8_UNORM:
  122.         case PIPE_FORMAT_A8R8G8B8_UNORM:
  123.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  124.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  125.         case PIPE_FORMAT_R8G8B8A8_UNORM:
  126.         case PIPE_FORMAT_R8G8B8X8_UNORM:
  127.         case PIPE_FORMAT_X8B8G8R8_UNORM:
  128.         case PIPE_FORMAT_X8R8G8B8_UNORM:
  129.         case PIPE_FORMAT_A8B8G8R8_SRGB:
  130.         case PIPE_FORMAT_B8G8R8A8_SRGB:
  131.                 return VFMT_NORM_UBYTE_8_8_8_8;
  132.  
  133.         case PIPE_FORMAT_R8G8B8A8_SNORM:
  134.         case PIPE_FORMAT_R8G8B8X8_SNORM:
  135.                 return VFMT_NORM_BYTE_8_8_8_8;
  136.  
  137.         case PIPE_FORMAT_R8G8B8A8_UINT:
  138.         case PIPE_FORMAT_R8G8B8X8_UINT:
  139.                 return VFMT_UBYTE_8_8_8_8;
  140.  
  141.         case PIPE_FORMAT_R8G8B8A8_SINT:
  142.         case PIPE_FORMAT_R8G8B8X8_SINT:
  143.                 return VFMT_BYTE_8_8_8_8;
  144.  
  145. /* TODO probably need gles3 blob drivers to find the 32bit int formats:
  146.         case PIPE_FORMAT_R32_UINT:
  147.         case PIPE_FORMAT_R32_SINT:
  148.         case PIPE_FORMAT_A32_UINT:
  149.         case PIPE_FORMAT_A32_SINT:
  150.         case PIPE_FORMAT_L32_UINT:
  151.         case PIPE_FORMAT_L32_SINT:
  152.         case PIPE_FORMAT_I32_UINT:
  153.         case PIPE_FORMAT_I32_SINT:
  154. */
  155.  
  156.         case PIPE_FORMAT_R32_FLOAT:
  157.         case PIPE_FORMAT_A32_FLOAT:
  158.         case PIPE_FORMAT_L32_FLOAT:
  159.         case PIPE_FORMAT_I32_FLOAT:
  160.         case PIPE_FORMAT_Z32_FLOAT:
  161.                 return VFMT_FLOAT_32;
  162.  
  163.         case PIPE_FORMAT_R32_FIXED:
  164.                 return VFMT_FIXED_32;
  165.  
  166.         /* 64-bit buffers. */
  167.         case PIPE_FORMAT_R16G16B16A16_UNORM:
  168.                 return VFMT_NORM_USHORT_16_16_16_16;
  169.  
  170.         case PIPE_FORMAT_R16G16B16A16_SNORM:
  171.                 return VFMT_NORM_SHORT_16_16_16_16;
  172.  
  173.         case PIPE_FORMAT_R16G16B16A16_UINT:
  174.                 return VFMT_USHORT_16_16_16_16;
  175.  
  176.         case PIPE_FORMAT_R16G16B16A16_SINT:
  177.                 return VFMT_SHORT_16_16_16_16;
  178.  
  179.         case PIPE_FORMAT_R32G32_FLOAT:
  180.         case PIPE_FORMAT_L32A32_FLOAT:
  181.                 return VFMT_FLOAT_32_32;
  182.  
  183.         case PIPE_FORMAT_R32G32_FIXED:
  184.                 return VFMT_FIXED_32_32;
  185.  
  186. /* TODO probably need gles3 blob drivers to find the 32bit int formats:
  187.         case PIPE_FORMAT_R32G32_SINT:
  188.         case PIPE_FORMAT_R32G32_UINT:
  189.         case PIPE_FORMAT_L32A32_UINT:
  190.         case PIPE_FORMAT_L32A32_SINT:
  191. */
  192.  
  193.         /* 96-bit buffers. */
  194.         case PIPE_FORMAT_R32G32B32_FLOAT:
  195.                 return VFMT_FLOAT_32_32_32;
  196.  
  197.         case PIPE_FORMAT_R32G32B32_FIXED:
  198.                 return VFMT_FIXED_32_32_32;
  199.  
  200.         /* 128-bit buffers. */
  201.         case PIPE_FORMAT_R32G32B32A32_FLOAT:
  202.                 return VFMT_FLOAT_32_32_32_32;
  203.  
  204.         case PIPE_FORMAT_R32G32B32A32_FIXED:
  205.                 return VFMT_FIXED_32_32_32_32;
  206.  
  207. /* TODO probably need gles3 blob drivers to find the 32bit int formats:
  208.         case PIPE_FORMAT_R32G32B32A32_SNORM:
  209.         case PIPE_FORMAT_R32G32B32A32_UNORM:
  210.         case PIPE_FORMAT_R32G32B32A32_SINT:
  211.         case PIPE_FORMAT_R32G32B32A32_UINT:
  212. */
  213.  
  214.         default:
  215.                 return ~0;
  216.         }
  217. }
  218.  
  219. /* convert pipe format to texture sampler format: */
  220. enum a3xx_tex_fmt
  221. fd3_pipe2tex(enum pipe_format format)
  222. {
  223.         switch (format) {
  224.         case PIPE_FORMAT_L8_UNORM:
  225.         case PIPE_FORMAT_A8_UNORM:
  226.         case PIPE_FORMAT_I8_UNORM:
  227.                 return TFMT_NORM_UINT_8;
  228.  
  229.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  230.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  231.                 return TFMT_NORM_UINT_8_8_8_8;
  232.  
  233.         case PIPE_FORMAT_Z24X8_UNORM:
  234.                 return TFMT_NORM_UINT_X8Z24;
  235.  
  236.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  237.                 return TFMT_NORM_UINT_8_8_8_8;
  238.  
  239.         case PIPE_FORMAT_Z16_UNORM:
  240.                 return TFMT_NORM_UINT_8_8;
  241.  
  242.         // TODO add more..
  243.  
  244.         default:
  245.                 return ~0;
  246.         }
  247. }
  248.  
  249. enum a3xx_tex_fetchsize
  250. fd3_pipe2fetchsize(enum pipe_format format)
  251. {
  252.         switch (format) {
  253.         case PIPE_FORMAT_L8_UNORM:
  254.         case PIPE_FORMAT_A8_UNORM:
  255.         case PIPE_FORMAT_I8_UNORM:
  256.                 return TFETCH_1_BYTE;
  257.  
  258.         case PIPE_FORMAT_Z16_UNORM:
  259.                 return TFETCH_2_BYTE;
  260.  
  261.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  262.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  263.         case PIPE_FORMAT_Z24X8_UNORM:
  264.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  265.                 return TFETCH_4_BYTE;
  266.  
  267.         // TODO add more..
  268.  
  269.         default:
  270.                 return TFETCH_DISABLE;  /* save default */
  271.         }
  272. }
  273.  
  274. /* convert pipe format to MRT / copydest format used for render-target: */
  275. enum a3xx_color_fmt
  276. fd3_pipe2color(enum pipe_format format)
  277. {
  278.         switch (format) {
  279.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  280.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  281.                 return RB_R8G8B8A8_UNORM;
  282.  
  283.         case PIPE_FORMAT_Z16_UNORM:
  284.                 return RB_Z16_UNORM;
  285.  
  286.         case PIPE_FORMAT_Z24X8_UNORM:
  287.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  288.                 /* for DEPTHX_24_8, blob driver also seems to use R8G8B8A8 fmt.. */
  289.                 return RB_R8G8B8A8_UNORM;
  290.  
  291.         case PIPE_FORMAT_R8_UNORM:
  292.         case PIPE_FORMAT_L8_UNORM:
  293.                 return RB_A8_UNORM;
  294.  
  295.         // TODO add more..
  296.  
  297.         default:
  298.                 return ~0;
  299.         }
  300. }
  301.  
  302. enum a3xx_color_swap
  303. fd3_pipe2swap(enum pipe_format format)
  304. {
  305.         switch (format) {
  306.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  307.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  308.                 return WXYZ;
  309.         case PIPE_FORMAT_Z24X8_UNORM:
  310.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  311.                 return WZYX;
  312.  
  313.         default:
  314.                 return WZYX;
  315.         }
  316. }
  317.  
  318. static inline enum a3xx_tex_swiz
  319. tex_swiz(unsigned swiz)
  320. {
  321.         switch (swiz) {
  322.         default:
  323.         case PIPE_SWIZZLE_RED:   return A3XX_TEX_X;
  324.         case PIPE_SWIZZLE_GREEN: return A3XX_TEX_Y;
  325.         case PIPE_SWIZZLE_BLUE:  return A3XX_TEX_Z;
  326.         case PIPE_SWIZZLE_ALPHA: return A3XX_TEX_W;
  327.         case PIPE_SWIZZLE_ZERO:  return A3XX_TEX_ZERO;
  328.         case PIPE_SWIZZLE_ONE:   return A3XX_TEX_ONE;
  329.         }
  330. }
  331.  
  332. uint32_t
  333. fd3_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g,
  334.                 unsigned swizzle_b, unsigned swizzle_a)
  335. {
  336.         const struct util_format_description *desc =
  337.                         util_format_description(format);
  338.         uint8_t swiz[] = {
  339.                         swizzle_r, swizzle_g, swizzle_b, swizzle_a,
  340.                         PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_ONE,
  341.                         PIPE_SWIZZLE_ONE, PIPE_SWIZZLE_ONE,
  342.         };
  343.  
  344.         return A3XX_TEX_CONST_0_SWIZ_X(tex_swiz(swiz[desc->swizzle[0]])) |
  345.                         A3XX_TEX_CONST_0_SWIZ_Y(tex_swiz(swiz[desc->swizzle[1]])) |
  346.                         A3XX_TEX_CONST_0_SWIZ_Z(tex_swiz(swiz[desc->swizzle[2]])) |
  347.                         A3XX_TEX_CONST_0_SWIZ_W(tex_swiz(swiz[desc->swizzle[3]]));
  348. }
  349.