Pass fragment offsets on renderpass end

This commit is contained in:
baldurk
2025-09-19 16:19:42 +01:00
parent 9954649720
commit bf8354b703
2 changed files with 45 additions and 2 deletions
+39 -2
View File
@@ -275,14 +275,51 @@ void VulkanRenderState::BeginRenderPassAndApplyState(WrappedVulkan *vk, VkComman
void VulkanRenderState::EndRenderPass(VkCommandBuffer cmd)
{
VkRenderPassFragmentDensityMapOffsetEndInfoEXT fragmentDensityOffsetStruct = {
VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_EXT,
NULL,
(uint32_t)fragmentDensityMapOffsets.size(),
fragmentDensityMapOffsets.data(),
};
if(dynamicRendering.active)
{
if(!dynamicRendering.suspended)
ObjDisp(cmd)->CmdEndRendering(Unwrap(cmd));
{
if(fragmentDensityMapOffsets.empty())
{
ObjDisp(cmd)->CmdEndRendering(Unwrap(cmd));
}
else
{
VkRenderingEndInfoEXT endInfo = {
VK_STRUCTURE_TYPE_RENDERING_END_INFO_EXT,
&fragmentDensityOffsetStruct,
};
// the only time we can possibly have fragment offsets and be using dynamic rendering is if
// this function is available by definition, so we don't have to check for it
ObjDisp(cmd)->CmdEndRendering2EXT(Unwrap(cmd), &endInfo);
}
}
}
else
{
ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd));
if(fragmentDensityMapOffsets.empty())
{
ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd));
}
else
{
VkSubpassEndInfo endInfo = {
VK_STRUCTURE_TYPE_SUBPASS_END_INFO,
&fragmentDensityOffsetStruct,
};
// the only time we can possibly have fragment offsets and be using a normal render pass is if
// this function is available by definition, so we don't have to check for it
ObjDisp(cmd)->CmdEndRenderPass2(Unwrap(cmd), &endInfo);
}
}
}
@@ -2186,6 +2186,8 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
renderstate.renderArea = RenderPassBegin.renderArea;
renderstate.subpassContents = contents;
renderstate.fragmentDensityMapOffsets.clear();
const VkRenderPassAttachmentBeginInfo *attachmentsInfo =
(const VkRenderPassAttachmentBeginInfo *)FindNextStruct(
&RenderPassBegin, VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO);
@@ -2804,6 +2806,8 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
renderstate.renderArea = RenderPassBegin.renderArea;
renderstate.subpassContents = SubpassBegin.contents;
renderstate.fragmentDensityMapOffsets.clear();
const VkRenderPassAttachmentBeginInfo *attachmentsInfo =
(const VkRenderPassAttachmentBeginInfo *)FindNextStruct(
&RenderPassBegin, VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO);
@@ -7647,6 +7651,8 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand
renderstate.dynamicRendering.CopyAttachmentNexts();
renderstate.fragmentDensityMapOffsets.clear();
const VkRenderingFragmentDensityMapAttachmentInfoEXT *fragmentDensityAttachment =
(const VkRenderingFragmentDensityMapAttachmentInfoEXT *)FindNextStruct(
&RenderingInfo,