void D3D11Replay::FillTimers(D3D11CounterContext &ctx, const DrawcallDescription &drawnode) { const D3D11_QUERY_DESC qtimedesc = {D3D11_QUERY_TIMESTAMP, 0}; const D3D11_QUERY_DESC qstatsdesc = {D3D11_QUERY_PIPELINE_STATISTICS, 0}; const D3D11_QUERY_DESC qoccldesc = {D3D11_QUERY_OCCLUSION, 0}; if(drawnode.children.empty()) return; for(size_t i = 0; i < drawnode.children.size(); i++) { const DrawcallDescription &d = drawnode.children[i]; FillTimers(ctx, drawnode.children[i]); if(d.events.empty()) continue; GPUTimer *timer = NULL; HRESULT hr = S_OK; { ctx.timers.push_back(GPUTimer()); timer = &ctx.timers.back(); timer->eventId = d.eventId; timer->before = timer->after = timer->stats = timer->occlusion = NULL; hr = m_pDevice->CreateQuery(&qtimedesc, &timer->before); RDCASSERTEQUAL(hr, S_OK); hr = m_pDevice->CreateQuery(&qtimedesc, &timer->after); RDCASSERTEQUAL(hr, S_OK); hr = m_pDevice->CreateQuery(&qstatsdesc, &timer->stats); RDCASSERTEQUAL(hr, S_OK); hr = m_pDevice->CreateQuery(&qoccldesc, &timer->occlusion); RDCASSERTEQUAL(hr, S_OK); } m_pDevice->ReplayLog(ctx.eventStart, d.eventId, eReplay_WithoutDraw); SerializeImmediateContext(); if(timer->stats) m_pImmediateContext->Begin(timer->stats); if(timer->occlusion) m_pImmediateContext->Begin(timer->occlusion); if(timer->before && timer->after) m_pImmediateContext->End(timer->before); m_pDevice->ReplayLog(ctx.eventStart, d.eventId, eReplay_OnlyDraw); if(timer->before && timer->after) m_pImmediateContext->End(timer->after); if(timer->occlusion) m_pImmediateContext->End(timer->occlusion); if(timer->stats) m_pImmediateContext->End(timer->stats); ctx.eventStart = d.eventId + 1; } }
void D3D11DebugManager::FillTimers(CounterContext &ctx, const DrawcallTreeNode &drawnode) { const D3D11_QUERY_DESC qdesc = {D3D11_QUERY_TIMESTAMP, 0}; if(drawnode.children.empty()) return; for(size_t i = 0; i < drawnode.children.size(); i++) { const FetchDrawcall &d = drawnode.children[i].draw; FillTimers(ctx, drawnode.children[i]); if(d.events.count == 0) continue; GPUTimer *timer = NULL; HRESULT hr = S_OK; { if(ctx.reuseIdx == -1) { ctx.timers.push_back(GPUTimer()); timer = &ctx.timers.back(); timer->eventID = d.eventID; timer->before = timer->after = NULL; hr = m_pDevice->CreateQuery(&qdesc, &timer->before); RDCASSERTEQUAL(hr, S_OK); hr = m_pDevice->CreateQuery(&qdesc, &timer->after); RDCASSERTEQUAL(hr, S_OK); } else { timer = &ctx.timers[ctx.reuseIdx++]; } } m_WrappedDevice->ReplayLog(ctx.eventStart, d.eventID, eReplay_WithoutDraw); m_pImmediateContext->Flush(); if(timer->before && timer->after) { m_pImmediateContext->End(timer->before); m_WrappedDevice->ReplayLog(ctx.eventStart, d.eventID, eReplay_OnlyDraw); m_pImmediateContext->End(timer->after); } else { m_WrappedDevice->ReplayLog(ctx.eventStart, d.eventID, eReplay_OnlyDraw); } ctx.eventStart = d.eventID + 1; } }