mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 12:05:20 +00:00
Changed queue family indices to VK_QUEUE_FAMILY_IGNORED in image memory barriers when there is no transfer of ownership (src and dst families are identical).
This commit is contained in:
@@ -709,8 +709,8 @@ namespace ApiWithoutSecrets {
|
|||||||
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
|
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
|
||||||
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout
|
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout
|
||||||
Vulkan.PresentQueueFamilyIndex, // uint32_t srcQueueFamilyIndex
|
VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex
|
||||||
Vulkan.PresentQueueFamilyIndex, // uint32_t dstQueueFamilyIndex
|
VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex
|
||||||
swap_chain_images[i], // VkImage image
|
swap_chain_images[i], // VkImage image
|
||||||
image_subresource_range // VkImageSubresourceRange subresourceRange
|
image_subresource_range // VkImageSubresourceRange subresourceRange
|
||||||
};
|
};
|
||||||
@@ -722,8 +722,8 @@ namespace ApiWithoutSecrets {
|
|||||||
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
|
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
||||||
Vulkan.PresentQueueFamilyIndex, // uint32_t srcQueueFamilyIndex
|
VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex
|
||||||
Vulkan.PresentQueueFamilyIndex, // uint32_t dstQueueFamilyIndex
|
VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex
|
||||||
swap_chain_images[i], // VkImage image
|
swap_chain_images[i], // VkImage image
|
||||||
image_subresource_range // VkImageSubresourceRange subresourceRange
|
image_subresource_range // VkImageSubresourceRange subresourceRange
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ namespace ApiWithoutSecrets {
|
|||||||
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_PRESENT_SRC_KHR, // VkImageLayout initialLayout;
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout;
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR // VkImageLayout finalLayout
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -463,10 +463,10 @@ namespace ApiWithoutSecrets {
|
|||||||
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
|
(memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
|
||||||
|
|
||||||
VkMemoryAllocateInfo memory_allocate_info = {
|
VkMemoryAllocateInfo memory_allocate_info = {
|
||||||
VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType
|
VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType
|
||||||
nullptr, // const void *pNext
|
nullptr, // const void *pNext
|
||||||
buffer_memory_requirements.size, // VkDeviceSize allocationSize
|
buffer_memory_requirements.size, // VkDeviceSize allocationSize
|
||||||
i // uint32_t memoryTypeIndex
|
i // uint32_t memoryTypeIndex
|
||||||
};
|
};
|
||||||
|
|
||||||
if( vkAllocateMemory( GetDevice(), &memory_allocate_info, nullptr, memory ) == VK_SUCCESS ) {
|
if( vkAllocateMemory( GetDevice(), &memory_allocate_info, nullptr, memory ) == VK_SUCCESS ) {
|
||||||
@@ -486,15 +486,15 @@ namespace ApiWithoutSecrets {
|
|||||||
};
|
};
|
||||||
|
|
||||||
VkBufferMemoryBarrier barrier_from_host_write_to_attribute_read = {
|
VkBufferMemoryBarrier barrier_from_host_write_to_attribute_read = {
|
||||||
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType
|
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType
|
||||||
nullptr, // const void *pNext
|
nullptr, // const void *pNext
|
||||||
VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask
|
VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask
|
||||||
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // VkAccessFlags dstAccessMask
|
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // VkAccessFlags dstAccessMask
|
||||||
GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
|
GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
|
||||||
GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
|
GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
|
||||||
buffer, // VkBuffer buffer
|
buffer, // VkBuffer buffer
|
||||||
0, // VkDeviceSize offset
|
0, // VkDeviceSize offset
|
||||||
size // VkDeviceSize size
|
size // VkDeviceSize size
|
||||||
};
|
};
|
||||||
|
|
||||||
vkBeginCommandBuffer( Vulkan.RenderingResources[0].CommandBuffer, &command_buffer_begin_info );
|
vkBeginCommandBuffer( Vulkan.RenderingResources[0].CommandBuffer, &command_buffer_begin_info );
|
||||||
@@ -507,15 +507,15 @@ namespace ApiWithoutSecrets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VkSubmitInfo submit_rendering_info = {
|
VkSubmitInfo submit_rendering_info = {
|
||||||
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType
|
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType
|
||||||
nullptr, // const void *pNext
|
nullptr, // const void *pNext
|
||||||
0, // uint32_t waitSemaphoreCount
|
0, // uint32_t waitSemaphoreCount
|
||||||
nullptr, // const VkSemaphore *pWaitSemaphores
|
nullptr, // const VkSemaphore *pWaitSemaphores
|
||||||
nullptr, // const VkPipelineStageFlags *pWaitDstStageMask;
|
nullptr, // const VkPipelineStageFlags *pWaitDstStageMask;
|
||||||
1, // uint32_t commandBufferCount
|
1, // uint32_t commandBufferCount
|
||||||
&Vulkan.RenderingResources[0].CommandBuffer, // const VkCommandBuffer *pCommandBuffers
|
&Vulkan.RenderingResources[0].CommandBuffer, // const VkCommandBuffer *pCommandBuffers
|
||||||
0, // uint32_t signalSemaphoreCount
|
0, // uint32_t signalSemaphoreCount
|
||||||
nullptr // const VkSemaphore *pSignalSemaphores
|
nullptr // const VkSemaphore *pSignalSemaphores
|
||||||
};
|
};
|
||||||
|
|
||||||
if( vkQueueSubmit( GetGraphicsQueue().Handle, 1, &submit_rendering_info, VK_NULL_HANDLE ) != VK_SUCCESS ) {
|
if( vkQueueSubmit( GetGraphicsQueue().Handle, 1, &submit_rendering_info, VK_NULL_HANDLE ) != VK_SUCCESS ) {
|
||||||
@@ -532,56 +532,56 @@ namespace ApiWithoutSecrets {
|
|||||||
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> framebuffer = CreateFramebuffer( image_view );
|
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> framebuffer = CreateFramebuffer( image_view );
|
||||||
|
|
||||||
VkCommandBufferBeginInfo command_buffer_begin_info = {
|
VkCommandBufferBeginInfo command_buffer_begin_info = {
|
||||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType
|
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType
|
||||||
nullptr, // const void *pNext
|
nullptr, // const void *pNext
|
||||||
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags
|
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags
|
||||||
nullptr // const VkCommandBufferInheritanceInfo *pInheritanceInfo
|
nullptr // const VkCommandBufferInheritanceInfo *pInheritanceInfo
|
||||||
};
|
};
|
||||||
|
|
||||||
vkBeginCommandBuffer( command_buffer, &command_buffer_begin_info );
|
vkBeginCommandBuffer( command_buffer, &command_buffer_begin_info );
|
||||||
|
|
||||||
VkImageSubresourceRange image_subresource_range = {
|
VkImageSubresourceRange image_subresource_range = {
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
|
VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
|
||||||
0, // uint32_t baseMipLevel
|
0, // uint32_t baseMipLevel
|
||||||
1, // uint32_t levelCount
|
1, // uint32_t levelCount
|
||||||
0, // uint32_t baseArrayLayer
|
0, // uint32_t baseArrayLayer
|
||||||
1 // uint32_t layerCount
|
1 // uint32_t layerCount
|
||||||
};
|
};
|
||||||
|
|
||||||
if( GetPresentQueue().Handle != GetGraphicsQueue().Handle ) {
|
uint32_t present_queue_family_index = (GetPresentQueue().Handle != GetGraphicsQueue().Handle) ? GetPresentQueue().FamilyIndex : VK_QUEUE_FAMILY_IGNORED;
|
||||||
VkImageMemoryBarrier barrier_from_present_to_draw = {
|
uint32_t graphics_queue_family_index = (GetPresentQueue().Handle != GetGraphicsQueue().Handle) ? GetGraphicsQueue().FamilyIndex : VK_QUEUE_FAMILY_IGNORED;
|
||||||
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
|
VkImageMemoryBarrier barrier_from_present_to_draw = {
|
||||||
nullptr, // const void *pNext
|
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
|
||||||
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask
|
nullptr, // const void *pNext
|
||||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
|
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags srcAccessMask
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
|
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
|
||||||
GetPresentQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout
|
||||||
GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
|
present_queue_family_index, // uint32_t srcQueueFamilyIndex
|
||||||
image, // VkImage image
|
graphics_queue_family_index, // uint32_t dstQueueFamilyIndex
|
||||||
image_subresource_range // VkImageSubresourceRange subresourceRange
|
image, // VkImage image
|
||||||
};
|
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
|
||||||
};
|
};
|
||||||
|
|
||||||
VkRenderPassBeginInfo render_pass_begin_info = {
|
VkRenderPassBeginInfo render_pass_begin_info = {
|
||||||
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType
|
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType
|
||||||
nullptr, // const void *pNext
|
nullptr, // const void *pNext
|
||||||
Vulkan.RenderPass, // VkRenderPass renderPass
|
Vulkan.RenderPass, // VkRenderPass renderPass
|
||||||
framebuffer.Get(), // VkFramebuffer framebuffer
|
framebuffer.Get(), // VkFramebuffer framebuffer
|
||||||
{ // VkRect2D renderArea
|
{ // VkRect2D renderArea
|
||||||
{ // VkOffset2D offset
|
{ // VkOffset2D offset
|
||||||
0, // int32_t x
|
0, // int32_t x
|
||||||
0 // int32_t y
|
0 // int32_t y
|
||||||
},
|
},
|
||||||
GetSwapChain().Extent, // VkExtent2D extent;
|
GetSwapChain().Extent, // VkExtent2D extent;
|
||||||
},
|
},
|
||||||
1, // uint32_t clearValueCount
|
1, // uint32_t clearValueCount
|
||||||
&clear_value // const VkClearValue *pClearValues
|
&clear_value // const VkClearValue *pClearValues
|
||||||
};
|
};
|
||||||
|
|
||||||
vkCmdBeginRenderPass( command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE );
|
vkCmdBeginRenderPass( command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE );
|
||||||
@@ -589,22 +589,22 @@ namespace ApiWithoutSecrets {
|
|||||||
vkCmdBindPipeline( command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, Vulkan.GraphicsPipeline );
|
vkCmdBindPipeline( command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, Vulkan.GraphicsPipeline );
|
||||||
|
|
||||||
VkViewport viewport = {
|
VkViewport viewport = {
|
||||||
0.0f, // float x
|
0.0f, // float x
|
||||||
0.0f, // float y
|
0.0f, // float y
|
||||||
static_cast<float>(GetSwapChain().Extent.width), // float width
|
static_cast<float>(GetSwapChain().Extent.width), // float width
|
||||||
static_cast<float>(GetSwapChain().Extent.height), // float height
|
static_cast<float>(GetSwapChain().Extent.height), // float height
|
||||||
0.0f, // float minDepth
|
0.0f, // float minDepth
|
||||||
1.0f // float maxDepth
|
1.0f // float maxDepth
|
||||||
};
|
};
|
||||||
|
|
||||||
VkRect2D scissor = {
|
VkRect2D scissor = {
|
||||||
{ // VkOffset2D offset
|
{ // VkOffset2D offset
|
||||||
0, // int32_t x
|
0, // int32_t x
|
||||||
0 // int32_t y
|
0 // int32_t y
|
||||||
},
|
},
|
||||||
{ // VkExtent2D extent
|
{ // VkExtent2D extent
|
||||||
GetSwapChain().Extent.width, // uint32_t width
|
GetSwapChain().Extent.width, // uint32_t width
|
||||||
GetSwapChain().Extent.height // uint32_t height
|
GetSwapChain().Extent.height // uint32_t height
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -618,21 +618,19 @@ namespace ApiWithoutSecrets {
|
|||||||
|
|
||||||
vkCmdEndRenderPass( command_buffer );
|
vkCmdEndRenderPass( command_buffer );
|
||||||
|
|
||||||
if( GetGraphicsQueue().Handle != GetPresentQueue().Handle ) {
|
VkImageMemoryBarrier barrier_from_draw_to_present = {
|
||||||
VkImageMemoryBarrier barrier_from_draw_to_present = {
|
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_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
|
||||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
|
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
|
||||||
VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
|
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
graphics_queue_family_index, // uint32_t srcQueueFamilyIndex
|
||||||
GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
|
present_queue_family_index, // uint32_t dstQueueFamilyIndex
|
||||||
GetPresentQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
|
image, // VkImage image
|
||||||
image, // 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_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;
|
||||||
|
|||||||
Reference in New Issue
Block a user