@@ -115,6 +115,8 @@ void Sample::Update(DX::StepTimer const&)
115115 }
116116
117117 if (m_keyboardButtons.IsKeyPressed (Keyboard::Right)
118+ || m_keyboardButtons.IsKeyPressed (Keyboard::Enter)
119+ || m_keyboardButtons.IsKeyPressed (Keyboard::Space)
118120 || m_gamePadButtons.a == GamePad::ButtonStateTracker::PRESSED
119121 || m_gamePadButtons.dpadRight == GamePad::ButtonStateTracker::PRESSED)
120122 {
@@ -124,6 +126,7 @@ void Sample::Update(DX::StepTimer const&)
124126 }
125127
126128 if (m_keyboardButtons.IsKeyPressed (Keyboard::Left)
129+ || m_keyboardButtons.IsKeyPressed (Keyboard::Back)
127130 || m_gamePadButtons.b == GamePad::ButtonStateTracker::PRESSED
128131 || m_gamePadButtons.dpadLeft == GamePad::ButtonStateTracker::PRESSED)
129132 {
@@ -395,7 +398,7 @@ void Sample::Render()
395398 GetGamingDeviceModelInformation (&info);
396399
397400 wchar_t buff[128 ] = {};
398- swprintf_s (buff, L" %08X" , info.vendorId );
401+ swprintf_s (buff, L" %08X" , static_cast < unsigned int >( info.vendorId ) );
399402
400403 switch (info.vendorId )
401404 {
@@ -405,7 +408,7 @@ void Sample::Render()
405408 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" VendorId" , left, y, m_scale);
406409 y += DrawStringRight (m_batch.get (), m_smallFont.get (), buff, right, y, m_scale);
407410
408- swprintf_s (buff, L" %08X" , info.deviceId );
411+ swprintf_s (buff, L" %08X" , static_cast < unsigned int >( info.deviceId ) );
409412
410413 if (info.vendorId == GAMING_DEVICE_VENDOR_ID_MICROSOFT)
411414 {
@@ -445,6 +448,7 @@ void Sample::Render()
445448 bool isuniversal5 = ApiInformation::IsApiContractPresent (" Windows.Foundation.UniversalApiContract" , 5 , 0 );
446449 bool isuniversal6 = ApiInformation::IsApiContractPresent (" Windows.Foundation.UniversalApiContract" , 6 , 0 );
447450 bool isuniversal7 = ApiInformation::IsApiContractPresent (" Windows.Foundation.UniversalApiContract" , 7 , 0 );
451+ bool isuniversal8 = ApiInformation::IsApiContractPresent (" Windows.Foundation.UniversalApiContract" , 8 , 0 );
448452 bool isphone = ApiInformation::IsApiContractPresent (" Windows.Phone.PhoneContract" , 1 , 0 );
449453 bool isstore2 = ApiInformation::IsApiContractPresent (" Windows.Services.Store.StoreContract" , 2 , 0 );
450454 bool isstore3 = ApiInformation::IsApiContractPresent (" Windows.Services.Store.StoreContract" , 3 , 0 );
@@ -468,6 +472,7 @@ void Sample::Render()
468472 if (isuniversal5) { wcscat_s (contracts, L" , 5.0" ); }
469473 if (isuniversal6) { wcscat_s (contracts, L" , 6.0" ); }
470474 if (isuniversal7) { wcscat_s (contracts, L" , 7.0" ); }
475+ if (isuniversal8) { wcscat_s (contracts, L" , 8.0" ); }
471476
472477 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" UniversalApiContract" , left, y, m_scale);
473478 y += DrawStringRight (m_batch.get (), m_smallFont.get (), contracts, right, y, m_scale);
@@ -663,7 +668,8 @@ void Sample::Render()
663668 y += DrawStringCenter (m_batch.get (), m_smallFont.get (), L" DXGI_OUTPUT_DESC" , mid, y, ATG::Colors::OffWhite, m_scale);
664669
665670 ComPtr<IDXGIOutput> output;
666- if (SUCCEEDED (m_deviceResources->GetSwapChain ()->GetContainingOutput (output.GetAddressOf ())))
671+ HRESULT hr = m_deviceResources->GetSwapChain ()->GetContainingOutput (output.GetAddressOf ());
672+ if (SUCCEEDED (hr))
667673 {
668674 DXGI_OUTPUT_DESC outputDesc = {};
669675 DX::ThrowIfFailed (output->GetDesc (&outputDesc));
@@ -743,6 +749,14 @@ void Sample::Render()
743749 y += DrawStringRight (m_batch.get (), m_smallFont.get (), buff, right, y, m_scale);
744750 }
745751 }
752+ else
753+ {
754+ wchar_t buff[128 ] = {};
755+ swprintf_s (buff, L" GetContainingOutput failed with %08X" , static_cast <unsigned int >(hr));
756+ y += DrawStringCenter (m_batch.get (), m_smallFont.get (), buff, mid, y, ATG::Colors::Orange, m_scale);
757+ }
758+
759+ y += m_smallFont->GetLineSpacing () * m_scale;
746760
747761 ComPtr<IDXGIDevice3> dxgiDevice;
748762 if (SUCCEEDED (m_deviceResources->GetD3DDevice ()->QueryInterface (IID_PPV_ARGS (dxgiDevice.GetAddressOf ()))))
@@ -756,7 +770,18 @@ void Sample::Render()
756770 BOOL allowTearing = FALSE ;
757771 if (SUCCEEDED (dxgiFactory->CheckFeatureSupport (DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof (BOOL))))
758772 {
759- y += DrawStringCenter (m_batch.get (), m_smallFont.get (), L" DXGI 1.5" , mid, y, ATG::Colors::OffWhite, m_scale);
773+ const wchar_t * dxgiver = L" DXGI 1.5" ;
774+ #if defined(NTDDI_WIN10_RS4) && (NTDDI_VERSION >= NTDDI_WIN10_RS4)
775+ {
776+ ComPtr<IDXGIFactory6> dxgiFactory6;
777+ if (SUCCEEDED (dxgiFactory.As (&dxgiFactory6)))
778+ {
779+ dxgiver = L" DXGI 1.6" ;
780+ }
781+ }
782+ #endif
783+
784+ y += DrawStringCenter (m_batch.get (), m_smallFont.get (), dxgiver, mid, y, ATG::Colors::OffWhite, m_scale);
760785
761786 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" Allow Tearing" , left, y, m_scale);
762787 y += DrawStringRight (m_batch.get (), m_smallFont.get (), allowTearing ? L" true" : L" false" , right, y, m_scale);
@@ -1134,6 +1159,10 @@ void Sample::Render()
11341159 case D3D12_CROSS_NODE_SHARING_TIER_1_EMULATED: crossTier = L" Tier 1 (emulated)" ; break ;
11351160 case D3D12_CROSS_NODE_SHARING_TIER_1: crossTier = L" Tier 1" ; break ;
11361161 case D3D12_CROSS_NODE_SHARING_TIER_2: crossTier = L" Tier 2" ; break ;
1162+
1163+ #if defined(NTDDI_WIN10_RS4) && (NTDDI_VERSION >= NTDDI_WIN10_RS4)
1164+ case D3D12_CROSS_NODE_SHARING_TIER_3: crossTier = L" Tier 3" ; break ;
1165+ #endif
11371166 }
11381167
11391168 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" CrossNodeSharingTier" , left, y, m_scale);
@@ -1281,11 +1310,15 @@ void Sample::Render()
12811310 }
12821311 else
12831312 {
1313+ bool found = false ;
1314+
12841315 // Optional Direct3D 12 features for Windows 10 April 2018 Update
12851316 #if defined(NTDDI_WIN10_RS4) && (NTDDI_VERSION >= NTDDI_WIN10_RS4)
12861317 D3D12_FEATURE_DATA_D3D12_OPTIONS4 d3d12opts4 = {};
12871318 if (SUCCEEDED (device->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS4, &d3d12opts4, sizeof (d3d12opts4))))
12881319 {
1320+ found = true ;
1321+
12891322 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" MSAA64KBAlignedTextureSupported" , left, y, m_scale);
12901323 y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12opts4.MSAA64KBAlignedTextureSupported ? L" true" : L" false" , right, y, m_scale);
12911324
@@ -1306,6 +1339,8 @@ void Sample::Render()
13061339 D3D12_FEATURE_DATA_SERIALIZATION d3d12serial = {};
13071340 if (SUCCEEDED (device->CheckFeatureSupport (D3D12_FEATURE_SERIALIZATION, &d3d12serial, sizeof (d3d12serial))))
13081341 {
1342+ found = true ;
1343+
13091344 const wchar_t * serialTier = L" Unknown" ;
13101345 switch (d3d12serial.HeapSerializationTier )
13111346 {
@@ -1325,6 +1360,8 @@ void Sample::Render()
13251360 D3D12_FEATURE_DATA_CROSS_NODE d3d12xnode = {};
13261361 if (SUCCEEDED (device->CheckFeatureSupport (D3D12_FEATURE_CROSS_NODE, &d3d12xnode, sizeof (d3d12xnode))))
13271362 {
1363+ found = true ;
1364+
13281365 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" Cross node AtomicShaderInstructions" , left, y, m_scale);
13291366 y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12xnode.AtomicShaderInstructions ? L" true" : L" false" , right, y, m_scale);
13301367
@@ -1348,6 +1385,8 @@ void Sample::Render()
13481385 D3D12_FEATURE_DATA_D3D12_OPTIONS5 d3d12opts5 = {};
13491386 if (SUCCEEDED (device->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS5, &d3d12opts5, sizeof (d3d12opts5))))
13501387 {
1388+ found = true ;
1389+
13511390 DrawStringLeft (m_batch.get (), m_smallFont.get (), L" SRVOnlyTiledResourceTier3" , left, y, m_scale);
13521391 y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12opts5.SRVOnlyTiledResourceTier3 ? L" true" : L" false" , right, y, m_scale);
13531392
@@ -1373,6 +1412,67 @@ void Sample::Render()
13731412 y += DrawStringRight (m_batch.get (), m_smallFont.get (), rtTier, right, y, m_scale);
13741413 }
13751414 #endif
1415+
1416+ if (!found)
1417+ {
1418+ y += DrawStringCenter (m_batch.get (), m_smallFont.get (), L" Requires Windows 10 April 2018 Update or later" , mid, y, ATG::Colors::Orange, m_scale);
1419+ }
1420+ }
1421+ }
1422+ break ;
1423+
1424+ case InfoPage::DIRECT3D12_OPT3:
1425+ {
1426+ y += DrawStringCenter (m_batch.get (), m_largeFont.get (), L" Direct3D 12 Optional Features (continued)" , mid, y, ATG::Colors::LightGrey, m_scale);
1427+
1428+ auto device = m_deviceResources->GetD3DDevice12 ();
1429+
1430+ if (!device)
1431+ {
1432+ y += DrawStringCenter (m_batch.get (), m_smallFont.get (), L" Not supported" , mid, y, ATG::Colors::Orange, m_scale);
1433+ }
1434+ else
1435+ {
1436+ bool found = false ;
1437+
1438+ // Optional Direct3D 12 features for Windows 10 May 2019 Update
1439+ #if defined(NTDDI_WIN10_19H1) && (NTDDI_VERSION >= NTDDI_WIN10_19H1)
1440+ D3D12_FEATURE_DATA_D3D12_OPTIONS6 d3d12opts6 = {};
1441+ if (SUCCEEDED (device->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS6, &d3d12opts6, sizeof (d3d12opts6))))
1442+ {
1443+ found = true ;
1444+
1445+ DrawStringLeft (m_batch.get (), m_smallFont.get (), L" AdditionalShadingRatesSupported" , left, y, m_scale);
1446+ y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12opts6.AdditionalShadingRatesSupported ? L" true" : L" false" , right, y, m_scale);
1447+
1448+ DrawStringLeft (m_batch.get (), m_smallFont.get (), L" PerPrimitiveShadingRateSupportedWithViewportIndexing" , left, y, m_scale);
1449+ y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12opts6.PerPrimitiveShadingRateSupportedWithViewportIndexing ? L" true" : L" false" , right, y, m_scale);
1450+
1451+ const wchar_t * vrsTier = L" Unknown" ;
1452+ switch (d3d12opts6.VariableShadingRateTier )
1453+ {
1454+ case D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED: vrsTier = L" Not Supported" ; break ;
1455+ case D3D12_VARIABLE_SHADING_RATE_TIER_1: vrsTier = L" Tier 1" ; break ;
1456+ case D3D12_VARIABLE_SHADING_RATE_TIER_2: vrsTier = L" Tier 2" ; break ;
1457+ }
1458+
1459+ DrawStringLeft (m_batch.get (), m_smallFont.get (), L" VariableShadingRateTier" , left, y, m_scale);
1460+ y += DrawStringRight (m_batch.get (), m_smallFont.get (), vrsTier, right, y, m_scale);
1461+
1462+ wchar_t buff[128 ] = {};
1463+ swprintf_s (buff, L" %u" , d3d12opts6.ShadingRateImageTileSize );
1464+ DrawStringLeft (m_batch.get (), m_smallFont.get (), L" ShadingRateImageTileSize" , left, y, m_scale);
1465+ y += DrawStringRight (m_batch.get (), m_smallFont.get (), buff, right, y, m_scale);
1466+
1467+ DrawStringLeft (m_batch.get (), m_smallFont.get (), L" BackgroundProcessingSupported" , left, y, m_scale);
1468+ y += DrawStringRight (m_batch.get (), m_smallFont.get (), d3d12opts6.BackgroundProcessingSupported ? L" true" : L" false" , right, y, m_scale);
1469+ }
1470+ #endif
1471+
1472+ if (!found)
1473+ {
1474+ y += DrawStringCenter (m_batch.get (), m_smallFont.get (), L" Requires Windows 10 May 2019 Update or later" , mid, y, ATG::Colors::Orange, m_scale);
1475+ }
13761476 }
13771477 }
13781478 break ;
0 commit comments