Promote CmdUpdateBuffer to be an action (similar to CmdFillBuffer)

* This is more consistent with our definition of actions as anything that can or
  does significantly mutate a resource.
This commit is contained in:
baldurk
2022-03-15 13:47:25 +00:00
parent e2bdd618d3
commit 43091746a4
2 changed files with 103 additions and 70 deletions
@@ -3632,72 +3632,6 @@ void WrappedVulkan::vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer,
VkBuffer destBuffer, VkDeviceSize destOffset,
VkDeviceSize dataSize, const uint32_t *pData)
{
SERIALISE_ELEMENT(commandBuffer);
SERIALISE_ELEMENT(destBuffer).Important();
SERIALISE_ELEMENT(destOffset);
SERIALISE_ELEMENT(dataSize);
// serialise as void* so it goes through as a buffer, not an actual array of integers.
const void *Data = (const void *)pData;
SERIALISE_ELEMENT_ARRAY(Data, dataSize).Important();
Serialise_DebugMessages(ser);
SERIALISE_CHECK_READ_ERRORS();
if(IsReplayingAndReading())
{
m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer));
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
if(commandBuffer != VK_NULL_HANDLE)
{
ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data);
}
}
return true;
}
void WrappedVulkan::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer,
VkDeviceSize destOffset, VkDeviceSize dataSize,
const uint32_t *pData)
{
SCOPED_DBG_SINK();
SERIALISE_TIME_CALL(ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset,
dataSize, pData));
if(IsCaptureMode(m_State))
{
VkResourceRecord *record = GetRecord(commandBuffer);
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdUpdateBuffer);
Serialise_vkCmdUpdateBuffer(ser, commandBuffer, destBuffer, destOffset, dataSize, pData);
record->AddChunk(scope.Get(&record->cmdInfo->alloc));
record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, dataSize,
eFrameRef_CompleteWrite);
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdPushConstants(SerialiserType &ser, VkCommandBuffer commandBuffer,
VkPipelineLayout layout,
@@ -7323,10 +7257,6 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindVertexBuffers, VkCommandBuffer co
uint32_t firstBinding, uint32_t bindingCount,
const VkBuffer *pBuffers, const VkDeviceSize *pOffsets);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, VkCommandBuffer commandBuffer,
VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize,
const uint32_t *pData);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdPushConstants, VkCommandBuffer commandBuffer,
VkPipelineLayout layout, VkShaderStageFlags stageFlags,
uint32_t offset, uint32_t size, const void *pValues);
@@ -2115,6 +2115,104 @@ void WrappedVulkan::vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcB
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer,
VkBuffer destBuffer, VkDeviceSize destOffset,
VkDeviceSize dataSize, const uint32_t *pData)
{
SERIALISE_ELEMENT(commandBuffer);
SERIALISE_ELEMENT(destBuffer).Important();
SERIALISE_ELEMENT(destOffset);
SERIALISE_ELEMENT(dataSize);
// serialise as void* so it goes through as a buffer, not an actual array of integers.
const void *Data = (const void *)pData;
SERIALISE_ELEMENT_ARRAY(Data, dataSize).Important();
Serialise_DebugMessages(ser);
SERIALISE_CHECK_READ_ERRORS();
if(IsReplayingAndReading())
{
m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer));
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
{
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Copy);
ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data);
if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer))
{
ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize,
Data);
m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer);
}
}
}
else
{
ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data);
{
AddEvent();
ResourceId id = GetResourceManager()->GetOriginalID(GetResID(destBuffer));
ActionDescription action;
action.flags = ActionFlags::Copy;
action.copyDestination = id;
action.copyDestinationSubresource = Subresource();
AddAction(action);
VulkanActionTreeNode &actionNode = GetActionStack().back()->children.back();
actionNode.resourceUsage.push_back(make_rdcpair(
GetResID(destBuffer), EventUsage(actionNode.action.eventId, ResourceUsage::CopyDst)));
}
}
}
return true;
}
void WrappedVulkan::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer,
VkDeviceSize destOffset, VkDeviceSize dataSize,
const uint32_t *pData)
{
SCOPED_DBG_SINK();
SERIALISE_TIME_CALL(ObjDisp(commandBuffer)
->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset,
dataSize, pData));
if(IsCaptureMode(m_State))
{
VkResourceRecord *record = GetRecord(commandBuffer);
CACHE_THREAD_SERIALISER();
ser.SetActionChunk();
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdUpdateBuffer);
Serialise_vkCmdUpdateBuffer(ser, commandBuffer, destBuffer, destOffset, dataSize, pData);
record->AddChunk(scope.Get(&record->cmdInfo->alloc));
record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, dataSize,
eFrameRef_CompleteWrite);
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdFillBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer,
VkBuffer destBuffer, VkDeviceSize destOffset,
@@ -2197,6 +2295,7 @@ void WrappedVulkan::vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dest
CACHE_THREAD_SERIALISER();
ser.SetActionChunk();
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdFillBuffer);
Serialise_vkCmdFillBuffer(ser, commandBuffer, destBuffer, destOffset, fillSize, data);
@@ -4348,6 +4447,10 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyImageToBuffer, VkCommandBuffer co
VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer,
uint32_t regionCount, const VkBufferImageCopy *pRegions);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, VkCommandBuffer commandBuffer,
VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize,
const uint32_t *pData);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdFillBuffer, VkCommandBuffer commandBuffer,
VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize fillSize,
uint32_t data);