Refactor D3D12 tests to check for options once in Prepare

This commit is contained in:
baldurk
2021-04-29 12:52:28 +01:00
parent aac9e762bc
commit 26aa09c665
6 changed files with 85 additions and 67 deletions
+23 -29
View File
@@ -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;
}
}
+2 -2
View File
@@ -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;
@@ -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");
@@ -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()
+48 -22
View File
@@ -47,6 +47,16 @@ HMODULE dxcompiler = NULL;
IDXGIFactory1Ptr factory;
std::vector<IDXGIAdapterPtr> 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;
+11 -10
View File
@@ -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;