1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright © 2017 Intel Corporation 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 5bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 6bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 7bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 9bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 10bf215546Sopenharmony_ci * 11bf215546Sopenharmony_ci * The above copyright notice and this permission notice shall be included 12bf215546Sopenharmony_ci * in all copies or substantial portions of the Software. 13bf215546Sopenharmony_ci * 14bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20bf215546Sopenharmony_ci * DEALINGS IN THE SOFTWARE. 21bf215546Sopenharmony_ci */ 22bf215546Sopenharmony_ci 23bf215546Sopenharmony_ci/** 24bf215546Sopenharmony_ci * @file crocus_formats.c 25bf215546Sopenharmony_ci * 26bf215546Sopenharmony_ci * Converts Gallium formats (PIPE_FORMAT_*) to hardware ones (ISL_FORMAT_*). 27bf215546Sopenharmony_ci * Provides information about which formats support what features. 28bf215546Sopenharmony_ci */ 29bf215546Sopenharmony_ci 30bf215546Sopenharmony_ci#include "util/bitscan.h" 31bf215546Sopenharmony_ci#include "util/macros.h" 32bf215546Sopenharmony_ci#include "util/format/u_format.h" 33bf215546Sopenharmony_ci 34bf215546Sopenharmony_ci#include "crocus_resource.h" 35bf215546Sopenharmony_ci#include "crocus_screen.h" 36bf215546Sopenharmony_ci 37bf215546Sopenharmony_cistatic enum isl_format 38bf215546Sopenharmony_cicrocus_isl_format_for_pipe_format(enum pipe_format pf) 39bf215546Sopenharmony_ci{ 40bf215546Sopenharmony_ci static const enum isl_format table[PIPE_FORMAT_COUNT] = { 41bf215546Sopenharmony_ci [0 ... PIPE_FORMAT_COUNT-1] = ISL_FORMAT_UNSUPPORTED, 42bf215546Sopenharmony_ci 43bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8A8_UNORM] = ISL_FORMAT_B8G8R8A8_UNORM, 44bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8X8_UNORM] = ISL_FORMAT_B8G8R8X8_UNORM, 45bf215546Sopenharmony_ci [PIPE_FORMAT_B5G5R5A1_UNORM] = ISL_FORMAT_B5G5R5A1_UNORM, 46bf215546Sopenharmony_ci [PIPE_FORMAT_B4G4R4A4_UNORM] = ISL_FORMAT_B4G4R4A4_UNORM, 47bf215546Sopenharmony_ci [PIPE_FORMAT_B5G6R5_UNORM] = ISL_FORMAT_B5G6R5_UNORM, 48bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_UNORM] = ISL_FORMAT_R10G10B10A2_UNORM, 49bf215546Sopenharmony_ci 50bf215546Sopenharmony_ci [PIPE_FORMAT_Z16_UNORM] = ISL_FORMAT_R16_UNORM, 51bf215546Sopenharmony_ci [PIPE_FORMAT_Z32_UNORM] = ISL_FORMAT_R32_UNORM, 52bf215546Sopenharmony_ci [PIPE_FORMAT_Z32_FLOAT] = ISL_FORMAT_R32_FLOAT, 53bf215546Sopenharmony_ci 54bf215546Sopenharmony_ci /* We translate the combined depth/stencil formats to depth only here */ 55bf215546Sopenharmony_ci [PIPE_FORMAT_Z24_UNORM_S8_UINT] = ISL_FORMAT_R24_UNORM_X8_TYPELESS, 56bf215546Sopenharmony_ci [PIPE_FORMAT_Z24X8_UNORM] = ISL_FORMAT_R24_UNORM_X8_TYPELESS, 57bf215546Sopenharmony_ci [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = ISL_FORMAT_R32_FLOAT, 58bf215546Sopenharmony_ci 59bf215546Sopenharmony_ci [PIPE_FORMAT_S8_UINT] = ISL_FORMAT_R8_UINT, 60bf215546Sopenharmony_ci [PIPE_FORMAT_X24S8_UINT] = ISL_FORMAT_R8_UINT, 61bf215546Sopenharmony_ci [PIPE_FORMAT_X32_S8X24_UINT] = ISL_FORMAT_R8_UINT, 62bf215546Sopenharmony_ci 63bf215546Sopenharmony_ci [PIPE_FORMAT_R64_FLOAT] = ISL_FORMAT_R64_FLOAT, 64bf215546Sopenharmony_ci [PIPE_FORMAT_R64G64_FLOAT] = ISL_FORMAT_R64G64_FLOAT, 65bf215546Sopenharmony_ci [PIPE_FORMAT_R64G64B64_FLOAT] = ISL_FORMAT_R64G64B64_FLOAT, 66bf215546Sopenharmony_ci [PIPE_FORMAT_R64G64B64A64_FLOAT] = ISL_FORMAT_R64G64B64A64_FLOAT, 67bf215546Sopenharmony_ci [PIPE_FORMAT_R32_FLOAT] = ISL_FORMAT_R32_FLOAT, 68bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_FLOAT] = ISL_FORMAT_R32G32_FLOAT, 69bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_FLOAT] = ISL_FORMAT_R32G32B32_FLOAT, 70bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_FLOAT] = ISL_FORMAT_R32G32B32A32_FLOAT, 71bf215546Sopenharmony_ci [PIPE_FORMAT_R32_UNORM] = ISL_FORMAT_R32_UNORM, 72bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_UNORM] = ISL_FORMAT_R32G32_UNORM, 73bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_UNORM] = ISL_FORMAT_R32G32B32_UNORM, 74bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_UNORM] = ISL_FORMAT_R32G32B32A32_UNORM, 75bf215546Sopenharmony_ci [PIPE_FORMAT_R32_USCALED] = ISL_FORMAT_R32_USCALED, 76bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_USCALED] = ISL_FORMAT_R32G32_USCALED, 77bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_USCALED] = ISL_FORMAT_R32G32B32_USCALED, 78bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_USCALED] = ISL_FORMAT_R32G32B32A32_USCALED, 79bf215546Sopenharmony_ci [PIPE_FORMAT_R32_SNORM] = ISL_FORMAT_R32_SNORM, 80bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_SNORM] = ISL_FORMAT_R32G32_SNORM, 81bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_SNORM] = ISL_FORMAT_R32G32B32_SNORM, 82bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_SNORM] = ISL_FORMAT_R32G32B32A32_SNORM, 83bf215546Sopenharmony_ci [PIPE_FORMAT_R32_SSCALED] = ISL_FORMAT_R32_SSCALED, 84bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_SSCALED] = ISL_FORMAT_R32G32_SSCALED, 85bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_SSCALED] = ISL_FORMAT_R32G32B32_SSCALED, 86bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_SSCALED] = ISL_FORMAT_R32G32B32A32_SSCALED, 87bf215546Sopenharmony_ci [PIPE_FORMAT_R16_UNORM] = ISL_FORMAT_R16_UNORM, 88bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_UNORM] = ISL_FORMAT_R16G16_UNORM, 89bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_UNORM] = ISL_FORMAT_R16G16B16_UNORM, 90bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_UNORM] = ISL_FORMAT_R16G16B16A16_UNORM, 91bf215546Sopenharmony_ci [PIPE_FORMAT_R16_USCALED] = ISL_FORMAT_R16_USCALED, 92bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_USCALED] = ISL_FORMAT_R16G16_USCALED, 93bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_USCALED] = ISL_FORMAT_R16G16B16_USCALED, 94bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_USCALED] = ISL_FORMAT_R16G16B16A16_USCALED, 95bf215546Sopenharmony_ci [PIPE_FORMAT_R16_SNORM] = ISL_FORMAT_R16_SNORM, 96bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_SNORM] = ISL_FORMAT_R16G16_SNORM, 97bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_SNORM] = ISL_FORMAT_R16G16B16_SNORM, 98bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_SNORM] = ISL_FORMAT_R16G16B16A16_SNORM, 99bf215546Sopenharmony_ci [PIPE_FORMAT_R16_SSCALED] = ISL_FORMAT_R16_SSCALED, 100bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_SSCALED] = ISL_FORMAT_R16G16_SSCALED, 101bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_SSCALED] = ISL_FORMAT_R16G16B16_SSCALED, 102bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_SSCALED] = ISL_FORMAT_R16G16B16A16_SSCALED, 103bf215546Sopenharmony_ci [PIPE_FORMAT_R8_UNORM] = ISL_FORMAT_R8_UNORM, 104bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_UNORM] = ISL_FORMAT_R8G8_UNORM, 105bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_UNORM] = ISL_FORMAT_R8G8B8_UNORM, 106bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_UNORM] = ISL_FORMAT_R8G8B8A8_UNORM, 107bf215546Sopenharmony_ci [PIPE_FORMAT_R8_USCALED] = ISL_FORMAT_R8_USCALED, 108bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_USCALED] = ISL_FORMAT_R8G8_USCALED, 109bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_USCALED] = ISL_FORMAT_R8G8B8_USCALED, 110bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_USCALED] = ISL_FORMAT_R8G8B8A8_USCALED, 111bf215546Sopenharmony_ci [PIPE_FORMAT_R8_SNORM] = ISL_FORMAT_R8_SNORM, 112bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_SNORM] = ISL_FORMAT_R8G8_SNORM, 113bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_SNORM] = ISL_FORMAT_R8G8B8_SNORM, 114bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_SNORM] = ISL_FORMAT_R8G8B8A8_SNORM, 115bf215546Sopenharmony_ci [PIPE_FORMAT_R8_SSCALED] = ISL_FORMAT_R8_SSCALED, 116bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_SSCALED] = ISL_FORMAT_R8G8_SSCALED, 117bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_SSCALED] = ISL_FORMAT_R8G8B8_SSCALED, 118bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_SSCALED] = ISL_FORMAT_R8G8B8A8_SSCALED, 119bf215546Sopenharmony_ci [PIPE_FORMAT_R32_FIXED] = ISL_FORMAT_R32_SFIXED, 120bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_FIXED] = ISL_FORMAT_R32G32_SFIXED, 121bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_FIXED] = ISL_FORMAT_R32G32B32_SFIXED, 122bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_FIXED] = ISL_FORMAT_R32G32B32A32_SFIXED, 123bf215546Sopenharmony_ci [PIPE_FORMAT_R16_FLOAT] = ISL_FORMAT_R16_FLOAT, 124bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_FLOAT] = ISL_FORMAT_R16G16_FLOAT, 125bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_FLOAT] = ISL_FORMAT_R16G16B16_FLOAT, 126bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_FLOAT] = ISL_FORMAT_R16G16B16A16_FLOAT, 127bf215546Sopenharmony_ci 128bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_SRGB] = ISL_FORMAT_R8G8B8_UNORM_SRGB, 129bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8A8_SRGB] = ISL_FORMAT_B8G8R8A8_UNORM_SRGB, 130bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8X8_SRGB] = ISL_FORMAT_B8G8R8X8_UNORM_SRGB, 131bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_SRGB] = ISL_FORMAT_R8G8B8A8_UNORM_SRGB, 132bf215546Sopenharmony_ci 133bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_RGB] = ISL_FORMAT_BC1_UNORM, 134bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_RGBA] = ISL_FORMAT_BC1_UNORM, 135bf215546Sopenharmony_ci [PIPE_FORMAT_DXT3_RGBA] = ISL_FORMAT_BC2_UNORM, 136bf215546Sopenharmony_ci [PIPE_FORMAT_DXT5_RGBA] = ISL_FORMAT_BC3_UNORM, 137bf215546Sopenharmony_ci 138bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_SRGB] = ISL_FORMAT_BC1_UNORM_SRGB, 139bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_SRGBA] = ISL_FORMAT_BC1_UNORM_SRGB, 140bf215546Sopenharmony_ci [PIPE_FORMAT_DXT3_SRGBA] = ISL_FORMAT_BC2_UNORM_SRGB, 141bf215546Sopenharmony_ci [PIPE_FORMAT_DXT5_SRGBA] = ISL_FORMAT_BC3_UNORM_SRGB, 142bf215546Sopenharmony_ci 143bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC1_UNORM] = ISL_FORMAT_BC4_UNORM, 144bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC1_SNORM] = ISL_FORMAT_BC4_SNORM, 145bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC2_UNORM] = ISL_FORMAT_BC5_UNORM, 146bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC2_SNORM] = ISL_FORMAT_BC5_SNORM, 147bf215546Sopenharmony_ci 148bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_USCALED] = ISL_FORMAT_R10G10B10A2_USCALED, 149bf215546Sopenharmony_ci [PIPE_FORMAT_R11G11B10_FLOAT] = ISL_FORMAT_R11G11B10_FLOAT, 150bf215546Sopenharmony_ci [PIPE_FORMAT_R9G9B9E5_FLOAT] = ISL_FORMAT_R9G9B9E5_SHAREDEXP, 151bf215546Sopenharmony_ci [PIPE_FORMAT_R1_UNORM] = ISL_FORMAT_R1_UNORM, 152bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10X2_USCALED] = ISL_FORMAT_R10G10B10X2_USCALED, 153bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10A2_UNORM] = ISL_FORMAT_B10G10R10A2_UNORM, 154bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8X8_UNORM] = ISL_FORMAT_R8G8B8X8_UNORM, 155bf215546Sopenharmony_ci 156bf215546Sopenharmony_ci [PIPE_FORMAT_I8_UNORM] = ISL_FORMAT_R8_UNORM, 157bf215546Sopenharmony_ci [PIPE_FORMAT_I16_UNORM] = ISL_FORMAT_R16_UNORM, 158bf215546Sopenharmony_ci [PIPE_FORMAT_I8_SNORM] = ISL_FORMAT_R8_SNORM, 159bf215546Sopenharmony_ci [PIPE_FORMAT_I16_SNORM] = ISL_FORMAT_R16_SNORM, 160bf215546Sopenharmony_ci [PIPE_FORMAT_I16_FLOAT] = ISL_FORMAT_R16_FLOAT, 161bf215546Sopenharmony_ci [PIPE_FORMAT_I32_FLOAT] = ISL_FORMAT_R32_FLOAT, 162bf215546Sopenharmony_ci 163bf215546Sopenharmony_ci [PIPE_FORMAT_L8_UINT] = ISL_FORMAT_L8_UINT, 164bf215546Sopenharmony_ci [PIPE_FORMAT_L8_UNORM] = ISL_FORMAT_L8_UNORM, 165bf215546Sopenharmony_ci [PIPE_FORMAT_L8_SNORM] = ISL_FORMAT_R8_SNORM, 166bf215546Sopenharmony_ci [PIPE_FORMAT_L8_SINT] = ISL_FORMAT_L8_SINT, 167bf215546Sopenharmony_ci [PIPE_FORMAT_L16_UNORM] = ISL_FORMAT_L16_UNORM, 168bf215546Sopenharmony_ci [PIPE_FORMAT_L16_SNORM] = ISL_FORMAT_R16_SNORM, 169bf215546Sopenharmony_ci [PIPE_FORMAT_L16_FLOAT] = ISL_FORMAT_L16_FLOAT, 170bf215546Sopenharmony_ci [PIPE_FORMAT_L32_FLOAT] = ISL_FORMAT_L32_FLOAT, 171bf215546Sopenharmony_ci 172bf215546Sopenharmony_ci [PIPE_FORMAT_A8_UNORM] = ISL_FORMAT_A8_UNORM, 173bf215546Sopenharmony_ci [PIPE_FORMAT_A16_UNORM] = ISL_FORMAT_A16_UNORM, 174bf215546Sopenharmony_ci [PIPE_FORMAT_A16_FLOAT] = ISL_FORMAT_A16_FLOAT, 175bf215546Sopenharmony_ci [PIPE_FORMAT_A32_FLOAT] = ISL_FORMAT_A32_FLOAT, 176bf215546Sopenharmony_ci 177bf215546Sopenharmony_ci [PIPE_FORMAT_L8A8_UNORM] = ISL_FORMAT_L8A8_UNORM, 178bf215546Sopenharmony_ci [PIPE_FORMAT_L16A16_UNORM] = ISL_FORMAT_L16A16_UNORM, 179bf215546Sopenharmony_ci [PIPE_FORMAT_L16A16_FLOAT] = ISL_FORMAT_L16A16_FLOAT, 180bf215546Sopenharmony_ci [PIPE_FORMAT_L32A32_FLOAT] = ISL_FORMAT_L32A32_FLOAT, 181bf215546Sopenharmony_ci 182bf215546Sopenharmony_ci /* Sadly, we have to use luminance[-alpha] formats for sRGB decoding. */ 183bf215546Sopenharmony_ci [PIPE_FORMAT_R8_SRGB] = ISL_FORMAT_L8_UNORM_SRGB, 184bf215546Sopenharmony_ci [PIPE_FORMAT_L8_SRGB] = ISL_FORMAT_L8_UNORM_SRGB, 185bf215546Sopenharmony_ci [PIPE_FORMAT_L8A8_SRGB] = ISL_FORMAT_L8A8_UNORM_SRGB, 186bf215546Sopenharmony_ci 187bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_SSCALED] = ISL_FORMAT_R10G10B10A2_SSCALED, 188bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_SNORM] = ISL_FORMAT_R10G10B10A2_SNORM, 189bf215546Sopenharmony_ci 190bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10A2_USCALED] = ISL_FORMAT_B10G10R10A2_USCALED, 191bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10A2_SSCALED] = ISL_FORMAT_B10G10R10A2_SSCALED, 192bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10A2_SNORM] = ISL_FORMAT_B10G10R10A2_SNORM, 193bf215546Sopenharmony_ci 194bf215546Sopenharmony_ci [PIPE_FORMAT_R8_UINT] = ISL_FORMAT_R8_UINT, 195bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_UINT] = ISL_FORMAT_R8G8_UINT, 196bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_UINT] = ISL_FORMAT_R8G8B8_UINT, 197bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_UINT] = ISL_FORMAT_R8G8B8A8_UINT, 198bf215546Sopenharmony_ci 199bf215546Sopenharmony_ci [PIPE_FORMAT_R8_SINT] = ISL_FORMAT_R8_SINT, 200bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8_SINT] = ISL_FORMAT_R8G8_SINT, 201bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8_SINT] = ISL_FORMAT_R8G8B8_SINT, 202bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8A8_SINT] = ISL_FORMAT_R8G8B8A8_SINT, 203bf215546Sopenharmony_ci 204bf215546Sopenharmony_ci [PIPE_FORMAT_R16_UINT] = ISL_FORMAT_R16_UINT, 205bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_UINT] = ISL_FORMAT_R16G16_UINT, 206bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_UINT] = ISL_FORMAT_R16G16B16_UINT, 207bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_UINT] = ISL_FORMAT_R16G16B16A16_UINT, 208bf215546Sopenharmony_ci 209bf215546Sopenharmony_ci [PIPE_FORMAT_R16_SINT] = ISL_FORMAT_R16_SINT, 210bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16_SINT] = ISL_FORMAT_R16G16_SINT, 211bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16_SINT] = ISL_FORMAT_R16G16B16_SINT, 212bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16A16_SINT] = ISL_FORMAT_R16G16B16A16_SINT, 213bf215546Sopenharmony_ci 214bf215546Sopenharmony_ci [PIPE_FORMAT_R32_UINT] = ISL_FORMAT_R32_UINT, 215bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_UINT] = ISL_FORMAT_R32G32_UINT, 216bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_UINT] = ISL_FORMAT_R32G32B32_UINT, 217bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_UINT] = ISL_FORMAT_R32G32B32A32_UINT, 218bf215546Sopenharmony_ci 219bf215546Sopenharmony_ci [PIPE_FORMAT_R32_SINT] = ISL_FORMAT_R32_SINT, 220bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32_SINT] = ISL_FORMAT_R32G32_SINT, 221bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32_SINT] = ISL_FORMAT_R32G32B32_SINT, 222bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32A32_SINT] = ISL_FORMAT_R32G32B32A32_SINT, 223bf215546Sopenharmony_ci 224bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10A2_UINT] = ISL_FORMAT_B10G10R10A2_UINT, 225bf215546Sopenharmony_ci 226bf215546Sopenharmony_ci [PIPE_FORMAT_ETC1_RGB8] = ISL_FORMAT_ETC1_RGB8, 227bf215546Sopenharmony_ci 228bf215546Sopenharmony_ci [PIPE_FORMAT_R8G8B8X8_SRGB] = ISL_FORMAT_R8G8B8X8_UNORM_SRGB, 229bf215546Sopenharmony_ci [PIPE_FORMAT_B10G10R10X2_UNORM] = ISL_FORMAT_B10G10R10X2_UNORM, 230bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16X16_UNORM] = ISL_FORMAT_R16G16B16X16_UNORM, 231bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16X16_FLOAT] = ISL_FORMAT_R16G16B16X16_FLOAT, 232bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32X32_FLOAT] = ISL_FORMAT_R32G32B32X32_FLOAT, 233bf215546Sopenharmony_ci 234bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_UINT] = ISL_FORMAT_R10G10B10A2_UINT, 235bf215546Sopenharmony_ci 236bf215546Sopenharmony_ci [PIPE_FORMAT_B5G6R5_SRGB] = ISL_FORMAT_B5G6R5_UNORM_SRGB, 237bf215546Sopenharmony_ci 238bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGBA_UNORM] = ISL_FORMAT_BC7_UNORM, 239bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_SRGBA] = ISL_FORMAT_BC7_UNORM_SRGB, 240bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGB_FLOAT] = ISL_FORMAT_BC6H_SF16, 241bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGB_UFLOAT] = ISL_FORMAT_BC6H_UF16, 242bf215546Sopenharmony_ci 243bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_RGB8] = ISL_FORMAT_ETC2_RGB8, 244bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_SRGB8] = ISL_FORMAT_ETC2_SRGB8, 245bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_RGB8A1] = ISL_FORMAT_ETC2_RGB8_PTA, 246bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_SRGB8A1] = ISL_FORMAT_ETC2_SRGB8_PTA, 247bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_RGBA8] = ISL_FORMAT_ETC2_EAC_RGBA8, 248bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_SRGBA8] = ISL_FORMAT_ETC2_EAC_SRGB8_A8, 249bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_R11_UNORM] = ISL_FORMAT_EAC_R11, 250bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_R11_SNORM] = ISL_FORMAT_EAC_SIGNED_R11, 251bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_RG11_UNORM] = ISL_FORMAT_EAC_RG11, 252bf215546Sopenharmony_ci [PIPE_FORMAT_ETC2_RG11_SNORM] = ISL_FORMAT_EAC_SIGNED_RG11, 253bf215546Sopenharmony_ci 254bf215546Sopenharmony_ci [PIPE_FORMAT_FXT1_RGB] = ISL_FORMAT_FXT1, 255bf215546Sopenharmony_ci [PIPE_FORMAT_FXT1_RGBA] = ISL_FORMAT_FXT1, 256bf215546Sopenharmony_ci 257bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_4x4] = ISL_FORMAT_ASTC_LDR_2D_4X4_FLT16, 258bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_5x4] = ISL_FORMAT_ASTC_LDR_2D_5X4_FLT16, 259bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_5x5] = ISL_FORMAT_ASTC_LDR_2D_5X5_FLT16, 260bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_6x5] = ISL_FORMAT_ASTC_LDR_2D_6X5_FLT16, 261bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_6x6] = ISL_FORMAT_ASTC_LDR_2D_6X6_FLT16, 262bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x5] = ISL_FORMAT_ASTC_LDR_2D_8X5_FLT16, 263bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x6] = ISL_FORMAT_ASTC_LDR_2D_8X6_FLT16, 264bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x8] = ISL_FORMAT_ASTC_LDR_2D_8X8_FLT16, 265bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x5] = ISL_FORMAT_ASTC_LDR_2D_10X5_FLT16, 266bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x6] = ISL_FORMAT_ASTC_LDR_2D_10X6_FLT16, 267bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x8] = ISL_FORMAT_ASTC_LDR_2D_10X8_FLT16, 268bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x10] = ISL_FORMAT_ASTC_LDR_2D_10X10_FLT16, 269bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_12x10] = ISL_FORMAT_ASTC_LDR_2D_12X10_FLT16, 270bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_12x12] = ISL_FORMAT_ASTC_LDR_2D_12X12_FLT16, 271bf215546Sopenharmony_ci 272bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_4x4_SRGB] = ISL_FORMAT_ASTC_LDR_2D_4X4_U8SRGB, 273bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_5x4_SRGB] = ISL_FORMAT_ASTC_LDR_2D_5X4_U8SRGB, 274bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_5x5_SRGB] = ISL_FORMAT_ASTC_LDR_2D_5X5_U8SRGB, 275bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_6x5_SRGB] = ISL_FORMAT_ASTC_LDR_2D_6X5_U8SRGB, 276bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_6x6_SRGB] = ISL_FORMAT_ASTC_LDR_2D_6X6_U8SRGB, 277bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x5_SRGB] = ISL_FORMAT_ASTC_LDR_2D_8X5_U8SRGB, 278bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x6_SRGB] = ISL_FORMAT_ASTC_LDR_2D_8X6_U8SRGB, 279bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_8x8_SRGB] = ISL_FORMAT_ASTC_LDR_2D_8X8_U8SRGB, 280bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x5_SRGB] = ISL_FORMAT_ASTC_LDR_2D_10X5_U8SRGB, 281bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x6_SRGB] = ISL_FORMAT_ASTC_LDR_2D_10X6_U8SRGB, 282bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x8_SRGB] = ISL_FORMAT_ASTC_LDR_2D_10X8_U8SRGB, 283bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_10x10_SRGB] = ISL_FORMAT_ASTC_LDR_2D_10X10_U8SRGB, 284bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_12x10_SRGB] = ISL_FORMAT_ASTC_LDR_2D_12X10_U8SRGB, 285bf215546Sopenharmony_ci [PIPE_FORMAT_ASTC_12x12_SRGB] = ISL_FORMAT_ASTC_LDR_2D_12X12_U8SRGB, 286bf215546Sopenharmony_ci 287bf215546Sopenharmony_ci [PIPE_FORMAT_A1B5G5R5_UNORM] = ISL_FORMAT_A1B5G5R5_UNORM, 288bf215546Sopenharmony_ci 289bf215546Sopenharmony_ci /* We support these so that we know the API expects no alpha channel. 290bf215546Sopenharmony_ci * Otherwise, the state tracker would just give us a format with alpha 291bf215546Sopenharmony_ci * and we wouldn't know to override the swizzle to 1. 292bf215546Sopenharmony_ci */ 293bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16X16_UINT] = ISL_FORMAT_R16G16B16A16_UINT, 294bf215546Sopenharmony_ci [PIPE_FORMAT_R16G16B16X16_SINT] = ISL_FORMAT_R16G16B16A16_SINT, 295bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32X32_UINT] = ISL_FORMAT_R32G32B32A32_UINT, 296bf215546Sopenharmony_ci [PIPE_FORMAT_R32G32B32X32_SINT] = ISL_FORMAT_R32G32B32A32_SINT, 297bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10X2_SNORM] = ISL_FORMAT_R10G10B10A2_SNORM, 298bf215546Sopenharmony_ci }; 299bf215546Sopenharmony_ci assert(pf < PIPE_FORMAT_COUNT); 300bf215546Sopenharmony_ci return table[pf]; 301bf215546Sopenharmony_ci} 302bf215546Sopenharmony_ci 303bf215546Sopenharmony_cistatic enum isl_format 304bf215546Sopenharmony_ciget_render_format(enum pipe_format pformat, enum isl_format def_format) 305bf215546Sopenharmony_ci{ 306bf215546Sopenharmony_ci switch (pformat) { 307bf215546Sopenharmony_ci case PIPE_FORMAT_A16_UNORM: return ISL_FORMAT_R16_UNORM; 308bf215546Sopenharmony_ci case PIPE_FORMAT_A16_FLOAT: return ISL_FORMAT_R16_FLOAT; 309bf215546Sopenharmony_ci case PIPE_FORMAT_A32_FLOAT: return ISL_FORMAT_R32_FLOAT; 310bf215546Sopenharmony_ci 311bf215546Sopenharmony_ci case PIPE_FORMAT_I8_UNORM: return ISL_FORMAT_R8_UNORM; 312bf215546Sopenharmony_ci case PIPE_FORMAT_I16_UNORM: return ISL_FORMAT_R16_UNORM; 313bf215546Sopenharmony_ci case PIPE_FORMAT_I16_FLOAT: return ISL_FORMAT_R16_FLOAT; 314bf215546Sopenharmony_ci case PIPE_FORMAT_I32_FLOAT: return ISL_FORMAT_R32_FLOAT; 315bf215546Sopenharmony_ci 316bf215546Sopenharmony_ci case PIPE_FORMAT_L8_UNORM: return ISL_FORMAT_R8_UNORM; 317bf215546Sopenharmony_ci case PIPE_FORMAT_L8_UINT: return ISL_FORMAT_R8_UINT; 318bf215546Sopenharmony_ci case PIPE_FORMAT_L8_SINT: return ISL_FORMAT_R8_SINT; 319bf215546Sopenharmony_ci case PIPE_FORMAT_L16_UNORM: return ISL_FORMAT_R16_UNORM; 320bf215546Sopenharmony_ci case PIPE_FORMAT_L16_FLOAT: return ISL_FORMAT_R16_FLOAT; 321bf215546Sopenharmony_ci case PIPE_FORMAT_L32_FLOAT: return ISL_FORMAT_R32_FLOAT; 322bf215546Sopenharmony_ci 323bf215546Sopenharmony_ci case PIPE_FORMAT_L8A8_UNORM: return ISL_FORMAT_R8G8_UNORM; 324bf215546Sopenharmony_ci case PIPE_FORMAT_L16A16_UNORM: return ISL_FORMAT_R16G16_UNORM; 325bf215546Sopenharmony_ci case PIPE_FORMAT_L16A16_FLOAT: return ISL_FORMAT_R16G16_FLOAT; 326bf215546Sopenharmony_ci case PIPE_FORMAT_L32A32_FLOAT: return ISL_FORMAT_R32G32_FLOAT; 327bf215546Sopenharmony_ci 328bf215546Sopenharmony_ci default: 329bf215546Sopenharmony_ci return def_format; 330bf215546Sopenharmony_ci } 331bf215546Sopenharmony_ci} 332bf215546Sopenharmony_ci 333bf215546Sopenharmony_cistruct crocus_format_info 334bf215546Sopenharmony_cicrocus_format_for_usage(const struct intel_device_info *devinfo, 335bf215546Sopenharmony_ci enum pipe_format pformat, 336bf215546Sopenharmony_ci isl_surf_usage_flags_t usage) 337bf215546Sopenharmony_ci{ 338bf215546Sopenharmony_ci struct crocus_format_info info = { crocus_isl_format_for_pipe_format(pformat), 339bf215546Sopenharmony_ci { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W } }; 340bf215546Sopenharmony_ci 341bf215546Sopenharmony_ci if (info.fmt == ISL_FORMAT_UNSUPPORTED) 342bf215546Sopenharmony_ci return info; 343bf215546Sopenharmony_ci 344bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_A8_UNORM) { 345bf215546Sopenharmony_ci info.fmt = ISL_FORMAT_A8_UNORM; 346bf215546Sopenharmony_ci } 347bf215546Sopenharmony_ci 348bf215546Sopenharmony_ci if (usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) 349bf215546Sopenharmony_ci info.fmt = get_render_format(pformat, info.fmt); 350bf215546Sopenharmony_ci if (devinfo->ver < 6) { 351bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) 352bf215546Sopenharmony_ci info.fmt = ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS; 353bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_X32_S8X24_UINT) 354bf215546Sopenharmony_ci info.fmt = ISL_FORMAT_X32_TYPELESS_G8X24_UINT; 355bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_X24S8_UINT) 356bf215546Sopenharmony_ci info.fmt = ISL_FORMAT_X24_TYPELESS_G8_UINT; 357bf215546Sopenharmony_ci } 358bf215546Sopenharmony_ci 359bf215546Sopenharmony_ci const struct isl_format_layout *fmtl = isl_format_get_layout(info.fmt); 360bf215546Sopenharmony_ci 361bf215546Sopenharmony_ci if (util_format_is_snorm(pformat)) { 362bf215546Sopenharmony_ci if (util_format_is_intensity(pformat)) { 363bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_X; 364bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_X; 365bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_X; 366bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_X; 367bf215546Sopenharmony_ci } else if (util_format_is_luminance(pformat)) { 368bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_X; 369bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_X; 370bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_X; 371bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_1; 372bf215546Sopenharmony_ci } else if (util_format_is_luminance_alpha(pformat)) { 373bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_X; 374bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_X; 375bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_X; 376bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_Y; 377bf215546Sopenharmony_ci } else if (util_format_is_alpha(pformat)) { 378bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_0; 379bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_0; 380bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_0; 381bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_X; 382bf215546Sopenharmony_ci } 383bf215546Sopenharmony_ci } 384bf215546Sopenharmony_ci 385bf215546Sopenharmony_ci /* When faking RGBX pipe formats with RGBA ISL formats, override alpha. */ 386bf215546Sopenharmony_ci if (!util_format_has_alpha(pformat) && fmtl->channels.a.type != ISL_VOID) { 387bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_X; 388bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_Y; 389bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_Z; 390bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_1; 391bf215546Sopenharmony_ci } 392bf215546Sopenharmony_ci 393bf215546Sopenharmony_ci /* We choose RGBA over RGBX for rendering the hardware doesn't support 394bf215546Sopenharmony_ci * rendering to RGBX. However, when this internal override is used on Gen9+, 395bf215546Sopenharmony_ci * fast clears don't work correctly. 396bf215546Sopenharmony_ci * 397bf215546Sopenharmony_ci * i965 fixes this by pretending to not support RGBX formats, and the higher 398bf215546Sopenharmony_ci * layers of Mesa pick the RGBA format instead. Gallium doesn't work that 399bf215546Sopenharmony_ci * way, and might choose a different format, like BGRX instead of RGBX, 400bf215546Sopenharmony_ci * which will also cause problems when sampling from a surface fast cleared 401bf215546Sopenharmony_ci * as RGBX. So we always choose RGBA instead of RGBX explicitly 402bf215546Sopenharmony_ci * here. 403bf215546Sopenharmony_ci */ 404bf215546Sopenharmony_ci if (isl_format_is_rgbx(info.fmt) && 405bf215546Sopenharmony_ci !isl_format_supports_rendering(devinfo, info.fmt) && 406bf215546Sopenharmony_ci (usage & ISL_SURF_USAGE_RENDER_TARGET_BIT)) { 407bf215546Sopenharmony_ci info.fmt = isl_format_rgbx_to_rgba(info.fmt); 408bf215546Sopenharmony_ci info.swizzles[0] = PIPE_SWIZZLE_X; 409bf215546Sopenharmony_ci info.swizzles[1] = PIPE_SWIZZLE_Y; 410bf215546Sopenharmony_ci info.swizzles[2] = PIPE_SWIZZLE_Z; 411bf215546Sopenharmony_ci info.swizzles[3] = PIPE_SWIZZLE_1; 412bf215546Sopenharmony_ci } 413bf215546Sopenharmony_ci 414bf215546Sopenharmony_ci return info; 415bf215546Sopenharmony_ci} 416bf215546Sopenharmony_ci 417bf215546Sopenharmony_ci/** 418bf215546Sopenharmony_ci * The pscreen->is_format_supported() driver hook. 419bf215546Sopenharmony_ci * 420bf215546Sopenharmony_ci * Returns true if the given format is supported for the given usage 421bf215546Sopenharmony_ci * (PIPE_BIND_*) and sample count. 422bf215546Sopenharmony_ci */ 423bf215546Sopenharmony_cibool 424bf215546Sopenharmony_cicrocus_is_format_supported(struct pipe_screen *pscreen, 425bf215546Sopenharmony_ci enum pipe_format pformat, 426bf215546Sopenharmony_ci enum pipe_texture_target target, 427bf215546Sopenharmony_ci unsigned sample_count, unsigned storage_sample_count, 428bf215546Sopenharmony_ci unsigned usage) 429bf215546Sopenharmony_ci{ 430bf215546Sopenharmony_ci struct crocus_screen *screen = (struct crocus_screen *)pscreen; 431bf215546Sopenharmony_ci const struct intel_device_info *devinfo = &screen->devinfo; 432bf215546Sopenharmony_ci 433bf215546Sopenharmony_ci if (!util_is_power_of_two_or_zero(sample_count)) 434bf215546Sopenharmony_ci return false; 435bf215546Sopenharmony_ci if (devinfo->ver >= 7) { 436bf215546Sopenharmony_ci if (sample_count > 8 || sample_count == 2) 437bf215546Sopenharmony_ci return false; 438bf215546Sopenharmony_ci } else if (devinfo->ver == 6) { 439bf215546Sopenharmony_ci if (sample_count > 4 || sample_count == 2) 440bf215546Sopenharmony_ci return false; 441bf215546Sopenharmony_ci } else if (sample_count > 1) { 442bf215546Sopenharmony_ci return false; 443bf215546Sopenharmony_ci } 444bf215546Sopenharmony_ci 445bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_NONE) 446bf215546Sopenharmony_ci return true; 447bf215546Sopenharmony_ci 448bf215546Sopenharmony_ci enum isl_format format = crocus_isl_format_for_pipe_format(pformat); 449bf215546Sopenharmony_ci 450bf215546Sopenharmony_ci if (format == ISL_FORMAT_UNSUPPORTED) 451bf215546Sopenharmony_ci return false; 452bf215546Sopenharmony_ci 453bf215546Sopenharmony_ci /* no stencil texturing prior to haswell */ 454bf215546Sopenharmony_ci if (devinfo->verx10 < 75) { 455bf215546Sopenharmony_ci if (pformat == PIPE_FORMAT_S8_UINT || 456bf215546Sopenharmony_ci pformat == PIPE_FORMAT_X24S8_UINT || 457bf215546Sopenharmony_ci pformat == PIPE_FORMAT_S8X24_UINT || 458bf215546Sopenharmony_ci pformat == PIPE_FORMAT_X32_S8X24_UINT) 459bf215546Sopenharmony_ci return FALSE; 460bf215546Sopenharmony_ci } 461bf215546Sopenharmony_ci 462bf215546Sopenharmony_ci const struct isl_format_layout *fmtl = isl_format_get_layout(format); 463bf215546Sopenharmony_ci const bool is_integer = isl_format_has_int_channel(format); 464bf215546Sopenharmony_ci bool supported = true; 465bf215546Sopenharmony_ci 466bf215546Sopenharmony_ci if (sample_count > 1) 467bf215546Sopenharmony_ci supported &= isl_format_supports_multisampling(devinfo, format); 468bf215546Sopenharmony_ci 469bf215546Sopenharmony_ci if (usage & PIPE_BIND_DEPTH_STENCIL) { 470bf215546Sopenharmony_ci bool depth_fmts = format == ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS || 471bf215546Sopenharmony_ci format == ISL_FORMAT_R32_FLOAT || 472bf215546Sopenharmony_ci format == ISL_FORMAT_R24_UNORM_X8_TYPELESS || 473bf215546Sopenharmony_ci format == ISL_FORMAT_R8_UINT; 474bf215546Sopenharmony_ci 475bf215546Sopenharmony_ci /* Z16 is disabled here as on pre-GEN8 it's slower. */ 476bf215546Sopenharmony_ci if (devinfo->ver == 8) 477bf215546Sopenharmony_ci depth_fmts |= format == ISL_FORMAT_R16_UNORM; 478bf215546Sopenharmony_ci supported &= depth_fmts; 479bf215546Sopenharmony_ci } 480bf215546Sopenharmony_ci 481bf215546Sopenharmony_ci if (usage & PIPE_BIND_RENDER_TARGET) { 482bf215546Sopenharmony_ci /* Alpha and luminance-alpha formats other than A8_UNORM are not 483bf215546Sopenharmony_ci * renderable. 484bf215546Sopenharmony_ci * 485bf215546Sopenharmony_ci * For BLORP, we can apply the swizzle in the shader. But for 486bf215546Sopenharmony_ci * general rendering, this would mean recompiling the shader, which 487bf215546Sopenharmony_ci * we'd like to avoid doing. So we mark these formats non-renderable. 488bf215546Sopenharmony_ci * 489bf215546Sopenharmony_ci * We do support A8_UNORM as it's required and is renderable. 490bf215546Sopenharmony_ci */ 491bf215546Sopenharmony_ci if (pformat != PIPE_FORMAT_A8_UNORM && 492bf215546Sopenharmony_ci (util_format_is_alpha(pformat) || 493bf215546Sopenharmony_ci util_format_is_luminance_alpha(pformat))) 494bf215546Sopenharmony_ci supported = false; 495bf215546Sopenharmony_ci 496bf215546Sopenharmony_ci enum isl_format rt_format = format; 497bf215546Sopenharmony_ci 498bf215546Sopenharmony_ci if (isl_format_is_rgbx(format) && 499bf215546Sopenharmony_ci !isl_format_supports_rendering(devinfo, format)) 500bf215546Sopenharmony_ci rt_format = isl_format_rgbx_to_rgba(format); 501bf215546Sopenharmony_ci 502bf215546Sopenharmony_ci supported &= isl_format_supports_rendering(devinfo, rt_format); 503bf215546Sopenharmony_ci 504bf215546Sopenharmony_ci if (!is_integer) 505bf215546Sopenharmony_ci supported &= isl_format_supports_alpha_blending(devinfo, rt_format); 506bf215546Sopenharmony_ci } 507bf215546Sopenharmony_ci 508bf215546Sopenharmony_ci if (usage & PIPE_BIND_SHADER_IMAGE) { 509bf215546Sopenharmony_ci /* Dataport doesn't support compression, and we can't resolve an MCS 510bf215546Sopenharmony_ci * compressed surface. (Buffer images may have sample count of 0.) 511bf215546Sopenharmony_ci */ 512bf215546Sopenharmony_ci supported &= sample_count == 0; 513bf215546Sopenharmony_ci 514bf215546Sopenharmony_ci supported &= isl_format_supports_typed_writes(devinfo, format); 515bf215546Sopenharmony_ci supported &= isl_has_matching_typed_storage_image_format(devinfo, format); 516bf215546Sopenharmony_ci } 517bf215546Sopenharmony_ci 518bf215546Sopenharmony_ci if (usage & PIPE_BIND_SAMPLER_VIEW) { 519bf215546Sopenharmony_ci supported &= isl_format_supports_sampling(devinfo, format); 520bf215546Sopenharmony_ci 521bf215546Sopenharmony_ci /* disable Z16 unorm depth textures pre gen8 */ 522bf215546Sopenharmony_ci if (devinfo->ver < 8 && pformat == PIPE_FORMAT_Z16_UNORM) 523bf215546Sopenharmony_ci supported = false; 524bf215546Sopenharmony_ci 525bf215546Sopenharmony_ci bool ignore_filtering = false; 526bf215546Sopenharmony_ci 527bf215546Sopenharmony_ci if (is_integer) 528bf215546Sopenharmony_ci ignore_filtering = true; 529bf215546Sopenharmony_ci 530bf215546Sopenharmony_ci /* I said them, but I lied them. */ 531bf215546Sopenharmony_ci if (devinfo->ver < 5 && (format == ISL_FORMAT_R32G32B32A32_FLOAT || 532bf215546Sopenharmony_ci format == ISL_FORMAT_R24_UNORM_X8_TYPELESS || 533bf215546Sopenharmony_ci format == ISL_FORMAT_R32_FLOAT || 534bf215546Sopenharmony_ci format == ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS)) 535bf215546Sopenharmony_ci ignore_filtering = true; 536bf215546Sopenharmony_ci if (!ignore_filtering) 537bf215546Sopenharmony_ci supported &= isl_format_supports_filtering(devinfo, format); 538bf215546Sopenharmony_ci 539bf215546Sopenharmony_ci /* Don't advertise 3-component RGB formats for non-buffer textures. 540bf215546Sopenharmony_ci * This ensures that they are renderable from an API perspective since 541bf215546Sopenharmony_ci * the state tracker will fall back to RGBA or RGBX, which are 542bf215546Sopenharmony_ci * renderable. We want to render internally for copies and blits, 543bf215546Sopenharmony_ci * even if the application doesn't. 544bf215546Sopenharmony_ci * 545bf215546Sopenharmony_ci * Buffer textures don't need to be renderable, so we support real RGB. 546bf215546Sopenharmony_ci * This is useful for PBO upload, and 32-bit RGB support is mandatory. 547bf215546Sopenharmony_ci */ 548bf215546Sopenharmony_ci if (target != PIPE_BUFFER) 549bf215546Sopenharmony_ci supported &= fmtl->bpb != 24 && fmtl->bpb != 48 && fmtl->bpb != 96; 550bf215546Sopenharmony_ci } 551bf215546Sopenharmony_ci 552bf215546Sopenharmony_ci if (usage & PIPE_BIND_VERTEX_BUFFER) { 553bf215546Sopenharmony_ci supported &= isl_format_supports_vertex_fetch(devinfo, format); 554bf215546Sopenharmony_ci 555bf215546Sopenharmony_ci if (devinfo->verx10 < 75) { 556bf215546Sopenharmony_ci /* W/A: Pre-Haswell, the hardware doesn't really support the formats 557bf215546Sopenharmony_ci * we'd like to use here, so upload everything as UINT and fix it in 558bf215546Sopenharmony_ci * the shader 559bf215546Sopenharmony_ci */ 560bf215546Sopenharmony_ci if (format == ISL_FORMAT_R10G10B10A2_UNORM || 561bf215546Sopenharmony_ci format == ISL_FORMAT_B10G10R10A2_UNORM || 562bf215546Sopenharmony_ci format == ISL_FORMAT_R10G10B10A2_SNORM || 563bf215546Sopenharmony_ci format == ISL_FORMAT_B10G10R10A2_SNORM || 564bf215546Sopenharmony_ci format == ISL_FORMAT_R10G10B10A2_USCALED || 565bf215546Sopenharmony_ci format == ISL_FORMAT_B10G10R10A2_USCALED || 566bf215546Sopenharmony_ci format == ISL_FORMAT_R10G10B10A2_SSCALED || 567bf215546Sopenharmony_ci format == ISL_FORMAT_B10G10R10A2_SSCALED) 568bf215546Sopenharmony_ci supported = true; 569bf215546Sopenharmony_ci 570bf215546Sopenharmony_ci if (format == ISL_FORMAT_R8G8B8_SINT || 571bf215546Sopenharmony_ci format == ISL_FORMAT_R8G8B8_UINT || 572bf215546Sopenharmony_ci format == ISL_FORMAT_R16G16B16_SINT || 573bf215546Sopenharmony_ci format == ISL_FORMAT_R16G16B16_UINT) 574bf215546Sopenharmony_ci supported = true; 575bf215546Sopenharmony_ci } 576bf215546Sopenharmony_ci } 577bf215546Sopenharmony_ci 578bf215546Sopenharmony_ci if (usage & PIPE_BIND_INDEX_BUFFER) { 579bf215546Sopenharmony_ci supported &= format == ISL_FORMAT_R8_UINT || 580bf215546Sopenharmony_ci format == ISL_FORMAT_R16_UINT || 581bf215546Sopenharmony_ci format == ISL_FORMAT_R32_UINT; 582bf215546Sopenharmony_ci } 583bf215546Sopenharmony_ci 584bf215546Sopenharmony_ci return supported; 585bf215546Sopenharmony_ci} 586