From 627391be7e3b4c79f3672748d1d4dc2682f8af59 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 29 Jan 2020 15:44:10 +0000 Subject: [PATCH] Fix lookups of UAV data when debugging groupshared access --- renderdoc/driver/shaders/dxbc/dxbc_debug.cpp | 115 +++++++++++-------- 1 file changed, 65 insertions(+), 50 deletions(-) diff --git a/renderdoc/driver/shaders/dxbc/dxbc_debug.cpp b/renderdoc/driver/shaders/dxbc/dxbc_debug.cpp index 9bc5beed4..e530ec017 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_debug.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_debug.cpp @@ -3043,53 +3043,14 @@ State State::GetNext(GlobalState &global, DebugAPIWrapper *apiWrapper, State qua RDCASSERT(stride != 0); - ShaderDebug::BindingSlot slot = GetBindingSlotForIdentifier( - *program, srv ? TYPE_RESOURCE : TYPE_UNORDERED_ACCESS_VIEW, resIndex); - GlobalState::SRVIterator srvIter; - GlobalState::UAVIterator uavIter; - if(srv) - { - srvIter = global.srvs.find(slot); - if(srvIter == global.srvs.end()) - { - if(!apiWrapper->FetchSRV(slot)) - { - RDCERR("Invalid SRV reg=%u, space=%u", slot.shaderRegister, slot.registerSpace); - return s; - } - srvIter = global.srvs.find(slot); - } - } - else - { - uavIter = global.uavs.find(slot); - if(uavIter == global.uavs.end()) - { - if(!apiWrapper->FetchUAV(slot)) - { - RDCERR("Invalid UAV reg=%u, space=%u", slot.shaderRegister, slot.registerSpace); - return s; - } - uavIter = global.uavs.find(slot); - } - } - - uint32_t offset = srv ? srvIter->second.firstElement : uavIter->second.firstElement; - uint32_t numElems = srv ? srvIter->second.numElements : uavIter->second.numElements; - GlobalState::ViewFmt fmt = srv ? srvIter->second.format : uavIter->second.format; - - // indexing for raw views is in bytes, but firstElement/numElements is in format-sized - // units. Multiply up by stride - if(op.operation == OPCODE_LD_RAW || op.operation == OPCODE_STORE_RAW) - { - offset *= RDCMIN(4, fmt.byteWidth); - numElems *= RDCMIN(4, fmt.byteWidth); - } - - byte *data = srv ? &srvIter->second.data[0] : &uavIter->second.data[0]; - bool texData = srv ? false : uavIter->second.tex; - uint32_t rowPitch = srv ? 0 : uavIter->second.rowPitch; - uint32_t depthPitch = srv ? 0 : uavIter->second.depthPitch; + byte *data = NULL; + size_t dataSize = 0; + bool texData = false; + uint32_t rowPitch = 0; + uint32_t depthPitch = 0; + uint32_t offset = 0; + uint32_t numElems = 0; + GlobalState::ViewFmt fmt; if(gsm) { @@ -3104,7 +3065,8 @@ State State::GetNext(GlobalState &global, DebugAPIWrapper *apiWrapper, State qua { numElems = global.groupshared[resIndex].count; stride = global.groupshared[resIndex].bytestride; - data = &global.groupshared[resIndex].data[0]; + data = global.groupshared[resIndex].data.data(); + dataSize = global.groupshared[resIndex].data.size(); fmt.fmt = CompType::UInt; fmt.byteWidth = 4; fmt.numComps = global.groupshared[resIndex].bytestride / 4; @@ -3112,6 +3074,60 @@ State State::GetNext(GlobalState &global, DebugAPIWrapper *apiWrapper, State qua } texData = false; } + else + { + ShaderDebug::BindingSlot slot = GetBindingSlotForIdentifier( + *program, srv ? TYPE_RESOURCE : TYPE_UNORDERED_ACCESS_VIEW, resIndex); + + if(srv) + { + GlobalState::SRVIterator srvIter = global.srvs.find(slot); + if(srvIter == global.srvs.end()) + { + if(!apiWrapper->FetchSRV(slot)) + { + RDCERR("Invalid SRV reg=%u, space=%u", slot.shaderRegister, slot.registerSpace); + return s; + } + srvIter = global.srvs.find(slot); + } + + data = srvIter->second.data.data(); + offset = srvIter->second.firstElement; + numElems = srvIter->second.numElements; + fmt = srvIter->second.format; + } + else + { + GlobalState::UAVIterator uavIter = global.uavs.find(slot); + if(uavIter == global.uavs.end()) + { + if(!apiWrapper->FetchUAV(slot)) + { + RDCERR("Invalid UAV reg=%u, space=%u", slot.shaderRegister, slot.registerSpace); + return s; + } + uavIter = global.uavs.find(slot); + } + + data = uavIter->second.data.data(); + dataSize = uavIter->second.data.size(); + texData = uavIter->second.tex; + rowPitch = uavIter->second.rowPitch; + depthPitch = uavIter->second.depthPitch; + offset = uavIter->second.firstElement; + numElems = uavIter->second.numElements; + fmt = uavIter->second.format; + } + } + + // indexing for raw views is in bytes, but firstElement/numElements is in format-sized + // units. Multiply up by stride + if(op.operation == OPCODE_LD_RAW || op.operation == OPCODE_STORE_RAW) + { + offset *= RDCMIN(4, fmt.byteWidth); + numElems *= RDCMIN(4, fmt.byteWidth); + } RDCASSERT(data); @@ -3124,8 +3140,7 @@ State State::GetNext(GlobalState &global, DebugAPIWrapper *apiWrapper, State qua texOffset += texCoords[2] * depthPitch; } - if(!data || (!texData && elemIdx >= numElems) || - (texData && texOffset >= uavIter->second.data.size())) + if(!data || (!texData && elemIdx >= numElems) || (texData && texOffset >= dataSize)) { if(load) s.SetDst(op.operands[0], op, ShaderVariable("", 0U, 0U, 0U, 0U));