Split cmdbuffer data into stuff under resource record, and replay state

This commit is contained in:
baldurk
2016-02-07 18:43:59 +01:00
parent deea8362db
commit 98808226bb
8 changed files with 130 additions and 108 deletions
+7 -7
View File
@@ -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
{
+8 -11
View File
@@ -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;
}
+1
View File
@@ -487,4 +487,5 @@ VkResourceRecord::~VkResourceRecord()
SAFE_DELETE(layout);
SAFE_DELETE(swapInfo);
SAFE_DELETE(cmdInfo);
}
+24 -13
View File
@@ -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++)