linux/drivers/gpu/drm/vmwgfx/device_include/svga3d_surfacedefs.h
<<
>>
Prefs
   1/**************************************************************************
   2 *
   3 * Copyright © 2008-2015 VMware, Inc., Palo Alto, CA., USA
   4 * All Rights Reserved.
   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#ifdef __KERNEL__
  29
  30#include <drm/vmwgfx_drm.h>
  31#define surf_size_struct struct drm_vmw_size
  32
  33#else /* __KERNEL__ */
  34
  35#ifndef ARRAY_SIZE
  36#define ARRAY_SIZE(_A) (sizeof(_A) / sizeof((_A)[0]))
  37#endif /* ARRAY_SIZE */
  38
  39#define DIV_ROUND_UP(x, y)  (((x) + (y) - 1) / (y))
  40#define max_t(type, x, y)  ((x) > (y) ? (x) : (y))
  41#define surf_size_struct SVGA3dSize
  42#define u32 uint32
  43
  44#endif /* __KERNEL__ */
  45
  46#include "svga3d_reg.h"
  47
  48/*
  49 * enum svga3d_block_desc describes the active data channels in a block.
  50 *
  51 * There can be at-most four active channels in a block:
  52 *    1. Red, bump W, luminance and depth are stored in the first channel.
  53 *    2. Green, bump V and stencil are stored in the second channel.
  54 *    3. Blue and bump U are stored in the third channel.
  55 *    4. Alpha and bump Q are stored in the fourth channel.
  56 *
  57 * Block channels can be used to store compressed and buffer data:
  58 *    1. For compressed formats, only the data channel is used and its size
  59 *       is equal to that of a singular block in the compression scheme.
  60 *    2. For buffer formats, only the data channel is used and its size is
  61 *       exactly one byte in length.
  62 *    3. In each case the bit depth represent the size of a singular block.
  63 *
  64 * Note: Compressed and IEEE formats do not use the bitMask structure.
  65 */
  66
  67enum svga3d_block_desc {
  68        SVGA3DBLOCKDESC_NONE        = 0,         /* No channels are active */
  69        SVGA3DBLOCKDESC_BLUE        = 1 << 0,    /* Block with red channel
  70                                                    data */
  71        SVGA3DBLOCKDESC_U           = 1 << 0,    /* Block with bump U channel
  72                                                    data */
  73        SVGA3DBLOCKDESC_UV_VIDEO    = 1 << 7,    /* Block with alternating video
  74                                                    U and V */
  75        SVGA3DBLOCKDESC_GREEN       = 1 << 1,    /* Block with green channel
  76                                                    data */
  77        SVGA3DBLOCKDESC_V           = 1 << 1,    /* Block with bump V channel
  78                                                    data */
  79        SVGA3DBLOCKDESC_STENCIL     = 1 << 1,    /* Block with a stencil
  80                                                    channel */
  81        SVGA3DBLOCKDESC_RED         = 1 << 2,    /* Block with blue channel
  82                                                    data */
  83        SVGA3DBLOCKDESC_W           = 1 << 2,    /* Block with bump W channel
  84                                                    data */
  85        SVGA3DBLOCKDESC_LUMINANCE   = 1 << 2,    /* Block with luminance channel
  86                                                    data */
  87        SVGA3DBLOCKDESC_Y           = 1 << 2,    /* Block with video luminance
  88                                                    data */
  89        SVGA3DBLOCKDESC_DEPTH       = 1 << 2,    /* Block with depth channel */
  90        SVGA3DBLOCKDESC_ALPHA       = 1 << 3,    /* Block with an alpha
  91                                                    channel */
  92        SVGA3DBLOCKDESC_Q           = 1 << 3,    /* Block with bump Q channel
  93                                                    data */
  94        SVGA3DBLOCKDESC_BUFFER      = 1 << 4,    /* Block stores 1 byte of
  95                                                    data */
  96        SVGA3DBLOCKDESC_COMPRESSED  = 1 << 5,    /* Block stores n bytes of
  97                                                    data depending on the
  98                                                    compression method used */
  99        SVGA3DBLOCKDESC_IEEE_FP     = 1 << 6,    /* Block stores data in an IEEE
 100                                                    floating point
 101                                                    representation in
 102                                                    all channels */
 103        SVGA3DBLOCKDESC_PLANAR_YUV  = 1 << 8,    /* Three separate blocks store
 104                                                    data. */
 105        SVGA3DBLOCKDESC_U_VIDEO     = 1 << 9,    /* Block with U video data */
 106        SVGA3DBLOCKDESC_V_VIDEO     = 1 << 10,   /* Block with V video data */
 107        SVGA3DBLOCKDESC_EXP         = 1 << 11,   /* Shared exponent */
 108        SVGA3DBLOCKDESC_SRGB        = 1 << 12,   /* Data is in sRGB format */
 109        SVGA3DBLOCKDESC_2PLANAR_YUV = 1 << 13,   /* 2 planes of Y, UV,
 110                                                    e.g., NV12. */
 111        SVGA3DBLOCKDESC_3PLANAR_YUV = 1 << 14,   /* 3 planes of separate
 112                                                    Y, U, V, e.g., YV12. */
 113
 114        SVGA3DBLOCKDESC_RG         = SVGA3DBLOCKDESC_RED |
 115        SVGA3DBLOCKDESC_GREEN,
 116        SVGA3DBLOCKDESC_RGB        = SVGA3DBLOCKDESC_RG |
 117        SVGA3DBLOCKDESC_BLUE,
 118        SVGA3DBLOCKDESC_RGB_SRGB   = SVGA3DBLOCKDESC_RGB |
 119        SVGA3DBLOCKDESC_SRGB,
 120        SVGA3DBLOCKDESC_RGBA       = SVGA3DBLOCKDESC_RGB |
 121        SVGA3DBLOCKDESC_ALPHA,
 122        SVGA3DBLOCKDESC_RGBA_SRGB  = SVGA3DBLOCKDESC_RGBA |
 123        SVGA3DBLOCKDESC_SRGB,
 124        SVGA3DBLOCKDESC_UV         = SVGA3DBLOCKDESC_U |
 125        SVGA3DBLOCKDESC_V,
 126        SVGA3DBLOCKDESC_UVL        = SVGA3DBLOCKDESC_UV |
 127        SVGA3DBLOCKDESC_LUMINANCE,
 128        SVGA3DBLOCKDESC_UVW        = SVGA3DBLOCKDESC_UV |
 129        SVGA3DBLOCKDESC_W,
 130        SVGA3DBLOCKDESC_UVWA       = SVGA3DBLOCKDESC_UVW |
 131        SVGA3DBLOCKDESC_ALPHA,
 132        SVGA3DBLOCKDESC_UVWQ       = SVGA3DBLOCKDESC_U |
 133        SVGA3DBLOCKDESC_V |
 134        SVGA3DBLOCKDESC_W |
 135        SVGA3DBLOCKDESC_Q,
 136        SVGA3DBLOCKDESC_LA         = SVGA3DBLOCKDESC_LUMINANCE |
 137        SVGA3DBLOCKDESC_ALPHA,
 138        SVGA3DBLOCKDESC_R_FP       = SVGA3DBLOCKDESC_RED |
 139        SVGA3DBLOCKDESC_IEEE_FP,
 140        SVGA3DBLOCKDESC_RG_FP      = SVGA3DBLOCKDESC_R_FP |
 141        SVGA3DBLOCKDESC_GREEN,
 142        SVGA3DBLOCKDESC_RGB_FP     = SVGA3DBLOCKDESC_RG_FP |
 143        SVGA3DBLOCKDESC_BLUE,
 144        SVGA3DBLOCKDESC_RGBA_FP    = SVGA3DBLOCKDESC_RGB_FP |
 145        SVGA3DBLOCKDESC_ALPHA,
 146        SVGA3DBLOCKDESC_DS         = SVGA3DBLOCKDESC_DEPTH |
 147        SVGA3DBLOCKDESC_STENCIL,
 148        SVGA3DBLOCKDESC_YUV        = SVGA3DBLOCKDESC_UV_VIDEO |
 149        SVGA3DBLOCKDESC_Y,
 150        SVGA3DBLOCKDESC_AYUV       = SVGA3DBLOCKDESC_ALPHA |
 151        SVGA3DBLOCKDESC_Y |
 152        SVGA3DBLOCKDESC_U_VIDEO |
 153        SVGA3DBLOCKDESC_V_VIDEO,
 154        SVGA3DBLOCKDESC_RGBE       = SVGA3DBLOCKDESC_RGB |
 155        SVGA3DBLOCKDESC_EXP,
 156        SVGA3DBLOCKDESC_COMPRESSED_SRGB = SVGA3DBLOCKDESC_COMPRESSED |
 157        SVGA3DBLOCKDESC_SRGB,
 158        SVGA3DBLOCKDESC_NV12       = SVGA3DBLOCKDESC_PLANAR_YUV |
 159        SVGA3DBLOCKDESC_2PLANAR_YUV,
 160        SVGA3DBLOCKDESC_YV12       = SVGA3DBLOCKDESC_PLANAR_YUV |
 161        SVGA3DBLOCKDESC_3PLANAR_YUV,
 162};
 163
 164/*
 165 * SVGA3dSurfaceDesc describes the actual pixel data.
 166 *
 167 * This structure provides the following information:
 168 *    1. Block description.
 169 *    2. Dimensions of a block in the surface.
 170 *    3. Size of block in bytes.
 171 *    4. Bit depth of the pixel data.
 172 *    5. Channel bit depths and masks (if applicable).
 173 */
 174struct svga3d_channel_def {
 175        union {
 176                u8 blue;
 177                u8 u;
 178                u8 uv_video;
 179                u8 u_video;
 180        };
 181        union {
 182                u8 green;
 183                u8 v;
 184                u8 stencil;
 185                u8 v_video;
 186        };
 187        union {
 188                u8 red;
 189                u8 w;
 190                u8 luminance;
 191                u8 y;
 192                u8 depth;
 193                u8 data;
 194        };
 195        union {
 196                u8 alpha;
 197                u8 q;
 198                u8 exp;
 199        };
 200};
 201
 202struct svga3d_surface_desc {
 203        SVGA3dSurfaceFormat format;
 204        enum svga3d_block_desc block_desc;
 205        surf_size_struct block_size;
 206        u32 bytes_per_block;
 207        u32 pitch_bytes_per_block;
 208
 209        u32 total_bit_depth;
 210        struct svga3d_channel_def bit_depth;
 211        struct svga3d_channel_def bit_offset;
 212};
 213
 214static const struct svga3d_surface_desc svga3d_surface_descs[] = {
 215   {SVGA3D_FORMAT_INVALID, SVGA3DBLOCKDESC_NONE,
 216      {1, 1, 1},  0, 0,
 217      0, {{0}, {0}, {0}, {0}},
 218      {{0}, {0}, {0}, {0}}},
 219
 220   {SVGA3D_X8R8G8B8, SVGA3DBLOCKDESC_RGB,
 221      {1, 1, 1},  4, 4,
 222      24, {{8}, {8}, {8}, {0}},
 223      {{0}, {8}, {16}, {24}}},
 224
 225   {SVGA3D_A8R8G8B8, SVGA3DBLOCKDESC_RGBA,
 226      {1, 1, 1},  4, 4,
 227      32, {{8}, {8}, {8}, {8}},
 228      {{0}, {8}, {16}, {24}}},
 229
 230   {SVGA3D_R5G6B5, SVGA3DBLOCKDESC_RGB,
 231      {1, 1, 1},  2, 2,
 232      16, {{5}, {6}, {5}, {0}},
 233      {{0}, {5}, {11}, {0}}},
 234
 235   {SVGA3D_X1R5G5B5, SVGA3DBLOCKDESC_RGB,
 236      {1, 1, 1},  2, 2,
 237      15, {{5}, {5}, {5}, {0}},
 238      {{0}, {5}, {10}, {0}}},
 239
 240   {SVGA3D_A1R5G5B5, SVGA3DBLOCKDESC_RGBA,
 241      {1, 1, 1},  2, 2,
 242      16, {{5}, {5}, {5}, {1}},
 243      {{0}, {5}, {10}, {15}}},
 244
 245   {SVGA3D_A4R4G4B4, SVGA3DBLOCKDESC_RGBA,
 246      {1, 1, 1},  2, 2,
 247      16, {{4}, {4}, {4}, {4}},
 248      {{0}, {4}, {8}, {12}}},
 249
 250   {SVGA3D_Z_D32, SVGA3DBLOCKDESC_DEPTH,
 251      {1, 1, 1},  4, 4,
 252      32, {{0}, {0}, {32}, {0}},
 253      {{0}, {0}, {0}, {0}}},
 254
 255   {SVGA3D_Z_D16, SVGA3DBLOCKDESC_DEPTH,
 256      {1, 1, 1},  2, 2,
 257      16, {{0}, {0}, {16}, {0}},
 258      {{0}, {0}, {0}, {0}}},
 259
 260   {SVGA3D_Z_D24S8, SVGA3DBLOCKDESC_DS,
 261      {1, 1, 1},  4, 4,
 262      32, {{0}, {8}, {24}, {0}},
 263      {{0}, {24}, {0}, {0}}},
 264
 265   {SVGA3D_Z_D15S1, SVGA3DBLOCKDESC_DS,
 266      {1, 1, 1},  2, 2,
 267      16, {{0}, {1}, {15}, {0}},
 268      {{0}, {15}, {0}, {0}}},
 269
 270   {SVGA3D_LUMINANCE8, SVGA3DBLOCKDESC_LUMINANCE,
 271      {1, 1, 1},  1, 1,
 272      8, {{0}, {0}, {8}, {0}},
 273      {{0}, {0}, {0}, {0}}},
 274
 275   {SVGA3D_LUMINANCE4_ALPHA4, SVGA3DBLOCKDESC_LA,
 276    {1  , 1, 1},  1, 1,
 277      8, {{0}, {0}, {4}, {4}},
 278      {{0}, {0}, {0}, {4}}},
 279
 280   {SVGA3D_LUMINANCE16, SVGA3DBLOCKDESC_LUMINANCE,
 281      {1, 1, 1},  2, 2,
 282      16, {{0}, {0}, {16}, {0}},
 283      {{0}, {0}, {0}, {0}}},
 284
 285   {SVGA3D_LUMINANCE8_ALPHA8, SVGA3DBLOCKDESC_LA,
 286      {1, 1, 1},  2, 2,
 287      16, {{0}, {0}, {8}, {8}},
 288      {{0}, {0}, {0}, {8}}},
 289
 290   {SVGA3D_DXT1, SVGA3DBLOCKDESC_COMPRESSED,
 291      {4, 4, 1},  8, 8,
 292      64, {{0}, {0}, {64}, {0}},
 293      {{0}, {0}, {0}, {0}}},
 294
 295   {SVGA3D_DXT2, SVGA3DBLOCKDESC_COMPRESSED,
 296      {4, 4, 1},  16, 16,
 297      128, {{0}, {0}, {128}, {0}},
 298      {{0}, {0}, {0}, {0}}},
 299
 300   {SVGA3D_DXT3, SVGA3DBLOCKDESC_COMPRESSED,
 301      {4, 4, 1},  16, 16,
 302      128, {{0}, {0}, {128}, {0}},
 303      {{0}, {0}, {0}, {0}}},
 304
 305   {SVGA3D_DXT4, SVGA3DBLOCKDESC_COMPRESSED,
 306      {4, 4, 1},  16, 16,
 307      128, {{0}, {0}, {128}, {0}},
 308      {{0}, {0}, {0}, {0}}},
 309
 310   {SVGA3D_DXT5, SVGA3DBLOCKDESC_COMPRESSED,
 311      {4, 4, 1},  16, 16,
 312      128, {{0}, {0}, {128}, {0}},
 313      {{0}, {0}, {0}, {0}}},
 314
 315   {SVGA3D_BUMPU8V8, SVGA3DBLOCKDESC_UV,
 316      {1, 1, 1},  2, 2,
 317      16, {{0}, {0}, {8}, {8}},
 318      {{0}, {0}, {0}, {8}}},
 319
 320   {SVGA3D_BUMPL6V5U5, SVGA3DBLOCKDESC_UVL,
 321      {1, 1, 1},  2, 2,
 322      16, {{5}, {5}, {6}, {0}},
 323      {{11}, {6}, {0}, {0}}},
 324
 325   {SVGA3D_BUMPX8L8V8U8, SVGA3DBLOCKDESC_UVL,
 326      {1, 1, 1},  4, 4,
 327      32, {{8}, {8}, {8}, {0}},
 328      {{16}, {8}, {0}, {0}}},
 329
 330   {SVGA3D_BUMPL8V8U8, SVGA3DBLOCKDESC_UVL,
 331      {1, 1, 1},  3, 3,
 332      24, {{8}, {8}, {8}, {0}},
 333      {{16}, {8}, {0}, {0}}},
 334
 335   {SVGA3D_ARGB_S10E5, SVGA3DBLOCKDESC_RGBA_FP,
 336      {1, 1, 1},  8, 8,
 337      64, {{16}, {16}, {16}, {16}},
 338      {{32}, {16}, {0}, {48}}},
 339
 340   {SVGA3D_ARGB_S23E8, SVGA3DBLOCKDESC_RGBA_FP,
 341      {1, 1, 1},  16, 16,
 342      128, {{32}, {32}, {32}, {32}},
 343      {{64}, {32}, {0}, {96}}},
 344
 345   {SVGA3D_A2R10G10B10, SVGA3DBLOCKDESC_RGBA,
 346      {1, 1, 1},  4, 4,
 347      32, {{10}, {10}, {10}, {2}},
 348      {{0}, {10}, {20}, {30}}},
 349
 350   {SVGA3D_V8U8, SVGA3DBLOCKDESC_UV,
 351      {1, 1, 1},  2, 2,
 352      16, {{8}, {8}, {0}, {0}},
 353      {{8}, {0}, {0}, {0}}},
 354
 355   {SVGA3D_Q8W8V8U8, SVGA3DBLOCKDESC_UVWQ,
 356      {1, 1, 1},  4, 4,
 357      32, {{8}, {8}, {8}, {8}},
 358      {{24}, {16}, {8}, {0}}},
 359
 360   {SVGA3D_CxV8U8, SVGA3DBLOCKDESC_UV,
 361      {1, 1, 1},  2, 2,
 362      16, {{8}, {8}, {0}, {0}},
 363      {{8}, {0}, {0}, {0}}},
 364
 365   {SVGA3D_X8L8V8U8, SVGA3DBLOCKDESC_UVL,
 366      {1, 1, 1},  4, 4,
 367      24, {{8}, {8}, {8}, {0}},
 368      {{16}, {8}, {0}, {0}}},
 369
 370   {SVGA3D_A2W10V10U10, SVGA3DBLOCKDESC_UVWA,
 371      {1, 1, 1},  4, 4,
 372      32, {{10}, {10}, {10}, {2}},
 373      {{0}, {10}, {20}, {30}}},
 374
 375   {SVGA3D_ALPHA8, SVGA3DBLOCKDESC_ALPHA,
 376      {1, 1, 1},  1, 1,
 377      8, {{0}, {0}, {0}, {8}},
 378      {{0}, {0}, {0}, {0}}},
 379
 380   {SVGA3D_R_S10E5, SVGA3DBLOCKDESC_R_FP,
 381      {1, 1, 1},  2, 2,
 382      16, {{0}, {0}, {16}, {0}},
 383      {{0}, {0}, {0}, {0}}},
 384
 385   {SVGA3D_R_S23E8, SVGA3DBLOCKDESC_R_FP,
 386      {1, 1, 1},  4, 4,
 387      32, {{0}, {0}, {32}, {0}},
 388      {{0}, {0}, {0}, {0}}},
 389
 390   {SVGA3D_RG_S10E5, SVGA3DBLOCKDESC_RG_FP,
 391      {1, 1, 1},  4, 4,
 392      32, {{0}, {16}, {16}, {0}},
 393      {{0}, {16}, {0}, {0}}},
 394
 395   {SVGA3D_RG_S23E8, SVGA3DBLOCKDESC_RG_FP,
 396      {1, 1, 1},  8, 8,
 397      64, {{0}, {32}, {32}, {0}},
 398      {{0}, {32}, {0}, {0}}},
 399
 400   {SVGA3D_BUFFER, SVGA3DBLOCKDESC_BUFFER,
 401      {1, 1, 1},  1, 1,
 402      8, {{0}, {0}, {8}, {0}},
 403      {{0}, {0}, {0}, {0}}},
 404
 405   {SVGA3D_Z_D24X8, SVGA3DBLOCKDESC_DEPTH,
 406      {1, 1, 1},  4, 4,
 407      32, {{0}, {0}, {24}, {0}},
 408      {{0}, {24}, {0}, {0}}},
 409
 410   {SVGA3D_V16U16, SVGA3DBLOCKDESC_UV,
 411      {1, 1, 1},  4, 4,
 412      32, {{16}, {16}, {0}, {0}},
 413      {{16}, {0}, {0}, {0}}},
 414
 415   {SVGA3D_G16R16, SVGA3DBLOCKDESC_RG,
 416      {1, 1, 1},  4, 4,
 417      32, {{0}, {16}, {16}, {0}},
 418      {{0}, {0}, {16}, {0}}},
 419
 420   {SVGA3D_A16B16G16R16, SVGA3DBLOCKDESC_RGBA,
 421      {1, 1, 1},  8, 8,
 422      64, {{16}, {16}, {16}, {16}},
 423      {{32}, {16}, {0}, {48}}},
 424
 425   {SVGA3D_UYVY, SVGA3DBLOCKDESC_YUV,
 426      {1, 1, 1},  2, 2,
 427      16, {{8}, {0}, {8}, {0}},
 428      {{0}, {0}, {8}, {0}}},
 429
 430   {SVGA3D_YUY2, SVGA3DBLOCKDESC_YUV,
 431      {1, 1, 1},  2, 2,
 432      16, {{8}, {0}, {8}, {0}},
 433      {{8}, {0}, {0}, {0}}},
 434
 435   {SVGA3D_NV12, SVGA3DBLOCKDESC_NV12,
 436      {2, 2, 1},  6, 2,
 437      48, {{0}, {0}, {48}, {0}},
 438      {{0}, {0}, {0}, {0}}},
 439
 440   {SVGA3D_AYUV, SVGA3DBLOCKDESC_AYUV,
 441      {1, 1, 1},  4, 4,
 442      32, {{8}, {8}, {8}, {8}},
 443      {{0}, {8}, {16}, {24}}},
 444
 445   {SVGA3D_R32G32B32A32_TYPELESS, SVGA3DBLOCKDESC_RGBA,
 446      {1, 1, 1},  16, 16,
 447      128, {{32}, {32}, {32}, {32}},
 448      {{64}, {32}, {0}, {96}}},
 449
 450   {SVGA3D_R32G32B32A32_UINT, SVGA3DBLOCKDESC_RGBA,
 451      {1, 1, 1},  16, 16,
 452      128, {{32}, {32}, {32}, {32}},
 453      {{64}, {32}, {0}, {96}}},
 454
 455   {SVGA3D_R32G32B32A32_SINT, SVGA3DBLOCKDESC_UVWQ,
 456      {1, 1, 1},  16, 16,
 457      128, {{32}, {32}, {32}, {32}},
 458      {{64}, {32}, {0}, {96}}},
 459
 460   {SVGA3D_R32G32B32_TYPELESS, SVGA3DBLOCKDESC_RGB,
 461      {1, 1, 1},  12, 12,
 462      96, {{32}, {32}, {32}, {0}},
 463      {{64}, {32}, {0}, {0}}},
 464
 465   {SVGA3D_R32G32B32_FLOAT, SVGA3DBLOCKDESC_RGB_FP,
 466      {1, 1, 1},  12, 12,
 467      96, {{32}, {32}, {32}, {0}},
 468      {{64}, {32}, {0}, {0}}},
 469
 470   {SVGA3D_R32G32B32_UINT, SVGA3DBLOCKDESC_RGB,
 471      {1, 1, 1},  12, 12,
 472      96, {{32}, {32}, {32}, {0}},
 473      {{64}, {32}, {0}, {0}}},
 474
 475   {SVGA3D_R32G32B32_SINT, SVGA3DBLOCKDESC_UVW,
 476      {1, 1, 1},  12, 12,
 477      96, {{32}, {32}, {32}, {0}},
 478      {{64}, {32}, {0}, {0}}},
 479
 480   {SVGA3D_R16G16B16A16_TYPELESS, SVGA3DBLOCKDESC_RGBA,
 481      {1, 1, 1},  8, 8,
 482      64, {{16}, {16}, {16}, {16}},
 483      {{32}, {16}, {0}, {48}}},
 484
 485   {SVGA3D_R16G16B16A16_UINT, SVGA3DBLOCKDESC_RGBA,
 486      {1, 1, 1},  8, 8,
 487      64, {{16}, {16}, {16}, {16}},
 488      {{32}, {16}, {0}, {48}}},
 489
 490   {SVGA3D_R16G16B16A16_SNORM, SVGA3DBLOCKDESC_UVWQ,
 491      {1, 1, 1},  8, 8,
 492      64, {{16}, {16}, {16}, {16}},
 493      {{32}, {16}, {0}, {48}}},
 494
 495   {SVGA3D_R16G16B16A16_SINT, SVGA3DBLOCKDESC_UVWQ,
 496      {1, 1, 1},  8, 8,
 497      64, {{16}, {16}, {16}, {16}},
 498      {{32}, {16}, {0}, {48}}},
 499
 500   {SVGA3D_R32G32_TYPELESS, SVGA3DBLOCKDESC_RG,
 501      {1, 1, 1},  8, 8,
 502      64, {{0}, {32}, {32}, {0}},
 503      {{0}, {32}, {0}, {0}}},
 504
 505   {SVGA3D_R32G32_UINT, SVGA3DBLOCKDESC_RG,
 506      {1, 1, 1},  8, 8,
 507      64, {{0}, {32}, {32}, {0}},
 508      {{0}, {32}, {0}, {0}}},
 509
 510   {SVGA3D_R32G32_SINT, SVGA3DBLOCKDESC_UV,
 511      {1, 1, 1},  8, 8,
 512      64, {{0}, {32}, {32}, {0}},
 513      {{0}, {32}, {0}, {0}}},
 514
 515   {SVGA3D_R32G8X24_TYPELESS, SVGA3DBLOCKDESC_RG,
 516      {1, 1, 1},  8, 8,
 517      64, {{0}, {8}, {32}, {0}},
 518      {{0}, {32}, {0}, {0}}},
 519
 520   {SVGA3D_D32_FLOAT_S8X24_UINT, SVGA3DBLOCKDESC_DS,
 521      {1, 1, 1},  8, 8,
 522      64, {{0}, {8}, {32}, {0}},
 523      {{0}, {32}, {0}, {0}}},
 524
 525   {SVGA3D_R32_FLOAT_X8X24_TYPELESS, SVGA3DBLOCKDESC_R_FP,
 526      {1, 1, 1},  8, 8,
 527      64, {{0}, {0}, {32}, {0}},
 528      {{0}, {0}, {0}, {0}}},
 529
 530   {SVGA3D_X32_TYPELESS_G8X24_UINT, SVGA3DBLOCKDESC_GREEN,
 531      {1, 1, 1},  8, 8,
 532      64, {{0}, {8}, {0}, {0}},
 533      {{0}, {32}, {0}, {0}}},
 534
 535   {SVGA3D_R10G10B10A2_TYPELESS, SVGA3DBLOCKDESC_RGBA,
 536      {1, 1, 1},  4, 4,
 537      32, {{10}, {10}, {10}, {2}},
 538      {{0}, {10}, {20}, {30}}},
 539
 540   {SVGA3D_R10G10B10A2_UINT, SVGA3DBLOCKDESC_RGBA,
 541      {1, 1, 1},  4, 4,
 542      32, {{10}, {10}, {10}, {2}},
 543      {{0}, {10}, {20}, {30}}},
 544
 545   {SVGA3D_R11G11B10_FLOAT, SVGA3DBLOCKDESC_RGB_FP,
 546      {1, 1, 1},  4, 4,
 547      32, {{10}, {11}, {11}, {0}},
 548      {{0}, {10}, {21}, {0}}},
 549
 550   {SVGA3D_R8G8B8A8_TYPELESS, SVGA3DBLOCKDESC_RGBA,
 551      {1, 1, 1},  4, 4,
 552      32, {{8}, {8}, {8}, {8}},
 553      {{16}, {8}, {0}, {24}}},
 554
 555   {SVGA3D_R8G8B8A8_UNORM, SVGA3DBLOCKDESC_RGBA,
 556      {1, 1, 1},  4, 4,
 557      32, {{8}, {8}, {8}, {8}},
 558      {{16}, {8}, {0}, {24}}},
 559
 560   {SVGA3D_R8G8B8A8_UNORM_SRGB, SVGA3DBLOCKDESC_RGBA_SRGB,
 561      {1, 1, 1},  4, 4,
 562      32, {{8}, {8}, {8}, {8}},
 563      {{16}, {8}, {0}, {24}}},
 564
 565   {SVGA3D_R8G8B8A8_UINT, SVGA3DBLOCKDESC_RGBA,
 566      {1, 1, 1},  4, 4,
 567      32, {{8}, {8}, {8}, {8}},
 568      {{16}, {8}, {0}, {24}}},
 569
 570   {SVGA3D_R8G8B8A8_SINT, SVGA3DBLOCKDESC_RGBA,
 571      {1, 1, 1},  4, 4,
 572      32, {{8}, {8}, {8}, {8}},
 573      {{16}, {8}, {0}, {24}}},
 574
 575   {SVGA3D_R16G16_TYPELESS, SVGA3DBLOCKDESC_RG,
 576      {1, 1, 1},  4, 4,
 577      32, {{0}, {16}, {16}, {0}},
 578      {{0}, {16}, {0}, {0}}},
 579
 580   {SVGA3D_R16G16_UINT, SVGA3DBLOCKDESC_RG_FP,
 581      {1, 1, 1},  4, 4,
 582      32, {{0}, {16}, {16}, {0}},
 583      {{0}, {16}, {0}, {0}}},
 584
 585   {SVGA3D_R16G16_SINT, SVGA3DBLOCKDESC_UV,
 586      {1, 1, 1},  4, 4,
 587      32, {{0}, {16}, {16}, {0}},
 588      {{0}, {16}, {0}, {0}}},
 589
 590   {SVGA3D_R32_TYPELESS, SVGA3DBLOCKDESC_RED,
 591      {1, 1, 1},  4, 4,
 592      32, {{0}, {0}, {32}, {0}},
 593      {{0}, {0}, {0}, {0}}},
 594
 595   {SVGA3D_D32_FLOAT, SVGA3DBLOCKDESC_DEPTH,
 596      {1, 1, 1},  4, 4,
 597      32, {{0}, {0}, {32}, {0}},
 598      {{0}, {0}, {0}, {0}}},
 599
 600   {SVGA3D_R32_UINT, SVGA3DBLOCKDESC_RED,
 601      {1, 1, 1},  4, 4,
 602      32, {{0}, {0}, {32}, {0}},
 603      {{0}, {0}, {0}, {0}}},
 604
 605   {SVGA3D_R32_SINT, SVGA3DBLOCKDESC_RED,
 606      {1, 1, 1},  4, 4,
 607      32, {{0}, {0}, {32}, {0}},
 608      {{0}, {0}, {0}, {0}}},
 609
 610   {SVGA3D_R24G8_TYPELESS, SVGA3DBLOCKDESC_RG,
 611      {1, 1, 1},  4, 4,
 612      32, {{0}, {8}, {24}, {0}},
 613      {{0}, {24}, {0}, {0}}},
 614
 615   {SVGA3D_D24_UNORM_S8_UINT, SVGA3DBLOCKDESC_DS,
 616      {1, 1, 1},  4, 4,
 617      32, {{0}, {8}, {24}, {0}},
 618      {{0}, {24}, {0}, {0}}},
 619
 620   {SVGA3D_R24_UNORM_X8_TYPELESS, SVGA3DBLOCKDESC_RED,
 621      {1, 1, 1},  4, 4,
 622      32, {{0}, {0}, {24}, {0}},
 623      {{0}, {0}, {0}, {0}}},
 624
 625   {SVGA3D_X24_TYPELESS_G8_UINT, SVGA3DBLOCKDESC_GREEN,
 626      {1, 1, 1},  4, 4,
 627      32, {{0}, {8}, {0}, {0}},
 628      {{0}, {24}, {0}, {0}}},
 629
 630   {SVGA3D_R8G8_TYPELESS, SVGA3DBLOCKDESC_RG,
 631      {1, 1, 1},  2, 2,
 632      16, {{0}, {8}, {8}, {0}},
 633      {{0}, {8}, {0}, {0}}},
 634
 635   {SVGA3D_R8G8_UNORM, SVGA3DBLOCKDESC_RG,
 636      {1, 1, 1},  2, 2,
 637      16, {{0}, {8}, {8}, {0}},
 638      {{0}, {8}, {0}, {0}}},
 639
 640   {SVGA3D_R8G8_UINT, SVGA3DBLOCKDESC_RG,
 641      {1, 1, 1},  2, 2,
 642      16, {{0}, {8}, {8}, {0}},
 643      {{0}, {8}, {0}, {0}}},
 644
 645   {SVGA3D_R8G8_SINT, SVGA3DBLOCKDESC_UV,
 646      {1, 1, 1},  2, 2,
 647      16, {{0}, {8}, {8}, {0}},
 648      {{0}, {8}, {0}, {0}}},
 649
 650   {SVGA3D_R16_TYPELESS, SVGA3DBLOCKDESC_RED,
 651      {1, 1, 1},  2, 2,
 652      16, {{0}, {0}, {16}, {0}},
 653      {{0}, {0}, {0}, {0}}},
 654
 655   {SVGA3D_R16_UNORM, SVGA3DBLOCKDESC_RED,
 656      {1, 1, 1},  2, 2,
 657      16, {{0}, {0}, {16}, {0}},
 658      {{0}, {0}, {0}, {0}}},
 659
 660   {SVGA3D_R16_UINT, SVGA3DBLOCKDESC_RED,
 661      {1, 1, 1},  2, 2,
 662      16, {{0}, {0}, {16}, {0}},
 663      {{0}, {0}, {0}, {0}}},
 664
 665   {SVGA3D_R16_SNORM, SVGA3DBLOCKDESC_U,
 666      {1, 1, 1},  2, 2,
 667      16, {{0}, {0}, {16}, {0}},
 668      {{0}, {0}, {0}, {0}}},
 669
 670   {SVGA3D_R16_SINT, SVGA3DBLOCKDESC_U,
 671      {1, 1, 1},  2, 2,
 672      16, {{0}, {0}, {16}, {0}},
 673      {{0}, {0}, {0}, {0}}},
 674
 675   {SVGA3D_R8_TYPELESS, SVGA3DBLOCKDESC_RED,
 676      {1, 1, 1},  1, 1,
 677      8, {{0}, {0}, {8}, {0}},
 678      {{0}, {0}, {0}, {0}}},
 679
 680   {SVGA3D_R8_UNORM, SVGA3DBLOCKDESC_RED,
 681      {1, 1, 1},  1, 1,
 682      8, {{0}, {0}, {8}, {0}},
 683      {{0}, {0}, {0}, {0}}},
 684
 685   {SVGA3D_R8_UINT, SVGA3DBLOCKDESC_RED,
 686      {1, 1, 1},  1, 1,
 687      8, {{0}, {0}, {8}, {0}},
 688      {{0}, {0}, {0}, {0}}},
 689
 690   {SVGA3D_R8_SNORM, SVGA3DBLOCKDESC_U,
 691      {1, 1, 1},  1, 1,
 692      8, {{0}, {0}, {8}, {0}},
 693      {{0}, {0}, {0}, {0}}},
 694
 695   {SVGA3D_R8_SINT, SVGA3DBLOCKDESC_U,
 696      {1, 1, 1},  1, 1,
 697      8, {{0}, {0}, {8}, {0}},
 698      {{0}, {0}, {0}, {0}}},
 699
 700   {SVGA3D_P8, SVGA3DBLOCKDESC_RED,
 701      {1, 1, 1},  1, 1,
 702      8, {{0}, {0}, {8}, {0}},
 703      {{0}, {0}, {0}, {0}}},
 704
 705   {SVGA3D_R9G9B9E5_SHAREDEXP, SVGA3DBLOCKDESC_RGBE,
 706      {1, 1, 1},  4, 4,
 707      32, {{9}, {9}, {9}, {5}},
 708      {{18}, {9}, {0}, {27}}},
 709
 710   {SVGA3D_R8G8_B8G8_UNORM, SVGA3DBLOCKDESC_RG,
 711      {1, 1, 1},  2, 2,
 712      16, {{0}, {8}, {8}, {0}},
 713      {{0}, {8}, {0}, {0}}},
 714
 715   {SVGA3D_G8R8_G8B8_UNORM, SVGA3DBLOCKDESC_RG,
 716      {1, 1, 1},  2, 2,
 717      16, {{0}, {8}, {8}, {0}},
 718      {{0}, {8}, {0}, {0}}},
 719
 720   {SVGA3D_BC1_TYPELESS, SVGA3DBLOCKDESC_COMPRESSED,
 721      {4, 4, 1},  8, 8,
 722      64, {{0}, {0}, {64}, {0}},
 723      {{0}, {0}, {0}, {0}}},
 724
 725   {SVGA3D_BC1_UNORM_SRGB, SVGA3DBLOCKDESC_COMPRESSED_SRGB,
 726      {4, 4, 1},  8, 8,
 727      64, {{0}, {0}, {64}, {0}},
 728      {{0}, {0}, {0}, {0}}},
 729
 730   {SVGA3D_BC2_TYPELESS, SVGA3DBLOCKDESC_COMPRESSED,
 731      {4, 4, 1},  16, 16,
 732      128, {{0}, {0}, {128}, {0}},
 733      {{0}, {0}, {0}, {0}}},
 734
 735   {SVGA3D_BC2_UNORM_SRGB, SVGA3DBLOCKDESC_COMPRESSED_SRGB,
 736      {4, 4, 1},  16, 16,
 737      128, {{0}, {0}, {128}, {0}},
 738      {{0}, {0}, {0}, {0}}},
 739
 740   {SVGA3D_BC3_TYPELESS, SVGA3DBLOCKDESC_COMPRESSED,
 741      {4, 4, 1},  16, 16,
 742      128, {{0}, {0}, {128}, {0}},
 743      {{0}, {0}, {0}, {0}}},
 744
 745   {SVGA3D_BC3_UNORM_SRGB, SVGA3DBLOCKDESC_COMPRESSED_SRGB,
 746      {4, 4, 1},  16, 16,
 747      128, {{0}, {0}, {128}, {0}},
 748      {{0}, {0}, {0}, {0}}},
 749
 750   {SVGA3D_BC4_TYPELESS, SVGA3DBLOCKDESC_COMPRESSED,
 751      {4, 4, 1},  8, 8,
 752      64, {{0}, {0}, {64}, {0}},
 753      {{0}, {0}, {0}, {0}}},
 754
 755   {SVGA3D_ATI1, SVGA3DBLOCKDESC_COMPRESSED,
 756      {4, 4, 1},  8, 8,
 757      64, {{0}, {0}, {64}, {0}},
 758      {{0}, {0}, {0}, {0}}},
 759
 760   {SVGA3D_BC4_SNORM, SVGA3DBLOCKDESC_COMPRESSED,
 761      {4, 4, 1},  8, 8,
 762      64, {{0}, {0}, {64}, {0}},
 763      {{0}, {0}, {0}, {0}}},
 764
 765   {SVGA3D_BC5_TYPELESS, SVGA3DBLOCKDESC_COMPRESSED,
 766      {4, 4, 1},  16, 16,
 767      128, {{0}, {0}, {128}, {0}},
 768      {{0}, {0}, {0}, {0}}},
 769
 770   {SVGA3D_ATI2, SVGA3DBLOCKDESC_COMPRESSED,
 771      {4, 4, 1},  16, 16,
 772      128, {{0}, {0}, {128}, {0}},
 773      {{0}, {0}, {0}, {0}}},
 774
 775   {SVGA3D_BC5_SNORM, SVGA3DBLOCKDESC_COMPRESSED,
 776      {4, 4, 1},  16, 16,
 777      128, {{0}, {0}, {128}, {0}},
 778      {{0}, {0}, {0}, {0}}},
 779
 780   {SVGA3D_R10G10B10_XR_BIAS_A2_UNORM, SVGA3DBLOCKDESC_RGBA,
 781      {1, 1, 1},  4, 4,
 782      32, {{10}, {10}, {10}, {2}},
 783      {{0}, {10}, {20}, {30}}},
 784
 785   {SVGA3D_B8G8R8A8_TYPELESS, SVGA3DBLOCKDESC_RGBA,
 786      {1, 1, 1},  4, 4,
 787      32, {{8}, {8}, {8}, {8}},
 788      {{0}, {8}, {16}, {24}}},
 789
 790   {SVGA3D_B8G8R8A8_UNORM_SRGB, SVGA3DBLOCKDESC_RGBA_SRGB,
 791      {1, 1, 1},  4, 4,
 792      32, {{8}, {8}, {8}, {8}},
 793      {{0}, {8}, {16}, {24}}},
 794
 795   {SVGA3D_B8G8R8X8_TYPELESS, SVGA3DBLOCKDESC_RGB,
 796      {1, 1, 1},  4, 4,
 797      24, {{8}, {8}, {8}, {0}},
 798      {{0}, {8}, {16}, {24}}},
 799
 800   {SVGA3D_B8G8R8X8_UNORM_SRGB, SVGA3DBLOCKDESC_RGB_SRGB,
 801      {1, 1, 1},  4, 4,
 802      24, {{8}, {8}, {8}, {0}},
 803      {{0}, {8}, {16}, {24}}},
 804
 805   {SVGA3D_Z_DF16, SVGA3DBLOCKDESC_DEPTH,
 806      {1, 1, 1},  2, 2,
 807      16, {{0}, {0}, {16}, {0}},
 808      {{0}, {0}, {0}, {0}}},
 809
 810   {SVGA3D_Z_DF24, SVGA3DBLOCKDESC_DEPTH,
 811      {1, 1, 1},  4, 4,
 812      32, {{0}, {8}, {24}, {0}},
 813      {{0}, {24}, {0}, {0}}},
 814
 815   {SVGA3D_Z_D24S8_INT, SVGA3DBLOCKDESC_DS,
 816      {1, 1, 1},  4, 4,
 817      32, {{0}, {8}, {24}, {0}},
 818      {{0}, {24}, {0}, {0}}},
 819
 820   {SVGA3D_YV12, SVGA3DBLOCKDESC_YV12,
 821      {2, 2, 1},  6, 2,
 822      48, {{0}, {0}, {48}, {0}},
 823      {{0}, {0}, {0}, {0}}},
 824
 825   {SVGA3D_R32G32B32A32_FLOAT, SVGA3DBLOCKDESC_RGBA_FP,
 826      {1, 1, 1},  16, 16,
 827      128, {{32}, {32}, {32}, {32}},
 828      {{64}, {32}, {0}, {96}}},
 829
 830   {SVGA3D_R16G16B16A16_FLOAT, SVGA3DBLOCKDESC_RGBA_FP,
 831      {1, 1, 1},  8, 8,
 832      64, {{16}, {16}, {16}, {16}},
 833      {{32}, {16}, {0}, {48}}},
 834
 835   {SVGA3D_R16G16B16A16_UNORM, SVGA3DBLOCKDESC_RGBA,
 836      {1, 1, 1},  8, 8,
 837      64, {{16}, {16}, {16}, {16}},
 838      {{32}, {16}, {0}, {48}}},
 839
 840   {SVGA3D_R32G32_FLOAT, SVGA3DBLOCKDESC_RG_FP,
 841      {1, 1, 1},  8, 8,
 842      64, {{0}, {32}, {32}, {0}},
 843      {{0}, {32}, {0}, {0}}},
 844
 845   {SVGA3D_R10G10B10A2_UNORM, SVGA3DBLOCKDESC_RGBA,
 846      {1, 1, 1},  4, 4,
 847      32, {{10}, {10}, {10}, {2}},
 848      {{0}, {10}, {20}, {30}}},
 849
 850   {SVGA3D_R8G8B8A8_SNORM, SVGA3DBLOCKDESC_RGBA,
 851      {1, 1, 1},  4, 4,
 852      32, {{8}, {8}, {8}, {8}},
 853      {{24}, {16}, {8}, {0}}},
 854
 855   {SVGA3D_R16G16_FLOAT, SVGA3DBLOCKDESC_RG_FP,
 856      {1, 1, 1},  4, 4,
 857      32, {{0}, {16}, {16}, {0}},
 858      {{0}, {16}, {0}, {0}}},
 859
 860   {SVGA3D_R16G16_UNORM, SVGA3DBLOCKDESC_RG,
 861      {1, 1, 1},  4, 4,
 862      32, {{0}, {16}, {16}, {0}},
 863      {{0}, {0}, {16}, {0}}},
 864
 865   {SVGA3D_R16G16_SNORM, SVGA3DBLOCKDESC_RG,
 866      {1, 1, 1},  4, 4,
 867      32, {{16}, {16}, {0}, {0}},
 868      {{16}, {0}, {0}, {0}}},
 869
 870   {SVGA3D_R32_FLOAT, SVGA3DBLOCKDESC_R_FP,
 871      {1, 1, 1},  4, 4,
 872      32, {{0}, {0}, {32}, {0}},
 873      {{0}, {0}, {0}, {0}}},
 874
 875   {SVGA3D_R8G8_SNORM, SVGA3DBLOCKDESC_RG,
 876      {1, 1, 1},  2, 2,
 877      16, {{8}, {8}, {0}, {0}},
 878      {{8}, {0}, {0}, {0}}},
 879
 880   {SVGA3D_R16_FLOAT, SVGA3DBLOCKDESC_R_FP,
 881      {1, 1, 1},  2, 2,
 882      16, {{0}, {0}, {16}, {0}},
 883      {{0}, {0}, {0}, {0}}},
 884
 885   {SVGA3D_D16_UNORM, SVGA3DBLOCKDESC_DEPTH,
 886      {1, 1, 1},  2, 2,
 887      16, {{0}, {0}, {16}, {0}},
 888      {{0}, {0}, {0}, {0}}},
 889
 890   {SVGA3D_A8_UNORM, SVGA3DBLOCKDESC_ALPHA,
 891      {1, 1, 1},  1, 1,
 892      8, {{0}, {0}, {0}, {8}},
 893      {{0}, {0}, {0}, {0}}},
 894
 895   {SVGA3D_BC1_UNORM, SVGA3DBLOCKDESC_COMPRESSED,
 896      {4, 4, 1},  8, 8,
 897      64, {{0}, {0}, {64}, {0}},
 898      {{0}, {0}, {0}, {0}}},
 899
 900   {SVGA3D_BC2_UNORM, SVGA3DBLOCKDESC_COMPRESSED,
 901      {4, 4, 1},  16, 16,
 902      128, {{0}, {0}, {128}, {0}},
 903      {{0}, {0}, {0}, {0}}},
 904
 905   {SVGA3D_BC3_UNORM, SVGA3DBLOCKDESC_COMPRESSED,
 906      {4, 4, 1},  16, 16,
 907      128, {{0}, {0}, {128}, {0}},
 908      {{0}, {0}, {0}, {0}}},
 909
 910   {SVGA3D_B5G6R5_UNORM, SVGA3DBLOCKDESC_RGB,
 911      {1, 1, 1},  2, 2,
 912      16, {{5}, {6}, {5}, {0}},
 913      {{0}, {5}, {11}, {0}}},
 914
 915   {SVGA3D_B5G5R5A1_UNORM, SVGA3DBLOCKDESC_RGBA,
 916      {1, 1, 1},  2, 2,
 917      16, {{5}, {5}, {5}, {1}},
 918      {{0}, {5}, {10}, {15}}},
 919
 920   {SVGA3D_B8G8R8A8_UNORM, SVGA3DBLOCKDESC_RGBA,
 921      {1, 1, 1},  4, 4,
 922      32, {{8}, {8}, {8}, {8}},
 923      {{0}, {8}, {16}, {24}}},
 924
 925   {SVGA3D_B8G8R8X8_UNORM, SVGA3DBLOCKDESC_RGB,
 926      {1, 1, 1},  4, 4,
 927      24, {{8}, {8}, {8}, {0}},
 928      {{0}, {8}, {16}, {24}}},
 929
 930   {SVGA3D_BC4_UNORM, SVGA3DBLOCKDESC_COMPRESSED,
 931      {4, 4, 1},  8, 8,
 932      64, {{0}, {0}, {64}, {0}},
 933      {{0}, {0}, {0}, {0}}},
 934
 935   {SVGA3D_BC5_UNORM, SVGA3DBLOCKDESC_COMPRESSED,
 936      {4, 4, 1},  16, 16,
 937      128, {{0}, {0}, {128}, {0}},
 938      {{0}, {0}, {0}, {0}}},
 939
 940};
 941
 942static inline u32 clamped_umul32(u32 a, u32 b)
 943{
 944        uint64_t tmp = (uint64_t) a*b;
 945        return (tmp > (uint64_t) ((u32) -1)) ? (u32) -1 : tmp;
 946}
 947
 948static inline const struct svga3d_surface_desc *
 949svga3dsurface_get_desc(SVGA3dSurfaceFormat format)
 950{
 951        if (format < ARRAY_SIZE(svga3d_surface_descs))
 952                return &svga3d_surface_descs[format];
 953
 954        return &svga3d_surface_descs[SVGA3D_FORMAT_INVALID];
 955}
 956
 957/*
 958 *----------------------------------------------------------------------
 959 *
 960 * svga3dsurface_get_mip_size --
 961 *
 962 *      Given a base level size and the mip level, compute the size of
 963 *      the mip level.
 964 *
 965 * Results:
 966 *      See above.
 967 *
 968 * Side effects:
 969 *      None.
 970 *
 971 *----------------------------------------------------------------------
 972 */
 973
 974static inline surf_size_struct
 975svga3dsurface_get_mip_size(surf_size_struct base_level, u32 mip_level)
 976{
 977        surf_size_struct size;
 978
 979        size.width = max_t(u32, base_level.width >> mip_level, 1);
 980        size.height = max_t(u32, base_level.height >> mip_level, 1);
 981        size.depth = max_t(u32, base_level.depth >> mip_level, 1);
 982        return size;
 983}
 984
 985static inline void
 986svga3dsurface_get_size_in_blocks(const struct svga3d_surface_desc *desc,
 987                                 const surf_size_struct *pixel_size,
 988                                 surf_size_struct *block_size)
 989{
 990        block_size->width = DIV_ROUND_UP(pixel_size->width,
 991                                         desc->block_size.width);
 992        block_size->height = DIV_ROUND_UP(pixel_size->height,
 993                                          desc->block_size.height);
 994        block_size->depth = DIV_ROUND_UP(pixel_size->depth,
 995                                         desc->block_size.depth);
 996}
 997
 998static inline bool
 999svga3dsurface_is_planar_surface(const struct svga3d_surface_desc *desc)
