mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 12:05:20 +00:00
Updated Tutorial03 to incorporate changes introduted in VulkanCommon class (added semaphores, removed image view creation for each swapchain image).
This commit is contained in:
@@ -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
|
||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user