Improve fake structured data for indirect draws on vulkan

This commit is contained in:
baldurk
2020-03-19 17:16:20 +00:00
parent 59f06a12f0
commit 6084f1c1f7
3 changed files with 38 additions and 9 deletions
+2 -2
View File
@@ -863,8 +863,8 @@ private:
void AddRequiredExtensions(bool instance, rdcarray<rdcstr> &extensionList,
const std::set<rdcstr> &supportedExtensions);
bool PatchIndirectDraw(VkIndirectPatchType type, DrawcallDescription &draw, byte *&argptr,
byte *argend);
bool PatchIndirectDraw(size_t drawIndex, uint32_t paramStride, VkIndirectPatchType type,
DrawcallDescription &draw, byte *&argptr, byte *argend);
void InsertDrawsAndRefreshIDs(BakedCmdBufferInfo &cmdBufInfo);
rdcarray<VulkanDrawcallTreeNode *> m_DrawcallStack;
@@ -632,7 +632,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(SerialiserType &ser, VkCommandBu
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndirectCommand());
}
@@ -683,7 +686,6 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(SerialiserType &ser, VkCommandBu
for(uint32_t i = 0; i < count; i++)
{
DrawcallDescription multi;
multi.drawIndex = i;
multi.name = name;
@@ -698,7 +700,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(SerialiserType &ser, VkCommandBu
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndirectCommand());
}
@@ -1010,7 +1015,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(SerialiserType &ser,
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndexedIndirectCommand());
}
@@ -1063,7 +1071,6 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(SerialiserType &ser,
for(uint32_t i = 0; i < count; i++)
{
DrawcallDescription multi;
multi.drawIndex = i;
multi.name = name;
@@ -1079,7 +1086,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(SerialiserType &ser,
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndexedIndirectCommand());
}
@@ -2837,7 +2847,6 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirectCount(SerialiserType &ser,
for(uint32_t i = 0; i < maxDrawCount; i++)
{
DrawcallDescription multi;
multi.drawIndex = i;
multi.name = name;
@@ -2852,7 +2861,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirectCount(SerialiserType &ser,
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndirectCommand());
}
@@ -3150,7 +3162,6 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirectCount(
for(uint32_t i = 0; i < maxDrawCount; i++)
{
DrawcallDescription multi;
multi.drawIndex = i;
multi.name = name;
@@ -3166,7 +3177,10 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirectCount(
StructuredSerialiser structuriser(fakeChunk, ser.GetChunkLookup());
structuriser.Serialise<uint32_t>("drawIndex"_lit, 0U);
ResourceId bufid = GetResourceManager()->GetOriginalID(GetResID(buffer));
structuriser.Serialise("buffer"_lit, bufid);
structuriser.Serialise("offset"_lit, offset);
structuriser.Serialise("stride"_lit, stride);
structuriser.Serialise("command"_lit, VkDrawIndexedIndirectCommand());
}
@@ -448,11 +448,14 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
return true;
}
bool WrappedVulkan::PatchIndirectDraw(VkIndirectPatchType type, DrawcallDescription &draw,
bool WrappedVulkan::PatchIndirectDraw(size_t drawIndex, uint32_t paramStride,
VkIndirectPatchType type, DrawcallDescription &draw,
byte *&argptr, byte *argend)
{
bool valid = false;
draw.drawIndex = (uint32_t)drawIndex;
if(type == VkIndirectPatchType::DrawIndirect || type == VkIndirectPatchType::DrawIndirectCount)
{
if(argptr && argptr + sizeof(VkDrawIndirectCommand) <= argend)
@@ -506,6 +509,16 @@ bool WrappedVulkan::PatchIndirectDraw(VkIndirectPatchType type, DrawcallDescript
if(chunk->metadata.chunkID != (uint32_t)VulkanChunk::vkCmdIndirectSubCommand)
chunk = m_StructuredFile->chunks[draw.events.back().chunkIndex - 1];
SDObject *drawIdx = chunk->FindChild("drawIndex");
if(drawIdx)
drawIdx->data.basic.u = drawIndex;
SDObject *offset = chunk->FindChild("offset");
if(offset)
offset->data.basic.u += drawIndex * paramStride;
SDObject *command = chunk->FindChild("command");
// single draw indirect draws don't have a command child since it can't be added without
@@ -661,7 +674,8 @@ void WrappedVulkan::InsertDrawsAndRefreshIDs(BakedCmdBufferInfo &cmdBufInfo)
// be in-lined as a single draw, so we patch in-place
if(!hasCount && indirectCount == 1)
{
bool valid = PatchIndirectDraw(n.indirectPatch.type, n.draw, ptr, end);
bool valid =
PatchIndirectDraw(0, n.indirectPatch.stride, n.indirectPatch.type, n.draw, ptr, end);
if(n.indirectPatch.type == VkIndirectPatchType::DrawIndirectByteCount)
{
@@ -697,7 +711,8 @@ void WrappedVulkan::InsertDrawsAndRefreshIDs(BakedCmdBufferInfo &cmdBufInfo)
{
VulkanDrawcallTreeNode &n2 = cmdBufNodes[i + j + 1];
bool valid = PatchIndirectDraw(n.indirectPatch.type, n2.draw, ptr, end);
bool valid =
PatchIndirectDraw(j, n.indirectPatch.stride, n.indirectPatch.type, n2.draw, ptr, end);
if(valid)
n2.draw.name = StringFormat::Fmt("%s[%zu](<%u, %u>)", n2.draw.name.c_str(), j,