mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-26 08:26:50 +00:00
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.
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user