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

@@ -20,50 +20,71 @@ namespace ApiWithoutSecrets {
bool Tutorial05::CreateRenderPass() { bool Tutorial05::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 ) {
@@ -81,11 +102,11 @@ namespace ApiWithoutSecrets {
} }
VkShaderModuleCreateInfo shader_module_create_info = { VkShaderModuleCreateInfo shader_module_create_info = {
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkShaderModuleCreateFlags flags 0, // VkShaderModuleCreateFlags flags
code.size(), // size_t codeSize code.size(), // size_t codeSize
reinterpret_cast<const uint32_t*>(&code[0]) // const uint32_t *pCode reinterpret_cast<const uint32_t*>(&code[0]) // const uint32_t *pCode
}; };
VkShaderModule shader_module; VkShaderModule shader_module;
@@ -99,13 +120,13 @@ namespace ApiWithoutSecrets {
Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> Tutorial05::CreatePipelineLayout() { Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> Tutorial05::CreatePipelineLayout() {
VkPipelineLayoutCreateInfo layout_create_info = { VkPipelineLayoutCreateInfo layout_create_info = {
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkPipelineLayoutCreateFlags flags 0, // VkPipelineLayoutCreateFlags flags
0, // uint32_t setLayoutCount 0, // uint32_t setLayoutCount
nullptr, // const VkDescriptorSetLayout *pSetLayouts nullptr, // const VkDescriptorSetLayout *pSetLayouts
0, // uint32_t pushConstantRangeCount 0, // uint32_t pushConstantRangeCount
nullptr // const VkPushConstantRange *pPushConstantRanges nullptr // const VkPushConstantRange *pPushConstantRanges
}; };
VkPipelineLayout pipeline_layout; VkPipelineLayout pipeline_layout;
@@ -148,35 +169,37 @@ namespace ApiWithoutSecrets {
} }
}; };
VkVertexInputBindingDescription vertex_binding_description = { std::vector<VkVertexInputBindingDescription> vertex_binding_descriptions = {
0, // uint32_t binding {
sizeof(VertexData), // uint32_t stride 0, // uint32_t binding
VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate inputRate sizeof(VertexData), // uint32_t stride
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();
@@ -354,9 +377,9 @@ namespace ApiWithoutSecrets {
bool Tutorial05::CreateSemaphores() { bool Tutorial05::CreateSemaphores() {
VkSemaphoreCreateInfo semaphore_create_info = { VkSemaphoreCreateInfo semaphore_create_info = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType
nullptr, // const void* pNext nullptr, // const void* pNext
0 // VkSemaphoreCreateFlags flags 0 // VkSemaphoreCreateFlags flags
}; };
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) { for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
@@ -409,14 +432,14 @@ namespace ApiWithoutSecrets {
bool Tutorial05::CreateBuffer( VkBufferUsageFlags usage, VkMemoryPropertyFlagBits memoryProperty, BufferParameters &buffer ) { bool Tutorial05::CreateBuffer( VkBufferUsageFlags usage, VkMemoryPropertyFlagBits memoryProperty, BufferParameters &buffer ) {
VkBufferCreateInfo buffer_create_info = { VkBufferCreateInfo buffer_create_info = {
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkBufferCreateFlags flags 0, // VkBufferCreateFlags flags
buffer.Size, // VkDeviceSize size buffer.Size, // VkDeviceSize size
usage, // VkBufferUsageFlags usage usage, // VkBufferUsageFlags usage
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
0, // uint32_t queueFamilyIndexCount 0, // uint32_t queueFamilyIndexCount
nullptr // const uint32_t *pQueueFamilyIndices nullptr // const uint32_t *pQueueFamilyIndices
}; };
if( vkCreateBuffer( GetDevice(), &buffer_create_info, nullptr, &buffer.Handle ) != VK_SUCCESS ) { if( vkCreateBuffer( GetDevice(), &buffer_create_info, nullptr, &buffer.Handle ) != VK_SUCCESS ) {
@@ -446,13 +469,13 @@ 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
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 ) {
@@ -494,11 +517,11 @@ namespace ApiWithoutSecrets {
memcpy( staging_buffer_memory_pointer, &vertex_data[0], Vulkan.VertexBuffer.Size ); memcpy( staging_buffer_memory_pointer, &vertex_data[0], Vulkan.VertexBuffer.Size );
VkMappedMemoryRange flush_range = { VkMappedMemoryRange flush_range = {
VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
Vulkan.StagingBuffer.Memory, // VkDeviceMemory memory Vulkan.StagingBuffer.Memory, // VkDeviceMemory memory
0, // VkDeviceSize offset 0, // VkDeviceSize offset
Vulkan.VertexBuffer.Size // VkDeviceSize size Vulkan.VertexBuffer.Size // VkDeviceSize size
}; };
vkFlushMappedMemoryRanges( GetDevice(), 1, &flush_range ); vkFlushMappedMemoryRanges( GetDevice(), 1, &flush_range );
@@ -506,10 +529,10 @@ namespace ApiWithoutSecrets {
// Prepare command buffer to copy data from staging buffer to a vertex buffer // Prepare command buffer to copy data from staging buffer to a vertex buffer
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
}; };
VkCommandBuffer command_buffer = Vulkan.RenderingResources[0].CommandBuffer; VkCommandBuffer command_buffer = Vulkan.RenderingResources[0].CommandBuffer;
@@ -517,22 +540,22 @@ namespace ApiWithoutSecrets {
vkBeginCommandBuffer( command_buffer, &command_buffer_begin_info); vkBeginCommandBuffer( command_buffer, &command_buffer_begin_info);
VkBufferCopy buffer_copy_info = { VkBufferCopy buffer_copy_info = {
0, // VkDeviceSize srcOffset 0, // VkDeviceSize srcOffset
0, // VkDeviceSize dstOffset 0, // VkDeviceSize dstOffset
Vulkan.VertexBuffer.Size // VkDeviceSize size Vulkan.VertexBuffer.Size // VkDeviceSize size
}; };
vkCmdCopyBuffer( command_buffer, Vulkan.StagingBuffer.Handle, Vulkan.VertexBuffer.Handle, 1, &buffer_copy_info ); vkCmdCopyBuffer( command_buffer, Vulkan.StagingBuffer.Handle, Vulkan.VertexBuffer.Handle, 1, &buffer_copy_info );
VkBufferMemoryBarrier buffer_memory_barrier = { VkBufferMemoryBarrier buffer_memory_barrier = {
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_MEMORY_WRITE_BIT, // VkAccessFlags srcAccessMask VK_ACCESS_MEMORY_WRITE_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // VkAccessFlags dstAccessMask VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, // VkAccessFlags dstAccessMask
VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex
VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex
Vulkan.VertexBuffer.Handle, // VkBuffer buffer Vulkan.VertexBuffer.Handle, // VkBuffer buffer
0, // VkDeviceSize offset 0, // VkDeviceSize offset
VK_WHOLE_SIZE // VkDeviceSize size VK_WHOLE_SIZE // VkDeviceSize size
}; };
vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, 0, nullptr, 1, &buffer_memory_barrier, 0, nullptr ); vkCmdPipelineBarrier( command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, 0, nullptr, 1, &buffer_memory_barrier, 0, nullptr );
@@ -540,15 +563,15 @@ namespace ApiWithoutSecrets {
// Submit command buffer and copy data from staging buffer to a vertex buffer // Submit command buffer and copy data from staging buffer to a vertex buffer
VkSubmitInfo submit_info = { VkSubmitInfo submit_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
&command_buffer, // const VkCommandBuffer *pCommandBuffers &command_buffer, // 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_info, VK_NULL_HANDLE ) != VK_SUCCESS ) { if( vkQueueSubmit( GetGraphicsQueue().Handle, 1, &submit_info, VK_NULL_HANDLE ) != VK_SUCCESS ) {
@@ -566,56 +589,56 @@ namespace ApiWithoutSecrets {
} }
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
}; };
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
}; };
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, // VkFramebuffer framebuffer framebuffer, // 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 );
@@ -623,22 +646,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
} }
}; };
@@ -652,19 +675,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;
@@ -679,15 +704,15 @@ namespace ApiWithoutSecrets {
} }
VkFramebufferCreateInfo framebuffer_create_info = { VkFramebufferCreateInfo framebuffer_create_info = {
VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
0, // VkFramebufferCreateFlags flags 0, // VkFramebufferCreateFlags flags
Vulkan.RenderPass, // VkRenderPass renderPass Vulkan.RenderPass, // VkRenderPass renderPass
1, // uint32_t attachmentCount 1, // uint32_t attachmentCount
&image_view, // const VkImageView *pAttachments &image_view, // const VkImageView *pAttachments
GetSwapChain().Extent.width, // uint32_t width GetSwapChain().Extent.width, // uint32_t width
GetSwapChain().Extent.height, // uint32_t height GetSwapChain().Extent.height, // uint32_t height
1 // uint32_t layers 1 // uint32_t layers
}; };
if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &framebuffer ) != VK_SUCCESS ) { if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &framebuffer ) != VK_SUCCESS ) {