1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 /************************************************************************** 3 * 4 * Copyright 2008-2015 VMware, Inc., Palo Alto, CA., USA 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 24 * USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 /* 29 * svga3d_surfacedefs.h -- 30 * 31 * Surface definitions and inlineable utilities for SVGA3d. 32 */ 33 34 #ifndef _SVGA3D_SURFACEDEFS_H_ 35 #define _SVGA3D_SURFACEDEFS_H_ 36 37 #define INCLUDE_ALLOW_USERLEVEL 38 #define INCLUDE_ALLOW_MODULE 39 #include "includeCheck.h" 40 41 #include <linux/kernel.h> 42 #include <drm/vmwgfx_drm.h> 43 44 #include "svga3d_reg.h" 45 46 #define surf_size_struct struct drm_vmw_size 47 48 /* 49 * enum svga3d_block_desc - describes generic properties about formats. 50 */ 51 enum svga3d_block_desc { 52 /* Nothing special can be said about this format. */ 53 SVGA3DBLOCKDESC_NONE = 0, 54 55 /* Format contains Blue/U data */ 56 SVGA3DBLOCKDESC_BLUE = 1 << 0, 57 SVGA3DBLOCKDESC_W = 1 << 0, 58 SVGA3DBLOCKDESC_BUMP_L = 1 << 0, 59 60 /* Format contains Green/V data */ 61 SVGA3DBLOCKDESC_GREEN = 1 << 1, 62 SVGA3DBLOCKDESC_V = 1 << 1, 63 64 /* Format contains Red/W/Luminance data */ 65 SVGA3DBLOCKDESC_RED = 1 << 2, 66 SVGA3DBLOCKDESC_U = 1 << 2, 67 SVGA3DBLOCKDESC_LUMINANCE = 1 << 2, 68 69 /* Format contains Alpha/Q data */ 70 SVGA3DBLOCKDESC_ALPHA = 1 << 3, 71 SVGA3DBLOCKDESC_Q = 1 << 3, 72 73 /* Format is a buffer */ 74 SVGA3DBLOCKDESC_BUFFER = 1 << 4, 75 76 /* Format is compressed */ 77 SVGA3DBLOCKDESC_COMPRESSED = 1 << 5, 78 79 /* Format uses IEEE floating point */ 80 SVGA3DBLOCKDESC_FP = 1 << 6, 81 82 /* Three separate blocks store data. */ 83 SVGA3DBLOCKDESC_PLANAR_YUV = 1 << 7, 84 85 /* 2 planes of Y, UV, e.g., NV12. */ 86 SVGA3DBLOCKDESC_2PLANAR_YUV = 1 << 8, 87 88 /* 3 planes of separate Y, U, V, e.g., YV12. */ 89 SVGA3DBLOCKDESC_3PLANAR_YUV = 1 << 9, 90 91 /* Block with a stencil channel */ 92 SVGA3DBLOCKDESC_STENCIL = 1 << 11, 93 94 /* Typeless format */ 95 SVGA3DBLOCKDESC_TYPELESS = 1 << 12, 96 97 /* Channels are signed integers */ 98 SVGA3DBLOCKDESC_SINT = 1 << 13, 99 100 /* Channels are unsigned integers */ 101 SVGA3DBLOCKDESC_UINT = 1 << 14, 102 103 /* Channels are normalized (when sampling) */ 104 SVGA3DBLOCKDESC_NORM = 1 << 15, 105 106 /* Channels are in SRGB */ 107 SVGA3DBLOCKDESC_SRGB = 1 << 16, 108 109 /* Shared exponent */ 110 SVGA3DBLOCKDESC_EXP = 1 << 17, 111 112 /* Format contains color data. */ 113 SVGA3DBLOCKDESC_COLOR = 1 << 18, 114 /* Format contains depth data. */ 115 SVGA3DBLOCKDESC_DEPTH = 1 << 19, 116 /* Format contains bump data. */ 117 SVGA3DBLOCKDESC_BUMP = 1 << 20, 118 119 /* Format contains YUV video data. */ 120 SVGA3DBLOCKDESC_YUV_VIDEO = 1 << 21, 121 122 /* For mixed unsigned/signed formats. */ 123 SVGA3DBLOCKDESC_MIXED = 1 << 22, 124 125 /* For distingushing CxV8U8. */ 126 SVGA3DBLOCKDESC_CX = 1 << 23, 127 128 /* Different compressed format groups. */ 129 SVGA3DBLOCKDESC_BC1 = 1 << 24, 130 SVGA3DBLOCKDESC_BC2 = 1 << 25, 131 SVGA3DBLOCKDESC_BC3 = 1 << 26, 132 SVGA3DBLOCKDESC_BC4 = 1 << 27, 133 SVGA3DBLOCKDESC_BC5 = 1 << 28, 134 SVGA3DBLOCKDESC_BC6H = 1 << 29, 135 SVGA3DBLOCKDESC_BC7 = 1 << 30, 136 137 SVGA3DBLOCKDESC_A_UINT = SVGA3DBLOCKDESC_ALPHA | 138 SVGA3DBLOCKDESC_UINT | 139 SVGA3DBLOCKDESC_COLOR, 140 SVGA3DBLOCKDESC_A_UNORM = SVGA3DBLOCKDESC_A_UINT | 141 SVGA3DBLOCKDESC_NORM, 142 SVGA3DBLOCKDESC_R_UINT = SVGA3DBLOCKDESC_RED | 143 SVGA3DBLOCKDESC_UINT | 144 SVGA3DBLOCKDESC_COLOR, 145 SVGA3DBLOCKDESC_R_UNORM = SVGA3DBLOCKDESC_R_UINT | 146 SVGA3DBLOCKDESC_NORM, 147 SVGA3DBLOCKDESC_R_SINT = SVGA3DBLOCKDESC_RED | 148 SVGA3DBLOCKDESC_SINT | 149 SVGA3DBLOCKDESC_COLOR, 150 SVGA3DBLOCKDESC_R_SNORM = SVGA3DBLOCKDESC_R_SINT | 151 SVGA3DBLOCKDESC_NORM, 152 SVGA3DBLOCKDESC_G_UINT = SVGA3DBLOCKDESC_GREEN | 153 SVGA3DBLOCKDESC_UINT | 154 SVGA3DBLOCKDESC_COLOR, 155 SVGA3DBLOCKDESC_RG_UINT = SVGA3DBLOCKDESC_RED | 156 SVGA3DBLOCKDESC_GREEN | 157 SVGA3DBLOCKDESC_UINT | 158 SVGA3DBLOCKDESC_COLOR, 159 SVGA3DBLOCKDESC_RG_UNORM = SVGA3DBLOCKDESC_RG_UINT | 160 SVGA3DBLOCKDESC_NORM, 161 SVGA3DBLOCKDESC_RG_SINT = SVGA3DBLOCKDESC_RED | 162 SVGA3DBLOCKDESC_GREEN | 163 SVGA3DBLOCKDESC_SINT | 164 SVGA3DBLOCKDESC_COLOR, 165 SVGA3DBLOCKDESC_RG_SNORM = SVGA3DBLOCKDESC_RG_SINT | 166 SVGA3DBLOCKDESC_NORM, 167 SVGA3DBLOCKDESC_RGB_UINT = SVGA3DBLOCKDESC_RED | 168 SVGA3DBLOCKDESC_GREEN | 169 SVGA3DBLOCKDESC_BLUE | 170 SVGA3DBLOCKDESC_UINT | 171 SVGA3DBLOCKDESC_COLOR, 172 SVGA3DBLOCKDESC_RGB_SINT = SVGA3DBLOCKDESC_RED | 173 SVGA3DBLOCKDESC_GREEN | 174 SVGA3DBLOCKDESC_BLUE | 175 SVGA3DBLOCKDESC_SINT | 176 SVGA3DBLOCKDESC_COLOR, 177 SVGA3DBLOCKDESC_RGB_UNORM = SVGA3DBLOCKDESC_RGB_UINT | 178 SVGA3DBLOCKDESC_NORM, 179 SVGA3DBLOCKDESC_RGB_UNORM_SRGB = SVGA3DBLOCKDESC_RGB_UNORM | 180 SVGA3DBLOCKDESC_SRGB, 181 SVGA3DBLOCKDESC_RGBA_UINT = SVGA3DBLOCKDESC_RED | 182 SVGA3DBLOCKDESC_GREEN | 183 SVGA3DBLOCKDESC_BLUE | 184 SVGA3DBLOCKDESC_ALPHA | 185 SVGA3DBLOCKDESC_UINT | 186 SVGA3DBLOCKDESC_COLOR, 187 SVGA3DBLOCKDESC_RGBA_UNORM = SVGA3DBLOCKDESC_RGBA_UINT | 188 SVGA3DBLOCKDESC_NORM, 189 SVGA3DBLOCKDESC_RGBA_UNORM_SRGB = SVGA3DBLOCKDESC_RGBA_UNORM | 190 SVGA3DBLOCKDESC_SRGB, 191 SVGA3DBLOCKDESC_RGBA_SINT = SVGA3DBLOCKDESC_RED | 192 SVGA3DBLOCKDESC_GREEN | 193 SVGA3DBLOCKDESC_BLUE | 194 SVGA3DBLOCKDESC_ALPHA | 195 SVGA3DBLOCKDESC_SINT | 196 SVGA3DBLOCKDESC_COLOR, 197 SVGA3DBLOCKDESC_RGBA_SNORM = SVGA3DBLOCKDESC_RGBA_SINT | 198 SVGA3DBLOCKDESC_NORM, 199 SVGA3DBLOCKDESC_RGBA_FP = SVGA3DBLOCKDESC_RED | 200 SVGA3DBLOCKDESC_GREEN | 201 SVGA3DBLOCKDESC_BLUE | 202 SVGA3DBLOCKDESC_ALPHA | 203 SVGA3DBLOCKDESC_FP | 204 SVGA3DBLOCKDESC_COLOR, 205 SVGA3DBLOCKDESC_UV = SVGA3DBLOCKDESC_U | 206 SVGA3DBLOCKDESC_V | 207 SVGA3DBLOCKDESC_BUMP, 208 SVGA3DBLOCKDESC_UVL = SVGA3DBLOCKDESC_UV | 209 SVGA3DBLOCKDESC_BUMP_L | 210 SVGA3DBLOCKDESC_MIXED | 211 SVGA3DBLOCKDESC_BUMP, 212 SVGA3DBLOCKDESC_UVW = SVGA3DBLOCKDESC_UV | 213 SVGA3DBLOCKDESC_W | 214 SVGA3DBLOCKDESC_BUMP, 215 SVGA3DBLOCKDESC_UVWA = SVGA3DBLOCKDESC_UVW | 216 SVGA3DBLOCKDESC_ALPHA | 217 SVGA3DBLOCKDESC_MIXED | 218 SVGA3DBLOCKDESC_BUMP, 219 SVGA3DBLOCKDESC_UVWQ = SVGA3DBLOCKDESC_U | 220 SVGA3DBLOCKDESC_V | 221 SVGA3DBLOCKDESC_W | 222 SVGA3DBLOCKDESC_Q | 223 SVGA3DBLOCKDESC_BUMP, 224 SVGA3DBLOCKDESC_L_UNORM = SVGA3DBLOCKDESC_LUMINANCE | 225 SVGA3DBLOCKDESC_UINT | 226 SVGA3DBLOCKDESC_NORM | 227 SVGA3DBLOCKDESC_COLOR, 228 SVGA3DBLOCKDESC_LA_UNORM = SVGA3DBLOCKDESC_LUMINANCE | 229 SVGA3DBLOCKDESC_ALPHA | 230 SVGA3DBLOCKDESC_UINT | 231 SVGA3DBLOCKDESC_NORM | 232 SVGA3DBLOCKDESC_COLOR, 233 SVGA3DBLOCKDESC_R_FP = SVGA3DBLOCKDESC_RED | 234 SVGA3DBLOCKDESC_FP | 235 SVGA3DBLOCKDESC_COLOR, 236 SVGA3DBLOCKDESC_RG_FP = SVGA3DBLOCKDESC_R_FP | 237 SVGA3DBLOCKDESC_GREEN | 238 SVGA3DBLOCKDESC_COLOR, 239 SVGA3DBLOCKDESC_RGB_FP = SVGA3DBLOCKDESC_RG_FP | 240 SVGA3DBLOCKDESC_BLUE | 241 SVGA3DBLOCKDESC_COLOR, 242 SVGA3DBLOCKDESC_YUV = SVGA3DBLOCKDESC_YUV_VIDEO | 243 SVGA3DBLOCKDESC_COLOR, 244 SVGA3DBLOCKDESC_AYUV = SVGA3DBLOCKDESC_ALPHA | 245 SVGA3DBLOCKDESC_YUV_VIDEO | 246 SVGA3DBLOCKDESC_COLOR, 247 SVGA3DBLOCKDESC_RGB_EXP = SVGA3DBLOCKDESC_RED | 248 SVGA3DBLOCKDESC_GREEN | 249 SVGA3DBLOCKDESC_BLUE | 250 SVGA3DBLOCKDESC_EXP | 251 SVGA3DBLOCKDESC_COLOR, 252 253 SVGA3DBLOCKDESC_COMP_TYPELESS = SVGA3DBLOCKDESC_COMPRESSED | 254 SVGA3DBLOCKDESC_TYPELESS, 255 SVGA3DBLOCKDESC_COMP_UNORM = SVGA3DBLOCKDESC_COMPRESSED | 256 SVGA3DBLOCKDESC_UINT | 257 SVGA3DBLOCKDESC_NORM | 258 SVGA3DBLOCKDESC_COLOR, 259 SVGA3DBLOCKDESC_COMP_SNORM = SVGA3DBLOCKDESC_COMPRESSED | 260 SVGA3DBLOCKDESC_SINT | 261 SVGA3DBLOCKDESC_NORM | 262 SVGA3DBLOCKDESC_COLOR, 263 SVGA3DBLOCKDESC_COMP_UNORM_SRGB = SVGA3DBLOCKDESC_COMP_UNORM | 264 SVGA3DBLOCKDESC_SRGB, 265 SVGA3DBLOCKDESC_BC1_COMP_TYPELESS = SVGA3DBLOCKDESC_BC1 | 266 SVGA3DBLOCKDESC_COMP_TYPELESS, 267 SVGA3DBLOCKDESC_BC1_COMP_UNORM = SVGA3DBLOCKDESC_BC1 | 268 SVGA3DBLOCKDESC_COMP_UNORM, 269 SVGA3DBLOCKDESC_BC1_COMP_UNORM_SRGB = SVGA3DBLOCKDESC_BC1_COMP_UNORM | 270 SVGA3DBLOCKDESC_SRGB, 271 SVGA3DBLOCKDESC_BC2_COMP_TYPELESS = SVGA3DBLOCKDESC_BC2 | 272 SVGA3DBLOCKDESC_COMP_TYPELESS, 273 SVGA3DBLOCKDESC_BC2_COMP_UNORM = SVGA3DBLOCKDESC_BC2 | 274 SVGA3DBLOCKDESC_COMP_UNORM, 275 SVGA3DBLOCKDESC_BC2_COMP_UNORM_SRGB = SVGA3DBLOCKDESC_BC2_COMP_UNORM | 276 SVGA3DBLOCKDESC_SRGB, 277 SVGA3DBLOCKDESC_BC3_COMP_TYPELESS = SVGA3DBLOCKDESC_BC3 | 278 SVGA3DBLOCKDESC_COMP_TYPELESS, 279 SVGA3DBLOCKDESC_BC3_COMP_UNORM = SVGA3DBLOCKDESC_BC3 | 280 SVGA3DBLOCKDESC_COMP_UNORM, 281 SVGA3DBLOCKDESC_BC3_COMP_UNORM_SRGB = SVGA3DBLOCKDESC_BC3_COMP_UNORM | 282 SVGA3DBLOCKDESC_SRGB, 283 SVGA3DBLOCKDESC_BC4_COMP_TYPELESS = SVGA3DBLOCKDESC_BC4 | 284 SVGA3DBLOCKDESC_COMP_TYPELESS, 285 SVGA3DBLOCKDESC_BC4_COMP_UNORM = SVGA3DBLOCKDESC_BC4 | 286 SVGA3DBLOCKDESC_COMP_UNORM, 287 SVGA3DBLOCKDESC_BC4_COMP_SNORM = SVGA3DBLOCKDESC_BC4 | 288 SVGA3DBLOCKDESC_COMP_SNORM, 289 SVGA3DBLOCKDESC_BC5_COMP_TYPELESS = SVGA3DBLOCKDESC_BC5 | 290 SVGA3DBLOCKDESC_COMP_TYPELESS, 291 SVGA3DBLOCKDESC_BC5_COMP_UNORM = SVGA3DBLOCKDESC_BC5 | 292 SVGA3DBLOCKDESC_COMP_UNORM, 293 SVGA3DBLOCKDESC_BC5_COMP_SNORM = SVGA3DBLOCKDESC_BC5 | 294 SVGA3DBLOCKDESC_COMP_SNORM, 295 SVGA3DBLOCKDESC_BC6H_COMP_TYPELESS = SVGA3DBLOCKDESC_BC6H | 296 SVGA3DBLOCKDESC_COMP_TYPELESS, 297 SVGA3DBLOCKDESC_BC6H_COMP_UF16 = SVGA3DBLOCKDESC_BC6H | 298 SVGA3DBLOCKDESC_COMPRESSED, 299 SVGA3DBLOCKDESC_BC6H_COMP_SF16 = SVGA3DBLOCKDESC_BC6H | 300 SVGA3DBLOCKDESC_COMPRESSED, 301 SVGA3DBLOCKDESC_BC7_COMP_TYPELESS = SVGA3DBLOCKDESC_BC7 | 302 SVGA3DBLOCKDESC_COMP_TYPELESS, 303 SVGA3DBLOCKDESC_BC7_COMP_UNORM = SVGA3DBLOCKDESC_BC7 | 304 SVGA3DBLOCKDESC_COMP_UNORM, 305 SVGA3DBLOCKDESC_BC7_COMP_UNORM_SRGB = SVGA3DBLOCKDESC_BC7_COMP_UNORM | 306 SVGA3DBLOCKDESC_SRGB, 307 308 SVGA3DBLOCKDESC_NV12 = SVGA3DBLOCKDESC_YUV_VIDEO | 309 SVGA3DBLOCKDESC_PLANAR_YUV | 310 SVGA3DBLOCKDESC_2PLANAR_YUV | 311 SVGA3DBLOCKDESC_COLOR, 312 SVGA3DBLOCKDESC_YV12 = SVGA3DBLOCKDESC_YUV_VIDEO | 313 SVGA3DBLOCKDESC_PLANAR_YUV | 314 SVGA3DBLOCKDESC_3PLANAR_YUV | 315 SVGA3DBLOCKDESC_COLOR, 316 317 SVGA3DBLOCKDESC_DEPTH_UINT = SVGA3DBLOCKDESC_DEPTH | 318 SVGA3DBLOCKDESC_UINT, 319 SVGA3DBLOCKDESC_DEPTH_UNORM = SVGA3DBLOCKDESC_DEPTH_UINT | 320 SVGA3DBLOCKDESC_NORM, 321 SVGA3DBLOCKDESC_DS = SVGA3DBLOCKDESC_DEPTH | 322 SVGA3DBLOCKDESC_STENCIL, 323 SVGA3DBLOCKDESC_DS_UINT = SVGA3DBLOCKDESC_DEPTH | 324 SVGA3DBLOCKDESC_STENCIL | 325 SVGA3DBLOCKDESC_UINT, 326 SVGA3DBLOCKDESC_DS_UNORM = SVGA3DBLOCKDESC_DS_UINT | 327 SVGA3DBLOCKDESC_NORM, 328 SVGA3DBLOCKDESC_DEPTH_FP = SVGA3DBLOCKDESC_DEPTH | 329 SVGA3DBLOCKDESC_FP, 330 331 SVGA3DBLOCKDESC_UV_UINT = SVGA3DBLOCKDESC_UV | 332 SVGA3DBLOCKDESC_UINT, 333 SVGA3DBLOCKDESC_UV_SNORM = SVGA3DBLOCKDESC_UV | 334 SVGA3DBLOCKDESC_SINT | 335 SVGA3DBLOCKDESC_NORM, 336 SVGA3DBLOCKDESC_UVCX_SNORM = SVGA3DBLOCKDESC_UV_SNORM | 337 SVGA3DBLOCKDESC_CX, 338 SVGA3DBLOCKDESC_UVWQ_SNORM = SVGA3DBLOCKDESC_UVWQ | 339 SVGA3DBLOCKDESC_SINT | 340 SVGA3DBLOCKDESC_NORM, 341 }; 342 343 struct svga3d_channel_def { 344 union { 345 u8 blue; 346 u8 w_bump; 347 u8 l_bump; 348 u8 uv_video; 349 u8 u_video; 350 }; 351 union { 352 u8 green; 353 u8 stencil; 354 u8 v_bump; 355 u8 v_video; 356 }; 357 union { 358 u8 red; 359 u8 u_bump; 360 u8 luminance; 361 u8 y_video; 362 u8 depth; 363 u8 data; 364 }; 365 union { 366 u8 alpha; 367 u8 q_bump; 368 u8 exp; 369 }; 370 }; 371 372 /* 373 * struct svga3d_surface_desc - describes the actual pixel data. 374 * 375 * @format: Format 376 * @block_desc: Block description 377 * @block_size: Dimensions in pixels of a block 378 * @bytes_per_block: Size of block in bytes 379 * @pitch_bytes_per_block: Size of a block in bytes for purposes of pitch 380 * @bit_depth: Channel bit depths 381 * @bit_offset: Channel bit masks (in bits offset from the start of the pointer) 382 */ 383 struct svga3d_surface_desc { 384 SVGA3dSurfaceFormat format; 385 enum svga3d_block_desc block_desc; 386 387 surf_size_struct block_size; 388 u32 bytes_per_block; 389 u32 pitch_bytes_per_block; 390 391 struct svga3d_channel_def bit_depth; 392 struct svga3d_channel_def bit_offset; 393 }; 394 395 static const struct svga3d_surface_desc svga3d_surface_descs[] = { 396 {SVGA3D_FORMAT_INVALID, SVGA3DBLOCKDESC_NONE, 397 {1, 1, 1}, 0, 0, 398 {{0}, {0}, {0}, {0}}, 399 {{0}, {0}, {0}, {0}}}, 400 401 {SVGA3D_X8R8G8B8, SVGA3DBLOCKDESC_RGB_UNORM, 402 {1, 1, 1}, 4, 4, 403 {{8}, {8}, {8}, {0}}, 404 {{0}, {8}, {16}, {24}}}, 405 406 {SVGA3D_A8R8G8B8, SVGA3DBLOCKDESC_RGBA_UNORM, 407 {1, 1, 1}, 4, 4, 408 {{8}, {8}, {8}, {8}}, 409 {{0}, {8}, {16}, {24}}}, 410 411 {SVGA3D_R5G6B5, SVGA3DBLOCKDESC_RGB_UNORM, 412 {1, 1, 1}, 2, 2, 413 {{5}, {6}, {5}, {0}}, 414 {{0}, {5}, {11}, {0}}}, 415 416 {SVGA3D_X1R5G5B5, SVGA3DBLOCKDESC_RGB_UNORM, 417 {1, 1, 1}, 2, 2, 418 {{5}, {5}, {5}, {0}}, 419 {{0}, {5}, {10}, {0}}}, 420 421 {SVGA3D_A1R5G5B5, SVGA3DBLOCKDESC_RGBA_UNORM, 422 {1, 1, 1}, 2, 2, 423 {{5}, {5}, {5}, {1}}, 424 {{0}, {5}, {10}, {15}}}, 425 426 {SVGA3D_A4R4G4B4, SVGA3DBLOCKDESC_RGBA_UNORM, 427 {1, 1, 1}, 2, 2, 428 {{4}, {4}, {4}, {4}}, 429 {{0}, {4}, {8}, {12}}}, 430 431 {SVGA3D_Z_D32, SVGA3DBLOCKDESC_DEPTH_UNORM, 432 {1, 1, 1}, 4, 4, 433 {{0}, {0}, {32}, {0}}, 434 {{0}, {0}, {0}, {0}}}, 435 436 {SVGA3D_Z_D16, SVGA3DBLOCKDESC_DEPTH_UNORM, 437 {1, 1, 1}, 2, 2, 438 {{0}, {0}, {16}, {0}}, 439 {{0}, {0}, {0}, {0}}}, 440 441 {SVGA3D_Z_D24S8, SVGA3DBLOCKDESC_DS_UNORM, 442 {1, 1, 1}, 4, 4, 443 {{0}, {8}, {24}, {0}}, 444 {{0}, {0}, {8}, {0}}}, 445 446 {SVGA3D_Z_D15S1, SVGA3DBLOCKDESC_DS_UNORM, 447 {1, 1, 1}, 2, 2, 448 {{0}, {1}, {15}, {0}}, 449 {{0}, {0}, {1}, {0}}}, 450 451 {SVGA3D_LUMINANCE8, SVGA3DBLOCKDESC_L_UNORM, 452 {1, 1, 1}, 1, 1, 453 {{0}, {0}, {8}, {0}}, 454 {{0}, {0}, {0}, {0}}}, 455 456 {SVGA3D_LUMINANCE4_ALPHA4, SVGA3DBLOCKDESC_LA_UNORM, 457 {1, 1, 1}, 1, 1, 458 {{0}, {0}, {4}, {4}}, 459 {{0}, {0}, {0}, {4}}}, 460 461 {SVGA3D_LUMINANCE16, SVGA3DBLOCKDESC_L_UNORM, 462 {1, 1, 1}, 2, 2, 463 {{0}, {0}, {16}, {0}}, 464 {{0}, {0}, {0}, {0}}}, 465 466 {SVGA3D_LUMINANCE8_ALPHA8, SVGA3DBLOCKDESC_LA_UNORM, 467 {1, 1, 1}, 2, 2, 468 {{0}, {0}, {8}, {8}}, 469 {{0}, {0}, {0}, {8}}}, 470 471 {SVGA3D_DXT1, SVGA3DBLOCKDESC_BC1_COMP_UNORM, 472 {4, 4, 1}, 8, 8, 473 {{0}, {0}, {64}, {0}}, 474 {{0}, {0}, {0}, {0}}}, 475 476 {SVGA3D_DXT2, SVGA3DBLOCKDESC_BC2_COMP_UNORM, 477 {4, 4, 1}, 16, 16, 478 {{0}, {0}, {128}, {0}}, 479 {{0}, {0}, {0}, {0}}}, 480 481 {SVGA3D_DXT3, SVGA3DBLOCKDESC_BC2_COMP_UNORM, 482 {4, 4, 1}, 16, 16, 483 {{0}, {0}, {128}, {0}}, 484 {{0}, {0}, {0}, {0}}}, 485 486 {SVGA3D_DXT4, SVGA3DBLOCKDESC_BC3_COMP_UNORM, 487 {4, 4, 1}, 16, 16, 488 {{0}, {0}, {128}, {0}}, 489 {{0}, {0}, {0}, {0}}}, 490 491 {SVGA3D_DXT5, SVGA3DBLOCKDESC_BC3_COMP_UNORM, 492 {4, 4, 1}, 16, 16, 493 {{0}, {0}, {128}, {0}}, 494 {{0}, {0}, {0}, {0}}}, 495 496 {SVGA3D_BUMPU8V8, SVGA3DBLOCKDESC_UV_SNORM, 497 {1, 1, 1}, 2, 2, 498 {{0}, {8}, {8}, {0}}, 499 {{0}, {8}, {0}, {0}}}, 500 501 {SVGA3D_BUMPL6V5U5, SVGA3DBLOCKDESC_UVL, 502 {1, 1, 1}, 2, 2, 503 {{6}, {5}, {5}, {0}}, 504 {{10}, {5}, {0}, {0}}}, 505 506 {SVGA3D_BUMPX8L8V8U8, SVGA3DBLOCKDESC_UVL, 507 {1, 1, 1}, 4, 4, 508 {{8}, {8}, {8}, {0}}, 509 {{16}, {8}, {0}, {0}}}, 510 511 {SVGA3D_FORMAT_DEAD1, SVGA3DBLOCKDESC_NONE, 512 {1, 1, 1}, 3, 3, 513 {{8}, {8}, {8}, {0}}, 514 {{16}, {8}, {0}, {0}}}, 515 516 {SVGA3D_ARGB_S10E5, SVGA3DBLOCKDESC_RGBA_FP, 517 {1, 1, 1}, 8, 8, 518 {{16}, {16}, {16}, {16}}, 519 {{32}, {16}, {0}, {48}}}, 520 521 {SVGA3D_ARGB_S23E8, SVGA3DBLOCKDESC_RGBA_FP, 522 {1, 1, 1}, 16, 16, 523 {{32}, {32}, {32}, {32}}, 524 {{64}, {32}, {0}, {96}}}, 525 526 {SVGA3D_A2R10G10B10, SVGA3DBLOCKDESC_RGBA_UNORM, 527 {1, 1, 1}, 4, 4, 528 {{10}, {10}, {10}, {2}}, 529 {{0}, {10}, {20}, {30}}}, 530 531 {SVGA3D_V8U8, SVGA3DBLOCKDESC_UV_SNORM, 532 {1, 1, 1}, 2, 2, 533 {{0}, {8}, {8}, {0}}, 534 {{0}, {8}, {0}, {0}}}, 535 536 {SVGA3D_Q8W8V8U8, SVGA3DBLOCKDESC_UVWQ_SNORM, 537 {1, 1, 1}, 4, 4, 538 {{8}, {8}, {8}, {8}}, 539 {{16}, {8}, {0}, {24}}}, 540 541 {SVGA3D_CxV8U8, SVGA3DBLOCKDESC_UVCX_SNORM, 542 {1, 1, 1}, 2, 2, 543 {{0}, {8}, {8}, {0}}, 544 {{0}, {8}, {0}, {0}}}, 545 546 {SVGA3D_X8L8V8U8, SVGA3DBLOCKDESC_UVL, 547 {1, 1, 1}, 4, 4, 548 {{8}, {8}, {8}, {0}}, 549 {{16}, {8}, {0}, {0}}}, 550 551 {SVGA3D_A2W10V10U10, SVGA3DBLOCKDESC_UVWA, 552 {1, 1, 1}, 4, 4, 553 {{10}, {10}, {10}, {2}}, 554 {{20}, {10}, {0}, {30}}}, 555 556 {SVGA3D_ALPHA8, SVGA3DBLOCKDESC_A_UNORM, 557 {1, 1, 1}, 1, 1, 558 {{0}, {0}, {0}, {8}}, 559 {{0}, {0}, {0}, {0}}}, 560 561 {SVGA3D_R_S10E5, SVGA3DBLOCKDESC_R_FP, 562 {1, 1, 1}, 2, 2, 563 {{0}, {0}, {16}, {0}}, 564 {{0}, {0}, {0}, {0}}}, 565 566 {SVGA3D_R_S23E8, SVGA3DBLOCKDESC_R_FP, 567 {1, 1, 1}, 4, 4, 568 {{0}, {0}, {32}, {0}}, 569 {{0}, {0}, {0}, {0}}}, 570 571 {SVGA3D_RG_S10E5, SVGA3DBLOCKDESC_RG_FP, 572 {1, 1, 1}, 4, 4, 573 {{0}, {16}, {16}, {0}}, 574 {{0}, {16}, {0}, {0}}}, 575 576 {SVGA3D_RG_S23E8, SVGA3DBLOCKDESC_RG_FP, 577 {1, 1, 1}, 8, 8, 578 {{0}, {32}, {32}, {0}}, 579 {{0}, {32}, {0}, {0}}}, 580 581 {SVGA3D_BUFFER, SVGA3DBLOCKDESC_BUFFER, 582 {1, 1, 1}, 1, 1, 583 {{0}, {0}, {8}, {0}}, 584 {{0}, {0}, {0}, {0}}}, 585 586 {SVGA3D_Z_D24X8, SVGA3DBLOCKDESC_DEPTH_UNORM, 587 {1, 1, 1}, 4, 4, 588 {{0}, {0}, {24}, {0}}, 589 {{0}, {0}, {8}, {0}}}, 590 591 {SVGA3D_V16U16, SVGA3DBLOCKDESC_UV_SNORM, 592 {1, 1, 1}, 4, 4, 593 {{0}, {16}, {16}, {0}}, 594 {{0}, {16}, {0}, {0}}}, 595 596 {SVGA3D_G16R16, SVGA3DBLOCKDESC_RG_UNORM, 597 {1, 1, 1}, 4, 4, 598 {{0}, {16}, {16}, {0}}, 599 {{0}, {16}, {0}, {0}}}, 600 601 {SVGA3D_A16B16G16R16, SVGA3DBLOCKDESC_RGBA_UNORM, 602 {1, 1, 1}, 8, 8, 603 {{16}, {16}, {16}, {16}}, 604 {{32}, {16}, {0}, {48}}}, 605 606 {SVGA3D_UYVY, SVGA3DBLOCKDESC_YUV, 607 {2, 1, 1}, 4, 4, 608 {{8}, {0}, {8}, {0}}, 609 {{0}, {0}, {8}, {0}}}, 610 611 {SVGA3D_YUY2, SVGA3DBLOCKDESC_YUV, 612 {2, 1, 1}, 4, 4, 613 {{8}, {0}, {8}, {0}}, 614 {{8}, {0}, {0}, {0}}}, 615 616 {SVGA3D_NV12, SVGA3DBLOCKDESC_NV12, 617 {2, 2, 1}, 6, 2, 618 {{0}, {0}, {48}, {0}}, 619 {{0}, {0}, {0}, {0}}}, 620 621 {SVGA3D_FORMAT_DEAD2, SVGA3DBLOCKDESC_NONE, 622 {1, 1, 1}, 4, 4, 623 {{8}, {8}, {8}, {8}}, 624 {{0}, {8}, {16}, {24}}}, 625 626 {SVGA3D_R32G32B32A32_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 627 {1, 1, 1}, 16, 16, 628 {{32}, {32}, {32}, {32}}, 629 {{64}, {32}, {0}, {96}}}, 630 631 {SVGA3D_R32G32B32A32_UINT, SVGA3DBLOCKDESC_RGBA_UINT, 632 {1, 1, 1}, 16, 16, 633 {{32}, {32}, {32}, {32}}, 634 {{64}, {32}, {0}, {96}}}, 635 636 {SVGA3D_R32G32B32A32_SINT, SVGA3DBLOCKDESC_RGBA_SINT, 637 {1, 1, 1}, 16, 16, 638 {{32}, {32}, {32}, {32}}, 639 {{64}, {32}, {0}, {96}}}, 640 641 {SVGA3D_R32G32B32_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 642 {1, 1, 1}, 12, 12, 643 {{32}, {32}, {32}, {0}}, 644 {{64}, {32}, {0}, {0}}}, 645 646 {SVGA3D_R32G32B32_FLOAT, SVGA3DBLOCKDESC_RGB_FP, 647 {1, 1, 1}, 12, 12, 648 {{32}, {32}, {32}, {0}}, 649 {{64}, {32}, {0}, {0}}}, 650 651 {SVGA3D_R32G32B32_UINT, SVGA3DBLOCKDESC_RGB_UINT, 652 {1, 1, 1}, 12, 12, 653 {{32}, {32}, {32}, {0}}, 654 {{64}, {32}, {0}, {0}}}, 655 656 {SVGA3D_R32G32B32_SINT, SVGA3DBLOCKDESC_RGB_SINT, 657 {1, 1, 1}, 12, 12, 658 {{32}, {32}, {32}, {0}}, 659 {{64}, {32}, {0}, {0}}}, 660 661 {SVGA3D_R16G16B16A16_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 662 {1, 1, 1}, 8, 8, 663 {{16}, {16}, {16}, {16}}, 664 {{32}, {16}, {0}, {48}}}, 665 666 {SVGA3D_R16G16B16A16_UINT, SVGA3DBLOCKDESC_RGBA_UINT, 667 {1, 1, 1}, 8, 8, 668 {{16}, {16}, {16}, {16}}, 669 {{32}, {16}, {0}, {48}}}, 670 671 {SVGA3D_R16G16B16A16_SNORM, SVGA3DBLOCKDESC_RGBA_SNORM, 672 {1, 1, 1}, 8, 8, 673 {{16}, {16}, {16}, {16}}, 674 {{32}, {16}, {0}, {48}}}, 675 676 {SVGA3D_R16G16B16A16_SINT, SVGA3DBLOCKDESC_RGBA_SINT, 677 {1, 1, 1}, 8, 8, 678 {{16}, {16}, {16}, {16}}, 679 {{32}, {16}, {0}, {48}}}, 680 681 {SVGA3D_R32G32_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 682 {1, 1, 1}, 8, 8, 683 {{0}, {32}, {32}, {0}}, 684 {{0}, {32}, {0}, {0}}}, 685 686 {SVGA3D_R32G32_UINT, SVGA3DBLOCKDESC_RG_UINT, 687 {1, 1, 1}, 8, 8, 688 {{0}, {32}, {32}, {0}}, 689 {{0}, {32}, {0}, {0}}}, 690 691 {SVGA3D_R32G32_SINT, SVGA3DBLOCKDESC_RG_SINT, 692 {1, 1, 1}, 8, 8, 693 {{0}, {32}, {32}, {0}}, 694 {{0}, {32}, {0}, {0}}}, 695 696 {SVGA3D_R32G8X24_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 697 {1, 1, 1}, 8, 8, 698 {{0}, {8}, {32}, {0}}, 699 {{0}, {32}, {0}, {0}}}, 700 701 {SVGA3D_D32_FLOAT_S8X24_UINT, SVGA3DBLOCKDESC_DS, 702 {1, 1, 1}, 8, 8, 703 {{0}, {8}, {32}, {0}}, 704 {{0}, {32}, {0}, {0}}}, 705 706 {SVGA3D_R32_FLOAT_X8X24, SVGA3DBLOCKDESC_R_FP, 707 {1, 1, 1}, 8, 8, 708 {{0}, {0}, {32}, {0}}, 709 {{0}, {0}, {0}, {0}}}, 710 711 {SVGA3D_X32_G8X24_UINT, SVGA3DBLOCKDESC_G_UINT, 712 {1, 1, 1}, 8, 8, 713 {{0}, {8}, {0}, {0}}, 714 {{0}, {32}, {0}, {0}}}, 715 716 {SVGA3D_R10G10B10A2_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 717 {1, 1, 1}, 4, 4, 718 {{10}, {10}, {10}, {2}}, 719 {{20}, {10}, {0}, {30}}}, 720 721 {SVGA3D_R10G10B10A2_UINT, SVGA3DBLOCKDESC_RGBA_UINT, 722 {1, 1, 1}, 4, 4, 723 {{10}, {10}, {10}, {2}}, 724 {{20}, {10}, {0}, {30}}}, 725 726 {SVGA3D_R11G11B10_FLOAT, SVGA3DBLOCKDESC_RGB_FP, 727 {1, 1, 1}, 4, 4, 728 {{10}, {11}, {11}, {0}}, 729 {{22}, {11}, {0}, {0}}}, 730 731 {SVGA3D_R8G8B8A8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 732 {1, 1, 1}, 4, 4, 733 {{8}, {8}, {8}, {8}}, 734 {{16}, {8}, {0}, {24}}}, 735 736 {SVGA3D_R8G8B8A8_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 737 {1, 1, 1}, 4, 4, 738 {{8}, {8}, {8}, {8}}, 739 {{16}, {8}, {0}, {24}}}, 740 741 {SVGA3D_R8G8B8A8_UNORM_SRGB, SVGA3DBLOCKDESC_RGBA_UNORM_SRGB, 742 {1, 1, 1}, 4, 4, 743 {{8}, {8}, {8}, {8}}, 744 {{16}, {8}, {0}, {24}}}, 745 746 {SVGA3D_R8G8B8A8_UINT, SVGA3DBLOCKDESC_RGBA_UINT, 747 {1, 1, 1}, 4, 4, 748 {{8}, {8}, {8}, {8}}, 749 {{16}, {8}, {0}, {24}}}, 750 751 {SVGA3D_R8G8B8A8_SINT, SVGA3DBLOCKDESC_RGBA_SINT, 752 {1, 1, 1}, 4, 4, 753 {{8}, {8}, {8}, {8}}, 754 {{16}, {8}, {0}, {24}}}, 755 756 {SVGA3D_R16G16_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 757 {1, 1, 1}, 4, 4, 758 {{0}, {16}, {16}, {0}}, 759 {{0}, {16}, {0}, {0}}}, 760 761 {SVGA3D_R16G16_UINT, SVGA3DBLOCKDESC_RG_UINT, 762 {1, 1, 1}, 4, 4, 763 {{0}, {16}, {16}, {0}}, 764 {{0}, {16}, {0}, {0}}}, 765 766 {SVGA3D_R16G16_SINT, SVGA3DBLOCKDESC_RG_SINT, 767 {1, 1, 1}, 4, 4, 768 {{0}, {16}, {16}, {0}}, 769 {{0}, {16}, {0}, {0}}}, 770 771 {SVGA3D_R32_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 772 {1, 1, 1}, 4, 4, 773 {{0}, {0}, {32}, {0}}, 774 {{0}, {0}, {0}, {0}}}, 775 776 {SVGA3D_D32_FLOAT, SVGA3DBLOCKDESC_DEPTH_FP, 777 {1, 1, 1}, 4, 4, 778 {{0}, {0}, {32}, {0}}, 779 {{0}, {0}, {0}, {0}}}, 780 781 {SVGA3D_R32_UINT, SVGA3DBLOCKDESC_R_UINT, 782 {1, 1, 1}, 4, 4, 783 {{0}, {0}, {32}, {0}}, 784 {{0}, {0}, {0}, {0}}}, 785 786 {SVGA3D_R32_SINT, SVGA3DBLOCKDESC_R_SINT, 787 {1, 1, 1}, 4, 4, 788 {{0}, {0}, {32}, {0}}, 789 {{0}, {0}, {0}, {0}}}, 790 791 {SVGA3D_R24G8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 792 {1, 1, 1}, 4, 4, 793 {{0}, {8}, {24}, {0}}, 794 {{0}, {24}, {0}, {0}}}, 795 796 {SVGA3D_D24_UNORM_S8_UINT, SVGA3DBLOCKDESC_DS_UNORM, 797 {1, 1, 1}, 4, 4, 798 {{0}, {8}, {24}, {0}}, 799 {{0}, {24}, {0}, {0}}}, 800 801 {SVGA3D_R24_UNORM_X8, SVGA3DBLOCKDESC_R_UNORM, 802 {1, 1, 1}, 4, 4, 803 {{0}, {0}, {24}, {0}}, 804 {{0}, {0}, {0}, {0}}}, 805 806 {SVGA3D_X24_G8_UINT, SVGA3DBLOCKDESC_G_UINT, 807 {1, 1, 1}, 4, 4, 808 {{0}, {8}, {0}, {0}}, 809 {{0}, {24}, {0}, {0}}}, 810 811 {SVGA3D_R8G8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 812 {1, 1, 1}, 2, 2, 813 {{0}, {8}, {8}, {0}}, 814 {{0}, {8}, {0}, {0}}}, 815 816 {SVGA3D_R8G8_UNORM, SVGA3DBLOCKDESC_RG_UNORM, 817 {1, 1, 1}, 2, 2, 818 {{0}, {8}, {8}, {0}}, 819 {{0}, {8}, {0}, {0}}}, 820 821 {SVGA3D_R8G8_UINT, SVGA3DBLOCKDESC_RG_UINT, 822 {1, 1, 1}, 2, 2, 823 {{0}, {8}, {8}, {0}}, 824 {{0}, {8}, {0}, {0}}}, 825 826 {SVGA3D_R8G8_SINT, SVGA3DBLOCKDESC_RG_SINT, 827 {1, 1, 1}, 2, 2, 828 {{0}, {8}, {8}, {0}}, 829 {{0}, {8}, {0}, {0}}}, 830 831 {SVGA3D_R16_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 832 {1, 1, 1}, 2, 2, 833 {{0}, {0}, {16}, {0}}, 834 {{0}, {0}, {0}, {0}}}, 835 836 {SVGA3D_R16_UNORM, SVGA3DBLOCKDESC_R_UNORM, 837 {1, 1, 1}, 2, 2, 838 {{0}, {0}, {16}, {0}}, 839 {{0}, {0}, {0}, {0}}}, 840 841 {SVGA3D_R16_UINT, SVGA3DBLOCKDESC_R_UINT, 842 {1, 1, 1}, 2, 2, 843 {{0}, {0}, {16}, {0}}, 844 {{0}, {0}, {0}, {0}}}, 845 846 {SVGA3D_R16_SNORM, SVGA3DBLOCKDESC_R_SNORM, 847 {1, 1, 1}, 2, 2, 848 {{0}, {0}, {16}, {0}}, 849 {{0}, {0}, {0}, {0}}}, 850 851 {SVGA3D_R16_SINT, SVGA3DBLOCKDESC_R_SINT, 852 {1, 1, 1}, 2, 2, 853 {{0}, {0}, {16}, {0}}, 854 {{0}, {0}, {0}, {0}}}, 855 856 {SVGA3D_R8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 857 {1, 1, 1}, 1, 1, 858 {{0}, {0}, {8}, {0}}, 859 {{0}, {0}, {0}, {0}}}, 860 861 {SVGA3D_R8_UNORM, SVGA3DBLOCKDESC_R_UNORM, 862 {1, 1, 1}, 1, 1, 863 {{0}, {0}, {8}, {0}}, 864 {{0}, {0}, {0}, {0}}}, 865 866 {SVGA3D_R8_UINT, SVGA3DBLOCKDESC_R_UINT, 867 {1, 1, 1}, 1, 1, 868 {{0}, {0}, {8}, {0}}, 869 {{0}, {0}, {0}, {0}}}, 870 871 {SVGA3D_R8_SNORM, SVGA3DBLOCKDESC_R_SNORM, 872 {1, 1, 1}, 1, 1, 873 {{0}, {0}, {8}, {0}}, 874 {{0}, {0}, {0}, {0}}}, 875 876 {SVGA3D_R8_SINT, SVGA3DBLOCKDESC_R_SINT, 877 {1, 1, 1}, 1, 1, 878 {{0}, {0}, {8}, {0}}, 879 {{0}, {0}, {0}, {0}}}, 880 881 {SVGA3D_P8, SVGA3DBLOCKDESC_NONE, 882 {1, 1, 1}, 1, 1, 883 {{0}, {0}, {8}, {0}}, 884 {{0}, {0}, {0}, {0}}}, 885 886 {SVGA3D_R9G9B9E5_SHAREDEXP, SVGA3DBLOCKDESC_RGB_EXP, 887 {1, 1, 1}, 4, 4, 888 {{9}, {9}, {9}, {5}}, 889 {{18}, {9}, {0}, {27}}}, 890 891 {SVGA3D_R8G8_B8G8_UNORM, SVGA3DBLOCKDESC_NONE, 892 {2, 1, 1}, 4, 4, 893 {{0}, {8}, {8}, {0}}, 894 {{0}, {0}, {8}, {0}}}, 895 896 {SVGA3D_G8R8_G8B8_UNORM, SVGA3DBLOCKDESC_NONE, 897 {2, 1, 1}, 4, 4, 898 {{0}, {8}, {8}, {0}}, 899 {{0}, {8}, {0}, {0}}}, 900 901 {SVGA3D_BC1_TYPELESS, SVGA3DBLOCKDESC_BC1_COMP_TYPELESS, 902 {4, 4, 1}, 8, 8, 903 {{0}, {0}, {64}, {0}}, 904 {{0}, {0}, {0}, {0}}}, 905 906 {SVGA3D_BC1_UNORM_SRGB, SVGA3DBLOCKDESC_BC1_COMP_UNORM_SRGB, 907 {4, 4, 1}, 8, 8, 908 {{0}, {0}, {64}, {0}}, 909 {{0}, {0}, {0}, {0}}}, 910 911 {SVGA3D_BC2_TYPELESS, SVGA3DBLOCKDESC_BC2_COMP_TYPELESS, 912 {4, 4, 1}, 16, 16, 913 {{0}, {0}, {128}, {0}}, 914 {{0}, {0}, {0}, {0}}}, 915 916 {SVGA3D_BC2_UNORM_SRGB, SVGA3DBLOCKDESC_BC2_COMP_UNORM_SRGB, 917 {4, 4, 1}, 16, 16, 918 {{0}, {0}, {128}, {0}}, 919 {{0}, {0}, {0}, {0}}}, 920 921 {SVGA3D_BC3_TYPELESS, SVGA3DBLOCKDESC_BC3_COMP_TYPELESS, 922 {4, 4, 1}, 16, 16, 923 {{0}, {0}, {128}, {0}}, 924 {{0}, {0}, {0}, {0}}}, 925 926 {SVGA3D_BC3_UNORM_SRGB, SVGA3DBLOCKDESC_BC3_COMP_UNORM_SRGB, 927 {4, 4, 1}, 16, 16, 928 {{0}, {0}, {128}, {0}}, 929 {{0}, {0}, {0}, {0}}}, 930 931 {SVGA3D_BC4_TYPELESS, SVGA3DBLOCKDESC_BC4_COMP_TYPELESS, 932 {4, 4, 1}, 8, 8, 933 {{0}, {0}, {64}, {0}}, 934 {{0}, {0}, {0}, {0}}}, 935 936 {SVGA3D_ATI1, SVGA3DBLOCKDESC_BC4_COMP_UNORM, 937 {4, 4, 1}, 8, 8, 938 {{0}, {0}, {64}, {0}}, 939 {{0}, {0}, {0}, {0}}}, 940 941 {SVGA3D_BC4_SNORM, SVGA3DBLOCKDESC_BC4_COMP_SNORM, 942 {4, 4, 1}, 8, 8, 943 {{0}, {0}, {64}, {0}}, 944 {{0}, {0}, {0}, {0}}}, 945 946 {SVGA3D_BC5_TYPELESS, SVGA3DBLOCKDESC_BC5_COMP_TYPELESS, 947 {4, 4, 1}, 16, 16, 948 {{0}, {0}, {128}, {0}}, 949 {{0}, {0}, {0}, {0}}}, 950 951 {SVGA3D_ATI2, SVGA3DBLOCKDESC_BC5_COMP_UNORM, 952 {4, 4, 1}, 16, 16, 953 {{0}, {0}, {128}, {0}}, 954 {{0}, {0}, {0}, {0}}}, 955 956 {SVGA3D_BC5_SNORM, SVGA3DBLOCKDESC_BC5_COMP_SNORM, 957 {4, 4, 1}, 16, 16, 958 {{0}, {0}, {128}, {0}}, 959 {{0}, {0}, {0}, {0}}}, 960 961 {SVGA3D_R10G10B10_XR_BIAS_A2_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 962 {1, 1, 1}, 4, 4, 963 {{10}, {10}, {10}, {2}}, 964 {{20}, {10}, {0}, {30}}}, 965 966 {SVGA3D_B8G8R8A8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 967 {1, 1, 1}, 4, 4, 968 {{8}, {8}, {8}, {8}}, 969 {{0}, {8}, {16}, {24}}}, 970 971 {SVGA3D_B8G8R8A8_UNORM_SRGB, SVGA3DBLOCKDESC_RGBA_UNORM_SRGB, 972 {1, 1, 1}, 4, 4, 973 {{8}, {8}, {8}, {8}}, 974 {{0}, {8}, {16}, {24}}}, 975 976 {SVGA3D_B8G8R8X8_TYPELESS, SVGA3DBLOCKDESC_TYPELESS, 977 {1, 1, 1}, 4, 4, 978 {{8}, {8}, {8}, {0}}, 979 {{0}, {8}, {16}, {24}}}, 980 981 {SVGA3D_B8G8R8X8_UNORM_SRGB, SVGA3DBLOCKDESC_RGB_UNORM_SRGB, 982 {1, 1, 1}, 4, 4, 983 {{8}, {8}, {8}, {0}}, 984 {{0}, {8}, {16}, {24}}}, 985 986 {SVGA3D_Z_DF16, SVGA3DBLOCKDESC_DEPTH_UNORM, 987 {1, 1, 1}, 2, 2, 988 {{0}, {0}, {16}, {0}}, 989 {{0}, {0}, {0}, {0}}}, 990 991 {SVGA3D_Z_DF24, SVGA3DBLOCKDESC_DEPTH_UNORM, 992 {1, 1, 1}, 4, 4, 993 {{0}, {0}, {24}, {0}}, 994 {{0}, {0}, {8}, {0}}}, 995 996 {SVGA3D_Z_D24S8_INT, SVGA3DBLOCKDESC_DS_UNORM, 997 {1, 1, 1}, 4, 4, 998 {{0}, {8}, {24}, {0}}, 999 {{0}, {0}, {8}, {0}}}, 1000 1001 {SVGA3D_YV12, SVGA3DBLOCKDESC_YV12, 1002 {2, 2, 1}, 6, 2, 1003 {{0}, {0}, {48}, {0}}, 1004 {{0}, {0}, {0}, {0}}}, 1005 1006 {SVGA3D_R32G32B32A32_FLOAT, SVGA3DBLOCKDESC_RGBA_FP, 1007 {1, 1, 1}, 16, 16, 1008 {{32}, {32}, {32}, {32}}, 1009 {{64}, {32}, {0}, {96}}}, 1010 1011 {SVGA3D_R16G16B16A16_FLOAT, SVGA3DBLOCKDESC_RGBA_FP, 1012 {1, 1, 1}, 8, 8, 1013 {{16}, {16}, {16}, {16}}, 1014 {{32}, {16}, {0}, {48}}}, 1015 1016 {SVGA3D_R16G16B16A16_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 1017 {1, 1, 1}, 8, 8, 1018 {{16}, {16}, {16}, {16}}, 1019 {{32}, {16}, {0}, {48}}}, 1020 1021 {SVGA3D_R32G32_FLOAT, SVGA3DBLOCKDESC_RG_FP, 1022 {1, 1, 1}, 8, 8, 1023 {{0}, {32}, {32}, {0}}, 1024 {{0}, {32}, {0}, {0}}}, 1025 1026 {SVGA3D_R10G10B10A2_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 1027 {1, 1, 1}, 4, 4, 1028 {{10}, {10}, {10}, {2}}, 1029 {{20}, {10}, {0}, {30}}}, 1030 1031 {SVGA3D_R8G8B8A8_SNORM, SVGA3DBLOCKDESC_RGBA_SNORM, 1032 {1, 1, 1}, 4, 4, 1033 {{8}, {8}, {8}, {8}}, 1034 {{16}, {8}, {0}, {24}}}, 1035 1036 {SVGA3D_R16G16_FLOAT, SVGA3DBLOCKDESC_RG_FP, 1037 {1, 1, 1}, 4, 4, 1038 {{0}, {16}, {16}, {0}}, 1039 {{0}, {16}, {0}, {0}}}, 1040 1041 {SVGA3D_R16G16_UNORM, SVGA3DBLOCKDESC_RG_UNORM, 1042 {1, 1, 1}, 4, 4, 1043 {{0}, {16}, {16}, {0}}, 1044 {{0}, {16}, {0}, {0}}}, 1045 1046 {SVGA3D_R16G16_SNORM, SVGA3DBLOCKDESC_RG_SNORM, 1047 {1, 1, 1}, 4, 4, 1048 {{0}, {16}, {16}, {0}}, 1049 {{0}, {16}, {0}, {0}}}, 1050 1051 {SVGA3D_R32_FLOAT, SVGA3DBLOCKDESC_R_FP, 1052 {1, 1, 1}, 4, 4, 1053 {{0}, {0}, {32}, {0}}, 1054 {{0}, {0}, {0}, {0}}}, 1055 1056 {SVGA3D_R8G8_SNORM, SVGA3DBLOCKDESC_RG_SNORM, 1057 {1, 1, 1}, 2, 2, 1058 {{0}, {8}, {8}, {0}}, 1059 {{0}, {8}, {0}, {0}}}, 1060 1061 {SVGA3D_R16_FLOAT, SVGA3DBLOCKDESC_R_FP, 1062 {1, 1, 1}, 2, 2, 1063 {{0}, {0}, {16}, {0}}, 1064 {{0}, {0}, {0}, {0}}}, 1065 1066 {SVGA3D_D16_UNORM, SVGA3DBLOCKDESC_DEPTH_UNORM, 1067 {1, 1, 1}, 2, 2, 1068 {{0}, {0}, {16}, {0}}, 1069 {{0}, {0}, {0}, {0}}}, 1070 1071 {SVGA3D_A8_UNORM, SVGA3DBLOCKDESC_A_UNORM, 1072 {1, 1, 1}, 1, 1, 1073 {{0}, {0}, {0}, {8}}, 1074 {{0}, {0}, {0}, {0}}}, 1075 1076 {SVGA3D_BC1_UNORM, SVGA3DBLOCKDESC_BC1_COMP_UNORM, 1077 {4, 4, 1}, 8, 8, 1078 {{0}, {0}, {64}, {0}}, 1079 {{0}, {0}, {0}, {0}}}, 1080 1081 {SVGA3D_BC2_UNORM, SVGA3DBLOCKDESC_BC2_COMP_UNORM, 1082 {4, 4, 1}, 16, 16, 1083 {{0}, {0}, {128}, {0}}, 1084 {{0}, {0}, {0}, {0}}}, 1085 1086 {SVGA3D_BC3_UNORM, SVGA3DBLOCKDESC_BC3_COMP_UNORM, 1087 {4, 4, 1}, 16, 16, 1088 {{0}, {0}, {128}, {0}}, 1089 {{0}, {0}, {0}, {0}}}, 1090 1091 {SVGA3D_B5G6R5_UNORM, SVGA3DBLOCKDESC_RGB_UNORM, 1092 {1, 1, 1}, 2, 2, 1093 {{5}, {6}, {5}, {0}}, 1094 {{0}, {5}, {11}, {0}}}, 1095 1096 {SVGA3D_B5G5R5A1_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 1097 {1, 1, 1}, 2, 2, 1098 {{5}, {5}, {5}, {1}}, 1099 {{0}, {5}, {10}, {15}}}, 1100 1101 {SVGA3D_B8G8R8A8_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 1102 {1, 1, 1}, 4, 4, 1103 {{8}, {8}, {8}, {8}}, 1104 {{0}, {8}, {16}, {24}}}, 1105 1106 {SVGA3D_B8G8R8X8_UNORM, SVGA3DBLOCKDESC_RGB_UNORM, 1107 {1, 1, 1}, 4, 4, 1108 {{8}, {8}, {8}, {0}}, 1109 {{0}, {8}, {16}, {24}}}, 1110 1111 {SVGA3D_BC4_UNORM, SVGA3DBLOCKDESC_BC4_COMP_UNORM, 1112 {4, 4, 1}, 8, 8, 1113 {{0}, {0}, {64}, {0}}, 1114 {{0}, {0}, {0}, {0}}}, 1115 1116 {SVGA3D_BC5_UNORM, SVGA3DBLOCKDESC_BC5_COMP_UNORM, 1117 {4, 4, 1}, 16, 16, 1118 {{0}, {0}, {128}, {0}}, 1119 {{0}, {0}, {0}, {0}}}, 1120 1121 {SVGA3D_B4G4R4A4_UNORM, SVGA3DBLOCKDESC_RGBA_UNORM, 1122 {1, 1, 1}, 2, 2, 1123 {{4}, {4}, {4}, {4}}, 1124 {{0}, {4}, {8}, {12}}}, 1125 1126 {SVGA3D_BC6H_TYPELESS, SVGA3DBLOCKDESC_BC6H_COMP_TYPELESS, 1127 {4, 4, 1}, 16, 16, 1128 {{0}, {0}, {128}, {0}}, 1129 {{0}, {0}, {0}, {0}}}, 1130 1131 {SVGA3D_BC6H_UF16, SVGA3DBLOCKDESC_BC6H_COMP_UF16, 1132 {4, 4, 1}, 16, 16, 1133 {{0}, {0}, {128}, {0}}, 1134 {{0}, {0}, {0}, {0}}}, 1135 1136 {SVGA3D_BC6H_SF16, SVGA3DBLOCKDESC_BC6H_COMP_SF16, 1137 {4, 4, 1}, 16, 16, 1138 {{0}, {0}, {128}, {0}}, 1139 {{0}, {0}, {0}, {0}}}, 1140 1141 {SVGA3D_BC7_TYPELESS, SVGA3DBLOCKDESC_BC7_COMP_TYPELESS, 1142 {4, 4, 1}, 16, 16, 1143 {{0}, {0}, {128}, {0}}, 1144 {{0}, {0}, {0}, {0}}}, 1145 1146 {SVGA3D_BC7_UNORM, SVGA3DBLOCKDESC_BC7_COMP_UNORM, 1147 {4, 4, 1}, 16, 16, 1148 {{0}, {0}, {128}, {0}}, 1149 {{0}, {0}, {0}, {0}}}, 1150 1151 {SVGA3D_BC7_UNORM_SRGB, SVGA3DBLOCKDESC_BC7_COMP_UNORM_SRGB, 1152 {4, 4, 1}, 16, 16, 1153 {{0}, {0}, {128}, {0}}, 1154 {{0}, {0}, {0}, {0}}}, 1155 1156 {SVGA3D_AYUV, SVGA3DBLOCKDESC_AYUV, 1157 {1, 1, 1}, 4, 4, 1158 {{8}, {8}, {8}, {8}}, 1159 {{0}, {8}, {16}, {24}}}, 1160 }; 1161 1162 static inline u32 clamped_umul32(u32 a, u32 b) 1163 { 1164 uint64_t tmp = (uint64_t) a*b; 1165 return (tmp > (uint64_t) ((u32) -1)) ? (u32) -1 : tmp; 1166 } 1167 1168 /** 1169 * svga3dsurface_get_desc - Look up the appropriate SVGA3dSurfaceDesc for the 1170 * given format. 1171 */ 1172 static inline const struct svga3d_surface_desc * 1173 svga3dsurface_get_desc(SVGA3dSurfaceFormat format) 1174 { 1175 if (format < ARRAY_SIZE(svga3d_surface_descs)) 1176 return &svga3d_surface_descs[format]; 1177 1178 return &svga3d_surface_descs[SVGA3D_FORMAT_INVALID]; 1179 } 1180 1181 /** 1182 * svga3dsurface_get_mip_size - Given a base level size and the mip level, 1183 * compute the size of the mip level. 1184 */ 1185 static inline surf_size_struct 1186 svga3dsurface_get_mip_size(surf_size_struct base_level, u32 mip_level) 1187 { 1188 surf_size_struct size; 1189 1190 size.width = max_t(u32, base_level.width >> mip_level, 1); 1191 size.height = max_t(u32, base_level.height >> mip_level, 1); 1192 size.depth = max_t(u32, base_level.depth >> mip_level, 1); 1193 size.pad64 = 0; 1194 1195 return size; 1196 } 1197 1198 static inline void 1199 svga3dsurface_get_size_in_blocks(const struct svga3d_surface_desc *desc, 1200 const surf_size_struct *pixel_size, 1201 surf_size_struct *block_size) 1202 { 1203 block_size->width = __KERNEL_DIV_ROUND_UP(pixel_size->width, 1204 desc->block_size.width); 1205 block_size->height = __KERNEL_DIV_ROUND_UP(pixel_size->height, 1206 desc->block_size.height); 1207 block_size->depth = __KERNEL_DIV_ROUND_UP(pixel_size->depth, 1208 desc->block_size.depth); 1209 } 1210 1211 static inline bool 1212 svga3dsurface_is_planar_surface(const struct svga3d_surface_desc *desc) 1213 { 1214 return (desc->block_desc & SVGA3DBLOCKDESC_PLANAR_YUV) != 0; 1215 } 1216 1217 static inline u32 1218 svga3dsurface_calculate_pitch(const struct svga3d_surface_desc *desc, 1219 const surf_size_struct *size) 1220 { 1221 u32 pitch; 1222 surf_size_struct blocks; 1223 1224 svga3dsurface_get_size_in_blocks(desc, size, &blocks); 1225 1226 pitch = blocks.width * desc->pitch_bytes_per_block; 1227 1228 return pitch; 1229 } 1230 1231 /** 1232 * svga3dsurface_get_image_buffer_size - Calculates image buffer size. 1233 * 1234 * Return the number of bytes of buffer space required to store one image of a 1235 * surface, optionally using the specified pitch. 1236 * 1237 * If pitch is zero, it is assumed that rows are tightly packed. 1238 * 1239 * This function is overflow-safe. If the result would have overflowed, instead 1240 * we return MAX_UINT32. 1241 */ 1242 static inline u32 1243 svga3dsurface_get_image_buffer_size(const struct svga3d_surface_desc *desc, 1244 const surf_size_struct *size, 1245 u32 pitch) 1246 { 1247 surf_size_struct image_blocks; 1248 u32 slice_size, total_size; 1249 1250 svga3dsurface_get_size_in_blocks(desc, size, &image_blocks); 1251 1252 if (svga3dsurface_is_planar_surface(desc)) { 1253 total_size = clamped_umul32(image_blocks.width, 1254 image_blocks.height); 1255 total_size = clamped_umul32(total_size, image_blocks.depth); 1256 total_size = clamped_umul32(total_size, desc->bytes_per_block); 1257 return total_size; 1258 } 1259 1260 if (pitch == 0) 1261 pitch = svga3dsurface_calculate_pitch(desc, size); 1262 1263 slice_size = clamped_umul32(image_blocks.height, pitch); 1264 total_size = clamped_umul32(slice_size, image_blocks.depth); 1265 1266 return total_size; 1267 } 1268 1269 /** 1270 * svga3dsurface_get_serialized_size - Get the serialized size for the image. 1271 */ 1272 static inline u32 1273 svga3dsurface_get_serialized_size(SVGA3dSurfaceFormat format, 1274 surf_size_struct base_level_size, 1275 u32 num_mip_levels, 1276 u32 num_layers) 1277 { 1278 const struct svga3d_surface_desc *desc = svga3dsurface_get_desc(format); 1279 u32 total_size = 0; 1280 u32 mip; 1281 1282 for (mip = 0; mip < num_mip_levels; mip++) { 1283 surf_size_struct size = 1284 svga3dsurface_get_mip_size(base_level_size, mip); 1285 total_size += svga3dsurface_get_image_buffer_size(desc, 1286 &size, 0); 1287 } 1288 1289 return total_size * num_layers; 1290 } 1291 1292 /** 1293 * svga3dsurface_get_serialized_size_extended - Returns the number of bytes 1294 * required for a surface with given parameters. Support for sample count. 1295 */ 1296 static inline u32 1297 svga3dsurface_get_serialized_size_extended(SVGA3dSurfaceFormat format, 1298 surf_size_struct base_level_size, 1299 u32 num_mip_levels, 1300 u32 num_layers, 1301 u32 num_samples) 1302 { 1303 uint64_t total_size = 1304 svga3dsurface_get_serialized_size(format, 1305 base_level_size, 1306 num_mip_levels, 1307 num_layers); 1308 total_size *= max_t(u32, 1, num_samples); 1309 1310 return min_t(uint64_t, total_size, (uint64_t)U32_MAX); 1311 } 1312 1313 /** 1314 * svga3dsurface_get_pixel_offset - Compute the offset (in bytes) to a pixel 1315 * in an image (or volume). 1316 * 1317 * @width: The image width in pixels. 1318 * @height: The image height in pixels 1319 */ 1320 static inline u32 1321 svga3dsurface_get_pixel_offset(SVGA3dSurfaceFormat format, 1322 u32 width, u32 height, 1323 u32 x, u32 y, u32 z) 1324 { 1325 const struct svga3d_surface_desc *desc = svga3dsurface_get_desc(format); 1326 const u32 bw = desc->block_size.width, bh = desc->block_size.height; 1327 const u32 bd = desc->block_size.depth; 1328 const u32 rowstride = __KERNEL_DIV_ROUND_UP(width, bw) * 1329 desc->bytes_per_block; 1330 const u32 imgstride = __KERNEL_DIV_ROUND_UP(height, bh) * rowstride; 1331 const u32 offset = (z / bd * imgstride + 1332 y / bh * rowstride + 1333 x / bw * desc->bytes_per_block); 1334 return offset; 1335 } 1336 1337 static inline u32 1338 svga3dsurface_get_image_offset(SVGA3dSurfaceFormat format, 1339 surf_size_struct baseLevelSize, 1340 u32 numMipLevels, 1341 u32 face, 1342 u32 mip) 1343 1344 { 1345 u32 offset; 1346 u32 mipChainBytes; 1347 u32 mipChainBytesToLevel; 1348 u32 i; 1349 const struct svga3d_surface_desc *desc; 1350 surf_size_struct mipSize; 1351 u32 bytes; 1352 1353 desc = svga3dsurface_get_desc(format); 1354 1355 mipChainBytes = 0; 1356 mipChainBytesToLevel = 0; 1357 for (i = 0; i < numMipLevels; i++) { 1358 mipSize = svga3dsurface_get_mip_size(baseLevelSize, i); 1359 bytes = svga3dsurface_get_image_buffer_size(desc, &mipSize, 0); 1360 mipChainBytes += bytes; 1361 if (i < mip) 1362 mipChainBytesToLevel += bytes; 1363 } 1364 1365 offset = mipChainBytes * face + mipChainBytesToLevel; 1366 1367 return offset; 1368 } 1369 1370 1371 /** 1372 * svga3dsurface_is_gb_screen_target_format - Is the specified format usable as 1373 * a ScreenTarget? 1374 * (with just the GBObjects cap-bit 1375 * set) 1376 * @format: format to queried 1377 * 1378 * RETURNS: 1379 * true if queried format is valid for screen targets 1380 */ 1381 static inline bool 1382 svga3dsurface_is_gb_screen_target_format(SVGA3dSurfaceFormat format) 1383 { 1384 return (format == SVGA3D_X8R8G8B8 || 1385 format == SVGA3D_A8R8G8B8 || 1386 format == SVGA3D_R5G6B5 || 1387 format == SVGA3D_X1R5G5B5 || 1388 format == SVGA3D_A1R5G5B5 || 1389 format == SVGA3D_P8); 1390 } 1391 1392 1393 /** 1394 * svga3dsurface_is_dx_screen_target_format - Is the specified format usable as 1395 * a ScreenTarget? 1396 * (with DX10 enabled) 1397 * 1398 * @format: format to queried 1399 * 1400 * Results: 1401 * true if queried format is valid for screen targets 1402 */ 1403 static inline bool 1404 svga3dsurface_is_dx_screen_target_format(SVGA3dSurfaceFormat format) 1405 { 1406 return (format == SVGA3D_R8G8B8A8_UNORM || 1407 format == SVGA3D_B8G8R8A8_UNORM || 1408 format == SVGA3D_B8G8R8X8_UNORM); 1409 } 1410 1411 1412 /** 1413 * svga3dsurface_is_screen_target_format - Is the specified format usable as a 1414 * ScreenTarget? 1415 * (for some combination of caps) 1416 * 1417 * @format: format to queried 1418 * 1419 * Results: 1420 * true if queried format is valid for screen targets 1421 */ 1422 static inline bool 1423 svga3dsurface_is_screen_target_format(SVGA3dSurfaceFormat format) 1424 { 1425 if (svga3dsurface_is_gb_screen_target_format(format)) { 1426 return true; 1427 } 1428 return svga3dsurface_is_dx_screen_target_format(format); 1429 } 1430 1431 /** 1432 * struct svga3dsurface_mip - Mimpmap level information 1433 * @bytes: Bytes required in the backing store of this mipmap level. 1434 * @img_stride: Byte stride per image. 1435 * @row_stride: Byte stride per block row. 1436 * @size: The size of the mipmap. 1437 */ 1438 struct svga3dsurface_mip { 1439 size_t bytes; 1440 size_t img_stride; 1441 size_t row_stride; 1442 struct drm_vmw_size size; 1443 1444 }; 1445 1446 /** 1447 * struct svga3dsurface_cache - Cached surface information 1448 * @desc: Pointer to the surface descriptor 1449 * @mip: Array of mipmap level information. Valid size is @num_mip_levels. 1450 * @mip_chain_bytes: Bytes required in the backing store for the whole chain 1451 * of mip levels. 1452 * @sheet_bytes: Bytes required in the backing store for a sheet 1453 * representing a single sample. 1454 * @num_mip_levels: Valid size of the @mip array. Number of mipmap levels in 1455 * a chain. 1456 * @num_layers: Number of slices in an array texture or number of faces in 1457 * a cubemap texture. 1458 */ 1459 struct svga3dsurface_cache { 1460 const struct svga3d_surface_desc *desc; 1461 struct svga3dsurface_mip mip[DRM_VMW_MAX_MIP_LEVELS]; 1462 size_t mip_chain_bytes; 1463 size_t sheet_bytes; 1464 u32 num_mip_levels; 1465 u32 num_layers; 1466 }; 1467 1468 /** 1469 * struct svga3dsurface_loc - Surface location 1470 * @sheet: The multisample sheet. 1471 * @sub_resource: Surface subresource. Defined as layer * num_mip_levels + 1472 * mip_level. 1473 * @x: X coordinate. 1474 * @y: Y coordinate. 1475 * @z: Z coordinate. 1476 */ 1477 struct svga3dsurface_loc { 1478 u32 sheet; 1479 u32 sub_resource; 1480 u32 x, y, z; 1481 }; 1482 1483 /** 1484 * svga3dsurface_subres - Compute the subresource from layer and mipmap. 1485 * @cache: Surface layout data. 1486 * @mip_level: The mipmap level. 1487 * @layer: The surface layer (face or array slice). 1488 * 1489 * Return: The subresource. 1490 */ 1491 static inline u32 svga3dsurface_subres(const struct svga3dsurface_cache *cache, 1492 u32 mip_level, u32 layer) 1493 { 1494 return cache->num_mip_levels * layer + mip_level; 1495 } 1496 1497 /** 1498 * svga3dsurface_setup_cache - Build a surface cache entry 1499 * @size: The surface base level dimensions. 1500 * @format: The surface format. 1501 * @num_mip_levels: Number of mipmap levels. 1502 * @num_layers: Number of layers. 1503 * @cache: Pointer to a struct svga3dsurface_cach object to be filled in. 1504 * 1505 * Return: Zero on success, -EINVAL on invalid surface layout. 1506 */ 1507 static inline int svga3dsurface_setup_cache(const struct drm_vmw_size *size, 1508 SVGA3dSurfaceFormat format, 1509 u32 num_mip_levels, 1510 u32 num_layers, 1511 u32 num_samples, 1512 struct svga3dsurface_cache *cache) 1513 { 1514 const struct svga3d_surface_desc *desc; 1515 u32 i; 1516 1517 memset(cache, 0, sizeof(*cache)); 1518 cache->desc = desc = svga3dsurface_get_desc(format); 1519 cache->num_mip_levels = num_mip_levels; 1520 cache->num_layers = num_layers; 1521 for (i = 0; i < cache->num_mip_levels; i++) { 1522 struct svga3dsurface_mip *mip = &cache->mip[i]; 1523 1524 mip->size = svga3dsurface_get_mip_size(*size, i); 1525 mip->bytes = svga3dsurface_get_image_buffer_size 1526 (desc, &mip->size, 0); 1527 mip->row_stride = 1528 __KERNEL_DIV_ROUND_UP(mip->size.width, 1529 desc->block_size.width) * 1530 desc->bytes_per_block * num_samples; 1531 if (!mip->row_stride) 1532 goto invalid_dim; 1533 1534 mip->img_stride = 1535 __KERNEL_DIV_ROUND_UP(mip->size.height, 1536 desc->block_size.height) * 1537 mip->row_stride; 1538 if (!mip->img_stride) 1539 goto invalid_dim; 1540 1541 cache->mip_chain_bytes += mip->bytes; 1542 } 1543 cache->sheet_bytes = cache->mip_chain_bytes * num_layers; 1544 if (!cache->sheet_bytes) 1545 goto invalid_dim; 1546 1547 return 0; 1548 1549 invalid_dim: 1550 VMW_DEBUG_USER("Invalid surface layout for dirty tracking.\n"); 1551 return -EINVAL; 1552 } 1553 1554 /** 1555 * svga3dsurface_get_loc - Get a surface location from an offset into the 1556 * backing store 1557 * @cache: Surface layout data. 1558 * @loc: Pointer to a struct svga3dsurface_loc to be filled in. 1559 * @offset: Offset into the surface backing store. 1560 */ 1561 static inline void 1562 svga3dsurface_get_loc(const struct svga3dsurface_cache *cache, 1563 struct svga3dsurface_loc *loc, 1564 size_t offset) 1565 { 1566 const struct svga3dsurface_mip *mip = &cache->mip[0]; 1567 const struct svga3d_surface_desc *desc = cache->desc; 1568 u32 layer; 1569 int i; 1570 1571 loc->sheet = offset / cache->sheet_bytes; 1572 offset -= loc->sheet * cache->sheet_bytes; 1573 1574 layer = offset / cache->mip_chain_bytes; 1575 offset -= layer * cache->mip_chain_bytes; 1576 for (i = 0; i < cache->num_mip_levels; ++i, ++mip) { 1577 if (mip->bytes > offset) 1578 break; 1579 offset -= mip->bytes; 1580 } 1581 1582 loc->sub_resource = svga3dsurface_subres(cache, i, layer); 1583 loc->z = offset / mip->img_stride; 1584 offset -= loc->z * mip->img_stride; 1585 loc->z *= desc->block_size.depth; 1586 loc->y = offset / mip->row_stride; 1587 offset -= loc->y * mip->row_stride; 1588 loc->y *= desc->block_size.height; 1589 loc->x = offset / desc->bytes_per_block; 1590 loc->x *= desc->block_size.width; 1591 } 1592 1593 /** 1594 * svga3dsurface_inc_loc - Clamp increment a surface location with one block 1595 * size 1596 * in each dimension. 1597 * @loc: Pointer to a struct svga3dsurface_loc to be incremented. 1598 * 1599 * When computing the size of a range as size = end - start, the range does not 1600 * include the end element. However a location representing the last byte 1601 * of a touched region in the backing store *is* included in the range. 1602 * This function modifies such a location to match the end definition 1603 * given as start + size which is the one used in a SVGA3dBox. 1604 */ 1605 static inline void 1606 svga3dsurface_inc_loc(const struct svga3dsurface_cache *cache, 1607 struct svga3dsurface_loc *loc) 1608 { 1609 const struct svga3d_surface_desc *desc = cache->desc; 1610 u32 mip = loc->sub_resource % cache->num_mip_levels; 1611 const struct drm_vmw_size *size = &cache->mip[mip].size; 1612 1613 loc->sub_resource++; 1614 loc->x += desc->block_size.width; 1615 if (loc->x > size->width) 1616 loc->x = size->width; 1617 loc->y += desc->block_size.height; 1618 if (loc->y > size->height) 1619 loc->y = size->height; 1620 loc->z += desc->block_size.depth; 1621 if (loc->z > size->depth) 1622 loc->z = size->depth; 1623 } 1624 1625 /** 1626 * svga3dsurface_min_loc - The start location in a subresource 1627 * @cache: Surface layout data. 1628 * @sub_resource: The subresource. 1629 * @loc: Pointer to a struct svga3dsurface_loc to be filled in. 1630 */ 1631 static inline void 1632 svga3dsurface_min_loc(const struct svga3dsurface_cache *cache, 1633 u32 sub_resource, 1634 struct svga3dsurface_loc *loc) 1635 { 1636 loc->sheet = 0; 1637 loc->sub_resource = sub_resource; 1638 loc->x = loc->y = loc->z = 0; 1639 } 1640 1641 /** 1642 * svga3dsurface_min_loc - The end location in a subresource 1643 * @cache: Surface layout data. 1644 * @sub_resource: The subresource. 1645 * @loc: Pointer to a struct svga3dsurface_loc to be filled in. 1646 * 1647 * Following the end definition given in svga3dsurface_inc_loc(), 1648 * Compute the end location of a surface subresource. 1649 */ 1650 static inline void 1651 svga3dsurface_max_loc(const struct svga3dsurface_cache *cache, 1652 u32 sub_resource, 1653 struct svga3dsurface_loc *loc) 1654 { 1655 const struct drm_vmw_size *size; 1656 u32 mip; 1657 1658 loc->sheet = 0; 1659 loc->sub_resource = sub_resource + 1; 1660 mip = sub_resource % cache->num_mip_levels; 1661 size = &cache->mip[mip].size; 1662 loc->x = size->width; 1663 loc->y = size->height; 1664 loc->z = size->depth; 1665 } 1666 1667 #endif /* _SVGA3D_SURFACEDEFS_H_ */ 1668