Updated Tutorial 05 to incorporate changes implemented in a Tutorial 04.

This commit is contained in:
plapins
2016-07-04 22:51:31 +02:00
parent bb53abad14
commit 05959fd7e5

View File

@@ -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_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
} }
}; };
@@ -54,6 +54,27 @@ namespace ApiWithoutSecrets {
} }
}; };
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
@@ -62,8 +83,8 @@ namespace ApiWithoutSecrets {
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 ) {
@@ -148,35 +169,37 @@ namespace ApiWithoutSecrets {
} }
}; };
VkVertexInputBindingDescription vertex_binding_description = { std::vector<VkVertexInputBindingDescription> vertex_binding_descriptions = {
{
0, // uint32_t binding 0, // uint32_t binding
sizeof(VertexData), // uint32_t stride sizeof(VertexData), // uint32_t stride
VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate inputRate VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate inputRate
}
}; };
VkVertexInputAttributeDescription vertex_attribute_descriptions[] = { std::vector<VkVertexInputAttributeDescription> vertex_attribute_descriptions = {
{ {
0, // uint32_t location 0, // uint32_t location
vertex_binding_description.binding, // uint32_t binding vertex_binding_descriptions[0].binding, // uint32_t binding
VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format
0 // uint32_t offset offsetof(struct VertexData, x) // uint32_t offset
}, },
{ {
1, // uint32_t location 1, // uint32_t location
vertex_binding_description.binding, // uint32_t binding vertex_binding_descriptions[0].binding, // uint32_t binding
VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format
4 * sizeof(float) // uint32_t offset offsetof(struct VertexData, r) // uint32_t offset
} }
}; };
VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = { VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info = {
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkPipelineVertexInputStateCreateFlags flags; 0, // VkPipelineVertexInputStateCreateFlags flags
1, // uint32_t vertexBindingDescriptionCount static_cast<uint32_t>(vertex_binding_descriptions.size()), // uint32_t vertexBindingDescriptionCount
&vertex_binding_description, // const VkVertexInputBindingDescription *pVertexBindingDescriptions &vertex_binding_descriptions[0], // const VkVertexInputBindingDescription *pVertexBindingDescriptions
2, // uint32_t vertexAttributeDescriptionCount static_cast<uint32_t>(vertex_attribute_descriptions.size()), // uint32_t vertexAttributeDescriptionCount
vertex_attribute_descriptions // const VkVertexInputAttributeDescription *pVertexAttributeDescriptions &vertex_attribute_descriptions[0] // const VkVertexInputAttributeDescription *pVertexAttributeDescriptions
}; };
VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = { VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = {
@@ -248,7 +271,7 @@ namespace ApiWithoutSecrets {
{ 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4] { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]
}; };
VkDynamicState dynamic_states[] = { std::vector<VkDynamicState> dynamic_states = {
VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_SCISSOR,
}; };
@@ -257,8 +280,8 @@ namespace ApiWithoutSecrets {
VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkPipelineDynamicStateCreateFlags flags 0, // VkPipelineDynamicStateCreateFlags flags
2, // uint32_t dynamicStateCount static_cast<uint32_t>(dynamic_states.size()), // uint32_t dynamicStateCount
dynamic_states // const VkDynamicState *pDynamicStates &dynamic_states[0] // const VkDynamicState *pDynamicStates
}; };
Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> pipeline_layout = CreatePipelineLayout(); Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> pipeline_layout = CreatePipelineLayout();
@@ -446,7 +469,7 @@ namespace ApiWithoutSecrets {
for( uint32_t i = 0; i < memory_properties.memoryTypeCount; ++i ) { for( uint32_t i = 0; i < memory_properties.memoryTypeCount; ++i ) {
if( (buffer_memory_requirements.memoryTypeBits & (1 << i)) && if( (buffer_memory_requirements.memoryTypeBits & (1 << i)) &&
(memory_properties.memoryTypes[i].propertyFlags & property) ) { ((memory_properties.memoryTypes[i].propertyFlags & property) == property) ) {
VkMemoryAllocateInfo memory_allocate_info = { VkMemoryAllocateInfo memory_allocate_info = {
VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType
@@ -582,21 +605,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_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask VK_ACCESS_MEMORY_READ_BIT, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout oldLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
present_queue_family_index, // uint32_t srcQueueFamilyIndex GetPresentQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
graphics_queue_family_index, // uint32_t dstQueueFamilyIndex GetGraphicsQueue().FamilyIndex, // 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
@@ -652,19 +675,21 @@ 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_MEMORY_READ_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_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_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;