Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2011 Intel Corporation
  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
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23. #include "main/context.h"
  24. #include "main/mtypes.h"
  25.  
  26. #include "brw_context.h"
  27. #include "brw_state.h"
  28. #include "brw_defines.h"
  29. #include "brw_wm.h"
  30.  
  31. struct surface_format_info {
  32.    bool exists;
  33.    int sampling;
  34.    int filtering;
  35.    int shadow_compare;
  36.    int chroma_key;
  37.    int render_target;
  38.    int alpha_blend;
  39.    int input_vb;
  40.    int streamed_output_vb;
  41.    int color_processing;
  42.    const char *name;
  43. };
  44.  
  45. /* This macro allows us to write the table almost as it appears in the PRM,
  46.  * while restructuring it to turn it into the C code we want.
  47.  */
  48. #define SF(sampl, filt, shad, ck, rt, ab, vb, so, color, sf) \
  49.    [BRW_SURFACEFORMAT_##sf] = { true, sampl, filt, shad, ck, rt, ab, vb, so, color, #sf},
  50.  
  51. #define Y 0
  52. #define x 999
  53. /**
  54.  * This is the table of support for surface (texture, renderbuffer, and vertex
  55.  * buffer, but not depthbuffer) formats across the various hardware generations.
  56.  *
  57.  * The table is formatted to match the documentation, except that the docs have
  58.  * this ridiculous mapping of Y[*+~^#&] for "supported on DevWhatever".  To put
  59.  * it in our table, here's the mapping:
  60.  *
  61.  * Y*: 45
  62.  * Y+: 45 (g45/gm45)
  63.  * Y~: 50 (gen5)
  64.  * Y^: 60 (gen6)
  65.  * Y#: 70 (gen7)
  66.  *
  67.  * The abbreviations in the header below are:
  68.  * smpl  - Sampling Engine
  69.  * filt  - Sampling Engine Filtering
  70.  * shad  - Sampling Engine Shadow Map
  71.  * CK    - Sampling Engine Chroma Key
  72.  * RT    - Render Target
  73.  * AB    - Alpha Blend Render Target
  74.  * VB    - Input Vertex Buffer
  75.  * SO    - Steamed Output Vertex Buffers (transform feedback)
  76.  * color - Color Processing
  77.  * sf    - Surface Format
  78.  *
  79.  * See page 88 of the Sandybridge PRM VOL4_Part1 PDF.
  80.  *
  81.  * As of Ivybridge, the columns are no longer in that table and the
  82.  * information can be found spread across:
  83.  *
  84.  * - VOL2_Part1 section 2.5.11 Format Conversion (vertex fetch).
  85.  * - VOL4_Part1 section 2.12.2.1.2 Sampler Output Channel Mapping.
  86.  * - VOL4_Part1 section 3.9.11 Render Target Write.
  87.  */
  88. const struct surface_format_info surface_formats[] = {
  89. /* smpl filt shad CK  RT  AB  VB  SO  color */
  90.    SF( Y, 50,  x,  x,  Y,  Y,  Y,  Y,  x, R32G32B32A32_FLOAT)
  91.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32G32B32A32_SINT)
  92.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32G32B32A32_UINT)
  93.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32A32_UNORM)
  94.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32A32_SNORM)
  95.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R64G64_FLOAT)
  96.    SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, R32G32B32X32_FLOAT)
  97.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32A32_SSCALED)
  98.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32A32_USCALED)
  99.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R32G32B32A32_SFIXED)
  100.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R64G64_PASSTHRU)
  101.    SF( Y, 50,  x,  x,  x,  x,  Y,  Y,  x, R32G32B32_FLOAT)
  102.    SF( Y,  x,  x,  x,  x,  x,  Y,  Y,  x, R32G32B32_SINT)
  103.    SF( Y,  x,  x,  x,  x,  x,  Y,  Y,  x, R32G32B32_UINT)
  104.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32_UNORM)
  105.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32_SNORM)
  106.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32_SSCALED)
  107.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32B32_USCALED)
  108.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R32G32B32_SFIXED)
  109.    SF( Y,  Y,  x,  x,  Y, 45,  Y,  x, 60, R16G16B16A16_UNORM)
  110.    SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, R16G16B16A16_SNORM)
  111.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16G16B16A16_SINT)
  112.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16G16B16A16_UINT)
  113.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, R16G16B16A16_FLOAT)
  114.    SF( Y, 50,  x,  x,  Y,  Y,  Y,  Y,  x, R32G32_FLOAT)
  115.    SF( Y, 70,  x,  x,  Y,  Y,  Y,  Y,  x, R32G32_FLOAT_LD)
  116.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32G32_SINT)
  117.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32G32_UINT)
  118.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, R32_FLOAT_X8X24_TYPELESS)
  119.    SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, X32_TYPELESS_G8X24_UINT)
  120.    SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, L32A32_FLOAT)
  121.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32_UNORM)
  122.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32_SNORM)
  123.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R64_FLOAT)
  124.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R16G16B16X16_UNORM)
  125.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R16G16B16X16_FLOAT)
  126.    SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, A32X32_FLOAT)
  127.    SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, L32X32_FLOAT)
  128.    SF( Y, 50,  x,  x,  x,  x,  x,  x,  x, I32X32_FLOAT)
  129.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16A16_SSCALED)
  130.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16A16_USCALED)
  131.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32_SSCALED)
  132.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32G32_USCALED)
  133.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R32G32_SFIXED)
  134.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R64_PASSTHRU)
  135.    SF( Y,  Y,  x,  Y,  Y,  Y,  Y,  x, 60, B8G8R8A8_UNORM)
  136.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, B8G8R8A8_UNORM_SRGB)
  137. /* smpl filt shad CK  RT  AB  VB  SO  color */
  138.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x, 60, R10G10B10A2_UNORM)
  139.    SF( Y,  Y,  x,  x,  x,  x,  x,  x, 60, R10G10B10A2_UNORM_SRGB)
  140.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R10G10B10A2_UINT)
  141.    SF( Y,  Y,  x,  x,  x,  Y,  Y,  x,  x, R10G10B10_SNORM_A2_UNORM)
  142.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x, 60, R8G8B8A8_UNORM)
  143.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, R8G8B8A8_UNORM_SRGB)
  144.    SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, R8G8B8A8_SNORM)
  145.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8G8B8A8_SINT)
  146.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8G8B8A8_UINT)
  147.    SF( Y,  Y,  x,  x,  Y, 45,  Y,  x,  x, R16G16_UNORM)
  148.    SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, R16G16_SNORM)
  149.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16G16_SINT)
  150.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16G16_UINT)
  151.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, R16G16_FLOAT)
  152.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, B10G10R10A2_UNORM)
  153.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x, 60, B10G10R10A2_UNORM_SRGB)
  154.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, R11G11B10_FLOAT)
  155.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32_SINT)
  156.    SF( Y,  x,  x,  x,  Y,  x,  Y,  Y,  x, R32_UINT)
  157.    SF( Y, 50,  Y,  x,  Y,  Y,  Y,  Y,  x, R32_FLOAT)
  158.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, R24_UNORM_X8_TYPELESS)
  159.    SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, X24_TYPELESS_G8_UINT)
  160.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, L16A16_UNORM)
  161.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, I24X8_UNORM)
  162.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, L24X8_UNORM)
  163.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, A24X8_UNORM)
  164.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, I32_FLOAT)
  165.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, L32_FLOAT)
  166.    SF( Y, 50,  Y,  x,  x,  x,  x,  x,  x, A32_FLOAT)
  167.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x, 60, B8G8R8X8_UNORM)
  168.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, B8G8R8X8_UNORM_SRGB)
  169.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R8G8B8X8_UNORM)
  170.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R8G8B8X8_UNORM_SRGB)
  171.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R9G9B9E5_SHAREDEXP)
  172.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, B10G10R10X2_UNORM)
  173.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, L16A16_FLOAT)
  174.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32_UNORM)
  175.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32_SNORM)
  176. /* smpl filt shad CK  RT  AB  VB  SO  color */
  177.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R10G10B10X2_USCALED)
  178.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8A8_SSCALED)
  179.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8A8_USCALED)
  180.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16_SSCALED)
  181.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16_USCALED)
  182.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32_SSCALED)
  183.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R32_USCALED)
  184.    SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, B5G6R5_UNORM)
  185.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, B5G6R5_UNORM_SRGB)
  186.    SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, B5G5R5A1_UNORM)
  187.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, B5G5R5A1_UNORM_SRGB)
  188.    SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, B4G4R4A4_UNORM)
  189.    SF( Y,  Y,  x,  x,  Y,  Y,  x,  x,  x, B4G4R4A4_UNORM_SRGB)
  190.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, R8G8_UNORM)
  191.    SF( Y,  Y,  x,  Y,  Y, 60,  Y,  x,  x, R8G8_SNORM)
  192.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8G8_SINT)
  193.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8G8_UINT)
  194.    SF( Y,  Y,  Y,  x,  Y, 45,  Y,  x, 70, R16_UNORM)
  195.    SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, R16_SNORM)
  196.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16_SINT)
  197.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R16_UINT)
  198.    SF( Y,  Y,  x,  x,  Y,  Y,  Y,  x,  x, R16_FLOAT)
  199.    SF(50, 50,  x,  x,  x,  x,  x,  x,  x, A8P8_UNORM_PALETTE0)
  200.    SF(50, 50,  x,  x,  x,  x,  x,  x,  x, A8P8_UNORM_PALETTE1)
  201.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, I16_UNORM)
  202.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, L16_UNORM)
  203.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, A16_UNORM)
  204.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, L8A8_UNORM)
  205.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, I16_FLOAT)
  206.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, L16_FLOAT)
  207.    SF( Y,  Y,  Y,  x,  x,  x,  x,  x,  x, A16_FLOAT)
  208.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, L8A8_UNORM_SRGB)
  209.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, R5G5_SNORM_B6_UNORM)
  210.    SF( x,  x,  x,  x,  Y,  Y,  x,  x,  x, B5G5R5X1_UNORM)
  211.    SF( x,  x,  x,  x,  Y,  Y,  x,  x,  x, B5G5R5X1_UNORM_SRGB)
  212.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8_SSCALED)
  213.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8_USCALED)
  214. /* smpl filt shad CK  RT  AB  VB  SO  color */
  215.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16_SSCALED)
  216.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16_USCALED)
  217.    SF(50, 50,  x,  x,  x,  x,  x,  x,  x, P8A8_UNORM_PALETTE0)
  218.    SF(50, 50,  x,  x,  x,  x,  x,  x,  x, P8A8_UNORM_PALETTE1)
  219.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, A1B5G5R5_UNORM)
  220.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, A4B4G4R4_UNORM)
  221.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, L8A8_UINT)
  222.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, L8A8_SINT)
  223.    SF( Y,  Y,  x, 45,  Y,  Y,  Y,  x,  x, R8_UNORM)
  224.    SF( Y,  Y,  x,  x,  Y, 60,  Y,  x,  x, R8_SNORM)
  225.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8_SINT)
  226.    SF( Y,  x,  x,  x,  Y,  x,  Y,  x,  x, R8_UINT)
  227.    SF( Y,  Y,  x,  Y,  Y,  Y,  x,  x,  x, A8_UNORM)
  228.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, I8_UNORM)
  229.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, L8_UNORM)
  230.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, P4A4_UNORM)
  231.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, A4P4_UNORM)
  232.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8_SSCALED)
  233.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8_USCALED)
  234.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, P8_UNORM_PALETTE0)
  235.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, L8_UNORM_SRGB)
  236.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, P8_UNORM_PALETTE1)
  237.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, P4A4_UNORM_PALETTE1)
  238.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, A4P4_UNORM_PALETTE1)
  239.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, Y8_SNORM)
  240.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, L8_UINT)
  241.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, L8_SINT)
  242.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, I8_UINT)
  243.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, I8_SINT)
  244.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, DXT1_RGB_SRGB)
  245.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, R1_UINT)
  246.    SF( Y,  Y,  x,  Y,  Y,  x,  x,  x, 60, YCRCB_NORMAL)
  247.    SF( Y,  Y,  x,  Y,  Y,  x,  x,  x, 60, YCRCB_SWAPUVY)
  248.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, P2_UNORM_PALETTE0)
  249.    SF(45, 45,  x,  x,  x,  x,  x,  x,  x, P2_UNORM_PALETTE1)
  250.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BC1_UNORM)
  251.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BC2_UNORM)
  252.    SF( Y,  Y,  x,  Y,  x,  x,  x,  x,  x, BC3_UNORM)
  253.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC4_UNORM)
  254.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC5_UNORM)
  255.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC1_UNORM_SRGB)
  256.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC2_UNORM_SRGB)
  257.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC3_UNORM_SRGB)
  258.    SF( Y,  x,  x,  x,  x,  x,  x,  x,  x, MONO8)
  259.    SF( Y,  Y,  x,  x,  Y,  x,  x,  x, 60, YCRCB_SWAPUV)
  260.    SF( Y,  Y,  x,  x,  Y,  x,  x,  x, 60, YCRCB_SWAPY)
  261.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, DXT1_RGB)
  262. /* smpl filt shad CK  RT  AB  VB  SO  color */
  263.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, FXT1)
  264.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8_UNORM)
  265.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8_SNORM)
  266.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8_SSCALED)
  267.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R8G8B8_USCALED)
  268.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R64G64B64A64_FLOAT)
  269.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R64G64B64_FLOAT)
  270.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC4_SNORM)
  271.    SF( Y,  Y,  x,  x,  x,  x,  x,  x,  x, BC5_SNORM)
  272.    SF(50, 50,  x,  x,  x,  x, 60,  x,  x, R16G16B16_FLOAT)
  273.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16_UNORM)
  274.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16_SNORM)
  275.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16_SSCALED)
  276.    SF( x,  x,  x,  x,  x,  x,  Y,  x,  x, R16G16B16_USCALED)
  277.    SF(70, 70,  x,  x,  x,  x,  x,  x,  x, BC6H_SF16)
  278.    SF(70, 70,  x,  x,  x,  x,  x,  x,  x, BC7_UNORM)
  279.    SF(70, 70,  x,  x,  x,  x,  x,  x,  x, BC7_UNORM_SRGB)
  280.    SF(70, 70,  x,  x,  x,  x,  x,  x,  x, BC6H_UF16)
  281.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, PLANAR_420_8)
  282.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R8G8B8_UNORM_SRGB)
  283.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC1_RGB8)
  284.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_RGB8)
  285.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, EAC_R11)
  286.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, EAC_RG11)
  287.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, EAC_SIGNED_R11)
  288.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, EAC_SIGNED_RG11)
  289.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_SRGB8)
  290.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R16G16B16_UINT)
  291.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R16G16B16_SINT)
  292.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R32_SFIXED)
  293.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R10G10B10A2_SNORM)
  294.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R10G10B10A2_USCALED)
  295.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R10G10B10A2_SSCALED)
  296.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R10G10B10A2_SINT)
  297.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, B10G10R10A2_SNORM)
  298.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, B10G10R10A2_USCALED)
  299.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, B10G10R10A2_SSCALED)
  300.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, B10G10R10A2_UINT)
  301.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, B10G10R10A2_SINT)
  302.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R64G64B64A64_PASSTHRU)
  303.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R64G64B64_PASSTHRU)
  304.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_RGB8_PTA)
  305.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_SRGB8_PTA)
  306.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_EAC_RGBA8)
  307.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, ETC2_EAC_SRGB8_A8)
  308.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R8G8B8_UINT)
  309.    SF( x,  x,  x,  x,  x,  x,  x,  x,  x, R8G8B8_SINT)
  310. };
  311. #undef x
  312. #undef Y
  313.  
  314. const char *
  315. brw_surface_format_name(unsigned format)
  316. {
  317.    return surface_formats[format].name;
  318. }
  319.  
  320. uint32_t
  321. brw_format_for_mesa_format(mesa_format mesa_format)
  322. {
  323.    /* This table is ordered according to the enum ordering in formats.h.  We do
  324.     * expect that enum to be extended without our explicit initialization
  325.     * staying in sync, so we initialize to 0 even though
  326.     * BRW_SURFACEFORMAT_R32G32B32A32_FLOAT happens to also be 0.
  327.     */
  328.    static const uint32_t table[MESA_FORMAT_COUNT] =
  329.    {
  330.       [MESA_FORMAT_A8B8G8R8_UNORM] = 0,
  331.       [MESA_FORMAT_R8G8B8A8_UNORM] = BRW_SURFACEFORMAT_R8G8B8A8_UNORM,
  332.       [MESA_FORMAT_B8G8R8A8_UNORM] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM,
  333.       [MESA_FORMAT_A8R8G8B8_UNORM] = 0,
  334.       [MESA_FORMAT_X8B8G8R8_UNORM] = 0,
  335.       [MESA_FORMAT_R8G8B8X8_UNORM] = BRW_SURFACEFORMAT_R8G8B8X8_UNORM,
  336.       [MESA_FORMAT_B8G8R8X8_UNORM] = BRW_SURFACEFORMAT_B8G8R8X8_UNORM,
  337.       [MESA_FORMAT_X8R8G8B8_UNORM] = 0,
  338.       [MESA_FORMAT_BGR_UNORM8] = 0,
  339.       [MESA_FORMAT_RGB_UNORM8] = BRW_SURFACEFORMAT_R8G8B8_UNORM,
  340.       [MESA_FORMAT_B5G6R5_UNORM] = BRW_SURFACEFORMAT_B5G6R5_UNORM,
  341.       [MESA_FORMAT_R5G6B5_UNORM] = 0,
  342.       [MESA_FORMAT_B4G4R4A4_UNORM] = BRW_SURFACEFORMAT_B4G4R4A4_UNORM,
  343.       [MESA_FORMAT_A4R4G4B4_UNORM] = 0,
  344.       [MESA_FORMAT_A1B5G5R5_UNORM] = 0,
  345.       [MESA_FORMAT_B5G5R5A1_UNORM] = BRW_SURFACEFORMAT_B5G5R5A1_UNORM,
  346.       [MESA_FORMAT_A1R5G5B5_UNORM] = 0,
  347.       [MESA_FORMAT_L4A4_UNORM] = 0,
  348.       [MESA_FORMAT_L8A8_UNORM] = BRW_SURFACEFORMAT_L8A8_UNORM,
  349.       [MESA_FORMAT_A8L8_UNORM] = 0,
  350.       [MESA_FORMAT_L16A16_UNORM] = BRW_SURFACEFORMAT_L16A16_UNORM,
  351.       [MESA_FORMAT_A16L16_UNORM] = 0,
  352.       [MESA_FORMAT_B2G3R3_UNORM] = 0,
  353.       [MESA_FORMAT_A_UNORM8] = BRW_SURFACEFORMAT_A8_UNORM,
  354.       [MESA_FORMAT_A_UNORM16] = BRW_SURFACEFORMAT_A16_UNORM,
  355.       [MESA_FORMAT_L_UNORM8] = BRW_SURFACEFORMAT_L8_UNORM,
  356.       [MESA_FORMAT_L_UNORM16] = BRW_SURFACEFORMAT_L16_UNORM,
  357.       [MESA_FORMAT_I_UNORM8] = BRW_SURFACEFORMAT_I8_UNORM,
  358.       [MESA_FORMAT_I_UNORM16] = BRW_SURFACEFORMAT_I16_UNORM,
  359.       [MESA_FORMAT_YCBCR_REV] = BRW_SURFACEFORMAT_YCRCB_NORMAL,
  360.       [MESA_FORMAT_YCBCR] = BRW_SURFACEFORMAT_YCRCB_SWAPUVY,
  361.       [MESA_FORMAT_R_UNORM8] = BRW_SURFACEFORMAT_R8_UNORM,
  362.       [MESA_FORMAT_R8G8_UNORM] = BRW_SURFACEFORMAT_R8G8_UNORM,
  363.       [MESA_FORMAT_G8R8_UNORM] = 0,
  364.       [MESA_FORMAT_R_UNORM16] = BRW_SURFACEFORMAT_R16_UNORM,
  365.       [MESA_FORMAT_R16G16_UNORM] = BRW_SURFACEFORMAT_R16G16_UNORM,
  366.       [MESA_FORMAT_G16R16_UNORM] = 0,
  367.       [MESA_FORMAT_B10G10R10A2_UNORM] = BRW_SURFACEFORMAT_B10G10R10A2_UNORM,
  368.       [MESA_FORMAT_S8_UINT_Z24_UNORM] = 0,
  369.       [MESA_FORMAT_Z24_UNORM_S8_UINT] = 0,
  370.       [MESA_FORMAT_Z_UNORM16] = 0,
  371.       [MESA_FORMAT_Z24_UNORM_X8_UINT] = 0,
  372.       [MESA_FORMAT_X8_UINT_Z24_UNORM] = 0,
  373.       [MESA_FORMAT_Z_UNORM32] = 0,
  374.       [MESA_FORMAT_S_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
  375.  
  376.       [MESA_FORMAT_BGR_SRGB8] = 0,
  377.       [MESA_FORMAT_A8B8G8R8_SRGB] = 0,
  378.       [MESA_FORMAT_B8G8R8A8_SRGB] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB,
  379.       [MESA_FORMAT_A8R8G8B8_SRGB] = 0,
  380.       [MESA_FORMAT_R8G8B8A8_SRGB] = BRW_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB,
  381.       [MESA_FORMAT_X8R8G8B8_SRGB] = 0,
  382.       [MESA_FORMAT_L_SRGB8] = BRW_SURFACEFORMAT_L8_UNORM_SRGB,
  383.       [MESA_FORMAT_L8A8_SRGB] = BRW_SURFACEFORMAT_L8A8_UNORM_SRGB,
  384.       [MESA_FORMAT_A8L8_SRGB] = 0,
  385.       [MESA_FORMAT_SRGB_DXT1] = BRW_SURFACEFORMAT_DXT1_RGB_SRGB,
  386.       [MESA_FORMAT_SRGBA_DXT1] = BRW_SURFACEFORMAT_BC1_UNORM_SRGB,
  387.       [MESA_FORMAT_SRGBA_DXT3] = BRW_SURFACEFORMAT_BC2_UNORM_SRGB,
  388.       [MESA_FORMAT_SRGBA_DXT5] = BRW_SURFACEFORMAT_BC3_UNORM_SRGB,
  389.  
  390.       [MESA_FORMAT_RGB_FXT1] = BRW_SURFACEFORMAT_FXT1,
  391.       [MESA_FORMAT_RGBA_FXT1] = BRW_SURFACEFORMAT_FXT1,
  392.       [MESA_FORMAT_RGB_DXT1] = BRW_SURFACEFORMAT_DXT1_RGB,
  393.       [MESA_FORMAT_RGBA_DXT1] = BRW_SURFACEFORMAT_BC1_UNORM,
  394.       [MESA_FORMAT_RGBA_DXT3] = BRW_SURFACEFORMAT_BC2_UNORM,
  395.       [MESA_FORMAT_RGBA_DXT5] = BRW_SURFACEFORMAT_BC3_UNORM,
  396.  
  397.       [MESA_FORMAT_RGBA_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT,
  398.       [MESA_FORMAT_RGBA_FLOAT16] = BRW_SURFACEFORMAT_R16G16B16A16_FLOAT,
  399.       [MESA_FORMAT_RGB_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32_FLOAT,
  400.       [MESA_FORMAT_RGB_FLOAT16] = 0,
  401.       [MESA_FORMAT_A_FLOAT32] = BRW_SURFACEFORMAT_A32_FLOAT,
  402.       [MESA_FORMAT_A_FLOAT16] = BRW_SURFACEFORMAT_A16_FLOAT,
  403.       [MESA_FORMAT_L_FLOAT32] = BRW_SURFACEFORMAT_L32_FLOAT,
  404.       [MESA_FORMAT_L_FLOAT16] = BRW_SURFACEFORMAT_L16_FLOAT,
  405.       [MESA_FORMAT_LA_FLOAT32] = BRW_SURFACEFORMAT_L32A32_FLOAT,
  406.       [MESA_FORMAT_LA_FLOAT16] = BRW_SURFACEFORMAT_L16A16_FLOAT,
  407.       [MESA_FORMAT_I_FLOAT32] = BRW_SURFACEFORMAT_I32_FLOAT,
  408.       [MESA_FORMAT_I_FLOAT16] = BRW_SURFACEFORMAT_I16_FLOAT,
  409.       [MESA_FORMAT_R_FLOAT32] = BRW_SURFACEFORMAT_R32_FLOAT,
  410.       [MESA_FORMAT_R_FLOAT16] = BRW_SURFACEFORMAT_R16_FLOAT,
  411.       [MESA_FORMAT_RG_FLOAT32] = BRW_SURFACEFORMAT_R32G32_FLOAT,
  412.       [MESA_FORMAT_RG_FLOAT16] = BRW_SURFACEFORMAT_R16G16_FLOAT,
  413.  
  414.       [MESA_FORMAT_A_UINT8] = 0,
  415.       [MESA_FORMAT_A_UINT16] = 0,
  416.       [MESA_FORMAT_A_UINT32] = 0,
  417.       [MESA_FORMAT_A_SINT8] = 0,
  418.       [MESA_FORMAT_A_SINT16] = 0,
  419.       [MESA_FORMAT_A_SINT32] = 0,
  420.  
  421.       [MESA_FORMAT_I_UINT8] = 0,
  422.       [MESA_FORMAT_I_UINT16] = 0,
  423.       [MESA_FORMAT_I_UINT32] = 0,
  424.       [MESA_FORMAT_I_SINT8] = 0,
  425.       [MESA_FORMAT_I_SINT16] = 0,
  426.       [MESA_FORMAT_I_SINT32] = 0,
  427.  
  428.       [MESA_FORMAT_L_UINT8] = 0,
  429.       [MESA_FORMAT_L_UINT16] = 0,
  430.       [MESA_FORMAT_L_UINT32] = 0,
  431.       [MESA_FORMAT_L_SINT8] = 0,
  432.       [MESA_FORMAT_L_SINT16] = 0,
  433.       [MESA_FORMAT_L_SINT32] = 0,
  434.  
  435.       [MESA_FORMAT_LA_UINT8] = 0,
  436.       [MESA_FORMAT_LA_UINT16] = 0,
  437.       [MESA_FORMAT_LA_UINT32] = 0,
  438.       [MESA_FORMAT_LA_SINT8] = 0,
  439.       [MESA_FORMAT_LA_SINT16] = 0,
  440.       [MESA_FORMAT_LA_SINT32] = 0,
  441.  
  442.       [MESA_FORMAT_R_SINT8] = BRW_SURFACEFORMAT_R8_SINT,
  443.       [MESA_FORMAT_RG_SINT8] = BRW_SURFACEFORMAT_R8G8_SINT,
  444.       [MESA_FORMAT_RGB_SINT8] = BRW_SURFACEFORMAT_R8G8B8_SINT,
  445.       [MESA_FORMAT_RGBA_SINT8] = BRW_SURFACEFORMAT_R8G8B8A8_SINT,
  446.       [MESA_FORMAT_R_SINT16] = BRW_SURFACEFORMAT_R16_SINT,
  447.       [MESA_FORMAT_RG_SINT16] = BRW_SURFACEFORMAT_R16G16_SINT,
  448.       [MESA_FORMAT_RGB_SINT16] = BRW_SURFACEFORMAT_R16G16B16_SINT,
  449.       [MESA_FORMAT_RGBA_SINT16] = BRW_SURFACEFORMAT_R16G16B16A16_SINT,
  450.       [MESA_FORMAT_R_SINT32] = BRW_SURFACEFORMAT_R32_SINT,
  451.       [MESA_FORMAT_RG_SINT32] = BRW_SURFACEFORMAT_R32G32_SINT,
  452.       [MESA_FORMAT_RGB_SINT32] = BRW_SURFACEFORMAT_R32G32B32_SINT,
  453.       [MESA_FORMAT_RGBA_SINT32] = BRW_SURFACEFORMAT_R32G32B32A32_SINT,
  454.  
  455.       [MESA_FORMAT_R_UINT8] = BRW_SURFACEFORMAT_R8_UINT,
  456.       [MESA_FORMAT_RG_UINT8] = BRW_SURFACEFORMAT_R8G8_UINT,
  457.       [MESA_FORMAT_RGB_UINT8] = BRW_SURFACEFORMAT_R8G8B8_UINT,
  458.       [MESA_FORMAT_RGBA_UINT8] = BRW_SURFACEFORMAT_R8G8B8A8_UINT,
  459.       [MESA_FORMAT_R_UINT16] = BRW_SURFACEFORMAT_R16_UINT,
  460.       [MESA_FORMAT_RG_UINT16] = BRW_SURFACEFORMAT_R16G16_UINT,
  461.       [MESA_FORMAT_RGB_UINT16] = BRW_SURFACEFORMAT_R16G16B16_UINT,
  462.       [MESA_FORMAT_RGBA_UINT16] = BRW_SURFACEFORMAT_R16G16B16A16_UINT,
  463.       [MESA_FORMAT_R_UINT32] = BRW_SURFACEFORMAT_R32_UINT,
  464.       [MESA_FORMAT_RG_UINT32] = BRW_SURFACEFORMAT_R32G32_UINT,
  465.       [MESA_FORMAT_RGB_UINT32] = BRW_SURFACEFORMAT_R32G32B32_UINT,
  466.       [MESA_FORMAT_RGBA_UINT32] = BRW_SURFACEFORMAT_R32G32B32A32_UINT,
  467.  
  468.       [MESA_FORMAT_R_SNORM8] = BRW_SURFACEFORMAT_R8_SNORM,
  469.       [MESA_FORMAT_R8G8_SNORM] = BRW_SURFACEFORMAT_R8G8_SNORM,
  470.       [MESA_FORMAT_X8B8G8R8_SNORM] = 0,
  471.       [MESA_FORMAT_A8B8G8R8_SNORM] = 0,
  472.       [MESA_FORMAT_R8G8B8A8_SNORM] = BRW_SURFACEFORMAT_R8G8B8A8_SNORM,
  473.       [MESA_FORMAT_R_SNORM16] = BRW_SURFACEFORMAT_R16_SNORM,
  474.       [MESA_FORMAT_R16G16_SNORM] = BRW_SURFACEFORMAT_R16G16_SNORM,
  475.       [MESA_FORMAT_RGB_SNORM16] = BRW_SURFACEFORMAT_R16G16B16_SNORM,
  476.       [MESA_FORMAT_RGBA_SNORM16] = BRW_SURFACEFORMAT_R16G16B16A16_SNORM,
  477.       [MESA_FORMAT_RGBA_UNORM16] = BRW_SURFACEFORMAT_R16G16B16A16_UNORM,
  478.  
  479.       [MESA_FORMAT_R_RGTC1_UNORM] = BRW_SURFACEFORMAT_BC4_UNORM,
  480.       [MESA_FORMAT_R_RGTC1_SNORM] = BRW_SURFACEFORMAT_BC4_SNORM,
  481.       [MESA_FORMAT_RG_RGTC2_UNORM] = BRW_SURFACEFORMAT_BC5_UNORM,
  482.       [MESA_FORMAT_RG_RGTC2_SNORM] = BRW_SURFACEFORMAT_BC5_SNORM,
  483.  
  484.       [MESA_FORMAT_L_LATC1_UNORM] = 0,
  485.       [MESA_FORMAT_L_LATC1_SNORM] = 0,
  486.       [MESA_FORMAT_LA_LATC2_UNORM] = 0,
  487.       [MESA_FORMAT_LA_LATC2_SNORM] = 0,
  488.  
  489.       [MESA_FORMAT_ETC1_RGB8] = BRW_SURFACEFORMAT_ETC1_RGB8,
  490.       [MESA_FORMAT_ETC2_RGB8] = BRW_SURFACEFORMAT_ETC2_RGB8,
  491.       [MESA_FORMAT_ETC2_SRGB8] = BRW_SURFACEFORMAT_ETC2_SRGB8,
  492.       [MESA_FORMAT_ETC2_RGBA8_EAC] = BRW_SURFACEFORMAT_ETC2_EAC_RGBA8,
  493.       [MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = BRW_SURFACEFORMAT_ETC2_EAC_SRGB8_A8,
  494.       [MESA_FORMAT_ETC2_R11_EAC] = BRW_SURFACEFORMAT_EAC_R11,
  495.       [MESA_FORMAT_ETC2_RG11_EAC] = BRW_SURFACEFORMAT_EAC_RG11,
  496.       [MESA_FORMAT_ETC2_SIGNED_R11_EAC] = BRW_SURFACEFORMAT_EAC_SIGNED_R11,
  497.       [MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = BRW_SURFACEFORMAT_EAC_SIGNED_RG11,
  498.       [MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = BRW_SURFACEFORMAT_ETC2_RGB8_PTA,
  499.       [MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = BRW_SURFACEFORMAT_ETC2_SRGB8_PTA,
  500.  
  501.       [MESA_FORMAT_BPTC_RGBA_UNORM] = BRW_SURFACEFORMAT_BC7_UNORM,
  502.       [MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM] = BRW_SURFACEFORMAT_BC7_UNORM_SRGB,
  503.       [MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT] = BRW_SURFACEFORMAT_BC6H_SF16,
  504.       [MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT] = BRW_SURFACEFORMAT_BC6H_UF16,
  505.  
  506.       [MESA_FORMAT_A_SNORM8] = 0,
  507.       [MESA_FORMAT_L_SNORM8] = 0,
  508.       [MESA_FORMAT_L8A8_SNORM] = 0,
  509.       [MESA_FORMAT_A8L8_SNORM] = 0,
  510.       [MESA_FORMAT_I_SNORM8] = 0,
  511.       [MESA_FORMAT_A_SNORM16] = 0,
  512.       [MESA_FORMAT_L_SNORM16] = 0,
  513.       [MESA_FORMAT_LA_SNORM16] = 0,
  514.       [MESA_FORMAT_I_SNORM16] = 0,
  515.  
  516.       [MESA_FORMAT_R9G9B9E5_FLOAT] = BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP,
  517.       [MESA_FORMAT_R11G11B10_FLOAT] = BRW_SURFACEFORMAT_R11G11B10_FLOAT,
  518.  
  519.       [MESA_FORMAT_Z_FLOAT32] = 0,
  520.       [MESA_FORMAT_Z32_FLOAT_S8X24_UINT] = 0,
  521.  
  522.       [MESA_FORMAT_R10G10B10A2_UNORM] = BRW_SURFACEFORMAT_R10G10B10A2_UNORM,
  523.       [MESA_FORMAT_B10G10R10A2_UINT] = BRW_SURFACEFORMAT_B10G10R10A2_UINT,
  524.       [MESA_FORMAT_R10G10B10A2_UINT] = BRW_SURFACEFORMAT_R10G10B10A2_UINT,
  525.  
  526.       [MESA_FORMAT_B4G4R4X4_UNORM] = 0,
  527.       [MESA_FORMAT_B5G5R5X1_UNORM] = BRW_SURFACEFORMAT_B5G5R5X1_UNORM,
  528.       [MESA_FORMAT_R8G8B8X8_SNORM] = 0,
  529.       [MESA_FORMAT_R8G8B8X8_SRGB] = BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB,
  530.       [MESA_FORMAT_X8B8G8R8_SRGB] = 0,
  531.       [MESA_FORMAT_RGBX_UINT8] = 0,
  532.       [MESA_FORMAT_RGBX_SINT8] = 0,
  533.       [MESA_FORMAT_B10G10R10X2_UNORM] = BRW_SURFACEFORMAT_B10G10R10X2_UNORM,
  534.       [MESA_FORMAT_RGBX_UNORM16] = BRW_SURFACEFORMAT_R16G16B16X16_UNORM,
  535.       [MESA_FORMAT_RGBX_SNORM16] = 0,
  536.       [MESA_FORMAT_RGBX_FLOAT16] = BRW_SURFACEFORMAT_R16G16B16X16_FLOAT,
  537.       [MESA_FORMAT_RGBX_UINT16] = 0,
  538.       [MESA_FORMAT_RGBX_SINT16] = 0,
  539.       [MESA_FORMAT_RGBX_FLOAT32] = BRW_SURFACEFORMAT_R32G32B32X32_FLOAT,
  540.       [MESA_FORMAT_RGBX_UINT32] = 0,
  541.       [MESA_FORMAT_RGBX_SINT32] = 0,
  542.    };
  543.    assert(mesa_format < MESA_FORMAT_COUNT);
  544.    return table[mesa_format];
  545. }
  546.  
  547. void
  548. brw_init_surface_formats(struct brw_context *brw)
  549. {
  550.    struct gl_context *ctx = &brw->ctx;
  551.    int gen;
  552.    mesa_format format;
  553.  
  554.    memset(&ctx->TextureFormatSupported, 0, sizeof(ctx->TextureFormatSupported));
  555.  
  556.    gen = brw->gen * 10;
  557.    if (brw->is_g4x || brw->is_haswell)
  558.       gen += 5;
  559.  
  560.    for (format = MESA_FORMAT_NONE + 1; format < MESA_FORMAT_COUNT; format++) {
  561.       uint32_t texture, render;
  562.       const struct surface_format_info *rinfo, *tinfo;
  563.       bool is_integer = _mesa_is_format_integer_color(format);
  564.  
  565.       render = texture = brw_format_for_mesa_format(format);
  566.       tinfo = &surface_formats[texture];
  567.  
  568.       /* The value of BRW_SURFACEFORMAT_R32G32B32A32_FLOAT is 0, so don't skip
  569.        * it.
  570.        */
  571.       if (texture == 0 && format != MESA_FORMAT_RGBA_FLOAT32)
  572.          continue;
  573.  
  574.       if (gen >= tinfo->sampling && (gen >= tinfo->filtering || is_integer))
  575.          ctx->TextureFormatSupported[format] = true;
  576.  
  577.       /* Re-map some render target formats to make them supported when they
  578.        * wouldn't be using their format for texturing.
  579.        */
  580.       switch (render) {
  581.          /* For these formats, we just need to read/write the first
  582.           * channel into R, which is to say that we just treat them as
  583.           * GL_RED.
  584.           */
  585.       case BRW_SURFACEFORMAT_I32_FLOAT:
  586.       case BRW_SURFACEFORMAT_L32_FLOAT:
  587.          render = BRW_SURFACEFORMAT_R32_FLOAT;
  588.          break;
  589.       case BRW_SURFACEFORMAT_I16_FLOAT:
  590.       case BRW_SURFACEFORMAT_L16_FLOAT:
  591.          render = BRW_SURFACEFORMAT_R16_FLOAT;
  592.          break;
  593.       case BRW_SURFACEFORMAT_I8_UNORM:
  594.       case BRW_SURFACEFORMAT_L8_UNORM:
  595.          render = BRW_SURFACEFORMAT_R8_UNORM;
  596.          break;
  597.       case BRW_SURFACEFORMAT_I16_UNORM:
  598.       case BRW_SURFACEFORMAT_L16_UNORM:
  599.          render = BRW_SURFACEFORMAT_R16_UNORM;
  600.          break;
  601.       case BRW_SURFACEFORMAT_R16G16B16X16_UNORM:
  602.          render = BRW_SURFACEFORMAT_R16G16B16A16_UNORM;
  603.          break;
  604.       case BRW_SURFACEFORMAT_R16G16B16X16_FLOAT:
  605.          render = BRW_SURFACEFORMAT_R16G16B16A16_FLOAT;
  606.          break;
  607.       case BRW_SURFACEFORMAT_B8G8R8X8_UNORM:
  608.          /* XRGB is handled as ARGB because the chips in this family
  609.           * cannot render to XRGB targets.  This means that we have to
  610.           * mask writes to alpha (ala glColorMask) and reconfigure the
  611.           * alpha blending hardware to use GL_ONE (or GL_ZERO) for
  612.           * cases where GL_DST_ALPHA (or GL_ONE_MINUS_DST_ALPHA) is
  613.           * used.
  614.           */
  615.          render = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
  616.          break;
  617.       case BRW_SURFACEFORMAT_R8G8B8X8_UNORM:
  618.          render = BRW_SURFACEFORMAT_R8G8B8A8_UNORM;
  619.          break;
  620.       case BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB:
  621.          render = BRW_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB;
  622.          break;
  623.       }
  624.  
  625.       rinfo = &surface_formats[render];
  626.  
  627.       /* Note that GL_EXT_texture_integer says that blending doesn't occur for
  628.        * integer, so we don't need hardware support for blending on it.  Other
  629.        * than that, GL in general requires alpha blending for render targets,
  630.        * even though we don't support it for some formats.
  631.        */
  632.       if (gen >= rinfo->render_target &&
  633.           (gen >= rinfo->alpha_blend || is_integer)) {
  634.          brw->render_target_format[format] = render;
  635.          brw->format_supported_as_render_target[format] = true;
  636.       }
  637.    }
  638.  
  639.    /* We will check this table for FBO completeness, but the surface format
  640.     * table above only covered color rendering.
  641.     */
  642.    brw->format_supported_as_render_target[MESA_FORMAT_Z24_UNORM_S8_UINT] = true;
  643.    brw->format_supported_as_render_target[MESA_FORMAT_Z24_UNORM_X8_UINT] = true;
  644.    brw->format_supported_as_render_target[MESA_FORMAT_S_UINT8] = true;
  645.    brw->format_supported_as_render_target[MESA_FORMAT_Z_FLOAT32] = true;
  646.    brw->format_supported_as_render_target[MESA_FORMAT_Z32_FLOAT_S8X24_UINT] = true;
  647.    if (brw->gen >= 8)
  648.       brw->format_supported_as_render_target[MESA_FORMAT_Z_UNORM16] = true;
  649.  
  650.    /* We remap depth formats to a supported texturing format in
  651.     * translate_tex_format().
  652.     */
  653.    ctx->TextureFormatSupported[MESA_FORMAT_Z24_UNORM_S8_UINT] = true;
  654.    ctx->TextureFormatSupported[MESA_FORMAT_Z24_UNORM_X8_UINT] = true;
  655.    ctx->TextureFormatSupported[MESA_FORMAT_Z_FLOAT32] = true;
  656.    ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_S8X24_UINT] = true;
  657.  
  658.    /* Benchmarking shows that Z16 is slower than Z24, so there's no reason to
  659.     * use it unless you're under memory (not memory bandwidth) pressure.
  660.     *
  661.     * Apparently, the GPU's depth scoreboarding works on a 32-bit granularity,
  662.     * which corresponds to one pixel in the depth buffer for Z24 or Z32 formats.
  663.     * However, it corresponds to two pixels with Z16, which means both need to
  664.     * hit the early depth case in order for it to happen.
  665.     *
  666.     * Other speculation is that we may be hitting increased fragment shader
  667.     * execution from GL_LEQUAL/GL_EQUAL depth tests at reduced precision.
  668.     *
  669.     * With the PMA stall workaround in place, Z16 is faster than Z24, as it
  670.     * should be.
  671.     */
  672.    if (brw->gen >= 8)
  673.       ctx->TextureFormatSupported[MESA_FORMAT_Z_UNORM16] = true;
  674.  
  675.    /* On hardware that lacks support for ETC1, we map ETC1 to RGBX
  676.     * during glCompressedTexImage2D(). See intel_mipmap_tree::wraps_etc1.
  677.     */
  678.    ctx->TextureFormatSupported[MESA_FORMAT_ETC1_RGB8] = true;
  679.  
  680.    /* On hardware that lacks support for ETC2, we map ETC2 to a suitable
  681.     * MESA_FORMAT during glCompressedTexImage2D().
  682.     * See intel_mipmap_tree::wraps_etc2.
  683.     */
  684.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGB8] = true;
  685.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8] = true;
  686.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGBA8_EAC] = true;
  687.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = true;
  688.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_R11_EAC] = true;
  689.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RG11_EAC] = true;
  690.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SIGNED_R11_EAC] = true;
  691.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = true;
  692.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] = true;
  693.    ctx->TextureFormatSupported[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] = true;
  694. }
  695.  
  696. bool
  697. brw_render_target_supported(struct brw_context *brw,
  698.                             struct gl_renderbuffer *rb)
  699. {
  700.    mesa_format format = rb->Format;
  701.  
  702.    /* Many integer formats are promoted to RGBA (like XRGB8888 is), which means
  703.     * we would consider them renderable even though we don't have surface
  704.     * support for their alpha behavior and don't have the blending unit
  705.     * available to fake it like we do for XRGB8888.  Force them to being
  706.     * unsupported.
  707.     */
  708.    if (_mesa_is_format_integer_color(format) &&
  709.        rb->_BaseFormat != GL_RGBA &&
  710.        rb->_BaseFormat != GL_RG &&
  711.        rb->_BaseFormat != GL_RED)
  712.       return false;
  713.  
  714.    /* Under some conditions, MSAA is not supported for formats whose width is
  715.     * more than 64 bits.
  716.     */
  717.    if (rb->NumSamples > 0 && _mesa_get_format_bytes(format) > 8) {
  718.       /* Gen6: MSAA on >64 bit formats is unsupported. */
  719.       if (brw->gen <= 6)
  720.          return false;
  721.  
  722.       /* Gen7: 8x MSAA on >64 bit formats is unsupported. */
  723.       if (rb->NumSamples >= 8)
  724.          return false;
  725.    }
  726.  
  727.    return brw->format_supported_as_render_target[format];
  728. }
  729.  
  730. GLuint
  731. translate_tex_format(struct brw_context *brw,
  732.                      mesa_format mesa_format,
  733.                      GLenum srgb_decode)
  734. {
  735.    struct gl_context *ctx = &brw->ctx;
  736.    if (srgb_decode == GL_SKIP_DECODE_EXT)
  737.       mesa_format = _mesa_get_srgb_format_linear(mesa_format);
  738.  
  739.    switch( mesa_format ) {
  740.  
  741.    case MESA_FORMAT_Z_UNORM16:
  742.       return BRW_SURFACEFORMAT_R16_UNORM;
  743.  
  744.    case MESA_FORMAT_Z24_UNORM_S8_UINT:
  745.    case MESA_FORMAT_Z24_UNORM_X8_UINT:
  746.       return BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS;
  747.  
  748.    case MESA_FORMAT_Z_FLOAT32:
  749.       return BRW_SURFACEFORMAT_R32_FLOAT;
  750.  
  751.    case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
  752.       return BRW_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS;
  753.  
  754.    case MESA_FORMAT_RGBA_FLOAT32:
  755.       /* The value of this BRW_SURFACEFORMAT is 0, which tricks the
  756.        * assertion below.
  757.        */
  758.       return BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
  759.  
  760.    case MESA_FORMAT_SRGB_DXT1:
  761.       if (brw->gen == 4 && !brw->is_g4x) {
  762.          /* Work around missing SRGB DXT1 support on original gen4 by just
  763.           * skipping SRGB decode.  It's not worth not supporting sRGB in
  764.           * general to prevent this.
  765.           */
  766.          WARN_ONCE(true, "Demoting sRGB DXT1 texture to non-sRGB\n");
  767.          mesa_format = MESA_FORMAT_RGB_DXT1;
  768.       }
  769.       return brw_format_for_mesa_format(mesa_format);
  770.  
  771.    default:
  772.       assert(brw_format_for_mesa_format(mesa_format) != 0);
  773.       return brw_format_for_mesa_format(mesa_format);
  774.    }
  775. }
  776.  
  777. /**
  778.  * Convert a MESA_FORMAT to the corresponding BRW_DEPTHFORMAT enum.
  779.  */
  780. uint32_t
  781. brw_depth_format(struct brw_context *brw, mesa_format format)
  782. {
  783.    switch (format) {
  784.    case MESA_FORMAT_Z_UNORM16:
  785.       return BRW_DEPTHFORMAT_D16_UNORM;
  786.    case MESA_FORMAT_Z_FLOAT32:
  787.       return BRW_DEPTHFORMAT_D32_FLOAT;
  788.    case MESA_FORMAT_Z24_UNORM_X8_UINT:
  789.       if (brw->gen >= 6) {
  790.          return BRW_DEPTHFORMAT_D24_UNORM_X8_UINT;
  791.       } else {
  792.          /* Use D24_UNORM_S8, not D24_UNORM_X8.
  793.           *
  794.           * D24_UNORM_X8 was not introduced until Gen5. (See the Ironlake PRM,
  795.           * Volume 2, Part 1, Section 8.4.6 "Depth/Stencil Buffer State", Bits
  796.           * 3DSTATE_DEPTH_BUFFER.Surface_Format).
  797.           *
  798.           * However, on Gen5, D24_UNORM_X8 may be used only if separate
  799.           * stencil is enabled, and we never enable it. From the Ironlake PRM,
  800.           * same section as above, 3DSTATE_DEPTH_BUFFER's
  801.           * "Separate Stencil Buffer Enable" bit:
  802.           *
  803.           * "If this field is disabled, the Surface Format of the depth
  804.           *  buffer cannot be D24_UNORM_X8_UINT."
  805.           */
  806.          return BRW_DEPTHFORMAT_D24_UNORM_S8_UINT;
  807.       }
  808.    case MESA_FORMAT_Z24_UNORM_S8_UINT:
  809.       return BRW_DEPTHFORMAT_D24_UNORM_S8_UINT;
  810.    case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
  811.       return BRW_DEPTHFORMAT_D32_FLOAT_S8X24_UINT;
  812.    default:
  813.       unreachable("Unexpected depth format.");
  814.    }
  815. }
  816.