Unify Vulkan RenderState tracking in Loading & Replay: Event APIs

- Serialise_vkCmdSetEvent
- Serialise_vkCmdResetEvent
- Serialise_vkCmdWaitEvents
- Serialise_vkCmdSetEvent2
- Serialise_vkCmdResetEvent2
- Serialise_vkCmdWaitEvents2
This commit is contained in:
Jake Turner committed 2026-11-11 12:38:48 +00:00
1 parent 1aec6913b7
commit e3f42ff51f
1 file changed
+111 -135
+111 -135
View File
@@ -626,17 +626,14 @@ bool WrappedVulkan::Serialise_vkCmdSetEvent(SerialiserType &ser, VkCommandBuffer
m_LastCmdBufferID = GetResID(commandBuffer);
// see top of this file for current event/fence handling
if(IsActiveReplaying(m_State))
if(InRerecordRange(m_LastCmdBufferID))
{
if(InRerecordRange(m_LastCmdBufferID))
bool loading = IsLoading(m_State);
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
// if(commandBuffer != VK_NULL_HANDLE)
// ObjDisp(commandBuffer)->CmdSetEvent(Unwrap(commandBuffer), Unwrap(event), stageMask);
// ObjDisp(commandBuffer)->CmdSetEvent(Unwrap(commandBuffer), Unwrap(event), stageMask);
}
}
return true;
@@ -681,17 +678,12 @@ bool WrappedVulkan::Serialise_vkCmdResetEvent(SerialiserType &ser, VkCommandBuff
m_LastCmdBufferID = GetResID(commandBuffer);
// see top of this file for current event/fence handling
if(IsActiveReplaying(m_State))
if(InRerecordRange(m_LastCmdBufferID))
{
if(InRerecordRange(m_LastCmdBufferID))
bool loading = IsLoading(m_State);
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
if(commandBuffer != VK_NULL_HANDLE)
{
// ObjDisp(commandBuffer)->CmdResetEvent(Unwrap(commandBuffer), Unwrap(event), mask);
}
}
@@ -767,57 +759,53 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
{
m_LastCmdBufferID = GetResID(commandBuffer);
for(uint32_t i = 0; i < bufferMemoryBarrierCount; i++)
bool loading = IsLoading(m_State);
if(InRerecordRange(m_LastCmdBufferID))
{
if(pBufferMemoryBarriers[i].buffer != VK_NULL_HANDLE)
{
bufBarriers.push_back(pBufferMemoryBarriers[i]);
bufBarriers.back().buffer = Unwrap(bufBarriers.back().buffer);
RemapQueueFamilyIndices(bufBarriers.back().srcQueueFamilyIndex,
bufBarriers.back().dstQueueFamilyIndex);
}
}
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
if(pImageMemoryBarriers[i].image != VK_NULL_HANDLE)
{
imgBarriers.push_back(pImageMemoryBarriers[i]);
imgBarriers.back().image = Unwrap(imgBarriers.back().image);
RemapQueueFamilyIndices(imgBarriers.back().srcQueueFamilyIndex,
imgBarriers.back().dstQueueFamilyIndex);
}
}
// see top of this file for current event/fence handling
VkEventCreateInfo evInfo = {
VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
NULL,
0,
};
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
else
{
for(uint32_t i = 0; i < bufferMemoryBarrierCount; i++)
{
if(pBufferMemoryBarriers[i].buffer != VK_NULL_HANDLE)
{
bufBarriers.push_back(pBufferMemoryBarriers[i]);
bufBarriers.back().buffer = Unwrap(bufBarriers.back().buffer);
RemapQueueFamilyIndices(bufBarriers.back().srcQueueFamilyIndex,
bufBarriers.back().dstQueueFamilyIndex);
}
}
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier &b = pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED)
AddEventResourceUsage(GetResID(b.image), ResourceUsage::Discard);
if(pImageMemoryBarriers[i].image != VK_NULL_HANDLE)
{
imgBarriers.push_back(pImageMemoryBarriers[i]);
imgBarriers.back().image = Unwrap(imgBarriers.back().image);
RemapQueueFamilyIndices(imgBarriers.back().srcQueueFamilyIndex,
imgBarriers.back().dstQueueFamilyIndex);
}
}
}
// see top of this file for current event/fence handling
VkEventCreateInfo evInfo = {
VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
NULL,
0,
};
if(loading)
{
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier &b = pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED)
AddEventResourceUsage(GetResID(b.image), ResourceUsage::Discard);
}
}
if(commandBuffer != VK_NULL_HANDLE)
{
// don't wrap this event
VkEvent ev = VK_NULL_HANDLE;
ObjDisp(commandBuffer)->CreateEvent(Unwrap(GetDev()), &evInfo, NULL, &ev);
@@ -843,7 +831,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
memoryBarrierCount, pMemoryBarriers, (uint32_t)bufBarriers.size(),
bufBarriers.data(), (uint32_t)imgBarriers.size(), imgBarriers.data());
if(m_ReplayOptions.optimisation != ReplayOptimisationLevel::Fastest)
if(!loading && m_ReplayOptions.optimisation != ReplayOptimisationLevel::Fastest)
{
for(uint32_t i = 0; i < imageMemoryBarrierCount; i++)
{
@@ -1136,17 +1124,14 @@ bool WrappedVulkan::Serialise_vkCmdSetEvent2(SerialiserType &ser, VkCommandBuffe
m_LastCmdBufferID = GetResID(commandBuffer);
// see top of this file for current event/fence handling
if(IsActiveReplaying(m_State))
if(InRerecordRange(m_LastCmdBufferID))
{
if(InRerecordRange(m_LastCmdBufferID))
bool loading = IsLoading(m_State);
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
// if(commandBuffer != VK_NULL_HANDLE)
// ObjDisp(commandBuffer)->CmdSetEvent2(Unwrap(commandBuffer), Unwrap(event), &DependencyInfo);
// ObjDisp(commandBuffer)->CmdSetEvent2(Unwrap(commandBuffer), Unwrap(event), &DependencyInfo);
}
}
return true;
@@ -1198,20 +1183,14 @@ bool WrappedVulkan::Serialise_vkCmdResetEvent2(SerialiserType &ser, VkCommandBuf
if(IsReplayingAndReading())
{
m_LastCmdBufferID = GetResID(commandBuffer);
// see top of this file for current event/fence handling
if(IsActiveReplaying(m_State))
if(InRerecordRange(m_LastCmdBufferID))
{
if(InRerecordRange(m_LastCmdBufferID))
bool loading = IsLoading(m_State);
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
if(commandBuffer != VK_NULL_HANDLE)
{
// ObjDisp(commandBuffer)->CmdResetEvent2(Unwrap(commandBuffer), Unwrap(event), stageMask);
}
}
@@ -1264,70 +1243,67 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents2(SerialiserType &ser, VkCommandBuf
{
m_LastCmdBufferID = GetResID(commandBuffer);
rdcarray<VkImageMemoryBarrier2> imgBarriers;
rdcarray<VkBufferMemoryBarrier2> bufBarriers;
for(uint32_t evIdx = 0; evIdx < eventCount; evIdx++)
bool loading = IsLoading(m_State);
if(InRerecordRange(m_LastCmdBufferID))
{
imgBarriers.clear();
bufBarriers.clear();
if(!loading)
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
const VkDependencyInfo &depInfo = pDependencyInfos[evIdx];
rdcarray<VkImageMemoryBarrier2> imgBarriers;
rdcarray<VkBufferMemoryBarrier2> bufBarriers;
for(uint32_t i = 0; i < depInfo.bufferMemoryBarrierCount; i++)
for(uint32_t evIdx = 0; evIdx < eventCount; evIdx++)
{
if(depInfo.pBufferMemoryBarriers[i].buffer != VK_NULL_HANDLE)
imgBarriers.clear();
bufBarriers.clear();
const VkDependencyInfo &depInfo = pDependencyInfos[evIdx];
for(uint32_t i = 0; i < depInfo.bufferMemoryBarrierCount; i++)
{
bufBarriers.push_back(depInfo.pBufferMemoryBarriers[i]);
bufBarriers.back().buffer = Unwrap(bufBarriers.back().buffer);
if(depInfo.pBufferMemoryBarriers[i].buffer != VK_NULL_HANDLE)
{
bufBarriers.push_back(depInfo.pBufferMemoryBarriers[i]);
bufBarriers.back().buffer = Unwrap(bufBarriers.back().buffer);
RemapQueueFamilyIndices(bufBarriers.back().srcQueueFamilyIndex,
bufBarriers.back().dstQueueFamilyIndex);
RemapQueueFamilyIndices(bufBarriers.back().srcQueueFamilyIndex,
bufBarriers.back().dstQueueFamilyIndex);
}
}
}
for(uint32_t i = 0; i < depInfo.imageMemoryBarrierCount; i++)
{
if(depInfo.pImageMemoryBarriers[i].image != VK_NULL_HANDLE)
{
imgBarriers.push_back(depInfo.pImageMemoryBarriers[i]);
imgBarriers.back().image = Unwrap(imgBarriers.back().image);
RemapQueueFamilyIndices(imgBarriers.back().srcQueueFamilyIndex,
imgBarriers.back().dstQueueFamilyIndex);
}
}
// see top of this file for current event/fence handling
VkDependencyInfo UnwrappedDependencyInfo = depInfo;
UnwrappedDependencyInfo.pBufferMemoryBarriers = bufBarriers.data();
UnwrappedDependencyInfo.bufferMemoryBarrierCount = (uint32_t)bufBarriers.size();
UnwrappedDependencyInfo.pImageMemoryBarriers = imgBarriers.data();
UnwrappedDependencyInfo.imageMemoryBarrierCount = (uint32_t)imgBarriers.size();
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
else
commandBuffer = VK_NULL_HANDLE;
}
else
{
for(uint32_t i = 0; i < depInfo.imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier2 &b = depInfo.pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED &&
b.newLayout != VK_IMAGE_LAYOUT_UNDEFINED)
AddEventResourceUsage(GetResID(b.image), ResourceUsage::Discard);
}
}
if(depInfo.pImageMemoryBarriers[i].image != VK_NULL_HANDLE)
{
imgBarriers.push_back(depInfo.pImageMemoryBarriers[i]);
imgBarriers.back().image = Unwrap(imgBarriers.back().image);
if(commandBuffer != VK_NULL_HANDLE)
{
if(IsLoading(m_State) && evIdx == 0)
RemapQueueFamilyIndices(imgBarriers.back().srcQueueFamilyIndex,
imgBarriers.back().dstQueueFamilyIndex);
}
}
// see top of this file for current event/fence handling
VkDependencyInfo UnwrappedDependencyInfo = depInfo;
UnwrappedDependencyInfo.pBufferMemoryBarriers = bufBarriers.data();
UnwrappedDependencyInfo.bufferMemoryBarrierCount = (uint32_t)bufBarriers.size();
UnwrappedDependencyInfo.pImageMemoryBarriers = imgBarriers.data();
UnwrappedDependencyInfo.imageMemoryBarrierCount = (uint32_t)imgBarriers.size();
if(loading)
{
for(uint32_t i = 0; i < depInfo.imageMemoryBarrierCount; i++)
{
const VkImageMemoryBarrier2 &b = depInfo.pImageMemoryBarriers[i];
if(b.image != VK_NULL_HANDLE && b.oldLayout == VK_IMAGE_LAYOUT_UNDEFINED &&
b.newLayout != VK_IMAGE_LAYOUT_UNDEFINED)
AddEventResourceUsage(GetResID(b.image), ResourceUsage::Discard);
}
}
if(loading && evIdx == 0)
{
bool descBarrier = false;
@@ -1375,8 +1351,8 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents2(SerialiserType &ser, VkCommandBuf
continue;
}
if(!IsLoading(m_State) && (barrier.oldLayout == VK_IMAGE_LAYOUT_PREINITIALIZED ||
barrier.oldLayout == VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT))
if(!loading && (barrier.oldLayout == VK_IMAGE_LAYOUT_PREINITIALIZED ||
barrier.oldLayout == VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT))
{
// This is a transition from PRENITIALIZED, but we've already done this barrier once
// (when loading); Since we couldn't transition back to PREINITIALIZED, we instead left
@@ -1393,7 +1369,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents2(SerialiserType &ser, VkCommandBuf
ObjDisp(commandBuffer)->CmdSetEvent2(Unwrap(commandBuffer), ev, &UnwrappedDependencyInfo);
ObjDisp(commandBuffer)->CmdWaitEvents2(Unwrap(commandBuffer), 1, &ev, &UnwrappedDependencyInfo);
if(m_ReplayOptions.optimisation != ReplayOptimisationLevel::Fastest)
if(!loading && m_ReplayOptions.optimisation != ReplayOptimisationLevel::Fastest)
{
for(uint32_t i = 0; i < depInfo.imageMemoryBarrierCount; i++)
{