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) 2012 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 "fd2_util.h"
  33.  
  34. enum a2xx_sq_surfaceformat
  35. fd2_pipe2surface(enum pipe_format format)
  36. {
  37.         switch (format) {
  38.         /* 8-bit buffers. */
  39.         case PIPE_FORMAT_A8_UNORM:
  40.         case PIPE_FORMAT_A8_SNORM:
  41.         case PIPE_FORMAT_A8_UINT:
  42.         case PIPE_FORMAT_A8_SINT:
  43.         case PIPE_FORMAT_I8_UNORM:
  44.         case PIPE_FORMAT_I8_SNORM:
  45.         case PIPE_FORMAT_I8_UINT:
  46.         case PIPE_FORMAT_I8_SINT:
  47.         case PIPE_FORMAT_L8_UNORM:
  48.         case PIPE_FORMAT_L8_SNORM:
  49.         case PIPE_FORMAT_L8_UINT:
  50.         case PIPE_FORMAT_L8_SINT:
  51.         case PIPE_FORMAT_L8_SRGB:
  52.         case PIPE_FORMAT_R8_UNORM:
  53.         case PIPE_FORMAT_R8_SNORM:
  54.         case PIPE_FORMAT_R8_UINT:
  55.         case PIPE_FORMAT_R8_SINT:
  56.                 return FMT_8;
  57.  
  58.         /* 16-bit buffers. */
  59.         case PIPE_FORMAT_B5G6R5_UNORM:
  60.                 return FMT_5_6_5;
  61.         case PIPE_FORMAT_B5G5R5A1_UNORM:
  62.         case PIPE_FORMAT_B5G5R5X1_UNORM:
  63.                 return FMT_1_5_5_5;
  64.         case PIPE_FORMAT_B4G4R4A4_UNORM:
  65.         case PIPE_FORMAT_B4G4R4X4_UNORM:
  66.                 return FMT_4_4_4_4;
  67.         case PIPE_FORMAT_Z16_UNORM:
  68.                 return FMT_16;
  69.         case PIPE_FORMAT_L8A8_UNORM:
  70.         case PIPE_FORMAT_L8A8_SNORM:
  71.         case PIPE_FORMAT_L8A8_UINT:
  72.         case PIPE_FORMAT_L8A8_SINT:
  73.         case PIPE_FORMAT_L8A8_SRGB:
  74.         case PIPE_FORMAT_R8G8_UNORM:
  75.         case PIPE_FORMAT_R8G8_SNORM:
  76.         case PIPE_FORMAT_R8G8_UINT:
  77.         case PIPE_FORMAT_R8G8_SINT:
  78.                 return FMT_8_8;
  79.         case PIPE_FORMAT_R16_UNORM:
  80.         case PIPE_FORMAT_R16_SNORM:
  81.         case PIPE_FORMAT_R16_UINT:
  82.         case PIPE_FORMAT_R16_SINT:
  83.         case PIPE_FORMAT_A16_UNORM:
  84.         case PIPE_FORMAT_A16_SNORM:
  85.         case PIPE_FORMAT_A16_UINT:
  86.         case PIPE_FORMAT_A16_SINT:
  87.         case PIPE_FORMAT_L16_UNORM:
  88.         case PIPE_FORMAT_L16_SNORM:
  89.         case PIPE_FORMAT_L16_UINT:
  90.         case PIPE_FORMAT_L16_SINT:
  91.         case PIPE_FORMAT_I16_UNORM:
  92.         case PIPE_FORMAT_I16_SNORM:
  93.         case PIPE_FORMAT_I16_UINT:
  94.         case PIPE_FORMAT_I16_SINT:
  95.                 return FMT_16;
  96.         case PIPE_FORMAT_R16_FLOAT:
  97.         case PIPE_FORMAT_A16_FLOAT:
  98.         case PIPE_FORMAT_L16_FLOAT:
  99.         case PIPE_FORMAT_I16_FLOAT:
  100.                 return FMT_16_FLOAT;
  101.  
  102.         /* 32-bit buffers. */
  103.         case PIPE_FORMAT_A8B8G8R8_SRGB:
  104.         case PIPE_FORMAT_A8B8G8R8_UNORM:
  105.         case PIPE_FORMAT_A8R8G8B8_UNORM:
  106.         case PIPE_FORMAT_B8G8R8A8_SRGB:
  107.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  108.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  109.         case PIPE_FORMAT_R8G8B8A8_SNORM:
  110.         case PIPE_FORMAT_R8G8B8A8_UNORM:
  111.         case PIPE_FORMAT_R8G8B8X8_UNORM:
  112.         case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
  113.         case PIPE_FORMAT_X8B8G8R8_UNORM:
  114.         case PIPE_FORMAT_X8R8G8B8_UNORM:
  115.         case PIPE_FORMAT_R8G8B8_UNORM:
  116.         case PIPE_FORMAT_R8G8B8A8_SINT:
  117.         case PIPE_FORMAT_R8G8B8A8_UINT:
  118.                 return FMT_8_8_8_8;
  119.         case PIPE_FORMAT_R10G10B10A2_UNORM:
  120.         case PIPE_FORMAT_R10G10B10X2_SNORM:
  121.         case PIPE_FORMAT_B10G10R10A2_UNORM:
  122.         case PIPE_FORMAT_B10G10R10A2_UINT:
  123.         case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
  124.                 return FMT_2_10_10_10;
  125.         case PIPE_FORMAT_Z24X8_UNORM:
  126.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  127.                 return FMT_24_8;
  128.         case PIPE_FORMAT_R32_UINT:
  129.         case PIPE_FORMAT_R32_SINT:
  130.         case PIPE_FORMAT_A32_UINT:
  131.         case PIPE_FORMAT_A32_SINT:
  132.         case PIPE_FORMAT_L32_UINT:
  133.         case PIPE_FORMAT_L32_SINT:
  134.         case PIPE_FORMAT_I32_UINT:
  135.         case PIPE_FORMAT_I32_SINT:
  136.                 return FMT_32;
  137.         case PIPE_FORMAT_R32_FLOAT:
  138.         case PIPE_FORMAT_A32_FLOAT:
  139.         case PIPE_FORMAT_L32_FLOAT:
  140.         case PIPE_FORMAT_I32_FLOAT:
  141.         case PIPE_FORMAT_Z32_FLOAT:
  142.                 return FMT_32_FLOAT;
  143.         case PIPE_FORMAT_R16G16_FLOAT:
  144.         case PIPE_FORMAT_L16A16_FLOAT:
  145.                 return FMT_16_16_FLOAT;
  146.         case PIPE_FORMAT_R16G16_UNORM:
  147.         case PIPE_FORMAT_R16G16_SNORM:
  148.         case PIPE_FORMAT_R16G16_UINT:
  149.         case PIPE_FORMAT_R16G16_SINT:
  150.         case PIPE_FORMAT_L16A16_UNORM:
  151.         case PIPE_FORMAT_L16A16_SNORM:
  152.         case PIPE_FORMAT_L16A16_UINT:
  153.         case PIPE_FORMAT_L16A16_SINT:
  154.                 return FMT_16_16;
  155.  
  156.         /* 64-bit buffers. */
  157.         case PIPE_FORMAT_R16G16B16A16_UINT:
  158.         case PIPE_FORMAT_R16G16B16A16_SINT:
  159.         case PIPE_FORMAT_R16G16B16A16_UNORM:
  160.         case PIPE_FORMAT_R16G16B16A16_SNORM:
  161.                 return FMT_16_16_16_16;
  162.         case PIPE_FORMAT_R16G16B16A16_FLOAT:
  163.                 return FMT_16_16_16_16_FLOAT;
  164.         case PIPE_FORMAT_R32G32_FLOAT:
  165.         case PIPE_FORMAT_L32A32_FLOAT:
  166.                 return FMT_32_32_FLOAT;
  167.         case PIPE_FORMAT_R32G32_SINT:
  168.         case PIPE_FORMAT_R32G32_UINT:
  169.         case PIPE_FORMAT_L32A32_UINT:
  170.         case PIPE_FORMAT_L32A32_SINT:
  171.                 return FMT_32_32;
  172.  
  173.         /* 96-bit buffers. */
  174.         case PIPE_FORMAT_R32G32B32_FLOAT:
  175.                 return FMT_32_32_32_FLOAT;
  176.  
  177.         /* 128-bit buffers. */
  178.         case PIPE_FORMAT_R32G32B32A32_SNORM:
  179.         case PIPE_FORMAT_R32G32B32A32_UNORM:
  180.         case PIPE_FORMAT_R32G32B32A32_SINT:
  181.         case PIPE_FORMAT_R32G32B32A32_UINT:
  182.                 return FMT_32_32_32_32;
  183.         case PIPE_FORMAT_R32G32B32A32_FLOAT:
  184.                 return FMT_32_32_32_32_FLOAT;
  185.  
  186.         /* YUV buffers. */
  187.         case PIPE_FORMAT_UYVY:
  188.                 return FMT_Cr_Y1_Cb_Y0;
  189.         case PIPE_FORMAT_YUYV:
  190.                 return FMT_Y1_Cr_Y0_Cb;
  191.  
  192.         default:
  193.                 return ~0;
  194.         }
  195. }
  196.  
  197. enum a2xx_colorformatx
  198. fd2_pipe2color(enum pipe_format format)
  199. {
  200.         switch (format) {
  201.         /* 8-bit buffers. */
  202.         case PIPE_FORMAT_A8_UNORM:
  203.         case PIPE_FORMAT_A8_SNORM:
  204.         case PIPE_FORMAT_A8_UINT:
  205.         case PIPE_FORMAT_A8_SINT:
  206.         case PIPE_FORMAT_I8_UNORM:
  207.         case PIPE_FORMAT_I8_SNORM:
  208.         case PIPE_FORMAT_I8_UINT:
  209.         case PIPE_FORMAT_I8_SINT:
  210.         case PIPE_FORMAT_L8_UNORM:
  211.         case PIPE_FORMAT_L8_SNORM:
  212.         case PIPE_FORMAT_L8_UINT:
  213.         case PIPE_FORMAT_L8_SINT:
  214.         case PIPE_FORMAT_L8_SRGB:
  215.         case PIPE_FORMAT_R8_UNORM:
  216.         case PIPE_FORMAT_R8_SNORM:
  217.         case PIPE_FORMAT_R8_UINT:
  218.         case PIPE_FORMAT_R8_SINT:
  219.                 return COLORX_8;
  220.  
  221.         /* 16-bit buffers. */
  222.         case PIPE_FORMAT_B5G6R5_UNORM:
  223.                 return COLORX_5_6_5;
  224.         case PIPE_FORMAT_B5G5R5A1_UNORM:
  225.         case PIPE_FORMAT_B5G5R5X1_UNORM:
  226.                 return COLORX_1_5_5_5;
  227.         case PIPE_FORMAT_B4G4R4A4_UNORM:
  228.         case PIPE_FORMAT_B4G4R4X4_UNORM:
  229.                 return COLORX_4_4_4_4;
  230.         case PIPE_FORMAT_L8A8_UNORM:
  231.         case PIPE_FORMAT_L8A8_SNORM:
  232.         case PIPE_FORMAT_L8A8_UINT:
  233.         case PIPE_FORMAT_L8A8_SINT:
  234.         case PIPE_FORMAT_L8A8_SRGB:
  235.         case PIPE_FORMAT_R8G8_UNORM:
  236.         case PIPE_FORMAT_R8G8_SNORM:
  237.         case PIPE_FORMAT_R8G8_UINT:
  238.         case PIPE_FORMAT_R8G8_SINT:
  239.         case PIPE_FORMAT_Z16_UNORM:
  240.                 return COLORX_8_8;
  241.         case PIPE_FORMAT_R16_FLOAT:
  242.         case PIPE_FORMAT_A16_FLOAT:
  243.         case PIPE_FORMAT_L16_FLOAT:
  244.         case PIPE_FORMAT_I16_FLOAT:
  245.                 return COLORX_16_FLOAT;
  246.  
  247.         /* 32-bit buffers. */
  248.         case PIPE_FORMAT_A8B8G8R8_SRGB:
  249.         case PIPE_FORMAT_A8B8G8R8_UNORM:
  250.         case PIPE_FORMAT_A8R8G8B8_UNORM:
  251.         case PIPE_FORMAT_B8G8R8A8_SRGB:
  252.         case PIPE_FORMAT_B8G8R8A8_UNORM:
  253.         case PIPE_FORMAT_B8G8R8X8_UNORM:
  254.         case PIPE_FORMAT_R8G8B8A8_SNORM:
  255.         case PIPE_FORMAT_R8G8B8A8_UNORM:
  256.         case PIPE_FORMAT_R8G8B8X8_UNORM:
  257.         case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
  258.         case PIPE_FORMAT_X8B8G8R8_UNORM:
  259.         case PIPE_FORMAT_X8R8G8B8_UNORM:
  260.         case PIPE_FORMAT_R8G8B8_UNORM:
  261.         case PIPE_FORMAT_R8G8B8A8_SINT:
  262.         case PIPE_FORMAT_R8G8B8A8_UINT:
  263.         case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  264.         case PIPE_FORMAT_Z24X8_UNORM:
  265.                 return COLORX_8_8_8_8;
  266.         case PIPE_FORMAT_R32_FLOAT:
  267.         case PIPE_FORMAT_A32_FLOAT:
  268.         case PIPE_FORMAT_L32_FLOAT:
  269.         case PIPE_FORMAT_I32_FLOAT:
  270.         case PIPE_FORMAT_Z32_FLOAT:
  271.                 return COLORX_32_FLOAT;
  272.         case PIPE_FORMAT_R16G16_FLOAT:
  273.         case PIPE_FORMAT_L16A16_FLOAT:
  274.                 return COLORX_16_16_FLOAT;
  275.  
  276.         /* 64-bit buffers. */
  277.         case PIPE_FORMAT_R16G16B16A16_FLOAT:
  278.                 return COLORX_16_16_16_16_FLOAT;
  279.         case PIPE_FORMAT_R32G32_FLOAT:
  280.         case PIPE_FORMAT_L32A32_FLOAT:
  281.                 return COLORX_32_32_FLOAT;
  282.  
  283.         /* 128-bit buffers. */
  284.         case PIPE_FORMAT_R32G32B32A32_FLOAT:
  285.                 return COLORX_32_32_32_32_FLOAT;
  286.  
  287.         default:
  288.                 return ~0;
  289.         }
  290. }
  291.  
  292. static inline enum sq_tex_swiz
  293. tex_swiz(unsigned swiz)
  294. {
  295.         switch (swiz) {
  296.         default:
  297.         case PIPE_SWIZZLE_RED:   return SQ_TEX_X;
  298.         case PIPE_SWIZZLE_GREEN: return SQ_TEX_Y;
  299.         case PIPE_SWIZZLE_BLUE:  return SQ_TEX_Z;
  300.         case PIPE_SWIZZLE_ALPHA: return SQ_TEX_W;
  301.         case PIPE_SWIZZLE_ZERO:  return SQ_TEX_ZERO;
  302.         case PIPE_SWIZZLE_ONE:   return SQ_TEX_ONE;
  303.         }
  304. }
  305.  
  306. uint32_t
  307. fd2_tex_swiz(enum pipe_format format, unsigned swizzle_r, unsigned swizzle_g,
  308.                 unsigned swizzle_b, unsigned swizzle_a)
  309. {
  310.         const struct util_format_description *desc =
  311.                         util_format_description(format);
  312.         uint8_t swiz[] = {
  313.                         swizzle_r, swizzle_g, swizzle_b, swizzle_a,
  314.                         PIPE_SWIZZLE_ZERO, PIPE_SWIZZLE_ONE,
  315.                         PIPE_SWIZZLE_ONE, PIPE_SWIZZLE_ONE,
  316.         };
  317.  
  318.         return A2XX_SQ_TEX_3_SWIZ_X(tex_swiz(swiz[desc->swizzle[0]])) |
  319.                         A2XX_SQ_TEX_3_SWIZ_Y(tex_swiz(swiz[desc->swizzle[1]])) |
  320.                         A2XX_SQ_TEX_3_SWIZ_Z(tex_swiz(swiz[desc->swizzle[2]])) |
  321.                         A2XX_SQ_TEX_3_SWIZ_W(tex_swiz(swiz[desc->swizzle[3]]));
  322. }
  323.