@@ -107,6 +107,7 @@ void test_check_feature_support(void)
107
107
108
108
static const D3D_FEATURE_LEVEL all_feature_levels [] =
109
109
{
110
+ D3D_FEATURE_LEVEL_12_2 ,
110
111
D3D_FEATURE_LEVEL_12_1 ,
111
112
D3D_FEATURE_LEVEL_12_0 ,
112
113
D3D_FEATURE_LEVEL_11_1 ,
@@ -119,6 +120,7 @@ void test_check_feature_support(void)
119
120
};
120
121
static const D3D_FEATURE_LEVEL d3d12_feature_levels [] =
121
122
{
123
+ D3D_FEATURE_LEVEL_12_2 ,
122
124
D3D_FEATURE_LEVEL_12_1 ,
123
125
D3D_FEATURE_LEVEL_12_0 ,
124
126
D3D_FEATURE_LEVEL_11_1 ,
@@ -336,11 +338,96 @@ static const DXGI_FORMAT depth_stencil_formats[] =
336
338
void test_format_support (void )
337
339
{
338
340
D3D12_FEATURE_DATA_FORMAT_SUPPORT format_support ;
341
+ D3D12_FEATURE_DATA_FEATURE_LEVELS feature_levels ;
342
+ bool required_but_fails ;
343
+ bool unspecified_format ;
344
+ bool optional_format ;
339
345
ID3D12Device * device ;
346
+ DXGI_FORMAT format ;
340
347
ULONG refcount ;
341
348
unsigned int i ;
342
349
HRESULT hr ;
343
350
351
+ static const DXGI_FORMAT known_required_but_fails [] =
352
+ {
353
+ DXGI_FORMAT_R8G8_B8G8_UNORM ,
354
+ DXGI_FORMAT_G8R8_G8B8_UNORM ,
355
+ DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM ,
356
+ DXGI_FORMAT_NV12 ,
357
+ DXGI_FORMAT_420_OPAQUE ,
358
+ DXGI_FORMAT_YUY2 ,
359
+ };
360
+
361
+ #define MAX_FORMAT_VALUE DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE
362
+
363
+ const struct dxgi_format_list
364
+ {
365
+ D3D_FEATURE_LEVEL feature_level ;
366
+ DXGI_FORMAT optional_formats [MAX_FORMAT_VALUE ];
367
+ DXGI_FORMAT unspecified_formats [MAX_FORMAT_VALUE ];
368
+ } * dxgi_format , dxgi_format_list [] = {
369
+ /*
370
+ https://devblogs.microsoft.com/directx/new-in-directx-feature-level-12_2/
371
+ https://microsoft.github.io/DirectX-Specs/d3d/SamplerFeedback.html
372
+ */
373
+ {D3D_FEATURE_LEVEL_12_2 ,
374
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 ,
375
+ DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
376
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_B4G4R4A4_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 }},
377
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/hardware-support-for-direct3d-12-1-formats.md */
378
+ {D3D_FEATURE_LEVEL_12_1 ,
379
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 ,
380
+ DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
381
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_B4G4R4A4_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
382
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
383
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/hardware-support-for-direct3d-12-0-formats.md */
384
+ {D3D_FEATURE_LEVEL_12_0 ,
385
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 ,
386
+ DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
387
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
388
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
389
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/format-support-for-direct3d-11-1-feature-level-hardware.md */
390
+ {D3D_FEATURE_LEVEL_11_1 ,
391
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 ,
392
+ DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
393
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
394
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
395
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware.md */
396
+ {D3D_FEATURE_LEVEL_11_0 ,
397
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 ,
398
+ DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
399
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
400
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
401
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/format-support-for-direct3d-feature-level-10-1-hardware.md */
402
+ {D3D_FEATURE_LEVEL_10_1 ,
403
+ {DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 , DXGI_FORMAT_Y210 ,
404
+ DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 , DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
405
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
406
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
407
+ /* https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/direct3ddxgi/format-support-for-direct3d-feature-level-10-1-hardware.md */
408
+ {D3D_FEATURE_LEVEL_10_0 ,
409
+ {DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM , DXGI_FORMAT_AYUV , DXGI_FORMAT_Y410 , DXGI_FORMAT_Y416 , DXGI_FORMAT_P010 , DXGI_FORMAT_P016 ,
410
+ DXGI_FORMAT_Y210 , DXGI_FORMAT_Y216 , DXGI_FORMAT_NV11 , DXGI_FORMAT_AI44 , DXGI_FORMAT_IA44 , DXGI_FORMAT_P8 , DXGI_FORMAT_A8P8 },
411
+ {DXGI_FORMAT_R1_UNORM , DXGI_FORMAT_P208 , DXGI_FORMAT_V208 , DXGI_FORMAT_V408 ,
412
+ DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE , DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE }},
413
+ };
414
+
415
+ #undef MAX_FORMAT_VALUE
416
+
417
+ static const D3D_FEATURE_LEVEL all_feature_levels [] =
418
+ {
419
+ D3D_FEATURE_LEVEL_12_2 ,
420
+ D3D_FEATURE_LEVEL_12_1 ,
421
+ D3D_FEATURE_LEVEL_12_0 ,
422
+ D3D_FEATURE_LEVEL_11_1 ,
423
+ D3D_FEATURE_LEVEL_11_0 ,
424
+ D3D_FEATURE_LEVEL_10_1 ,
425
+ D3D_FEATURE_LEVEL_10_0 ,
426
+ D3D_FEATURE_LEVEL_9_3 ,
427
+ D3D_FEATURE_LEVEL_9_2 ,
428
+ D3D_FEATURE_LEVEL_9_1 ,
429
+ };
430
+
344
431
if (!(device = create_device ()))
345
432
{
346
433
skip ("Failed to create device.\n" );
@@ -356,14 +443,88 @@ void test_format_support(void)
356
443
ok (!format_support .Support2 || format_support .Support2 == D3D12_FORMAT_SUPPORT2_TILED ,
357
444
"Got unexpected support2 %#x.\n" , format_support .Support2 );
358
445
359
- for (i = 0 ; i < ARRAY_SIZE (depth_stencil_formats ); ++ i )
446
+ memset (& feature_levels , 0 , sizeof (feature_levels ));
447
+ feature_levels .NumFeatureLevels = ARRAY_SIZE (all_feature_levels );
448
+ feature_levels .pFeatureLevelsRequested = all_feature_levels ;
449
+ hr = ID3D12Device_CheckFeatureSupport (device , D3D12_FEATURE_FEATURE_LEVELS ,
450
+ & feature_levels , sizeof (feature_levels ));
451
+ ok (hr == S_OK , "Got unexpected hr %#x.\n" , hr );
452
+
453
+ for (i = 0 ; i < ARRAY_SIZE (dxgi_format_list ); ++ i )
360
454
{
455
+ if (dxgi_format_list [i ].feature_level == feature_levels .MaxSupportedFeatureLevel )
456
+ {
457
+ dxgi_format = & dxgi_format_list [i ];
458
+ break ;
459
+ }
460
+ }
461
+
462
+ for (format = 0 ; format <= DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE ; ++ format )
463
+ {
464
+ /* Undefined range, skip */
465
+ if ((format > DXGI_FORMAT_B4G4R4A4_UNORM && format < DXGI_FORMAT_P208 ) ||
466
+ (format > DXGI_FORMAT_V408 && format < DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE ))
467
+ continue ;
468
+
469
+ vkd3d_test_set_context ("format %#x" , format );
470
+
471
+ required_but_fails = false;
472
+ unspecified_format = false;
473
+ optional_format = false;
474
+
475
+ for (i = 0 ; i < ARRAY_SIZE (known_required_but_fails ); ++ i )
476
+ {
477
+ if (known_required_but_fails [i ] == format )
478
+ {
479
+ required_but_fails = true;
480
+ break ;
481
+ }
482
+ }
483
+
484
+ if (!required_but_fails )
485
+ {
486
+ /* Check if the format is unspecified or optional */
487
+ for (i = 0 ; i < ARRAY_SIZE (dxgi_format -> unspecified_formats ); ++ i )
488
+ {
489
+ /* Fixed size list with only part of the list filled */
490
+ if (dxgi_format -> unspecified_formats [i ] == DXGI_FORMAT_UNKNOWN )
491
+ break ;
492
+ if (dxgi_format -> unspecified_formats [i ] == format )
493
+ {
494
+ unspecified_format = true;
495
+ break ;
496
+ }
497
+ }
498
+
499
+ if (!unspecified_format )
500
+ {
501
+ for (i = 0 ; i < ARRAY_SIZE (dxgi_format -> optional_formats ); ++ i )
502
+ {
503
+ /* Fixed size list with only part of the list filled */
504
+ if (dxgi_format -> optional_formats [i ] == DXGI_FORMAT_UNKNOWN )
505
+ break ;
506
+ if (dxgi_format -> optional_formats [i ] == format )
507
+ {
508
+ optional_format = true;
509
+ break ;
510
+ }
511
+ }
512
+ }
513
+ }
514
+
361
515
memset (& format_support , 0 , sizeof (format_support ));
362
- format_support .Format = depth_stencil_formats [ i ] ;
516
+ format_support .Format = format ;
363
517
hr = ID3D12Device_CheckFeatureSupport (device , D3D12_FEATURE_FORMAT_SUPPORT ,
364
518
& format_support , sizeof (format_support ));
365
- ok (hr == S_OK , "Got unexpected hr %#x.\n" , hr );
519
+
520
+ if (unspecified_format )
521
+ ok (hr == S_OK || hr == E_FAIL , "Unspecified format %d got unexpected hr %#x.\n" , format , hr );
522
+ else if (optional_format )
523
+ ok (hr == S_OK || hr == E_FAIL , "Optional format %d got unexpected hr %#x.\n" , format , hr );
524
+ else
525
+ todo_if (required_but_fails ) ok (hr == S_OK , "Format %d got unexpected hr %#x.\n" , format , hr );
366
526
}
527
+ vkd3d_test_set_context (NULL );
367
528
368
529
refcount = ID3D12Device_Release (device );
369
530
ok (!refcount , "ID3D12Device has %u references left.\n" , (unsigned int )refcount );
0 commit comments