mirror of
https://github.com/opus-tango/IntroductionToVulkan.git
synced 2026-03-20 03:55:26 +00:00
Refactored code in Tutorial 05 (changed order of operaions - moved rendering resources creation to the beginning).
This commit is contained in:
@@ -17,6 +17,91 @@ namespace ApiWithoutSecrets {
|
|||||||
Vulkan() {
|
Vulkan() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tutorial05::CreateRenderingResources() {
|
||||||
|
if( !CreateCommandPool( GetGraphicsQueue().FamilyIndex, &Vulkan.CommandPool ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
||||||
|
if( !AllocateCommandBuffers( Vulkan.CommandPool, 1, &Vulkan.RenderingResources[i].CommandBuffer ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !CreateSemaphore( &Vulkan.RenderingResources[i].ImageAvailableSemaphore ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !CreateSemaphore( &Vulkan.RenderingResources[i].FinishedRenderingSemaphore ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !CreateFence( VK_FENCE_CREATE_SIGNALED_BIT, &Vulkan.RenderingResources[i].Fence ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Tutorial05::CreateCommandPool( uint32_t queue_family_index, VkCommandPool *pool ) {
|
||||||
|
VkCommandPoolCreateInfo cmd_pool_create_info = {
|
||||||
|
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType
|
||||||
|
nullptr, // const void *pNext
|
||||||
|
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | // VkCommandPoolCreateFlags flags
|
||||||
|
VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,
|
||||||
|
queue_family_index // uint32_t queueFamilyIndex
|
||||||
|
};
|
||||||
|
|
||||||
|
if( vkCreateCommandPool( GetDevice(), &cmd_pool_create_info, nullptr, pool ) != VK_SUCCESS ) {
|
||||||
|
std::cout << "Could not create command pool!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Tutorial05::AllocateCommandBuffers( VkCommandPool pool, uint32_t count, VkCommandBuffer *command_buffers ) {
|
||||||
|
VkCommandBufferAllocateInfo command_buffer_allocate_info = {
|
||||||
|
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType
|
||||||
|
nullptr, // const void *pNext
|
||||||
|
pool, // VkCommandPool commandPool
|
||||||
|
VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level
|
||||||
|
count // uint32_t bufferCount
|
||||||
|
};
|
||||||
|
|
||||||
|
if( vkAllocateCommandBuffers( GetDevice(), &command_buffer_allocate_info, command_buffers ) != VK_SUCCESS ) {
|
||||||
|
std::cout << "Could not allocate command buffer!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Tutorial05::CreateSemaphore( VkSemaphore *semaphore ) {
|
||||||
|
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, semaphore ) != VK_SUCCESS ) {
|
||||||
|
std::cout << "Could not create semaphore!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Tutorial05::CreateFence( VkFenceCreateFlags flags, VkFence *fence ) {
|
||||||
|
VkFenceCreateInfo fence_create_info = {
|
||||||
|
VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType
|
||||||
|
nullptr, // const void *pNext
|
||||||
|
flags // VkFenceCreateFlags flags
|
||||||
|
};
|
||||||
|
|
||||||
|
if( vkCreateFence( GetDevice(), &fence_create_info, nullptr, fence ) != VK_SUCCESS ) {
|
||||||
|
std::cout << "Could not create a fence!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Tutorial05::CreateRenderPass() {
|
bool Tutorial05::CreateRenderPass() {
|
||||||
VkAttachmentDescription attachment_descriptions[] = {
|
VkAttachmentDescription attachment_descriptions[] = {
|
||||||
{
|
{
|
||||||
@@ -318,96 +403,6 @@ namespace ApiWithoutSecrets {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tutorial05::CreateRenderingResources() {
|
|
||||||
if( !CreateCommandBuffers() ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if( !CreateSemaphores() ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if( !CreateFences() ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::CreateCommandBuffers() {
|
|
||||||
if( !CreateCommandPool( GetGraphicsQueue().FamilyIndex, &Vulkan.CommandPool ) ) {
|
|
||||||
std::cout << "Could not create command pool!" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
|
||||||
if( !AllocateCommandBuffers( Vulkan.CommandPool, 1, &Vulkan.RenderingResources[i].CommandBuffer ) ) {
|
|
||||||
std::cout << "Could not allocate command buffer!" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::CreateCommandPool( uint32_t queue_family_index, VkCommandPool *pool ) {
|
|
||||||
VkCommandPoolCreateInfo cmd_pool_create_info = {
|
|
||||||
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType
|
|
||||||
nullptr, // const void *pNext
|
|
||||||
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | // VkCommandPoolCreateFlags flags
|
|
||||||
VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,
|
|
||||||
queue_family_index // uint32_t queueFamilyIndex
|
|
||||||
};
|
|
||||||
|
|
||||||
if( vkCreateCommandPool( GetDevice(), &cmd_pool_create_info, nullptr, pool ) != VK_SUCCESS ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::AllocateCommandBuffers( VkCommandPool pool, uint32_t count, VkCommandBuffer *command_buffers ) {
|
|
||||||
VkCommandBufferAllocateInfo command_buffer_allocate_info = {
|
|
||||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType
|
|
||||||
nullptr, // const void *pNext
|
|
||||||
pool, // VkCommandPool commandPool
|
|
||||||
VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level
|
|
||||||
count // uint32_t bufferCount
|
|
||||||
};
|
|
||||||
|
|
||||||
if( vkAllocateCommandBuffers( GetDevice(), &command_buffer_allocate_info, command_buffers ) != VK_SUCCESS ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::CreateSemaphores() {
|
|
||||||
VkSemaphoreCreateInfo semaphore_create_info = {
|
|
||||||
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType
|
|
||||||
nullptr, // const void* pNext
|
|
||||||
0 // VkSemaphoreCreateFlags flags
|
|
||||||
};
|
|
||||||
|
|
||||||
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
|
||||||
if( (vkCreateSemaphore( GetDevice(), &semaphore_create_info, nullptr, &Vulkan.RenderingResources[i].ImageAvailableSemaphore ) != VK_SUCCESS) ||
|
|
||||||
(vkCreateSemaphore( GetDevice(), &semaphore_create_info, nullptr, &Vulkan.RenderingResources[i].FinishedRenderingSemaphore ) != VK_SUCCESS) ) {
|
|
||||||
std::cout << "Could not create semaphores!" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::CreateFences() {
|
|
||||||
VkFenceCreateInfo fence_create_info = {
|
|
||||||
VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType
|
|
||||||
nullptr, // const void *pNext
|
|
||||||
VK_FENCE_CREATE_SIGNALED_BIT // VkFenceCreateFlags flags
|
|
||||||
};
|
|
||||||
|
|
||||||
for( size_t i = 0; i < Vulkan.RenderingResources.size(); ++i ) {
|
|
||||||
if( vkCreateFence( GetDevice(), &fence_create_info, nullptr, &Vulkan.RenderingResources[i].Fence ) != VK_SUCCESS ) {
|
|
||||||
std::cout << "Could not create a fence!" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Tutorial05::CreateVertexBuffer() {
|
bool Tutorial05::CreateVertexBuffer() {
|
||||||
const std::vector<float>& vertex_data = GetVertexData();
|
const std::vector<float>& vertex_data = GetVertexData();
|
||||||
|
|
||||||
@@ -505,7 +500,7 @@ namespace ApiWithoutSecrets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Tutorial05::CopyVertexData() {
|
bool Tutorial05::CopyVertexData() {
|
||||||
// Prepare data in staging buffer
|
// Prepare data in a staging buffer
|
||||||
const std::vector<float>& vertex_data = GetVertexData();
|
const std::vector<float>& vertex_data = GetVertexData();
|
||||||
|
|
||||||
void *staging_buffer_memory_pointer;
|
void *staging_buffer_memory_pointer;
|
||||||
@@ -807,6 +802,20 @@ namespace ApiWithoutSecrets {
|
|||||||
if( GetDevice() != VK_NULL_HANDLE ) {
|
if( GetDevice() != VK_NULL_HANDLE ) {
|
||||||
vkDeviceWaitIdle( GetDevice() );
|
vkDeviceWaitIdle( GetDevice() );
|
||||||
|
|
||||||
|
DestroyBuffer( Vulkan.VertexBuffer );
|
||||||
|
|
||||||
|
DestroyBuffer( Vulkan.StagingBuffer );
|
||||||
|
|
||||||
|
if( Vulkan.GraphicsPipeline != VK_NULL_HANDLE ) {
|
||||||
|
vkDestroyPipeline( GetDevice(), Vulkan.GraphicsPipeline, nullptr );
|
||||||
|
Vulkan.GraphicsPipeline = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Vulkan.RenderPass != VK_NULL_HANDLE ) {
|
||||||
|
vkDestroyRenderPass( GetDevice(), Vulkan.RenderPass, nullptr );
|
||||||
|
Vulkan.RenderPass = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
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 ) {
|
if( Vulkan.RenderingResources[i].Framebuffer != VK_NULL_HANDLE ) {
|
||||||
vkDestroyFramebuffer( GetDevice(), Vulkan.RenderingResources[i].Framebuffer, nullptr );
|
vkDestroyFramebuffer( GetDevice(), Vulkan.RenderingResources[i].Framebuffer, nullptr );
|
||||||
@@ -829,20 +838,6 @@ namespace ApiWithoutSecrets {
|
|||||||
vkDestroyCommandPool( GetDevice(), Vulkan.CommandPool, nullptr );
|
vkDestroyCommandPool( GetDevice(), Vulkan.CommandPool, nullptr );
|
||||||
Vulkan.CommandPool = VK_NULL_HANDLE;
|
Vulkan.CommandPool = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DestroyBuffer( Vulkan.VertexBuffer );
|
|
||||||
|
|
||||||
DestroyBuffer( Vulkan.StagingBuffer );
|
|
||||||
|
|
||||||
if( Vulkan.GraphicsPipeline != VK_NULL_HANDLE ) {
|
|
||||||
vkDestroyPipeline( GetDevice(), Vulkan.GraphicsPipeline, nullptr );
|
|
||||||
Vulkan.GraphicsPipeline = VK_NULL_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Vulkan.RenderPass != VK_NULL_HANDLE ) {
|
|
||||||
vkDestroyRenderPass( GetDevice(), Vulkan.RenderPass, nullptr );
|
|
||||||
Vulkan.RenderPass = VK_NULL_HANDLE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,9 +99,9 @@ namespace ApiWithoutSecrets {
|
|||||||
Tutorial05();
|
Tutorial05();
|
||||||
~Tutorial05();
|
~Tutorial05();
|
||||||
|
|
||||||
|
bool CreateRenderingResources();
|
||||||
bool CreateRenderPass();
|
bool CreateRenderPass();
|
||||||
bool CreatePipeline();
|
bool CreatePipeline();
|
||||||
bool CreateRenderingResources();
|
|
||||||
bool CreateVertexBuffer();
|
bool CreateVertexBuffer();
|
||||||
bool CreateStagingBuffer();
|
bool CreateStagingBuffer();
|
||||||
bool CopyVertexData();
|
bool CopyVertexData();
|
||||||
@@ -111,13 +111,12 @@ namespace ApiWithoutSecrets {
|
|||||||
private:
|
private:
|
||||||
VulkanTutorial05Parameters Vulkan;
|
VulkanTutorial05Parameters Vulkan;
|
||||||
|
|
||||||
Tools::AutoDeleter<VkShaderModule, PFN_vkDestroyShaderModule> CreateShaderModule( const char* filename );
|
|
||||||
Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> CreatePipelineLayout();
|
|
||||||
bool CreateCommandPool( uint32_t queue_family_index, VkCommandPool *pool );
|
bool CreateCommandPool( uint32_t queue_family_index, VkCommandPool *pool );
|
||||||
bool AllocateCommandBuffers( VkCommandPool pool, uint32_t count, VkCommandBuffer *command_buffers );
|
bool AllocateCommandBuffers( VkCommandPool pool, uint32_t count, VkCommandBuffer *command_buffers );
|
||||||
bool CreateCommandBuffers();
|
bool CreateSemaphore( VkSemaphore *semaphore );
|
||||||
bool CreateSemaphores();
|
bool CreateFence( VkFenceCreateFlags flags, VkFence *fence );
|
||||||
bool CreateFences();
|
Tools::AutoDeleter<VkShaderModule, PFN_vkDestroyShaderModule> CreateShaderModule( const char* filename );
|
||||||
|
Tools::AutoDeleter<VkPipelineLayout, PFN_vkDestroyPipelineLayout> CreatePipelineLayout();
|
||||||
bool CreateBuffer( VkBufferUsageFlags usage, VkMemoryPropertyFlagBits memoryProperty, BufferParameters &buffer );
|
bool CreateBuffer( VkBufferUsageFlags usage, VkMemoryPropertyFlagBits memoryProperty, BufferParameters &buffer );
|
||||||
bool AllocateBufferMemory( VkBuffer buffer, VkMemoryPropertyFlagBits property, VkDeviceMemory *memory );
|
bool AllocateBufferMemory( VkBuffer buffer, VkMemoryPropertyFlagBits property, VkDeviceMemory *memory );
|
||||||
const std::vector<float>& GetVertexData() const;
|
const std::vector<float>& GetVertexData() const;
|
||||||
|
|||||||
@@ -25,15 +25,15 @@ int main( int argc, char **argv ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tutorial 05
|
// Tutorial 05
|
||||||
|
if( !tutorial05.CreateRenderingResources() ) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if( !tutorial05.CreateRenderPass() ) {
|
if( !tutorial05.CreateRenderPass() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if( !tutorial05.CreatePipeline() ) {
|
if( !tutorial05.CreatePipeline() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if( !tutorial05.CreateRenderingResources() ) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if( !tutorial05.CreateVertexBuffer() ) {
|
if( !tutorial05.CreateVertexBuffer() ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user