Return texture and buffer information on replay, mark unimplemented fns

This commit is contained in:
baldurk
2016-07-10 16:12:09 +03:00
parent 4268d8f58f
commit b12dcbb869
3 changed files with 227 additions and 107 deletions
@@ -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;
+222 -107
View File
@@ -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,