summaryrefslogtreecommitdiff
path: root/src/entities.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-15 07:55:03 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-15 07:55:03 -0400
commitde0814665281ab14db1ad4ee1ad1832b7143c131 (patch)
tree02945537f54a2d209411cad7a60e06f6df0be729 /src/entities.cpp
parent2eb22f8debec811cdea32ed7b8cf3ec98c752f7c (diff)
entity buffers calculate alignment and pad to align
Diffstat (limited to 'src/entities.cpp')
-rw-r--r--src/entities.cpp76
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) {