From b353bbdc6611274cb5c0aeabc9f20ba96e700a6a Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 28 Mar 2025 11:43:43 +0000 Subject: [PATCH] For sparse MSAA textures ignore queried heap props. Closes #3561 --- renderdoc/driver/d3d12/d3d12_initstate.cpp | 10 ++++++ util/test/demos/d3d12/d3d12_parameter_zoo.cpp | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/renderdoc/driver/d3d12/d3d12_initstate.cpp b/renderdoc/driver/d3d12/d3d12_initstate.cpp index 9b5ca2845..1b364e739 100644 --- a/renderdoc/driver/d3d12/d3d12_initstate.cpp +++ b/renderdoc/driver/d3d12/d3d12_initstate.cpp @@ -1069,6 +1069,16 @@ bool D3D12ResourceManager::Serialise_InitialState(SerialiserType &ser, ResourceI if(!m_Device->IsSparseResource(GetResID(liveRes))) liveRes->GetHeapProperties(&heapProps, NULL); + // if the resource is sparse, create on default heap + if(sparseBinds) + { + heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; + heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heapProps.CreationNodeMask = 1; + heapProps.VisibleNodeMask = 1; + } + ID3D12GraphicsCommandList *list = Unwrap(m_Device->GetInitialStateList()); if(!list) diff --git a/util/test/demos/d3d12/d3d12_parameter_zoo.cpp b/util/test/demos/d3d12/d3d12_parameter_zoo.cpp index c9564b2b6..41c8b39c9 100644 --- a/util/test/demos/d3d12/d3d12_parameter_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_parameter_zoo.cpp @@ -236,6 +236,14 @@ void main() ID3D12PipelineStatePtr psoDepth = psoCreator; + psoCreator.DSV(DXGI_FORMAT_UNKNOWN); + psoCreator.RTVs({DXGI_FORMAT_R16G16B16A16_FLOAT}); + psoCreator.SampleCount(4); + + ID3D12PipelineStatePtr psoMSAA = psoCreator; + + psoCreator.RTVs({DXGI_FORMAT_R8G8B8A8_UNORM_SRGB}); + ID3D12ResourcePtr dsvtex = MakeTexture(DXGI_FORMAT_D32_FLOAT, screenWidth, screenHeight) .DSV() .InitialState(D3D12_RESOURCE_STATE_DEPTH_WRITE); @@ -381,6 +389,25 @@ void main() ID3D12ResourcePtr bufout = MakeBuffer().Size(1024).UAV(); + ID3D12ResourcePtr sparseMSAA; + { + D3D12_RESOURCE_DESC desc; + desc.Alignment = 0; + desc.DepthOrArraySize = 1; + desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; + desc.Height = 256; + desc.Layout = D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; + desc.Width = 256; + desc.MipLevels = 1; + desc.SampleDesc.Count = 4; + desc.SampleDesc.Quality = 0; + + dev->CreateReservedResource(&desc, D3D12_RESOURCE_STATE_RENDER_TARGET, NULL, + __uuidof(ID3D12Resource), (void **)&sparseMSAA); + } + while(Running()) { ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer(); @@ -506,6 +533,11 @@ void main() cmd->SetPipelineState(psoDepth); cmd->DrawIndexedInstanced(3, 1, 0, 0, 0); + D3D12_CPU_DESCRIPTOR_HANDLE msrtv = MakeRTV(sparseMSAA).CreateCPU(1); + cmd->SetPipelineState(psoMSAA); + cmd->OMSetRenderTargets(1, &msrtv, FALSE, NULL); + cmd->DrawIndexedInstanced(3, 1, 0, 0, 0); + FinishUsingBackbuffer(cmd, D3D12_RESOURCE_STATE_RENDER_TARGET); cmd->Close();