Home | History | Annotate | Download | only in core
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2012-2013 LunarG, Inc.
      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 shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors:
     25  *    Chia-I Wu <olv (at) lunarg.com>
     26  */
     27 
     28 #include "genhw/genhw.h"
     29 #include "ilo_state_surface.h"
     30 
     31 static bool
     32 surface_valid_sampler_format(const struct ilo_dev *dev,
     33                              enum ilo_state_surface_access access,
     34                              enum gen_surface_format format)
     35 {
     36    /*
     37     * This table is based on:
     38     *
     39     *  - the Sandy Bridge PRM, volume 4 part 1, page 88-97
     40     *  - the Ivy Bridge PRM, volume 4 part 1, page 84-87
     41     */
     42    static const struct sampler_cap {
     43       int sampling;
     44       int filtering;
     45       int shadow_map;
     46       int chroma_key;
     47    } caps[] = {
     48 #define CAP(sampling, filtering, shadow_map, chroma_key) \
     49       { ILO_GEN(sampling), ILO_GEN(filtering), ILO_GEN(shadow_map), ILO_GEN(chroma_key) }
     50       [GEN6_FORMAT_R32G32B32A32_FLOAT]       = CAP(  1,   5,   0,   0),
     51       [GEN6_FORMAT_R32G32B32A32_SINT]        = CAP(  1,   0,   0,   0),
     52       [GEN6_FORMAT_R32G32B32A32_UINT]        = CAP(  1,   0,   0,   0),
     53       [GEN6_FORMAT_R32G32B32X32_FLOAT]       = CAP(  1,   5,   0,   0),
     54       [GEN6_FORMAT_R32G32B32_FLOAT]          = CAP(  1,   5,   0,   0),
     55       [GEN6_FORMAT_R32G32B32_SINT]           = CAP(  1,   0,   0,   0),
     56       [GEN6_FORMAT_R32G32B32_UINT]           = CAP(  1,   0,   0,   0),
     57       [GEN6_FORMAT_R16G16B16A16_UNORM]       = CAP(  1,   1,   0,   0),
     58       [GEN6_FORMAT_R16G16B16A16_SNORM]       = CAP(  1,   1,   0,   0),
     59       [GEN6_FORMAT_R16G16B16A16_SINT]        = CAP(  1,   0,   0,   0),
     60       [GEN6_FORMAT_R16G16B16A16_UINT]        = CAP(  1,   0,   0,   0),
     61       [GEN6_FORMAT_R16G16B16A16_FLOAT]       = CAP(  1,   1,   0,   0),
     62       [GEN6_FORMAT_R32G32_FLOAT]             = CAP(  1,   5,   0,   0),
     63       [GEN6_FORMAT_R32G32_SINT]              = CAP(  1,   0,   0,   0),
     64       [GEN6_FORMAT_R32G32_UINT]              = CAP(  1,   0,   0,   0),
     65       [GEN6_FORMAT_R32_FLOAT_X8X24_TYPELESS] = CAP(  1,   5,   1,   0),
     66       [GEN6_FORMAT_X32_TYPELESS_G8X24_UINT]  = CAP(  1,   0,   0,   0),
     67       [GEN6_FORMAT_L32A32_FLOAT]             = CAP(  1,   5,   0,   0),
     68       [GEN6_FORMAT_R16G16B16X16_UNORM]       = CAP(  1,   1,   0,   0),
     69       [GEN6_FORMAT_R16G16B16X16_FLOAT]       = CAP(  1,   1,   0,   0),
     70       [GEN6_FORMAT_A32X32_FLOAT]             = CAP(  1,   5,   0,   0),
     71       [GEN6_FORMAT_L32X32_FLOAT]             = CAP(  1,   5,   0,   0),
     72       [GEN6_FORMAT_I32X32_FLOAT]             = CAP(  1,   5,   0,   0),
     73       [GEN6_FORMAT_B8G8R8A8_UNORM]           = CAP(  1,   1,   0,   1),
     74       [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
     75       [GEN6_FORMAT_R10G10B10A2_UNORM]        = CAP(  1,   1,   0,   0),
     76       [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB]   = CAP(  1,   1,   0,   0),
     77       [GEN6_FORMAT_R10G10B10A2_UINT]         = CAP(  1,   0,   0,   0),
     78       [GEN6_FORMAT_R10G10B10_SNORM_A2_UNORM] = CAP(  1,   1,   0,   0),
     79       [GEN6_FORMAT_R8G8B8A8_UNORM]           = CAP(  1,   1,   0,   0),
     80       [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
     81       [GEN6_FORMAT_R8G8B8A8_SNORM]           = CAP(  1,   1,   0,   0),
     82       [GEN6_FORMAT_R8G8B8A8_SINT]            = CAP(  1,   0,   0,   0),
     83       [GEN6_FORMAT_R8G8B8A8_UINT]            = CAP(  1,   0,   0,   0),
     84       [GEN6_FORMAT_R16G16_UNORM]             = CAP(  1,   1,   0,   0),
     85       [GEN6_FORMAT_R16G16_SNORM]             = CAP(  1,   1,   0,   0),
     86       [GEN6_FORMAT_R16G16_SINT]              = CAP(  1,   0,   0,   0),
     87       [GEN6_FORMAT_R16G16_UINT]              = CAP(  1,   0,   0,   0),
     88       [GEN6_FORMAT_R16G16_FLOAT]             = CAP(  1,   1,   0,   0),
     89       [GEN6_FORMAT_B10G10R10A2_UNORM]        = CAP(  1,   1,   0,   0),
     90       [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB]   = CAP(  1,   1,   0,   0),
     91       [GEN6_FORMAT_R11G11B10_FLOAT]          = CAP(  1,   1,   0,   0),
     92       [GEN6_FORMAT_R32_SINT]                 = CAP(  1,   0,   0,   0),
     93       [GEN6_FORMAT_R32_UINT]                 = CAP(  1,   0,   0,   0),
     94       [GEN6_FORMAT_R32_FLOAT]                = CAP(  1,   5,   1,   0),
     95       [GEN6_FORMAT_R24_UNORM_X8_TYPELESS]    = CAP(  1,   5,   1,   0),
     96       [GEN6_FORMAT_X24_TYPELESS_G8_UINT]     = CAP(  1,   0,   0,   0),
     97       [GEN6_FORMAT_L16A16_UNORM]             = CAP(  1,   1,   0,   0),
     98       [GEN6_FORMAT_I24X8_UNORM]              = CAP(  1,   5,   1,   0),
     99       [GEN6_FORMAT_L24X8_UNORM]              = CAP(  1,   5,   1,   0),
    100       [GEN6_FORMAT_A24X8_UNORM]              = CAP(  1,   5,   1,   0),
    101       [GEN6_FORMAT_I32_FLOAT]                = CAP(  1,   5,   1,   0),
    102       [GEN6_FORMAT_L32_FLOAT]                = CAP(  1,   5,   1,   0),
    103       [GEN6_FORMAT_A32_FLOAT]                = CAP(  1,   5,   1,   0),
    104       [GEN6_FORMAT_B8G8R8X8_UNORM]           = CAP(  1,   1,   0,   1),
    105       [GEN6_FORMAT_B8G8R8X8_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    106       [GEN6_FORMAT_R8G8B8X8_UNORM]           = CAP(  1,   1,   0,   0),
    107       [GEN6_FORMAT_R8G8B8X8_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    108       [GEN6_FORMAT_R9G9B9E5_SHAREDEXP]       = CAP(  1,   1,   0,   0),
    109       [GEN6_FORMAT_B10G10R10X2_UNORM]        = CAP(  1,   1,   0,   0),
    110       [GEN6_FORMAT_L16A16_FLOAT]             = CAP(  1,   1,   0,   0),
    111       [GEN6_FORMAT_B5G6R5_UNORM]             = CAP(  1,   1,   0,   1),
    112       [GEN6_FORMAT_B5G6R5_UNORM_SRGB]        = CAP(  1,   1,   0,   0),
    113       [GEN6_FORMAT_B5G5R5A1_UNORM]           = CAP(  1,   1,   0,   1),
    114       [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    115       [GEN6_FORMAT_B4G4R4A4_UNORM]           = CAP(  1,   1,   0,   1),
    116       [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    117       [GEN6_FORMAT_R8G8_UNORM]               = CAP(  1,   1,   0,   0),
    118       [GEN6_FORMAT_R8G8_SNORM]               = CAP(  1,   1,   0,   1),
    119       [GEN6_FORMAT_R8G8_SINT]                = CAP(  1,   0,   0,   0),
    120       [GEN6_FORMAT_R8G8_UINT]                = CAP(  1,   0,   0,   0),
    121       [GEN6_FORMAT_R16_UNORM]                = CAP(  1,   1,   1,   0),
    122       [GEN6_FORMAT_R16_SNORM]                = CAP(  1,   1,   0,   0),
    123       [GEN6_FORMAT_R16_SINT]                 = CAP(  1,   0,   0,   0),
    124       [GEN6_FORMAT_R16_UINT]                 = CAP(  1,   0,   0,   0),
    125       [GEN6_FORMAT_R16_FLOAT]                = CAP(  1,   1,   0,   0),
    126       [GEN6_FORMAT_A8P8_UNORM_PALETTE0]      = CAP(  5,   5,   0,   0),
    127       [GEN6_FORMAT_A8P8_UNORM_PALETTE1]      = CAP(  5,   5,   0,   0),
    128       [GEN6_FORMAT_I16_UNORM]                = CAP(  1,   1,   1,   0),
    129       [GEN6_FORMAT_L16_UNORM]                = CAP(  1,   1,   1,   0),
    130       [GEN6_FORMAT_A16_UNORM]                = CAP(  1,   1,   1,   0),
    131       [GEN6_FORMAT_L8A8_UNORM]               = CAP(  1,   1,   0,   1),
    132       [GEN6_FORMAT_I16_FLOAT]                = CAP(  1,   1,   1,   0),
    133       [GEN6_FORMAT_L16_FLOAT]                = CAP(  1,   1,   1,   0),
    134       [GEN6_FORMAT_A16_FLOAT]                = CAP(  1,   1,   1,   0),
    135       [GEN6_FORMAT_L8A8_UNORM_SRGB]          = CAP(4.5, 4.5,   0,   0),
    136       [GEN6_FORMAT_R5G5_SNORM_B6_UNORM]      = CAP(  1,   1,   0,   1),
    137       [GEN6_FORMAT_P8A8_UNORM_PALETTE0]      = CAP(  5,   5,   0,   0),
    138       [GEN6_FORMAT_P8A8_UNORM_PALETTE1]      = CAP(  5,   5,   0,   0),
    139       [GEN6_FORMAT_R8_UNORM]                 = CAP(  1,   1,   0, 4.5),
    140       [GEN6_FORMAT_R8_SNORM]                 = CAP(  1,   1,   0,   0),
    141       [GEN6_FORMAT_R8_SINT]                  = CAP(  1,   0,   0,   0),
    142       [GEN6_FORMAT_R8_UINT]                  = CAP(  1,   0,   0,   0),
    143       [GEN6_FORMAT_A8_UNORM]                 = CAP(  1,   1,   0,   1),
    144       [GEN6_FORMAT_I8_UNORM]                 = CAP(  1,   1,   0,   0),
    145       [GEN6_FORMAT_L8_UNORM]                 = CAP(  1,   1,   0,   1),
    146       [GEN6_FORMAT_P4A4_UNORM_PALETTE0]      = CAP(  1,   1,   0,   0),
    147       [GEN6_FORMAT_A4P4_UNORM_PALETTE0]      = CAP(  1,   1,   0,   0),
    148       [GEN6_FORMAT_P8_UNORM_PALETTE0]        = CAP(4.5, 4.5,   0,   0),
    149       [GEN6_FORMAT_L8_UNORM_SRGB]            = CAP(4.5, 4.5,   0,   0),
    150       [GEN6_FORMAT_P8_UNORM_PALETTE1]        = CAP(4.5, 4.5,   0,   0),
    151       [GEN6_FORMAT_P4A4_UNORM_PALETTE1]      = CAP(4.5, 4.5,   0,   0),
    152       [GEN6_FORMAT_A4P4_UNORM_PALETTE1]      = CAP(4.5, 4.5,   0,   0),
    153       [GEN6_FORMAT_DXT1_RGB_SRGB]            = CAP(4.5, 4.5,   0,   0),
    154       [GEN6_FORMAT_R1_UNORM]                 = CAP(  1,   1,   0,   0),
    155       [GEN6_FORMAT_YCRCB_NORMAL]             = CAP(  1,   1,   0,   1),
    156       [GEN6_FORMAT_YCRCB_SWAPUVY]            = CAP(  1,   1,   0,   1),
    157       [GEN6_FORMAT_P2_UNORM_PALETTE0]        = CAP(4.5, 4.5,   0,   0),
    158       [GEN6_FORMAT_P2_UNORM_PALETTE1]        = CAP(4.5, 4.5,   0,   0),
    159       [GEN6_FORMAT_BC1_UNORM]                = CAP(  1,   1,   0,   1),
    160       [GEN6_FORMAT_BC2_UNORM]                = CAP(  1,   1,   0,   1),
    161       [GEN6_FORMAT_BC3_UNORM]                = CAP(  1,   1,   0,   1),
    162       [GEN6_FORMAT_BC4_UNORM]                = CAP(  1,   1,   0,   0),
    163       [GEN6_FORMAT_BC5_UNORM]                = CAP(  1,   1,   0,   0),
    164       [GEN6_FORMAT_BC1_UNORM_SRGB]           = CAP(  1,   1,   0,   0),
    165       [GEN6_FORMAT_BC2_UNORM_SRGB]           = CAP(  1,   1,   0,   0),
    166       [GEN6_FORMAT_BC3_UNORM_SRGB]           = CAP(  1,   1,   0,   0),
    167       [GEN6_FORMAT_MONO8]                    = CAP(  1,   0,   0,   0),
    168       [GEN6_FORMAT_YCRCB_SWAPUV]             = CAP(  1,   1,   0,   0),
    169       [GEN6_FORMAT_YCRCB_SWAPY]              = CAP(  1,   1,   0,   0),
    170       [GEN6_FORMAT_DXT1_RGB]                 = CAP(  1,   1,   0,   0),
    171       [GEN6_FORMAT_FXT1]                     = CAP(  1,   1,   0,   0),
    172       [GEN6_FORMAT_BC4_SNORM]                = CAP(  1,   1,   0,   0),
    173       [GEN6_FORMAT_BC5_SNORM]                = CAP(  1,   1,   0,   0),
    174       [GEN6_FORMAT_R16G16B16_FLOAT]          = CAP(  5,   5,   0,   0),
    175       [GEN6_FORMAT_BC6H_SF16]                = CAP(  7,   7,   0,   0),
    176       [GEN6_FORMAT_BC7_UNORM]                = CAP(  7,   7,   0,   0),
    177       [GEN6_FORMAT_BC7_UNORM_SRGB]           = CAP(  7,   7,   0,   0),
    178       [GEN6_FORMAT_BC6H_UF16]                = CAP(  7,   7,   0,   0),
    179 #undef CAP
    180    };
    181 
    182    ILO_DEV_ASSERT(dev, 6, 8);
    183 
    184    return (format < ARRAY_SIZE(caps) && caps[format].sampling &&
    185            ilo_dev_gen(dev) >= caps[format].sampling);
    186 }
    187 
    188 static bool
    189 surface_valid_dp_format(const struct ilo_dev *dev,
    190                         enum ilo_state_surface_access access,
    191                         enum gen_surface_format format)
    192 {
    193    /*
    194     * This table is based on:
    195     *
    196     *  - the Sandy Bridge PRM, volume 4 part 1, page 88-97
    197     *  - the Ivy Bridge PRM, volume 4 part 1, page 172, 252-253, and 277-278
    198     *  - the Haswell PRM, volume 7, page 262-264
    199     */
    200    static const struct dp_cap {
    201       int rt_write;
    202       int rt_write_blending;
    203       int typed_write;
    204       int media_color_processing;
    205    } caps[] = {
    206 #define CAP(rt_write, rt_write_blending, typed_write, media_color_processing) \
    207       { ILO_GEN(rt_write), ILO_GEN(rt_write_blending), ILO_GEN(typed_write), ILO_GEN(media_color_processing) }
    208       [GEN6_FORMAT_R32G32B32A32_FLOAT]       = CAP(  1,   1,   7,   0),
    209       [GEN6_FORMAT_R32G32B32A32_SINT]        = CAP(  1,   0,   7,   0),
    210       [GEN6_FORMAT_R32G32B32A32_UINT]        = CAP(  1,   0,   7,   0),
    211       [GEN6_FORMAT_R16G16B16A16_UNORM]       = CAP(  1, 4.5,   7,   6),
    212       [GEN6_FORMAT_R16G16B16A16_SNORM]       = CAP(  1,   6,   7,   0),
    213       [GEN6_FORMAT_R16G16B16A16_SINT]        = CAP(  1,   0,   7,   0),
    214       [GEN6_FORMAT_R16G16B16A16_UINT]        = CAP(  1,   0,   7,   0),
    215       [GEN6_FORMAT_R16G16B16A16_FLOAT]       = CAP(  1,   1,   7,   0),
    216       [GEN6_FORMAT_R32G32_FLOAT]             = CAP(  1,   1,   7,   0),
    217       [GEN6_FORMAT_R32G32_SINT]              = CAP(  1,   0,   7,   0),
    218       [GEN6_FORMAT_R32G32_UINT]              = CAP(  1,   0,   7,   0),
    219       [GEN6_FORMAT_B8G8R8A8_UNORM]           = CAP(  1,   1,   7,   6),
    220       [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    221       [GEN6_FORMAT_R10G10B10A2_UNORM]        = CAP(  1,   1,   7,   6),
    222       [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB]   = CAP(  0,   0,   0,   6),
    223       [GEN6_FORMAT_R10G10B10A2_UINT]         = CAP(  1,   0,   7,   0),
    224       [GEN6_FORMAT_R8G8B8A8_UNORM]           = CAP(  1,   1,   7,   6),
    225       [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB]      = CAP(  1,   1,   0,   6),
    226       [GEN6_FORMAT_R8G8B8A8_SNORM]           = CAP(  1,   6,   7,   0),
    227       [GEN6_FORMAT_R8G8B8A8_SINT]            = CAP(  1,   0,   7,   0),
    228       [GEN6_FORMAT_R8G8B8A8_UINT]            = CAP(  1,   0,   7,   0),
    229       [GEN6_FORMAT_R16G16_UNORM]             = CAP(  1, 4.5,   7,   0),
    230       [GEN6_FORMAT_R16G16_SNORM]             = CAP(  1,   6,   7,   0),
    231       [GEN6_FORMAT_R16G16_SINT]              = CAP(  1,   0,   7,   0),
    232       [GEN6_FORMAT_R16G16_UINT]              = CAP(  1,   0,   7,   0),
    233       [GEN6_FORMAT_R16G16_FLOAT]             = CAP(  1,   1,   7,   0),
    234       [GEN6_FORMAT_B10G10R10A2_UNORM]        = CAP(  1,   1,   7,   6),
    235       [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB]   = CAP(  1,   1,   0,   6),
    236       [GEN6_FORMAT_R11G11B10_FLOAT]          = CAP(  1,   1,   7,   0),
    237       [GEN6_FORMAT_R32_SINT]                 = CAP(  1,   0,   7,   0),
    238       [GEN6_FORMAT_R32_UINT]                 = CAP(  1,   0,   7,   0),
    239       [GEN6_FORMAT_R32_FLOAT]                = CAP(  1,   1,   7,   0),
    240       [GEN6_FORMAT_B8G8R8X8_UNORM]           = CAP(  0,   0,   0,   6),
    241       [GEN6_FORMAT_B5G6R5_UNORM]             = CAP(  1,   1,   7,   0),
    242       [GEN6_FORMAT_B5G6R5_UNORM_SRGB]        = CAP(  1,   1,   0,   0),
    243       [GEN6_FORMAT_B5G5R5A1_UNORM]           = CAP(  1,   1,   7,   0),
    244       [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    245       [GEN6_FORMAT_B4G4R4A4_UNORM]           = CAP(  1,   1,   7,   0),
    246       [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    247       [GEN6_FORMAT_R8G8_UNORM]               = CAP(  1,   1,   7,   0),
    248       [GEN6_FORMAT_R8G8_SNORM]               = CAP(  1,   6,   7,   0),
    249       [GEN6_FORMAT_R8G8_SINT]                = CAP(  1,   0,   7,   0),
    250       [GEN6_FORMAT_R8G8_UINT]                = CAP(  1,   0,   7,   0),
    251       [GEN6_FORMAT_R16_UNORM]                = CAP(  1, 4.5,   7,   7),
    252       [GEN6_FORMAT_R16_SNORM]                = CAP(  1,   6,   7,   0),
    253       [GEN6_FORMAT_R16_SINT]                 = CAP(  1,   0,   7,   0),
    254       [GEN6_FORMAT_R16_UINT]                 = CAP(  1,   0,   7,   0),
    255       [GEN6_FORMAT_R16_FLOAT]                = CAP(  1,   1,   7,   0),
    256       [GEN6_FORMAT_B5G5R5X1_UNORM]           = CAP(  1,   1,   7,   0),
    257       [GEN6_FORMAT_B5G5R5X1_UNORM_SRGB]      = CAP(  1,   1,   0,   0),
    258       [GEN6_FORMAT_R8_UNORM]                 = CAP(  1,   1,   7,   0),
    259       [GEN6_FORMAT_R8_SNORM]                 = CAP(  1,   6,   7,   0),
    260       [GEN6_FORMAT_R8_SINT]                  = CAP(  1,   0,   7,   0),
    261       [GEN6_FORMAT_R8_UINT]                  = CAP(  1,   0,   7,   0),
    262       [GEN6_FORMAT_A8_UNORM]                 = CAP(  1,   1,   7,   0),
    263       [GEN6_FORMAT_YCRCB_NORMAL]             = CAP(  1,   0,   0,   6),
    264       [GEN6_FORMAT_YCRCB_SWAPUVY]            = CAP(  1,   0,   0,   6),
    265       [GEN6_FORMAT_YCRCB_SWAPUV]             = CAP(  1,   0,   0,   6),
    266       [GEN6_FORMAT_YCRCB_SWAPY]              = CAP(  1,   0,   0,   6),
    267 #undef CAP
    268    };
    269 
    270    ILO_DEV_ASSERT(dev, 6, 8);
    271 
    272    if (format >= ARRAY_SIZE(caps))
    273       return false;
    274 
    275    switch (access) {
    276    case ILO_STATE_SURFACE_ACCESS_DP_RENDER:
    277       return (caps[format].rt_write &&
    278               ilo_dev_gen(dev) >= caps[format].rt_write);
    279    case ILO_STATE_SURFACE_ACCESS_DP_TYPED:
    280       return (caps[format].typed_write &&
    281               ilo_dev_gen(dev) >= caps[format].typed_write);
    282    case ILO_STATE_SURFACE_ACCESS_DP_UNTYPED:
    283       return (format == GEN6_FORMAT_RAW);
    284    case ILO_STATE_SURFACE_ACCESS_DP_DATA:
    285       /* ignored, but can it be raw? */
    286       assert(format != GEN6_FORMAT_RAW);
    287       return true;
    288    default:
    289       return false;
    290    }
    291 }
    292 
    293 static bool
    294 surface_valid_svb_format(const struct ilo_dev *dev,
    295                          enum gen_surface_format format)
    296 {
    297    ILO_DEV_ASSERT(dev, 6, 8);
    298 
    299    /*
    300     * This table is based on:
    301     *
    302     *  - the Sandy Bridge PRM, volume 4 part 1, page 88-97
    303     *  - the Ivy Bridge PRM, volume 2 part 1, page 195
    304     *  - the Haswell PRM, volume 7, page 535
    305     */
    306    switch (format) {
    307    case GEN6_FORMAT_R32G32B32A32_FLOAT:
    308    case GEN6_FORMAT_R32G32B32A32_SINT:
    309    case GEN6_FORMAT_R32G32B32A32_UINT:
    310    case GEN6_FORMAT_R32G32B32_FLOAT:
    311    case GEN6_FORMAT_R32G32B32_SINT:
    312    case GEN6_FORMAT_R32G32B32_UINT:
    313    case GEN6_FORMAT_R32G32_FLOAT:
    314    case GEN6_FORMAT_R32G32_SINT:
    315    case GEN6_FORMAT_R32G32_UINT:
    316    case GEN6_FORMAT_R32_SINT:
    317    case GEN6_FORMAT_R32_UINT:
    318    case GEN6_FORMAT_R32_FLOAT:
    319       return true;
    320    default:
    321       return false;
    322    }
    323 }
    324 
    325 bool
    326 ilo_state_surface_valid_format(const struct ilo_dev *dev,
    327                                enum ilo_state_surface_access access,
    328                                enum gen_surface_format format)
    329 {
    330    bool valid;
    331 
    332    switch (access) {
    333    case ILO_STATE_SURFACE_ACCESS_SAMPLER:
    334       valid = surface_valid_sampler_format(dev, access, format);
    335       break;
    336    case ILO_STATE_SURFACE_ACCESS_DP_RENDER:
    337    case ILO_STATE_SURFACE_ACCESS_DP_TYPED:
    338    case ILO_STATE_SURFACE_ACCESS_DP_UNTYPED:
    339    case ILO_STATE_SURFACE_ACCESS_DP_DATA:
    340       valid = surface_valid_dp_format(dev, access, format);
    341       break;
    342    case ILO_STATE_SURFACE_ACCESS_DP_SVB:
    343       valid = surface_valid_svb_format(dev, format);
    344       break;
    345    default:
    346       valid = false;
    347       break;
    348    }
    349 
    350    return valid;
    351 }
    352