added renderpass manager
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user