1 /********************************************************** 2 * Copyright 2011 VMware, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person 5 * obtaining a copy of this software and associated documentation 6 * files (the "Software"), to deal in the Software without 7 * restriction, including without limitation the rights to use, copy, 8 * modify, merge, publish, distribute, sublicense, and/or sell copies 9 * of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **********************************************************/ 25 26 27 #include "pipe/p_format.h" 28 #include "util/u_debug.h" 29 #include "util/u_format.h" 30 #include "util/u_memory.h" 31 32 #include "svga_winsys.h" 33 #include "svga_screen.h" 34 #include "svga_format.h" 35 36 37 /** Describes mapping from gallium formats to SVGA vertex/pixel formats */ 38 struct vgpu10_format_entry 39 { 40 enum pipe_format pformat; 41 SVGA3dSurfaceFormat vertex_format; 42 SVGA3dSurfaceFormat pixel_format; 43 unsigned flags; 44 }; 45 46 struct format_compat_entry 47 { 48 enum pipe_format pformat; 49 const SVGA3dSurfaceFormat *compat_format; 50 }; 51 52 53 /** 54 * Table mapping Gallium formats to SVGA3d vertex/pixel formats. 55 * Note: the table is ordered according to PIPE_FORMAT_x order. 56 */ 57 static const struct vgpu10_format_entry format_conversion_table[] = 58 { 59 /* Gallium format SVGA3D vertex format SVGA3D pixel format Flags */ 60 { PIPE_FORMAT_NONE, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 61 { PIPE_FORMAT_B8G8R8A8_UNORM, SVGA3D_B8G8R8A8_UNORM, SVGA3D_B8G8R8A8_UNORM, TF_GEN_MIPS }, 62 { PIPE_FORMAT_B8G8R8X8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_B8G8R8X8_UNORM, TF_GEN_MIPS }, 63 { PIPE_FORMAT_A8R8G8B8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 64 { PIPE_FORMAT_X8R8G8B8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 65 { PIPE_FORMAT_B5G5R5A1_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_B5G5R5A1_UNORM, TF_GEN_MIPS }, 66 { PIPE_FORMAT_B4G4R4A4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 67 { PIPE_FORMAT_B5G6R5_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_B5G6R5_UNORM, TF_GEN_MIPS }, 68 { PIPE_FORMAT_R10G10B10A2_UNORM, SVGA3D_R10G10B10A2_UNORM, SVGA3D_R10G10B10A2_UNORM, TF_GEN_MIPS }, 69 { PIPE_FORMAT_L8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 70 { PIPE_FORMAT_A8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_A8_UNORM, TF_GEN_MIPS }, 71 { PIPE_FORMAT_I8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 72 { PIPE_FORMAT_L8A8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 73 { PIPE_FORMAT_L16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 74 { PIPE_FORMAT_UYVY, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 75 { PIPE_FORMAT_YUYV, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 76 { PIPE_FORMAT_Z16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_D16_UNORM, 0 }, 77 { PIPE_FORMAT_Z32_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 78 { PIPE_FORMAT_Z32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_D32_FLOAT, 0 }, 79 { PIPE_FORMAT_Z24_UNORM_S8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_D24_UNORM_S8_UINT, 0 }, 80 { PIPE_FORMAT_S8_UINT_Z24_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 81 { PIPE_FORMAT_Z24X8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_D24_UNORM_S8_UINT, 0 }, 82 { PIPE_FORMAT_X8Z24_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 83 { PIPE_FORMAT_S8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 84 { PIPE_FORMAT_R64_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 85 { PIPE_FORMAT_R64G64_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 86 { PIPE_FORMAT_R64G64B64_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 87 { PIPE_FORMAT_R64G64B64A64_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 88 { PIPE_FORMAT_R32_FLOAT, SVGA3D_R32_FLOAT, SVGA3D_R32_FLOAT, TF_GEN_MIPS }, 89 { PIPE_FORMAT_R32G32_FLOAT, SVGA3D_R32G32_FLOAT, SVGA3D_R32G32_FLOAT, TF_GEN_MIPS }, 90 { PIPE_FORMAT_R32G32B32_FLOAT, SVGA3D_R32G32B32_FLOAT, SVGA3D_R32G32B32_FLOAT, TF_GEN_MIPS }, 91 { PIPE_FORMAT_R32G32B32A32_FLOAT, SVGA3D_R32G32B32A32_FLOAT, SVGA3D_R32G32B32A32_FLOAT, TF_GEN_MIPS }, 92 { PIPE_FORMAT_R32_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 93 { PIPE_FORMAT_R32G32_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 94 { PIPE_FORMAT_R32G32B32_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 95 { PIPE_FORMAT_R32G32B32A32_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 96 { PIPE_FORMAT_R32_USCALED, SVGA3D_R32_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 97 { PIPE_FORMAT_R32G32_USCALED, SVGA3D_R32G32_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 98 { PIPE_FORMAT_R32G32B32_USCALED, SVGA3D_R32G32B32_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 99 { PIPE_FORMAT_R32G32B32A32_USCALED, SVGA3D_R32G32B32A32_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 100 { PIPE_FORMAT_R32_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 101 { PIPE_FORMAT_R32G32_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 102 { PIPE_FORMAT_R32G32B32_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 103 { PIPE_FORMAT_R32G32B32A32_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 104 { PIPE_FORMAT_R32_SSCALED, SVGA3D_R32_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 105 { PIPE_FORMAT_R32G32_SSCALED, SVGA3D_R32G32_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 106 { PIPE_FORMAT_R32G32B32_SSCALED, SVGA3D_R32G32B32_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 107 { PIPE_FORMAT_R32G32B32A32_SSCALED, SVGA3D_R32G32B32A32_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 108 { PIPE_FORMAT_R16_UNORM, SVGA3D_R16_UNORM, SVGA3D_R16_UNORM, TF_GEN_MIPS }, 109 { PIPE_FORMAT_R16G16_UNORM, SVGA3D_R16G16_UNORM, SVGA3D_R16G16_UNORM, TF_GEN_MIPS }, 110 { PIPE_FORMAT_R16G16B16_UNORM, SVGA3D_R16G16B16A16_UNORM, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 111 { PIPE_FORMAT_R16G16B16A16_UNORM, SVGA3D_R16G16B16A16_UNORM, SVGA3D_R16G16B16A16_UNORM, TF_GEN_MIPS }, 112 { PIPE_FORMAT_R16_USCALED, SVGA3D_R16_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 113 { PIPE_FORMAT_R16G16_USCALED, SVGA3D_R16G16_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 114 { PIPE_FORMAT_R16G16B16_USCALED, SVGA3D_R16G16B16A16_UINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 | VF_U_TO_F_CAST }, 115 { PIPE_FORMAT_R16G16B16A16_USCALED, SVGA3D_R16G16B16A16_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 116 { PIPE_FORMAT_R16_SNORM, SVGA3D_R16_SNORM, SVGA3D_R16_SNORM, 0 }, 117 { PIPE_FORMAT_R16G16_SNORM, SVGA3D_R16G16_SNORM, SVGA3D_R16G16_SNORM, 0 }, 118 { PIPE_FORMAT_R16G16B16_SNORM, SVGA3D_R16G16B16A16_SNORM, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 119 { PIPE_FORMAT_R16G16B16A16_SNORM, SVGA3D_R16G16B16A16_SNORM, SVGA3D_R16G16B16A16_SNORM, 0 }, 120 { PIPE_FORMAT_R16_SSCALED, SVGA3D_R16_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 121 { PIPE_FORMAT_R16G16_SSCALED, SVGA3D_R16G16_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 122 { PIPE_FORMAT_R16G16B16_SSCALED, SVGA3D_R16G16B16A16_SINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 | VF_I_TO_F_CAST }, 123 { PIPE_FORMAT_R16G16B16A16_SSCALED, SVGA3D_R16G16B16A16_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 124 { PIPE_FORMAT_R8_UNORM, SVGA3D_R8_UNORM, SVGA3D_R8_UNORM, TF_GEN_MIPS }, 125 { PIPE_FORMAT_R8G8_UNORM, SVGA3D_R8G8_UNORM, SVGA3D_R8G8_UNORM, TF_GEN_MIPS }, 126 { PIPE_FORMAT_R8G8B8_UNORM, SVGA3D_R8G8B8A8_UNORM, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 127 { PIPE_FORMAT_R8G8B8A8_UNORM, SVGA3D_R8G8B8A8_UNORM, SVGA3D_R8G8B8A8_UNORM, TF_GEN_MIPS }, 128 { PIPE_FORMAT_X8B8G8R8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 129 { PIPE_FORMAT_R8_USCALED, SVGA3D_R8_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 130 { PIPE_FORMAT_R8G8_USCALED, SVGA3D_R8G8_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 131 { PIPE_FORMAT_R8G8B8_USCALED, SVGA3D_R8G8B8A8_UINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 | VF_U_TO_F_CAST }, 132 { PIPE_FORMAT_R8G8B8A8_USCALED, SVGA3D_R8G8B8A8_UINT, SVGA3D_FORMAT_INVALID, VF_U_TO_F_CAST }, 133 { 73, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 134 { PIPE_FORMAT_R8_SNORM, SVGA3D_R8_SNORM, SVGA3D_R8_SNORM, 0 }, 135 { PIPE_FORMAT_R8G8_SNORM, SVGA3D_R8G8_SNORM, SVGA3D_R8G8_SNORM, 0 }, 136 { PIPE_FORMAT_R8G8B8_SNORM, SVGA3D_R8G8B8A8_SNORM, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 137 { PIPE_FORMAT_R8G8B8A8_SNORM, SVGA3D_R8G8B8A8_SNORM, SVGA3D_R8G8B8A8_SNORM, 0 }, 138 { 78, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 139 { 79, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 140 { 80, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 141 { 81, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 142 { PIPE_FORMAT_R8_SSCALED, SVGA3D_R8_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 143 { PIPE_FORMAT_R8G8_SSCALED, SVGA3D_R8G8_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 144 { PIPE_FORMAT_R8G8B8_SSCALED, SVGA3D_R8G8B8A8_SINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 | VF_I_TO_F_CAST }, 145 { PIPE_FORMAT_R8G8B8A8_SSCALED, SVGA3D_R8G8B8A8_SINT, SVGA3D_FORMAT_INVALID, VF_I_TO_F_CAST }, 146 { 86, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 147 { PIPE_FORMAT_R32_FIXED, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 148 { PIPE_FORMAT_R32G32_FIXED, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 149 { PIPE_FORMAT_R32G32B32_FIXED, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 150 { PIPE_FORMAT_R32G32B32A32_FIXED, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 151 { PIPE_FORMAT_R16_FLOAT, SVGA3D_R16_FLOAT, SVGA3D_R16_FLOAT, TF_GEN_MIPS }, 152 { PIPE_FORMAT_R16G16_FLOAT, SVGA3D_R16G16_FLOAT, SVGA3D_R16G16_FLOAT, TF_GEN_MIPS }, 153 { PIPE_FORMAT_R16G16B16_FLOAT, SVGA3D_R16G16B16A16_FLOAT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 154 { PIPE_FORMAT_R16G16B16A16_FLOAT, SVGA3D_R16G16B16A16_FLOAT, SVGA3D_R16G16B16A16_FLOAT, TF_GEN_MIPS }, 155 { PIPE_FORMAT_L8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 156 { PIPE_FORMAT_L8A8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 157 { PIPE_FORMAT_R8G8B8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 158 { PIPE_FORMAT_A8B8G8R8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 159 { PIPE_FORMAT_X8B8G8R8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 160 { PIPE_FORMAT_B8G8R8A8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_B8G8R8A8_UNORM_SRGB, TF_GEN_MIPS }, 161 { PIPE_FORMAT_B8G8R8X8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_B8G8R8X8_UNORM_SRGB, TF_GEN_MIPS }, 162 { PIPE_FORMAT_A8R8G8B8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 163 { PIPE_FORMAT_X8R8G8B8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 164 { PIPE_FORMAT_R8G8B8A8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_R8G8B8A8_UNORM_SRGB, TF_GEN_MIPS }, 165 { PIPE_FORMAT_DXT1_RGB, SVGA3D_FORMAT_INVALID, SVGA3D_BC1_UNORM, 0 }, 166 { PIPE_FORMAT_DXT1_RGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC1_UNORM, 0 }, 167 { PIPE_FORMAT_DXT3_RGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC2_UNORM, 0 }, 168 { PIPE_FORMAT_DXT5_RGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC3_UNORM, 0 }, 169 { PIPE_FORMAT_DXT1_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_BC1_UNORM_SRGB, 0 }, 170 { PIPE_FORMAT_DXT1_SRGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC1_UNORM_SRGB, 0 }, 171 { PIPE_FORMAT_DXT3_SRGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC2_UNORM_SRGB, 0 }, 172 { PIPE_FORMAT_DXT5_SRGBA, SVGA3D_FORMAT_INVALID, SVGA3D_BC3_UNORM_SRGB, 0 }, 173 { PIPE_FORMAT_RGTC1_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_BC4_UNORM, 0 }, 174 { PIPE_FORMAT_RGTC1_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_BC4_SNORM, 0 }, 175 { PIPE_FORMAT_RGTC2_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_BC5_UNORM, 0 }, 176 { PIPE_FORMAT_RGTC2_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_BC5_SNORM, 0 }, 177 { PIPE_FORMAT_R8G8_B8G8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 178 { PIPE_FORMAT_G8R8_G8B8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 179 { PIPE_FORMAT_R8SG8SB8UX8U_NORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 180 { PIPE_FORMAT_R5SG5SB6U_NORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 181 { PIPE_FORMAT_A8B8G8R8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 182 { PIPE_FORMAT_B5G5R5X1_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 183 { PIPE_FORMAT_R10G10B10A2_USCALED, SVGA3D_R10G10B10A2_UNORM, SVGA3D_FORMAT_INVALID, VF_PUINT_TO_USCALED }, 184 { PIPE_FORMAT_R11G11B10_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_R11G11B10_FLOAT, TF_GEN_MIPS }, 185 { PIPE_FORMAT_R9G9B9E5_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_R9G9B9E5_SHAREDEXP, 0 }, 186 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_D32_FLOAT_S8X24_UINT, 0 }, 187 { PIPE_FORMAT_R1_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 188 { PIPE_FORMAT_R10G10B10X2_USCALED, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 189 { PIPE_FORMAT_R10G10B10X2_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 190 { PIPE_FORMAT_L4A4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 191 { PIPE_FORMAT_B10G10R10A2_UNORM, SVGA3D_R10G10B10A2_UNORM, SVGA3D_FORMAT_INVALID, VF_BGRA }, 192 { PIPE_FORMAT_R10SG10SB10SA2U_NORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 193 { PIPE_FORMAT_R8G8Bx_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 194 { PIPE_FORMAT_R8G8B8X8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 195 { PIPE_FORMAT_B4G4R4X4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 196 { PIPE_FORMAT_X24S8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 197 { PIPE_FORMAT_S8X24_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 198 { PIPE_FORMAT_X32_S8X24_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 199 { PIPE_FORMAT_B2G3R3_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 200 { PIPE_FORMAT_L16A16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 201 { PIPE_FORMAT_A16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 202 { PIPE_FORMAT_I16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 203 { PIPE_FORMAT_LATC1_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 204 { PIPE_FORMAT_LATC1_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 205 { PIPE_FORMAT_LATC2_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 206 { PIPE_FORMAT_LATC2_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 207 { PIPE_FORMAT_A8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 208 { PIPE_FORMAT_L8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 209 { PIPE_FORMAT_L8A8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 210 { PIPE_FORMAT_I8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 211 { PIPE_FORMAT_A16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 212 { PIPE_FORMAT_L16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 213 { PIPE_FORMAT_L16A16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 214 { PIPE_FORMAT_I16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 215 { PIPE_FORMAT_A16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 216 { PIPE_FORMAT_L16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 217 { PIPE_FORMAT_L16A16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 218 { PIPE_FORMAT_I16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 219 { PIPE_FORMAT_A32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 220 { PIPE_FORMAT_L32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 221 { PIPE_FORMAT_L32A32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 222 { PIPE_FORMAT_I32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 223 { PIPE_FORMAT_YV12, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 224 { PIPE_FORMAT_YV16, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 225 { PIPE_FORMAT_IYUV, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 226 { PIPE_FORMAT_NV12, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 227 { PIPE_FORMAT_NV21, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 228 { PIPE_FORMAT_A4R4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 229 { PIPE_FORMAT_R4A4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 230 { PIPE_FORMAT_R8A8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 231 { PIPE_FORMAT_A8R8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 232 { PIPE_FORMAT_R10G10B10A2_SSCALED, SVGA3D_R32_UINT, SVGA3D_FORMAT_INVALID, VF_PUINT_TO_SSCALED }, 233 { PIPE_FORMAT_R10G10B10A2_SNORM, SVGA3D_R10G10B10A2_UNORM, SVGA3D_FORMAT_INVALID, VF_PUINT_TO_SNORM }, 234 { PIPE_FORMAT_B10G10R10A2_USCALED, SVGA3D_R10G10B10A2_UNORM, SVGA3D_FORMAT_INVALID, VF_BGRA | VF_PUINT_TO_USCALED }, 235 { PIPE_FORMAT_B10G10R10A2_SSCALED, SVGA3D_R32_UINT, SVGA3D_FORMAT_INVALID, VF_BGRA | VF_PUINT_TO_SSCALED }, 236 { PIPE_FORMAT_B10G10R10A2_SNORM, SVGA3D_R10G10B10A2_UNORM, SVGA3D_FORMAT_INVALID, VF_BGRA | VF_PUINT_TO_SNORM }, 237 { PIPE_FORMAT_R8_UINT, SVGA3D_R8_UINT, SVGA3D_R8_UINT, 0 }, 238 { PIPE_FORMAT_R8G8_UINT, SVGA3D_R8G8_UINT, SVGA3D_R8G8_UINT, 0 }, 239 { PIPE_FORMAT_R8G8B8_UINT, SVGA3D_R8G8B8A8_UINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 240 { PIPE_FORMAT_R8G8B8A8_UINT, SVGA3D_R8G8B8A8_UINT, SVGA3D_R8G8B8A8_UINT, 0 }, 241 { PIPE_FORMAT_R8_SINT, SVGA3D_R8_SINT, SVGA3D_R8_SINT, 0 }, 242 { PIPE_FORMAT_R8G8_SINT, SVGA3D_R8G8_SINT, SVGA3D_R8G8_SINT, 0 }, 243 { PIPE_FORMAT_R8G8B8_SINT, SVGA3D_R8G8B8A8_SINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 244 { PIPE_FORMAT_R8G8B8A8_SINT, SVGA3D_R8G8B8A8_SINT, SVGA3D_R8G8B8A8_SINT, 0 }, 245 { PIPE_FORMAT_R16_UINT, SVGA3D_R16_UINT, SVGA3D_R16_UINT, 0 }, 246 { PIPE_FORMAT_R16G16_UINT, SVGA3D_R16G16_UINT, SVGA3D_R16G16_UINT, 0 }, 247 { PIPE_FORMAT_R16G16B16_UINT, SVGA3D_R16G16B16A16_UINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 248 { PIPE_FORMAT_R16G16B16A16_UINT, SVGA3D_R16G16B16A16_UINT, SVGA3D_R16G16B16A16_UINT, 0 }, 249 { PIPE_FORMAT_R16_SINT, SVGA3D_R16_SINT, SVGA3D_R16_SINT, 0 }, 250 { PIPE_FORMAT_R16G16_SINT, SVGA3D_R16G16_SINT, SVGA3D_R16G16_SINT, 0 }, 251 { PIPE_FORMAT_R16G16B16_SINT, SVGA3D_R16G16B16A16_SINT, SVGA3D_FORMAT_INVALID, VF_W_TO_1 }, 252 { PIPE_FORMAT_R16G16B16A16_SINT, SVGA3D_R16G16B16A16_SINT, SVGA3D_R16G16B16A16_SINT, 0 }, 253 { PIPE_FORMAT_R32_UINT, SVGA3D_R32_UINT, SVGA3D_R32_UINT, 0 }, 254 { PIPE_FORMAT_R32G32_UINT, SVGA3D_R32G32_UINT, SVGA3D_R32G32_UINT, 0 }, 255 { PIPE_FORMAT_R32G32B32_UINT, SVGA3D_R32G32B32_UINT, SVGA3D_FORMAT_INVALID, 0 }, 256 { PIPE_FORMAT_R32G32B32A32_UINT, SVGA3D_R32G32B32A32_UINT, SVGA3D_R32G32B32A32_UINT, 0 }, 257 { PIPE_FORMAT_R32_SINT, SVGA3D_R32_SINT, SVGA3D_R32_SINT, 0 }, 258 { PIPE_FORMAT_R32G32_SINT, SVGA3D_R32G32_SINT, SVGA3D_R32G32_SINT, 0 }, 259 { PIPE_FORMAT_R32G32B32_SINT, SVGA3D_R32G32B32_SINT, SVGA3D_FORMAT_INVALID, 0 }, 260 { PIPE_FORMAT_R32G32B32A32_SINT, SVGA3D_R32G32B32A32_SINT, SVGA3D_R32G32B32A32_SINT, 0 }, 261 { PIPE_FORMAT_A8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 262 { PIPE_FORMAT_I8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 263 { PIPE_FORMAT_L8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 264 { PIPE_FORMAT_L8A8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 265 { PIPE_FORMAT_A8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 266 { PIPE_FORMAT_I8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 267 { PIPE_FORMAT_L8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 268 { PIPE_FORMAT_L8A8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 269 { PIPE_FORMAT_A16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 270 { PIPE_FORMAT_I16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 271 { PIPE_FORMAT_L16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 272 { PIPE_FORMAT_L16A16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 273 { PIPE_FORMAT_A16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 274 { PIPE_FORMAT_I16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 275 { PIPE_FORMAT_L16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 276 { PIPE_FORMAT_L16A16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 277 { PIPE_FORMAT_A32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 278 { PIPE_FORMAT_I32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 279 { PIPE_FORMAT_L32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 280 { PIPE_FORMAT_L32A32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 281 { PIPE_FORMAT_A32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 282 { PIPE_FORMAT_I32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 283 { PIPE_FORMAT_L32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 284 { PIPE_FORMAT_L32A32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 285 { PIPE_FORMAT_B10G10R10A2_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 286 { PIPE_FORMAT_ETC1_RGB8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 287 { PIPE_FORMAT_R8G8_R8B8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 288 { PIPE_FORMAT_G8R8_B8R8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 289 { PIPE_FORMAT_R8G8B8X8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 290 { PIPE_FORMAT_R8G8B8X8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 291 { PIPE_FORMAT_R8G8B8X8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 292 { PIPE_FORMAT_R8G8B8X8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 293 { PIPE_FORMAT_B10G10R10X2_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 294 { PIPE_FORMAT_R16G16B16X16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 295 { PIPE_FORMAT_R16G16B16X16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 296 { PIPE_FORMAT_R16G16B16X16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 297 { PIPE_FORMAT_R16G16B16X16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 298 { PIPE_FORMAT_R16G16B16X16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 299 { PIPE_FORMAT_R32G32B32X32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 300 { PIPE_FORMAT_R32G32B32X32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 301 { PIPE_FORMAT_R32G32B32X32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 302 { PIPE_FORMAT_R8A8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 303 { PIPE_FORMAT_R16A16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 304 { PIPE_FORMAT_R16A16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 305 { PIPE_FORMAT_R16A16_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 306 { PIPE_FORMAT_R32A32_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 307 { PIPE_FORMAT_R8A8_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 308 { PIPE_FORMAT_R8A8_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 309 { PIPE_FORMAT_R16A16_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 310 { PIPE_FORMAT_R16A16_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 311 { PIPE_FORMAT_R32A32_UINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 312 { PIPE_FORMAT_R32A32_SINT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 313 { PIPE_FORMAT_R10G10B10A2_UINT, SVGA3D_R10G10B10A2_UINT, SVGA3D_R10G10B10A2_UINT, 0 }, 314 { PIPE_FORMAT_B5G6R5_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 315 { PIPE_FORMAT_BPTC_RGBA_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 316 { PIPE_FORMAT_BPTC_SRGBA, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 317 { PIPE_FORMAT_BPTC_RGB_FLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 318 { PIPE_FORMAT_BPTC_RGB_UFLOAT, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 319 { PIPE_FORMAT_A8L8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 320 { PIPE_FORMAT_A8L8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 321 { PIPE_FORMAT_A8L8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 322 { PIPE_FORMAT_A16L16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 323 { PIPE_FORMAT_G8R8_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 324 { PIPE_FORMAT_G8R8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 325 { PIPE_FORMAT_G16R16_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 326 { PIPE_FORMAT_G16R16_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 327 { PIPE_FORMAT_A8B8G8R8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 328 { PIPE_FORMAT_X8B8G8R8_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 329 { PIPE_FORMAT_ETC2_RGB8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 330 { PIPE_FORMAT_ETC2_SRGB8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 331 { PIPE_FORMAT_ETC2_RGB8A1, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 332 { PIPE_FORMAT_ETC2_SRGB8A1, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 333 { PIPE_FORMAT_ETC2_RGBA8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 334 { PIPE_FORMAT_ETC2_SRGBA8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 335 { PIPE_FORMAT_ETC2_R11_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 336 { PIPE_FORMAT_ETC2_R11_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 337 { PIPE_FORMAT_ETC2_RG11_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 338 { PIPE_FORMAT_ETC2_RG11_SNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 339 { PIPE_FORMAT_ASTC_4x4, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 340 { PIPE_FORMAT_ASTC_5x4, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 341 { PIPE_FORMAT_ASTC_5x5, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 342 { PIPE_FORMAT_ASTC_6x5, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 343 { PIPE_FORMAT_ASTC_6x6, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 344 { PIPE_FORMAT_ASTC_8x5, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 345 { PIPE_FORMAT_ASTC_8x6, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 346 { PIPE_FORMAT_ASTC_8x8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 347 { PIPE_FORMAT_ASTC_10x5, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 348 { PIPE_FORMAT_ASTC_10x6, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 349 { PIPE_FORMAT_ASTC_10x8, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 350 { PIPE_FORMAT_ASTC_10x10, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 351 { PIPE_FORMAT_ASTC_12x10, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 352 { PIPE_FORMAT_ASTC_12x12, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 353 { PIPE_FORMAT_ASTC_4x4_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 354 { PIPE_FORMAT_ASTC_5x4_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 355 { PIPE_FORMAT_ASTC_5x5_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 356 { PIPE_FORMAT_ASTC_6x5_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 357 { PIPE_FORMAT_ASTC_6x6_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 358 { PIPE_FORMAT_ASTC_8x5_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 359 { PIPE_FORMAT_ASTC_8x6_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 360 { PIPE_FORMAT_ASTC_8x8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 361 { PIPE_FORMAT_ASTC_10x5_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 362 { PIPE_FORMAT_ASTC_10x6_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 363 { PIPE_FORMAT_ASTC_10x8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 364 { PIPE_FORMAT_ASTC_10x10_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 365 { PIPE_FORMAT_ASTC_12x10_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 366 { PIPE_FORMAT_ASTC_12x12_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 367 { PIPE_FORMAT_P016, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 368 { PIPE_FORMAT_R10G10B10X2_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 369 { PIPE_FORMAT_A1B5G5R5_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 370 { PIPE_FORMAT_X1B5G5R5_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 }, 371 }; 372 373 374 /** 375 * Translate a gallium vertex format to a vgpu10 vertex format. 376 * Also, return any special vertex format flags. 377 */ 378 void 379 svga_translate_vertex_format_vgpu10(enum pipe_format format, 380 SVGA3dSurfaceFormat *svga_format, 381 unsigned *vf_flags) 382 { 383 assert(format < ARRAY_SIZE(format_conversion_table)); 384 if (format >= ARRAY_SIZE(format_conversion_table)) { 385 format = PIPE_FORMAT_NONE; 386 } 387 *svga_format = format_conversion_table[format].vertex_format; 388 *vf_flags = format_conversion_table[format].flags; 389 } 390 391 392 /** 393 * Translate a gallium scanout format to a svga format valid 394 * for screen target surface. 395 */ 396 static SVGA3dSurfaceFormat 397 svga_translate_screen_target_format_vgpu10(enum pipe_format format) 398 { 399 switch (format) { 400 case PIPE_FORMAT_B8G8R8A8_UNORM: 401 return SVGA3D_B8G8R8A8_UNORM; 402 case PIPE_FORMAT_B8G8R8X8_UNORM: 403 return SVGA3D_B8G8R8X8_UNORM; 404 case PIPE_FORMAT_B5G6R5_UNORM: 405 return SVGA3D_R5G6B5; 406 case PIPE_FORMAT_B5G5R5A1_UNORM: 407 return SVGA3D_A1R5G5B5; 408 default: 409 debug_printf("Invalid format %s specified for screen target\n", 410 svga_format_name(format)); 411 return SVGA3D_FORMAT_INVALID; 412 } 413 } 414 415 /* 416 * Translate from gallium format to SVGA3D format. 417 */ 418 SVGA3dSurfaceFormat 419 svga_translate_format(const struct svga_screen *ss, 420 enum pipe_format format, 421 unsigned bind) 422 { 423 if (ss->sws->have_vgpu10) { 424 if (bind & (PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER)) { 425 return format_conversion_table[format].vertex_format; 426 } 427 else if (bind & PIPE_BIND_SCANOUT) { 428 return svga_translate_screen_target_format_vgpu10(format); 429 } 430 else { 431 return format_conversion_table[format].pixel_format; 432 } 433 } 434 435 switch(format) { 436 case PIPE_FORMAT_B8G8R8A8_UNORM: 437 return SVGA3D_A8R8G8B8; 438 case PIPE_FORMAT_B8G8R8X8_UNORM: 439 return SVGA3D_X8R8G8B8; 440 441 /* sRGB required for GL2.1 */ 442 case PIPE_FORMAT_B8G8R8A8_SRGB: 443 return SVGA3D_A8R8G8B8; 444 case PIPE_FORMAT_DXT1_SRGB: 445 case PIPE_FORMAT_DXT1_SRGBA: 446 return SVGA3D_DXT1; 447 case PIPE_FORMAT_DXT3_SRGBA: 448 return SVGA3D_DXT3; 449 case PIPE_FORMAT_DXT5_SRGBA: 450 return SVGA3D_DXT5; 451 452 case PIPE_FORMAT_B5G6R5_UNORM: 453 return SVGA3D_R5G6B5; 454 case PIPE_FORMAT_B5G5R5A1_UNORM: 455 return SVGA3D_A1R5G5B5; 456 case PIPE_FORMAT_B4G4R4A4_UNORM: 457 return SVGA3D_A4R4G4B4; 458 459 case PIPE_FORMAT_R16G16B16A16_UNORM: 460 return SVGA3D_A16B16G16R16; 461 462 case PIPE_FORMAT_Z16_UNORM: 463 assert(!ss->sws->have_vgpu10); 464 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16; 465 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 466 assert(!ss->sws->have_vgpu10); 467 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8; 468 case PIPE_FORMAT_X8Z24_UNORM: 469 assert(!ss->sws->have_vgpu10); 470 return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8; 471 472 case PIPE_FORMAT_A8_UNORM: 473 return SVGA3D_ALPHA8; 474 case PIPE_FORMAT_L8_UNORM: 475 return SVGA3D_LUMINANCE8; 476 477 case PIPE_FORMAT_DXT1_RGB: 478 case PIPE_FORMAT_DXT1_RGBA: 479 return SVGA3D_DXT1; 480 case PIPE_FORMAT_DXT3_RGBA: 481 return SVGA3D_DXT3; 482 case PIPE_FORMAT_DXT5_RGBA: 483 return SVGA3D_DXT5; 484 485 /* Float formats (only 1, 2 and 4-component formats supported) */ 486 case PIPE_FORMAT_R32_FLOAT: 487 return SVGA3D_R_S23E8; 488 case PIPE_FORMAT_R32G32_FLOAT: 489 return SVGA3D_RG_S23E8; 490 case PIPE_FORMAT_R32G32B32A32_FLOAT: 491 return SVGA3D_ARGB_S23E8; 492 case PIPE_FORMAT_R16_FLOAT: 493 return SVGA3D_R_S10E5; 494 case PIPE_FORMAT_R16G16_FLOAT: 495 return SVGA3D_RG_S10E5; 496 case PIPE_FORMAT_R16G16B16A16_FLOAT: 497 return SVGA3D_ARGB_S10E5; 498 499 case PIPE_FORMAT_Z32_UNORM: 500 /* SVGA3D_Z_D32 is not yet unsupported */ 501 /* fall-through */ 502 default: 503 return SVGA3D_FORMAT_INVALID; 504 } 505 } 506 507 508 /* 509 * Format capability description entry. 510 */ 511 struct format_cap { 512 const char *name; 513 514 SVGA3dSurfaceFormat format; 515 516 /* 517 * Capability index corresponding to the format. 518 */ 519 SVGA3dDevCapIndex devcap; 520 521 /* size of each pixel/block */ 522 unsigned block_width, block_height, block_bytes; 523 524 /* 525 * Mask of supported SVGA3dFormatOp operations, to be inferred when the 526 * capability is not explicitly present. 527 */ 528 uint32 defaultOperations; 529 }; 530 531 532 /* 533 * Format capability description table. 534 * 535 * Ordered by increasing SVGA3dSurfaceFormat value, but with gaps. 536 * 537 * Note: there are some special cases below where we set devcap=0 and 538 * avoid querying the host. In particular, depth/stencil formats which 539 * can be rendered to and sampled from. For example, the gallium format 540 * PIPE_FORMAT_Z24_UNORM_S8_UINT is converted to SVGA3D_D24_UNORM_S8_UINT 541 * for rendering but converted to SVGA3D_R24_UNORM_X8 for sampling. 542 * If we want to query if a format supports both rendering and sampling the 543 * host will tell us no for SVGA3D_D24_UNORM_S8_UINT, SVGA3D_D16_UNORM and 544 * SVGA3D_R24_UNORM_X8. So we override the host query for those 545 * formats and report that both can do rendering and sampling. 546 */ 547 static const struct format_cap format_cap_table[] = { 548 { 549 "SVGA3D_FORMAT_INVALID", 550 SVGA3D_FORMAT_INVALID, 0, 0, 0, 0, 0 551 }, 552 { 553 "SVGA3D_X8R8G8B8", 554 SVGA3D_X8R8G8B8, 555 SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8, 556 1, 1, 4, 557 SVGA3DFORMAT_OP_TEXTURE | 558 SVGA3DFORMAT_OP_CUBETEXTURE | 559 SVGA3DFORMAT_OP_VOLUMETEXTURE | 560 SVGA3DFORMAT_OP_DISPLAYMODE | 561 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 562 }, 563 { 564 "SVGA3D_A8R8G8B8", 565 SVGA3D_A8R8G8B8, 566 SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8, 567 1, 1, 4, 568 SVGA3DFORMAT_OP_TEXTURE | 569 SVGA3DFORMAT_OP_CUBETEXTURE | 570 SVGA3DFORMAT_OP_VOLUMETEXTURE | 571 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 572 }, 573 { 574 "SVGA3D_R5G6B5", 575 SVGA3D_R5G6B5, 576 SVGA3D_DEVCAP_SURFACEFMT_R5G6B5, 577 1, 1, 2, 578 SVGA3DFORMAT_OP_TEXTURE | 579 SVGA3DFORMAT_OP_CUBETEXTURE | 580 SVGA3DFORMAT_OP_VOLUMETEXTURE | 581 SVGA3DFORMAT_OP_DISPLAYMODE | 582 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 583 }, 584 { 585 "SVGA3D_X1R5G5B5", 586 SVGA3D_X1R5G5B5, 587 SVGA3D_DEVCAP_SURFACEFMT_X1R5G5B5, 588 1, 1, 2, 589 SVGA3DFORMAT_OP_TEXTURE | 590 SVGA3DFORMAT_OP_CUBETEXTURE | 591 SVGA3DFORMAT_OP_VOLUMETEXTURE | 592 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 593 }, 594 { 595 "SVGA3D_A1R5G5B5", 596 SVGA3D_A1R5G5B5, 597 SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5, 598 1, 1, 2, 599 SVGA3DFORMAT_OP_TEXTURE | 600 SVGA3DFORMAT_OP_CUBETEXTURE | 601 SVGA3DFORMAT_OP_VOLUMETEXTURE | 602 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 603 }, 604 { 605 "SVGA3D_A4R4G4B4", 606 SVGA3D_A4R4G4B4, 607 SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4, 608 1, 1, 2, 609 SVGA3DFORMAT_OP_TEXTURE | 610 SVGA3DFORMAT_OP_CUBETEXTURE | 611 SVGA3DFORMAT_OP_VOLUMETEXTURE | 612 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 613 }, 614 { 615 /* 616 * SVGA3D_Z_D32 is not yet supported, and has no corresponding 617 * SVGA3D_DEVCAP_xxx. 618 */ 619 "SVGA3D_Z_D32", 620 SVGA3D_Z_D32, 0, 0, 0, 0, 0 621 }, 622 { 623 "SVGA3D_Z_D16", 624 SVGA3D_Z_D16, 625 SVGA3D_DEVCAP_SURFACEFMT_Z_D16, 626 1, 1, 2, 627 SVGA3DFORMAT_OP_ZSTENCIL 628 }, 629 { 630 "SVGA3D_Z_D24S8", 631 SVGA3D_Z_D24S8, 632 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8, 633 1, 1, 4, 634 SVGA3DFORMAT_OP_ZSTENCIL 635 }, 636 { 637 "SVGA3D_Z_D15S1", 638 SVGA3D_Z_D15S1, 639 SVGA3D_DEVCAP_MAX, 640 1, 1, 2, 641 SVGA3DFORMAT_OP_ZSTENCIL 642 }, 643 { 644 "SVGA3D_LUMINANCE8", 645 SVGA3D_LUMINANCE8, 646 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8, 647 1, 1, 1, 648 SVGA3DFORMAT_OP_TEXTURE | 649 SVGA3DFORMAT_OP_CUBETEXTURE | 650 SVGA3DFORMAT_OP_VOLUMETEXTURE 651 }, 652 { 653 /* 654 * SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding 655 * SVGA3D_DEVCAP_xxx. 656 */ 657 "SVGA3D_LUMINANCE4_ALPHA4", 658 SVGA3D_LUMINANCE4_ALPHA4, 0, 0, 0, 0, 0 659 }, 660 { 661 "SVGA3D_LUMINANCE16", 662 SVGA3D_LUMINANCE16, 663 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16, 664 1, 1, 2, 665 SVGA3DFORMAT_OP_TEXTURE | 666 SVGA3DFORMAT_OP_CUBETEXTURE | 667 SVGA3DFORMAT_OP_VOLUMETEXTURE 668 }, 669 { 670 "SVGA3D_LUMINANCE8_ALPHA8", 671 SVGA3D_LUMINANCE8_ALPHA8, 672 SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8_ALPHA8, 673 1, 1, 2, 674 SVGA3DFORMAT_OP_TEXTURE | 675 SVGA3DFORMAT_OP_CUBETEXTURE | 676 SVGA3DFORMAT_OP_VOLUMETEXTURE 677 }, 678 { 679 "SVGA3D_DXT1", 680 SVGA3D_DXT1, 681 SVGA3D_DEVCAP_SURFACEFMT_DXT1, 682 4, 4, 8, 683 SVGA3DFORMAT_OP_TEXTURE | 684 SVGA3DFORMAT_OP_CUBETEXTURE 685 }, 686 { 687 "SVGA3D_DXT2", 688 SVGA3D_DXT2, 689 SVGA3D_DEVCAP_SURFACEFMT_DXT2, 690 4, 4, 8, 691 SVGA3DFORMAT_OP_TEXTURE | 692 SVGA3DFORMAT_OP_CUBETEXTURE 693 }, 694 { 695 "SVGA3D_DXT3", 696 SVGA3D_DXT3, 697 SVGA3D_DEVCAP_SURFACEFMT_DXT3, 698 4, 4, 16, 699 SVGA3DFORMAT_OP_TEXTURE | 700 SVGA3DFORMAT_OP_CUBETEXTURE 701 }, 702 { 703 "SVGA3D_DXT4", 704 SVGA3D_DXT4, 705 SVGA3D_DEVCAP_SURFACEFMT_DXT4, 706 4, 4, 16, 707 SVGA3DFORMAT_OP_TEXTURE | 708 SVGA3DFORMAT_OP_CUBETEXTURE 709 }, 710 { 711 "SVGA3D_DXT5", 712 SVGA3D_DXT5, 713 SVGA3D_DEVCAP_SURFACEFMT_DXT5, 714 4, 4, 8, 715 SVGA3DFORMAT_OP_TEXTURE | 716 SVGA3DFORMAT_OP_CUBETEXTURE 717 }, 718 { 719 "SVGA3D_BUMPU8V8", 720 SVGA3D_BUMPU8V8, 721 SVGA3D_DEVCAP_SURFACEFMT_BUMPU8V8, 722 1, 1, 2, 723 SVGA3DFORMAT_OP_TEXTURE | 724 SVGA3DFORMAT_OP_CUBETEXTURE | 725 SVGA3DFORMAT_OP_VOLUMETEXTURE 726 }, 727 { 728 /* 729 * SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding 730 * SVGA3D_DEVCAP_xxx. 731 */ 732 "SVGA3D_BUMPL6V5U5", 733 SVGA3D_BUMPL6V5U5, 0, 0, 0, 0, 0 734 }, 735 { 736 "SVGA3D_BUMPX8L8V8U8", 737 SVGA3D_BUMPX8L8V8U8, 738 SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8, 739 1, 1, 4, 740 SVGA3DFORMAT_OP_TEXTURE | 741 SVGA3DFORMAT_OP_CUBETEXTURE 742 }, 743 { 744 "SVGA3D_FORMAT_DEAD1", 745 SVGA3D_FORMAT_DEAD1, 0, 0, 0, 0, 0 746 }, 747 { 748 "SVGA3D_ARGB_S10E5", 749 SVGA3D_ARGB_S10E5, 750 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S10E5, 751 1, 1, 2, 752 SVGA3DFORMAT_OP_TEXTURE | 753 SVGA3DFORMAT_OP_CUBETEXTURE | 754 SVGA3DFORMAT_OP_VOLUMETEXTURE | 755 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 756 }, 757 { 758 "SVGA3D_ARGB_S23E8", 759 SVGA3D_ARGB_S23E8, 760 SVGA3D_DEVCAP_SURFACEFMT_ARGB_S23E8, 761 1, 1, 4, 762 SVGA3DFORMAT_OP_TEXTURE | 763 SVGA3DFORMAT_OP_CUBETEXTURE | 764 SVGA3DFORMAT_OP_VOLUMETEXTURE | 765 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 766 }, 767 { 768 "SVGA3D_A2R10G10B10", 769 SVGA3D_A2R10G10B10, 770 SVGA3D_DEVCAP_SURFACEFMT_A2R10G10B10, 771 1, 1, 4, 772 SVGA3DFORMAT_OP_TEXTURE | 773 SVGA3DFORMAT_OP_CUBETEXTURE | 774 SVGA3DFORMAT_OP_VOLUMETEXTURE | 775 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 776 }, 777 { 778 /* 779 * SVGA3D_V8U8 is unsupported; it has no corresponding 780 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead. 781 */ 782 "SVGA3D_V8U8", 783 SVGA3D_V8U8, 0, 0, 0, 0, 0 784 }, 785 { 786 "SVGA3D_Q8W8V8U8", 787 SVGA3D_Q8W8V8U8, 788 SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8, 789 1, 1, 4, 790 SVGA3DFORMAT_OP_TEXTURE | 791 SVGA3DFORMAT_OP_CUBETEXTURE 792 }, 793 { 794 "SVGA3D_CxV8U8", 795 SVGA3D_CxV8U8, 796 SVGA3D_DEVCAP_SURFACEFMT_CxV8U8, 797 1, 1, 2, 798 SVGA3DFORMAT_OP_TEXTURE 799 }, 800 { 801 /* 802 * SVGA3D_X8L8V8U8 is unsupported; it has no corresponding 803 * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead. 804 */ 805 "SVGA3D_X8L8V8U8", 806 SVGA3D_X8L8V8U8, 0, 0, 0, 0, 0 807 }, 808 { 809 "SVGA3D_A2W10V10U10", 810 SVGA3D_A2W10V10U10, 811 SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10, 812 1, 1, 4, 813 SVGA3DFORMAT_OP_TEXTURE 814 }, 815 { 816 "SVGA3D_ALPHA8", 817 SVGA3D_ALPHA8, 818 SVGA3D_DEVCAP_SURFACEFMT_ALPHA8, 819 1, 1, 1, 820 SVGA3DFORMAT_OP_TEXTURE | 821 SVGA3DFORMAT_OP_CUBETEXTURE | 822 SVGA3DFORMAT_OP_VOLUMETEXTURE 823 }, 824 { 825 "SVGA3D_R_S10E5", 826 SVGA3D_R_S10E5, 827 SVGA3D_DEVCAP_SURFACEFMT_R_S10E5, 828 1, 1, 2, 829 SVGA3DFORMAT_OP_TEXTURE | 830 SVGA3DFORMAT_OP_VOLUMETEXTURE | 831 SVGA3DFORMAT_OP_CUBETEXTURE | 832 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 833 }, 834 { 835 "SVGA3D_R_S23E8", 836 SVGA3D_R_S23E8, 837 SVGA3D_DEVCAP_SURFACEFMT_R_S23E8, 838 1, 1, 4, 839 SVGA3DFORMAT_OP_TEXTURE | 840 SVGA3DFORMAT_OP_VOLUMETEXTURE | 841 SVGA3DFORMAT_OP_CUBETEXTURE | 842 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 843 }, 844 { 845 "SVGA3D_RG_S10E5", 846 SVGA3D_RG_S10E5, 847 SVGA3D_DEVCAP_SURFACEFMT_RG_S10E5, 848 1, 1, 2, 849 SVGA3DFORMAT_OP_TEXTURE | 850 SVGA3DFORMAT_OP_VOLUMETEXTURE | 851 SVGA3DFORMAT_OP_CUBETEXTURE | 852 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 853 }, 854 { 855 "SVGA3D_RG_S23E8", 856 SVGA3D_RG_S23E8, 857 SVGA3D_DEVCAP_SURFACEFMT_RG_S23E8, 858 1, 1, 4, 859 SVGA3DFORMAT_OP_TEXTURE | 860 SVGA3DFORMAT_OP_VOLUMETEXTURE | 861 SVGA3DFORMAT_OP_CUBETEXTURE | 862 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 863 }, 864 { 865 /* 866 * SVGA3D_BUFFER is a placeholder format for index/vertex buffers. 867 */ 868 "SVGA3D_BUFFER", 869 SVGA3D_BUFFER, 0, 1, 1, 1, 0 870 }, 871 { 872 "SVGA3D_Z_D24X8", 873 SVGA3D_Z_D24X8, 874 SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8, 875 1, 1, 4, 876 SVGA3DFORMAT_OP_ZSTENCIL 877 }, 878 { 879 "SVGA3D_V16U16", 880 SVGA3D_V16U16, 881 SVGA3D_DEVCAP_SURFACEFMT_V16U16, 882 1, 1, 4, 883 SVGA3DFORMAT_OP_TEXTURE | 884 SVGA3DFORMAT_OP_CUBETEXTURE | 885 SVGA3DFORMAT_OP_VOLUMETEXTURE 886 }, 887 { 888 "SVGA3D_G16R16", 889 SVGA3D_G16R16, 890 SVGA3D_DEVCAP_SURFACEFMT_G16R16, 891 1, 1, 4, 892 SVGA3DFORMAT_OP_TEXTURE | 893 SVGA3DFORMAT_OP_CUBETEXTURE | 894 SVGA3DFORMAT_OP_VOLUMETEXTURE | 895 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 896 }, 897 { 898 "SVGA3D_A16B16G16R16", 899 SVGA3D_A16B16G16R16, 900 SVGA3D_DEVCAP_SURFACEFMT_A16B16G16R16, 901 1, 1, 8, 902 SVGA3DFORMAT_OP_TEXTURE | 903 SVGA3DFORMAT_OP_CUBETEXTURE | 904 SVGA3DFORMAT_OP_VOLUMETEXTURE | 905 SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET 906 }, 907 { 908 "SVGA3D_UYVY", 909 SVGA3D_UYVY, 910 SVGA3D_DEVCAP_SURFACEFMT_UYVY, 911 0, 0, 0, 0 912 }, 913 { 914 "SVGA3D_YUY2", 915 SVGA3D_YUY2, 916 SVGA3D_DEVCAP_SURFACEFMT_YUY2, 917 0, 0, 0, 0 918 }, 919 { 920 "SVGA3D_NV12", 921 SVGA3D_NV12, 922 SVGA3D_DEVCAP_SURFACEFMT_NV12, 923 0, 0, 0, 0 924 }, 925 { 926 "SVGA3D_AYUV", 927 SVGA3D_AYUV, 928 SVGA3D_DEVCAP_SURFACEFMT_AYUV, 929 0, 0, 0, 0 930 }, 931 { 932 "SVGA3D_R32G32B32A32_TYPELESS", 933 SVGA3D_R32G32B32A32_TYPELESS, 934 SVGA3D_DEVCAP_DXFMT_R32G32B32A32_TYPELESS, 935 1, 1, 16, 0 936 }, 937 { 938 "SVGA3D_R32G32B32A32_UINT", 939 SVGA3D_R32G32B32A32_UINT, 940 SVGA3D_DEVCAP_DXFMT_R32G32B32A32_UINT, 941 1, 1, 16, 0 942 }, 943 { 944 "SVGA3D_R32G32B32A32_SINT", 945 SVGA3D_R32G32B32A32_SINT, 946 SVGA3D_DEVCAP_DXFMT_R32G32B32A32_SINT, 947 1, 1, 16, 0 948 }, 949 { 950 "SVGA3D_R32G32B32_TYPELESS", 951 SVGA3D_R32G32B32_TYPELESS, 952 SVGA3D_DEVCAP_DXFMT_R32G32B32_TYPELESS, 953 1, 1, 12, 0 954 }, 955 { 956 "SVGA3D_R32G32B32_FLOAT", 957 SVGA3D_R32G32B32_FLOAT, 958 SVGA3D_DEVCAP_DXFMT_R32G32B32_FLOAT, 959 1, 1, 12, 0 960 }, 961 { 962 "SVGA3D_R32G32B32_UINT", 963 SVGA3D_R32G32B32_UINT, 964 SVGA3D_DEVCAP_DXFMT_R32G32B32_UINT, 965 1, 1, 12, 0 966 }, 967 { 968 "SVGA3D_R32G32B32_SINT", 969 SVGA3D_R32G32B32_SINT, 970 SVGA3D_DEVCAP_DXFMT_R32G32B32_SINT, 971 1, 1, 12, 0 972 }, 973 { 974 "SVGA3D_R16G16B16A16_TYPELESS", 975 SVGA3D_R16G16B16A16_TYPELESS, 976 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_TYPELESS, 977 1, 1, 8, 0 978 }, 979 { 980 "SVGA3D_R16G16B16A16_UINT", 981 SVGA3D_R16G16B16A16_UINT, 982 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_UINT, 983 1, 1, 8, 0 984 }, 985 { 986 "SVGA3D_R16G16B16A16_SNORM", 987 SVGA3D_R16G16B16A16_SNORM, 988 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_SNORM, 989 1, 1, 8, 0 990 }, 991 { 992 "SVGA3D_R16G16B16A16_SINT", 993 SVGA3D_R16G16B16A16_SINT, 994 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_SINT, 995 1, 1, 8, 0 996 }, 997 { 998 "SVGA3D_R32G32_TYPELESS", 999 SVGA3D_R32G32_TYPELESS, 1000 SVGA3D_DEVCAP_DXFMT_R32G32_TYPELESS, 1001 1, 1, 8, 0 1002 }, 1003 { 1004 "SVGA3D_R32G32_UINT", 1005 SVGA3D_R32G32_UINT, 1006 SVGA3D_DEVCAP_DXFMT_R32G32_UINT, 1007 1, 1, 8, 0 1008 }, 1009 { 1010 "SVGA3D_R32G32_SINT", 1011 SVGA3D_R32G32_SINT, 1012 SVGA3D_DEVCAP_DXFMT_R32G32_SINT, 1013 1, 1, 8, 1014 0 1015 }, 1016 { 1017 "SVGA3D_R32G8X24_TYPELESS", 1018 SVGA3D_R32G8X24_TYPELESS, 1019 SVGA3D_DEVCAP_DXFMT_R32G8X24_TYPELESS, 1020 1, 1, 8, 0 1021 }, 1022 { 1023 /* Special case: no devcap / report sampler and depth/stencil ability 1024 */ 1025 "SVGA3D_D32_FLOAT_S8X24_UINT", 1026 SVGA3D_D32_FLOAT_S8X24_UINT, 1027 0, /*SVGA3D_DEVCAP_DXFMT_D32_FLOAT_S8X24_UINT*/ 1028 1, 1, 8, 1029 SVGA3DFORMAT_OP_TEXTURE | 1030 SVGA3DFORMAT_OP_CUBETEXTURE | 1031 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1032 SVGA3DFORMAT_OP_ZSTENCIL 1033 }, 1034 { 1035 /* Special case: no devcap / report sampler and depth/stencil ability 1036 */ 1037 "SVGA3D_R32_FLOAT_X8X24", 1038 SVGA3D_R32_FLOAT_X8X24, 1039 0, /*SVGA3D_DEVCAP_DXFMT_R32_FLOAT_X8X24_TYPELESS*/ 1040 1, 1, 8, 1041 SVGA3DFORMAT_OP_TEXTURE | 1042 SVGA3DFORMAT_OP_CUBETEXTURE | 1043 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1044 SVGA3DFORMAT_OP_ZSTENCIL 1045 }, 1046 { 1047 "SVGA3D_X32_G8X24_UINT", 1048 SVGA3D_X32_G8X24_UINT, 1049 SVGA3D_DEVCAP_DXFMT_X32_TYPELESS_G8X24_UINT, 1050 1, 1, 4, 0 1051 }, 1052 { 1053 "SVGA3D_R10G10B10A2_TYPELESS", 1054 SVGA3D_R10G10B10A2_TYPELESS, 1055 SVGA3D_DEVCAP_DXFMT_R10G10B10A2_TYPELESS, 1056 1, 1, 4, 0 1057 }, 1058 { 1059 "SVGA3D_R10G10B10A2_UINT", 1060 SVGA3D_R10G10B10A2_UINT, 1061 SVGA3D_DEVCAP_DXFMT_R10G10B10A2_UINT, 1062 1, 1, 4, 0 1063 }, 1064 { 1065 "SVGA3D_R11G11B10_FLOAT", 1066 SVGA3D_R11G11B10_FLOAT, 1067 SVGA3D_DEVCAP_DXFMT_R11G11B10_FLOAT, 1068 1, 1, 4, 0 1069 }, 1070 { 1071 "SVGA3D_R8G8B8A8_TYPELESS", 1072 SVGA3D_R8G8B8A8_TYPELESS, 1073 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_TYPELESS, 1074 1, 1, 4, 0 1075 }, 1076 { 1077 "SVGA3D_R8G8B8A8_UNORM", 1078 SVGA3D_R8G8B8A8_UNORM, 1079 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_UNORM, 1080 1, 1, 4, 0 1081 }, 1082 { 1083 "SVGA3D_R8G8B8A8_UNORM_SRGB", 1084 SVGA3D_R8G8B8A8_UNORM_SRGB, 1085 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_UNORM_SRGB, 1086 1, 1, 4, 0 1087 }, 1088 { 1089 "SVGA3D_R8G8B8A8_UINT", 1090 SVGA3D_R8G8B8A8_UINT, 1091 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_UINT, 1092 1, 1, 4, 0 1093 }, 1094 { 1095 "SVGA3D_R8G8B8A8_SINT", 1096 SVGA3D_R8G8B8A8_SINT, 1097 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_SINT, 1098 1, 1, 4, 0 1099 }, 1100 { 1101 "SVGA3D_R16G16_TYPELESS", 1102 SVGA3D_R16G16_TYPELESS, 1103 SVGA3D_DEVCAP_DXFMT_R16G16_TYPELESS, 1104 1, 1, 4, 0 1105 }, 1106 { 1107 "SVGA3D_R16G16_UINT", 1108 SVGA3D_R16G16_UINT, 1109 SVGA3D_DEVCAP_DXFMT_R16G16_UINT, 1110 1, 1, 4, 0 1111 }, 1112 { 1113 "SVGA3D_R16G16_SINT", 1114 SVGA3D_R16G16_SINT, 1115 SVGA3D_DEVCAP_DXFMT_R16G16_SINT, 1116 1, 1, 4, 0 1117 }, 1118 { 1119 "SVGA3D_R32_TYPELESS", 1120 SVGA3D_R32_TYPELESS, 1121 SVGA3D_DEVCAP_DXFMT_R32_TYPELESS, 1122 1, 1, 4, 0 1123 }, 1124 { 1125 /* Special case: no devcap / report sampler and depth/stencil ability 1126 */ 1127 "SVGA3D_D32_FLOAT", 1128 SVGA3D_D32_FLOAT, 1129 0, /*SVGA3D_DEVCAP_DXFMT_D32_FLOAT*/ 1130 1, 1, 4, 1131 SVGA3DFORMAT_OP_TEXTURE | 1132 SVGA3DFORMAT_OP_CUBETEXTURE | 1133 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1134 SVGA3DFORMAT_OP_ZSTENCIL 1135 }, 1136 { 1137 "SVGA3D_R32_UINT", 1138 SVGA3D_R32_UINT, 1139 SVGA3D_DEVCAP_DXFMT_R32_UINT, 1140 1, 1, 4, 0 1141 }, 1142 { 1143 "SVGA3D_R32_SINT", 1144 SVGA3D_R32_SINT, 1145 SVGA3D_DEVCAP_DXFMT_R32_SINT, 1146 1, 1, 4, 0 1147 }, 1148 { 1149 "SVGA3D_R24G8_TYPELESS", 1150 SVGA3D_R24G8_TYPELESS, 1151 SVGA3D_DEVCAP_DXFMT_R24G8_TYPELESS, 1152 1, 1, 4, 0 1153 }, 1154 { 1155 /* Special case: no devcap / report sampler and depth/stencil ability 1156 */ 1157 "SVGA3D_D24_UNORM_S8_UINT", 1158 SVGA3D_D24_UNORM_S8_UINT, 1159 0, /*SVGA3D_DEVCAP_DXFMT_D24_UNORM_S8_UINT*/ 1160 1, 1, 4, 1161 SVGA3DFORMAT_OP_TEXTURE | 1162 SVGA3DFORMAT_OP_CUBETEXTURE | 1163 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1164 SVGA3DFORMAT_OP_ZSTENCIL 1165 }, 1166 { 1167 /* Special case: no devcap / report sampler and depth/stencil ability 1168 */ 1169 "SVGA3D_R24_UNORM_X8", 1170 SVGA3D_R24_UNORM_X8, 1171 0, /*SVGA3D_DEVCAP_DXFMT_R24_UNORM_X8_TYPELESS*/ 1172 1, 1, 4, 1173 SVGA3DFORMAT_OP_TEXTURE | 1174 SVGA3DFORMAT_OP_CUBETEXTURE | 1175 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1176 SVGA3DFORMAT_OP_ZSTENCIL 1177 }, 1178 { 1179 "SVGA3D_X24_G8_UINT", 1180 SVGA3D_X24_G8_UINT, 1181 SVGA3D_DEVCAP_DXFMT_X24_TYPELESS_G8_UINT, 1182 1, 1, 4, 0 1183 }, 1184 { 1185 "SVGA3D_R8G8_TYPELESS", 1186 SVGA3D_R8G8_TYPELESS, 1187 SVGA3D_DEVCAP_DXFMT_R8G8_TYPELESS, 1188 1, 1, 2, 0 1189 }, 1190 { 1191 "SVGA3D_R8G8_UNORM", 1192 SVGA3D_R8G8_UNORM, 1193 SVGA3D_DEVCAP_DXFMT_R8G8_UNORM, 1194 1, 1, 2, 0 1195 }, 1196 { 1197 "SVGA3D_R8G8_UINT", 1198 SVGA3D_R8G8_UINT, 1199 SVGA3D_DEVCAP_DXFMT_R8G8_UINT, 1200 1, 1, 2, 0 1201 }, 1202 { 1203 "SVGA3D_R8G8_SINT", 1204 SVGA3D_R8G8_SINT, 1205 SVGA3D_DEVCAP_DXFMT_R8G8_SINT, 1206 1, 1, 2, 0 1207 }, 1208 { 1209 "SVGA3D_R16_TYPELESS", 1210 SVGA3D_R16_TYPELESS, 1211 SVGA3D_DEVCAP_DXFMT_R16_TYPELESS, 1212 1, 1, 2, 0 1213 }, 1214 { 1215 "SVGA3D_R16_UNORM", 1216 SVGA3D_R16_UNORM, 1217 SVGA3D_DEVCAP_DXFMT_R16_UNORM, 1218 1, 1, 2, 0 1219 }, 1220 { 1221 "SVGA3D_R16_UINT", 1222 SVGA3D_R16_UINT, 1223 SVGA3D_DEVCAP_DXFMT_R16_UINT, 1224 1, 1, 2, 0 1225 }, 1226 { 1227 "SVGA3D_R16_SNORM", 1228 SVGA3D_R16_SNORM, 1229 SVGA3D_DEVCAP_DXFMT_R16_SNORM, 1230 1, 1, 2, 0 1231 }, 1232 { 1233 "SVGA3D_R16_SINT", 1234 SVGA3D_R16_SINT, 1235 SVGA3D_DEVCAP_DXFMT_R16_SINT, 1236 1, 1, 2, 0 1237 }, 1238 { 1239 "SVGA3D_R8_TYPELESS", 1240 SVGA3D_R8_TYPELESS, 1241 SVGA3D_DEVCAP_DXFMT_R8_TYPELESS, 1242 1, 1, 1, 0 1243 }, 1244 { 1245 "SVGA3D_R8_UNORM", 1246 SVGA3D_R8_UNORM, 1247 SVGA3D_DEVCAP_DXFMT_R8_UNORM, 1248 1, 1, 1, 0 1249 }, 1250 { 1251 "SVGA3D_R8_UINT", 1252 SVGA3D_R8_UINT, 1253 SVGA3D_DEVCAP_DXFMT_R8_UINT, 1254 1, 1, 1, 0 1255 }, 1256 { 1257 "SVGA3D_R8_SNORM", 1258 SVGA3D_R8_SNORM, 1259 SVGA3D_DEVCAP_DXFMT_R8_SNORM, 1260 1, 1, 1, 0 1261 }, 1262 { 1263 "SVGA3D_R8_SINT", 1264 SVGA3D_R8_SINT, 1265 SVGA3D_DEVCAP_DXFMT_R8_SINT, 1266 1, 1, 1, 0 1267 }, 1268 { 1269 "SVGA3D_P8", 1270 SVGA3D_P8, 0, 0, 0, 0, 0 1271 }, 1272 { 1273 "SVGA3D_R9G9B9E5_SHAREDEXP", 1274 SVGA3D_R9G9B9E5_SHAREDEXP, 1275 SVGA3D_DEVCAP_DXFMT_R9G9B9E5_SHAREDEXP, 1276 1, 1, 4, 0 1277 }, 1278 { 1279 "SVGA3D_R8G8_B8G8_UNORM", 1280 SVGA3D_R8G8_B8G8_UNORM, 0, 0, 0, 0, 0 1281 }, 1282 { 1283 "SVGA3D_G8R8_G8B8_UNORM", 1284 SVGA3D_G8R8_G8B8_UNORM, 0, 0, 0, 0, 0 1285 }, 1286 { 1287 "SVGA3D_BC1_TYPELESS", 1288 SVGA3D_BC1_TYPELESS, 1289 SVGA3D_DEVCAP_DXFMT_BC1_TYPELESS, 1290 4, 4, 8, 0 1291 }, 1292 { 1293 "SVGA3D_BC1_UNORM_SRGB", 1294 SVGA3D_BC1_UNORM_SRGB, 1295 SVGA3D_DEVCAP_DXFMT_BC1_UNORM_SRGB, 1296 4, 4, 8, 0 1297 }, 1298 { 1299 "SVGA3D_BC2_TYPELESS", 1300 SVGA3D_BC2_TYPELESS, 1301 SVGA3D_DEVCAP_DXFMT_BC2_TYPELESS, 1302 4, 4, 16, 0 1303 }, 1304 { 1305 "SVGA3D_BC2_UNORM_SRGB", 1306 SVGA3D_BC2_UNORM_SRGB, 1307 SVGA3D_DEVCAP_DXFMT_BC2_UNORM_SRGB, 1308 4, 4, 16, 0 1309 }, 1310 { 1311 "SVGA3D_BC3_TYPELESS", 1312 SVGA3D_BC3_TYPELESS, 1313 SVGA3D_DEVCAP_DXFMT_BC3_TYPELESS, 1314 4, 4, 16, 0 1315 }, 1316 { 1317 "SVGA3D_BC3_UNORM_SRGB", 1318 SVGA3D_BC3_UNORM_SRGB, 1319 4, 4, 16, 0 1320 }, 1321 { 1322 "SVGA3D_BC4_TYPELESS", 1323 SVGA3D_BC4_TYPELESS, 1324 SVGA3D_DEVCAP_DXFMT_BC4_TYPELESS, 1325 4, 4, 8, 0 1326 }, 1327 { 1328 "SVGA3D_ATI1", 1329 SVGA3D_ATI1, 0, 0, 0, 0, 0 1330 }, 1331 { 1332 "SVGA3D_BC4_SNORM", 1333 SVGA3D_BC4_SNORM, 1334 SVGA3D_DEVCAP_DXFMT_BC4_SNORM, 1335 4, 4, 8, 0 1336 }, 1337 { 1338 "SVGA3D_BC5_TYPELESS", 1339 SVGA3D_BC5_TYPELESS, 1340 SVGA3D_DEVCAP_DXFMT_BC5_TYPELESS, 1341 4, 4, 16, 0 1342 }, 1343 { 1344 "SVGA3D_ATI2", 1345 SVGA3D_ATI2, 0, 0, 0, 0, 0 1346 }, 1347 { 1348 "SVGA3D_BC5_SNORM", 1349 SVGA3D_BC5_SNORM, 1350 SVGA3D_DEVCAP_DXFMT_BC5_SNORM, 1351 4, 4, 16, 0 1352 }, 1353 { 1354 "SVGA3D_R10G10B10_XR_BIAS_A2_UNORM", 1355 SVGA3D_R10G10B10_XR_BIAS_A2_UNORM, 0, 0, 0, 0, 0 1356 }, 1357 { 1358 "SVGA3D_B8G8R8A8_TYPELESS", 1359 SVGA3D_B8G8R8A8_TYPELESS, 1360 SVGA3D_DEVCAP_DXFMT_B8G8R8A8_TYPELESS, 1361 1, 1, 4, 0 1362 }, 1363 { 1364 "SVGA3D_B8G8R8A8_UNORM_SRGB", 1365 SVGA3D_B8G8R8A8_UNORM_SRGB, 1366 SVGA3D_DEVCAP_DXFMT_B8G8R8A8_UNORM_SRGB, 1367 1, 1, 4, 0 1368 }, 1369 { 1370 "SVGA3D_B8G8R8X8_TYPELESS", 1371 SVGA3D_B8G8R8X8_TYPELESS, 1372 SVGA3D_DEVCAP_DXFMT_B8G8R8X8_TYPELESS, 1373 1, 1, 4, 0 1374 }, 1375 { 1376 "SVGA3D_B8G8R8X8_UNORM_SRGB", 1377 SVGA3D_B8G8R8X8_UNORM_SRGB, 1378 SVGA3D_DEVCAP_DXFMT_B8G8R8X8_UNORM_SRGB, 1379 1, 1, 4, 0 1380 }, 1381 { 1382 "SVGA3D_Z_DF16", 1383 SVGA3D_Z_DF16, 1384 SVGA3D_DEVCAP_SURFACEFMT_Z_DF16, 1385 1, 1, 2, 0 1386 }, 1387 { 1388 "SVGA3D_Z_DF24", 1389 SVGA3D_Z_DF24, 1390 SVGA3D_DEVCAP_SURFACEFMT_Z_DF24, 1391 1, 1, 4, 0 1392 }, 1393 { 1394 "SVGA3D_Z_D24S8_INT", 1395 SVGA3D_Z_D24S8_INT, 1396 SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT, 1397 1, 1, 4, 0 1398 }, 1399 { 1400 "SVGA3D_YV12", 1401 SVGA3D_YV12, 0, 0, 0, 0, 0 1402 }, 1403 { 1404 "SVGA3D_R32G32B32A32_FLOAT", 1405 SVGA3D_R32G32B32A32_FLOAT, 1406 SVGA3D_DEVCAP_DXFMT_R32G32B32A32_FLOAT, 1407 1, 1, 16, 0 1408 }, 1409 { 1410 "SVGA3D_R16G16B16A16_FLOAT", 1411 SVGA3D_R16G16B16A16_FLOAT, 1412 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_FLOAT, 1413 1, 1, 8, 0 1414 }, 1415 { 1416 "SVGA3D_R16G16B16A16_UNORM", 1417 SVGA3D_R16G16B16A16_UNORM, 1418 SVGA3D_DEVCAP_DXFMT_R16G16B16A16_UNORM, 1419 1, 1, 8, 0 1420 }, 1421 { 1422 "SVGA3D_R32G32_FLOAT", 1423 SVGA3D_R32G32_FLOAT, 1424 SVGA3D_DEVCAP_DXFMT_R32G32_FLOAT, 1425 1, 1, 8, 0 1426 }, 1427 { 1428 "SVGA3D_R10G10B10A2_UNORM", 1429 SVGA3D_R10G10B10A2_UNORM, 1430 SVGA3D_DEVCAP_DXFMT_R10G10B10A2_UNORM, 1431 1, 1, 4, 0 1432 }, 1433 { 1434 "SVGA3D_R8G8B8A8_SNORM", 1435 SVGA3D_R8G8B8A8_SNORM, 1436 SVGA3D_DEVCAP_DXFMT_R8G8B8A8_SNORM, 1437 1, 1, 4, 0 1438 }, 1439 { 1440 "SVGA3D_R16G16_FLOAT", 1441 SVGA3D_R16G16_FLOAT, 1442 SVGA3D_DEVCAP_DXFMT_R16G16_FLOAT, 1443 1, 1, 4, 0 1444 }, 1445 { 1446 "SVGA3D_R16G16_UNORM", 1447 SVGA3D_R16G16_UNORM, 1448 SVGA3D_DEVCAP_DXFMT_R16G16_UNORM, 1449 1, 1, 4, 0 1450 }, 1451 { 1452 "SVGA3D_R16G16_SNORM", 1453 SVGA3D_R16G16_SNORM, 1454 SVGA3D_DEVCAP_DXFMT_R16G16_SNORM, 1455 1, 1, 4, 0 1456 }, 1457 { 1458 "SVGA3D_R32_FLOAT", 1459 SVGA3D_R32_FLOAT, 1460 SVGA3D_DEVCAP_DXFMT_R32_FLOAT, 1461 1, 1, 4, 0 1462 }, 1463 { 1464 "SVGA3D_R8G8_SNORM", 1465 SVGA3D_R8G8_SNORM, 1466 SVGA3D_DEVCAP_DXFMT_R8G8_SNORM, 1467 1, 1, 2, 0 1468 }, 1469 { 1470 "SVGA3D_R16_FLOAT", 1471 SVGA3D_R16_FLOAT, 1472 SVGA3D_DEVCAP_DXFMT_R16_FLOAT, 1473 1, 1, 2, 0 1474 }, 1475 { 1476 "SVGA3D_D16_UNORM", 1477 SVGA3D_D16_UNORM, 1478 0, /*SVGA3D_DEVCAP_DXFMT_D16_UNORM*/ 1479 1, 1, 2, 1480 SVGA3DFORMAT_OP_TEXTURE | 1481 SVGA3DFORMAT_OP_CUBETEXTURE | 1482 SVGA3DFORMAT_OP_VOLUMETEXTURE | 1483 SVGA3DFORMAT_OP_ZSTENCIL 1484 }, 1485 { 1486 "SVGA3D_A8_UNORM", 1487 SVGA3D_A8_UNORM, 1488 SVGA3D_DEVCAP_DXFMT_A8_UNORM, 1489 1, 1, 1, 0 1490 }, 1491 { 1492 "SVGA3D_BC1_UNORM", 1493 SVGA3D_BC1_UNORM, 1494 SVGA3D_DEVCAP_DXFMT_BC1_UNORM, 1495 4, 4, 8, 0 1496 }, 1497 { 1498 "SVGA3D_BC2_UNORM", 1499 SVGA3D_BC2_UNORM, 1500 SVGA3D_DEVCAP_DXFMT_BC2_UNORM, 1501 4, 4, 16, 0 1502 }, 1503 { 1504 "SVGA3D_BC3_UNORM", 1505 SVGA3D_BC3_UNORM, 1506 SVGA3D_DEVCAP_DXFMT_BC3_UNORM, 1507 4, 4, 16, 0 1508 }, 1509 { 1510 "SVGA3D_B5G6R5_UNORM", 1511 SVGA3D_B5G6R5_UNORM, 1512 SVGA3D_DEVCAP_DXFMT_B5G6R5_UNORM, 1513 1, 1, 2, 0 1514 }, 1515 { 1516 "SVGA3D_B5G5R5A1_UNORM", 1517 SVGA3D_B5G5R5A1_UNORM, 1518 SVGA3D_DEVCAP_DXFMT_B5G5R5A1_UNORM, 1519 1, 1, 2, 0 1520 }, 1521 { 1522 "SVGA3D_B8G8R8A8_UNORM", 1523 SVGA3D_B8G8R8A8_UNORM, 1524 SVGA3D_DEVCAP_DXFMT_B8G8R8A8_UNORM, 1525 1, 1, 4, 0 1526 }, 1527 { 1528 "SVGA3D_B8G8R8X8_UNORM", 1529 SVGA3D_B8G8R8X8_UNORM, 1530 SVGA3D_DEVCAP_DXFMT_B8G8R8X8_UNORM, 1531 1, 1, 4, 0 1532 }, 1533 { 1534 "SVGA3D_BC4_UNORM", 1535 SVGA3D_BC4_UNORM, 1536 SVGA3D_DEVCAP_DXFMT_BC4_UNORM, 1537 4, 4, 8, 0 1538 }, 1539 { 1540 "SVGA3D_BC5_UNORM", 1541 SVGA3D_BC5_UNORM, 1542 SVGA3D_DEVCAP_DXFMT_BC5_UNORM, 1543 4, 4, 16, 0 1544 } 1545 }; 1546 1547 static const SVGA3dSurfaceFormat compat_x8r8g8b8[] = { 1548 SVGA3D_X8R8G8B8, SVGA3D_A8R8G8B8, SVGA3D_B8G8R8X8_UNORM, 1549 SVGA3D_B8G8R8A8_UNORM, 0 1550 }; 1551 static const SVGA3dSurfaceFormat compat_r8[] = { 1552 SVGA3D_R8_UNORM, SVGA3D_NV12, SVGA3D_YV12, 0 1553 }; 1554 static const SVGA3dSurfaceFormat compat_g8r8[] = { 1555 SVGA3D_R8G8_UNORM, SVGA3D_NV12, 0 1556 }; 1557 static const SVGA3dSurfaceFormat compat_r5g6b5[] = { 1558 SVGA3D_R5G6B5, SVGA3D_B5G6R5_UNORM, 0 1559 }; 1560 1561 static const struct format_compat_entry format_compats[] = { 1562 {PIPE_FORMAT_B8G8R8X8_UNORM, compat_x8r8g8b8}, 1563 {PIPE_FORMAT_B8G8R8A8_UNORM, compat_x8r8g8b8}, 1564 {PIPE_FORMAT_R8_UNORM, compat_r8}, 1565 {PIPE_FORMAT_R8G8_UNORM, compat_g8r8}, 1566 {PIPE_FORMAT_B5G6R5_UNORM, compat_r5g6b5} 1567 }; 1568 1569 /** 1570 * Debug only: 1571 * 1. check that format_cap_table[i] matches the i-th SVGA3D format. 1572 * 2. check that format_conversion_table[i].pformat == i. 1573 */ 1574 static void 1575 check_format_tables(void) 1576 { 1577 static boolean first_call = TRUE; 1578 1579 if (first_call) { 1580 unsigned i; 1581 1582 STATIC_ASSERT(ARRAY_SIZE(format_cap_table) == SVGA3D_FORMAT_MAX); 1583 for (i = 0; i < ARRAY_SIZE(format_cap_table); i++) { 1584 assert(format_cap_table[i].format == i); 1585 } 1586 1587 STATIC_ASSERT(ARRAY_SIZE(format_conversion_table) == PIPE_FORMAT_COUNT); 1588 for (i = 0; i < ARRAY_SIZE(format_conversion_table); i++) { 1589 assert(format_conversion_table[i].pformat == i); 1590 } 1591 1592 first_call = FALSE; 1593 } 1594 } 1595 1596 1597 /* 1598 * Get format capabilities from the host. It takes in consideration 1599 * deprecated/unsupported formats, and formats which are implicitely assumed to 1600 * be supported when the host does not provide an explicit capability entry. 1601 */ 1602 void 1603 svga_get_format_cap(struct svga_screen *ss, 1604 SVGA3dSurfaceFormat format, 1605 SVGA3dSurfaceFormatCaps *caps) 1606 { 1607 struct svga_winsys_screen *sws = ss->sws; 1608 SVGA3dDevCapResult result; 1609 const struct format_cap *entry; 1610 1611 #ifdef DEBUG 1612 check_format_tables(); 1613 #else 1614 (void) check_format_tables; 1615 #endif 1616 1617 assert(format < ARRAY_SIZE(format_cap_table)); 1618 entry = &format_cap_table[format]; 1619 assert(entry->format == format); 1620 1621 if (entry->devcap && sws->get_cap(sws, entry->devcap, &result)) { 1622 assert(format < SVGA3D_UYVY || entry->defaultOperations == 0); 1623 1624 /* Explicitly advertised format */ 1625 if (entry->devcap > SVGA3D_DEVCAP_DX) { 1626 /* Translate DX/VGPU10 format cap to VGPU9 cap */ 1627 caps->value = 0; 1628 if (result.u & SVGA3D_DXFMT_COLOR_RENDERTARGET) 1629 caps->value |= SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET; 1630 if (!(result.u & SVGA3D_DXFMT_BLENDABLE)) 1631 caps->value |= SVGA3DFORMAT_OP_NOALPHABLEND; 1632 if (result.u & SVGA3D_DXFMT_DEPTH_RENDERTARGET) 1633 caps->value |= SVGA3DFORMAT_OP_ZSTENCIL; 1634 if (result.u & SVGA3D_DXFMT_SHADER_SAMPLE) 1635 caps->value |= (SVGA3DFORMAT_OP_TEXTURE | 1636 SVGA3DFORMAT_OP_CUBETEXTURE); 1637 if (result.u & SVGA3D_DXFMT_VOLUME) 1638 caps->value |= SVGA3DFORMAT_OP_VOLUMETEXTURE; 1639 } 1640 else { 1641 /* Return VGPU9 format cap as-is */ 1642 caps->value = result.u; 1643 } 1644 1645 } else { 1646 /* Implicitly advertised format -- use default caps */ 1647 caps->value = entry->defaultOperations; 1648 } 1649 } 1650 1651 1652 void 1653 svga_format_size(SVGA3dSurfaceFormat format, 1654 unsigned *block_width, 1655 unsigned *block_height, 1656 unsigned *bytes_per_block) 1657 { 1658 assert(format < ARRAY_SIZE(format_cap_table)); 1659 *block_width = format_cap_table[format].block_width; 1660 *block_height = format_cap_table[format].block_height; 1661 *bytes_per_block = format_cap_table[format].block_bytes; 1662 /* Make sure the table entry was valid */ 1663 if (*block_width == 0) 1664 debug_printf("Bad table entry for %s\n", svga_format_name(format)); 1665 assert(*block_width); 1666 assert(*block_height); 1667 assert(*bytes_per_block); 1668 } 1669 1670 1671 const char * 1672 svga_format_name(SVGA3dSurfaceFormat format) 1673 { 1674 assert(format < ARRAY_SIZE(format_cap_table)); 1675 return format_cap_table[format].name; 1676 } 1677 1678 1679 /** 1680 * Is the given SVGA3dSurfaceFormat a signed or unsigned integer color format? 1681 */ 1682 boolean 1683 svga_format_is_integer(SVGA3dSurfaceFormat format) 1684 { 1685 switch (format) { 1686 case SVGA3D_R32G32B32A32_SINT: 1687 case SVGA3D_R32G32B32_SINT: 1688 case SVGA3D_R32G32_SINT: 1689 case SVGA3D_R32_SINT: 1690 case SVGA3D_R16G16B16A16_SINT: 1691 case SVGA3D_R16G16_SINT: 1692 case SVGA3D_R16_SINT: 1693 case SVGA3D_R8G8B8A8_SINT: 1694 case SVGA3D_R8G8_SINT: 1695 case SVGA3D_R8_SINT: 1696 case SVGA3D_R32G32B32A32_UINT: 1697 case SVGA3D_R32G32B32_UINT: 1698 case SVGA3D_R32G32_UINT: 1699 case SVGA3D_R32_UINT: 1700 case SVGA3D_R16G16B16A16_UINT: 1701 case SVGA3D_R16G16_UINT: 1702 case SVGA3D_R16_UINT: 1703 case SVGA3D_R8G8B8A8_UINT: 1704 case SVGA3D_R8G8_UINT: 1705 case SVGA3D_R8_UINT: 1706 case SVGA3D_R10G10B10A2_UINT: 1707 return TRUE; 1708 default: 1709 return FALSE; 1710 } 1711 } 1712 1713 boolean 1714 svga_format_support_gen_mips(enum pipe_format format) 1715 { 1716 assert(format < ARRAY_SIZE(format_conversion_table)); 1717 return ((format_conversion_table[format].flags & TF_GEN_MIPS) > 0); 1718 } 1719 1720 1721 /** 1722 * Given a texture format, return the expected data type returned from 1723 * the texture sampler. For example, UNORM8 formats return floating point 1724 * values while SINT formats returned signed integer values. 1725 * Note: this function could be moved into the gallum u_format.[ch] code 1726 * if it's useful to anyone else. 1727 */ 1728 enum tgsi_return_type 1729 svga_get_texture_datatype(enum pipe_format format) 1730 { 1731 const struct util_format_description *desc = util_format_description(format); 1732 enum tgsi_return_type t; 1733 1734 if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ) { 1735 if (util_format_is_depth_or_stencil(format)) { 1736 t = TGSI_RETURN_TYPE_FLOAT; /* XXX revisit this */ 1737 } 1738 else if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) { 1739 t = TGSI_RETURN_TYPE_FLOAT; 1740 } 1741 else if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED) { 1742 t = desc->channel[0].normalized ? TGSI_RETURN_TYPE_UNORM : TGSI_RETURN_TYPE_UINT; 1743 } 1744 else if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) { 1745 t = desc->channel[0].normalized ? TGSI_RETURN_TYPE_SNORM : TGSI_RETURN_TYPE_SINT; 1746 } 1747 else { 1748 assert(!"Unexpected channel type in svga_get_texture_datatype()"); 1749 t = TGSI_RETURN_TYPE_FLOAT; 1750 } 1751 } 1752 else { 1753 /* compressed format, shared exponent format, etc. */ 1754 switch (format) { 1755 case PIPE_FORMAT_DXT1_RGB: 1756 case PIPE_FORMAT_DXT1_RGBA: 1757 case PIPE_FORMAT_DXT3_RGBA: 1758 case PIPE_FORMAT_DXT5_RGBA: 1759 case PIPE_FORMAT_DXT1_SRGB: 1760 case PIPE_FORMAT_DXT1_SRGBA: 1761 case PIPE_FORMAT_DXT3_SRGBA: 1762 case PIPE_FORMAT_DXT5_SRGBA: 1763 case PIPE_FORMAT_RGTC1_UNORM: 1764 case PIPE_FORMAT_RGTC2_UNORM: 1765 case PIPE_FORMAT_LATC1_UNORM: 1766 case PIPE_FORMAT_LATC2_UNORM: 1767 case PIPE_FORMAT_ETC1_RGB8: 1768 t = TGSI_RETURN_TYPE_UNORM; 1769 break; 1770 case PIPE_FORMAT_RGTC1_SNORM: 1771 case PIPE_FORMAT_RGTC2_SNORM: 1772 case PIPE_FORMAT_LATC1_SNORM: 1773 case PIPE_FORMAT_LATC2_SNORM: 1774 case PIPE_FORMAT_R10G10B10X2_SNORM: 1775 t = TGSI_RETURN_TYPE_SNORM; 1776 break; 1777 case PIPE_FORMAT_R11G11B10_FLOAT: 1778 case PIPE_FORMAT_R9G9B9E5_FLOAT: 1779 t = TGSI_RETURN_TYPE_FLOAT; 1780 break; 1781 default: 1782 assert(!"Unexpected channel type in svga_get_texture_datatype()"); 1783 t = TGSI_RETURN_TYPE_FLOAT; 1784 } 1785 } 1786 1787 return t; 1788 } 1789 1790 1791 /** 1792 * Given an svga context, return true iff there are currently any integer color 1793 * buffers attached to the framebuffer. 1794 */ 1795 boolean 1796 svga_has_any_integer_cbufs(const struct svga_context *svga) 1797 { 1798 unsigned i; 1799 for (i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) { 1800 struct pipe_surface *cbuf = svga->curr.framebuffer.cbufs[i]; 1801 1802 if (cbuf && util_format_is_pure_integer(cbuf->format)) { 1803 return TRUE; 1804 } 1805 } 1806 return FALSE; 1807 } 1808 1809 1810 /** 1811 * Given an SVGA format, return the corresponding typeless format. 1812 * If there is no typeless format, return the format unchanged. 1813 */ 1814 SVGA3dSurfaceFormat 1815 svga_typeless_format(SVGA3dSurfaceFormat format) 1816 { 1817 switch (format) { 1818 case SVGA3D_R32G32B32A32_UINT: 1819 case SVGA3D_R32G32B32A32_SINT: 1820 case SVGA3D_R32G32B32A32_FLOAT: 1821 return SVGA3D_R32G32B32A32_TYPELESS; 1822 case SVGA3D_R32G32B32_FLOAT: 1823 case SVGA3D_R32G32B32_UINT: 1824 case SVGA3D_R32G32B32_SINT: 1825 return SVGA3D_R32G32B32_TYPELESS; 1826 case SVGA3D_R16G16B16A16_UINT: 1827 case SVGA3D_R16G16B16A16_UNORM: 1828 case SVGA3D_R16G16B16A16_SNORM: 1829 case SVGA3D_R16G16B16A16_SINT: 1830 case SVGA3D_R16G16B16A16_FLOAT: 1831 return SVGA3D_R16G16B16A16_TYPELESS; 1832 case SVGA3D_R32G32_UINT: 1833 case SVGA3D_R32G32_SINT: 1834 case SVGA3D_R32G32_FLOAT: 1835 return SVGA3D_R32G32_TYPELESS; 1836 case SVGA3D_D32_FLOAT_S8X24_UINT: 1837 case SVGA3D_X32_G8X24_UINT: 1838 case SVGA3D_R32G8X24_TYPELESS: 1839 return SVGA3D_R32G8X24_TYPELESS; 1840 case SVGA3D_R10G10B10A2_UINT: 1841 case SVGA3D_R10G10B10A2_UNORM: 1842 return SVGA3D_R10G10B10A2_TYPELESS; 1843 case SVGA3D_R8G8B8A8_UNORM: 1844 case SVGA3D_R8G8B8A8_SNORM: 1845 case SVGA3D_R8G8B8A8_UNORM_SRGB: 1846 case SVGA3D_R8G8B8A8_UINT: 1847 case SVGA3D_R8G8B8A8_SINT: 1848 case SVGA3D_R8G8B8A8_TYPELESS: 1849 return SVGA3D_R8G8B8A8_TYPELESS; 1850 case SVGA3D_R16G16_UINT: 1851 case SVGA3D_R16G16_SINT: 1852 case SVGA3D_R16G16_UNORM: 1853 case SVGA3D_R16G16_SNORM: 1854 case SVGA3D_R16G16_FLOAT: 1855 return SVGA3D_R16G16_TYPELESS; 1856 case SVGA3D_D32_FLOAT: 1857 case SVGA3D_R32_FLOAT: 1858 case SVGA3D_R32_UINT: 1859 case SVGA3D_R32_SINT: 1860 case SVGA3D_R32_TYPELESS: 1861 return SVGA3D_R32_TYPELESS; 1862 case SVGA3D_D24_UNORM_S8_UINT: 1863 case SVGA3D_R24G8_TYPELESS: 1864 return SVGA3D_R24G8_TYPELESS; 1865 case SVGA3D_X24_G8_UINT: 1866 return SVGA3D_R24_UNORM_X8; 1867 case SVGA3D_R8G8_UNORM: 1868 case SVGA3D_R8G8_SNORM: 1869 case SVGA3D_R8G8_UINT: 1870 case SVGA3D_R8G8_SINT: 1871 return SVGA3D_R8G8_TYPELESS; 1872 case SVGA3D_D16_UNORM: 1873 case SVGA3D_R16_UNORM: 1874 case SVGA3D_R16_UINT: 1875 case SVGA3D_R16_SNORM: 1876 case SVGA3D_R16_SINT: 1877 case SVGA3D_R16_FLOAT: 1878 case SVGA3D_R16_TYPELESS: 1879 return SVGA3D_R16_TYPELESS; 1880 case SVGA3D_R8_UNORM: 1881 case SVGA3D_R8_UINT: 1882 case SVGA3D_R8_SNORM: 1883 case SVGA3D_R8_SINT: 1884 return SVGA3D_R8_TYPELESS; 1885 case SVGA3D_B8G8R8A8_UNORM_SRGB: 1886 case SVGA3D_B8G8R8A8_UNORM: 1887 case SVGA3D_B8G8R8A8_TYPELESS: 1888 return SVGA3D_B8G8R8A8_TYPELESS; 1889 case SVGA3D_B8G8R8X8_UNORM_SRGB: 1890 case SVGA3D_B8G8R8X8_UNORM: 1891 case SVGA3D_B8G8R8X8_TYPELESS: 1892 return SVGA3D_B8G8R8X8_TYPELESS; 1893 case SVGA3D_BC1_UNORM: 1894 case SVGA3D_BC1_UNORM_SRGB: 1895 case SVGA3D_BC1_TYPELESS: 1896 return SVGA3D_BC1_TYPELESS; 1897 case SVGA3D_BC2_UNORM: 1898 case SVGA3D_BC2_UNORM_SRGB: 1899 case SVGA3D_BC2_TYPELESS: 1900 return SVGA3D_BC2_TYPELESS; 1901 case SVGA3D_BC3_UNORM: 1902 case SVGA3D_BC3_UNORM_SRGB: 1903 case SVGA3D_BC3_TYPELESS: 1904 return SVGA3D_BC3_TYPELESS; 1905 case SVGA3D_BC4_UNORM: 1906 case SVGA3D_BC4_SNORM: 1907 return SVGA3D_BC4_TYPELESS; 1908 case SVGA3D_BC5_UNORM: 1909 case SVGA3D_BC5_SNORM: 1910 return SVGA3D_BC5_TYPELESS; 1911 1912 /* Special cases (no corresponding _TYPELESS formats) */ 1913 case SVGA3D_A8_UNORM: 1914 case SVGA3D_B5G5R5A1_UNORM: 1915 case SVGA3D_B5G6R5_UNORM: 1916 case SVGA3D_R11G11B10_FLOAT: 1917 case SVGA3D_R9G9B9E5_SHAREDEXP: 1918 return format; 1919 default: 1920 debug_printf("Unexpected format %s in %s\n", 1921 svga_format_name(format), __FUNCTION__); 1922 return format; 1923 } 1924 } 1925 1926 1927 /** 1928 * Given a surface format, return the corresponding format to use for 1929 * a texture sampler. In most cases, it's the format unchanged, but there 1930 * are some special cases. 1931 */ 1932 SVGA3dSurfaceFormat 1933 svga_sampler_format(SVGA3dSurfaceFormat format) 1934 { 1935 switch (format) { 1936 case SVGA3D_D16_UNORM: 1937 return SVGA3D_R16_UNORM; 1938 case SVGA3D_D24_UNORM_S8_UINT: 1939 return SVGA3D_R24_UNORM_X8; 1940 case SVGA3D_D32_FLOAT: 1941 return SVGA3D_R32_FLOAT; 1942 case SVGA3D_D32_FLOAT_S8X24_UINT: 1943 return SVGA3D_R32_FLOAT_X8X24; 1944 default: 1945 return format; 1946 } 1947 } 1948 1949 1950 /** 1951 * Is the given format an uncompressed snorm format? 1952 */ 1953 bool 1954 svga_format_is_uncompressed_snorm(SVGA3dSurfaceFormat format) 1955 { 1956 switch (format) { 1957 case SVGA3D_R8G8B8A8_SNORM: 1958 case SVGA3D_R8G8_SNORM: 1959 case SVGA3D_R8_SNORM: 1960 case SVGA3D_R16G16B16A16_SNORM: 1961 case SVGA3D_R16G16_SNORM: 1962 case SVGA3D_R16_SNORM: 1963 return true; 1964 default: 1965 return false; 1966 } 1967 } 1968 1969 1970 bool 1971 svga_format_is_typeless(SVGA3dSurfaceFormat format) 1972 { 1973 switch (format) { 1974 case SVGA3D_R32G32B32A32_TYPELESS: 1975 case SVGA3D_R32G32B32_TYPELESS: 1976 case SVGA3D_R16G16B16A16_TYPELESS: 1977 case SVGA3D_R32G32_TYPELESS: 1978 case SVGA3D_R32G8X24_TYPELESS: 1979 case SVGA3D_R10G10B10A2_TYPELESS: 1980 case SVGA3D_R8G8B8A8_TYPELESS: 1981 case SVGA3D_R16G16_TYPELESS: 1982 case SVGA3D_R32_TYPELESS: 1983 case SVGA3D_R24G8_TYPELESS: 1984 case SVGA3D_R8G8_TYPELESS: 1985 case SVGA3D_R16_TYPELESS: 1986 case SVGA3D_R8_TYPELESS: 1987 case SVGA3D_BC1_TYPELESS: 1988 case SVGA3D_BC2_TYPELESS: 1989 case SVGA3D_BC3_TYPELESS: 1990 case SVGA3D_BC4_TYPELESS: 1991 case SVGA3D_BC5_TYPELESS: 1992 case SVGA3D_B8G8R8A8_TYPELESS: 1993 case SVGA3D_B8G8R8X8_TYPELESS: 1994 return true; 1995 default: 1996 return false; 1997 } 1998 } 1999 2000 2001 /** 2002 * \brief Can we import a surface with a given SVGA3D format as a texture? 2003 * 2004 * \param ss[in] pointer to the svga screen. 2005 * \param pformat[in] pipe format of the local texture. 2006 * \param sformat[in] svga3d format of the imported surface. 2007 * \param bind[in] bind flags of the imported texture. 2008 * \param verbose[in] Print out incompatibilities in debug mode. 2009 */ 2010 bool 2011 svga_format_is_shareable(const struct svga_screen *ss, 2012 enum pipe_format pformat, 2013 SVGA3dSurfaceFormat sformat, 2014 unsigned bind, 2015 bool verbose) 2016 { 2017 SVGA3dSurfaceFormat default_format = 2018 svga_translate_format(ss, pformat, bind); 2019 int i; 2020 2021 if (default_format == SVGA3D_FORMAT_INVALID) 2022 return false; 2023 if (default_format == sformat) 2024 return true; 2025 2026 for (i = 0; i < ARRAY_SIZE(format_compats); ++i) { 2027 if (format_compats[i].pformat == pformat) { 2028 const SVGA3dSurfaceFormat *compat_format = 2029 format_compats[i].compat_format; 2030 while (*compat_format != 0) { 2031 if (*compat_format == sformat) 2032 return true; 2033 compat_format++; 2034 } 2035 } 2036 } 2037 2038 if (verbose) { 2039 debug_printf("Incompatible imported surface format.\n"); 2040 debug_printf("Texture format: \"%s\". Imported format: \"%s\".\n", 2041 svga_format_name(default_format), 2042 svga_format_name(sformat)); 2043 } 2044 2045 return false; 2046 } 2047 2048 2049 /** 2050 * Return the sRGB format which corresponds to the given (linear) format. 2051 * If there's no such sRGB format, return the format as-is. 2052 */ 2053 SVGA3dSurfaceFormat 2054 svga_linear_to_srgb(SVGA3dSurfaceFormat format) 2055 { 2056 switch (format) { 2057 case SVGA3D_R8G8B8A8_UNORM: 2058 return SVGA3D_R8G8B8A8_UNORM_SRGB; 2059 case SVGA3D_BC1_UNORM: 2060 return SVGA3D_BC1_UNORM_SRGB; 2061 case SVGA3D_BC2_UNORM: 2062 return SVGA3D_BC2_UNORM_SRGB; 2063 case SVGA3D_BC3_UNORM: 2064 return SVGA3D_BC3_UNORM_SRGB; 2065 case SVGA3D_B8G8R8A8_UNORM: 2066 return SVGA3D_B8G8R8A8_UNORM_SRGB; 2067 case SVGA3D_B8G8R8X8_UNORM: 2068 return SVGA3D_B8G8R8X8_UNORM_SRGB; 2069 default: 2070 return format; 2071 } 2072 } 2073 2074 2075 /** 2076 * Implement pipe_screen::is_format_supported(). 2077 * \param bindings bitmask of PIPE_BIND_x flags 2078 */ 2079 boolean 2080 svga_is_format_supported(struct pipe_screen *screen, 2081 enum pipe_format format, 2082 enum pipe_texture_target target, 2083 unsigned sample_count, 2084 unsigned bindings) 2085 { 2086 struct svga_screen *ss = svga_screen(screen); 2087 SVGA3dSurfaceFormat svga_format; 2088 SVGA3dSurfaceFormatCaps caps; 2089 SVGA3dSurfaceFormatCaps mask; 2090 2091 assert(bindings); 2092 2093 if (sample_count > 1) { 2094 /* In ms_samples, if bit N is set it means that we support 2095 * multisample with N+1 samples per pixel. 2096 */ 2097 if ((ss->ms_samples & (1 << (sample_count - 1))) == 0) { 2098 return FALSE; 2099 } 2100 } 2101 2102 svga_format = svga_translate_format(ss, format, bindings); 2103 if (svga_format == SVGA3D_FORMAT_INVALID) { 2104 return FALSE; 2105 } 2106 2107 if (!ss->sws->have_vgpu10 && 2108 util_format_is_srgb(format) && 2109 (bindings & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_RENDER_TARGET))) { 2110 /* We only support sRGB rendering with vgpu10 */ 2111 return FALSE; 2112 } 2113 2114 /* 2115 * For VGPU10 vertex formats, skip querying host capabilities 2116 */ 2117 2118 if (ss->sws->have_vgpu10 && (bindings & PIPE_BIND_VERTEX_BUFFER)) { 2119 SVGA3dSurfaceFormat svga_format; 2120 unsigned flags; 2121 svga_translate_vertex_format_vgpu10(format, &svga_format, &flags); 2122 return svga_format != SVGA3D_FORMAT_INVALID; 2123 } 2124 2125 /* 2126 * Override host capabilities, so that we end up with the same 2127 * visuals for all virtual hardware implementations. 2128 */ 2129 if (bindings & PIPE_BIND_DISPLAY_TARGET) { 2130 switch (svga_format) { 2131 case SVGA3D_A8R8G8B8: 2132 case SVGA3D_X8R8G8B8: 2133 case SVGA3D_R5G6B5: 2134 break; 2135 2136 /* VGPU10 formats */ 2137 case SVGA3D_B8G8R8A8_UNORM: 2138 case SVGA3D_B8G8R8X8_UNORM: 2139 case SVGA3D_B5G6R5_UNORM: 2140 case SVGA3D_B8G8R8X8_UNORM_SRGB: 2141 case SVGA3D_B8G8R8A8_UNORM_SRGB: 2142 case SVGA3D_R8G8B8A8_UNORM_SRGB: 2143 break; 2144 2145 /* Often unsupported/problematic. This means we end up with the same 2146 * visuals for all virtual hardware implementations. 2147 */ 2148 case SVGA3D_A4R4G4B4: 2149 case SVGA3D_A1R5G5B5: 2150 return FALSE; 2151 2152 default: 2153 return FALSE; 2154 } 2155 } 2156 2157 /* 2158 * Query the host capabilities. 2159 */ 2160 svga_get_format_cap(ss, svga_format, &caps); 2161 2162 if (bindings & PIPE_BIND_RENDER_TARGET) { 2163 /* Check that the color surface is blendable, unless it's an 2164 * integer format. 2165 */ 2166 if (!svga_format_is_integer(svga_format) && 2167 (caps.value & SVGA3DFORMAT_OP_NOALPHABLEND)) { 2168 return FALSE; 2169 } 2170 } 2171 2172 mask.value = 0; 2173 if (bindings & PIPE_BIND_RENDER_TARGET) { 2174 mask.value |= SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET; 2175 } 2176 if (bindings & PIPE_BIND_DEPTH_STENCIL) { 2177 mask.value |= SVGA3DFORMAT_OP_ZSTENCIL; 2178 } 2179 if (bindings & PIPE_BIND_SAMPLER_VIEW) { 2180 mask.value |= SVGA3DFORMAT_OP_TEXTURE; 2181 } 2182 2183 if (target == PIPE_TEXTURE_CUBE) { 2184 mask.value |= SVGA3DFORMAT_OP_CUBETEXTURE; 2185 } 2186 else if (target == PIPE_TEXTURE_3D) { 2187 mask.value |= SVGA3DFORMAT_OP_VOLUMETEXTURE; 2188 } 2189 2190 return (caps.value & mask.value) == mask.value; 2191 } 2192