aboutsummaryrefslogtreecommitdiffstats
path: root/src/vk-renderer.cpp
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2021-08-01 22:27:49 +0200
committerladevieq <ladevie.quentin@gmail.com>2021-08-01 22:27:49 +0200
commit7ad783cd5ffba2846b60d9fd8d5d8e9a043d560a (patch)
tree7b9682fbc474cad9de425edd810b681f564ab259 /src/vk-renderer.cpp
parentd96e1b98f9377731bf996e87230d89dad51a7918 (diff)
Make geometry and bvh buffer gpu only
Diffstat (limited to 'src/vk-renderer.cpp')
-rw-r--r--src/vk-renderer.cpp62
1 files changed, 60 insertions, 2 deletions
diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp
index cb466f2..8570119 100644
--- a/src/vk-renderer.cpp
+++ b/src/vk-renderer.cpp
@@ -108,8 +108,9 @@ vkrenderer::vkrenderer(window& wnd, size_t scene_buffer_size, size_t geometry_bu
acquire_semaphores = api.create_semaphores(virtual_frames_count);
scene_buffer = api.create_buffer(scene_buffer_size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
- geometry_buffer = api.create_buffer(geometry_buffer_size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
- bvh_buffer = api.create_buffer(bvh_buffer_size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
+ geometry_buffer = api.create_buffer(geometry_buffer_size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_ONLY);
+ bvh_buffer = api.create_buffer(bvh_buffer_size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_GPU_ONLY);
+
for (size_t index = 0; index < virtual_frames_count; index++) {
api.update_descriptor_set_buffer(compute_shader_sets[index], compute_sets_bindings[0], scene_buffer);
@@ -185,6 +186,7 @@ vkrenderer::vkrenderer(window& wnd, size_t scene_buffer_size, size_t geometry_bu
api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, ui_texture);
+ // TODO: Move this into the API
VkImageSubresourceLayers image_subresource_layers = {};
image_subresource_layers.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
image_subresource_layers.mipLevel = 0;
@@ -476,3 +478,59 @@ void vkrenderer::handle_swapchain_result(VkResult function_result) {
return;
}
}
+
+
+// TODO: Integrate into the API so that we no longer have to wait for the fence
+void vkrenderer::update_geometry_buffer(void* data) {
+ VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX))
+ VKRESULT(vkResetFences(api.context.device, 1, &submission_fences[virtual_frame_index]))
+
+ auto cmd_buf = command_buffers[virtual_frame_index];
+ api.start_record(cmd_buf);
+
+ auto staging_buffer = api.create_buffer(geometry_buffer.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
+ std::memcpy(staging_buffer.alloc_info.pMappedData, data, staging_buffer.size);
+ // std::memcpy(geometry_staging_buffer.alloc_info.pMappedData, data, geometry_staging_buffer.size);
+
+ VkBufferCopy buffer_copy = {};
+ buffer_copy.srcOffset = 0;
+ buffer_copy.dstOffset = 0;
+ buffer_copy.size = staging_buffer.size;
+
+ vkCmdCopyBuffer(cmd_buf, staging_buffer.handle, geometry_buffer.handle, 1, &buffer_copy);
+
+ api.end_record(cmd_buf);
+
+ api.submit(cmd_buf, VK_NULL_HANDLE, VK_NULL_HANDLE, submission_fences[virtual_frame_index]);
+
+ VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX))
+
+ api.destroy_buffer(staging_buffer);
+}
+
+void vkrenderer::update_bvh_buffer(void* data) {
+ VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX))
+ VKRESULT(vkResetFences(api.context.device, 1, &submission_fences[virtual_frame_index]))
+
+ auto cmd_buf = command_buffers[virtual_frame_index];
+ api.start_record(cmd_buf);
+
+ auto staging_buffer = api.create_buffer(bvh_buffer.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
+ std::memcpy(staging_buffer.alloc_info.pMappedData, data, staging_buffer.size);
+ // std::memcpy(bvh_staging_buffer.alloc_info.pMappedData, data, bvh_staging_buffer.size);
+
+ VkBufferCopy buffer_copy = {};
+ buffer_copy.srcOffset = 0;
+ buffer_copy.dstOffset = 0;
+ buffer_copy.size = staging_buffer.size;
+
+ vkCmdCopyBuffer(cmd_buf, staging_buffer.handle, bvh_buffer.handle, 1, &buffer_copy);
+
+ api.end_record(cmd_buf);
+
+ api.submit(cmd_buf, VK_NULL_HANDLE, VK_NULL_HANDLE, submission_fences[virtual_frame_index]);
+
+ VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[virtual_frame_index], VK_TRUE, UINT64_MAX))
+
+ api.destroy_buffer(staging_buffer);
+}