Modified Tutorial04: introduced recommended drawing approach with arbitrary number of [command buffer, semaphore, fence] resources and command buffer recorded each frame; removed creation of a custom image and a copy operation (from custom image to swapchain); framebuffer is now created only during command buffer recording; added dynamic viewport and scissors test states.

This commit is contained in:
plapins
2016-04-22 23:23:51 +02:00
parent e9929a92a7
commit ffca3688bc
4 changed files with 309 additions and 451 deletions

View File

@@ -16,25 +16,6 @@
namespace ApiWithoutSecrets {
// ************************************************************ //
// ImageParameters //
// //
// Vulkan Image's parameters container class //
// ************************************************************ //
struct ImageParameters {
VkFormat Format;
VkImage Handle;
VkDeviceMemory Memory;
VkImageView View;
ImageParameters() :
Format( VK_FORMAT_R8G8B8A8_UNORM ),
Handle( VK_NULL_HANDLE ),
Memory( VK_NULL_HANDLE ),
View( VK_NULL_HANDLE ) {
}
};
// ************************************************************ //
// BufferParameters //
// //
@@ -62,31 +43,45 @@ namespace ApiWithoutSecrets {
float r, g, b, a;
};
// ************************************************************ //
// RenderingResourcesData //
// //
// Struct containing data used during rendering process //
// ************************************************************ //
struct RenderingResourcesData {
VkCommandBuffer CommandBuffer;
VkSemaphore ImageAvailableSemaphore;
VkSemaphore FinishedRenderingSemaphore;
VkFence Fence;
RenderingResourcesData() :
CommandBuffer( VK_NULL_HANDLE ),
ImageAvailableSemaphore( VK_NULL_HANDLE ),
FinishedRenderingSemaphore( VK_NULL_HANDLE ),
Fence( VK_NULL_HANDLE ) {
}
};
// ************************************************************ //
// VulkanTutorial04Parameters //
// //
// Vulkan specific parameters //
// ************************************************************ //
struct VulkanTutorial04Parameters {
VkRenderPass RenderPass;
ImageParameters Image;
VkFramebuffer Framebuffer;
VkPipeline GraphicsPipeline;
BufferParameters VertexBuffer;
VkFence Fence;
VkCommandPool GraphicsCommandPool;
VkCommandBuffer RenderingCommandBuffer;
VkCommandBuffer CopyingCommandBuffer;
VkRenderPass RenderPass;
VkPipeline GraphicsPipeline;
BufferParameters VertexBuffer;
VkCommandPool CommandPool;
std::vector<RenderingResourcesData> RenderingResources;
static const size_t ResourcesCount = 3;
VulkanTutorial04Parameters() :
RenderPass( VK_NULL_HANDLE ),
Image(),
GraphicsPipeline( VK_NULL_HANDLE ),
VertexBuffer(),
Fence( VK_NULL_HANDLE ),
GraphicsCommandPool( VK_NULL_HANDLE ),
RenderingCommandBuffer( VK_NULL_HANDLE ),
CopyingCommandBuffer( VK_NULL_HANDLE ) {
CommandPool( VK_NULL_HANDLE ),
RenderingResources( ResourcesCount ) {
}
};
@@ -101,27 +96,26 @@ namespace ApiWithoutSecrets {
~Tutorial04();
bool CreateRenderPass();
bool CreateImage();
bool CreateFramebuffer();
bool CreatePipeline();
bool CreateRenderingResources();
bool CreateVertexBuffer();
bool CreateFence();
bool CreateCommandBuffers();
bool RecordRenderingCommandBuffer();
bool Draw() override;
private:
VulkanTutorial04Parameters Vulkan;
bool AllocateImageMemory( VkImage image, VkDeviceMemory *memory );
bool AllocateBufferMemory( VkBuffer buffer, VkDeviceMemory *memory );
bool CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size );
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 AllocateCommandBuffers( VkCommandPool pool, uint32_t count, VkCommandBuffer *command_buffers );
bool RecordCopyingCommandBuffer( VkImage swap_chain_image );
bool CreateCommandBuffers();
bool CreateSemaphores();
bool CreateFences();
bool AllocateBufferMemory( VkBuffer buffer, VkDeviceMemory *memory );
bool CommitMemoryChanges( VkBuffer buffer, VkDeviceSize size );
bool RecordCommandBuffer( VkCommandBuffer command_buffer, VkImage image, VkImageView image_view );
Tools::AutoDeleter<VkFramebuffer, PFN_vkDestroyFramebuffer> CreateFramebuffer( VkImageView image_view );
void ChildClear() override;
bool ChildOnWindowSizeChanged() override;