added renderpass manager

This commit is contained in:
2026-08-29 12:31:10 +03:00
parent eef7d2b046
commit ee9bffcca4
12 changed files with 319 additions and 106 deletions
+29 -89
View File
@@ -23,9 +23,6 @@ DECLARE_VULKAN_COMMAND(Begin)
{
if (vkCmdBeginRendering || vkCmdBeginRenderingKHR)
{
V_printf("USING DYNAMIC RENDERING\n");
V_printf("%p\n", vkCmdBeginRendering);
V_printf("%p\n", vkCmdBeginRenderingKHR);
VkRenderingInfo stRenderingInfo = {};
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
VkRenderingAttachmentInfo depthAttachment = {};
@@ -78,98 +75,42 @@ DECLARE_VULKAN_COMMAND(Begin)
}
else
{
V_printf("USING RENDERPASS");
CUtlVector<VkAttachmentDescription> attachments = {};
CUtlVector<VkAttachmentReference> input_refs = {};
CUtlVector<VkImageView> image_views = {};
CUtlVector<VkClearValue> colors = {};
attachments.Resize(images.GetSize());
input_refs.Resize(images.GetSize());
image_views.Resize(images.GetSize());
colors.Resize(images.GetSize());
uint32_t i = 0;
for (auto f: images)
CUtlVector<RenderImage> imgs = {};
for (auto &a: images)
{
VkAttachmentDescription a = {};
a.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
a.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
a.format = CVkImage::GetImageFormat(
((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_eFormat);
a.samples = CVkImage::GetMultisampling(
((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_eMultisampleType);
switch( f.m_eLoadMode )
{
case LOAD_MODE_DONT_CARE:
a.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
break;
case LOAD_MODE_LOAD:
a.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
break;
case LOAD_MODE_CLEAR:
a.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
colors[i].color.float32[0] = f.m_fClearColor[0];
colors[i].color.float32[1] = f.m_fClearColor[1];
colors[i].color.float32[2] = f.m_fClearColor[2];
colors[i].color.float32[3] = f.m_fClearColor[3];
break;
}
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[i] = a;
VkAttachmentReference ref = {};
ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
ref.attachment = i;
input_refs[i] = ref;
image_views[i] = ((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_imageView;
i++;
RenderImage ri = {};
ri.pImage = (IImage*)a.m_stImage.m_pSingle;
ri.eLoadMode = a.m_eLoadMode;
ri.eStoreMode = a.m_eStoreMode;
VkClearValue ci = {};
ci.color.float32[0] = a.m_fClearColor[0];
ci.color.float32[1] = a.m_fClearColor[1];
ci.color.float32[2] = a.m_fClearColor[2];
ci.color.float32[3] = a.m_fClearColor[3];
colors.AppendTail(ci);
imgs.AppendTail(ri);
}
RenderImage depth = {};
depth.pImage = (IImage*)stDepthImage.m_stImage.m_pSingle;
depth.eLoadMode = stDepthImage.m_eLoadMode;
depth.eStoreMode = stDepthImage.m_eStoreMode;
BeginInfo bi = {};
bi.uRenderImageCount = imgs.GetSize();
bi.pRenderImages = imgs.GetData();
bi.uWidth = nResolutionX;
bi.uHeight = nResolutionY;
if (bDepthEnabled)
{
CVkImage *depth = (CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame);
VkAttachmentDescription desc = {};
desc.format = CVkImage::GetImageFormat(depth->m_eFormat);
desc.samples = CVkImage::GetMultisampling(depth->m_eMultisampleType);
desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments.AppendTail(desc);
VkClearValue val = {};
val.depthStencil.depth = stDepthImage.m_fClearDepth;
colors.AppendTail(val);
image_views.AppendTail(depth->m_imageView);
bi.pDepth = &depth;
VkClearValue ci = {};
ci.depthStencil.depth = stDepthImage.m_fClearDepth;
colors.AppendTail(ci);
}
VkAttachmentReference depthRef;
depthRef.attachment = attachments.GetSize() - 1;
depthRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
VkSubpassDescription subpass = {};
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass.colorAttachmentCount = input_refs.GetSize();
subpass.pColorAttachments = input_refs.GetData();
if (bDepthEnabled)
{
subpass.pDepthStencilAttachment = &depthRef;
}
VkRenderPassCreateInfo rpci = {};
rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
rpci.attachmentCount = attachments.GetSize();
rpci.pAttachments = attachments.GetData();
rpci.subpassCount = 1;
rpci.pSubpasses = &subpass;
vkCreateRenderPass(hDevice, &rpci, NULL, &hRenderPass);
VkRenderPass hRenderPass;
VkFramebuffer hFrameBuffer;
pMgr->CreateRenderPass(&bi, &hRenderPass, &hFrameBuffer);
VkFramebufferCreateInfo fbci = {};
fbci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
fbci.renderPass = hRenderPass;
fbci.attachmentCount = image_views.GetSize();
fbci.pAttachments = image_views.GetData();
fbci.width = nResolutionX;
fbci.height = nResolutionY;
fbci.layers = 1;
vkCreateFramebuffer(hDevice, &fbci, NULL, &hFrameBuffer);
VkRenderPassBeginInfo rpbi = {};
rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
rpbi.renderPass = hRenderPass;
@@ -190,7 +131,6 @@ DECLARE_VULKAN_COMMAND(End)
else
{
vkCmdEndRenderPass(hCommandBuffer);
}
}