From c8efb2fa5dd359843f68875813158b60e94e4ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Con=C3=A1l?= Date: Thu, 25 Jan 2024 23:49:20 -0500 Subject: [PATCH] Fixed memory allocation issue caused by return of wrong value in choose_heap --- CMakeLists.txt | 2 +- Memory/Buffer.cpp | 4 ++++ Memory/Buffer.hpp | 2 +- Memory/Memory.cpp | 5 ++--- Renderer/Pipeline.cpp | 2 ++ Renderer/Renderer.cpp | 3 +++ Renderer/Shader.cpp | 4 ++-- Renderer/Shader.hpp | 8 ++++---- assets/shaders/basic.frag | 2 +- assets/shaders/basic.frag.spv | Bin 808 -> 808 bytes 10 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba0da74..d941777 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,7 @@ add_dependencies(pleascach shaders) # copy assets somewhere accessible by the accessable add_custom_command( TARGET shaders POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory + COMMAND cmake -E copy_directory "$/assets" "$/assets") diff --git a/Memory/Buffer.cpp b/Memory/Buffer.cpp index 00d904d..1dec373 100644 --- a/Memory/Buffer.cpp +++ b/Memory/Buffer.cpp @@ -1,6 +1,8 @@ #include #include +#include + Buffer::Buffer(vk::PhysicalDevice phys_dev, vk::Device dev, vk::DeviceSize sz, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags mem_flags, vk::SharingMode sharing) : dev(dev), size(sz) { auto info = vk::BufferCreateInfo { .size = sz, @@ -9,6 +11,8 @@ Buffer::Buffer(vk::PhysicalDevice phys_dev, vk::Device dev, vk::DeviceSize sz, v }; buffer = dev.createBuffer(info); + Log::debug("Is memory flagged for host: %d\n", mem_flags & vk::MemoryPropertyFlagBits::eHostVisible); + auto reqs = dev.getBufferMemoryRequirements(buffer); auto alloc_info = vk::MemoryAllocateInfo{ .allocationSize = reqs.size, diff --git a/Memory/Buffer.hpp b/Memory/Buffer.hpp index 2b83235..d29d049 100644 --- a/Memory/Buffer.hpp +++ b/Memory/Buffer.hpp @@ -6,8 +6,8 @@ struct Buffer { Buffer(vk::PhysicalDevice phys_dev, vk::Device dev, vk::DeviceSize sz, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags mem_flags, vk::SharingMode sharing = vk::SharingMode::eExclusive); - vk::DeviceSize size; vk::Device dev; + vk::DeviceSize size; vk::DeviceMemory memory; vk::Buffer buffer; diff --git a/Memory/Memory.cpp b/Memory/Memory.cpp index a365f22..0f1ce7d 100644 --- a/Memory/Memory.cpp +++ b/Memory/Memory.cpp @@ -5,7 +5,6 @@ namespace mem { auto dev_props = phys_dev.getMemoryProperties(); if(static_cast(pref_flags.operator VkImageCreateFlags()) != -1) { - /* try to find an exact match for preferred flags first */ for (u32 memory_type = 0; memory_type < 32; memory_type++) { if (requirements.memoryTypeBits & (1 << memory_type)) { @@ -17,11 +16,11 @@ namespace mem { } } - for (u32 memory_type = 0; memory_type < 32; memory_type++) { + for (u32 memory_type = 0; memory_type < dev_props.memoryTypeCount; memory_type++) { if (requirements.memoryTypeBits & (1 << memory_type)) { const auto& type = dev_props.memoryTypes[memory_type]; if ((type.propertyFlags & req_flags) == req_flags) { - return type.heapIndex; + return memory_type; } } } diff --git a/Renderer/Pipeline.cpp b/Renderer/Pipeline.cpp index 8d89ee6..9863795 100644 --- a/Renderer/Pipeline.cpp +++ b/Renderer/Pipeline.cpp @@ -173,6 +173,8 @@ GraphicsPipeline::GraphicsPipeline(vk::Device dev, const std::vector& sh } pipeline = res.value; + + dev.destroyPipelineLayout(layout); } void GraphicsPipeline::update(uint32_t binding, const UniformBuffer& uni) { diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index a681bd1..33c03d4 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -188,6 +188,9 @@ Renderer::Renderer(Window& win) : win(win) { }; pipeline = std::make_unique(dev, shaders, swapchain->extent, *render_pass, bindings, *vertex_buffer); + + shaders[0].cleanup(); + shaders[1].cleanup(); } void Renderer::draw() { diff --git a/Renderer/Shader.cpp b/Renderer/Shader.cpp index 8520d2e..85fa27b 100644 --- a/Renderer/Shader.cpp +++ b/Renderer/Shader.cpp @@ -5,7 +5,7 @@ using namespace std::string_literals; -Shader::Shader(vk::Device dev, const std::string& fname, vk::ShaderStageFlagBits stage) : fname(fname), stage(stage) { +Shader::Shader(vk::Device dev, const std::string& fname, vk::ShaderStageFlagBits stage) : dev(dev), fname(fname), stage(stage) { std::vector src; try { src = file::slurpb(fname); @@ -25,6 +25,6 @@ Shader::Shader(vk::Device dev, const std::string& fname, vk::ShaderStageFlagBits Log::info("Successfully created shader "s + fname + "\n"); } -void Shader::cleanup(vk::Device dev) { +void Shader::cleanup() { dev.destroyShaderModule(module); } diff --git a/Renderer/Shader.hpp b/Renderer/Shader.hpp index 6455bbc..12b5548 100644 --- a/Renderer/Shader.hpp +++ b/Renderer/Shader.hpp @@ -4,11 +4,13 @@ #include struct Shader { - vk::ShaderModule module; + vk::Device dev; + std::string fname; vk::ShaderStageFlagBits stage; + vk::ShaderModule module; Shader(vk::Device dev, const std::string& fname, vk::ShaderStageFlagBits stage); - void cleanup(vk::Device dev); + void cleanup(); inline operator vk::ShaderModule() const { return module; @@ -26,6 +28,4 @@ struct Shader { }; } - std::string fname; - }; diff --git a/assets/shaders/basic.frag b/assets/shaders/basic.frag index e0893a6..ed984e7 100644 --- a/assets/shaders/basic.frag +++ b/assets/shaders/basic.frag @@ -1,7 +1,7 @@ #version 460 core layout (location = 0) out vec4 FragColor; -layout (set = 1, binding = 0) uniform Matrices { +layout (set = 0, binding = 0) uniform Matrices { mat4 mpv; float time; }; diff --git a/assets/shaders/basic.frag.spv b/assets/shaders/basic.frag.spv index 4b705b4cb2cbae923987cf711592332176f312e5..973bbf0a23f6c50281821ac0e8ee014a1a40fea0 100644 GIT binary patch delta 14 WcmZ3%wt{WL6h=md%~KgCGXel4&IEt} delta 14 WcmZ3%wt{WL6h=nI%~KgCGXel4)C7S5