aboutsummaryrefslogtreecommitdiff
path: root/contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-12-02 16:39:36 -0800
committer3gg <3gg@shellblade.net>2025-12-02 16:39:36 -0800
commit6c8ae19be66cee247980a48e736a4e05d14de179 (patch)
treed860767907bf0cbe17ec66422e11bea700cf56d9 /contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp
parent8f594c8ebd11f0e5f8a0c6369c3fe7383d250cbe (diff)
Immediate-mode renderer, triangle demo, shader compilation in cmake, Agility SDKHEADmain
Diffstat (limited to 'contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp')
-rw-r--r--contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp729
1 files changed, 729 insertions, 0 deletions
diff --git a/contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp b/contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp
new file mode 100644
index 0000000..3df3774
--- /dev/null
+++ b/contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp
@@ -0,0 +1,729 @@
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#include <wsl/winadapter.h>
5
6#include <iostream>
7#include <directx/d3d12.h>
8#include <directx/dxcore.h>
9#include <directx/d3dx12.h>
10#include "dxguids/dxguids.h"
11
12#include <wrl/client.h>
13
14// -----------------------------------------------------------------------------------------------------------------
15// Helper Macros for verifying feature check results
16// -----------------------------------------------------------------------------------------------------------------
17
18// Verifies the correctness of a feature check that should not fail
19#define VERIFY_FEATURE_CHECK_NO_DEFAULT(Feature) \
20{ \
21 if (features.Feature() != Data.Feature) \
22 { \
23 std::cout << "Verification failed: " << #Feature << std::endl \
24 << "Old API: " << Data.Feature << std::endl \
25 << "New API: " << features.Feature() << std::endl; \
26 return -1; \
27 } \
28}
29
30// Verifies the return value from a feature check with a different name from the old API that should not fail
31#define VERIFY_RENAMED_FEATURE_CHECK_NO_DEFAULT(NewFeature, OldFeature) \
32{ \
33 if (features.NewFeature() != Data.OldFeature) \
34 { \
35 std::cout << "Verification failed: " << #NewFeature << std::endl \
36 << "Old API: " << Data.OldFeature << std::endl \
37 << "New API: " << features.NewFeature() << std::endl; \
38 return -1; \
39 } \
40}
41
42// Verifies if the feature check returns the correct default value upon failure
43#define VERIFY_DEFAULT(Feature, Default) \
44{ \
45 if (features.Feature() != Default) \
46 { \
47 std::cout << "Verification failed: " << #Feature << std::endl \
48 << "Default: " << Default << std::endl \
49 << "Actual: " << features.Feature() << std::endl; \
50 return -1; \
51 } \
52}
53
54// Verifies the result of a feature check.
55// If the feature check failed because it's not supported by runtime, ensures that it returns the default value
56#define VERIFY_FEATURE_CHECK(Feature, Default) \
57{ \
58 if (FAILED(InitResult)) \
59 { \
60 VERIFY_DEFAULT(Feature, Default); \
61 } \
62 else \
63 { \
64 VERIFY_FEATURE_CHECK_NO_DEFAULT(Feature); \
65 } \
66}
67
68// Verifies the result of a feature check. The requested capability may have a different name in the new API
69// If the feature check failed because it's not supported by runtime, ensures that it returns the default value
70#define VERIFY_RENAMED_FEATURE_CHECK(Feature, OldName, Default) \
71{ \
72 if (FAILED(InitResult)) \
73 { \
74 VERIFY_DEFAULT(Feature, Default); \
75 } \
76 else \
77 { \
78 VERIFY_RENAMED_FEATURE_CHECK_NO_DEFAULT(Feature, OldName); \
79 } \
80}
81
82// Initialize the feature support data structure to be used in the original CheckFeatureSupport API
83#define INITIALIZE_FEATURE_SUPPORT_DATA(FeatureName) \
84HRESULT InitResult; \
85if (FAILED(InitResult = device->CheckFeatureSupport(D3D12_FEATURE_##FeatureName, &Data, sizeof(D3D12_FEATURE_DATA_##FeatureName)))) \
86{ \
87 std::cout << "Feature not supported by device: " << #FeatureName << std::endl; \
88}
89
90// Prints out the mismatched feature check result to stdout
91#define PRINT_CHECK_FAILED_MESSAGE(FeatureName, OldFeature, NewFeature) \
92std::cout << "Verification failed: " << #FeatureName << std::endl \
93 << "Old API: " << OldFeature << std::endl \
94 << "New API: " << NewFeature << std::endl;
95
96
97using namespace Microsoft::WRL;
98
99// To get property value from adapter
100std::vector<char> get_adapter_property(ComPtr<IDXCoreAdapter> adapter, DXCoreAdapterProperty property)
101{
102 if (adapter->IsPropertySupported(property))
103 {
104 size_t len;
105 if(FAILED(adapter->GetPropertySize(property, &len)))
106 {
107 return {};
108 }
109 std::vector<char> buf(len);
110 if(FAILED(adapter->GetProperty(property, len, buf.data())))
111 {
112 return {};
113 }
114 return buf;
115 }
116 return {};
117}
118
119// To get driver description for display before test
120std::string get_driver_description(ComPtr<IDXCoreAdapter> adapter)
121{
122 auto rs = get_adapter_property(adapter, DXCoreAdapterProperty::DriverDescription);
123 std::string name(rs.data());
124 return name;
125}
126
127// -----------------------------------------------------------------------------------------------------------------
128// Run tests on a specific device which is created from the input adapter
129// -----------------------------------------------------------------------------------------------------------------
130int run_per_adapter(IUnknown* adapter)
131{
132 ID3D12Device *device = nullptr;
133
134 if (FAILED(D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device))))
135 {
136 return -1;
137 }
138
139 // Initialize the new FeatureSupport class
140 // Notice that it is shared among all feature checks
141 CD3DX12FeatureSupport features;
142 if (FAILED(features.Init(device)))
143 {
144 return -1;
145 }
146
147 UINT NodeCount = device->GetNodeCount();
148
149 // Each feature comes with two code sections
150 // The first section shows how to use the API's of the new FeautreSupport class
151 // The second section contains tests that ensures the new API returns the same result as the old API
152 // 0: D3D12_OPTIONS
153 {
154 BOOL DoublePrecisionFloatShaderOps = features.DoublePrecisionFloatShaderOps();
155 BOOL OutputMergerLogicOp = features.OutputMergerLogicOp();
156 D3D12_TILED_RESOURCES_TIER TiledResourceTier = features.TiledResourcesTier();
157 D3D12_RESOURCE_BINDING_TIER ResourceBindingTier = features.ResourceBindingTier();
158 BOOL PSSpecifiedStencilRefSupported = features.PSSpecifiedStencilRefSupported();
159 BOOL TypedUAVLoadAdditionalFormats = features.TypedUAVLoadAdditionalFormats();
160 BOOL ROVsSupported = features.ROVsSupported();
161 D3D12_CONSERVATIVE_RASTERIZATION_TIER ConservativeRasterizationTier = features.ConservativeRasterizationTier();
162 BOOL StandardSwizzle64KBSupported = features.StandardSwizzle64KBSupported();
163 BOOL CrossAdapterRowMajorTextureSupported = features.CrossAdapterRowMajorTextureSupported();
164 BOOL VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation = features.VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation();
165 D3D12_RESOURCE_HEAP_TIER ResourceHeapTier = features.ResourceHeapTier();
166 D3D12_CROSS_NODE_SHARING_TIER CrossNodeSharingTier = features.CrossNodeSharingTier();
167 UINT MaxGPUVirtualAddressBitsPerResource = features.MaxGPUVirtualAddressBitsPerResource();
168
169 D3D12_FEATURE_DATA_D3D12_OPTIONS Data = {};
170 device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &Data, sizeof(D3D12_FEATURE_DATA_D3D12_OPTIONS));
171 VERIFY_FEATURE_CHECK_NO_DEFAULT(DoublePrecisionFloatShaderOps);
172 VERIFY_FEATURE_CHECK_NO_DEFAULT(OutputMergerLogicOp);
173 VERIFY_FEATURE_CHECK_NO_DEFAULT(TiledResourcesTier);
174 VERIFY_FEATURE_CHECK_NO_DEFAULT(ResourceBindingTier);
175 VERIFY_FEATURE_CHECK_NO_DEFAULT(PSSpecifiedStencilRefSupported);
176 VERIFY_FEATURE_CHECK_NO_DEFAULT(TypedUAVLoadAdditionalFormats);
177 VERIFY_FEATURE_CHECK_NO_DEFAULT(ROVsSupported);
178 VERIFY_FEATURE_CHECK_NO_DEFAULT(ConservativeRasterizationTier);
179 VERIFY_FEATURE_CHECK_NO_DEFAULT(StandardSwizzle64KBSupported);
180 VERIFY_FEATURE_CHECK_NO_DEFAULT(CrossAdapterRowMajorTextureSupported);
181 VERIFY_FEATURE_CHECK_NO_DEFAULT(VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation);
182 VERIFY_FEATURE_CHECK_NO_DEFAULT(ResourceHeapTier);
183 VERIFY_FEATURE_CHECK_NO_DEFAULT(CrossNodeSharingTier);
184 VERIFY_FEATURE_CHECK_NO_DEFAULT(MaxGPUVirtualAddressBitsPerResource);
185 }
186
187 // 2: Feature Levels
188 {
189 D3D_FEATURE_LEVEL HighestLevelSupported = features.MaxSupportedFeatureLevel();
190
191 D3D12_FEATURE_DATA_FEATURE_LEVELS Data = {};
192 D3D_FEATURE_LEVEL KnownFeatureLevels[] =
193 {
194 D3D_FEATURE_LEVEL_1_0_CORE,
195 D3D_FEATURE_LEVEL_9_1,
196 D3D_FEATURE_LEVEL_9_2,
197 D3D_FEATURE_LEVEL_9_3,
198 D3D_FEATURE_LEVEL_10_0,
199 D3D_FEATURE_LEVEL_10_1,
200 D3D_FEATURE_LEVEL_11_0,
201 D3D_FEATURE_LEVEL_11_1,
202 D3D_FEATURE_LEVEL_12_0,
203 D3D_FEATURE_LEVEL_12_1,
204 D3D_FEATURE_LEVEL_12_2
205 };
206 Data.pFeatureLevelsRequested = KnownFeatureLevels;
207 Data.NumFeatureLevels = sizeof(KnownFeatureLevels) / sizeof(D3D_FEATURE_LEVEL);
208 device->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &Data, sizeof(D3D12_FEATURE_DATA_FEATURE_LEVELS));
209 VERIFY_FEATURE_CHECK_NO_DEFAULT(MaxSupportedFeatureLevel);
210 }
211
212 // 3: Format Support
213 {
214 D3D12_FORMAT_SUPPORT1 Support1;
215 D3D12_FORMAT_SUPPORT2 Support2;
216 if (FAILED(features.FormatSupport(DXGI_FORMAT_R16G16B16A16_FLOAT, Support1, Support2))) {
217 std::cout << "Error: FormatSupport failed" << std::endl;
218 return -1;
219 }
220
221 D3D12_FEATURE_DATA_FORMAT_SUPPORT Data = {};
222 Data.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
223 if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &Data, sizeof(D3D12_FEATURE_DATA_FORMAT_SUPPORT))))
224 {
225 if (Support1 != Data.Support1)
226 {
227 std::cout << "Verification failed: " << "FormatSupport1" << std::endl
228 << "Old API: " << Data.Support1 << std::endl
229 << "New API: " << Support1 << std::endl;
230 return -1;
231 }
232
233 if (Support2 != Data.Support2)
234 {
235 std::cout << "Verification failed: " << "FormatSupport2" << std::endl
236 << "Old API: " << Data.Support2 << std::endl
237 << "New API: " << Support2 << std::endl;
238 return -1;
239 }
240 }
241 }
242
243 // 4: Multisample Quality Support
244 {
245 UINT NumQualityLevels;
246 if (FAILED(features.MultisampleQualityLevels(DXGI_FORMAT_R16G16B16A16_FLOAT, 1, D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE, NumQualityLevels))) {
247 std::cout << "Error: MultisampleQualityLevels failed" << std::endl;
248 return -1;
249 }
250
251 D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS Data = {};
252 Data.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
253 Data.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;
254 Data.SampleCount = 1;
255 device->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &Data, sizeof(D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS));
256 if (NumQualityLevels != Data.NumQualityLevels)
257 {
258 std::cout << "Verification failed: " << "MultisampleQualityLevels" << std::endl
259 << "Old API: " << Data.NumQualityLevels << std::endl
260 << "New API: " << NumQualityLevels << std::endl;
261 return -1;
262 }
263 }
264
265 // 5: Format Info
266 {
267 UINT8 PlaneCount;
268 if (FAILED(features.FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, PlaneCount)))
269 {
270 std::cout << "Error: FormatInfo failed" << std::endl;
271 return -1;
272 }
273
274 D3D12_FEATURE_DATA_FORMAT_INFO Data = {};
275 Data.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
276 device->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &Data, sizeof(D3D12_FEATURE_DATA_FORMAT_INFO));
277 if (PlaneCount != Data.PlaneCount)
278 {
279 PRINT_CHECK_FAILED_MESSAGE(FormatInfo, Data.PlaneCount, PlaneCount);
280 }
281 }
282
283 // 6: GPU Virtual Address Support
284 {
285 UINT MaxGPUVABitsPerProcess = features.MaxGPUVirtualAddressBitsPerProcess();
286 UINT MaxGPUVABitsPerResource = features.MaxGPUVirtualAddressBitsPerResource();
287
288 D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT Data = {};
289 device->CheckFeatureSupport(D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT, &Data, sizeof(D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT));
290 VERIFY_FEATURE_CHECK_NO_DEFAULT(MaxGPUVirtualAddressBitsPerProcess);
291 VERIFY_FEATURE_CHECK_NO_DEFAULT(MaxGPUVirtualAddressBitsPerResource);
292 }
293
294 // 7: Shader Model
295 {
296 D3D_SHADER_MODEL HighestShaderModel = features.HighestShaderModel();
297
298 D3D12_FEATURE_DATA_SHADER_MODEL Data = {};
299 D3D_SHADER_MODEL KnownShaderModels[] =
300 {
301 D3D_SHADER_MODEL_6_7,
302 D3D_SHADER_MODEL_6_6,
303 D3D_SHADER_MODEL_6_5,
304 D3D_SHADER_MODEL_6_4,
305 D3D_SHADER_MODEL_6_3,
306 D3D_SHADER_MODEL_6_2,
307 D3D_SHADER_MODEL_6_1,
308 D3D_SHADER_MODEL_6_0,
309 D3D_SHADER_MODEL_5_1
310 };
311 UINT NumKnownShaderModels = sizeof(KnownShaderModels) / sizeof(D3D_SHADER_MODEL);
312 for (UINT i = 0; i < NumKnownShaderModels; i++)
313 {
314 Data.HighestShaderModel = D3D_SHADER_MODEL_6_7; // Highest Known Shader Model
315 if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &Data, sizeof(D3D12_FEATURE_DATA_SHADER_MODEL))))
316 {
317 VERIFY_FEATURE_CHECK_NO_DEFAULT(HighestShaderModel);
318 }
319 }
320 }
321
322 // 8: Options1
323 {
324 BOOL WaveOps = features.WaveOps();
325 UINT WaveLaneCountMin = features.WaveLaneCountMin();
326 UINT WaveLaneCountMax = features.WaveLaneCountMax();
327
328 D3D12_FEATURE_DATA_D3D12_OPTIONS1 Data = {};
329 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS1);
330 VERIFY_FEATURE_CHECK(WaveOps, false);
331 VERIFY_FEATURE_CHECK(WaveLaneCountMax, 0);
332 VERIFY_FEATURE_CHECK(WaveLaneCountMin, 0);
333 }
334
335 // 10: Protected Resource Session Support
336 for (UINT NodeId = 0; NodeId < NodeCount; NodeId++)
337 {
338 D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS ProtectedResourceSessionSupport = features.ProtectedResourceSessionSupport(NodeId);
339
340 D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_SUPPORT Data = {};
341 Data.NodeIndex = NodeId;
342 INITIALIZE_FEATURE_SUPPORT_DATA(PROTECTED_RESOURCE_SESSION_SUPPORT);
343 VERIFY_RENAMED_FEATURE_CHECK(ProtectedResourceSessionSupport, Support, D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAG_NONE);
344 }
345
346 // 12: Root Signature
347 {
348 D3D_ROOT_SIGNATURE_VERSION HighestRootSignatureVersion = features.HighestRootSignatureVersion();
349
350 D3D12_FEATURE_DATA_ROOT_SIGNATURE Data = {};
351 Data.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1; // Highest Known Version
352 INITIALIZE_FEATURE_SUPPORT_DATA(ROOT_SIGNATURE);
353 VERIFY_RENAMED_FEATURE_CHECK(HighestRootSignatureVersion, HighestVersion, (D3D_ROOT_SIGNATURE_VERSION)0);
354 }
355
356 // 16: Architecture1
357 for (UINT NodeId = 0; NodeId < NodeCount; NodeId++)
358 {
359 BOOL IsolatedMMU = features.IsolatedMMU(NodeId);
360 BOOL TileBasedRenderer = features.TileBasedRenderer(NodeId);
361 BOOL UMA = features.UMA(NodeId);
362 BOOL CacheCoherentUMA = features.CacheCoherentUMA(NodeId);
363
364 D3D12_FEATURE_DATA_ARCHITECTURE1 Data = {};
365 Data.NodeIndex = NodeId;
366 INITIALIZE_FEATURE_SUPPORT_DATA(ARCHITECTURE1);
367 if (FAILED(InitResult))
368 {
369 D3D12_FEATURE_DATA_ARCHITECTURE Data = {};
370 Data.NodeIndex = NodeId;
371 INITIALIZE_FEATURE_SUPPORT_DATA(ARCHITECTURE);
372 VERIFY_FEATURE_CHECK_NO_DEFAULT(TileBasedRenderer);
373 VERIFY_FEATURE_CHECK_NO_DEFAULT(UMA);
374 VERIFY_FEATURE_CHECK_NO_DEFAULT(CacheCoherentUMA);
375 }
376 else
377 {
378 VERIFY_FEATURE_CHECK(TileBasedRenderer, false);
379 VERIFY_FEATURE_CHECK(UMA, false);
380 VERIFY_FEATURE_CHECK(CacheCoherentUMA, false);
381 }
382 VERIFY_FEATURE_CHECK(IsolatedMMU, false);
383 }
384
385 // 18: Options2
386 {
387 BOOL DepthBoundsTestSupported = features.DepthBoundsTestSupported();
388 D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER ProgrammableSamplePositionsTier = features.ProgrammableSamplePositionsTier();
389
390 D3D12_FEATURE_DATA_D3D12_OPTIONS2 Data = {};
391 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS2);
392 VERIFY_FEATURE_CHECK(DepthBoundsTestSupported, false);
393 VERIFY_FEATURE_CHECK(ProgrammableSamplePositionsTier, D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_NOT_SUPPORTED);
394 }
395
396 // 19: Shader Cache
397 {
398 D3D12_SHADER_CACHE_SUPPORT_FLAGS ShaderCacheSupportFlags = features.ShaderCacheSupportFlags();
399
400 D3D12_FEATURE_DATA_SHADER_CACHE Data = {};
401 INITIALIZE_FEATURE_SUPPORT_DATA(SHADER_CACHE);
402 VERIFY_RENAMED_FEATURE_CHECK(ShaderCacheSupportFlags, SupportFlags, D3D12_SHADER_CACHE_SUPPORT_NONE);
403 }
404
405 // 20: Command Queue Prioirity
406 {
407 // Basic check
408 BOOL CommandQueuePrioritySupportedPositive = features.CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE_DIRECT, D3D12_COMMAND_QUEUE_PRIORITY_NORMAL);
409 // Check for Global Realtime support
410 BOOL CommandQueuePrioritySupportedRealtime = features.CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE_COPY, D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME);
411 // Test on invalid inputs
412 BOOL CommandQueuePrioritySupportedInvalid = features.CommandQueuePrioritySupported((D3D12_COMMAND_LIST_TYPE)7, 0);
413
414 D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY Data = {};
415 {
416 Data.CommandListType = D3D12_COMMAND_LIST_TYPE_DIRECT;
417 Data.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL;
418 INITIALIZE_FEATURE_SUPPORT_DATA(COMMAND_QUEUE_PRIORITY);
419 if (CommandQueuePrioritySupportedPositive != Data.PriorityForTypeIsSupported)
420 {
421 PRINT_CHECK_FAILED_MESSAGE(CommandQueuePriority, Data.PriorityForTypeIsSupported, CommandQueuePrioritySupportedPositive);
422 }
423 }
424
425 {
426 Data.CommandListType = D3D12_COMMAND_LIST_TYPE_COPY;
427 Data.Priority = D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME;
428 INITIALIZE_FEATURE_SUPPORT_DATA(COMMAND_QUEUE_PRIORITY);
429 if (CommandQueuePrioritySupportedRealtime != Data.PriorityForTypeIsSupported)
430 {
431 PRINT_CHECK_FAILED_MESSAGE(CommandQueuePriority, Data.PriorityForTypeIsSupported, CommandQueuePrioritySupportedRealtime);
432 }
433 }
434
435 if (CommandQueuePrioritySupportedInvalid)
436 {
437 std::cout << "Error: Wrong result from Command Queue Priority - Invalid Test Case\n"
438 << "New API returned true on invalid Command List Types\n"
439 << "Check if the list of command list types has updated\n";
440 return -1;
441 }
442 }
443
444 // 21: Options3
445 {
446 BOOL CopyQueueTimestampQueriesSupported = features.CopyQueueTimestampQueriesSupported();
447 BOOL CastingFullyTypedFormatSupported = features.CastingFullyTypedFormatSupported();
448 D3D12_COMMAND_LIST_SUPPORT_FLAGS WriteBufferImmediateSupportFlags = features.WriteBufferImmediateSupportFlags();
449 D3D12_VIEW_INSTANCING_TIER ViewInstancingTier = features.ViewInstancingTier();
450 BOOL BarycentricsSupported = features.BarycentricsSupported();
451
452 D3D12_FEATURE_DATA_D3D12_OPTIONS3 Data = {};
453 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS3);
454 VERIFY_FEATURE_CHECK(CopyQueueTimestampQueriesSupported, false);
455 VERIFY_FEATURE_CHECK(CastingFullyTypedFormatSupported, false);
456 VERIFY_FEATURE_CHECK(WriteBufferImmediateSupportFlags, D3D12_COMMAND_LIST_SUPPORT_FLAG_NONE);
457 VERIFY_FEATURE_CHECK(ViewInstancingTier, D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED);
458 VERIFY_FEATURE_CHECK(BarycentricsSupported, false);
459 }
460
461 // 22: Existing Heaps
462 {
463 BOOL ExistingHeapsSupported = features.ExistingHeapsSupported();
464
465 D3D12_FEATURE_DATA_EXISTING_HEAPS Data = {};
466 INITIALIZE_FEATURE_SUPPORT_DATA(EXISTING_HEAPS);
467 VERIFY_RENAMED_FEATURE_CHECK(ExistingHeapsSupported, Supported, false);
468 }
469
470 // 23: D3D12 Options4
471 {
472 BOOL MSAA64KBAlignedTextureSupported = features.MSAA64KBAlignedTextureSupported();
473 D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier = features.SharedResourceCompatibilityTier();
474 BOOL Native16BitShaderOpsSupported = features.Native16BitShaderOpsSupported();
475
476 D3D12_FEATURE_DATA_D3D12_OPTIONS4 Data = {};
477 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS4);
478 VERIFY_FEATURE_CHECK(MSAA64KBAlignedTextureSupported, false);
479 VERIFY_FEATURE_CHECK(SharedResourceCompatibilityTier, D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0);
480 VERIFY_FEATURE_CHECK(Native16BitShaderOpsSupported, false);
481 }
482
483 // 24: Serialization
484 {
485 D3D12_HEAP_SERIALIZATION_TIER HeapSerializationTier = features.HeapSerializationTier();
486 D3D12_FEATURE_DATA_SERIALIZATION Data = {};
487 INITIALIZE_FEATURE_SUPPORT_DATA(SERIALIZATION);
488 VERIFY_FEATURE_CHECK(HeapSerializationTier, D3D12_HEAP_SERIALIZATION_TIER_0);
489 }
490
491 // 25: Cross Node
492 {
493 BOOL CrossNodeAtomicShaderInstructions = features.CrossNodeAtomicShaderInstructions();
494 D3D12_FEATURE_DATA_CROSS_NODE Data = {};
495 INITIALIZE_FEATURE_SUPPORT_DATA(CROSS_NODE);
496 VERIFY_RENAMED_FEATURE_CHECK(CrossNodeAtomicShaderInstructions, AtomicShaderInstructions, false);
497 }
498
499 // 27: Options5
500 {
501 BOOL SRVOnlyTiledResourceTier3 = features.SRVOnlyTiledResourceTier3();
502 D3D12_RENDER_PASS_TIER RenderPassesTier = features.RenderPassesTier();
503 D3D12_RAYTRACING_TIER RaytracingTier = features.RaytracingTier();
504
505 D3D12_FEATURE_DATA_D3D12_OPTIONS5 Data = {};
506 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS5);
507 VERIFY_FEATURE_CHECK(SRVOnlyTiledResourceTier3, false);
508 VERIFY_FEATURE_CHECK(RenderPassesTier, D3D12_RENDER_PASS_TIER_0);
509 VERIFY_FEATURE_CHECK(RaytracingTier, D3D12_RAYTRACING_TIER_NOT_SUPPORTED);
510 }
511
512 // 28: Displayable
513 {
514 BOOL DisplayableTexture = features.DisplayableTexture();
515
516 D3D12_FEATURE_DATA_DISPLAYABLE Data = {};
517 INITIALIZE_FEATURE_SUPPORT_DATA(DISPLAYABLE);
518 VERIFY_FEATURE_CHECK(DisplayableTexture, false);
519 }
520
521 // 30: Options6
522 {
523 BOOL AdditionalShadingRatesSupported = features.AdditionalShadingRatesSupported();
524 BOOL PerPrimitiveShadingRateSupportedWithViewportIndexing = features.PerPrimitiveShadingRateSupportedWithViewportIndexing();
525 D3D12_VARIABLE_SHADING_RATE_TIER VariableShadingRateTier = features.VariableShadingRateTier();
526 BOOL ShadingRateImageTileSize = features.ShadingRateImageTileSize();
527 BOOL BackgroundProcessingSupported = features.BackgroundProcessingSupported();
528
529 D3D12_FEATURE_DATA_D3D12_OPTIONS6 Data = {};
530 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS6);
531 VERIFY_FEATURE_CHECK(AdditionalShadingRatesSupported, false);
532 VERIFY_FEATURE_CHECK(PerPrimitiveShadingRateSupportedWithViewportIndexing, false);
533 VERIFY_FEATURE_CHECK(VariableShadingRateTier, D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED);
534 VERIFY_FEATURE_CHECK(ShadingRateImageTileSize, false);
535 VERIFY_FEATURE_CHECK(BackgroundProcessingSupported, false);
536 }
537
538 // 31: Query Metacommand
539 // The function is simply a forwarding call to the old API
540 // Takes in a pointer to D3D12_FEATURE_DATA_QUERY_METACOMMAND as input parameter
541 // No need to test specifically
542
543 // 32: Options7
544 {
545 D3D12_MESH_SHADER_TIER MeshShaderTier = features.MeshShaderTier();
546 D3D12_SAMPLER_FEEDBACK_TIER SamplerFeedbackTier = features.SamplerFeedbackTier();
547
548 D3D12_FEATURE_DATA_D3D12_OPTIONS7 Data = {};
549 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS7);
550 VERIFY_FEATURE_CHECK(MeshShaderTier, D3D12_MESH_SHADER_TIER_NOT_SUPPORTED);
551 VERIFY_FEATURE_CHECK(SamplerFeedbackTier, D3D12_SAMPLER_FEEDBACK_TIER_NOT_SUPPORTED);
552 }
553
554 // 33: Session Type Count
555 for (UINT NodeId = 0; NodeId < NodeCount; NodeId++)
556 {
557 UINT ProtectedResourceSessionTypeCount = features.ProtectedResourceSessionTypeCount(NodeId);
558
559 D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT Data = {};
560 Data.NodeIndex = NodeId;
561 INITIALIZE_FEATURE_SUPPORT_DATA(PROTECTED_RESOURCE_SESSION_TYPE_COUNT);
562 VERIFY_RENAMED_FEATURE_CHECK(ProtectedResourceSessionTypeCount, Count, 0);
563 }
564
565 // 34: Session Types
566 for (UINT NodeId = 0; NodeId < NodeCount; NodeId++)
567 {
568 std::vector<GUID> ProtectedResourceSessionTypes = features.ProtectedResourceSessionTypes(NodeId);
569
570 D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT CountData = {};
571 CountData.NodeIndex = NodeId;
572 if (FAILED(device->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPE_COUNT, &CountData, sizeof(D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT))))
573 {
574 if (ProtectedResourceSessionTypes.size() != 0)
575 {
576 std::cout << "Error: Wrong result from Protected Resource Session Types on Node " << NodeId << std::endl
577 << "Type count check failed but types vector is not empty\n";
578 return -1;
579 }
580 continue;
581 }
582
583 if (CountData.Count != ProtectedResourceSessionTypes.size())
584 {
585 std::cout << "Error: Wrong result from Protected Resource Session Types on Node " << NodeId << std::endl
586 << "Types vector size does not equal type count\n";
587 return -1;
588 }
589
590 D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES Data = {};
591 Data.NodeIndex = NodeId;
592 Data.Count = CountData.Count;
593 Data.pTypes = new GUID[Data.Count];
594 INITIALIZE_FEATURE_SUPPORT_DATA(PROTECTED_RESOURCE_SESSION_TYPES);
595 if (SUCCEEDED(InitResult))
596 {
597 for (unsigned int i = 0; i < Data.Count; i++)
598 {
599 if (ProtectedResourceSessionTypes[i] != Data.pTypes[i])
600 {
601 std::cout << "Error: Result mismatch from Proteted Resource Session Types\n"
602 << "Node Index: " << NodeId << std::endl
603 << "Type Index: " << i << std::endl;
604 return -1;
605 }
606 }
607 }
608 }
609
610 // 36: Options8
611 {
612 BOOL UnalignedBlockTexturesSupported = features.UnalignedBlockTexturesSupported();
613
614 D3D12_FEATURE_DATA_D3D12_OPTIONS8 Data = {};
615 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS8);
616 VERIFY_FEATURE_CHECK(UnalignedBlockTexturesSupported, false);
617 }
618
619 // 37: Options9
620 {
621 BOOL MeshShaderPipelineStatsSupported = features.MeshShaderPipelineStatsSupported();
622 BOOL MeshShaderSupportsFullRangeRenderTargetArrayIndex = features.MeshShaderSupportsFullRangeRenderTargetArrayIndex();
623 D3D12_WAVE_MMA_TIER WaveMMATier = features.WaveMMATier();
624
625 D3D12_FEATURE_DATA_D3D12_OPTIONS9 Data = {};
626 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS9);
627 VERIFY_FEATURE_CHECK(MeshShaderPipelineStatsSupported, false);
628 VERIFY_FEATURE_CHECK(MeshShaderSupportsFullRangeRenderTargetArrayIndex, false);
629 VERIFY_FEATURE_CHECK(WaveMMATier, D3D12_WAVE_MMA_TIER_NOT_SUPPORTED);
630 }
631
632 // 39: Options10
633 {
634 BOOL VariableRateShadingSumCombinerSupported = features.VariableRateShadingSumCombinerSupported();
635 BOOL MeshShaderPerPrimitiveShadingRateSupported = features.MeshShaderPerPrimitiveShadingRateSupported();
636
637 D3D12_FEATURE_DATA_D3D12_OPTIONS10 Data = {};
638 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS10);
639 VERIFY_FEATURE_CHECK(VariableRateShadingSumCombinerSupported, false);
640 VERIFY_FEATURE_CHECK(MeshShaderPerPrimitiveShadingRateSupported, false);
641 }
642
643 // 40: Options11
644 {
645 BOOL AtomicInt64OnDescriptorHeapResourceSupported = features.AtomicInt64OnDescriptorHeapResourceSupported();
646
647 D3D12_FEATURE_DATA_D3D12_OPTIONS11 Data = {};
648 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS11);
649 VERIFY_FEATURE_CHECK(AtomicInt64OnDescriptorHeapResourceSupported, false);
650 }
651
652 // 41: Options12
653 {
654 D3D12_TRI_STATE MSPrimitivesPipelineStatisticIncludesCulledPrimitives = features.MSPrimitivesPipelineStatisticIncludesCulledPrimitives();
655 BOOL EnhancedBarriersSupported = features.EnhancedBarriersSupported();
656
657 D3D12_FEATURE_DATA_D3D12_OPTIONS12 Data = {};
658 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS12);
659 VERIFY_FEATURE_CHECK(MSPrimitivesPipelineStatisticIncludesCulledPrimitives, D3D12_TRI_STATE_UNKNOWN);
660 VERIFY_FEATURE_CHECK(EnhancedBarriersSupported, false);
661 VERIFY_FEATURE_CHECK(RelaxedFormatCastingSupported, false);
662 }
663
664 // 41: Options13
665 {
666 D3D12_FEATURE_DATA_D3D12_OPTIONS13 Data = {};
667 INITIALIZE_FEATURE_SUPPORT_DATA(D3D12_OPTIONS13);
668 VERIFY_FEATURE_CHECK(UnrestrictedBufferTextureCopyPitchSupported, false);
669 VERIFY_FEATURE_CHECK(UnrestrictedVertexElementAlignmentSupported, false);
670 VERIFY_FEATURE_CHECK(InvertedViewportHeightFlipsYSupported, false);
671 VERIFY_FEATURE_CHECK(InvertedViewportDepthFlipsZSupported, false);
672 VERIFY_FEATURE_CHECK(TextureCopyBetweenDimensionsSupported, false);
673 VERIFY_FEATURE_CHECK(AlphaBlendFactorSupported, false);
674 }
675
676 std::cout << "Test completed with no errors." << std::endl;
677 return 0;
678}
679
680#ifdef __MINGW32__
681STDAPI
682DXCoreCreateAdapterFactory(
683 REFIID riid,
684 _COM_Outptr_ void** ppvFactory
685) {
686 return 0;
687}
688#endif
689
690int main()
691{
692 ComPtr<IDXCoreAdapterFactory> adapter_factory;
693 ComPtr<IDXCoreAdapterList> adapter_list;
694 GUID dx_must_attr[1]{ DXCORE_ADAPTER_ATTRIBUTE_D3D12_CORE_COMPUTE };
695
696 if(FAILED(DXCoreCreateAdapterFactory(IID_PPV_ARGS(&adapter_factory))))
697 {
698 return -1;
699 }
700
701 if(FAILED(adapter_factory->CreateAdapterList(_countof(dx_must_attr), dx_must_attr, IID_PPV_ARGS(&adapter_list))))
702 {
703 return -1;
704 }
705
706 // Test all adapters
707 for (uint32_t i = 0; i < adapter_list->GetAdapterCount(); i++)
708 {
709 ComPtr<IDXCoreAdapter> adapter;
710 if(FAILED(adapter_list->GetAdapter(i, IID_PPV_ARGS(&adapter))))
711 {
712 std::cout << "Cannot get number " << i << " adapter." << std::endl;
713 continue;
714 }
715
716 std::string driver_desc_str = get_driver_description(adapter);
717 if(driver_desc_str.empty())
718 {
719 std::cout << "Cannot get number " << i << " adapter's driver description." << std::endl;
720 }
721 std::cout << "Test on device driver: " << driver_desc_str << std::endl;
722
723 if(FAILED(run_per_adapter(adapter.Get())))
724 {
725 std::cout << "Some tests failed with error on number " << i << " adapter." << std::endl;
726 }
727 }
728 return 0;
729} \ No newline at end of file