diff --git a/util/test/demos/d3d12/d3d12_resource_mapping_zoo.cpp b/util/test/demos/d3d12/d3d12_resource_mapping_zoo.cpp index 7e78ff3b9..d2a1fde6d 100644 --- a/util/test/demos/d3d12/d3d12_resource_mapping_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_resource_mapping_zoo.cpp @@ -88,7 +88,7 @@ float4 main() : SV_Target0 std::string pixel_resArray = R"EOSHADER( Texture2DArray resArray[4] : register(t10, space1); -SamplerState samplerArray[4] : register(s10, space1); +SamplerState samplerArray[8] : register(s10, space1); cbuffer consts : register(b3) { @@ -336,7 +336,7 @@ float4 main(float4 pos : SV_Position) : SV_Target0 ID3D12RootSignaturePtr sig_resArray = MakeSig({ cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 3), tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 10, 4, 30), - tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, 1, 10, 4, 30), + tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, 1, 10, 8, 30), }); ID3D12RootSignaturePtr sig_bindless = MakeSig({ cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 3), @@ -355,6 +355,15 @@ float4 main(float4 pos : SV_Position) : SV_Target0 tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0, 8, 0), }); + D3D12_SAMPLER_DESC samplerDesc = {}; + samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; + samplerDesc.AddressU = samplerDesc.AddressV = samplerDesc.AddressW = + D3D12_TEXTURE_ADDRESS_MODE_WRAP; + UINT increment = dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + D3D12_CPU_DESCRIPTOR_HANDLE samplerStart = m_Sampler->GetCPUDescriptorHandleForHeapStart(); + for(int i = 0; i < 128; ++i) + dev->CreateSampler(&samplerDesc, {samplerStart.ptr + increment * i}); + ID3D12PipelineStatePtr pso_5_0 = MakePSO() .RootSig(sig_5_0) .InputLayout() @@ -489,6 +498,7 @@ float4 main(float4 pos : SV_Position) : SV_Target0 .RTV() .InitialState(D3D12_RESOURCE_STATE_RENDER_TARGET); + ID3D12DescriptorHeap *heaps[] = {m_CBVUAVSRV.GetInterfacePtr(), m_Sampler.GetInterfacePtr()}; while(Running()) { ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer(); @@ -512,7 +522,7 @@ float4 main(float4 pos : SV_Position) : SV_Target0 IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); cmd->SetPipelineState(pso_5_0); cmd->SetGraphicsRootSignature(sig_5_0); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); @@ -525,33 +535,36 @@ float4 main(float4 pos : SV_Position) : SV_Target0 setMarker(cmd, "sm_5_1"); cmd->SetPipelineState(pso_5_1); cmd->SetGraphicsRootSignature(sig_5_1); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(3, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(4, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "ResArray"); cmd->SetPipelineState(pso_resArray); cmd->SetGraphicsRootSignature(sig_resArray); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "Bindless"); cmd->SetPipelineState(pso_bindless); cmd->SetGraphicsRootSignature(sig_bindless); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "ResourceAccess"); cmd->SetPipelineState(pso_resourceAccess); cmd->SetGraphicsRootSignature(sig_resourceAccess); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootDescriptorTable(0, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); @@ -570,7 +583,7 @@ float4 main(float4 pos : SV_Position) : SV_Target0 IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); cmd->SetPipelineState(pso_6_0); cmd->SetGraphicsRootSignature(sig_5_0); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); @@ -583,33 +596,36 @@ float4 main(float4 pos : SV_Position) : SV_Target0 setMarker(cmd, "SM6.0 Table"); cmd->SetPipelineState(pso2_6_0); cmd->SetGraphicsRootSignature(sig_5_1); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(3, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(4, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.0 ResArray"); cmd->SetPipelineState(pso_6_0_resArray); cmd->SetGraphicsRootSignature(sig_resArray); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.0 Bindless"); cmd->SetPipelineState(pso_6_0_bindless); cmd->SetGraphicsRootSignature(sig_bindless); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.0 ResourceAccess"); cmd->SetPipelineState(pso_6_0_resourceAccess); cmd->SetGraphicsRootSignature(sig_resourceAccess); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootDescriptorTable(0, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); @@ -630,7 +646,7 @@ float4 main(float4 pos : SV_Position) : SV_Target0 IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); cmd->SetPipelineState(pso_6_6); cmd->SetGraphicsRootSignature(sig_5_0); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); @@ -643,33 +659,36 @@ float4 main(float4 pos : SV_Position) : SV_Target0 setMarker(cmd, "SM6.6 Table"); cmd->SetPipelineState(pso2_6_6); cmd->SetGraphicsRootSignature(sig_5_1); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(3, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(4, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.6 ResArray"); cmd->SetPipelineState(pso_6_6_resArray); cmd->SetGraphicsRootSignature(sig_resArray); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.6 Bindless"); cmd->SetPipelineState(pso_6_6_bindless); cmd->SetGraphicsRootSignature(sig_bindless); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootConstantBufferView(0, cb->GetGPUVirtualAddress()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); + cmd->SetGraphicsRootDescriptorTable(2, m_Sampler->GetGPUDescriptorHandleForHeapStart()); cmd->DrawInstanced(3, 1, 0, 0); setMarker(cmd, "SM6.6 ResourceAccess"); cmd->SetPipelineState(pso_6_6_resourceAccess); cmd->SetGraphicsRootSignature(sig_resourceAccess); - cmd->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr()); + cmd->SetDescriptorHeaps(2, heaps); cmd->SetGraphicsRootDescriptorTable(0, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(1, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart()); cmd->SetGraphicsRootDescriptorTable(2, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart());