diff options
| author | 3gg <3gg@shellblade.net> | 2025-12-02 16:39:36 -0800 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2025-12-02 16:39:36 -0800 |
| commit | 6c8ae19be66cee247980a48e736a4e05d14de179 (patch) | |
| tree | d860767907bf0cbe17ec66422e11bea700cf56d9 /contrib/DirectX-Headers-1.618.2/test/feature_check_test.cpp | |
| parent | 8f594c8ebd11f0e5f8a0c6369c3fe7383d250cbe (diff) | |
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.cpp | 729 |
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) \ | ||
| 84 | HRESULT InitResult; \ | ||
| 85 | if (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) \ | ||
| 92 | std::cout << "Verification failed: " << #FeatureName << std::endl \ | ||
| 93 | << "Old API: " << OldFeature << std::endl \ | ||
| 94 | << "New API: " << NewFeature << std::endl; | ||
| 95 | |||
| 96 | |||
| 97 | using namespace Microsoft::WRL; | ||
| 98 | |||
| 99 | // To get property value from adapter | ||
| 100 | std::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 | ||
| 120 | std::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 | // ----------------------------------------------------------------------------------------------------------------- | ||
| 130 | int 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__ | ||
| 681 | STDAPI | ||
| 682 | DXCoreCreateAdapterFactory( | ||
| 683 | REFIID riid, | ||
| 684 | _COM_Outptr_ void** ppvFactory | ||
| 685 | ) { | ||
| 686 | return 0; | ||
| 687 | } | ||
| 688 | #endif | ||
| 689 | |||
| 690 | int 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 | ||
