diff --git a/base/vulkanMeshLoader.hpp b/base/vulkanMeshLoader.hpp index baca16be..e937be04 100644 --- a/base/vulkanMeshLoader.hpp +++ b/base/vulkanMeshLoader.hpp @@ -70,11 +70,23 @@ namespace vkMeshLoader /** @brief Mesh representation storing all data required to generate buffers */ struct MeshBuffer { + VkDevice device = VK_NULL_HANDLE; std::vector meshDescriptors; MeshBufferInfo vertices; MeshBufferInfo indices; uint32_t indexCount; glm::vec3 dim; + /** @brief Release all Vulkan resources held by this texture */ + void destroy() + { + vkDestroyBuffer(device, vertices.buf, nullptr); + vkFreeMemory(device, vertices.mem, nullptr); + if (indices.buf != VK_NULL_HANDLE) + { + vkDestroyBuffer(device, indices.buf, nullptr); + vkFreeMemory(device, indices.mem, nullptr); + } + } }; /** @brief Holds parameters for mesh creation */ @@ -110,7 +122,6 @@ namespace vkMeshLoader return vSize; } - // Note: Always assumes float formats /** * Generate vertex attribute descriptions for a layout at the given binding point * @@ -435,7 +446,6 @@ public: std::vector layout, vkMeshLoader::MeshCreateInfo *createInfo, bool useStaging, - VkCommandBuffer copyCmd, VkQueue copyQueue) { glm::vec3 scale; @@ -540,9 +550,10 @@ public: } meshBuffer->indices.size = indexBuffer.size() * sizeof(uint32_t); meshBuffer->indexCount = static_cast(indexBuffer.size()); + meshBuffer->device = vulkanDevice->logicalDevice; // Use staging buffer to move vertex and index buffer to device local memory - if (useStaging && copyQueue != VK_NULL_HANDLE && copyCmd != VK_NULL_HANDLE) + if (useStaging && copyQueue != VK_NULL_HANDLE) { // Create staging buffers struct { @@ -586,8 +597,7 @@ public: &meshBuffer->indices.mem); // Copy from staging buffers - VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); - VK_CHECK_RESULT(vkBeginCommandBuffer(copyCmd, &cmdBufInfo)); + VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); VkBufferCopy copyRegion = {}; @@ -607,15 +617,7 @@ public: 1, ©Region); - VK_CHECK_RESULT(vkEndCommandBuffer(copyCmd)); - - VkSubmitInfo submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = ©Cmd; - - VK_CHECK_RESULT(vkQueueSubmit(copyQueue, 1, &submitInfo, VK_NULL_HANDLE)); - VK_CHECK_RESULT(vkQueueWaitIdle(copyQueue)); + vulkanDevice->flushCommandBuffer(copyCmd, copyQueue); vkDestroyBuffer(vulkanDevice->logicalDevice, vertexStaging.buffer, nullptr); vkFreeMemory(vulkanDevice->logicalDevice, vertexStaging.memory, nullptr); diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index dbe3c778..b5425f52 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -232,18 +232,13 @@ void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer mesh->LoadMesh(filename); assert(mesh->m_Entries.size() > 0); - VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false); - mesh->createBuffers( meshBuffer, vertexLayout, meshCreateInfo, true, - copyCmd, queue); - vkFreeCommandBuffers(device, cmdPool, 1, ©Cmd); - meshBuffer->dim = mesh->dim.size; delete(mesh); diff --git a/instancing/instancing.cpp b/instancing/instancing.cpp index e24a6178..05491903 100644 --- a/instancing/instancing.cpp +++ b/instancing/instancing.cpp @@ -110,8 +110,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkDestroyBuffer(device, instanceBuffer.buffer, nullptr); vkFreeMemory(device, instanceBuffer.memory, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.rock); - vkMeshLoader::freeMeshBufferResources(device, &meshes.planet); + meshes.rock.destroy(); + meshes.planet.destroy(); textures.rocks.destroy(); textures.planet.destroy(); uniformBuffers.scene.destroy();