Mesh loader code cleanup

This commit is contained in:
saschawillems 2017-01-10 21:04:12 +01:00
parent 96ffb2bac3
commit 1634ed065e
3 changed files with 18 additions and 21 deletions

View file

@ -70,11 +70,23 @@ namespace vkMeshLoader
/** @brief Mesh representation storing all data required to generate buffers */ /** @brief Mesh representation storing all data required to generate buffers */
struct MeshBuffer struct MeshBuffer
{ {
VkDevice device = VK_NULL_HANDLE;
std::vector<MeshDescriptor> meshDescriptors; std::vector<MeshDescriptor> meshDescriptors;
MeshBufferInfo vertices; MeshBufferInfo vertices;
MeshBufferInfo indices; MeshBufferInfo indices;
uint32_t indexCount; uint32_t indexCount;
glm::vec3 dim; 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 */ /** @brief Holds parameters for mesh creation */
@ -110,7 +122,6 @@ namespace vkMeshLoader
return vSize; return vSize;
} }
// Note: Always assumes float formats
/** /**
* Generate vertex attribute descriptions for a layout at the given binding point * Generate vertex attribute descriptions for a layout at the given binding point
* *
@ -435,7 +446,6 @@ public:
std::vector<vkMeshLoader::VertexLayout> layout, std::vector<vkMeshLoader::VertexLayout> layout,
vkMeshLoader::MeshCreateInfo *createInfo, vkMeshLoader::MeshCreateInfo *createInfo,
bool useStaging, bool useStaging,
VkCommandBuffer copyCmd,
VkQueue copyQueue) VkQueue copyQueue)
{ {
glm::vec3 scale; glm::vec3 scale;
@ -540,9 +550,10 @@ public:
} }
meshBuffer->indices.size = indexBuffer.size() * sizeof(uint32_t); meshBuffer->indices.size = indexBuffer.size() * sizeof(uint32_t);
meshBuffer->indexCount = static_cast<uint32_t>(indexBuffer.size()); meshBuffer->indexCount = static_cast<uint32_t>(indexBuffer.size());
meshBuffer->device = vulkanDevice->logicalDevice;
// Use staging buffer to move vertex and index buffer to device local memory // 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 // Create staging buffers
struct { struct {
@ -586,8 +597,7 @@ public:
&meshBuffer->indices.mem); &meshBuffer->indices.mem);
// Copy from staging buffers // Copy from staging buffers
VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
VK_CHECK_RESULT(vkBeginCommandBuffer(copyCmd, &cmdBufInfo));
VkBufferCopy copyRegion = {}; VkBufferCopy copyRegion = {};
@ -607,15 +617,7 @@ public:
1, 1,
&copyRegion); &copyRegion);
VK_CHECK_RESULT(vkEndCommandBuffer(copyCmd)); vulkanDevice->flushCommandBuffer(copyCmd, copyQueue);
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &copyCmd;
VK_CHECK_RESULT(vkQueueSubmit(copyQueue, 1, &submitInfo, VK_NULL_HANDLE));
VK_CHECK_RESULT(vkQueueWaitIdle(copyQueue));
vkDestroyBuffer(vulkanDevice->logicalDevice, vertexStaging.buffer, nullptr); vkDestroyBuffer(vulkanDevice->logicalDevice, vertexStaging.buffer, nullptr);
vkFreeMemory(vulkanDevice->logicalDevice, vertexStaging.memory, nullptr); vkFreeMemory(vulkanDevice->logicalDevice, vertexStaging.memory, nullptr);

View file

@ -232,18 +232,13 @@ void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer
mesh->LoadMesh(filename); mesh->LoadMesh(filename);
assert(mesh->m_Entries.size() > 0); assert(mesh->m_Entries.size() > 0);
VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false);
mesh->createBuffers( mesh->createBuffers(
meshBuffer, meshBuffer,
vertexLayout, vertexLayout,
meshCreateInfo, meshCreateInfo,
true, true,
copyCmd,
queue); queue);
vkFreeCommandBuffers(device, cmdPool, 1, &copyCmd);
meshBuffer->dim = mesh->dim.size; meshBuffer->dim = mesh->dim.size;
delete(mesh); delete(mesh);

View file

@ -110,8 +110,8 @@ public:
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
vkDestroyBuffer(device, instanceBuffer.buffer, nullptr); vkDestroyBuffer(device, instanceBuffer.buffer, nullptr);
vkFreeMemory(device, instanceBuffer.memory, nullptr); vkFreeMemory(device, instanceBuffer.memory, nullptr);
vkMeshLoader::freeMeshBufferResources(device, &meshes.rock); meshes.rock.destroy();
vkMeshLoader::freeMeshBufferResources(device, &meshes.planet); meshes.planet.destroy();
textures.rocks.destroy(); textures.rocks.destroy();
textures.planet.destroy(); textures.planet.destroy();
uniformBuffers.scene.destroy(); uniformBuffers.scene.destroy();