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:
baldurk
2017-04-21 19:08:05 +01:00
parent 3d41d53cc1
commit 18b62495d6
2 changed files with 35 additions and 12 deletions
+11 -3
View File
@@ -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);
+24 -9
View File
@@ -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;