diff --git a/util/test/demos/d3d11/d3d11_test.cpp b/util/test/demos/d3d11/d3d11_test.cpp index 3f868b6fb..b8cdba013 100644 --- a/util/test/demos/d3d11/d3d11_test.cpp +++ b/util/test/demos/d3d11/d3d11_test.cpp @@ -98,39 +98,33 @@ void D3D11GraphicsTest::Prepare(int argc, char **argv) if(SUCCEEDED(hr)) adapters = FindD3DAdapters(factory, argc, argv, warp); } + } - if(!d3d11) - Avail = "d3d11.dll is not available"; - else if(!dxgi) - Avail = "dxgi.dll is not available"; - else if(!d3dcompiler) - Avail = "d3dcompiler_XX.dll is not available"; - else if(!factory) - Avail = "Couldn't create DXGI factory"; - else if(!dyn_D3D11CreateDevice || !dyn_D3D11CreateDeviceAndSwapChain || !dyn_D3DCompile || - !dyn_D3DStripShader || !dyn_D3DSetBlobPart) - Avail = "Missing required entry point"; + if(!d3d11) + Avail = "d3d11.dll is not available"; + else if(!dxgi) + Avail = "dxgi.dll is not available"; + else if(!d3dcompiler) + Avail = "d3dcompiler_XX.dll is not available"; + else if(!factory) + Avail = "Couldn't create DXGI factory"; + else if(!dyn_D3D11CreateDevice || !dyn_D3D11CreateDeviceAndSwapChain || !dyn_D3DCompile || + !dyn_D3DStripShader || !dyn_D3DSetBlobPart) + Avail = "Missing required entry point"; - if(dyn_D3D11CreateDevice) + if(dyn_D3D11CreateDevice) + { + D3D_FEATURE_LEVEL features[] = {D3D_FEATURE_LEVEL_11_0}; + HRESULT hr = CreateDevice(NULL, NULL, features, 0); + + if(SUCCEEDED(hr)) { - D3D_FEATURE_LEVEL features[] = {D3D_FEATURE_LEVEL_11_0}; - hr = CreateDevice(NULL, NULL, features, 0); - - if(SUCCEEDED(hr)) - { - dev->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &opts, sizeof(opts)); - - ID3D11Device1Ptr tempDev1; - - tempDev1 = dev; - memset(&opts1, 0, sizeof(opts1)); - if(tempDev1) - tempDev1->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS1, &opts1, sizeof(opts1)); - } - - // This device was only used to get feature support. Set it back to NULL - dev = NULL; + dev->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &opts, sizeof(opts)); + dev->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS1, &opts1, sizeof(opts1)); } + + // This device was only used to get feature support. Set it back to NULL + dev = NULL; } } diff --git a/util/test/demos/d3d11/d3d11_test.h b/util/test/demos/d3d11/d3d11_test.h index 82d01640f..920c73fbe 100644 --- a/util/test/demos/d3d11/d3d11_test.h +++ b/util/test/demos/d3d11/d3d11_test.h @@ -177,8 +177,8 @@ struct D3D11GraphicsTest : public GraphicsTest ID3D11VertexShaderPtr swapBlitVS; ID3D11PixelShaderPtr swapBlitPS; - D3D11_FEATURE_DATA_D3D11_OPTIONS opts; - D3D11_FEATURE_DATA_D3D11_OPTIONS1 opts1; + D3D11_FEATURE_DATA_D3D11_OPTIONS opts = {}; + D3D11_FEATURE_DATA_D3D11_OPTIONS1 opts1 = {}; ID3D11DepthStencilStatePtr depthState; ID3D11RasterizerStatePtr rastState; diff --git a/util/test/demos/d3d12/d3d12_reflection_zoo.cpp b/util/test/demos/d3d12/d3d12_reflection_zoo.cpp index 12838a67b..d0f4663c6 100644 --- a/util/test/demos/d3d12/d3d12_reflection_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_reflection_zoo.cpp @@ -272,9 +272,6 @@ float4 main(float4 pos : SV_Position) : SV_Target0 D3D12PSOCreator creator = MakePSO().RootSig(sig).RTVs({DXGI_FORMAT_R8G8B8A8_UNORM_SRGB}).VS(vs5blob); - D3D12_FEATURE_DATA_D3D12_OPTIONS opts = {}; - dev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &opts, sizeof(opts)); - respixel = fmt::format("#define ROV {0}\n\n{1}", opts.ROVsSupported ? 1 : 0, respixel); ID3DBlobPtr dxbcBlob = Compile(respixel, "main", "ps_5_1"); diff --git a/util/test/demos/d3d12/d3d12_swapchain_zoo.cpp b/util/test/demos/d3d12/d3d12_swapchain_zoo.cpp index 2a6f50d07..a25da33f6 100644 --- a/util/test/demos/d3d12/d3d12_swapchain_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_swapchain_zoo.cpp @@ -34,7 +34,7 @@ RD_TEST(D3D12_Swapchain_Zoo, D3D12GraphicsTest) D3D12GraphicsTest::Prepare(argc, argv); if(m_12On7) - Avail = "True swapchains not supportedd on D3D12On7"; + Avail = "True swapchains not supported on D3D12On7"; } int main() diff --git a/util/test/demos/d3d12/d3d12_test.cpp b/util/test/demos/d3d12/d3d12_test.cpp index 4e50ae7aa..c595fe800 100644 --- a/util/test/demos/d3d12/d3d12_test.cpp +++ b/util/test/demos/d3d12/d3d12_test.cpp @@ -47,6 +47,16 @@ HMODULE dxcompiler = NULL; IDXGIFactory1Ptr factory; std::vector adapters; bool d3d12on7 = false; + +pD3DCompile dyn_D3DCompile = NULL; +pD3DStripShader dyn_D3DStripShader = NULL; +pD3DSetBlobPart dyn_D3DSetBlobPart = NULL; +pD3DCreateBlob dyn_CreateBlob = NULL; + +PFN_D3D12_CREATE_DEVICE dyn_D3D12CreateDevice = NULL; + +PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE dyn_serializeRootSig; +PFN_D3D12_SERIALIZE_ROOT_SIGNATURE dyn_serializeRootSigOld; }; // namespace void D3D12GraphicsTest::Prepare(int argc, char **argv) @@ -119,6 +129,24 @@ void D3D12GraphicsTest::Prepare(int argc, char **argv) } } } + + if(d3dcompiler) + { + dyn_D3DCompile = (pD3DCompile)GetProcAddress(d3dcompiler, "D3DCompile"); + dyn_D3DStripShader = (pD3DStripShader)GetProcAddress(d3dcompiler, "D3DStripShader"); + dyn_D3DSetBlobPart = (pD3DSetBlobPart)GetProcAddress(d3dcompiler, "D3DSetBlobPart"); + dyn_CreateBlob = (pD3DCreateBlob)GetProcAddress(d3dcompiler, "D3DCreateBlob"); + } + + if(d3d12) + { + dyn_D3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)GetProcAddress(d3d12, "D3D12CreateDevice"); + + dyn_serializeRootSig = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress( + d3d12, "D3D12SerializeVersionedRootSignature"); + dyn_serializeRootSigOld = + (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(d3d12, "D3D12SerializeRootSignature"); + } } if(!d3d12) @@ -129,6 +157,11 @@ void D3D12GraphicsTest::Prepare(int argc, char **argv) Avail = "d3dcompiler_XX.dll is not available"; else if(!factory) Avail = "Couldn't create DXGI factory"; + else if(!dyn_D3D12CreateDevice || !dyn_D3DCompile || !dyn_D3DStripShader || !dyn_D3DSetBlobPart || + !dyn_CreateBlob) + Avail = "Missing required entry point"; + else if(!dyn_serializeRootSig && !dyn_serializeRootSigOld) + Avail = "Missing required root signature serialize entry point"; m_12On7 = d3d12on7; @@ -143,6 +176,20 @@ void D3D12GraphicsTest::Prepare(int argc, char **argv) } m_Factory = factory; + + ID3D12DevicePtr tmpdev = CreateDevice(adapters, minFeatureLevel); + + if(tmpdev) + { + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &opts, sizeof(opts)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS1, &opts1, sizeof(opts1)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &opts2, sizeof(opts2)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &opts3, sizeof(opts3)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS4, &opts4, sizeof(opts4)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &opts5, sizeof(opts5)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &opts6, sizeof(opts6)); + tmpdev->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &opts7, sizeof(opts7)); + } } bool D3D12GraphicsTest::Init() @@ -151,30 +198,9 @@ bool D3D12GraphicsTest::Init() if(!GraphicsTest::Init()) return false; - // we can assume d3d12, dxgi and d3dcompiler are valid since we shouldn't be running the test if - // Prepare() failed - - dyn_D3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)GetProcAddress(d3d12, "D3D12CreateDevice"); - - dyn_D3DCompile = (pD3DCompile)GetProcAddress(d3dcompiler, "D3DCompile"); - dyn_D3DStripShader = (pD3DStripShader)GetProcAddress(d3dcompiler, "D3DStripShader"); - dyn_D3DSetBlobPart = (pD3DSetBlobPart)GetProcAddress(d3dcompiler, "D3DSetBlobPart"); - dyn_CreateBlob = (pD3DCreateBlob)GetProcAddress(d3dcompiler, "D3DCreateBlob"); - - dyn_serializeRootSig = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress( - d3d12, "D3D12SerializeVersionedRootSignature"); - dyn_serializeRootSigOld = - (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(d3d12, "D3D12SerializeRootSignature"); - if(dyn_serializeRootSig == NULL) { TEST_WARN("Can't get D3D12SerializeVersionedRootSignature - old version of windows?"); - - if(dyn_serializeRootSigOld == NULL) - { - TEST_ERROR("Can't get D3D12SerializeRootSignature!"); - return false; - } } if(debugDevice) @@ -204,7 +230,7 @@ bool D3D12GraphicsTest::Init() } } - dev = CreateDevice(adapters, D3D_FEATURE_LEVEL_11_0); + dev = CreateDevice(adapters, minFeatureLevel); if(!dev) return false; diff --git a/util/test/demos/d3d12/d3d12_test.h b/util/test/demos/d3d12/d3d12_test.h index 3862a92e6..d713dc110 100644 --- a/util/test/demos/d3d12/d3d12_test.h +++ b/util/test/demos/d3d12/d3d12_test.h @@ -185,16 +185,6 @@ struct D3D12GraphicsTest : public GraphicsTest DXGI_FORMAT backbufferFmt = DXGI_FORMAT_R8G8B8A8_UNORM; int backbufferCount = 2; - pD3DCompile dyn_D3DCompile = NULL; - pD3DStripShader dyn_D3DStripShader = NULL; - pD3DSetBlobPart dyn_D3DSetBlobPart = NULL; - pD3DCreateBlob dyn_CreateBlob = NULL; - - PFN_D3D12_CREATE_DEVICE dyn_D3D12CreateDevice = NULL; - - PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE dyn_serializeRootSig; - PFN_D3D12_SERIALIZE_ROOT_SIGNATURE dyn_serializeRootSigOld; - GraphicsWindow *mainWindow = NULL; DXGI_ADAPTER_DESC adapterDesc = {}; @@ -207,6 +197,8 @@ struct D3D12GraphicsTest : public GraphicsTest ID3D12RootSignaturePtr swapBlitSig; ID3D12PipelineStatePtr swapBlitPso; + D3D_FEATURE_LEVEL minFeatureLevel = D3D_FEATURE_LEVEL_11_0; + bool gpuva = false, m_12On7 = false, m_DXILSupport = false; IDXGIFactory1Ptr m_Factory; @@ -230,6 +222,15 @@ struct D3D12GraphicsTest : public GraphicsTest ID3D12CommandQueuePtr queue; + D3D12_FEATURE_DATA_D3D12_OPTIONS opts = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS1 opts1 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS2 opts2 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS3 opts3 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS4 opts4 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS5 opts5 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS6 opts6 = {}; + D3D12_FEATURE_DATA_D3D12_OPTIONS7 opts7 = {}; + ID3D12FencePtr m_GPUSyncFence; HANDLE m_GPUSyncHandle = NULL; UINT64 m_GPUSyncCounter = 1;