void D3D12CommandData::AddDrawcall(const FetchDrawcall &d, bool hasEvents) { m_AddedDrawcall = true; FetchDrawcall draw = d; draw.eventID = m_LastCmdListID != ResourceId() ? m_BakedCmdListInfo[m_LastCmdListID].curEventID : m_RootEventID; draw.drawcallID = m_LastCmdListID != ResourceId() ? m_BakedCmdListInfo[m_LastCmdListID].drawCount : m_RootDrawcallID; for(int i = 0; i < 8; i++) draw.outputs[i] = ResourceId(); draw.depthOut = ResourceId(); draw.indexByteWidth = 0; draw.topology = eTopology_Unknown; if(m_LastCmdListID != ResourceId()) { draw.topology = MakePrimitiveTopology(m_BakedCmdListInfo[m_LastCmdListID].state.topo); draw.indexByteWidth = m_BakedCmdListInfo[m_LastCmdListID].state.idxWidth; memcpy(draw.outputs, m_BakedCmdListInfo[m_LastCmdListID].state.rts, sizeof(draw.outputs)); draw.depthOut = m_BakedCmdListInfo[m_LastCmdListID].state.dsv; } if(m_LastCmdListID != ResourceId()) m_BakedCmdListInfo[m_LastCmdListID].drawCount++; else m_RootDrawcallID++; if(hasEvents) { vector<FetchAPIEvent> &srcEvents = m_LastCmdListID != ResourceId() ? m_BakedCmdListInfo[m_LastCmdListID].curEvents : m_RootEvents; draw.events = srcEvents; srcEvents.clear(); } // should have at least the root drawcall here, push this drawcall // onto the back's children list. if(!GetDrawcallStack().empty()) { D3D12DrawcallTreeNode node(draw); node.resourceUsage.swap(m_BakedCmdListInfo[m_LastCmdListID].resourceUsage); D3D12NOTIMP("event usage"); node.children.insert(node.children.begin(), draw.children.elems, draw.children.elems + draw.children.count); GetDrawcallStack().back()->children.push_back(node); } else RDCERR("Somehow lost drawcall stack!"); }
void WrappedID3D11DeviceContext::AddDrawcall(FetchDrawcall d, bool hasEvents) { if(d.context == ResourceId()) d.context = m_pDevice->GetResourceManager()->GetOriginalID(m_ResourceID); if(GetType() == D3D11_DEVICE_CONTEXT_DEFERRED) { m_pDevice->GetImmediateContext()->AddDrawcall(d, hasEvents); return; } m_AddedDrawcall = true; WrappedID3D11DeviceContext *context = (WrappedID3D11DeviceContext *)m_pDevice->GetResourceManager()->GetLiveResource(d.context); RDCASSERT(context); FetchDrawcall draw = d; draw.eventID = m_CurEventID; draw.drawcallID = m_CurDrawcallID; draw.indexByteWidth = 0; if(m_CurrentPipelineState->IA.IndexFormat == DXGI_FORMAT_R16_UINT) draw.indexByteWidth = 2; if(m_CurrentPipelineState->IA.IndexFormat == DXGI_FORMAT_R32_UINT) draw.indexByteWidth = 4; draw.topology = MakePrimitiveTopology(m_CurrentPipelineState->IA.Topo); for(int i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) { draw.outputs[i] = ResourceId(); if(m_CurrentPipelineState->OM.RenderTargets[i]) draw.outputs[i] = ((WrappedID3D11RenderTargetView *)m_CurrentPipelineState->OM.RenderTargets[i])->GetResourceResID(); } { draw.depthOut = ResourceId(); if(m_CurrentPipelineState->OM.DepthView) draw.depthOut = ((WrappedID3D11DepthStencilView *)m_CurrentPipelineState->OM.DepthView)->GetResourceResID(); } // markers don't increment drawcall ID if((draw.flags & (eDraw_SetMarker|eDraw_PushMarker)) == 0) m_CurDrawcallID++; if(hasEvents) { vector<FetchAPIEvent> evs; evs.reserve(m_CurEvents.size()); for(size_t i=0; i < m_CurEvents.size(); ) { if(m_CurEvents[i].context == draw.context) { evs.push_back(m_CurEvents[i]); m_CurEvents.erase(m_CurEvents.begin()+i); } else { i++; } } draw.events = evs; } AddUsage(draw); // should have at least the root drawcall here, push this drawcall // onto the back's children list. if(!context->m_DrawcallStack.empty()) { DrawcallTreeNode node(draw); node.children.insert(node.children.begin(), draw.children.elems, draw.children.elems+draw.children.count); context->m_DrawcallStack.back()->children.push_back(node); } else RDCERR("Somehow lost drawcall stack!"); }
MeshFormat D3D12Replay::GetPostVSBuffers(uint32_t eventId, uint32_t instID, MeshDataStage stage) { // go through any aliasing if(m_PostVSAlias.find(eventId) != m_PostVSAlias.end()) eventId = m_PostVSAlias[eventId]; D3D12PostVSData postvs; RDCEraseEl(postvs); if(m_PostVSData.find(eventId) != m_PostVSData.end()) postvs = m_PostVSData[eventId]; const D3D12PostVSData::StageData &s = postvs.GetStage(stage); MeshFormat ret; if(s.useIndices && s.idxBuf != NULL) { ret.indexResourceId = GetResID(s.idxBuf); ret.indexByteStride = s.idxFmt == DXGI_FORMAT_R16_UINT ? 2 : 4; } else { ret.indexResourceId = ResourceId(); ret.indexByteStride = 0; } ret.indexByteOffset = 0; ret.baseVertex = 0; if(s.buf != NULL) ret.vertexResourceId = GetResID(s.buf); else ret.vertexResourceId = ResourceId(); ret.vertexByteOffset = s.instStride * instID; ret.vertexByteStride = s.vertStride; ret.format.compCount = 4; ret.format.compByteWidth = 4; ret.format.compType = CompType::Float; ret.format.type = ResourceFormatType::Regular; ret.format.bgraOrder = false; ret.showAlpha = false; ret.topology = MakePrimitiveTopology(s.topo); ret.numIndices = s.numVerts; ret.unproject = s.hasPosOut; ret.nearPlane = s.nearPlane; ret.farPlane = s.farPlane; if(instID < s.instData.size()) { D3D12PostVSData::InstData inst = s.instData[instID]; ret.vertexByteOffset = inst.bufOffset; ret.numIndices = inst.numVerts; } return ret; }