diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-28 15:54:53 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-28 15:54:53 -0400 |
| commit | 30c94ea126b7d079731be9e611db4c03b182826f (patch) | |
| tree | 98bc75d3cc4109a97536cb8ddc5c9c0874fb9920 /src/entities.cpp | |
| parent | 55326a83ab71309e98137af81dbd5755bf718a6c (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.cpp | 272 |
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); |
