From b0708f165601fad16aa59715dbe32796a6e7081e Mon Sep 17 00:00:00 2001 From: ladevieq Date: Tue, 6 Sep 2022 22:41:00 +0200 Subject: Setup for texture upload system --- include/vk-renderer.hpp | 113 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 34 deletions(-) (limited to 'include/vk-renderer.hpp') diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index 827445f..ca4c261 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -17,6 +17,7 @@ class window; class Texture; class Buffer; class Sampler; +class RingBuffer; class vkrenderer { public: @@ -24,24 +25,20 @@ class vkrenderer { ~vkrenderer(); - void begin_frame(); - - void finish_frame(); - void recreate_swapchain(); - void update_image(Texture* texture, void* data); static Buffer* create_buffer(size_t size); static Buffer* create_index_buffer(size_t size); - static Texture* create_2d_texture(size_t width, size_t height, VkFormat format); + static Texture* create_2d_texture(size_t width, size_t height, VkFormat format, Sampler *sampler = nullptr); static void destroy_2d_texture(Texture* texture); static Sampler* create_sampler(VkFilter filter, VkSamplerAddressMode address_mode); + ComputeRenderpass* create_compute_renderpass(); PrimitiveRenderpass* create_primitive_renderpass(); @@ -50,6 +47,8 @@ class vkrenderer { void render(); + RingBuffer* get_staging_buffer() { return staging_buffer; } + [[nodiscard]]uint32_t frame_index() const { return this->virtual_frame_index; } [[nodiscard]]Texture* back_buffer() const { return swapchain_textures[swapchain_image_index]; } @@ -64,18 +63,23 @@ class vkrenderer { private: - void handle_swapchain_result(VkResult function_result); + void begin_frame(); + + void finish_frame(); + - // vkapi api; + void handle_swapchain_result(VkResult function_result); std::vector renderpasses; + static constexpr uint32_t initial_copy_command_buffers = 10U; uint32_t virtual_frame_index = 0; uint32_t swapchain_image_index = 0; - std::vector command_buffers; + VkCommandBuffer graphics_command_buffers[virtual_frames_count]; + std::vector copy_command_buffers[virtual_frames_count]; - handle staging_buffer; + RingBuffer* staging_buffer; pipeline tonemapping_pipeline; @@ -84,6 +88,9 @@ class vkrenderer { VkSemaphore execution_semaphores[virtual_frames_count]; VkSemaphore acquire_semaphores[virtual_frames_count]; + VkCommandPool graphics_command_pool; + VkCommandPool copy_command_pools[virtual_frames_count]; + VkSurfaceKHR platform_surface; swapchain swapchain; std::vector swapchain_textures; @@ -91,13 +98,34 @@ class vkrenderer { const uint32_t min_swapchain_image_count = 3; }; -// TODO: Move those to there own files -class Texture { +class RingBuffer { public: + RingBuffer(size_t size) + : buffer_size(size) {} - sampler sampler; + [[nodiscard]]size_t alloc(size_t alloc_size) const { + assert(alloc_size > 0); - handle device_image; + if (ptr + alloc_size < buffer_size) { + return ptr; + } + return 0; + } + + void write(void* data, off_t alloc_offset, size_t data_size) const { + auto api_buffer = vkrenderer::api.get_buffer(device_buffer); + + std::memcpy((uint8_t*)api_buffer.device_ptr + alloc_offset, data, data_size); + } + + void reset() { + ptr = 0; + } + + handle device_buffer; + + size_t buffer_size; + off_t ptr; }; class Sampler { @@ -106,33 +134,55 @@ class Sampler { handle device_sampler; }; -class Buffer { +// TODO: Move those to there own files +class Texture { public: - Buffer(size_t size); + void write(void* data) const { + auto image = vkrenderer::api.get_image(device_image); + auto texture_size = image.size.width * image.size.height * 4; - ~Buffer() { - vkrenderer::api.destroy_buffer(device_buffer); - } + // TODO: Do all this inside vkrenderer + // auto* buffer = vkrenderer::get_staging_buffer(); + // auto alloc_offset = buffer->alloc(texture_size); + // assert(alloc_offset > 0); - void write(void* data, off_t alloc_offset, size_t data_size) const { - auto api_buffer = vkrenderer::api.get_buffer(device_buffer); + // // std::memcpy(buffer.device_ptr, data, texture_size); + // buffer->write(data, alloc_offset, texture_size); - std::memcpy((uint8_t*)api_buffer.device_ptr + alloc_offset, data, data_size); + // vkrenderer::api.create_command_buffers + // submit upload work + // VKRESULT(vkWaitForFences(vkrenderer::context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX)) + // VKRESULT(vkResetFences(vkrenderer::context.device, 1, &submission_fences[virtual_frame_index])) + + // auto* cmd_buf = command_buffers[virtual_frame_index]; + // api.start_record(cmd_buf); + + // api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, device_image); + + // api.copy_buffer(cmd_buf, buffer, device_image); + + // api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, device_image); + + // api.end_record(cmd_buf); + + + + // VKRESULT(vkWaitForFences(vkrenderer::context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX)) } - handle device_buffer; + Sampler* sampler = nullptr; - size_t buffer_size; + handle device_image; }; -class RingBuffer { +class Buffer { public: - RingBuffer(size_t size) - : buffer_size(size) {} - [[nodiscard]]bool alloc(size_t alloc_size) const { - return ptr + alloc_size > buffer_size; + Buffer(size_t size); + + ~Buffer() { + vkrenderer::api.destroy_buffer(device_buffer); } void write(void* data, off_t alloc_offset, size_t data_size) const { @@ -141,14 +191,9 @@ class RingBuffer { std::memcpy((uint8_t*)api_buffer.device_ptr + alloc_offset, data, data_size); } - void reset() { - ptr = 0; - } - handle device_buffer; size_t buffer_size; - off_t ptr; }; #endif // !__VK_RENDERER_HPP_ -- cgit v1.3