mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 03:55:26 +00:00
Fixed bug in Tutorial04 in which command buffer was submitted to queue but used framebuffer that was already destroyed.
This commit is contained in:
@@ -528,8 +528,10 @@ namespace ApiWithoutSecrets {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tutorial04::RecordCommandBuffer( VkCommandBuffer command_buffer, VkImage image, VkImageView image_view ) {
|
bool Tutorial04::RecordCommandBuffer( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer ) {
|
||||||
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> framebuffer = CreateFramebuffer( image_view );
|
if( !CreateFramebuffer( framebuffer, image_parameters.ImageView ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
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
|
||||||
@@ -559,7 +561,7 @@ namespace ApiWithoutSecrets {
|
|||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout
|
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout
|
||||||
present_queue_family_index, // uint32_t srcQueueFamilyIndex
|
present_queue_family_index, // uint32_t srcQueueFamilyIndex
|
||||||
graphics_queue_family_index, // uint32_t dstQueueFamilyIndex
|
graphics_queue_family_index, // uint32_t dstQueueFamilyIndex
|
||||||
image, // 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 );
|
||||||
@@ -572,7 +574,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
|
||||||
framebuffer.Get(), // VkFramebuffer framebuffer
|
framebuffer, // VkFramebuffer framebuffer
|
||||||
{ // VkRect2D renderArea
|
{ // VkRect2D renderArea
|
||||||
{ // VkOffset2D offset
|
{ // VkOffset2D offset
|
||||||
0, // int32_t x
|
0, // int32_t x
|
||||||
@@ -627,7 +629,7 @@ namespace ApiWithoutSecrets {
|
|||||||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // VkImageLayout newLayout
|
||||||
graphics_queue_family_index, // uint32_t srcQueueFamilyIndex
|
graphics_queue_family_index, // uint32_t srcQueueFamilyIndex
|
||||||
present_queue_family_index, // uint32_t dstQueueFamilyIndex
|
present_queue_family_index, // uint32_t dstQueueFamilyIndex
|
||||||
image, // 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 );
|
||||||
@@ -639,7 +641,11 @@ namespace ApiWithoutSecrets {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> Tutorial04::CreateFramebuffer( VkImageView image_view ) {
|
bool Tutorial04::CreateFramebuffer( VkFramebuffer &framebuffer, VkImageView image_view ) {
|
||||||
|
if( framebuffer != VK_NULL_HANDLE ) {
|
||||||
|
vkDestroyFramebuffer( GetDevice(), framebuffer, nullptr );
|
||||||
|
}
|
||||||
|
|
||||||
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
|
||||||
@@ -652,13 +658,12 @@ namespace ApiWithoutSecrets {
|
|||||||
1 // uint32_t layers
|
1 // uint32_t layers
|
||||||
};
|
};
|
||||||
|
|
||||||
VkFramebuffer framebuffer;
|
|
||||||
if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &framebuffer ) != VK_SUCCESS ) {
|
if( vkCreateFramebuffer( GetDevice(), &framebuffer_create_info, nullptr, &framebuffer ) != VK_SUCCESS ) {
|
||||||
std::cout << "Could not create a framebuffer!" << std::endl;
|
std::cout << "Could not create a framebuffer!" << std::endl;
|
||||||
return Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer>();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer>( framebuffer, vkDestroyFramebuffer, GetDevice() );
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tutorial04::ChildOnWindowSizeChanged() {
|
bool Tutorial04::ChildOnWindowSizeChanged() {
|
||||||
@@ -667,7 +672,7 @@ namespace ApiWithoutSecrets {
|
|||||||
|
|
||||||
bool Tutorial04::Draw() {
|
bool Tutorial04::Draw() {
|
||||||
static size_t resource_index = 0;
|
static size_t resource_index = 0;
|
||||||
RenderingResourcesData current_rendering_resource = Vulkan.RenderingResources[resource_index];
|
RenderingResourcesData ¤t_rendering_resource = Vulkan.RenderingResources[resource_index];
|
||||||
VkSwapchainKHR swap_chain = GetSwapChain().Handle;
|
VkSwapchainKHR swap_chain = GetSwapChain().Handle;
|
||||||
uint32_t image_index;
|
uint32_t image_index;
|
||||||
|
|
||||||
@@ -691,7 +696,7 @@ namespace ApiWithoutSecrets {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !RecordCommandBuffer( current_rendering_resource.CommandBuffer, GetSwapChain().Images[image_index].Handle, GetSwapChain().Images[image_index].ImageView ) ) {
|
if( !RecordCommandBuffer( current_rendering_resource.CommandBuffer, GetSwapChain().Images[image_index], current_rendering_resource.Framebuffer ) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -746,6 +751,9 @@ namespace ApiWithoutSecrets {
|
|||||||
vkDeviceWaitIdle( GetDevice() );
|
vkDeviceWaitIdle( GetDevice() );
|
||||||
|
|
||||||
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
||||||
|
if( Vulkan.RenderingResources[i].Framebuffer != VK_NULL_HANDLE ) {
|
||||||
|
vkDestroyFramebuffer( GetDevice(), Vulkan.RenderingResources[i].Framebuffer, nullptr );
|
||||||
|
}
|
||||||
if( Vulkan.RenderingResources[i].CommandBuffer != VK_NULL_HANDLE ) {
|
if( Vulkan.RenderingResources[i].CommandBuffer != VK_NULL_HANDLE ) {
|
||||||
vkFreeCommandBuffers( GetDevice(), Vulkan.CommandPool, 1, &Vulkan.RenderingResources[i].CommandBuffer );
|
vkFreeCommandBuffers( GetDevice(), Vulkan.CommandPool, 1, &Vulkan.RenderingResources[i].CommandBuffer );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,12 +49,14 @@ namespace ApiWithoutSecrets {
|
|||||||
// Struct containing data used during rendering process //
|
// Struct containing data used during rendering process //
|
||||||
// ************************************************************ //
|
// ************************************************************ //
|
||||||
struct RenderingResourcesData {
|
struct RenderingResourcesData {
|
||||||
|
VkFramebuffer Framebuffer;
|
||||||
VkCommandBuffer CommandBuffer;
|
VkCommandBuffer CommandBuffer;
|
||||||
VkSemaphore ImageAvailableSemaphore;
|
VkSemaphore ImageAvailableSemaphore;
|
||||||
VkSemaphore FinishedRenderingSemaphore;
|
VkSemaphore FinishedRenderingSemaphore;
|
||||||
VkFence Fence;
|
VkFence Fence;
|
||||||
|
|
||||||
RenderingResourcesData() :
|
RenderingResourcesData() :
|
||||||
|
Framebuffer( VK_NULL_HANDLE ),
|
||||||
CommandBuffer( VK_NULL_HANDLE ),
|
CommandBuffer( VK_NULL_HANDLE ),
|
||||||
ImageAvailableSemaphore( VK_NULL_HANDLE ),
|
ImageAvailableSemaphore( VK_NULL_HANDLE ),
|
||||||
FinishedRenderingSemaphore( VK_NULL_HANDLE ),
|
FinishedRenderingSemaphore( VK_NULL_HANDLE ),
|
||||||
@@ -114,8 +116,8 @@ namespace ApiWithoutSecrets {
|
|||||||
bool CreateFences();
|
bool CreateFences();
|
||||||
bool AllocateBufferMemory( VkBuffer buffer, VkDeviceMemory *memory );
|
bool AllocateBufferMemory( VkBuffer buffer, VkDeviceMemory *memory );
|
||||||
bool CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size );
|
bool CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size );
|
||||||
bool RecordCommandBuffer( VkCommandBuffer command_buffer, VkImage image, VkImageView image_view );
|
bool RecordCommandBuffer( VkCommandBuffer command_buffer, const ImageParameters &image_parameters, VkFramebuffer &framebuffer );
|
||||||
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> CreateFramebuffer( VkImageView image_view );
|
bool CreateFramebuffer( VkFramebuffer &framebuffer, VkImageView image_view );
|
||||||
|
|
||||||
void ChildClear() override;
|
void ChildClear() override;
|
||||||
bool ChildOnWindowSizeChanged() override;
|
bool ChildOnWindowSizeChanged() override;
|
||||||
|
|||||||
Reference in New Issue
Block a user