From 18b62495d6a510f23907ff14b9ed1fc1a6331f1b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 21 Apr 2017 19:08:05 +0100 Subject: [PATCH] Handle UINT_MAX for number of descriptors in range, fixes reported crash * UINT_MAX indicates all remaining descriptors on the heap should be bound to that range. --- renderdoc/driver/d3d12/d3d12_commands.cpp | 14 +++++++--- renderdoc/driver/d3d12/d3d12_replay.cpp | 33 ++++++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 9c635426b..b3369ce26 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -1117,13 +1117,21 @@ void D3D12CommandData::AddUsage(D3D12DrawcallTreeNode &drawNode) desc += el.offset; desc += offset; - prevTableOffset = offset + range.NumDescriptors; + UINT num = range.NumDescriptors; + + if(num == UINT_MAX) + { + // find out how many descriptors are left after + num = heap->GetNumDescriptors() - offset - UINT(el.offset); + } + + prevTableOffset = offset + num; if(range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_CBV) { EventUsage usage(e, cb); - for(UINT i = 0; i < range.NumDescriptors; i++) + for(UINT i = 0; i < num; i++) { ResourceId id = WrappedID3D12Resource::GetResIDFromAddr(desc->nonsamp.cbv.BufferLocation); @@ -1138,7 +1146,7 @@ void D3D12CommandData::AddUsage(D3D12DrawcallTreeNode &drawNode) { ResourceUsage usage = range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV ? ro : rw; - for(UINT i = 0; i < range.NumDescriptors; i++) + for(UINT i = 0; i < num; i++) { AddUsage(drawNode, GetResID(desc->nonsamp.resource), e, usage); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index c4eb651ea..2f4345ac1 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -667,22 +667,37 @@ void D3D12Replay::FillRegisterSpaces(const D3D12RenderState::RootSignature &root if(range.OffsetInDescriptorsFromTableStart == D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) offset = prevTableOffset; + UINT num = range.NumDescriptors; + if(heap) { desc = (D3D12Descriptor *)heap->GetCPUDescriptorHandleForHeapStart().ptr; desc += e->offset; desc += offset; + + if(num == UINT_MAX) + { + // find out how many descriptors are left after + num = heap->GetNumDescriptors() - offset - UINT(e->offset); + } + } + else if(num == UINT_MAX) + { + RDCWARN( + "Heap not available on replay with unbounded descriptor range, clamping to 1 " + "descriptor."); + num = 1; } - prevTableOffset = offset + range.NumDescriptors; + prevTableOffset = offset + num; if(range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER) { - UINT maxReg = shaderReg + range.NumDescriptors - 1; + UINT maxReg = shaderReg + num - 1; if(maxReg >= spaces[regSpace].samplers.size()) spaces[regSpace].samplers.resize(maxReg + 1); - for(UINT i = 0; i < range.NumDescriptors; i++, shaderReg++) + for(UINT i = 0; i < num; i++, shaderReg++) { D3D12Pipe::Sampler &samp = spaces[regSpace].samplers[shaderReg]; samp.Immediate = false; @@ -714,11 +729,11 @@ void D3D12Replay::FillRegisterSpaces(const D3D12RenderState::RootSignature &root } else if(range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_CBV) { - UINT maxReg = shaderReg + range.NumDescriptors - 1; + UINT maxReg = shaderReg + num - 1; if(maxReg >= spaces[regSpace].cbuffers.size()) spaces[regSpace].cbuffers.resize(maxReg + 1); - for(UINT i = 0; i < range.NumDescriptors; i++, shaderReg++) + for(UINT i = 0; i < num; i++, shaderReg++) { D3D12Pipe::CBuffer &cb = spaces[regSpace].cbuffers[shaderReg]; cb.Immediate = false; @@ -738,11 +753,11 @@ void D3D12Replay::FillRegisterSpaces(const D3D12RenderState::RootSignature &root } else if(range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV) { - UINT maxReg = shaderReg + range.NumDescriptors - 1; + UINT maxReg = shaderReg + num - 1; if(maxReg >= spaces[regSpace].srvs.size()) spaces[regSpace].srvs.resize(maxReg + 1); - for(UINT i = 0; i < range.NumDescriptors; i++, shaderReg++) + for(UINT i = 0; i < num; i++, shaderReg++) { D3D12Pipe::View &view = spaces[regSpace].srvs[shaderReg]; view.Immediate = false; @@ -759,11 +774,11 @@ void D3D12Replay::FillRegisterSpaces(const D3D12RenderState::RootSignature &root } else if(range.RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV) { - UINT maxReg = shaderReg + range.NumDescriptors - 1; + UINT maxReg = shaderReg + num - 1; if(maxReg >= spaces[regSpace].uavs.size()) spaces[regSpace].uavs.resize(maxReg + 1); - for(UINT i = 0; i < range.NumDescriptors; i++, shaderReg++) + for(UINT i = 0; i < num; i++, shaderReg++) { D3D12Pipe::View &view = spaces[regSpace].uavs[shaderReg]; view.Immediate = false;