summaryrefslogtreecommitdiff
path: root/src/entities.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-28 15:54:53 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-28 15:54:53 -0400
commit30c94ea126b7d079731be9e611db4c03b182826f (patch)
tree98bc75d3cc4109a97536cb8ddc5c9c0874fb9920 /src/entities.cpp
parent55326a83ab71309e98137af81dbd5755bf718a6c (diff)
refactor entity gltf loading to be more explicit
The _Texture pipeline expects there to be 4 buffers bound, so we need to make sure the gltf file has *all* of these. Making this more dynamic can be a future refactor when we're ready for more pipeline creation and shaders to be more dynamic
Diffstat (limited to 'src/entities.cpp')
-rw-r--r--src/entities.cpp272
1 files changed, 148 insertions, 124 deletions
diff --git a/src/entities.cpp b/src/entities.cpp
index 5afd985..4b43e81 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -669,6 +669,9 @@ void EntityType_Load(EntityType &et) {
assert(gltfData->buffer_views[i].type != cgltf_buffer_view_type_invalid);
}
assert(et.Importer_GLTF.AccessorIndexVertex > -1);
+ assert(et.Importer_GLTF.AccessorIndexNormal > -1);
+ assert(et.Importer_GLTF.AccessorIndexUV > -1);
+ assert(et.Importer_GLTF.AccessorIndexIndex > -1);
VkBufferCreateInfo bufferCI;
bufferCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -678,56 +681,66 @@ void EntityType_Load(EntityType &et) {
bufferCI.queueFamilyIndexCount = 1;
bufferCI.pQueueFamilyIndices = &graphicsFamilyIndex;
- VkMemoryRequirements vkMemoryRequirements[4];
+ const long expectedBufferCount = 4;
+ VkMemoryRequirements vkMemoryRequirements[expectedBufferCount];
long index = 0;
- if (et.Importer_GLTF.AccessorIndexVertex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
- grBinds.vertexFirstBinding = index;
- grBinds.vertexBindingCount = 1;
- bufferCI.size = acc.buffer_view->size;
- bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
- vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.vertexBuffer);
-
- vkGetBufferMemoryRequirements(vkDevice, grBinds.vertexBuffer, &vkMemoryRequirements[index++]);
- }
- if (et.Importer_GLTF.AccessorIndexNormal > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
- grBinds.normalsFirstBinding = index;
- grBinds.normalsBindingCount = 1;
- bufferCI.size = acc.buffer_view->size;
- vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.normalsBuffer);
-
- vkGetBufferMemoryRequirements(vkDevice, grBinds.normalsBuffer, &vkMemoryRequirements[index++]);
- }
- if (et.Importer_GLTF.AccessorIndexUV > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
- grBinds.uvFirstBinding = index;
- grBinds.uvBindingCount = 1;
- bufferCI.size = acc.buffer_view->size;
- vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.uvBuffer);
-
- vkGetBufferMemoryRequirements(vkDevice, grBinds.uvBuffer, &vkMemoryRequirements[index++]);
- }
+
+ // vertex
+ assert(et.Importer_GLTF.AccessorIndexVertex > -1);
+ const auto &accVert = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
+ grBinds.vertexFirstBinding = index;
+ grBinds.vertexBindingCount = 1;
+ bufferCI.size = accVert.buffer_view->size;
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.vertexBuffer);
+ vkGetBufferMemoryRequirements(vkDevice, grBinds.vertexBuffer, &vkMemoryRequirements[index]);
+ index += 1;
+
+ // normals
+ assert(et.Importer_GLTF.AccessorIndexNormal > -1);
+ const auto &accNorm = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
+ grBinds.normalsFirstBinding = index;
+ grBinds.normalsBindingCount = 1;
+ bufferCI.size = accNorm.buffer_view->size;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.normalsBuffer);
+ vkGetBufferMemoryRequirements(vkDevice, grBinds.normalsBuffer, &vkMemoryRequirements[index]);
+ index += 1;
+
+ // uv
+ assert(et.Importer_GLTF.AccessorIndexUV > -1);
+ const auto &accUV = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
+ grBinds.uvFirstBinding = index;
+ grBinds.uvBindingCount = 1;
+ bufferCI.size = accUV.buffer_view->size;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.uvBuffer);
+ vkGetBufferMemoryRequirements(vkDevice, grBinds.uvBuffer, &vkMemoryRequirements[index]);
+ index += 1;
+
// 2023-09-27 - JCB
// I don't know where else to put this
grBinds.instanceFirstBinding = index;
- if (et.Importer_GLTF.AccessorIndexIndex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
- // grBinds.indexFirstBinding = index;
- grBinds.indexBindingCount = 1;
- grBinds.indexCount = acc.count;
- bufferCI.size = acc.buffer_view->size;
- bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
- vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.indexBuffer);
-
- vkGetBufferMemoryRequirements(vkDevice, grBinds.indexBuffer, &vkMemoryRequirements[index++]);
- }
+
+ // index
+ assert(et.Importer_GLTF.AccessorIndexIndex > -1);
+ const auto &accIndex = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
+ grBinds.indexBindingCount = 1;
+ grBinds.indexCount = accIndex.count;
+ bufferCI.size = accIndex.buffer_view->size;
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.indexBuffer);
+ vkGetBufferMemoryRequirements(vkDevice, grBinds.indexBuffer, &vkMemoryRequirements[index]);
+ // index += 1;
+
+ vkDestroyBuffer(vkDevice, grBinds.indexBuffer, vkAllocator);
+ vkDestroyBuffer(vkDevice, grBinds.uvBuffer, vkAllocator);
+ vkDestroyBuffer(vkDevice, grBinds.normalsBuffer, vkAllocator);
+ vkDestroyBuffer(vkDevice, grBinds.vertexBuffer, vkAllocator);
VkMemoryRequirements combinedMemReqs{};
combinedMemReqs.alignment = vkMemoryRequirements[0].alignment;
combinedMemReqs.memoryTypeBits = 0;
combinedMemReqs.size = 0;
- for (long i = 1; i < index; ++i) {
+ for (long i = 1; i < expectedBufferCount; ++i) {
if (combinedMemReqs.alignment == vkMemoryRequirements[i].alignment) {
continue;
}
@@ -744,14 +757,14 @@ void EntityType_Load(EntityType &et) {
continue;
}
int combined = larger * smaller;
- while ((combined / 2) % larger == 0) {
+ while ((combined / 2) % 2 == 0 && (combined / 2) % larger == 0) {
combined /= 2;
}
+ combinedMemReqs.alignment = combined;
}
- for (long i = 0; i < index; ++i) {
+ for (long i = 0; i < expectedBufferCount; ++i) {
uint32_t alignmentPadding = vkMemoryRequirements[i].size % combinedMemReqs.alignment;
- alignmentPadding = combinedMemReqs.alignment - alignmentPadding;
- combinedMemReqs.size += vkMemoryRequirements[i].size + alignmentPadding;
+ combinedMemReqs.size += vkMemoryRequirements[i].size + (alignmentPadding == 0 ? 0 : combinedMemReqs.alignment - alignmentPadding);
combinedMemReqs.memoryTypeBits |= vkMemoryRequirements[i].memoryTypeBits;
}
@@ -765,28 +778,55 @@ void EntityType_Load(EntityType &et) {
// bind buffers
uint32_t runningOffset = 0;
- if (et.Importer_GLTF.AccessorIndexVertex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
- vkBindBufferMemory(vkDevice, grBinds.vertexBuffer, et.deviceMemoryVert, runningOffset);
- runningOffset += acc.buffer_view->size;
- runningOffset += combinedMemReqs.alignment - (runningOffset % combinedMemReqs.alignment);
- }
- if (et.Importer_GLTF.AccessorIndexNormal > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
- vkBindBufferMemory(vkDevice, grBinds.normalsBuffer, et.deviceMemoryVert, runningOffset);
- runningOffset += acc.buffer_view->size;
- runningOffset += combinedMemReqs.alignment - (runningOffset % combinedMemReqs.alignment);
- }
- if (et.Importer_GLTF.AccessorIndexUV > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
- vkBindBufferMemory(vkDevice, grBinds.uvBuffer , et.deviceMemoryVert, runningOffset);
- runningOffset += acc.buffer_view->size;
- runningOffset += combinedMemReqs.alignment - (runningOffset % combinedMemReqs.alignment);
- }
- if (et.Importer_GLTF.AccessorIndexIndex > -1) {
- // const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
- vkBindBufferMemory(vkDevice, grBinds.indexBuffer, et.deviceMemoryVert, runningOffset);
- }
+ uint32_t alignmentPadding;
+
+ // vertex
+ uint32_t offsetVert = runningOffset;
+ uint32_t sizeVert = accVert.buffer_view->size;
+ alignmentPadding = sizeVert % combinedMemReqs.alignment;
+ alignmentPadding = alignmentPadding == 0 ? 0 : combinedMemReqs.alignment - alignmentPadding;
+ sizeVert += alignmentPadding;
+ bufferCI.size = sizeVert;
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.vertexBuffer);
+ vkBindBufferMemory(vkDevice, grBinds.vertexBuffer, et.deviceMemoryVert, offsetVert);
+ runningOffset += sizeVert;
+
+ // norm
+ uint32_t offsetNorm = runningOffset;
+ uint32_t sizeNorm = accNorm.buffer_view->size;
+ alignmentPadding = sizeNorm % combinedMemReqs.alignment;
+ alignmentPadding = alignmentPadding == 0 ? 0 : combinedMemReqs.alignment - alignmentPadding;
+ sizeNorm += alignmentPadding;
+ bufferCI.size = sizeNorm;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.normalsBuffer);
+ vkBindBufferMemory(vkDevice, grBinds.normalsBuffer, et.deviceMemoryVert, offsetNorm);
+ runningOffset += sizeNorm;
+
+ // uv
+ uint32_t offsetUV = runningOffset;
+ uint32_t sizeUV = accUV.buffer_view->size;
+ alignmentPadding = sizeUV % combinedMemReqs.alignment;
+ alignmentPadding = alignmentPadding == 0 ? 0 : combinedMemReqs.alignment - alignmentPadding;
+ sizeUV += alignmentPadding;
+ bufferCI.size = sizeUV;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.uvBuffer);
+ vkBindBufferMemory(vkDevice, grBinds.uvBuffer , et.deviceMemoryVert, offsetUV);
+ runningOffset += sizeUV;
+
+ // index
+ uint32_t offsetIndex = runningOffset;
+ uint32_t sizeIndex = accIndex.buffer_view->size;
+ alignmentPadding = sizeIndex % combinedMemReqs.alignment;
+ alignmentPadding = alignmentPadding == 0 ? 0 : combinedMemReqs.alignment - alignmentPadding;
+ sizeIndex += alignmentPadding;
+ bufferCI.size = sizeIndex;
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.indexBuffer);
+ vkBindBufferMemory(vkDevice, grBinds.indexBuffer, et.deviceMemoryVert, offsetIndex);
+ runningOffset += sizeIndex;
+
+ assert(runningOffset == combinedMemReqs.size);
// create transfer items && transfer
{
@@ -794,35 +834,27 @@ void EntityType_Load(EntityType &et) {
VkBuffer transferBuffer;
void *data;
BeginTransferBuffer(combinedMemReqs.size, transferBuffer, transferDeviceMemory, data);
+ memset(data, '\0', combinedMemReqs.size);
+
+ char *dstPtr = nullptr;
+ char *srcPtr = nullptr;
+
+ dstPtr = static_cast<char *>(data) + offsetVert;
+ srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accVert.buffer_view->offset;
+ memcpy(dstPtr, srcPtr, accVert.buffer_view->size);
+
+ dstPtr = static_cast<char *>(data) + offsetNorm;
+ srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accNorm.buffer_view->offset;
+ memcpy(dstPtr, srcPtr, accNorm.buffer_view->size);
+
+ dstPtr = static_cast<char *>(data) + offsetUV;
+ srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accUV.buffer_view->offset;
+ memcpy(dstPtr, srcPtr, accUV.buffer_view->size);
+
+ dstPtr = static_cast<char *>(data) + offsetIndex;
+ srcPtr = static_cast<char *>(gltfData->buffers[0].data) + accIndex.buffer_view->offset;
+ memcpy(dstPtr, srcPtr, accIndex.buffer_view->size);
- uint32_t runningOffset2 = 0;
- if (et.Importer_GLTF.AccessorIndexVertex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
- char *dstPtr = static_cast<char *>(data) + runningOffset2;
- char *srcPtr = static_cast<char *>(gltfData->buffers[0].data) + acc.buffer_view->offset;
- memcpy(dstPtr, srcPtr, acc.buffer_view->size);
- runningOffset2 += acc.buffer_view->size;
- }
- if (et.Importer_GLTF.AccessorIndexNormal > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
- char *dstPtr = static_cast<char *>(data) + runningOffset2;
- char *srcPtr = static_cast<char *>(gltfData->buffers[0].data) + acc.buffer_view->offset;
- memcpy(dstPtr, srcPtr, acc.buffer_view->size);
- runningOffset2 += acc.buffer_view->size;
- }
- if (et.Importer_GLTF.AccessorIndexUV > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
- char *dstPtr = static_cast<char *>(data) + runningOffset2;
- char *srcPtr = static_cast<char *>(gltfData->buffers[0].data) + acc.buffer_view->offset;
- memcpy(dstPtr, srcPtr, acc.buffer_view->size);
- runningOffset2 += acc.buffer_view->size;
- }
- if (et.Importer_GLTF.AccessorIndexIndex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
- char *dstPtr = static_cast<char *>(data) + runningOffset2;
- char *srcPtr = static_cast<char *>(gltfData->buffers[0].data) + acc.buffer_view->offset;
- memcpy(dstPtr, srcPtr, acc.buffer_view->size);
- }
VkCommandBufferBeginInfo vkCommandBufferBeginInfo;
vkCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
@@ -831,38 +863,30 @@ void EntityType_Load(EntityType &et) {
vkCommandBufferBeginInfo.flags = 0;
vkCommandBufferBeginInfo.pInheritanceInfo = nullptr;
vkBeginCommandBuffer(transferCommandBuffer, &vkCommandBufferBeginInfo);
- VkBufferCopy bufferCopys[4];
- for (long i = 0; i < 4; ++i) {
+ VkBufferCopy bufferCopys[expectedBufferCount];
+ for (long i = 0; i < expectedBufferCount; ++i) {
bufferCopys[i].dstOffset = 0;
}
index = 0;
- if (et.Importer_GLTF.AccessorIndexVertex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex];
- bufferCopys[index].srcOffset = acc.buffer_view->offset;
- bufferCopys[index].size = acc.buffer_view->size;
- vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.vertexBuffer, 1, &bufferCopys[index]);
- index += 1;
- }
- if (et.Importer_GLTF.AccessorIndexNormal > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal];
- bufferCopys[index].srcOffset = acc.buffer_view->offset;
- bufferCopys[index].size = acc.buffer_view->size;
- vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.normalsBuffer, 1, &bufferCopys[index]);
- index += 1;
- }
- if (et.Importer_GLTF.AccessorIndexUV > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV];
- bufferCopys[index].srcOffset = acc.buffer_view->offset;
- bufferCopys[index].size = acc.buffer_view->size;
- vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.uvBuffer, 1, &bufferCopys[index]);
- index += 1;
- }
- if (et.Importer_GLTF.AccessorIndexIndex > -1) {
- const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex];
- bufferCopys[index].srcOffset = acc.buffer_view->offset;
- bufferCopys[index].size = acc.buffer_view->size;
- vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.indexBuffer, 1, &bufferCopys[index]);
- }
+ bufferCopys[index].srcOffset = offsetVert;
+ bufferCopys[index].size = sizeVert;
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.vertexBuffer, 1, &bufferCopys[index]);
+ index+=1;
+
+ bufferCopys[index].srcOffset = offsetNorm;
+ bufferCopys[index].size = sizeNorm;
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.normalsBuffer, 1, &bufferCopys[index]);
+ index+=1;
+
+ bufferCopys[index].srcOffset = offsetUV;
+ bufferCopys[index].size = sizeUV;
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.uvBuffer, 1, &bufferCopys[index]);
+ index+=1;
+
+ bufferCopys[index].srcOffset = offsetIndex;
+ bufferCopys[index].size = sizeIndex;
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.indexBuffer, 1, &bufferCopys[index]);
+ // index+=1;
vkEndCommandBuffer(transferCommandBuffer);