diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/scene.cpp | 12 | ||||
| -rw-r--r-- | src/vk-api.cpp | 43 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 15 |
3 files changed, 40 insertions, 30 deletions
diff --git a/src/scene.cpp b/src/scene.cpp index 9caed7b..f538292 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -58,13 +58,13 @@ scene::scene(camera cam, uint32_t width, uint32_t height, vkrenderer &renderer)
:meta(cam, width, height){
- auto bistro_interior_path = std::filesystem::path("../models/BistroInterior");
- auto bistro_interior_filename = std::string("BistroInterior.gltf");
- auto root_node = gltf::load(bistro_interior_path, bistro_interior_filename, renderer);
+ // auto bistro_interior_path = std::filesystem::path("../models/BistroInterior");
+ // auto bistro_interior_filename = std::string("BistroInterior.gltf");
+ // auto root_node = gltf::load(bistro_interior_path, bistro_interior_filename, renderer);
- // auto sponza_path = std::filesystem::path("../models/sponza");
- // auto sponza_filename = std::string("Sponza.gltf");
- // auto root_node = gltf::load(sponza_path, sponza_filename, renderer);
+ auto sponza_path = std::filesystem::path("../models/sponza");
+ auto sponza_filename = std::string("Sponza.gltf");
+ auto root_node = gltf::load(sponza_path, sponza_filename, renderer);
std::vector<triangle> triangles;
auto triangles_offset = 0;
diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 3391246..4bfae42 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -135,6 +135,16 @@ vkapi::vkapi() { } vkapi::~vkapi() { + // Free resources + while (buffers.size()) + destroy_buffer(buffers.begin()->second); + + while (images.size()) + destroy_image(images.begin()->second); + + while (samplers.size()) + destroy_sampler(samplers.begin()->second); + // Free bindless descriptor stuff vkDestroyDescriptorSetLayout(context.device, bindless_descriptor.set_layout, nullptr); vkDestroyPipelineLayout(context.device, bindless_descriptor.pipeline_layout, nullptr); @@ -145,8 +155,8 @@ vkapi::~vkapi() { } -Buffer vkapi::create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage mem_usage) { - Buffer buffer = {}; +buffer vkapi::create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage mem_usage) { + buffer buffer = {}; VkBufferCreateInfo buffer_info = {}; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -168,10 +178,12 @@ Buffer vkapi::create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, V buffer.device_address = vkGetBufferDeviceAddress(context.device, &buffer_device_address_info); + buffers.insert({ buffer.handle, buffer }); + return std::move(buffer); } -void vkapi::copy_buffer(VkCommandBuffer cmd_buf, Buffer src, Buffer dst, size_t size) { +void vkapi::copy_buffer(VkCommandBuffer cmd_buf, buffer src, buffer dst, size_t size) { VkBufferCopy buffer_copy = {}; buffer_copy.srcOffset = 0; buffer_copy.dstOffset = 0; @@ -180,7 +192,7 @@ void vkapi::copy_buffer(VkCommandBuffer cmd_buf, Buffer src, Buffer dst, size_t vkCmdCopyBuffer(cmd_buf, src.handle, dst.handle, 1, &buffer_copy); } -void vkapi::copy_buffer(VkCommandBuffer cmd_buf, Buffer src, image dst) { +void vkapi::copy_buffer(VkCommandBuffer cmd_buf, buffer src, image dst) { VkImageSubresourceLayers image_subresource_layers = {}; image_subresource_layers.aspectMask = dst.subresource_range.aspectMask; image_subresource_layers.mipLevel = 0; @@ -198,8 +210,10 @@ void vkapi::copy_buffer(VkCommandBuffer cmd_buf, Buffer src, image dst) { vkCmdCopyBufferToImage(cmd_buf, src.handle, dst.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &buffer_to_image_copy); } -void vkapi::destroy_buffer(Buffer& buffer) { +void vkapi::destroy_buffer(buffer& buffer) { vmaDestroyBuffer(context.allocator, buffer.handle, buffer.alloc); + + buffers.erase(buffer.handle); } @@ -256,6 +270,8 @@ image vkapi::create_image(VkExtent3D size, VkFormat format, VkImageUsageFlags us image.bindless_storage_index = bindless_descriptor.allocate(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE); image.bindless_sampled_index = bindless_descriptor.allocate(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE); + images.insert({ image.handle, image }); + return std::move(image); } void vkapi::destroy_image(image &image) { @@ -264,6 +280,9 @@ void vkapi::destroy_image(image &image) { vmaDestroyImage(context.allocator, image.handle, image.alloc); vkDestroyImageView(context.device, image.view, nullptr); + + images.erase(image.handle); + } std::vector<image> vkapi::create_images(VkExtent3D size, VkFormat format, VkImageUsageFlags usages, size_t image_count) { @@ -374,6 +393,8 @@ sampler vkapi::create_sampler(VkFilter filter, VkSamplerAddressMode address_mode sampler.bindless_index = bindless_descriptor.allocate(VK_DESCRIPTOR_TYPE_SAMPLER); + samplers.insert({ sampler.handle, sampler }); + return std::move(sampler); } @@ -381,6 +402,8 @@ void vkapi::destroy_sampler(sampler sampler) { bindless_descriptor.free(sampler.bindless_index, VK_DESCRIPTOR_TYPE_SAMPLER); vkDestroySampler(context.device, sampler.handle, VK_NULL_HANDLE); + + samplers.erase(sampler.handle); } @@ -753,8 +776,8 @@ void vkapi::destroy_surface(VkSurfaceKHR surface) { } -Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, VkSwapchainKHR old_swapchain) { - Swapchain swapchain; +swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, VkSwapchainKHR old_swapchain) { + swapchain swapchain; VkBool32 queue_support_presentation = VK_FALSE; VKRESULT(vkGetPhysicalDeviceSurfaceSupportKHR(context.physical_device, context.queue_index, surface, &queue_support_presentation)) @@ -864,7 +887,7 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, return std::move(swapchain); } -void vkapi::destroy_swapchain(Swapchain& swapchain) { +void vkapi::destroy_swapchain(swapchain& swapchain) { for(auto &image: swapchain.images) { bindless_descriptor.free(image.bindless_storage_index, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE); bindless_descriptor.free(image.bindless_sampled_index, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE); @@ -1006,7 +1029,7 @@ void vkapi::draw(VkCommandBuffer command_buffer, Pipeline pipeline, uint32_t ver vkCmdDraw(command_buffer, vertex_count, 1, vertex_offset, 0); } -void vkapi::draw(VkCommandBuffer command_buffer, Pipeline pipeline, Buffer index_buffer, uint32_t index_count, uint32_t index_offset, uint32_t vertex_offset) { +void vkapi::draw(VkCommandBuffer command_buffer, Pipeline pipeline, buffer index_buffer, uint32_t index_count, uint32_t index_offset, uint32_t vertex_offset) { vkCmdBindIndexBuffer(command_buffer, index_buffer.handle, 0, VK_INDEX_TYPE_UINT16); vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bindless_descriptor.pipeline_layout, 0, 1, &bindless_descriptor.set, 0, nullptr); @@ -1063,7 +1086,7 @@ VkResult vkapi::submit(VkCommandBuffer command_buffer, VkSemaphore wait_semaphor return vkQueueSubmit(context.queue, 1, &submit_info, submission_fence); } -VkResult vkapi::present(Swapchain& swapchain, uint32_t image_index, VkSemaphore wait_semaphore) { +VkResult vkapi::present(swapchain& swapchain, uint32_t image_index, VkSemaphore wait_semaphore) { VkPresentInfoKHR present_info = {}; present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; present_info.pNext = nullptr; diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index ba5f017..76185d0 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -143,31 +143,18 @@ vkrenderer::vkrenderer(window& wnd) { vkrenderer::~vkrenderer() { VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX)) - api.destroy_buffer(staging_buffer); api.destroy_fences(submission_fences); api.destroy_semaphores(execution_semaphores); api.destroy_semaphores(acquire_semaphores); - api.destroy_images(accumulation_images); - api.destroy_render_pass(render_pass); api.destroy_sampler(ui_texture_sampler); - api.destroy_image(ui_texture); - for (auto& framebuffer: framebuffers) { api.destroy_framebuffer(framebuffer); } - for (auto& vertex_buffer: ui_vertex_buffers) { - api.destroy_buffer(vertex_buffer); - } - - for (auto& index_buffer: ui_index_buffers) { - api.destroy_buffer(index_buffer); - } - api.destroy_command_buffers(command_buffers); api.destroy_pipeline(compute_pipeline); @@ -340,7 +327,7 @@ void vkrenderer::finish_frame() { void vkrenderer::recreate_swapchain() { VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX)) - Swapchain old_swapchain = swapchain; + struct swapchain old_swapchain = swapchain; swapchain = api.create_swapchain( platform_surface, min_swapchain_image_count, |
