Store vertex and index buffer sizes and set transfer source bits for mesh buffers

This commit is contained in:
saschawillems 2016-03-31 22:37:49 +02:00
parent 4c883a94ac
commit 96870602d5

View file

@ -51,6 +51,7 @@ namespace vkMeshLoader
{ {
VkBuffer buf = VK_NULL_HANDLE; VkBuffer buf = VK_NULL_HANDLE;
VkDeviceMemory mem = VK_NULL_HANDLE; VkDeviceMemory mem = VK_NULL_HANDLE;
size_t size = 0;
}; };
struct MeshBuffer struct MeshBuffer
@ -446,7 +447,7 @@ public:
} }
} }
} }
size_t vertexBufferSize = vertexBuffer.size() * sizeof(float); meshBuffer->vertices.size = vertexBuffer.size() * sizeof(float);
std::vector<uint32_t> indexBuffer; std::vector<uint32_t> indexBuffer;
for (uint32_t m = 0; m < m_Entries.size(); m++) for (uint32_t m = 0; m < m_Entries.size(); m++)
@ -457,7 +458,7 @@ public:
indexBuffer.push_back(m_Entries[m].Indices[i] + indexBase); indexBuffer.push_back(m_Entries[m].Indices[i] + indexBase);
} }
} }
size_t indexBufferSize = indexBuffer.size() * sizeof(uint32_t); meshBuffer->indices.size = indexBuffer.size() * sizeof(uint32_t);
VkMemoryAllocateInfo memAlloc = vkTools::initializers::memoryAllocateInfo(); VkMemoryAllocateInfo memAlloc = vkTools::initializers::memoryAllocateInfo();
VkMemoryRequirements memReqs; VkMemoryRequirements memReqs;
@ -466,7 +467,7 @@ public:
void *data; void *data;
// Generate vertex buffer // Generate vertex buffer
VkBufferCreateInfo vBufferInfo = vkTools::initializers::bufferCreateInfo(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, vertexBufferSize); VkBufferCreateInfo vBufferInfo = vkTools::initializers::bufferCreateInfo(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, meshBuffer->vertices.size);
err = vkCreateBuffer(device, &vBufferInfo, nullptr, &meshBuffer->vertices.buf); err = vkCreateBuffer(device, &vBufferInfo, nullptr, &meshBuffer->vertices.buf);
assert(!err); assert(!err);
vkGetBufferMemoryRequirements(device, meshBuffer->vertices.buf, &memReqs); vkGetBufferMemoryRequirements(device, meshBuffer->vertices.buf, &memReqs);
@ -474,15 +475,15 @@ public:
getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex); getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
err = vkAllocateMemory(device, &memAlloc, nullptr, &meshBuffer->vertices.mem); err = vkAllocateMemory(device, &memAlloc, nullptr, &meshBuffer->vertices.mem);
assert(!err); assert(!err);
err = vkMapMemory(device, meshBuffer->vertices.mem, 0, vertexBufferSize, 0, &data); err = vkMapMemory(device, meshBuffer->vertices.mem, 0, meshBuffer->vertices.size, 0, &data);
assert(!err); assert(!err);
memcpy(data, vertexBuffer.data(), vertexBufferSize); memcpy(data, vertexBuffer.data(), meshBuffer->vertices.size);
vkUnmapMemory(device, meshBuffer->vertices.mem); vkUnmapMemory(device, meshBuffer->vertices.mem);
err = vkBindBufferMemory(device, meshBuffer->vertices.buf, meshBuffer->vertices.mem, 0); err = vkBindBufferMemory(device, meshBuffer->vertices.buf, meshBuffer->vertices.mem, 0);
assert(!err); assert(!err);
// Generate index buffer // Generate index buffer
VkBufferCreateInfo iBufferInfo = vkTools::initializers::bufferCreateInfo(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, indexBufferSize); VkBufferCreateInfo iBufferInfo = vkTools::initializers::bufferCreateInfo(VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, meshBuffer->indices.size);
err = vkCreateBuffer(device, &iBufferInfo, nullptr, &meshBuffer->indices.buf); err = vkCreateBuffer(device, &iBufferInfo, nullptr, &meshBuffer->indices.buf);
assert(!err); assert(!err);
vkGetBufferMemoryRequirements(device, meshBuffer->indices.buf, &memReqs); vkGetBufferMemoryRequirements(device, meshBuffer->indices.buf, &memReqs);
@ -490,9 +491,9 @@ public:
getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex); getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
err = vkAllocateMemory(device, &memAlloc, nullptr, &meshBuffer->indices.mem); err = vkAllocateMemory(device, &memAlloc, nullptr, &meshBuffer->indices.mem);
assert(!err); assert(!err);
err = vkMapMemory(device, meshBuffer->indices.mem, 0, indexBufferSize, 0, &data); err = vkMapMemory(device, meshBuffer->indices.mem, 0, meshBuffer->indices.size, 0, &data);
assert(!err); assert(!err);
memcpy(data, indexBuffer.data(), indexBufferSize); memcpy(data, indexBuffer.data(), meshBuffer->indices.size);
vkUnmapMemory(device, meshBuffer->indices.mem); vkUnmapMemory(device, meshBuffer->indices.mem);
err = vkBindBufferMemory(device, meshBuffer->indices.buf, meshBuffer->indices.mem, 0); err = vkBindBufferMemory(device, meshBuffer->indices.buf, meshBuffer->indices.mem, 0);
assert(!err); assert(!err);