summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-11-28 12:21:33 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-11-28 12:21:33 -0500
commit662e13106e2f726e47d09dc66c01d9449eceb623 (patch)
tree34f6041061bc2ae0c7d2052ef5f13290e68c73c9 /src/ecs.cpp
parentd6792165cb7df9f8f7d8e734a5af63bc25d83fbc (diff)
add transient bucket for temp storage that resets on tick start
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index 45d3bdc..c892f84 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -216,16 +216,19 @@ void ECS_Tick(double delta) {
struct InstanceBufferCopyChunk {
uint64_t startingIndex;
uint64_t endingIndex;
- DynArray<glm::mat4> mats{0, nullptr};
+ DynArray<glm::mat4> *mats = nullptr;
VkBufferCopy dstBufferCopy;
};
struct InstanceBufferCopy {
CompGrBinds *grBinds = nullptr;
VkDeviceSize runningSize = 0;
- DynArray<InstanceBufferCopyChunk> chunks{4};
+ DynArray<InstanceBufferCopyChunk> *chunks = nullptr;
};
void ECS_Tick_Late(double delta) {
- DynArray<InstanceBufferCopy> bufferUpdates{0, nullptr};
+ // using a pointer here avoids calling the destructor when the object goes out of scope
+ DynArray<InstanceBufferCopy> *bufferUpdatesPtr = Pke_New<DynArray<InstanceBufferCopy>>(pkeSettings.mem.bkt);
+ new (bufferUpdatesPtr) DynArray<InstanceBufferCopy>(0, pkeSettings.mem.bkt);
+ DynArray<InstanceBufferCopy> &bufferUpdates = *bufferUpdatesPtr;
for (long b = 0; b <= Comp_Instance_BucketContainer.bucketCounter; ++b) {
auto &bkt = Comp_Instance_BucketContainer.buckets[b];
long count = Comp_Instance_BucketContainer.bucketCounter == b ? Comp_Instance_BucketContainer.itemCounter >> 32 : maxBucketItemCount;
@@ -252,23 +255,27 @@ void ECS_Tick_Late(double delta) {
.grBinds = &grBinds,
});
bfrUpdate = &bufferUpdates[bufferUpdates.Count() - 1];
+ bfrUpdate->chunks = Pke_New<DynArray<InstanceBufferCopyChunk>>(pkeSettings.mem.bkt);
+ new (bfrUpdate->chunks) DynArray<InstanceBufferCopyChunk>(4, pkeSettings.mem.bkt);
}
InstanceBufferCopyChunk *chunk = nullptr;
- for (long ii = 0; ii < bfrUpdate->chunks.Count(); ++ii) {
- if (bfrUpdate->chunks[ii].endingIndex == inst.index - 1) {
- chunk = &bfrUpdate->chunks[ii];
+ for (long ii = 0; ii < bfrUpdate->chunks->Count(); ++ii) {
+ if ((*bfrUpdate->chunks)[ii].endingIndex == inst.index - 1) {
+ chunk = &(*bfrUpdate->chunks)[ii];
chunk->endingIndex += 1;
break;
}
}
if (chunk == nullptr) {
- bfrUpdate->chunks.Push({
+ bfrUpdate->chunks->Push({
.startingIndex = inst.index,
.endingIndex = inst.index,
});
- chunk = &bfrUpdate->chunks[bfrUpdate->chunks.Count() - 1];
+ chunk = &(*bfrUpdate->chunks)[bfrUpdate->chunks->Count() - 1];
chunk->dstBufferCopy.dstOffset = sizeof(glm::mat4) * inst.index;
+ chunk->mats = Pke_New<DynArray<glm::mat4>>(pkeSettings.mem.bkt);
+ new (chunk->mats) DynArray<glm::mat4>(0, pkeSettings.mem.bkt);
}
btTransform btMatrix_posRot;
@@ -280,13 +287,13 @@ void ECS_Tick_Late(double delta) {
glm::vec3 scale;
BulletToGlm(inst.bt.rigidBody->getCollisionShape()->getLocalScaling(), scale);
- chunk->mats.Push(glm::scale(glmMat_posRot, scale));
+ chunk->mats->Push(glm::scale(glmMat_posRot, scale));
bfrUpdate->runningSize += sizeof(glm::mat4);
inst.isNeedingUpdated = false;
}
}
while (bufferUpdates.Count() > 0) {
- InstanceBufferCopy ibc = bufferUpdates.Pop();
+ InstanceBufferCopy &ibc = bufferUpdates[bufferUpdates.Count() - 1];
VkDeviceSize instanceBytes = sizeof(glm::mat4);
VkDeviceSize byteCount = ibc.runningSize;
@@ -295,12 +302,12 @@ void ECS_Tick_Late(double delta) {
void *deviceData;
BeginTransferBuffer(byteCount, transferBuffer, transferMemory, deviceData);
VkDeviceSize runningOffset = 0;
- for (long i = 0; i < ibc.chunks.Count(); ++i) {
- auto *chunk = &ibc.chunks[i];
- memcpy(static_cast<char *>(deviceData) + runningOffset, chunk->mats.GetPtr(), byteCount);
- chunk->dstBufferCopy.srcOffset = runningOffset;
- chunk->dstBufferCopy.size = instanceBytes * (chunk->endingIndex - chunk->startingIndex + 1);
- runningOffset += chunk->dstBufferCopy.size;
+ for (long i = 0; i < ibc.chunks->Count(); ++i) {
+ auto &chunk = (*ibc.chunks)[i];
+ memcpy(static_cast<char *>(deviceData) + runningOffset, chunk.mats->GetPtr(), byteCount);
+ chunk.dstBufferCopy.srcOffset = runningOffset;
+ chunk.dstBufferCopy.size = instanceBytes * (chunk.endingIndex - chunk.startingIndex + 1);
+ runningOffset += chunk.dstBufferCopy.size;
}
assert(runningOffset == ibc.runningSize);
@@ -313,8 +320,8 @@ void ECS_Tick_Late(double delta) {
vkBeginCommandBuffer(transferCommandBuffer, &cbbi);
- for (long i = 0; i < ibc.chunks.Count(); ++i) {
- vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, ibc.grBinds->instanceBuffer, 1, &ibc.chunks[i].dstBufferCopy);
+ for (long i = 0; i < ibc.chunks->Count(); ++i) {
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, ibc.grBinds->instanceBuffer, 1, &(*ibc.chunks)[i].dstBufferCopy);
}
vkEndCommandBuffer(transferCommandBuffer);
@@ -334,6 +341,7 @@ void ECS_Tick_Late(double delta) {
vkResetCommandBuffer(transferCommandBuffer, 0);
}
EndTransferBuffer(transferBuffer, transferMemory);
+ bufferUpdates.Pop();
}
}