aboutsummaryrefslogtreecommitdiffstats
path: root/include/vk-renderer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/vk-renderer.hpp')
-rw-r--r--include/vk-renderer.hpp113
1 files changed, 79 insertions, 34 deletions
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<Renderpass*> renderpasses;
+ static constexpr uint32_t initial_copy_command_buffers = 10U;
uint32_t virtual_frame_index = 0;
uint32_t swapchain_image_index = 0;
- std::vector<VkCommandBuffer> command_buffers;
+ VkCommandBuffer graphics_command_buffers[virtual_frames_count];
+ std::vector<VkCommandBuffer> 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<Texture*> 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_