diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index 153296be9..f05d039a4 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -128,6 +128,8 @@ class WrappedID3D12CommandQueue : public ID3D12CommandQueue, D3D12DrawcallTreeNode m_ParentDrawcall; + ResourceId m_BackbufferID; + void InsertDrawsAndRefreshIDs(vector &cmdBufNodes, uint32_t baseEventID, uint32_t baseDrawID); @@ -268,6 +270,7 @@ public: D3D12DrawcallTreeNode &GetParentDrawcall() { return m_ParentDrawcall; } FetchAPIEvent GetEvent(uint32_t eventID); uint32_t GetMaxEID() { return m_Events.back().eventID; } + ResourceId GetBackbufferResourceID() { return m_BackbufferID; } void ClearAfterCapture(); void AddDrawcall(const FetchDrawcall &d, bool hasEvents); diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 90fc0000b..1e00dd8c9 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -300,6 +300,8 @@ void WrappedID3D12CommandQueue::ProcessChunk(uint64_t offset, D3D12ChunkType chu bool HasCallstack = false; m_pSerialiser->Serialise("HasCallstack", HasCallstack); + m_BackbufferID = bbid; + if(HasCallstack) { size_t numLevels = 0; diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index ee52a4840..06463f834 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -23,7 +23,10 @@ ******************************************************************************/ #include "d3d12_replay.h" +#include "driver/dxgi/dxgi_common.h" +#include "d3d12_command_queue.h" #include "d3d12_device.h" +#include "d3d12_resources.h" D3D12Replay::D3D12Replay() { @@ -40,17 +43,157 @@ void D3D12Replay::Shutdown() m_pDevice->Release(); } -FetchTexture D3D12Replay::GetTexture(ResourceId id) +void D3D12Replay::ReadLogInitialisation() { - FetchTexture tex; - tex.ID = ResourceId(); - - return tex; + m_pDevice->ReadLogInitialisation(); } -ShaderReflection *D3D12Replay::GetShader(ResourceId shader, string entryPoint) +void D3D12Replay::ReplayLog(uint32_t endEventID, ReplayLogType replayType) { - return NULL; + m_pDevice->ReplayLog(0, endEventID, replayType); +} + +void D3D12Replay::SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv) +{ + RDCERR("Should never hit SetContextFilter"); +} + +vector D3D12Replay::GetBuffers() +{ + vector ret; + + for(auto it = WrappedID3D12Resource::m_List.begin(); it != WrappedID3D12Resource::m_List.end(); it++) + if(it->second->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) + ret.push_back(it->first); + + return ret; +} + +vector D3D12Replay::GetTextures() +{ + vector ret; + + for(auto it = WrappedID3D12Resource::m_List.begin(); it != WrappedID3D12Resource::m_List.end(); it++) + if(it->second->GetDesc().Dimension != D3D12_RESOURCE_DIMENSION_BUFFER) + ret.push_back(it->first); + + return ret; +} + +FetchBuffer D3D12Replay::GetBuffer(ResourceId id) +{ + FetchBuffer ret; + ret.ID = m_pDevice->GetResourceManager()->GetOriginalID(id); + + auto it = WrappedID3D12Resource::m_List.find(id); + + if(it == WrappedID3D12Resource::m_List.end()) + return ret; + + D3D12_RESOURCE_DESC desc = it->second->GetDesc(); + + ret.customName = true; + string str = ""; // TODO GetName(it.second); + + if(str == "") + { + ret.customName = false; + str = StringFormat::Fmt("Buffer %llu", ret.ID); + } + + ret.name = str; + + ret.length = desc.Width; + + // TODO maybe improve these through usage tracking? 'implicit' creation flags + ret.creationFlags = eBufferCreate_VB | eBufferCreate_IB | eBufferCreate_CB | eBufferCreate_Indirect; + if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) + ret.creationFlags |= eBufferCreate_UAV; + + return ret; +} + +FetchTexture D3D12Replay::GetTexture(ResourceId id) +{ + FetchTexture ret; + ret.ID = m_pDevice->GetResourceManager()->GetOriginalID(id); + + auto it = WrappedID3D12Resource::m_List.find(id); + + if(it == WrappedID3D12Resource::m_List.end()) + return ret; + + D3D12_RESOURCE_DESC desc = it->second->GetDesc(); + + ret.format = MakeResourceFormat(desc.Format); + ret.dimension = desc.Dimension - D3D12_RESOURCE_DIMENSION_BUFFER; + + ret.width = (uint32_t)desc.Width; + ret.height = desc.Height; + ret.depth = desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? desc.DepthOrArraySize : 1; + ret.arraysize = desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? desc.DepthOrArraySize : 1; + ret.numSubresources = GetNumSubresources(&desc); + ret.mips = desc.MipLevels; + ret.msQual = desc.SampleDesc.Quality; + ret.msSamp = desc.SampleDesc.Count; + ret.byteSize = 0; + for(uint32_t i = 0; i < ret.mips; i++) + ret.byteSize += GetByteSize(ret.width, ret.height, ret.depth, desc.Format, i); + + switch(ret.dimension) + { + case 1: ret.resType = ret.arraysize > 1 ? eResType_Texture1DArray : eResType_Texture1D; break; + case 2: + if(ret.msSamp > 1) + ret.resType = ret.arraysize > 1 ? eResType_Texture2DMSArray : eResType_Texture2DMS; + else + ret.resType = ret.arraysize > 1 ? eResType_Texture2DArray : eResType_Texture2D; + break; + case 3: ret.resType = eResType_Texture3D; break; + } + + // TODO determine this from usage? + ret.cubemap = false; // eResType_TextureCube, eResType_TextureCubeArray + + ret.creationFlags = eTextureCreate_SRV; + + if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET) + ret.creationFlags |= eTextureCreate_RTV; + if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) + ret.creationFlags |= eTextureCreate_DSV; + if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) + ret.creationFlags |= eTextureCreate_UAV; + + if(id == m_pDevice->GetQueue()->GetBackbufferResourceID()) + ret.creationFlags |= eTextureCreate_SwapBuffer; + + ret.customName = true; + string str = ""; // TODO GetName(it.second); + + if(str == "") + { + const char *suffix = ""; + const char *ms = ""; + + if(ret.msSamp > 1) + ms = "MS"; + + if(ret.creationFlags & eTextureCreate_RTV) + suffix = " RTV"; + if(ret.creationFlags & eTextureCreate_DSV) + suffix = " DSV"; + + ret.customName = false; + + if(ret.arraysize > 1) + str = StringFormat::Fmt("Texture%uD%sArray%s %llu", ret.dimension, ms, suffix, ret.ID); + else + str = StringFormat::Fmt("Texture%uD%s%s %llu", ret.dimension, ms, suffix, ret.ID); + } + + ret.name = str; + + return ret; } void D3D12Replay::FreeTargetResource(ResourceId id) @@ -78,75 +221,14 @@ FetchFrameRecord D3D12Replay::GetFrameRecord() return m_pDevice->GetFrameRecord(); } -vector D3D12Replay::GetUsage(ResourceId id) +ResourceId D3D12Replay::GetLiveID(ResourceId id) { - return vector(); + return m_pDevice->GetResourceManager()->GetLiveID(id); } -vector D3D12Replay::GetDebugMessages() +bool D3D12Replay::RenderTexture(TextureDisplay cfg) { - return vector(); -} - -APIProperties D3D12Replay::GetAPIProperties() -{ - APIProperties ret; - - ret.pipelineType = ePipelineState_D3D11; - ret.degraded = false; - - return ret; -} - -vector D3D12Replay::GetBuffers() -{ - vector ret; - - return ret; -} - -FetchBuffer D3D12Replay::GetBuffer(ResourceId id) -{ - FetchBuffer ret; - ret.ID = ResourceId(); - - return ret; -} - -vector D3D12Replay::GetTextures() -{ - vector ret; - - return ret; -} - -D3D11PipelineState D3D12Replay::MakePipelineState() -{ - D3D11PipelineState ret; - - return ret; -} - -void D3D12Replay::ReadLogInitialisation() -{ - m_pDevice->ReadLogInitialisation(); -} - -void D3D12Replay::SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t lastDefEv) -{ - RDCERR("Should never hit SetContextFilter"); -} - -void D3D12Replay::ReplayLog(uint32_t endEventID, ReplayLogType replayType) -{ - m_pDevice->ReplayLog(0, endEventID, replayType); -} - -vector D3D12Replay::GetPassEvents(uint32_t eventID) -{ - vector passEvents; - - return passEvents; + return m_pDevice->GetDebugManager()->RenderTexture(cfg, true); } uint64_t D3D12Replay::MakeOutputWindow(void *w, bool depth) @@ -194,6 +276,72 @@ void D3D12Replay::FlipOutputWindow(uint64_t id) m_pDevice->GetDebugManager()->FlipOutputWindow(id); } +void D3D12Replay::ReplaceResource(ResourceId from, ResourceId to) +{ + m_pDevice->GetResourceManager()->ReplaceResource(from, to); +} + +void D3D12Replay::RemoveReplacement(ResourceId id) +{ + m_pDevice->GetResourceManager()->RemoveReplacement(id); +} + +void D3D12Replay::InitCallstackResolver() +{ + m_pDevice->GetSerialiser()->InitCallstackResolver(); +} + +bool D3D12Replay::HasCallstacks() +{ + return m_pDevice->GetSerialiser()->HasCallstacks(); +} + +Callstack::StackResolver *D3D12Replay::GetCallstackResolver() +{ + return m_pDevice->GetSerialiser()->GetCallstackResolver(); +} + +#pragma region not yet implemented + +APIProperties D3D12Replay::GetAPIProperties() +{ + APIProperties ret; + + ret.pipelineType = ePipelineState_D3D11; + ret.degraded = false; + + return ret; +} + +ShaderReflection *D3D12Replay::GetShader(ResourceId shader, string entryPoint) +{ + return NULL; +} + +vector D3D12Replay::GetUsage(ResourceId id) +{ + return vector(); +} + +vector D3D12Replay::GetDebugMessages() +{ + return vector(); +} + +vector D3D12Replay::GetPassEvents(uint32_t eventID) +{ + vector passEvents; + + return passEvents; +} + +D3D11PipelineState D3D12Replay::MakePipelineState() +{ + D3D11PipelineState ret; + + return ret; +} + void D3D12Replay::InitPostVSBuffers(uint32_t eventID) { } @@ -202,11 +350,6 @@ void D3D12Replay::InitPostVSBuffers(const vector &passEvents) { } -ResourceId D3D12Replay::GetLiveID(ResourceId id) -{ - return m_pDevice->GetResourceManager()->GetLiveID(id); -} - bool D3D12Replay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, FormatComponentType typeHint, float *minval, float *maxval) { @@ -240,16 +383,6 @@ byte *D3D12Replay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mi return NULL; } -void D3D12Replay::ReplaceResource(ResourceId from, ResourceId to) -{ - m_pDevice->GetResourceManager()->ReplaceResource(from, to); -} - -void D3D12Replay::RemoveReplacement(ResourceId id) -{ - m_pDevice->GetResourceManager()->RemoveReplacement(id); -} - vector D3D12Replay::EnumerateCounters() { return vector(); @@ -280,11 +413,6 @@ void D3D12Replay::BuildCustomShader(string source, string entry, const uint32_t { } -bool D3D12Replay::RenderTexture(TextureDisplay cfg) -{ - return m_pDevice->GetDebugManager()->RenderTexture(cfg, true); -} - void D3D12Replay::RenderCheckerboard(Vec3f light, Vec3f dark) { } @@ -353,21 +481,6 @@ bool D3D12Replay::IsRenderOutput(ResourceId id) return false; } -void D3D12Replay::InitCallstackResolver() -{ - m_pDevice->GetSerialiser()->InitCallstackResolver(); -} - -bool D3D12Replay::HasCallstacks() -{ - return m_pDevice->GetSerialiser()->HasCallstacks(); -} - -Callstack::StackResolver *D3D12Replay::GetCallstackResolver() -{ - return m_pDevice->GetSerialiser()->GetCallstackResolver(); -} - ResourceId D3D12Replay::CreateProxyTexture(const FetchTexture &templateTex) { return ResourceId(); @@ -387,6 +500,8 @@ void D3D12Replay::SetProxyBufferData(ResourceId bufid, byte *data, size_t dataSi { } +#pragma endregion + extern "C" __declspec(dllexport) HRESULT __cdecl RENDERDOC_CreateWrappedD3D12Device(IUnknown *pAdapter, D3D_FEATURE_LEVEL MinimumFeatureLevel, REFIID riid,