1000{
1001        return (desc->block_desc & SVGA3DBLOCKDESC_PLANAR_YUV) != 0;
1002}
1003
1004static inline u32
1005svga3dsurface_calculate_pitch(const struct svga3d_surface_desc *desc,
1006                              const surf_size_struct *size)
1007{
1008        u32 pitch;
1009        surf_size_struct blocks;
1010
1011        svga3dsurface_get_size_in_blocks(desc, size, &blocks);
1012
1013        pitch = blocks.width * desc->pitch_bytes_per_block;
1014
1015        return pitch;
1016}
1017
1018/*
1019 *-----------------------------------------------------------------------------
1020 *
1021 * svga3dsurface_get_image_buffer_size --
1022 *
1023 *      Return the number of bytes of buffer space required to store
1024 *      one image of a surface, optionally using the specified pitch.
1025 *
1026 *      If pitch is zero, it is assumed that rows are tightly packed.
1027 *
1028 *      This function is overflow-safe. If the result would have
1029 *      overflowed, instead we return MAX_UINT32.
1030 *
1031 * Results:
1032 *      Byte count.
1033 *
1034 * Side effects:
1035 *      None.
1036 *
1037 *-----------------------------------------------------------------------------
1038 */
1039
1040static inline u32
1041svga3dsurface_get_image_buffer_size(const struct svga3d_surface_desc *desc,
1042                                    const surf_size_struct *size,
1043                                    u32 pitch)
1044{
1045        surf_size_struct image_blocks;
1046        u32 slice_size, total_size;
1047
1048        svga3dsurface_get_size_in_blocks(desc, size, &image_blocks);
1049
1050        if (svga3dsurface_is_planar_surface(desc)) {
1051                total_size = clamped_umul32(image_blocks.width,
1052                                            image_blocks.height);
1053                total_size = clamped_umul32(total_size, image_blocks.depth);
1054                total_size = clamped_umul32(total_size, desc->bytes_per_block);
1055                return total_size;
1056        }
1057
1058        if (pitch == 0)
1059                pitch = svga3dsurface_calculate_pitch(desc, size);
1060
1061        slice_size = clamped_umul32(image_blocks.height, pitch);
1062        total_size = clamped_umul32(slice_size, image_blocks.depth);
1063
1064        return total_size;
1065}
1066
1067static inline u32
1068svga3dsurface_get_serialized_size(SVGA3dSurfaceFormat format,
1069                                  surf_size_struct base_level_size,
1070                                  u32 num_mip_levels,
1071                                  u32 num_layers)
1072{
1073        const struct svga3d_surface_desc *desc = svga3dsurface_get_desc(format);
1074        u32 total_size = 0;
1075        u32 mip;
1076
1077        for (mip = 0; mip < num_mip_levels; mip++) {
1078                surf_size_struct size =
1079                        svga3dsurface_get_mip_size(base_level_size, mip);
1080                total_size += svga3dsurface_get_image_buffer_size(desc,
1081                                                                  &size, 0);
1082        }
1083
1084        return total_size * num_layers;
1085}
1086
1087
1088/**
1089 * svga3dsurface_get_pixel_offset - Compute the offset (in bytes) to a pixel
1090 * in an image (or volume).
1091 *
1092 * @width: The image width in pixels.
1093 * @height: The image height in pixels
1094 */
1095static inline u32
1096svga3dsurface_get_pixel_offset(SVGA3dSurfaceFormat format,
1097                               u32 width, u32 height,
1098                               u32 x, u32 y, u32 z)
1099{
1100        const struct svga3d_surface_desc *desc = svga3dsurface_get_desc(format);
1101        const u32 bw = desc->block_size.width, bh = desc->block_size.height;
1102        const u32 bd = desc->block_size.depth;
1103        const u32 rowstride = DIV_ROUND_UP(width, bw) * desc->bytes_per_block;
1104        const u32 imgstride = DIV_ROUND_UP(height, bh) * rowstride;
1105        const u32 offset = (z / bd * imgstride +
1106                            y / bh * rowstride +
1107                            x / bw * desc->bytes_per_block);
1108        return offset;
1109}
1110
1111
1112static inline u32
1113svga3dsurface_get_image_offset(SVGA3dSurfaceFormat format,
1114                               surf_size_struct baseLevelSize,
1115                               u32 numMipLevels,
1116                               u32 face,
1117                               u32 mip)
1118
1119{
1120        u32 offset;
1121        u32 mipChainBytes;
1122        u32 mipChainBytesToLevel;
1123        u32 i;
1124        const struct svga3d_surface_desc *desc;
1125        surf_size_struct mipSize;
1126        u32 bytes;
1127
1128        desc = svga3dsurface_get_desc(format);
1129
1130        mipChainBytes = 0;
1131        mipChainBytesToLevel = 0;
1132        for (i = 0; i < numMipLevels; i++) {
1133                mipSize = svga3dsurface_get_mip_size(baseLevelSize, i);
1134                bytes = svga3dsurface_get_image_buffer_size(desc, &mipSize, 0);
1135                mipChainBytes += bytes;
1136                if (i < mip)
1137                        mipChainBytesToLevel += bytes;
1138        }
1139
1140        offset = mipChainBytes * face + mipChainBytesToLevel;
1141
1142        return offset;
1143}
1144
1145
1146/**
1147 * svga3dsurface_is_gb_screen_target_format - Is the specified format usable as
1148 *                                            a ScreenTarget?
1149 *                                            (with just the GBObjects cap-bit
1150 *                                             set)
1151 * @format: format to queried
1152 *
1153 * RETURNS:
1154 * true if queried format is valid for screen targets
1155 */
1156static inline bool
1157svga3dsurface_is_gb_screen_target_format(SVGA3dSurfaceFormat format)
1158{
1159        return (format == SVGA3D_X8R8G8B8 ||
1160                format == SVGA3D_A8R8G8B8 ||
1161                format == SVGA3D_R5G6B5   ||
1162                format == SVGA3D_X1R5G5B5 ||
1163                format == SVGA3D_A1R5G5B5 ||
1164                format == SVGA3D_P8);
1165}
1166
1167
1168/**
1169 * svga3dsurface_is_dx_screen_target_format - Is the specified format usable as
1170 *                                            a ScreenTarget?
1171 *                                            (with DX10 enabled)
1172 *
1173 * @format: format to queried
1174 *
1175 * Results:
1176 * true if queried format is valid for screen targets
1177 */
1178static inline bool
1179svga3dsurface_is_dx_screen_target_format(SVGA3dSurfaceFormat format)
1180{
1181        return (format == SVGA3D_R8G8B8A8_UNORM ||
1182                format == SVGA3D_B8G8R8A8_UNORM ||
1183                format == SVGA3D_B8G8R8X8_UNORM);
1184}
1185
1186
1187/**
1188 * svga3dsurface_is_screen_target_format - Is the specified format usable as a
1189 *                                         ScreenTarget?
1190 *                                         (for some combination of caps)
1191 *
1192 * @format: format to queried
1193 *
1194 * Results:
1195 * true if queried format is valid for screen targets
1196 */
1197static inline bool
1198svga3dsurface_is_screen_target_format(SVGA3dSurfaceFormat format)
1199{
1200        if (svga3dsurface_is_gb_screen_target_format(format)) {
1201                return true;
1202        }
1203        return svga3dsurface_is_dx_screen_target_format(format);
1204}
1205