formatutils11.cpp (42031B)
1 // 2 // Copyright 2013 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // formatutils11.cpp: Queries for GL image formats and their translations to D3D11 8 // formats. 9 10 #include "libANGLE/renderer/d3d/d3d11/formatutils11.h" 11 12 #include "image_util/copyimage.h" 13 #include "image_util/generatemip.h" 14 #include "image_util/loadimage.h" 15 16 #include "libANGLE/formatutils.h" 17 #include "libANGLE/renderer/copyvertex.h" 18 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h" 19 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 20 #include "libANGLE/renderer/dxgi_support_table.h" 21 22 namespace rx 23 { 24 25 namespace d3d11 26 { 27 28 bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel) 29 { 30 const auto &support = GetDXGISupport(dxgiFormat, featureLevel); 31 ASSERT((support.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) == 0); 32 return ((support.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0); 33 } 34 35 DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight) 36 : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight) 37 {} 38 39 const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format) 40 { 41 static const DXGIFormatSize sizeUnknown(0, 0, 0); 42 static const DXGIFormatSize size128(128, 1, 1); 43 static const DXGIFormatSize size96(96, 1, 1); 44 static const DXGIFormatSize size64(64, 1, 1); 45 static const DXGIFormatSize size32(32, 1, 1); 46 static const DXGIFormatSize size16(16, 1, 1); 47 static const DXGIFormatSize size8(8, 1, 1); 48 static const DXGIFormatSize sizeBC1(64, 4, 4); 49 static const DXGIFormatSize sizeBC2(128, 4, 4); 50 static const DXGIFormatSize sizeBC3(128, 4, 4); 51 static const DXGIFormatSize sizeBC4(64, 4, 4); 52 static const DXGIFormatSize sizeBC5(128, 4, 4); 53 static const DXGIFormatSize sizeBC6H(128, 4, 4); 54 static const DXGIFormatSize sizeBC7(128, 4, 4); 55 switch (format) 56 { 57 case DXGI_FORMAT_UNKNOWN: 58 return sizeUnknown; 59 case DXGI_FORMAT_R32G32B32A32_TYPELESS: 60 case DXGI_FORMAT_R32G32B32A32_FLOAT: 61 case DXGI_FORMAT_R32G32B32A32_UINT: 62 case DXGI_FORMAT_R32G32B32A32_SINT: 63 return size128; 64 case DXGI_FORMAT_R32G32B32_TYPELESS: 65 case DXGI_FORMAT_R32G32B32_FLOAT: 66 case DXGI_FORMAT_R32G32B32_UINT: 67 case DXGI_FORMAT_R32G32B32_SINT: 68 return size96; 69 case DXGI_FORMAT_R16G16B16A16_TYPELESS: 70 case DXGI_FORMAT_R16G16B16A16_FLOAT: 71 case DXGI_FORMAT_R16G16B16A16_UNORM: 72 case DXGI_FORMAT_R16G16B16A16_UINT: 73 case DXGI_FORMAT_R16G16B16A16_SNORM: 74 case DXGI_FORMAT_R16G16B16A16_SINT: 75 case DXGI_FORMAT_R32G32_TYPELESS: 76 case DXGI_FORMAT_R32G32_FLOAT: 77 case DXGI_FORMAT_R32G32_UINT: 78 case DXGI_FORMAT_R32G32_SINT: 79 case DXGI_FORMAT_R32G8X24_TYPELESS: 80 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 81 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: 82 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: 83 return size64; 84 case DXGI_FORMAT_R10G10B10A2_TYPELESS: 85 case DXGI_FORMAT_R10G10B10A2_UNORM: 86 case DXGI_FORMAT_R10G10B10A2_UINT: 87 case DXGI_FORMAT_R11G11B10_FLOAT: 88 case DXGI_FORMAT_R8G8B8A8_TYPELESS: 89 case DXGI_FORMAT_R8G8B8A8_UNORM: 90 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: 91 case DXGI_FORMAT_R8G8B8A8_UINT: 92 case DXGI_FORMAT_R8G8B8A8_SNORM: 93 case DXGI_FORMAT_R8G8B8A8_SINT: 94 case DXGI_FORMAT_R16G16_TYPELESS: 95 case DXGI_FORMAT_R16G16_FLOAT: 96 case DXGI_FORMAT_R16G16_UNORM: 97 case DXGI_FORMAT_R16G16_UINT: 98 case DXGI_FORMAT_R16G16_SNORM: 99 case DXGI_FORMAT_R16G16_SINT: 100 case DXGI_FORMAT_R32_TYPELESS: 101 case DXGI_FORMAT_D32_FLOAT: 102 case DXGI_FORMAT_R32_FLOAT: 103 case DXGI_FORMAT_R32_UINT: 104 case DXGI_FORMAT_R32_SINT: 105 case DXGI_FORMAT_R24G8_TYPELESS: 106 case DXGI_FORMAT_D24_UNORM_S8_UINT: 107 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: 108 case DXGI_FORMAT_X24_TYPELESS_G8_UINT: 109 return size32; 110 case DXGI_FORMAT_R8G8_TYPELESS: 111 case DXGI_FORMAT_R8G8_UNORM: 112 case DXGI_FORMAT_R8G8_UINT: 113 case DXGI_FORMAT_R8G8_SNORM: 114 case DXGI_FORMAT_R8G8_SINT: 115 case DXGI_FORMAT_R16_TYPELESS: 116 case DXGI_FORMAT_R16_FLOAT: 117 case DXGI_FORMAT_D16_UNORM: 118 case DXGI_FORMAT_R16_UNORM: 119 case DXGI_FORMAT_R16_UINT: 120 case DXGI_FORMAT_R16_SNORM: 121 case DXGI_FORMAT_R16_SINT: 122 return size16; 123 case DXGI_FORMAT_R8_TYPELESS: 124 case DXGI_FORMAT_R8_UNORM: 125 case DXGI_FORMAT_R8_UINT: 126 case DXGI_FORMAT_R8_SNORM: 127 case DXGI_FORMAT_R8_SINT: 128 case DXGI_FORMAT_A8_UNORM: 129 return size8; 130 case DXGI_FORMAT_R1_UNORM: 131 UNREACHABLE(); 132 return sizeUnknown; 133 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: 134 case DXGI_FORMAT_R8G8_B8G8_UNORM: 135 case DXGI_FORMAT_G8R8_G8B8_UNORM: 136 return size32; 137 case DXGI_FORMAT_BC1_TYPELESS: 138 case DXGI_FORMAT_BC1_UNORM: 139 case DXGI_FORMAT_BC1_UNORM_SRGB: 140 return sizeBC1; 141 case DXGI_FORMAT_BC2_TYPELESS: 142 case DXGI_FORMAT_BC2_UNORM: 143 case DXGI_FORMAT_BC2_UNORM_SRGB: 144 return sizeBC2; 145 case DXGI_FORMAT_BC3_TYPELESS: 146 case DXGI_FORMAT_BC3_UNORM: 147 case DXGI_FORMAT_BC3_UNORM_SRGB: 148 return sizeBC3; 149 case DXGI_FORMAT_BC4_TYPELESS: 150 case DXGI_FORMAT_BC4_UNORM: 151 case DXGI_FORMAT_BC4_SNORM: 152 return sizeBC4; 153 case DXGI_FORMAT_BC5_TYPELESS: 154 case DXGI_FORMAT_BC5_UNORM: 155 case DXGI_FORMAT_BC5_SNORM: 156 return sizeBC5; 157 case DXGI_FORMAT_B5G6R5_UNORM: 158 case DXGI_FORMAT_B5G5R5A1_UNORM: 159 return size16; 160 case DXGI_FORMAT_B8G8R8A8_UNORM: 161 case DXGI_FORMAT_B8G8R8X8_UNORM: 162 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: 163 case DXGI_FORMAT_B8G8R8A8_TYPELESS: 164 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: 165 case DXGI_FORMAT_B8G8R8X8_TYPELESS: 166 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: 167 return size32; 168 case DXGI_FORMAT_BC6H_TYPELESS: 169 case DXGI_FORMAT_BC6H_UF16: 170 case DXGI_FORMAT_BC6H_SF16: 171 return sizeBC6H; 172 case DXGI_FORMAT_BC7_TYPELESS: 173 case DXGI_FORMAT_BC7_UNORM: 174 case DXGI_FORMAT_BC7_UNORM_SRGB: 175 return sizeBC7; 176 case DXGI_FORMAT_AYUV: 177 case DXGI_FORMAT_Y410: 178 case DXGI_FORMAT_Y416: 179 case DXGI_FORMAT_NV12: 180 case DXGI_FORMAT_P010: 181 case DXGI_FORMAT_P016: 182 case DXGI_FORMAT_420_OPAQUE: 183 case DXGI_FORMAT_YUY2: 184 case DXGI_FORMAT_Y210: 185 case DXGI_FORMAT_Y216: 186 case DXGI_FORMAT_NV11: 187 case DXGI_FORMAT_AI44: 188 case DXGI_FORMAT_IA44: 189 case DXGI_FORMAT_P8: 190 case DXGI_FORMAT_A8P8: 191 UNREACHABLE(); 192 return sizeUnknown; 193 case DXGI_FORMAT_B4G4R4A4_UNORM: 194 return size16; 195 default: 196 UNREACHABLE(); 197 return sizeUnknown; 198 } 199 } 200 201 constexpr VertexFormat::VertexFormat() 202 : conversionType(VERTEX_CONVERT_NONE), nativeFormat(DXGI_FORMAT_UNKNOWN), copyFunction(nullptr) 203 {} 204 205 constexpr VertexFormat::VertexFormat(VertexConversionType conversionTypeIn, 206 DXGI_FORMAT nativeFormatIn, 207 VertexCopyFunction copyFunctionIn) 208 : conversionType(conversionTypeIn), nativeFormat(nativeFormatIn), copyFunction(copyFunctionIn) 209 {} 210 211 const VertexFormat *GetVertexFormatInfo_FL_9_3(angle::FormatID vertexFormatID) 212 { 213 // D3D11 Feature Level 9_3 doesn't support as many formats for vertex buffer resource as Feature 214 // Level 10_0+. 215 // http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324(v=vs.85).aspx 216 217 switch (vertexFormatID) 218 { 219 // GL_BYTE -- unnormalized 220 case angle::FormatID::R8_SSCALED: 221 { 222 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, 223 &Copy8SintTo16SintVertexData<1, 2>); 224 return &info; 225 } 226 case angle::FormatID::R8G8_SSCALED: 227 { 228 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, 229 &Copy8SintTo16SintVertexData<2, 2>); 230 return &info; 231 } 232 case angle::FormatID::R8G8B8_SSCALED: 233 { 234 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, 235 &Copy8SintTo16SintVertexData<3, 4>); 236 return &info; 237 } 238 case angle::FormatID::R8G8B8A8_SSCALED: 239 { 240 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, 241 &Copy8SintTo16SintVertexData<4, 4>); 242 return &info; 243 } 244 245 // GL_BYTE -- normalized 246 case angle::FormatID::R8_SNORM: 247 { 248 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, 249 &Copy8SnormTo16SnormVertexData<1, 2>); 250 return &info; 251 } 252 case angle::FormatID::R8G8_SNORM: 253 { 254 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, 255 &Copy8SnormTo16SnormVertexData<2, 2>); 256 return &info; 257 } 258 case angle::FormatID::R8G8B8_SNORM: 259 { 260 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, 261 &Copy8SnormTo16SnormVertexData<3, 4>); 262 return &info; 263 } 264 case angle::FormatID::R8G8B8A8_SNORM: 265 { 266 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, 267 &Copy8SnormTo16SnormVertexData<4, 4>); 268 return &info; 269 } 270 271 // GL_UNSIGNED_BYTE -- un-normalized 272 // NOTE: 3 and 4 component unnormalized GL_UNSIGNED_BYTE should use the default format 273 // table. 274 case angle::FormatID::R8_USCALED: 275 { 276 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, 277 &CopyNativeVertexData<GLubyte, 1, 4, 1>); 278 return &info; 279 } 280 case angle::FormatID::R8G8_USCALED: 281 { 282 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, 283 &CopyNativeVertexData<GLubyte, 2, 4, 1>); 284 return &info; 285 } 286 287 // GL_UNSIGNED_BYTE -- normalized 288 // NOTE: 3 and 4 component normalized GL_UNSIGNED_BYTE should use the default format table. 289 290 // GL_UNSIGNED_BYTE -- normalized 291 case angle::FormatID::R8_UNORM: 292 { 293 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, 294 &CopyNativeVertexData<GLubyte, 1, 4, UINT8_MAX>); 295 return &info; 296 } 297 case angle::FormatID::R8G8_UNORM: 298 { 299 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, 300 &CopyNativeVertexData<GLubyte, 2, 4, UINT8_MAX>); 301 return &info; 302 } 303 304 // GL_SHORT -- un-normalized 305 // NOTE: 2, 3 and 4 component unnormalized GL_SHORT should use the default format table. 306 case angle::FormatID::R16_SSCALED: 307 { 308 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT, 309 &CopyNativeVertexData<GLshort, 1, 2, 0>); 310 return &info; 311 } 312 313 // GL_SHORT -- normalized 314 // NOTE: 2, 3 and 4 component normalized GL_SHORT should use the default format table. 315 case angle::FormatID::R16_SNORM: 316 { 317 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM, 318 &CopyNativeVertexData<GLshort, 1, 2, 0>); 319 return &info; 320 } 321 322 // GL_UNSIGNED_SHORT -- un-normalized 323 case angle::FormatID::R16_USCALED: 324 { 325 static constexpr VertexFormat info( 326 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 327 &CopyToFloatVertexData<GLushort, 1, 2, false, false>); 328 return &info; 329 } 330 case angle::FormatID::R16G16_USCALED: 331 { 332 static constexpr VertexFormat info( 333 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 334 &CopyToFloatVertexData<GLushort, 2, 2, false, false>); 335 return &info; 336 } 337 case angle::FormatID::R16G16B16_USCALED: 338 { 339 static constexpr VertexFormat info( 340 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, 341 &CopyToFloatVertexData<GLushort, 3, 3, false, false>); 342 return &info; 343 } 344 case angle::FormatID::R16G16B16A16_USCALED: 345 { 346 static constexpr VertexFormat info( 347 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 348 &CopyToFloatVertexData<GLushort, 4, 4, false, false>); 349 return &info; 350 } 351 352 // GL_UNSIGNED_SHORT -- normalized 353 case angle::FormatID::R16_UNORM: 354 { 355 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 356 &CopyToFloatVertexData<GLushort, 1, 2, true, false>); 357 return &info; 358 } 359 case angle::FormatID::R16G16_UNORM: 360 { 361 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 362 &CopyToFloatVertexData<GLushort, 2, 2, true, false>); 363 return &info; 364 } 365 case angle::FormatID::R16G16B16_UNORM: 366 { 367 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, 368 &CopyToFloatVertexData<GLushort, 3, 3, true, false>); 369 return &info; 370 } 371 case angle::FormatID::R16G16B16A16_UNORM: 372 { 373 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 374 &CopyToFloatVertexData<GLushort, 4, 4, true, false>); 375 return &info; 376 } 377 378 // GL_FIXED 379 // TODO: Add test to verify that this works correctly. 380 // NOTE: 2, 3 and 4 component GL_FIXED should use the default format table. 381 case angle::FormatID::R32_FIXED: 382 { 383 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 384 &Copy32FixedTo32FVertexData<1, 2>); 385 return &info; 386 } 387 388 // GL_FLOAT 389 // TODO: Add test to verify that this works correctly. 390 // NOTE: 2, 3 and 4 component GL_FLOAT should use the default format table. 391 case angle::FormatID::R32_FLOAT: 392 { 393 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 394 &CopyNativeVertexData<GLfloat, 1, 2, 0>); 395 return &info; 396 } 397 398 default: 399 return nullptr; 400 } 401 } 402 403 const VertexFormat &GetVertexFormatInfo(angle::FormatID vertexFormatID, 404 D3D_FEATURE_LEVEL featureLevel) 405 { 406 if (featureLevel == D3D_FEATURE_LEVEL_9_3) 407 { 408 const VertexFormat *result = GetVertexFormatInfo_FL_9_3(vertexFormatID); 409 if (result) 410 { 411 return *result; 412 } 413 } 414 415 switch (vertexFormatID) 416 { 417 // 418 // Float formats 419 // 420 421 // GL_BYTE -- un-normalized 422 case angle::FormatID::R8_SSCALED: 423 { 424 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT, 425 &CopyNativeVertexData<GLbyte, 1, 1, 0>); 426 return info; 427 } 428 case angle::FormatID::R8G8_SSCALED: 429 { 430 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT, 431 &CopyNativeVertexData<GLbyte, 2, 2, 0>); 432 return info; 433 } 434 case angle::FormatID::R8G8B8_SSCALED: 435 { 436 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT, 437 &CopyNativeVertexData<GLbyte, 3, 4, 1>); 438 return info; 439 } 440 case angle::FormatID::R8G8B8A8_SSCALED: 441 { 442 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT, 443 &CopyNativeVertexData<GLbyte, 4, 4, 0>); 444 return info; 445 } 446 447 // GL_BYTE -- normalized 448 case angle::FormatID::R8_SNORM: 449 { 450 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM, 451 &CopyNativeVertexData<GLbyte, 1, 1, 0>); 452 return info; 453 } 454 case angle::FormatID::R8G8_SNORM: 455 { 456 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM, 457 &CopyNativeVertexData<GLbyte, 2, 2, 0>); 458 return info; 459 } 460 case angle::FormatID::R8G8B8_SNORM: 461 { 462 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM, 463 &CopyNativeVertexData<GLbyte, 3, 4, INT8_MAX>); 464 return info; 465 } 466 case angle::FormatID::R8G8B8A8_SNORM: 467 { 468 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM, 469 &CopyNativeVertexData<GLbyte, 4, 4, 0>); 470 return info; 471 } 472 473 // GL_UNSIGNED_BYTE -- un-normalized 474 case angle::FormatID::R8_USCALED: 475 { 476 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT, 477 &CopyNativeVertexData<GLubyte, 1, 1, 0>); 478 return info; 479 } 480 case angle::FormatID::R8G8_USCALED: 481 { 482 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT, 483 &CopyNativeVertexData<GLubyte, 2, 2, 0>); 484 return info; 485 } 486 case angle::FormatID::R8G8B8_USCALED: 487 { 488 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, 489 &CopyNativeVertexData<GLubyte, 3, 4, 1>); 490 return info; 491 } 492 case angle::FormatID::R8G8B8A8_USCALED: 493 { 494 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT, 495 &CopyNativeVertexData<GLubyte, 4, 4, 0>); 496 return info; 497 } 498 499 // GL_UNSIGNED_BYTE -- normalized 500 case angle::FormatID::R8_UNORM: 501 { 502 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM, 503 &CopyNativeVertexData<GLubyte, 1, 1, 0>); 504 return info; 505 } 506 case angle::FormatID::R8G8_UNORM: 507 { 508 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM, 509 &CopyNativeVertexData<GLubyte, 2, 2, 0>); 510 return info; 511 } 512 case angle::FormatID::R8G8B8_UNORM: 513 { 514 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, 515 &CopyNativeVertexData<GLubyte, 3, 4, UINT8_MAX>); 516 return info; 517 } 518 case angle::FormatID::R8G8B8A8_UNORM: 519 { 520 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM, 521 &CopyNativeVertexData<GLubyte, 4, 4, 0>); 522 return info; 523 } 524 525 // GL_SHORT -- un-normalized 526 case angle::FormatID::R16_SSCALED: 527 { 528 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT, 529 &CopyNativeVertexData<GLshort, 1, 1, 0>); 530 return info; 531 } 532 case angle::FormatID::R16G16_SSCALED: 533 { 534 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT, 535 &CopyNativeVertexData<GLshort, 2, 2, 0>); 536 return info; 537 } 538 case angle::FormatID::R16G16B16_SSCALED: 539 { 540 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, 541 &CopyNativeVertexData<GLshort, 3, 4, 1>); 542 return info; 543 } 544 case angle::FormatID::R16G16B16A16_SSCALED: 545 { 546 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT, 547 &CopyNativeVertexData<GLshort, 4, 4, 0>); 548 return info; 549 } 550 551 // GL_SHORT -- normalized 552 case angle::FormatID::R16_SNORM: 553 { 554 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM, 555 &CopyNativeVertexData<GLshort, 1, 1, 0>); 556 return info; 557 } 558 case angle::FormatID::R16G16_SNORM: 559 { 560 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM, 561 &CopyNativeVertexData<GLshort, 2, 2, 0>); 562 return info; 563 } 564 case angle::FormatID::R16G16B16_SNORM: 565 { 566 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, 567 &CopyNativeVertexData<GLshort, 3, 4, INT16_MAX>); 568 return info; 569 } 570 case angle::FormatID::R16G16B16A16_SNORM: 571 { 572 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, 573 &CopyNativeVertexData<GLshort, 4, 4, 0>); 574 return info; 575 } 576 577 // GL_UNSIGNED_SHORT -- un-normalized 578 case angle::FormatID::R16_USCALED: 579 { 580 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT, 581 &CopyNativeVertexData<GLushort, 1, 1, 0>); 582 return info; 583 } 584 case angle::FormatID::R16G16_USCALED: 585 { 586 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT, 587 &CopyNativeVertexData<GLushort, 2, 2, 0>); 588 return info; 589 } 590 case angle::FormatID::R16G16B16_USCALED: 591 { 592 static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT, 593 &CopyNativeVertexData<GLushort, 3, 4, 1>); 594 return info; 595 } 596 case angle::FormatID::R16G16B16A16_USCALED: 597 { 598 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT, 599 &CopyNativeVertexData<GLushort, 4, 4, 0>); 600 return info; 601 } 602 603 // GL_UNSIGNED_SHORT -- normalized 604 case angle::FormatID::R16_UNORM: 605 { 606 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM, 607 &CopyNativeVertexData<GLushort, 1, 1, 0>); 608 return info; 609 } 610 case angle::FormatID::R16G16_UNORM: 611 { 612 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM, 613 &CopyNativeVertexData<GLushort, 2, 2, 0>); 614 return info; 615 } 616 case angle::FormatID::R16G16B16_UNORM: 617 { 618 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM, 619 &CopyNativeVertexData<GLushort, 3, 4, UINT16_MAX>); 620 return info; 621 } 622 case angle::FormatID::R16G16B16A16_UNORM: 623 { 624 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, 625 &CopyNativeVertexData<GLushort, 4, 4, 0>); 626 return info; 627 } 628 629 // GL_INT -- un-normalized 630 case angle::FormatID::R32_SSCALED: 631 { 632 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT, 633 &CopyNativeVertexData<GLint, 1, 1, 0>); 634 return info; 635 } 636 case angle::FormatID::R32G32_SSCALED: 637 { 638 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT, 639 &CopyNativeVertexData<GLint, 2, 2, 0>); 640 return info; 641 } 642 case angle::FormatID::R32G32B32_SSCALED: 643 { 644 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT, 645 &CopyNativeVertexData<GLint, 3, 3, 0>); 646 return info; 647 } 648 case angle::FormatID::R32G32B32A32_SSCALED: 649 { 650 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT, 651 &CopyNativeVertexData<GLint, 4, 4, 0>); 652 return info; 653 } 654 655 // GL_INT -- normalized 656 case angle::FormatID::R32_SNORM: 657 { 658 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, 659 &CopyToFloatVertexData<GLint, 1, 1, true, false>); 660 return info; 661 } 662 case angle::FormatID::R32G32_SNORM: 663 { 664 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 665 &CopyToFloatVertexData<GLint, 2, 2, true, false>); 666 return info; 667 } 668 case angle::FormatID::R32G32B32_SNORM: 669 { 670 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, 671 &CopyToFloatVertexData<GLint, 3, 3, true, false>); 672 return info; 673 } 674 case angle::FormatID::R32G32B32A32_SNORM: 675 { 676 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 677 &CopyToFloatVertexData<GLint, 4, 4, true, false>); 678 return info; 679 } 680 681 // GL_UNSIGNED_INT -- un-normalized 682 case angle::FormatID::R32_USCALED: 683 { 684 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT, 685 &CopyNativeVertexData<GLuint, 1, 1, 0>); 686 return info; 687 } 688 case angle::FormatID::R32G32_USCALED: 689 { 690 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT, 691 &CopyNativeVertexData<GLuint, 2, 2, 0>); 692 return info; 693 } 694 case angle::FormatID::R32G32B32_USCALED: 695 { 696 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT, 697 &CopyNativeVertexData<GLuint, 3, 3, 0>); 698 return info; 699 } 700 case angle::FormatID::R32G32B32A32_USCALED: 701 { 702 static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT, 703 &CopyNativeVertexData<GLuint, 4, 4, 0>); 704 return info; 705 } 706 707 // GL_UNSIGNED_INT -- normalized 708 case angle::FormatID::R32_UNORM: 709 { 710 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, 711 &CopyToFloatVertexData<GLuint, 1, 1, true, false>); 712 return info; 713 } 714 case angle::FormatID::R32G32_UNORM: 715 { 716 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 717 &CopyToFloatVertexData<GLuint, 2, 2, true, false>); 718 return info; 719 } 720 case angle::FormatID::R32G32B32_UNORM: 721 { 722 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, 723 &CopyToFloatVertexData<GLuint, 3, 3, true, false>); 724 return info; 725 } 726 case angle::FormatID::R32G32B32A32_UNORM: 727 { 728 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 729 &CopyToFloatVertexData<GLuint, 4, 4, true, false>); 730 return info; 731 } 732 733 // GL_FIXED 734 case angle::FormatID::R32_FIXED: 735 { 736 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, 737 &Copy32FixedTo32FVertexData<1, 1>); 738 return info; 739 } 740 case angle::FormatID::R32G32_FIXED: 741 { 742 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, 743 &Copy32FixedTo32FVertexData<2, 2>); 744 return info; 745 } 746 case angle::FormatID::R32G32B32_FIXED: 747 { 748 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, 749 &Copy32FixedTo32FVertexData<3, 3>); 750 return info; 751 } 752 case angle::FormatID::R32G32B32A32_FIXED: 753 { 754 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 755 &Copy32FixedTo32FVertexData<4, 4>); 756 return info; 757 } 758 759 // GL_HALF_FLOAT 760 case angle::FormatID::R16_FLOAT: 761 { 762 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT, 763 &CopyNativeVertexData<GLhalf, 1, 1, 0>); 764 return info; 765 } 766 case angle::FormatID::R16G16_FLOAT: 767 { 768 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT, 769 &CopyNativeVertexData<GLhalf, 2, 2, 0>); 770 return info; 771 } 772 case angle::FormatID::R16G16B16_FLOAT: 773 { 774 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT, 775 &CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>); 776 return info; 777 } 778 case angle::FormatID::R16G16B16A16_FLOAT: 779 { 780 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, 781 &CopyNativeVertexData<GLhalf, 4, 4, 0>); 782 return info; 783 } 784 785 // GL_FLOAT 786 case angle::FormatID::R32_FLOAT: 787 { 788 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT, 789 &CopyNativeVertexData<GLfloat, 1, 1, 0>); 790 return info; 791 } 792 case angle::FormatID::R32G32_FLOAT: 793 { 794 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT, 795 &CopyNativeVertexData<GLfloat, 2, 2, 0>); 796 return info; 797 } 798 case angle::FormatID::R32G32B32_FLOAT: 799 { 800 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT, 801 &CopyNativeVertexData<GLfloat, 3, 3, 0>); 802 return info; 803 } 804 case angle::FormatID::R32G32B32A32_FLOAT: 805 { 806 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, 807 &CopyNativeVertexData<GLfloat, 4, 4, 0>); 808 return info; 809 } 810 811 // GL_INT_2_10_10_10_REV 812 case angle::FormatID::R10G10B10A2_SSCALED: 813 { 814 static constexpr VertexFormat info( 815 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 816 &CopyXYZ10W2ToXYZWFloatVertexData<true, false, true, false>); 817 return info; 818 } 819 case angle::FormatID::R10G10B10A2_SNORM: 820 { 821 static constexpr VertexFormat info( 822 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 823 &CopyXYZ10W2ToXYZWFloatVertexData<true, true, true, false>); 824 return info; 825 } 826 827 // GL_UNSIGNED_INT_2_10_10_10_REV 828 case angle::FormatID::R10G10B10A2_USCALED: 829 { 830 static constexpr VertexFormat info( 831 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, 832 &CopyXYZ10W2ToXYZWFloatVertexData<false, false, true, false>); 833 return info; 834 } 835 case angle::FormatID::R10G10B10A2_UNORM: 836 { 837 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM, 838 &CopyNativeVertexData<GLuint, 1, 1, 0>); 839 return info; 840 } 841 842 // 843 // Integer Formats 844 // 845 846 // GL_BYTE 847 case angle::FormatID::R8_SINT: 848 { 849 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT, 850 &CopyNativeVertexData<GLbyte, 1, 1, 0>); 851 return info; 852 } 853 case angle::FormatID::R8G8_SINT: 854 { 855 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT, 856 &CopyNativeVertexData<GLbyte, 2, 2, 0>); 857 return info; 858 } 859 case angle::FormatID::R8G8B8_SINT: 860 { 861 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT, 862 &CopyNativeVertexData<GLbyte, 3, 4, 1>); 863 return info; 864 } 865 case angle::FormatID::R8G8B8A8_SINT: 866 { 867 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT, 868 &CopyNativeVertexData<GLbyte, 4, 4, 0>); 869 return info; 870 } 871 872 // GL_UNSIGNED_BYTE 873 case angle::FormatID::R8_UINT: 874 { 875 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT, 876 &CopyNativeVertexData<GLubyte, 1, 1, 0>); 877 return info; 878 } 879 case angle::FormatID::R8G8_UINT: 880 { 881 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT, 882 &CopyNativeVertexData<GLubyte, 2, 2, 0>); 883 return info; 884 } 885 case angle::FormatID::R8G8B8_UINT: 886 { 887 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT, 888 &CopyNativeVertexData<GLubyte, 3, 4, 1>); 889 return info; 890 } 891 case angle::FormatID::R8G8B8A8_UINT: 892 { 893 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT, 894 &CopyNativeVertexData<GLubyte, 4, 4, 0>); 895 return info; 896 } 897 898 // GL_SHORT 899 case angle::FormatID::R16_SINT: 900 { 901 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT, 902 &CopyNativeVertexData<GLshort, 1, 1, 0>); 903 return info; 904 } 905 case angle::FormatID::R16G16_SINT: 906 { 907 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT, 908 &CopyNativeVertexData<GLshort, 2, 2, 0>); 909 return info; 910 } 911 case angle::FormatID::R16G16B16_SINT: 912 { 913 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, 914 &CopyNativeVertexData<GLshort, 3, 4, 1>); 915 return info; 916 } 917 case angle::FormatID::R16G16B16A16_SINT: 918 { 919 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT, 920 &CopyNativeVertexData<GLshort, 4, 4, 0>); 921 return info; 922 } 923 924 // GL_UNSIGNED_SHORT 925 case angle::FormatID::R16_UINT: 926 { 927 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT, 928 &CopyNativeVertexData<GLushort, 1, 1, 0>); 929 return info; 930 } 931 case angle::FormatID::R16G16_UINT: 932 { 933 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT, 934 &CopyNativeVertexData<GLushort, 2, 2, 0>); 935 return info; 936 } 937 case angle::FormatID::R16G16B16_UINT: 938 { 939 static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT, 940 &CopyNativeVertexData<GLushort, 3, 4, 1>); 941 return info; 942 } 943 case angle::FormatID::R16G16B16A16_UINT: 944 { 945 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT, 946 &CopyNativeVertexData<GLushort, 4, 4, 0>); 947 return info; 948 } 949 950 // GL_INT 951 case angle::FormatID::R32_SINT: 952 { 953 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, 954 &CopyNativeVertexData<GLint, 1, 1, 0>); 955 return info; 956 } 957 case angle::FormatID::R32G32_SINT: 958 { 959 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, 960 &CopyNativeVertexData<GLint, 2, 2, 0>); 961 return info; 962 } 963 case angle::FormatID::R32G32B32_SINT: 964 { 965 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, 966 &CopyNativeVertexData<GLint, 3, 3, 0>); 967 return info; 968 } 969 case angle::FormatID::R32G32B32A32_SINT: 970 { 971 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, 972 &CopyNativeVertexData<GLint, 4, 4, 0>); 973 return info; 974 } 975 976 // GL_UNSIGNED_INT 977 case angle::FormatID::R32_UINT: 978 { 979 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, 980 &CopyNativeVertexData<GLuint, 1, 1, 0>); 981 return info; 982 } 983 case angle::FormatID::R32G32_UINT: 984 { 985 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, 986 &CopyNativeVertexData<GLuint, 2, 2, 0>); 987 return info; 988 } 989 case angle::FormatID::R32G32B32_UINT: 990 { 991 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, 992 &CopyNativeVertexData<GLuint, 3, 3, 0>); 993 return info; 994 } 995 case angle::FormatID::R32G32B32A32_UINT: 996 { 997 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, 998 &CopyNativeVertexData<GLuint, 4, 4, 0>); 999 return info; 1000 } 1001 1002 // GL_INT_2_10_10_10_REV 1003 case angle::FormatID::R10G10B10A2_SINT: 1004 { 1005 static constexpr VertexFormat info( 1006 VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, 1007 &CopyXYZ10W2ToXYZWFloatVertexData<true, true, false, false>); 1008 return info; 1009 } 1010 1011 // GL_UNSIGNED_INT_2_10_10_10_REV 1012 case angle::FormatID::R10G10B10A2_UINT: 1013 { 1014 static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, 1015 &CopyNativeVertexData<GLuint, 1, 1, 0>); 1016 return info; 1017 } 1018 1019 default: 1020 { 1021 static constexpr VertexFormat info; 1022 return info; 1023 } 1024 } 1025 } 1026 1027 } // namespace d3d11 1028 1029 } // namespace rx