Improved image memory barriers (used subpass dependencies in render pass).

This commit is contained in:
plapins
2016-07-01 18:23:04 +02:00
parent 7181fa4016
commit 638d77d51b

View File

@@ -20,50 +20,71 @@ namespace ApiWithoutSecrets {
bool Tutorial04::CreateRenderPass() { bool Tutorial04::CreateRenderPass() {
VkAttachmentDescription attachment_descriptions[] = { VkAttachmentDescription attachment_descriptions[] = {
{ {
0, // VkAttachmentDescriptionFlags flags 0, // VkAttachmentDescriptionFlags flags
GetSwapChain().Format, // VkFormat format GetSwapChain().Format, // VkFormat format
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp
VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp
VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp
VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout initialLayout;
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR // VkImageLayout finalLayout
} }
}; };
VkAttachmentReference color_attachment_references[] = { VkAttachmentReference color_attachment_references[] = {
{ {
0, // uint32_t attachment 0, // uint32_t attachment
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout
} }
}; };
VkSubpassDescription subpass_descriptions[] = { VkSubpassDescription subpass_descriptions[] = {
{ {
0, // VkSubpassDescriptionFlags flags 0, // VkSubpassDescriptionFlags flags
VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
0, // uint32_t inputAttachmentCount 0, // uint32_t inputAttachmentCount
nullptr, // const VkAttachmentReference *pInputAttachments nullptr, // const VkAttachmentReference *pInputAttachments
1, // uint32_t colorAttachmentCount 1, // uint32_t colorAttachmentCount
color_attachment_references, // const VkAttachmentReference *pColorAttachments color_attachment_references, // const VkAttachmentReference *pColorAttachments
nullptr, // const VkAttachmentReference *pResolveAttachments nullptr, // const VkAttachmentReference *pResolveAttachments
nullptr, // const VkAttachmentReference *pDepthStencilAttachment nullptr, // const VkAttachmentReference *pDepthStencilAttachment
0, // uint32_t preserveAttachmentCount 0, // uint32_t preserveAttachmentCount
nullptr // const uint32_t* pPreserveAttachments nullptr // const uint32_t* pPreserveAttachments
}
};
std::vector<VkSubpassDependency> dependencies = {
{
VK_SUBPASS_EXTERNAL, // uint32_t srcSubpass
0, // uint32_t dstSubpass
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags dstStageMask
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
VK_DEPENDENCY_BY_REGION_BIT // VkDependencyFlags dependencyFlags
},
{
0, // uint32_t srcSubpass
VK_SUBPASS_EXTERNAL, // uint32_t dstSubpass
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // VkPipelineStageFlags dstStageMask
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
VK_DEPENDENCY_BY_REGION_BIT // VkDependencyFlags dependencyFlags
} }
}; };
VkRenderPassCreateInfo render_pass_create_info = { VkRenderPassCreateInfo render_pass_create_info = {
VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkRenderPassCreateFlags flags 0, // VkRenderPassCreateFlags flags
1, // uint32_t attachmentCount 1, // uint32_t attachmentCount
attachment_descriptions, // const VkAttachmentDescription *pAttachments attachment_descriptions, // const VkAttachmentDescription *pAttachments
1, // uint32_t subpassCount 1, // uint32_t subpassCount
subpass_descriptions, // const VkSubpassDescription *pSubpasses subpass_descriptions, // const VkSubpassDescription *pSubpasses
0, // uint32_t dependencyCount static_cast<uint32_t>(dependencies.size()), // uint32_t dependencyCount
nullptr // const VkSubpassDependency *pDependencies &dependencies[0] // const VkSubpassDependency *pDependencies
}; };
if( vkCreateRenderPass( GetDevice(), &render_pass_create_info, nullptr, &Vulkan.RenderPass ) != VK_SUCCESS ) { if( vkCreateRenderPass( GetDevice(), &render_pass_create_info, nullptr, &Vulkan.RenderPass ) != VK_SUCCESS ) {
@@ -503,21 +524,21 @@ namespace ApiWithoutSecrets {
1 // uint32_t layerCount 1 // uint32_t layerCount
}; };
uint32_t present_queue_family_index = (GetPresentQueue().Handle != GetGraphicsQueue().Handle) ? GetPresentQueue().FamilyIndex : VK_QUEUE_FAMILY_IGNORED; if( GetPresentQueue().Handle != GetGraphicsQueue().Handle ) {
uint32_t graphics_queue_family_index = (GetPresentQueue().Handle != GetGraphicsQueue().Handle) ? GetGraphicsQueue().FamilyIndex : VK_QUEUE_FAMILY_IGNORED; VkImageMemoryBarrier barrier_from_present_to_draw = {
VkImageMemoryBarrier barrier_from_present_to_draw = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType nullptr, // const void *pNext
nullptr, // const void *pNext VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout GetPresentQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
present_queue_family_index, // uint32_t srcQueueFamilyIndex GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
graphics_queue_family_index, // uint32_t dstQueueFamilyIndex image_parameters.Handle, // VkImage image
image_parameters.Handle, // VkImage image image_subresource_range // VkImageSubresourceRange subresourceRange
image_subresource_range // VkImageSubresourceRange subresourceRange };
}; vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier_from_present_to_draw );
vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier_from_present_to_draw ); }
VkClearValue clear_value = { VkClearValue clear_value = {
{ 1.0f, 0.8f, 0.4f, 0.0f }, // VkClearColorValue color { 1.0f, 0.8f, 0.4f, 0.0f }, // VkClearColorValue color
@@ -573,19 +594,21 @@ namespace ApiWithoutSecrets {
vkCmdEndRenderPass( command_buffer ); vkCmdEndRenderPass( command_buffer );
VkImageMemoryBarrier barrier_from_draw_to_present = { if( GetGraphicsQueue().Handle != GetPresentQueue().Handle ) {
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType VkImageMemoryBarrier barrier_from_draw_to_present = {
nullptr, // const void *pNext VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask nullptr, // const void *pNext
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
graphics_queue_family_index, // uint32_t srcQueueFamilyIndex VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
present_queue_family_index, // uint32_t dstQueueFamilyIndex GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
image_parameters.Handle, // VkImage image GetPresentQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
image_subresource_range // VkImageSubresourceRange subresourceRange image_parameters.Handle, // VkImage image
}; image_subresource_range // VkImageSubresourceRange subresourceRange
vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier_from_draw_to_present ); };
vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier_from_draw_to_present );
}
if( vkEndCommandBuffer( command_buffer ) != VK_SUCCESS ) { if( vkEndCommandBuffer( command_buffer ) != VK_SUCCESS ) {
std::cout << "Could not record command buffer!" << std::endl; std::cout << "Could not record command buffer!" << std::endl;