Add test of root signature ranges larger than the descriptor heap

This commit is contained in:
baldurk
2021-01-13 16:07:43 +00:00
parent edc0d1d46f
commit bb5834fd1c
2 changed files with 85 additions and 4 deletions
+32 -3
View File
@@ -32,9 +32,11 @@ RD_TEST(D3D12_Parameter_Zoo, D3D12GraphicsTest)
std::string pixel = R"EOSHADER(
Texture2D<float> empty : register(t50);
float4 main() : SV_Target0
{
return float4(0, 1, 0, 1);
return float4(0, 1, 0, 1) + empty.Load(int3(0,0,0));
}
)EOSHADER";
@@ -53,7 +55,10 @@ float4 main() : SV_Target0
ID3D12ResourcePtr vb = MakeBuffer().Data(DefaultTri);
ID3D12ResourcePtr ib = MakeBuffer().Data(indices);
ID3D12RootSignaturePtr sig = MakeSig({});
ID3D12RootSignaturePtr sig = MakeSig({
// table that's larger than the descriptor heap we'll bind
tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 50, 999, 0),
});
ResourceBarrier(vb, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
@@ -70,6 +75,27 @@ float4 main() : SV_Target0
},
D3D12_ROOT_SIGNATURE_FLAG_NONE);
ID3D12DescriptorHeapPtr descHeap;
{
D3D12_DESCRIPTOR_HEAP_DESC desc;
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
desc.NodeMask = 1;
desc.NumDescriptors = 4;
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
CHECK_HR(dev->CreateDescriptorHeap(&desc, __uuidof(ID3D12DescriptorHeap), (void **)&descHeap));
}
D3D12_GPU_DESCRIPTOR_HANDLE descGPUHandle = descHeap->GetGPUDescriptorHandleForHeapStart();
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
dev->CreateShaderResourceView(NULL, &srvDesc, descHeap->GetCPUDescriptorHandleForHeapStart());
ID3D12PipelineStatePtr pso = psoCreator;
// if D3D12.4 (??) is available, use different interfaces
@@ -144,6 +170,8 @@ float4 main() : SV_Target0
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
cmd->SetDescriptorHeaps(1, &descHeap.GetInterfacePtr());
IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0);
D3D12_INDEX_BUFFER_VIEW view;
view.BufferLocation = ib->GetGPUVirtualAddress();
@@ -152,6 +180,7 @@ float4 main() : SV_Target0
cmd->IASetIndexBuffer(&view);
cmd->SetPipelineState(pso);
cmd->SetGraphicsRootSignature(sig);
cmd->SetGraphicsRootDescriptorTable(0, descGPUHandle);
RSSetViewport(cmd, {0.0f, 0.0f, (float)screenWidth, (float)screenHeight, 0.0f, 1.0f});
RSSetScissorRect(cmd, {0, 0, screenWidth, screenHeight});
@@ -161,7 +190,7 @@ float4 main() : SV_Target0
D3D12_CPU_DESCRIPTOR_HANDLE rtv4 = MakeRTV(rtvtex).CreateCPU(4);
// write the proper RTV to slot 3
MakeRTV(bb).CreateCPU(3);
MakeRTV(bb).Format(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB).CreateCPU(3);
// copy to slot 4
dev->CopyDescriptorsSimple(1, rtv4, rtv3, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+53 -1
View File
@@ -20,4 +20,56 @@ class D3D12_Parameter_Zoo(rdtest.TestCase):
self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 0.5, 0.5, [0.0, 1.0, 0.0, 1.0])
rdtest.log.success("Captured loaded with color as expected")
rdtest.log.success("Captured loaded with color as expected")
postvs_data = self.get_postvs(draw, rd.MeshDataStage.VSOut, 0, draw.numIndices)
postvs_ref = {
0: {
'vtx': 0,
'idx': 0,
'SV_POSITION': [-0.5, -0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 0.0, 1.0],
'TEXCOORD': [0.0, 0.0],
},
1: {
'vtx': 1,
'idx': 1,
'SV_POSITION': [0.0, 0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 0.0, 1.0],
'TEXCOORD': [0.0, 1.0],
},
2: {
'vtx': 2,
'idx': 2,
'SV_POSITION': [0.5, -0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 0.0, 1.0],
'TEXCOORD': [1.0, 0.0],
},
}
self.check_mesh_data(postvs_ref, postvs_data)
rdtest.log.success("Mesh data is correct")
tex = rd.TextureDisplay()
tex.overlay = rd.DebugOverlay.Drawcall
tex.resourceId = pipe.GetOutputTargets()[0].resourceId
out: rd.ReplayOutput = self.controller.CreateOutput(rd.CreateHeadlessWindowingData(100, 100),
rd.ReplayOutputType.Texture)
out.SetTextureDisplay(tex)
out.Display()
overlay_id = out.GetDebugOverlayTexID()
v = pipe.GetViewport(0)
self.check_pixel_value(overlay_id, int(0.5 * v.width), int(0.5 * v.height), [0.8, 0.1, 0.8, 1.0],
eps=1.0 / 256.0)
out.Shutdown()
rdtest.log.success("Overlay color is as expected")