diff options
| -rw-r--r-- | include/vk-renderer.hpp | 9 | ||||
| -rw-r--r-- | src/main.cpp | 5 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 62 |
3 files changed, 64 insertions, 12 deletions
diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index a35b9ec..f0a21f6 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -31,13 +31,9 @@ class vkrenderer { return scene_buffer.alloc_info.pMappedData; } - inline void* geometry_buffer_ptr() { - return geometry_buffer.alloc_info.pMappedData; - } + void update_geometry_buffer(void* data); - inline void* bvh_buffer_ptr() { - return bvh_buffer.alloc_info.pMappedData; - } + void update_bvh_buffer(void* data); private: @@ -54,7 +50,6 @@ class vkrenderer { std::vector<VkCommandBuffer> command_buffers; - // TODO: Maybe use a map in the future std::vector<VkDescriptorSetLayoutBinding> compute_sets_bindings; std::vector<VkDescriptorSet> compute_shader_sets; Pipeline compute_pipeline; diff --git a/src/main.cpp b/src/main.cpp index c2643ca..116dee4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -68,9 +68,8 @@ int main() { // Upload scene content std::memcpy(renderer.scene_buffer_ptr(), &main_scene.meta, sizeof(main_scene.meta)); - // std::memcpy(renderer.geometry_buffer_ptr(), main_scene.spheres.data(), sizeof(main_scene.spheres[0]) * main_scene.spheres.size()); - std::memcpy(renderer.geometry_buffer_ptr(), main_scene.triangles.data(), sizeof(main_scene.triangles[0]) * main_scene.triangles.size()); - std::memcpy(renderer.bvh_buffer_ptr(), main_scene.packed_nodes.data(), sizeof(main_scene.packed_nodes[0]) * main_scene.packed_nodes.size()); + renderer.update_geometry_buffer(main_scene.triangles.data()); + renderer.update_bvh_buffer(main_scene.packed_nodes.data()); ImGuiIO& io = ImGui::GetIO(); io.DisplaySize.x = (float)width; 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); +} |
