diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-15 07:55:03 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-15 07:55:03 -0400 |
| commit | de0814665281ab14db1ad4ee1ad1832b7143c131 (patch) | |
| tree | 02945537f54a2d209411cad7a60e06f6df0be729 /src/entities.cpp | |
| parent | 2eb22f8debec811cdea32ed7b8cf3ec98c752f7c (diff) | |
entity buffers calculate alignment and pad to align
Diffstat (limited to 'src/entities.cpp')
| -rw-r--r-- | src/entities.cpp | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/src/entities.cpp b/src/entities.cpp index b439da1..200c28e 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -217,6 +217,9 @@ void EntityType_Load(EntityType &et) { imageAllocInfo.pNext = nullptr; imageAllocInfo.allocationSize = imageMemReqs.size; imageAllocInfo.memoryTypeIndex = FindMemoryTypeIndex(imageMemReqs.memoryTypeBits, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); + if (imageAllocInfo.memoryTypeIndex == 0) { + imageAllocInfo.memoryTypeIndex = FindMemoryTypeIndex(imageMemReqs.memoryTypeBits, 0); + } vkAllocateMemory(vkDevice, &imageAllocInfo, vkAllocator, &et.deviceMemoryTexture); vkBindImageMemory(vkDevice, et.textureImage, et.deviceMemoryTexture, 0); @@ -392,8 +395,8 @@ void EntityType_Load(EntityType &et) { bufferCI.queueFamilyIndexCount = 1; bufferCI.pQueueFamilyIndices = &graphicsFamilyIndex; - VkMemoryRequirements vkMemoryRequirements; - + VkMemoryRequirements vkMemoryRequirements[4]; + long index = 0; if (et.Importer_GLTF.AccessorIndexVertex > -1) { const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex]; grBinds.vertexCount = acc.count; @@ -401,7 +404,7 @@ void EntityType_Load(EntityType &et) { 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); + vkGetBufferMemoryRequirements(vkDevice, grBinds.vertexBuffer, &vkMemoryRequirements[index++]); } if (et.Importer_GLTF.AccessorIndexNormal > -1) { const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexNormal]; @@ -409,11 +412,7 @@ void EntityType_Load(EntityType &et) { bufferCI.size = acc.buffer_view->size; vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.normalsBuffer); - VkMemoryRequirements vkMemoryRequirementsNormals; - vkGetBufferMemoryRequirements(vkDevice, grBinds.normalsBuffer, &vkMemoryRequirementsNormals); - vkMemoryRequirements.memoryTypeBits |= vkMemoryRequirementsNormals.memoryTypeBits; - vkMemoryRequirements.size += vkMemoryRequirementsNormals.size; - assert(vkMemoryRequirementsNormals.alignment == vkMemoryRequirements.alignment); + vkGetBufferMemoryRequirements(vkDevice, grBinds.normalsBuffer, &vkMemoryRequirements[index++]); } if (et.Importer_GLTF.AccessorIndexUV > -1) { const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexUV]; @@ -421,11 +420,7 @@ void EntityType_Load(EntityType &et) { bufferCI.size = acc.buffer_view->size; vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.uvBuffer); - VkMemoryRequirements vkMemoryRequirementsUV; - vkGetBufferMemoryRequirements(vkDevice, grBinds.uvBuffer, &vkMemoryRequirementsUV); - vkMemoryRequirements.memoryTypeBits |= vkMemoryRequirementsUV.memoryTypeBits; - vkMemoryRequirements.size += vkMemoryRequirementsUV.size; - assert(vkMemoryRequirementsUV.alignment == vkMemoryRequirements.alignment); + vkGetBufferMemoryRequirements(vkDevice, grBinds.uvBuffer, &vkMemoryRequirements[index++]); } if (et.Importer_GLTF.AccessorIndexIndex > -1) { const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex]; @@ -434,44 +429,71 @@ void EntityType_Load(EntityType &et) { bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT; vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.indexBuffer); - VkMemoryRequirements vkMemoryRequirementsIndex; - vkGetBufferMemoryRequirements(vkDevice, grBinds.indexBuffer, &vkMemoryRequirementsIndex); - vkMemoryRequirements.memoryTypeBits |= vkMemoryRequirementsIndex.memoryTypeBits; - vkMemoryRequirements.size += vkMemoryRequirementsIndex.size; - assert(vkMemoryRequirementsIndex.alignment == vkMemoryRequirements.alignment); + vkGetBufferMemoryRequirements(vkDevice, grBinds.indexBuffer, &vkMemoryRequirements[index++]); + } + + VkMemoryRequirements combinedMemReqs{}; + combinedMemReqs.alignment = vkMemoryRequirements[0].alignment; + combinedMemReqs.memoryTypeBits = 0; + combinedMemReqs.size = 0; + for (long i = 1; i < index; ++i) { + if (combinedMemReqs.alignment == vkMemoryRequirements[i].alignment) { + continue; + } + int larger, smaller; + if (combinedMemReqs.alignment > vkMemoryRequirements[i].alignment) { + larger = combinedMemReqs.alignment; + smaller = vkMemoryRequirements[i].alignment; + } else { + larger = vkMemoryRequirements[i].alignment; + smaller = combinedMemReqs.alignment; + } + if (larger % smaller == 0) { + combinedMemReqs.alignment = larger; + continue; + } + int combined = larger * smaller; + while ((combined / 2) % larger == 0) { + combined /= 2; + } + } + for (long i = 0; i < index; ++i) { + uint32_t alignmentPadding = vkMemoryRequirements[i].size % combinedMemReqs.alignment; + alignmentPadding = combinedMemReqs.alignment - alignmentPadding; + combinedMemReqs.size += vkMemoryRequirements[i].size + alignmentPadding; + combinedMemReqs.memoryTypeBits |= vkMemoryRequirements[i].memoryTypeBits; } // create VkDeviceMemory VkMemoryAllocateInfo vkMemoryAllocateInfo; vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; vkMemoryAllocateInfo.pNext = nullptr; - vkMemoryAllocateInfo.allocationSize = vkMemoryRequirements.size; - vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(vkMemoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + vkMemoryAllocateInfo.allocationSize = combinedMemReqs.size; + vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(combinedMemReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &et.deviceMemoryVert); // bind buffers uint32_t runningOffset = 0; if (et.Importer_GLTF.AccessorIndexVertex > -1) { const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexVertex]; - assert(acc.buffer_view->offset % vkMemoryRequirements.alignment == 0); 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]; - assert(acc.buffer_view->offset % vkMemoryRequirements.alignment == 0); 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]; - assert(acc.buffer_view->offset % vkMemoryRequirements.alignment == 0); 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]; - assert(acc.buffer_view->offset % vkMemoryRequirements.alignment == 0); + // const auto &acc = gltfData->accessors[et.Importer_GLTF.AccessorIndexIndex]; vkBindBufferMemory(vkDevice, grBinds.indexBuffer, et.deviceMemoryVert, runningOffset); } @@ -483,7 +505,7 @@ void EntityType_Load(EntityType &et) { VkBuffer transferBuffer; VkMemoryRequirements vkMemoryRequirementsTransfer; - bufferCI.size = vkMemoryRequirements.size; + bufferCI.size = combinedMemReqs.size; bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &transferBuffer); vkGetBufferMemoryRequirements(vkDevice, transferBuffer, &vkMemoryRequirementsTransfer); @@ -492,7 +514,7 @@ void EntityType_Load(EntityType &et) { vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &transferDeviceMemory); vkBindBufferMemory(vkDevice, transferBuffer, transferDeviceMemory, 0); void *data; - vkMapMemory(vkDevice, transferDeviceMemory, 0, vkMemoryRequirements.size, 0, &data); + vkMapMemory(vkDevice, transferDeviceMemory, 0, combinedMemReqs.size, 0, &data); // memcpy(data, gltfData->buffers[0].data, vkMemoryRequirements.size); uint32_t runningOffset2 = 0; if (et.Importer_GLTF.AccessorIndexVertex > -1) { |
