diff --git a/base/vulkanMeshLoader.hpp b/base/vulkanMeshLoader.hpp index bdd86a07..540c3daf 100644 --- a/base/vulkanMeshLoader.hpp +++ b/base/vulkanMeshLoader.hpp @@ -32,6 +32,8 @@ #include #include +#include "vulkandevice.hpp" + #if defined(__ANDROID__) #include #endif @@ -201,8 +203,10 @@ namespace vkMeshLoader } // Simple mesh class for getting all the necessary stuff from models loaded via ASSIMP -class VulkanMeshLoader { +class VulkanMeshLoader +{ private: + vk::VulkanDevice *vulkanDevice; struct Vertex { @@ -234,24 +238,6 @@ private: std::vector Indices; }; - VkBool32 getMemoryType(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, uint32_t typeBits, VkMemoryPropertyFlags properties) - { - for (uint32_t i = 0; i < 32; i++) - { - if ((typeBits & 1) == 1) - { - if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) - { - return i; - } - } - typeBits >>= 1; - } - - // todo : throw error - return 0; - } - public: #if defined(__ANDROID__) AAssetManager* assetManager = nullptr; @@ -289,6 +275,12 @@ public: Assimp::Importer Importer; const aiScene* pScene; + VulkanMeshLoader(vk::VulkanDevice *vulkanDevice) + { + assert(vulkanDevice != nullptr); + this->vulkanDevice = vulkanDevice; + } + ~VulkanMeshLoader() { m_Entries.clear(); @@ -416,7 +408,9 @@ public: } } - // Clean up vulkan resources used by a mesh + /** + * Free up all Vulkan resources used by a mesh + */ static void freeVulkanResources(VkDevice device, VulkanMeshLoader *mesh) { vkDestroyBuffer(device, mesh->vertexBuffer.buf, nullptr); @@ -425,34 +419,20 @@ public: vkFreeMemory(device, mesh->indexBuffer.mem, nullptr); } - VkResult createBuffer( - VkDevice device, - VkPhysicalDeviceMemoryProperties deviceMemoryProperties, - VkBufferUsageFlags usageFlags, - VkMemoryPropertyFlags memoryPropertyFlags, - VkDeviceSize size, - VkBuffer *buffer, - VkDeviceMemory *memory) - { - VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo(); - VkMemoryRequirements memReqs; - - VkBufferCreateInfo bufferInfo = vkTools::initializers::bufferCreateInfo(usageFlags, size); - VK_CHECK_RESULT(vkCreateBuffer(device, &bufferInfo, nullptr, buffer)); - vkGetBufferMemoryRequirements(device, *buffer, &memReqs); - memAllocInfo.allocationSize = memReqs.size; - memAllocInfo.memoryTypeIndex = getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits, memoryPropertyFlags); - VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, memory)); - VK_CHECK_RESULT(vkBindBufferMemory(device, *buffer, *memory, 0)); - - return VK_SUCCESS; - } - // Create vertex and index buffer with given layout // Note : Only does staging if a valid command buffer and transfer queue are passed + + /** + * Create Vulkan buffers for the index and vertex buffer using a vertex layout + * + * @param meshBuffer Pointer to the mesh buffer containing buffer handles and memory + * @param layout Vertex layout for the vertex buffer + * @param createInfo Structure containing information for mesh creation time (center, scaling, etc.) + * @param useStaging If true, buffers are staged to device local memory + * @param copyCmd (Required for staging) Command buffer to put the copy commands into + * @param copyQueue (Required for staging) Queue to put copys into + */ void createBuffers( - VkDevice device, - VkPhysicalDeviceMemoryProperties deviceMemoryProperties, vkMeshLoader::MeshBuffer *meshBuffer, std::vector layout, vkMeshLoader::MeshCreateInfo *createInfo, @@ -571,38 +551,26 @@ public: } vertexStaging, indexStaging; // Vertex buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, meshBuffer->vertices.size, &vertexStaging.buffer, - &vertexStaging.memory); - - VK_CHECK_RESULT(vkMapMemory(device, vertexStaging.memory, 0, VK_WHOLE_SIZE, 0, &data)); - memcpy(data, vertexBuffer.data(), meshBuffer->vertices.size); - vkUnmapMemory(device, vertexStaging.memory); + &vertexStaging.memory, + vertexBuffer.data()); // Index buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, meshBuffer->indices.size, &indexStaging.buffer, - &indexStaging.memory); - - VK_CHECK_RESULT(vkMapMemory(device, indexStaging.memory, 0, VK_WHOLE_SIZE, 0, &data)); - memcpy(data, indexBuffer.data(), meshBuffer->indices.size); - vkUnmapMemory(device, indexStaging.memory); + &indexStaging.memory, + indexBuffer.data()); // Create device local target buffers // Vertex buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, meshBuffer->vertices.size, @@ -610,9 +578,7 @@ public: &meshBuffer->vertices.mem); // Index buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, meshBuffer->indices.size, @@ -651,40 +617,30 @@ public: VK_CHECK_RESULT(vkQueueSubmit(copyQueue, 1, &submitInfo, VK_NULL_HANDLE)); VK_CHECK_RESULT(vkQueueWaitIdle(copyQueue)); - vkDestroyBuffer(device, vertexStaging.buffer, nullptr); - vkFreeMemory(device, vertexStaging.memory, nullptr); - vkDestroyBuffer(device, indexStaging.buffer, nullptr); - vkFreeMemory(device, indexStaging.memory, nullptr); + vkDestroyBuffer(vulkanDevice->device, vertexStaging.buffer, nullptr); + vkFreeMemory(vulkanDevice->device, vertexStaging.memory, nullptr); + vkDestroyBuffer(vulkanDevice->device, indexStaging.buffer, nullptr); + vkFreeMemory(vulkanDevice->device, indexStaging.memory, nullptr); } else { // Generate vertex buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, meshBuffer->vertices.size, &meshBuffer->vertices.buf, - &meshBuffer->vertices.mem); - - VK_CHECK_RESULT(vkMapMemory(device, meshBuffer->vertices.mem, 0, meshBuffer->vertices.size, 0, &data)); - memcpy(data, vertexBuffer.data(), meshBuffer->vertices.size); - vkUnmapMemory(device, meshBuffer->vertices.mem); + &meshBuffer->vertices.mem, + vertexBuffer.data()); // Generate index buffer - createBuffer( - device, - deviceMemoryProperties, + vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, meshBuffer->indices.size, &meshBuffer->indices.buf, - &meshBuffer->indices.mem); - - VK_CHECK_RESULT(vkMapMemory(device, meshBuffer->indices.mem, 0, meshBuffer->indices.size, 0, &data)); - memcpy(data, indexBuffer.data(), meshBuffer->indices.size); - vkUnmapMemory(device, meshBuffer->indices.mem); + &meshBuffer->indices.mem, + indexBuffer.data()); } } }; \ No newline at end of file diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 304ef0ab..ade5d4a9 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -346,7 +346,7 @@ void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer * meshBuffer, std::vector vertexLayout, vkMeshLoader::MeshCreateInfo *meshCreateInfo) { - VulkanMeshLoader *mesh = new VulkanMeshLoader(); + VulkanMeshLoader *mesh = new VulkanMeshLoader(&vulkanDevice); #if defined(__ANDROID__) mesh->assetManager = androidApp->activity->assetManager; @@ -358,8 +358,6 @@ void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false); mesh->createBuffers( - device, - deviceMemoryProperties, meshBuffer, vertexLayout, meshCreateInfo, diff --git a/debugmarker/debugmarker.cpp b/debugmarker/debugmarker.cpp index c1143485..b2b9a92e 100644 --- a/debugmarker/debugmarker.cpp +++ b/debugmarker/debugmarker.cpp @@ -585,7 +585,7 @@ public: // Load a model file as separate meshes into a scene void loadModel(std::string filename, Scene *scene) { - VulkanMeshLoader *meshLoader = new VulkanMeshLoader(); + VulkanMeshLoader *meshLoader = new VulkanMeshLoader(&vulkanDevice); #if defined(__ANDROID__) meshLoader->assetManager = androidApp->activity->assetManager; #endif diff --git a/mesh/mesh.cpp b/mesh/mesh.cpp index 600da34e..9d9e90c7 100644 --- a/mesh/mesh.cpp +++ b/mesh/mesh.cpp @@ -175,7 +175,7 @@ public: // The other example will use the VulkanMesh loader which has some additional functionality for loading meshes void loadMesh() { - VulkanMeshLoader *meshLoader = new VulkanMeshLoader(); + VulkanMeshLoader *meshLoader = new VulkanMeshLoader(&vulkanDevice); #if defined(__ANDROID__) meshLoader->assetManager = androidApp->activity->assetManager; #endif diff --git a/skeletalanimation/skeletalanimation.cpp b/skeletalanimation/skeletalanimation.cpp index 67dcaf83..7714b48b 100644 --- a/skeletalanimation/skeletalanimation.cpp +++ b/skeletalanimation/skeletalanimation.cpp @@ -482,7 +482,7 @@ public: void loadMesh() { skinnedMesh = new SkinnedMesh(); - skinnedMesh->meshLoader = new VulkanMeshLoader(); + skinnedMesh->meshLoader = new VulkanMeshLoader(&vulkanDevice); #if defined(__ANDROID__) skinnedMesh->meshLoader->assetManager = androidApp->activity->assetManager; #endif diff --git a/vulkanscene/vulkanscene.cpp b/vulkanscene/vulkanscene.cpp index 8a8d5b80..d778994b 100644 --- a/vulkanscene/vulkanscene.cpp +++ b/vulkanscene/vulkanscene.cpp @@ -182,10 +182,10 @@ public: }; // Load meshes for demos scene - demoMeshes.logos = new VulkanMeshLoader(); - demoMeshes.background = new VulkanMeshLoader(); - demoMeshes.models = new VulkanMeshLoader(); - demoMeshes.skybox = new VulkanMeshLoader(); + demoMeshes.logos = new VulkanMeshLoader(&vulkanDevice); + demoMeshes.background = new VulkanMeshLoader(&vulkanDevice); + demoMeshes.models = new VulkanMeshLoader(&vulkanDevice); + demoMeshes.skybox = new VulkanMeshLoader(&vulkanDevice); #if defined(__ANDROID__) demoMeshes.logos->assetManager = androidApp->activity->assetManager;