render pass first work
This commit is contained in:
@@ -21,57 +21,170 @@ DECLARE_VULKAN_COMMAND(ClearColor)
|
||||
|
||||
DECLARE_VULKAN_COMMAND(Begin)
|
||||
{
|
||||
VkRenderingInfo stRenderingInfo = {};
|
||||
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
|
||||
VkRenderingAttachmentInfo depthAttachment = {};
|
||||
for (auto i: images)
|
||||
if (vkCmdBeginRendering || vkCmdBeginRenderingKHR)
|
||||
{
|
||||
VkRenderingAttachmentInfo a = {};
|
||||
a.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
|
||||
a.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
switch( i.m_eLoadMode )
|
||||
VkRenderingInfo stRenderingInfo = {};
|
||||
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
|
||||
VkRenderingAttachmentInfo depthAttachment = {};
|
||||
for (auto i: images)
|
||||
{
|
||||
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;
|
||||
a.clearValue.color.float32[0] = i.m_fClearColor[0];
|
||||
a.clearValue.color.float32[1] = i.m_fClearColor[1];
|
||||
a.clearValue.color.float32[2] = i.m_fClearColor[2];
|
||||
a.clearValue.color.float32[3] = i.m_fClearColor[3];
|
||||
break;
|
||||
VkRenderingAttachmentInfo a = {};
|
||||
a.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
|
||||
a.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
switch( i.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;
|
||||
a.clearValue.color.float32[0] = i.m_fClearColor[0];
|
||||
a.clearValue.color.float32[1] = i.m_fClearColor[1];
|
||||
a.clearValue.color.float32[2] = i.m_fClearColor[2];
|
||||
a.clearValue.color.float32[3] = i.m_fClearColor[3];
|
||||
break;
|
||||
}
|
||||
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
a.imageView = ((CVkImage*)VulkanGetObject(i.m_stImage, iCurrentFrame))->m_imageView;
|
||||
attachments.AppendTail(a);
|
||||
}
|
||||
if (bDepthEnabled)
|
||||
{
|
||||
depthAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
|
||||
depthAttachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
depthAttachment.clearValue.depthStencil.depth = stDepthImage.m_fClearDepth;
|
||||
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
depthAttachment.imageView = ((CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame))->m_imageView;
|
||||
stRenderingInfo.pDepthAttachment = &depthAttachment;
|
||||
}
|
||||
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
a.imageView = ((CVkImage*)VulkanGetObject(i.m_stImage, iCurrentFrame))->m_imageView;
|
||||
attachments.AppendTail(a);
|
||||
}
|
||||
if (bDepthEnabled)
|
||||
{
|
||||
depthAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
|
||||
depthAttachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
depthAttachment.clearValue.depthStencil.depth = stDepthImage.m_fClearDepth;
|
||||
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
depthAttachment.imageView = ((CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame))->m_imageView;
|
||||
stRenderingInfo.pDepthAttachment = &depthAttachment;
|
||||
}
|
||||
|
||||
stRenderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
|
||||
stRenderingInfo.layerCount = 1;
|
||||
stRenderingInfo.colorAttachmentCount = attachments.GetSize();
|
||||
stRenderingInfo.pColorAttachments = attachments.GetData();
|
||||
stRenderingInfo.renderArea = (VkRect2D){0,0,nResolutionX,nResolutionY};
|
||||
|
||||
vkCmdBeginRendering(hCommandBuffer, &stRenderingInfo);
|
||||
stRenderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
|
||||
stRenderingInfo.layerCount = 1;
|
||||
stRenderingInfo.colorAttachmentCount = attachments.GetSize();
|
||||
stRenderingInfo.pColorAttachments = attachments.GetData();
|
||||
stRenderingInfo.renderArea = (VkRect2D){0,0,nResolutionX,nResolutionY};
|
||||
|
||||
if (vkCmdBeginRendering)
|
||||
vkCmdBeginRendering(hCommandBuffer, &stRenderingInfo);
|
||||
else
|
||||
vkCmdBeginRenderingKHR(hCommandBuffer, &stRenderingInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
{
|
||||
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++;
|
||||
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
|
||||
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;
|
||||
rpbi.framebuffer = hFrameBuffer;
|
||||
rpbi.renderArea = (VkRect2D){0,0,nResolutionX,nResolutionY};
|
||||
rpbi.clearValueCount = colors.GetSize();
|
||||
rpbi.pClearValues = colors.GetData();
|
||||
vkCmdBeginRenderPass(hCommandBuffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
|
||||
}
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(End)
|
||||
{
|
||||
vkCmdEndRendering(hCommandBuffer);
|
||||
if (vkCmdEndRendering)
|
||||
vkCmdEndRendering(hCommandBuffer);
|
||||
else if (vkCmdEndRenderingKHR)
|
||||
vkCmdEndRenderingKHR(hCommandBuffer);
|
||||
else
|
||||
vkCmdEndRenderPass(hCommandBuffer);
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(SetShader)
|
||||
@@ -118,7 +231,10 @@ DECLARE_VULKAN_COMMAND(SetScissors)
|
||||
uHeight,
|
||||
},
|
||||
};
|
||||
vkCmdSetScissorWithCount(hCommandBuffer, 1, &r);
|
||||
if (vkCmdSetScissorWithCount)
|
||||
vkCmdSetScissorWithCount(hCommandBuffer, 1, &r);
|
||||
else
|
||||
vkCmdSetScissor(hCommandBuffer, 0, 1, &r);
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(SetViewport)
|
||||
@@ -131,7 +247,10 @@ DECLARE_VULKAN_COMMAND(SetViewport)
|
||||
fDepthMin,
|
||||
fDepthMax
|
||||
};
|
||||
vkCmdSetViewportWithCount(hCommandBuffer, 1, &v);
|
||||
if (vkCmdSetScissorWithCount)
|
||||
vkCmdSetViewportWithCount(hCommandBuffer, 1, &v);
|
||||
else
|
||||
vkCmdSetViewport(hCommandBuffer, 0, 1, &v);
|
||||
}
|
||||
DECLARE_VULKAN_COMMAND(ResolveImage)
|
||||
{
|
||||
@@ -176,7 +295,7 @@ static VkPipelineStageFlags2 GetStage( EStageHazard stage )
|
||||
case STAGE_HAZARD_NONE:
|
||||
return VK_PIPELINE_STAGE_2_NONE;
|
||||
case STAGE_HAZARD_RASTER_EARLY_DEPTH_OUT:
|
||||
return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT;
|
||||
return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT;
|
||||
case STAGE_HAZARD_RASTER_LATE_DEPTH_OUT:
|
||||
return VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT;
|
||||
}
|
||||
@@ -197,7 +316,7 @@ static VkAccessFlags2 GetAccessSrc( uint32_t hazard, EStageHazard stage )
|
||||
if (stage == STAGE_HAZARD_RASTER_COLOR_OUT)
|
||||
{
|
||||
if (hazard & BARRIER_HAZARD_RASTER_COLOR)
|
||||
f |= VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
f |= VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT;
|
||||
|
||||
}
|
||||
if (hazard == 0)
|
||||
@@ -244,7 +363,6 @@ static VkImageLayout GetLayout( EImageLayoutHazard hazard )
|
||||
|
||||
DECLARE_VULKAN_COMMAND(Barrier)
|
||||
{
|
||||
|
||||
VkMemoryBarrier2 barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
|
||||
barrier.srcStageMask = GetStage(eStageIn);
|
||||
@@ -255,7 +373,23 @@ DECLARE_VULKAN_COMMAND(Barrier)
|
||||
dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||
dependency.memoryBarrierCount = 1;
|
||||
dependency.pMemoryBarriers = &barrier;
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
if (vkCmdPipelineBarrier2)
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
else if (vkCmdPipelineBarrier2KHR)
|
||||
vkCmdPipelineBarrier2KHR(hCommandBuffer, &dependency);
|
||||
else
|
||||
{
|
||||
VkMemoryBarrier barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
|
||||
barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn);
|
||||
barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut);
|
||||
vkCmdPipelineBarrier(hCommandBuffer,
|
||||
GetStage(eStageIn),
|
||||
GetStage(eStageOut),
|
||||
0, 1,&barrier, 0, NULL, 0, NULL);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(LayoutBarrier)
|
||||
@@ -274,5 +408,24 @@ DECLARE_VULKAN_COMMAND(LayoutBarrier)
|
||||
dependency.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
|
||||
dependency.imageMemoryBarrierCount = 1;
|
||||
dependency.pImageMemoryBarriers = &barrier;
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
if (vkCmdPipelineBarrier2)
|
||||
vkCmdPipelineBarrier2(hCommandBuffer, &dependency);
|
||||
else if (vkCmdPipelineBarrier2KHR)
|
||||
vkCmdPipelineBarrier2KHR(hCommandBuffer, &dependency);
|
||||
else
|
||||
{
|
||||
VkImageMemoryBarrier barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||
barrier.srcAccessMask = GetAccessSrc(eHazard, eStageIn);
|
||||
barrier.dstAccessMask = GetAccessDst(eHazard, eStageOut);
|
||||
barrier.image = ((CVkImage*)pImage)->m_image;
|
||||
barrier.subresourceRange = ((CVkImage*)pImage)->m_range;
|
||||
barrier.oldLayout = GetLayout(eLayoutIn);
|
||||
barrier.newLayout = GetLayout(eLayoutOut);
|
||||
vkCmdPipelineBarrier(hCommandBuffer,
|
||||
GetStage(eStageIn),
|
||||
GetStage(eStageOut),
|
||||
0, 0, NULL, 0, NULL, 1, &barrier);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user