mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 17:10:47 +00:00
Return texture and buffer information on replay, mark unimplemented fns
This commit is contained in:
@@ -128,6 +128,8 @@ class WrappedID3D12CommandQueue : public ID3D12CommandQueue,
|
||||
|
||||
D3D12DrawcallTreeNode m_ParentDrawcall;
|
||||
|
||||
ResourceId m_BackbufferID;
|
||||
|
||||
void InsertDrawsAndRefreshIDs(vector<D3D12DrawcallTreeNode> &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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<ResourceId> D3D12Replay::GetBuffers()
|
||||
{
|
||||
vector<ResourceId> 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<ResourceId> D3D12Replay::GetTextures()
|
||||
{
|
||||
vector<ResourceId> 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<EventUsage> D3D12Replay::GetUsage(ResourceId id)
|
||||
ResourceId D3D12Replay::GetLiveID(ResourceId id)
|
||||
{
|
||||
return vector<EventUsage>();
|
||||
return m_pDevice->GetResourceManager()->GetLiveID(id);
|
||||
}
|
||||
|
||||
vector<DebugMessage> D3D12Replay::GetDebugMessages()
|
||||
bool D3D12Replay::RenderTexture(TextureDisplay cfg)
|
||||
{
|
||||
return vector<DebugMessage>();
|
||||
}
|
||||
|
||||
APIProperties D3D12Replay::GetAPIProperties()
|
||||
{
|
||||
APIProperties ret;
|
||||
|
||||
ret.pipelineType = ePipelineState_D3D11;
|
||||
ret.degraded = false;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vector<ResourceId> D3D12Replay::GetBuffers()
|
||||
{
|
||||
vector<ResourceId> ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
FetchBuffer D3D12Replay::GetBuffer(ResourceId id)
|
||||
{
|
||||
FetchBuffer ret;
|
||||
ret.ID = ResourceId();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
vector<ResourceId> D3D12Replay::GetTextures()
|
||||
{
|
||||
vector<ResourceId> 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<uint32_t> D3D12Replay::GetPassEvents(uint32_t eventID)
|
||||
{
|
||||
vector<uint32_t> 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<EventUsage> D3D12Replay::GetUsage(ResourceId id)
|
||||
{
|
||||
return vector<EventUsage>();
|
||||
}
|
||||
|
||||
vector<DebugMessage> D3D12Replay::GetDebugMessages()
|
||||
{
|
||||
return vector<DebugMessage>();
|
||||
}
|
||||
|
||||
vector<uint32_t> D3D12Replay::GetPassEvents(uint32_t eventID)
|
||||
{
|
||||
vector<uint32_t> 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<uint32_t> &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<uint32_t> D3D12Replay::EnumerateCounters()
|
||||
{
|
||||
return vector<uint32_t>();
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user