mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-04 12:55:37 +00:00
Split cmdbuffer data into stuff under resource record, and replay state
This commit is contained in:
@@ -876,7 +876,7 @@ void WrappedVulkan::ContextReplayLog(LogState readType, uint32_t startEventID, u
|
||||
{
|
||||
// these events are completely omitted, so don't increment the curEventID
|
||||
if(context != BEGIN_CMD_BUFFER && context != END_CMD_BUFFER)
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].curEventID++;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID++;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1429,8 +1429,8 @@ void WrappedVulkan::AddDrawcall(FetchDrawcall d, bool hasEvents)
|
||||
m_AddedDrawcall = true;
|
||||
|
||||
FetchDrawcall draw = d;
|
||||
draw.eventID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID;
|
||||
draw.drawcallID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].drawCount : m_RootDrawcallID;
|
||||
draw.eventID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID;
|
||||
draw.drawcallID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount : m_RootDrawcallID;
|
||||
|
||||
for(int i=0; i < 8; i++)
|
||||
draw.outputs[i] = ResourceId();
|
||||
@@ -1446,13 +1446,13 @@ void WrappedVulkan::AddDrawcall(FetchDrawcall d, bool hasEvents)
|
||||
draw.indexByteWidth = m_PartialReplayData.state.ibuffer.bytewidth;
|
||||
|
||||
if(m_LastCmdBufferID != ResourceId())
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].drawCount++;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount++;
|
||||
else
|
||||
m_RootDrawcallID++;
|
||||
|
||||
if(hasEvents)
|
||||
{
|
||||
vector<FetchAPIEvent> &srcEvents = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEvents : m_RootEvents;
|
||||
vector<FetchAPIEvent> &srcEvents = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents : m_RootEvents;
|
||||
|
||||
draw.events = srcEvents; srcEvents.clear();
|
||||
}
|
||||
@@ -1477,7 +1477,7 @@ void WrappedVulkan::AddEvent(VulkanChunkType type, string description)
|
||||
|
||||
apievent.context = ResourceId();
|
||||
apievent.fileOffset = m_CurChunkOffset;
|
||||
apievent.eventID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID;
|
||||
apievent.eventID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID;
|
||||
|
||||
apievent.eventDesc = description;
|
||||
|
||||
@@ -1490,7 +1490,7 @@ void WrappedVulkan::AddEvent(VulkanChunkType type, string description)
|
||||
|
||||
if(m_LastCmdBufferID != ResourceId())
|
||||
{
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].curEvents.push_back(apievent);
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.push_back(apievent);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -210,18 +210,14 @@ private:
|
||||
uint32_t GetGPULocalMemoryIndex(uint32_t resourceRequiredBitmask);
|
||||
|
||||
ResourceId m_FakeBBImgId;
|
||||
|
||||
struct CmdBufferInfo
|
||||
{
|
||||
VkDevice device;
|
||||
VkCmdBufferCreateInfo createInfo;
|
||||
|
||||
vector< pair<ResourceId, ImageRegionState> > imgtransitions;
|
||||
|
||||
// used on replay
|
||||
struct BakedCmdBufferInfo
|
||||
{
|
||||
vector<FetchAPIEvent> curEvents;
|
||||
list<DrawcallTreeNode *> drawStack;
|
||||
|
||||
vector< pair<ResourceId, ImageRegionState> > imgtransitions;
|
||||
|
||||
DrawcallTreeNode *draw; // the root draw to copy from when submitting
|
||||
uint32_t eventCount; // how many events are in this cmd buffer, for quick skipping
|
||||
uint32_t curEventID; // current event ID while reading or executing
|
||||
@@ -340,7 +336,7 @@ private:
|
||||
} m_PartialReplayData;
|
||||
|
||||
bool IsPartialCmd(ResourceId cmdid) { return cmdid == m_PartialReplayData.partialParent; }
|
||||
bool InPartialRange() { return m_CmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; }
|
||||
bool InPartialRange() { return m_BakedCmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; }
|
||||
VkCmdBuffer PartialCmdBuf() { return m_PartialReplayData.resultPartialCmdBuffer; }
|
||||
|
||||
|
||||
@@ -358,7 +354,6 @@ private:
|
||||
// VKTODOHIGH all of these need to be locked
|
||||
map<ResourceId, MemState> m_MemoryInfo;
|
||||
map<ResourceId, ImgState> m_ImageInfo;
|
||||
map<ResourceId, CmdBufferInfo> m_CmdBufferInfo;
|
||||
|
||||
// below are replay-side data only, doesn't have to be thread protected
|
||||
|
||||
@@ -366,6 +361,8 @@ private:
|
||||
map<ResourceId, ResourceId> m_MemBindState;
|
||||
// current descriptor set contents
|
||||
map<ResourceId, DescriptorSetInfo> m_DescriptorSetState;
|
||||
// data for a baked command buffer - its drawcalls and events, ready to submit
|
||||
map<ResourceId, BakedCmdBufferInfo> m_BakedCmdBufferInfo;
|
||||
// immutable creation data
|
||||
VulkanCreationInfo m_CreationInfo;
|
||||
|
||||
@@ -404,7 +401,7 @@ private:
|
||||
list<DrawcallTreeNode *> &GetDrawcallStack()
|
||||
{
|
||||
if(m_LastCmdBufferID != ResourceId())
|
||||
return m_CmdBufferInfo[m_LastCmdBufferID].drawStack;
|
||||
return m_BakedCmdBufferInfo[m_LastCmdBufferID].drawStack;
|
||||
|
||||
return m_DrawcallStack;
|
||||
}
|
||||
|
||||
@@ -487,4 +487,5 @@ VkResourceRecord::~VkResourceRecord()
|
||||
|
||||
SAFE_DELETE(layout);
|
||||
SAFE_DELETE(swapInfo);
|
||||
SAFE_DELETE(cmdInfo);
|
||||
}
|
||||
|
||||
@@ -566,6 +566,22 @@ struct SwapchainInfo
|
||||
};
|
||||
vector<SwapImage> images;
|
||||
};
|
||||
|
||||
struct CmdBufferRecordingInfo
|
||||
{
|
||||
VkDevice device;
|
||||
VkCmdBufferCreateInfo createInfo;
|
||||
|
||||
vector< pair<ResourceId, ImageRegionState> > imgtransitions;
|
||||
|
||||
// a list of all resources dirtied by this command buffer
|
||||
set<ResourceId> dirtied;
|
||||
|
||||
// a list of descriptor sets that are bound at any point in this command buffer
|
||||
// used to look up all the frame refs per-desc set and apply them on queue
|
||||
// submit with latest binding refs.
|
||||
set<VkDescriptorSet> boundDescSets;
|
||||
};
|
||||
|
||||
struct DescSetLayout;
|
||||
|
||||
@@ -580,7 +596,8 @@ struct VkResourceRecord : public ResourceRecord
|
||||
pool(NULL),
|
||||
memory(NULL),
|
||||
layout(NULL),
|
||||
swapInfo(NULL)
|
||||
swapInfo(NULL),
|
||||
cmdInfo(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -588,9 +605,10 @@ struct VkResourceRecord : public ResourceRecord
|
||||
|
||||
void Bake()
|
||||
{
|
||||
RDCASSERT(cmdInfo);
|
||||
SwapChunks(bakedCommands);
|
||||
dirtied.swap(bakedCommands->dirtied);
|
||||
boundDescSets.swap(bakedCommands->boundDescSets);
|
||||
cmdInfo->dirtied.swap(bakedCommands->cmdInfo->dirtied);
|
||||
cmdInfo->boundDescSets.swap(bakedCommands->cmdInfo->boundDescSets);
|
||||
}
|
||||
|
||||
// need to only track current memory binding,
|
||||
@@ -646,19 +664,12 @@ struct VkResourceRecord : public ResourceRecord
|
||||
bindFrameRefs.erase(id);
|
||||
}
|
||||
|
||||
WrappedVkRes *Resource;
|
||||
|
||||
VkResourceRecord *bakedCommands;
|
||||
|
||||
WrappedVkRes *Resource;
|
||||
|
||||
SwapchainInfo *swapInfo;
|
||||
|
||||
// a list of resources that are made dirty by submitting this command buffer
|
||||
set<ResourceId> dirtied;
|
||||
|
||||
// a list of descriptor sets that are bound at any point in this command buffer
|
||||
// used to look up all the frame refs per-desc set and apply them on queue
|
||||
// submit with latest binding refs.
|
||||
set<VkDescriptorSet> boundDescSets;
|
||||
CmdBufferRecordingInfo *cmdInfo;
|
||||
|
||||
// queues associated with this instance, so they can be shut down on destruction
|
||||
vector<VkQueue> queues;
|
||||
|
||||
@@ -128,14 +128,19 @@ VkResult WrappedVulkan::vkCreateCommandBuffer(
|
||||
|
||||
// we don't serialise this as we never create this command buffer directly.
|
||||
// Instead we create a command buffer for each baked list that we find.
|
||||
|
||||
// if pNext is non-NULL, need to do a deep copy
|
||||
RDCASSERT(pCreateInfo->pNext == NULL);
|
||||
|
||||
record->cmdInfo = new CmdBufferRecordingInfo();
|
||||
|
||||
record->cmdInfo->device = device;
|
||||
record->cmdInfo->createInfo = *pCreateInfo;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetResourceManager()->AddLiveResource(id, *pCmdBuffer);
|
||||
}
|
||||
|
||||
m_CmdBufferInfo[id].device = device;
|
||||
m_CmdBufferInfo[id].createInfo = *pCreateInfo;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -149,6 +154,8 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(
|
||||
SERIALISE_ELEMENT(ResourceId, cmdId, GetResID(cmdBuffer));
|
||||
|
||||
ResourceId bakedCmdId;
|
||||
VkCmdBufferCreateInfo createInfo;
|
||||
VkDevice device = VK_NULL_HANDLE;
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
@@ -156,19 +163,14 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(
|
||||
RDCASSERT(record->bakedCommands);
|
||||
if(record->bakedCommands)
|
||||
bakedCmdId = record->bakedCommands->GetResourceID();
|
||||
|
||||
RDCASSERT(record->cmdInfo);
|
||||
device = record->cmdInfo->device;
|
||||
createInfo = record->cmdInfo->createInfo;
|
||||
}
|
||||
|
||||
SERIALISE_ELEMENT(VkCmdBufferBeginInfo, info, *pBeginInfo);
|
||||
SERIALISE_ELEMENT(ResourceId, bakeId, bakedCmdId);
|
||||
|
||||
VkCmdBufferCreateInfo createInfo;
|
||||
VkDevice device = VK_NULL_HANDLE;
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
device = m_CmdBufferInfo[cmdId].device;
|
||||
createInfo = m_CmdBufferInfo[cmdId].createInfo;
|
||||
}
|
||||
|
||||
if(m_State < WRITING)
|
||||
{
|
||||
@@ -185,7 +187,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(
|
||||
if(m_State == EXECUTING)
|
||||
{
|
||||
const vector<uint32_t> &baseEvents = m_PartialReplayData.cmdBufferSubmits[bakeId];
|
||||
uint32_t length = m_CmdBufferInfo[bakeId].eventCount;
|
||||
uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount;
|
||||
|
||||
for(auto it=baseEvents.begin(); it != baseEvents.end(); ++it)
|
||||
{
|
||||
@@ -219,7 +221,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(
|
||||
}
|
||||
}
|
||||
|
||||
m_CmdBufferInfo[cmdId].curEventID = 1;
|
||||
m_BakedCmdBufferInfo[cmdId].curEventID = 1;
|
||||
}
|
||||
else if(m_State == READING)
|
||||
{
|
||||
@@ -253,15 +255,15 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(
|
||||
|
||||
{
|
||||
DrawcallTreeNode *draw = new DrawcallTreeNode;
|
||||
m_CmdBufferInfo[cmdId].draw = draw;
|
||||
m_BakedCmdBufferInfo[cmdId].draw = draw;
|
||||
|
||||
// On queue submit we increment all child events/drawcalls by
|
||||
// m_RootEventID insert them into the tree.
|
||||
m_CmdBufferInfo[cmdId].curEventID = 1;
|
||||
m_CmdBufferInfo[cmdId].eventCount = 0;
|
||||
m_CmdBufferInfo[cmdId].drawCount = 0;
|
||||
m_BakedCmdBufferInfo[cmdId].curEventID = 1;
|
||||
m_BakedCmdBufferInfo[cmdId].eventCount = 0;
|
||||
m_BakedCmdBufferInfo[cmdId].drawCount = 0;
|
||||
|
||||
m_CmdBufferInfo[cmdId].drawStack.push_back(draw);
|
||||
m_BakedCmdBufferInfo[cmdId].drawStack.push_back(draw);
|
||||
}
|
||||
|
||||
ObjDisp(device)->BeginCommandBuffer(Unwrap(cmd), &info);
|
||||
@@ -283,6 +285,10 @@ VkResult WrappedVulkan::vkBeginCommandBuffer(
|
||||
record->bakedCommands->Delete(GetResourceManager());
|
||||
|
||||
record->bakedCommands = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID());
|
||||
record->bakedCommands->cmdInfo = new CmdBufferRecordingInfo();
|
||||
|
||||
record->bakedCommands->cmdInfo->device = record->cmdInfo->device;
|
||||
record->bakedCommands->cmdInfo->createInfo = record->cmdInfo->createInfo;
|
||||
|
||||
{
|
||||
CACHE_THREAD_SERIALISER();
|
||||
@@ -338,7 +344,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk
|
||||
m_PartialReplayData.partialParent = ResourceId();
|
||||
}
|
||||
|
||||
m_CmdBufferInfo[cmdId].curEventID = 0;
|
||||
m_BakedCmdBufferInfo[cmdId].curEventID = 0;
|
||||
}
|
||||
else if(m_State == READING)
|
||||
{
|
||||
@@ -348,7 +354,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk
|
||||
|
||||
ObjDisp(cmdBuffer)->EndCommandBuffer(Unwrap(cmdBuffer));
|
||||
|
||||
if(!m_CmdBufferInfo[m_LastCmdBufferID].curEvents.empty())
|
||||
if(!m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.empty())
|
||||
{
|
||||
FetchDrawcall draw;
|
||||
draw.name = "API Calls";
|
||||
@@ -356,11 +362,11 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk
|
||||
|
||||
// VKTODOLOW hack, give this drawcall the same event ID as its last child, by
|
||||
// decrementing then incrementing again.
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].curEventID--;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID--;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].curEventID++;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID++;
|
||||
}
|
||||
|
||||
{
|
||||
@@ -369,16 +375,16 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk
|
||||
}
|
||||
|
||||
{
|
||||
m_CmdBufferInfo[bakeId].draw = m_CmdBufferInfo[m_LastCmdBufferID].draw;
|
||||
m_CmdBufferInfo[bakeId].curEventID = 0;
|
||||
m_CmdBufferInfo[bakeId].eventCount = m_CmdBufferInfo[m_LastCmdBufferID].curEventID-1;
|
||||
RDCASSERT(m_CmdBufferInfo[m_LastCmdBufferID].curEventID >= 1);
|
||||
m_CmdBufferInfo[bakeId].drawCount = m_CmdBufferInfo[m_LastCmdBufferID].drawCount;
|
||||
m_BakedCmdBufferInfo[bakeId].draw = m_BakedCmdBufferInfo[m_LastCmdBufferID].draw;
|
||||
m_BakedCmdBufferInfo[bakeId].curEventID = 0;
|
||||
m_BakedCmdBufferInfo[bakeId].eventCount = m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID-1;
|
||||
RDCASSERT(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID >= 1);
|
||||
m_BakedCmdBufferInfo[bakeId].drawCount = m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount;
|
||||
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].draw = NULL;
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].curEventID = 0;
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].eventCount = 0;
|
||||
m_CmdBufferInfo[m_LastCmdBufferID].drawCount = 0;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].draw = NULL;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID = 0;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].eventCount = 0;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,6 +421,8 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser,
|
||||
SERIALISE_ELEMENT(VkCmdBufferResetFlags, fl, flags);
|
||||
|
||||
ResourceId bakedCmdId;
|
||||
VkCmdBufferCreateInfo createInfo;
|
||||
VkDevice device = VK_NULL_HANDLE;
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
@@ -422,21 +430,22 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser,
|
||||
RDCASSERT(record->bakedCommands);
|
||||
if(record->bakedCommands)
|
||||
bakedCmdId = record->bakedCommands->GetResourceID();
|
||||
|
||||
RDCASSERT(record->cmdInfo);
|
||||
device = record->cmdInfo->device;
|
||||
createInfo = record->cmdInfo->createInfo;
|
||||
}
|
||||
|
||||
SERIALISE_ELEMENT(ResourceId, bakeId, bakedCmdId);
|
||||
|
||||
VkCmdBufferCreateInfo info;
|
||||
VkDevice device = VK_NULL_HANDLE;
|
||||
|
||||
if(m_State >= WRITING)
|
||||
if(m_State < WRITING)
|
||||
{
|
||||
device = m_CmdBufferInfo[cmdId].device;
|
||||
info = m_CmdBufferInfo[cmdId].createInfo;
|
||||
m_LastCmdBufferID = cmdId;
|
||||
m_CmdBuffersInProgress++;
|
||||
}
|
||||
|
||||
SERIALISE_ELEMENT(ResourceId, devId, GetResID(device));
|
||||
localSerialiser->Serialise("createInfo", info);
|
||||
localSerialiser->Serialise("createInfo", createInfo);
|
||||
|
||||
if(m_State == EXECUTING)
|
||||
{
|
||||
@@ -449,7 +458,7 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser,
|
||||
|
||||
if(!GetResourceManager()->HasLiveResource(bakeId))
|
||||
{
|
||||
VkResult ret = ObjDisp(device)->CreateCommandBuffer(Unwrap(device), &info, &cmd);
|
||||
VkResult ret = ObjDisp(device)->CreateCommandBuffer(Unwrap(device), &createInfo, &cmd);
|
||||
|
||||
if(ret != VK_SUCCESS)
|
||||
{
|
||||
@@ -489,6 +498,10 @@ VkResult WrappedVulkan::vkResetCommandBuffer(
|
||||
record->bakedCommands->Delete(GetResourceManager());
|
||||
|
||||
record->bakedCommands = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID());
|
||||
record->bakedCommands->cmdInfo = new CmdBufferRecordingInfo();
|
||||
|
||||
record->bakedCommands->cmdInfo->device = record->cmdInfo->device;
|
||||
record->bakedCommands->cmdInfo->createInfo = record->cmdInfo->createInfo;
|
||||
|
||||
// VKTODOHIGH do we need to actually serialise this at all? all it does is
|
||||
// reset a command buffer to be able to begin again. We could just move the
|
||||
@@ -990,7 +1003,7 @@ void WrappedVulkan::vkCmdBindDescriptorSets(
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
record->MarkResourceFrameReferenced(GetResID(layout), eFrameRef_Read);
|
||||
record->boundDescSets.insert(pDescriptorSets, pDescriptorSets + setCount);
|
||||
record->cmdInfo->boundDescSets.insert(pDescriptorSets, pDescriptorSets + setCount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1219,7 +1232,7 @@ void WrappedVulkan::vkCmdUpdateBuffer(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1287,7 +1300,7 @@ void WrappedVulkan::vkCmdFillBuffer(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1421,7 +1434,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
|
||||
ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]);
|
||||
|
||||
ResourceId cmd = GetResID(PartialCmdBuf());
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
}
|
||||
}
|
||||
else if(m_State == READING)
|
||||
@@ -1431,7 +1444,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
|
||||
ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]);
|
||||
|
||||
ResourceId cmd = GetResID(cmdBuffer);
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
}
|
||||
|
||||
for(size_t i=0; i < mems.size(); i++)
|
||||
@@ -1514,7 +1527,7 @@ void WrappedVulkan::vkCmdPipelineBarrier(
|
||||
}
|
||||
|
||||
ResourceId cmd = GetResID(cmdBuffer);
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
|
||||
// VKTODOMED do we need to mark frame referenced the resources in the barrier? if they're not referenced
|
||||
// elsewhere, perhaps they can be dropped
|
||||
@@ -1581,7 +1594,7 @@ void WrappedVulkan::vkCmdWriteTimestamp(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1661,7 +1674,7 @@ void WrappedVulkan::vkCmdCopyQueryPoolResults(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1884,7 +1897,7 @@ bool WrappedVulkan::Serialise_vkCmdDbgMarkerEnd(Serialiser* localSerialiser, VkC
|
||||
if(m_State < WRITING)
|
||||
m_LastCmdBufferID = cmdid;
|
||||
|
||||
if(m_State == READING && !m_CmdBufferInfo[m_LastCmdBufferID].curEvents.empty())
|
||||
if(m_State == READING && !m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.empty())
|
||||
{
|
||||
FetchDrawcall draw;
|
||||
draw.name = "API Calls";
|
||||
|
||||
@@ -175,11 +175,11 @@ void WrappedVulkan::vkCmdBlitImage(
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
|
||||
record->dirtied.insert(GetResID(destImage));
|
||||
record->cmdInfo->dirtied.insert(GetResID(destImage));
|
||||
{
|
||||
VkResourceRecord *im = GetRecord(destImage);
|
||||
if(im->GetMemoryRecord())
|
||||
record->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
|
||||
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write);
|
||||
@@ -255,11 +255,11 @@ void WrappedVulkan::vkCmdResolveImage(
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
|
||||
record->dirtied.insert(GetResID(destImage));
|
||||
record->cmdInfo->dirtied.insert(GetResID(destImage));
|
||||
{
|
||||
VkResourceRecord *im = GetRecord(destImage);
|
||||
if(im->GetMemoryRecord())
|
||||
record->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
|
||||
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write);
|
||||
@@ -337,11 +337,11 @@ void WrappedVulkan::vkCmdCopyImage(
|
||||
record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read);
|
||||
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write);
|
||||
|
||||
record->dirtied.insert(GetResID(destImage));
|
||||
record->cmdInfo->dirtied.insert(GetResID(destImage));
|
||||
{
|
||||
VkResourceRecord *im = GetRecord(destImage);
|
||||
if(im->GetMemoryRecord())
|
||||
record->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -428,11 +428,11 @@ void WrappedVulkan::vkCmdCopyBufferToImage(
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
|
||||
record->dirtied.insert(GetResID(destImage));
|
||||
record->cmdInfo->dirtied.insert(GetResID(destImage));
|
||||
{
|
||||
VkResourceRecord *im = GetRecord(destImage);
|
||||
if(im->GetMemoryRecord())
|
||||
record->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
record->MarkResourceFrameReferenced(GetResID(srcBuffer), eFrameRef_Read);
|
||||
record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write);
|
||||
@@ -512,7 +512,7 @@ void WrappedVulkan::vkCmdCopyImageToBuffer(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -601,7 +601,7 @@ void WrappedVulkan::vkCmdCopyBuffer(
|
||||
{
|
||||
VkResourceRecord *buf = GetRecord(destBuffer);
|
||||
if(buf->GetMemoryRecord())
|
||||
record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
for(uint32_t i=0; i < numCmds; i++)
|
||||
{
|
||||
ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]);
|
||||
GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
}
|
||||
|
||||
AddEvent(QUEUE_SUBMIT, desc);
|
||||
@@ -199,7 +199,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
DrawcallTreeNode &d = GetDrawcallStack().back()->children.back();
|
||||
|
||||
// copy DrawcallTreeNode children
|
||||
d.children = m_CmdBufferInfo[cmdIds[c]].draw->children;
|
||||
d.children = m_BakedCmdBufferInfo[cmdIds[c]].draw->children;
|
||||
|
||||
// assign new event and drawIDs
|
||||
RefreshIDs(d.children, m_RootEventID, m_RootDrawcallID);
|
||||
@@ -207,8 +207,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
m_PartialReplayData.cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID);
|
||||
|
||||
// 1 extra for the [0] virtual event for the command buffer
|
||||
m_RootEventID += 1+m_CmdBufferInfo[cmdIds[c]].eventCount;
|
||||
m_RootDrawcallID += m_CmdBufferInfo[cmdIds[c]].drawCount;
|
||||
m_RootEventID += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount;
|
||||
m_RootDrawcallID += m_BakedCmdBufferInfo[cmdIds[c]].drawCount;
|
||||
}
|
||||
|
||||
// the outer loop will increment the event ID but we've handled
|
||||
@@ -228,8 +228,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
for(uint32_t c=0; c < numCmds; c++)
|
||||
{
|
||||
// 1 extra for the [0] virtual event for the command buffer
|
||||
m_RootEventID += 1+m_CmdBufferInfo[cmdIds[c]].eventCount;
|
||||
m_RootDrawcallID += m_CmdBufferInfo[cmdIds[c]].drawCount;
|
||||
m_RootEventID += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount;
|
||||
m_RootDrawcallID += m_BakedCmdBufferInfo[cmdIds[c]].drawCount;
|
||||
}
|
||||
|
||||
m_RootEventID--;
|
||||
@@ -245,7 +245,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
|
||||
for(uint32_t c=0; c < numCmds; c++)
|
||||
{
|
||||
uint32_t end = eid + m_CmdBufferInfo[cmdIds[c]].eventCount;
|
||||
uint32_t end = eid + m_BakedCmdBufferInfo[cmdIds[c]].eventCount;
|
||||
|
||||
if(eid == m_PartialReplayData.baseEvent)
|
||||
{
|
||||
@@ -265,7 +265,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
RDCDEBUG("Queue not submitting %llu", cmdIds[c]);
|
||||
}
|
||||
|
||||
eid += 1+m_CmdBufferInfo[cmdIds[c]].eventCount;
|
||||
eid += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount;
|
||||
}
|
||||
|
||||
RDCASSERT(trimmedCmds.size() > 0);
|
||||
@@ -275,7 +275,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
for(uint32_t i=0; i < numCmds; i++)
|
||||
{
|
||||
ResourceId cmd = trimmedCmdIds[i];
|
||||
GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -285,7 +285,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(
|
||||
for(uint32_t i=0; i < numCmds; i++)
|
||||
{
|
||||
ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]);
|
||||
GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -329,7 +329,7 @@ VkResult WrappedVulkan::vkQueueSubmit(
|
||||
for(uint32_t i=0; i < cmdBufferCount; i++)
|
||||
{
|
||||
ResourceId cmd = GetResID(pCmdBuffers[i]);
|
||||
GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo);
|
||||
|
||||
VkResourceRecord *record = GetRecord(pCmdBuffers[i]);
|
||||
|
||||
@@ -345,14 +345,14 @@ VkResult WrappedVulkan::vkQueueSubmit(
|
||||
SCOPED_LOCK(m_CapTransitionLock);
|
||||
if(m_State == WRITING_CAPFRAME)
|
||||
{
|
||||
for(auto it = record->bakedCommands->dirtied.begin(); it != record->bakedCommands->dirtied.end(); ++it)
|
||||
for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); it != record->bakedCommands->cmdInfo->dirtied.end(); ++it)
|
||||
GetResourceManager()->MarkPendingDirty(*it);
|
||||
|
||||
capframe = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for(auto it = record->bakedCommands->dirtied.begin(); it != record->bakedCommands->dirtied.end(); ++it)
|
||||
for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); it != record->bakedCommands->cmdInfo->dirtied.end(); ++it)
|
||||
GetResourceManager()->MarkDirtyResource(*it);
|
||||
}
|
||||
}
|
||||
@@ -360,7 +360,7 @@ VkResult WrappedVulkan::vkQueueSubmit(
|
||||
if(capframe)
|
||||
{
|
||||
// for each bound descriptor set, mark it referenced as well as all resources currently bound to it
|
||||
for(auto it = record->bakedCommands->boundDescSets.begin(); it != record->bakedCommands->boundDescSets.end(); ++it)
|
||||
for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it)
|
||||
{
|
||||
GetResourceManager()->MarkResourceFrameReferenced(GetResID(*it), eFrameRef_Read);
|
||||
|
||||
@@ -389,7 +389,7 @@ VkResult WrappedVulkan::vkQueueSubmit(
|
||||
record->bakedCommands->AddRef();
|
||||
}
|
||||
|
||||
record->dirtied.clear();
|
||||
record->cmdInfo->dirtied.clear();
|
||||
}
|
||||
|
||||
if(capframe)
|
||||
|
||||
@@ -702,7 +702,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
|
||||
ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]);
|
||||
|
||||
ResourceId cmd = GetResID(PartialCmdBuf());
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
}
|
||||
}
|
||||
else if(m_State == READING)
|
||||
@@ -712,7 +712,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
|
||||
ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]);
|
||||
|
||||
ResourceId cmd = GetResID(cmdBuffer);
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
}
|
||||
|
||||
for(size_t i=0; i < mems.size(); i++)
|
||||
@@ -797,7 +797,7 @@ void WrappedVulkan::vkCmdWaitEvents(
|
||||
}
|
||||
|
||||
ResourceId cmd = GetResID(cmdBuffer);
|
||||
GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]);
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
for(uint32_t i=0; i < eventCount; i++)
|
||||
|
||||
Reference in New Issue
Block a user