Updated Tutorial03 to incorporate changes introduted in VulkanCommon class (added semaphores, removed image view creation for each swapchain image).

This commit is contained in:
plapins
2016-04-22 23:16:01 +02:00
parent ff48362533
commit e9929a92a7
3 changed files with 58 additions and 66 deletions

View File

@@ -75,50 +75,23 @@ namespace ApiWithoutSecrets {
} }
bool Tutorial03::CreateFramebuffers() { bool Tutorial03::CreateFramebuffers() {
const std::vector<VkImage> &swap_chain_images = GetSwapChain().Images; const std::vector<ImageParameters> &swap_chain_images = GetSwapChain().Images;
Vulkan.FramebufferObjects.resize( swap_chain_images.size() ); Vulkan.Framebuffers.resize( swap_chain_images.size() );
for( size_t i = 0; i < swap_chain_images.size(); ++i ) { for( size_t i = 0; i < swap_chain_images.size(); ++i ) {
VkImageViewCreateInfo image_view_create_info = {
VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType
nullptr, // const void *pNext
0, // VkImageViewCreateFlags flags
swap_chain_images[i], // VkImage image
VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType
GetSwapChain().Format, // VkFormat format
{ // VkComponentMapping components
VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle r
VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle g
VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle b
VK_COMPONENT_SWIZZLE_IDENTITY // VkComponentSwizzle a
},
{ // VkImageSubresourceRange subresourceRange
VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
0, // uint32_t baseMipLevel
1, // uint32_t levelCount
0, // uint32_t baseArrayLayer
1 // uint32_t layerCount
}
};
if( vkCreateImageView( GetDevice(), &image_view_create_info, nullptr, &Vulkan.FramebufferObjects[i].ImageView ) != VK_SUCCESS ) {
std::cout << "Could not create image view for framebuffer!" << std::endl;
return false;
}
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
&Vulkan.FramebufferObjects[i].ImageView, // const VkImageView *pAttachments &swap_chain_images[i].ImageView, // const VkImageView *pAttachments
300, // uint32_t width 300, // uint32_t width
300, // uint32_t height 300, // uint32_t height
1 // uint32_t layers 1 // uint32_t layers
}; };
if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &Vulkan.FramebufferObjects[i].Handle ) != VK_SUCCESS ) { if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &Vulkan.Framebuffers[i] ) != VK_SUCCESS ) {
std::cout << "Could not create a framebuffer!" << std::endl; std::cout << "Could not create a framebuffer!" << std::endl;
return false; return false;
} }
@@ -333,6 +306,22 @@ namespace ApiWithoutSecrets {
return true; return true;
} }
bool Tutorial03::CreateSemaphores() {
VkSemaphoreCreateInfo semaphore_create_info = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType
nullptr, // const void* pNext
0 // VkSemaphoreCreateFlags flags
};
if( (vkCreateSemaphore( GetDevice(), &semaphore_create_info, nullptr, &Vulkan.ImageAvailableSemaphore ) != VK_SUCCESS) ||
(vkCreateSemaphore( GetDevice(), &semaphore_create_info, nullptr, &Vulkan.RenderingFinishedSemaphore ) != VK_SUCCESS) ) {
std::cout << "Could not create semaphores!" << std::endl;
return false;
}
return true;
}
bool Tutorial03::CreateCommandBuffers() { bool Tutorial03::CreateCommandBuffers() {
if( !CreateCommandPool( GetGraphicsQueue().FamilyIndex, &Vulkan.GraphicsCommandPool ) ) { if( !CreateCommandPool( GetGraphicsQueue().FamilyIndex, &Vulkan.GraphicsCommandPool ) ) {
std::cout << "Could not create command pool!" << std::endl; std::cout << "Could not create command pool!" << std::endl;
@@ -398,7 +387,7 @@ namespace ApiWithoutSecrets {
{ 1.0f, 0.8f, 0.4f, 0.0f }, // VkClearColorValue color { 1.0f, 0.8f, 0.4f, 0.0f }, // VkClearColorValue color
}; };
const std::vector<VkImage>& swap_chain_images = GetSwapChain().Images; const std::vector<ImageParameters>& swap_chain_images = GetSwapChain().Images;
for( size_t i = 0; i < Vulkan.GraphicsCommandBuffers.size(); ++i ) { for( size_t i = 0; i < Vulkan.GraphicsCommandBuffers.size(); ++i ) {
vkBeginCommandBuffer( Vulkan.GraphicsCommandBuffers[i], &graphics_commandd_buffer_begin_info ); vkBeginCommandBuffer( Vulkan.GraphicsCommandBuffers[i], &graphics_commandd_buffer_begin_info );
@@ -413,7 +402,7 @@ namespace ApiWithoutSecrets {
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
GetPresentQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex GetPresentQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex GetGraphicsQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
swap_chain_images[i], // VkImage image swap_chain_images[i].Handle, // VkImage image
image_subresource_range // VkImageSubresourceRange subresourceRange image_subresource_range // VkImageSubresourceRange subresourceRange
}; };
vkCmdPipelineBarrier( Vulkan.GraphicsCommandBuffers[i], 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( Vulkan.GraphicsCommandBuffers[i], 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 );
@@ -423,7 +412,7 @@ namespace ApiWithoutSecrets {
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
Vulkan.FramebufferObjects[i].Handle, // VkFramebuffer framebuffer Vulkan.Framebuffers[i], // VkFramebuffer framebuffer
{ // VkRect2D renderArea { // VkRect2D renderArea
{ // VkOffset2D offset { // VkOffset2D offset
0, // int32_t x 0, // int32_t x
@@ -456,7 +445,7 @@ namespace ApiWithoutSecrets {
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex GetGraphicsQueue().FamilyIndex, // uint32_t srcQueueFamilyIndex
GetPresentQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex GetPresentQueue().FamilyIndex, // uint32_t dstQueueFamilyIndex
swap_chain_images[i], // VkImage image swap_chain_images[i].Handle, // VkImage image
image_subresource_range // VkImageSubresourceRange subresourceRange image_subresource_range // VkImageSubresourceRange subresourceRange
}; };
vkCmdPipelineBarrier( Vulkan.GraphicsCommandBuffers[i], 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( Vulkan.GraphicsCommandBuffers[i], 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 );
@@ -490,12 +479,10 @@ namespace ApiWithoutSecrets {
} }
bool Tutorial03::Draw() { bool Tutorial03::Draw() {
VkSemaphore image_available_semaphore = GetImageAvailableSemaphore();
VkSemaphore rendering_finished_semaphore = GetRenderingFinishedSemaphore();
VkSwapchainKHR swap_chain = GetSwapChain().Handle; VkSwapchainKHR swap_chain = GetSwapChain().Handle;
uint32_t image_index; uint32_t image_index;
VkResult result = vkAcquireNextImageKHR( GetDevice(), swap_chain, UINT64_MAX, image_available_semaphore, VK_NULL_HANDLE, &image_index ); VkResult result = vkAcquireNextImageKHR( GetDevice(), swap_chain, UINT64_MAX, Vulkan.ImageAvailableSemaphore, VK_NULL_HANDLE, &image_index );
switch( result ) { switch( result ) {
case VK_SUCCESS: case VK_SUCCESS:
case VK_SUBOPTIMAL_KHR: case VK_SUBOPTIMAL_KHR:
@@ -512,12 +499,12 @@ namespace ApiWithoutSecrets {
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
1, // uint32_t waitSemaphoreCount 1, // uint32_t waitSemaphoreCount
&image_available_semaphore, // const VkSemaphore *pWaitSemaphores &Vulkan.ImageAvailableSemaphore, // const VkSemaphore *pWaitSemaphores
&wait_dst_stage_mask, // const VkPipelineStageFlags *pWaitDstStageMask; &wait_dst_stage_mask, // const VkPipelineStageFlags *pWaitDstStageMask;
1, // uint32_t commandBufferCount 1, // uint32_t commandBufferCount
&Vulkan.GraphicsCommandBuffers[image_index], // const VkCommandBuffer *pCommandBuffers &Vulkan.GraphicsCommandBuffers[image_index], // const VkCommandBuffer *pCommandBuffers
1, // uint32_t signalSemaphoreCount 1, // uint32_t signalSemaphoreCount
&rendering_finished_semaphore // const VkSemaphore *pSignalSemaphores &Vulkan.RenderingFinishedSemaphore // 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 ) {
@@ -528,7 +515,7 @@ namespace ApiWithoutSecrets {
VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, // VkStructureType sType VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, // VkStructureType sType
nullptr, // const void *pNext nullptr, // const void *pNext
1, // uint32_t waitSemaphoreCount 1, // uint32_t waitSemaphoreCount
&rendering_finished_semaphore, // const VkSemaphore *pWaitSemaphores &Vulkan.RenderingFinishedSemaphore, // const VkSemaphore *pWaitSemaphores
1, // uint32_t swapchainCount 1, // uint32_t swapchainCount
&swap_chain, // const VkSwapchainKHR *pSwapchains &swap_chain, // const VkSwapchainKHR *pSwapchains
&image_index, // const uint32_t *pImageIndices &image_index, // const uint32_t *pImageIndices
@@ -574,23 +561,30 @@ namespace ApiWithoutSecrets {
Vulkan.RenderPass = VK_NULL_HANDLE; Vulkan.RenderPass = VK_NULL_HANDLE;
} }
for( size_t i = 0; i < Vulkan.FramebufferObjects.size(); ++i ) { for( size_t i = 0; i < Vulkan.Framebuffers.size(); ++i ) {
if( Vulkan.FramebufferObjects[i].Handle != VK_NULL_HANDLE ) { if( Vulkan.Framebuffers[i] != VK_NULL_HANDLE ) {
vkDestroyFramebuffer( GetDevice(), Vulkan.FramebufferObjects[i].Handle, nullptr ); vkDestroyFramebuffer( GetDevice(), Vulkan.Framebuffers[i], nullptr );
Vulkan.FramebufferObjects[i].Handle = VK_NULL_HANDLE; Vulkan.Framebuffers[i] = VK_NULL_HANDLE;
}
if( Vulkan.FramebufferObjects[i].ImageView != VK_NULL_HANDLE ) {
vkDestroyImageView( GetDevice(), Vulkan.FramebufferObjects[i].ImageView, nullptr );
Vulkan.FramebufferObjects[i].ImageView = VK_NULL_HANDLE;
} }
} }
Vulkan.FramebufferObjects.clear(); Vulkan.Framebuffers.clear();
} }
} }
Tutorial03::~Tutorial03() { Tutorial03::~Tutorial03() {
ChildClear(); ChildClear();
if( GetDevice() != VK_NULL_HANDLE ) {
vkDeviceWaitIdle( GetDevice() );
if( Vulkan.ImageAvailableSemaphore != VK_NULL_HANDLE ) {
vkDestroySemaphore( GetDevice(), Vulkan.ImageAvailableSemaphore, nullptr );
}
if( Vulkan.RenderingFinishedSemaphore != VK_NULL_HANDLE ) {
vkDestroySemaphore( GetDevice(), Vulkan.RenderingFinishedSemaphore, nullptr );
}
}
} }
} // namespace ApiWithoutSecrets } // namespace ApiWithoutSecrets

View File

@@ -16,16 +16,6 @@
namespace ApiWithoutSecrets { namespace ApiWithoutSecrets {
// ************************************************************ //
// FramebufferObject //
// //
// Vulkan Framebuffer's parameters container class //
// ************************************************************ //
struct FramebufferParameters {
VkImageView ImageView;
VkFramebuffer Handle;
};
// ************************************************************ // // ************************************************************ //
// VulkanTutorial03Parameters // // VulkanTutorial03Parameters //
// // // //
@@ -33,17 +23,21 @@ namespace ApiWithoutSecrets {
// ************************************************************ // // ************************************************************ //
struct VulkanTutorial03Parameters { struct VulkanTutorial03Parameters {
VkRenderPass RenderPass; VkRenderPass RenderPass;
std::vector<FramebufferParameters> FramebufferObjects; std::vector<VkFramebuffer> Framebuffers;
VkPipeline GraphicsPipeline;
VkSemaphore ImageAvailableSemaphore;
VkSemaphore RenderingFinishedSemaphore;
VkCommandPool GraphicsCommandPool; VkCommandPool GraphicsCommandPool;
std::vector<VkCommandBuffer> GraphicsCommandBuffers; std::vector<VkCommandBuffer> GraphicsCommandBuffers;
VkPipeline GraphicsPipeline;
VulkanTutorial03Parameters() : VulkanTutorial03Parameters() :
RenderPass( VK_NULL_HANDLE ), RenderPass( VK_NULL_HANDLE ),
FramebufferObjects(), Framebuffers(),
GraphicsCommandPool( VK_NULL_HANDLE ), GraphicsCommandPool( VK_NULL_HANDLE ),
GraphicsCommandBuffers(), GraphicsCommandBuffers(),
GraphicsPipeline( VK_NULL_HANDLE ) { GraphicsPipeline( VK_NULL_HANDLE ),
ImageAvailableSemaphore( VK_NULL_HANDLE ),
RenderingFinishedSemaphore( VK_NULL_HANDLE ) {
} }
}; };
@@ -60,6 +54,7 @@ namespace ApiWithoutSecrets {
bool CreateRenderPass(); bool CreateRenderPass();
bool CreateFramebuffers(); bool CreateFramebuffers();
bool CreatePipeline(); bool CreatePipeline();
bool CreateSemaphores();
bool CreateCommandBuffers(); bool CreateCommandBuffers();
bool RecordCommandBuffers(); bool RecordCommandBuffers();

View File

@@ -34,6 +34,9 @@ int main( int argc, char **argv ) {
if( !tutorial03.CreatePipeline() ) { if( !tutorial03.CreatePipeline() ) {
return -1; return -1;
} }
if( !tutorial03.CreateSemaphores() ) {
return -1;
}
if( !tutorial03.CreateCommandBuffers() ) { if( !tutorial03.CreateCommandBuffers() ) {
return -1; return -1;
} }