diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-28 12:21:33 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-28 12:21:33 -0500 |
| commit | 662e13106e2f726e47d09dc66c01d9449eceb623 (patch) | |
| tree | 34f6041061bc2ae0c7d2052ef5f13290e68c73c9 /src/ecs.cpp | |
| parent | d6792165cb7df9f8f7d8e734a5af63bc25d83fbc (diff) | |
add transient bucket for temp storage that resets on tick start
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 44 |
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(); } } |
