diff options
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/asset-manager.cpp | 38 | ||||
| -rw-r--r-- | src/bucketed-array.hpp | 52 | ||||
| -rw-r--r-- | src/camera.cpp | 23 | ||||
| -rw-r--r-- | src/ecs.cpp | 96 | ||||
| -rw-r--r-- | src/memory.cpp | 26 | ||||
| -rw-r--r-- | src/memory.hpp | 37 | ||||
| -rw-r--r-- | src/thread_pool.cpp | 30 |
8 files changed, 133 insertions, 170 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 454bceb..dbd9787 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ set(PKE_SOURCE_FILES src/arg-handler.hpp src/arg-handler.cpp src/array.hpp + src/bucketed-array.hpp src/camera.hpp src/camera.cpp src/components.hpp diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index f652b64..6ff4600 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -1,6 +1,7 @@ #include "asset-manager.hpp" +#include "bucketed-array.hpp" #include "thread_pool.hpp" #include <chrono> @@ -10,11 +11,7 @@ const PkeHandleItemIndex_T maxAssetItemsPerBucket = 64; -struct AssetBucket { - Asset assets[maxAssetItemsPerBucket]; -}; - -BucketContainer<AssetBucket, AssetHandle> Asset_BucketContainer{}; +BucketContainer<Asset, AssetHandle> Asset_BucketContainer{}; ThreadPoolHandle assetThreadPool = ThreadPoolHandle_MAX; @@ -26,7 +23,7 @@ AssetKey EngineDefinedAssets[EngineDefinedAssetCount] = { }; void AM_Init() { - Buckets_Init(Asset_BucketContainer); + Buckets_Init(Asset_BucketContainer, maxAssetItemsPerBucket); assetThreadPool = PkeThreads_Init(2, 255); AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv"); AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv"); @@ -57,8 +54,8 @@ inline Asset *AM_Get_Inner(AssetKey key) { count = maxAssetItemsPerBucket; } for (long i = 0; i < count; ++i) { - if (strncmp(key, Asset_BucketContainer.buckets[b].assets[i].key, 16) == 0) { - return &Asset_BucketContainer.buckets[b].assets[i]; + if (strncmp(key, Asset_BucketContainer.buckets[b][i].key, 16) == 0) { + return &Asset_BucketContainer.buckets[b][i]; } } } @@ -73,9 +70,8 @@ AssetHandle AM_Register(AssetKey key, AssetType type, const void *data, int64_t if (searchedAsset != nullptr) { return searchedAsset->handle; } - bool moved; - AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)}; - Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex]; + AssetHandle assetHandle{Buckets_NewHandle(Asset_BucketContainer)}; + Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; new (&asset) Asset{}; asset.handle = assetHandle; strncpy(asset.key, key, AssetKeyLength); @@ -93,9 +89,8 @@ AssetHandle AM_Register(AssetKey key, AssetType type, const char *path) { if (searchedAsset != nullptr) { return searchedAsset->handle; } - bool moved = false; - AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)}; - Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex]; + AssetHandle assetHandle{Buckets_NewHandle(Asset_BucketContainer)}; + Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; new (&asset) Asset{}; asset.handle = assetHandle; strncpy(asset.key, key, AssetKeyLength); @@ -126,9 +121,8 @@ AssetHandle AM_Register(const char *path, AssetType type) { return searchedAsset->handle; } - bool moved = false; - AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)}; - Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex]; + AssetHandle assetHandle{Buckets_NewHandle(Asset_BucketContainer)}; + Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; new (&asset) Asset{}; asset.handle = assetHandle; strncpy(asset.key, assetKey, AssetKeyLength); @@ -149,7 +143,7 @@ AssetHandle AM_Register(const char *path, AssetType type) { void AM_Release(AssetHandle assetHandle) { assert(assetHandle != AssetHandle_MAX); - Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex]; + Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; asset.referenceCount -= 1; assert(asset.referenceCount >= 0 && "asset was unloaded more times than it was retrieved"); } @@ -157,7 +151,7 @@ void AM_Release(AssetHandle assetHandle) { const Asset *AM_Get(AssetHandle assetHandle) { auto validationResult = ValidateHandle(assetHandle, Asset_BucketContainer.pkeHandle, maxAssetItemsPerBucket); assert(validationResult == 0); - auto &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex]; + auto &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; if (asset.state == PKE_ASSET_LOADING_STATE_LOADED) { asset.referenceCount += 1; return &asset; @@ -207,7 +201,7 @@ Asset *AM_GetAssets(uint64_t bucketIndex, uint64_t &itemCount) { } else { itemCount = maxAssetItemsPerBucket; } - return Asset_BucketContainer.buckets[bucketIndex].assets; + return Asset_BucketContainer.buckets[bucketIndex]; } void AM_DebugPrint() { @@ -216,7 +210,7 @@ void AM_DebugPrint() { auto &bkt = Asset_BucketContainer.buckets[b]; uint64_t counter = b == Asset_BucketContainer.pkeHandle.bucketIndex ? Asset_BucketContainer.pkeHandle.itemIndex : maxAssetItemsPerBucket; for (uint64_t i = 0; i < counter; ++i) { - auto &asset = bkt.assets[i]; + auto &asset = bkt[i]; /* if (asset.size == 0) continue; @@ -240,7 +234,7 @@ void AM_DebugPrint() { void AM_GC() { for (long b = 0; b <= Asset_BucketContainer.pkeHandle.bucketIndex; ++b) { for (long i = 0; i < Asset_BucketContainer.pkeHandle.itemIndex; ++i) { - Asset &asset = Asset_BucketContainer.buckets[b].assets[i]; + Asset &asset = Asset_BucketContainer.buckets[b][i]; if (asset.referenceCount > 0) continue; if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void)) { diff --git a/src/bucketed-array.hpp b/src/bucketed-array.hpp new file mode 100644 index 0000000..5813ca6 --- /dev/null +++ b/src/bucketed-array.hpp @@ -0,0 +1,52 @@ +#ifndef PKE_BUCKETED_ARRAY_HPP +#define PKE_BUCKETED_ARRAY_HPP + +#include <cstddef> + +#include "memory.hpp" + +constexpr PkeHandleBucketIndex_T BucketContainerDefaultBucketCount = 16; +constexpr PkeHandleItemIndex_T BucketContainerDefaultItemCount = 256; + +template<typename T, typename CT = PkeHandle, PkeHandleBucketIndex_T BKT_CNT = BucketContainerDefaultBucketCount> +struct BucketContainer { + CT limits; + CT pkeHandle; + T* buckets[BKT_CNT]; +}; + +template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT> +void Buckets_Init(BucketContainer<T, CT, BKT_CNT> &bktContainer, size_t maxItemCount = BucketContainerDefaultItemCount) { + bktContainer.limits.bucketIndex = BKT_CNT; + bktContainer.limits.itemIndex = maxItemCount; + bktContainer.pkeHandle.hash = 0; + for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) { + bktContainer.buckets[i] = nullptr; + } + bktContainer.buckets[0] = Pke_New<T>(maxItemCount); +} + +template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT> +inline CT Buckets_NewHandle(BucketContainer<T, CT, BKT_CNT> &bktContainer) { + CT returnValue = bktContainer.pkeHandle; + bktContainer.pkeHandle.itemIndex += 1; + if (bktContainer.pkeHandle.itemIndex >= bktContainer.limits.itemIndex) { + bktContainer.pkeHandle.itemIndex = 0; + bktContainer.pkeHandle.bucketIndex += 1; + assert(bktContainer.pkeHandle.bucketIndex < bktContainer.limits.bucketIndex); + } + if (bktContainer.pkeHandle.itemIndex == 0) { + bktContainer.buckets[bktContainer.pkeHandle.bucketIndex] = Pke_New<T>(bktContainer.limits.itemIndex); + } + return returnValue; +} + +template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT> +static inline constexpr void Buckets_Destroy(BucketContainer<T, CT, BKT_CNT> &bktContainer) { + for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) { + Pke_Delete<T>(bktContainer.buckets[i], bktContainer.limits.itemIndex); + bktContainer.buckets[i] = CAFE_BABE(T); + } +} + +#endif /* PKE_BUCKETED_ARRAY_HPP */ diff --git a/src/camera.cpp b/src/camera.cpp index 4e8af3d..c7a861c 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -1,4 +1,5 @@ +#include "bucketed-array.hpp" #include "camera.hpp" #include "memory.hpp" @@ -14,31 +15,23 @@ PkeCamera NullCamera { PkeCamera *ActiveCamera = &NullCamera; const PkeHandleItemIndex_T MAX_CAMERAS_PER_BUCKET = 32; -struct CameraBucket { - PkeCamera cameras[MAX_CAMERAS_PER_BUCKET]; -}; -BucketContainer<CameraBucket, CameraHandle> Camera_BucketContainer{}; +BucketContainer<PkeCamera, CameraHandle> Camera_BucketContainer{}; PkeCamera &PkeCamera_Register() { - bool moved = false; - CameraHandle activeHandle = ActiveCamera->handle; - CameraHandle cameraHandle{Buckets_NewHandle<CameraBucket>(MAX_CAMERAS_PER_BUCKET, Camera_BucketContainer, moved)}; - if (moved && activeHandle != CameraHandle_MAX) { - ActiveCamera = PkeCamera_Get(activeHandle); - } - auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; + CameraHandle cameraHandle{Buckets_NewHandle(Camera_BucketContainer)}; + auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; cam.handle = cameraHandle; return cam; } PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) { assert(cameraHandle != CameraHandle_MAX); - return &Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; + return &Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; } void PkeCamera_Destroy(CameraHandle cameraHandle) { assert(cameraHandle != CameraHandle_MAX); - auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; + auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; cam.handle = CameraHandle_MAX; cam.pos = glm::vec3(0); cam.rot = glm::quat{}; @@ -58,11 +51,11 @@ PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count) { } else { count = MAX_CAMERAS_PER_BUCKET; } - return Camera_BucketContainer.buckets[bucketIndex].cameras; + return Camera_BucketContainer.buckets[bucketIndex]; } void PkeCamera_Init() { - Buckets_Init(Camera_BucketContainer); + Buckets_Init(Camera_BucketContainer, MAX_CAMERAS_PER_BUCKET); } void PkeCamera_Teardown() { diff --git a/src/ecs.cpp b/src/ecs.cpp index 34eb701..1e62988 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -1,6 +1,7 @@ #include "ecs.hpp" +#include "bucketed-array.hpp" #include "game-settings.hpp" #include "math-helpers.hpp" #include "memory.hpp" @@ -12,17 +13,7 @@ #include <BulletCollision/CollisionShapes/btConvexHullShape.h> #include <glm/gtc/type_ptr.hpp> -const PkeHandleItemIndex_T maxBucketItemCount = 256; - -struct EntityBucket { - Entity entities[maxBucketItemCount]; -}; -struct GrBindsBucket { - CompGrBinds compGrBinds[maxBucketItemCount]; -}; -struct InstanceBucket { - CompInstance instances[maxBucketItemCount]; -}; +constexpr PkeHandleItemIndex_T maxBucketItemCount = 256; /* * Entities that have been marked for removal by calling ECS_MarkForRemoval @@ -47,19 +38,19 @@ DynArray<Entity> entitiesYetToBeRemoved{0, nullptr}; DynArray<EntityHandle> EntitiesWithExcessInstances{16}; -BucketContainer<EntityBucket, EntityHandle> Entities_BucketContainer{}; -BucketContainer<GrBindsBucket, GrBindsHandle> Comp_GrBinds_BucketContainer{}; -BucketContainer<InstanceBucket, InstanceHandle> Comp_Instance_BucketContainer{}; +BucketContainer<Entity, EntityHandle> Entities_BucketContainer{}; +BucketContainer<CompGrBinds, GrBindsHandle> Comp_GrBinds_BucketContainer{}; +BucketContainer<CompInstance, InstanceHandle> Comp_Instance_BucketContainer{}; void ECS_GetEntity_Inner(EntityHandle entHandle, Entity*& ent) { assert(entHandle != EntityHandle_MAX && "Unknown entity handle"); - ent = &Entities_BucketContainer.buckets[entHandle.bucketIndex].entities[entHandle.itemIndex]; + ent = &Entities_BucketContainer.buckets[entHandle.bucketIndex][entHandle.itemIndex]; } void ECS_Init() { - Buckets_Init(Entities_BucketContainer); - Buckets_Init(Comp_GrBinds_BucketContainer); - Buckets_Init(Comp_Instance_BucketContainer); + Buckets_Init(Entities_BucketContainer, maxBucketItemCount); + Buckets_Init(Comp_GrBinds_BucketContainer, maxBucketItemCount); + Buckets_Init(Comp_Instance_BucketContainer, maxBucketItemCount); } uint64_t ECS_GetEntities_BucketCount() { @@ -68,14 +59,13 @@ uint64_t ECS_GetEntities_BucketCount() { Entity *ECS_GetEntities(uint64_t bucketIndex, uint64_t &itemCount) { assert(bucketIndex <= Entities_BucketContainer.pkeHandle.bucketIndex); itemCount = bucketIndex == Entities_BucketContainer.pkeHandle.bucketIndex ? Entities_BucketContainer.pkeHandle.itemIndex : maxBucketItemCount; - return Entities_BucketContainer.buckets[bucketIndex].entities; + return Entities_BucketContainer.buckets[bucketIndex]; } EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntHandle) { - bool moved; - EntityHandle entityHandle{Buckets_NewHandle<EntityBucket>(maxBucketItemCount, Entities_BucketContainer, moved)}; + EntityHandle entityHandle{Buckets_NewHandle<Entity>(Entities_BucketContainer)}; - Entity *entity = &Entities_BucketContainer.buckets[entityHandle.bucketIndex].entities[entityHandle.itemIndex]; + Entity *entity = &Entities_BucketContainer.buckets[entityHandle.bucketIndex][entityHandle.itemIndex]; entity = new (entity) Entity{}; entity->handle = entityHandle; entity->parentHandle = parentEntHandle; @@ -88,7 +78,7 @@ EntityHandle ECS_CreateEntity(EntityHandle parentEntHandle) { } void ECS_MarkForRemoval(EntityHandle entityHandle) { - const Entity *ent = &Entities_BucketContainer.buckets[entityHandle.bucketIndex].entities[entityHandle.itemIndex]; + const Entity *ent = &Entities_BucketContainer.buckets[entityHandle.bucketIndex][entityHandle.itemIndex]; assert(ent->isMarkedForRemoval == false && "Entity already marked for removal"); entitiesMarkedForRemoval.Push(entityHandle); } @@ -102,7 +92,7 @@ void ECS_Tick_Early(double delta) { for (long b = 0; b <= Entities_BucketContainer.pkeHandle.bucketIndex; ++b) { uint64_t entCount = b == Entities_BucketContainer.pkeHandle.bucketIndex ? Entities_BucketContainer.pkeHandle.itemIndex : maxBucketItemCount; for (long e = 0; e < entCount; ++e) { - Entity *ent = &Entities_BucketContainer.buckets[b].entities[e]; + Entity *ent = &Entities_BucketContainer.buckets[b][e]; if (ent->handle == EntityHandle_MAX) continue; if (ent->isMarkedForRemoval) { entitiesYetToBeRemoved.Push(*ent); @@ -120,19 +110,19 @@ void ECS_Tick_Early(double delta) { for (long e = 0; e < entitiesYetToBeRemoved.Count(); ++e) { Entity &clonedEnt = entitiesYetToBeRemoved[e]; CompGrBinds *grBinds = nullptr; - InstanceBucket *instBucket = nullptr; + CompInstance *instBucket = nullptr; CompInstance *inst = nullptr; uint64_t instBucketIndex = 0; if (clonedEnt.instanceHandle != InstanceHandle_MAX) { instBucketIndex = clonedEnt.instanceHandle.bucketIndex; - instBucket = &Comp_Instance_BucketContainer.buckets[instBucketIndex]; - inst = &instBucket->instances[clonedEnt.instanceHandle.itemIndex]; + instBucket = Comp_Instance_BucketContainer.buckets[instBucketIndex]; + inst = &instBucket[clonedEnt.instanceHandle.itemIndex]; if (inst->grBindsHandle != GrBindsHandle_MAX) { - grBinds = &Comp_GrBinds_BucketContainer.buckets[inst->grBindsHandle.bucketIndex].compGrBinds[inst->grBindsHandle.itemIndex]; + grBinds = &Comp_GrBinds_BucketContainer.buckets[inst->grBindsHandle.bucketIndex][inst->grBindsHandle.itemIndex]; } } if (grBinds == nullptr && clonedEnt.grBindsHandle != GrBindsHandle_MAX) { - grBinds = &Comp_GrBinds_BucketContainer.buckets[clonedEnt.grBindsHandle.bucketIndex].compGrBinds[clonedEnt.grBindsHandle.itemIndex]; + grBinds = &Comp_GrBinds_BucketContainer.buckets[clonedEnt.grBindsHandle.bucketIndex][clonedEnt.grBindsHandle.itemIndex]; } if (inst != nullptr) { assert(grBinds != nullptr); @@ -145,17 +135,17 @@ void ECS_Tick_Early(double delta) { } auto &bucket = Comp_Instance_BucketContainer.buckets[bi]; for (long ii = 0; ii < instCounter; ++ii) { - if (bucket.instances[ii].entHandle == EntityHandle_MAX) { + if (bucket[ii].entHandle == EntityHandle_MAX) { continue; } - if (bucket.instances[ii].grBindsHandle != inst->grBindsHandle) { + if (bucket[ii].grBindsHandle != inst->grBindsHandle) { continue; } - if (bucket.instances[ii].instanceHandle.itemIndex < clonedEnt.instanceHandle.itemIndex) { + if (bucket[ii].instanceHandle.itemIndex < clonedEnt.instanceHandle.itemIndex) { continue; } - bucket.instances[ii].index -= 1; - bucket.instances[ii].isNeedingUpdated = true; + bucket[ii].index -= 1; + bucket[ii].isNeedingUpdated = true; } } grBinds->instanceCounter -= 1; @@ -192,7 +182,7 @@ void ECS_Tick(double delta) { auto &bkt = Comp_Instance_BucketContainer.buckets[b]; long count = Comp_Instance_BucketContainer.pkeHandle.bucketIndex == b ? Comp_Instance_BucketContainer.pkeHandle.itemIndex : maxBucketItemCount; for (uint32_t i = 0; i < count; ++i) { - auto &inst = bkt.instances[i]; + auto &inst = bkt[i]; if (inst.entHandle == EntityHandle_MAX) continue; auto activationState = inst.bt.rigidBody->getActivationState(); @@ -225,13 +215,13 @@ void ECS_Tick_Late(double delta) { auto &bkt = Comp_Instance_BucketContainer.buckets[b]; long count = Comp_Instance_BucketContainer.pkeHandle.bucketIndex == b ? Comp_Instance_BucketContainer.pkeHandle.itemIndex : maxBucketItemCount; for (uint32_t i = 0; i < count; ++i) { - auto &inst = bkt.instances[i]; + auto &inst = bkt[i]; if (inst.isNeedingUpdated == false) continue; if (inst.entHandle == EntityHandle_MAX) continue; - auto &grBinds = Comp_GrBinds_BucketContainer.buckets[inst.grBindsHandle.bucketIndex].compGrBinds[inst.grBindsHandle.itemIndex]; + auto &grBinds = Comp_GrBinds_BucketContainer.buckets[inst.grBindsHandle.bucketIndex][inst.grBindsHandle.itemIndex]; InstanceBufferCopy *bfrUpdate = nullptr; for (long u = 0; u < bufferUpdates.Count(); ++u) { @@ -340,12 +330,12 @@ void FindComponents(EntityHandle handle, Entity *&ent, CompInstance *&compInst, return; GrBindsHandle grBindsHandle = ent->grBindsHandle; if (ent->instanceHandle != InstanceHandle_MAX) { - compInst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex].instances[ent->instanceHandle.itemIndex]; + compInst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex][ent->instanceHandle.itemIndex]; if (grBindsHandle == GrBindsHandle_MAX) grBindsHandle = compInst->grBindsHandle; } if (grBindsHandle != GrBindsHandle_MAX) { - grBinds = &Comp_GrBinds_BucketContainer.buckets[grBindsHandle.bucketIndex].compGrBinds[grBindsHandle.itemIndex]; + grBinds = &Comp_GrBinds_BucketContainer.buckets[grBindsHandle.bucketIndex][grBindsHandle.itemIndex]; } } @@ -393,9 +383,8 @@ CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { assert(ent->grBindsHandle == GrBindsHandle_MAX); - bool moved; - ent->grBindsHandle = Buckets_NewHandle(maxBucketItemCount, Comp_GrBinds_BucketContainer, moved); - auto *comp = &Comp_GrBinds_BucketContainer.buckets[ent->grBindsHandle.bucketIndex].compGrBinds[ent->grBindsHandle.itemIndex]; + ent->grBindsHandle = Buckets_NewHandle(Comp_GrBinds_BucketContainer); + auto *comp = &Comp_GrBinds_BucketContainer.buckets[ent->grBindsHandle.bucketIndex][ent->grBindsHandle.itemIndex]; comp = new (comp) CompGrBinds{}; comp->entHandle = entHandle; comp->grBindsHandle = ent->grBindsHandle; @@ -406,11 +395,11 @@ CompGrBinds *ECS_GetGrBinds(EntityHandle entHandle) { Entity *ent = nullptr; ECS_GetEntity_Inner(entHandle, ent); if (ent->grBindsHandle == GrBindsHandle_MAX) return nullptr; - return &Comp_GrBinds_BucketContainer.buckets[ent->grBindsHandle.bucketIndex].compGrBinds[ent->grBindsHandle.itemIndex]; + return &Comp_GrBinds_BucketContainer.buckets[ent->grBindsHandle.bucketIndex][ent->grBindsHandle.itemIndex]; } CompGrBinds *ECS_GetGrBinds(GrBindsHandle grBindsHandle) { if (grBindsHandle == GrBindsHandle_MAX) return nullptr; - return &Comp_GrBinds_BucketContainer.buckets[grBindsHandle.bucketIndex].compGrBinds[grBindsHandle.itemIndex]; + return &Comp_GrBinds_BucketContainer.buckets[grBindsHandle.bucketIndex][grBindsHandle.itemIndex]; } uint64_t ECS_GetGrBinds_BucketCount() { @@ -423,7 +412,7 @@ CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) { } else { itemCount = maxBucketItemCount; } - return Comp_GrBinds_BucketContainer.buckets[bucketIndex].compGrBinds; + return Comp_GrBinds_BucketContainer.buckets[bucketIndex]; } CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityTypeEntityHandle) { @@ -438,15 +427,14 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType assert(ent->grBindsHandle == GrBindsHandle_MAX); assert(entTypeEnt->grBindsHandle != GrBindsHandle_MAX); - bool moved; - ent->instanceHandle = Buckets_NewHandle(maxBucketItemCount, Comp_Instance_BucketContainer, moved); + ent->instanceHandle = Buckets_NewHandle(Comp_Instance_BucketContainer); - auto *instBkt = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex]; - auto *comp = &instBkt->instances[ent->instanceHandle.itemIndex]; - comp = new (comp) CompInstance{}; + auto *instBkt = Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex]; + auto *comp = &instBkt[ent->instanceHandle.itemIndex]; + new (comp) CompInstance{}; comp->entHandle = entHandle; - auto *grBinds = &Comp_GrBinds_BucketContainer.buckets[entTypeEnt->grBindsHandle.bucketIndex].compGrBinds[entTypeEnt->grBindsHandle.itemIndex]; + auto *grBinds = &Comp_GrBinds_BucketContainer.buckets[entTypeEnt->grBindsHandle.bucketIndex][entTypeEnt->grBindsHandle.itemIndex]; comp->grBindsHandle = grBinds->grBindsHandle; comp->instanceHandle = ent->instanceHandle; @@ -467,7 +455,7 @@ CompInstance *ECS_GetInstance(EntityHandle entHandle) { if (ent->instanceHandle == InstanceHandle_MAX) return nullptr; - auto *inst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex].instances[ent->instanceHandle.itemIndex]; + auto *inst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex][ent->instanceHandle.itemIndex]; return inst; } @@ -479,7 +467,7 @@ void ECS_UpdateInstance(EntityHandle entHandle, const InstPos &instPos, bool ove if (ent->instanceHandle == InstanceHandle_MAX) return; - auto *inst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex].instances[ent->instanceHandle.itemIndex]; + auto *inst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex][ent->instanceHandle.itemIndex]; if (BtDynamicsWorld && overridePhysics) { btVector3 localInertia(0, 0, 0); @@ -505,7 +493,7 @@ CompInstance *ECS_GetInstances(uint64_t bucketIndex, uint64_t &itemCount) { } else { itemCount = maxBucketItemCount; } - return Comp_Instance_BucketContainer.buckets[bucketIndex].instances; + return Comp_Instance_BucketContainer.buckets[bucketIndex]; } void ECS_Teardown() { diff --git a/src/memory.cpp b/src/memory.cpp index ce2fe00..8fcc121 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -355,32 +355,6 @@ void Pke_MemoryFlush() { } } -PkeHandle Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, PkeHandleItemIndex_T bucketItemCount, PkeHandleBucketIndex_T &bucketIncrementer, PkeHandleBucketIndex_T &bucketCounter, PkeHandleItemIndex_T &itemCounter, void*& buckets, bool &moved) { - moved = false; - PkeHandle returnValue { - .bucketIndex = bucketCounter, - .itemIndex = itemCounter, - }; - - itemCounter += 1; - if (itemCounter >= bucketItemCount) { - itemCounter = 0ULL; - bucketCounter += 1; - } - if (bucketCounter >= bucketIncrementer) { - std::size_t calculatedAlignment = alignment < MINIMUM_ALIGNMENT ? MINIMUM_ALIGNMENT : alignment; - moved = true; - int64_t newIncrement = bucketIncrementer * 1.5; - char * newBuckets = reinterpret_cast<char *>(Pke_New(bucketBytes * newIncrement, calculatedAlignment)); - std::memcpy(newBuckets, buckets, bucketBytes * bucketIncrementer); - Pke_Delete(buckets, bucketBytes * bucketIncrementer); - buckets = newBuckets; - bucketIncrementer = newIncrement; - } - - return returnValue; -} - void Pke_DebugPrint() { printf("Memory Manager printout:\nBucket count: %li\n", bucketHead); for (long i = 0; i < bucketHead; ++i) { diff --git a/src/memory.hpp b/src/memory.hpp index c2fc3bb..fe63318 100644 --- a/src/memory.hpp +++ b/src/memory.hpp @@ -17,13 +17,6 @@ extern const std::size_t MINIMUM_ALIGNMENT; extern const std::size_t MAXIMUM_ALIGNMENT; -template<typename T, typename CT> -struct BucketContainer { - PkeHandleBucketIndex_T incrementer = 2; - CT pkeHandle; - T *buckets = nullptr; -}; - void *Pke_New(std::size_t sz, std::size_t alignment); void *Pke_New(std::size_t sz, std::size_t alignment, MemBucket *bkt); void Pke_Delete(const void *ptr, std::size_t sz); @@ -89,34 +82,4 @@ inline void Pke_Delete(const void *ptr, long count, MemBucket *bucket = nullptr) } } - -template <typename T, typename CT> -void Buckets_Init(BucketContainer<T, CT> &bktContainer) { - assert(bktContainer.buckets == nullptr && "bucket container already initialized"); - bktContainer.pkeHandle.hash = 0; - bktContainer.buckets = Pke_New<T>(bktContainer.incrementer); -} - -PkeHandle Buckets_NewHandle(std::size_t bucketBytes, std::size_t alignment, PkeHandleItemIndex_T bucketItemCount, PkeHandleBucketIndex_T &bucketIncrementer, PkeHandleBucketIndex_T &bucketCounter, PkeHandleItemIndex_T &itemCounter, void*& buckets, bool &moved); -template <typename T> inline PkeHandle Buckets_NewHandle(PkeHandleItemIndex_T bucketItemCount, PkeHandleBucketIndex_T &bucketIncrementer, PkeHandleBucketIndex_T &bucketCounter, PkeHandleItemIndex_T &itemCounter, T*& buckets, bool &moved) { - void *ptr = reinterpret_cast<void *>(buckets); - PkeHandle handle = Buckets_NewHandle(sizeof(T), alignof(T), bucketItemCount, bucketIncrementer, bucketCounter, itemCounter, ptr, moved); - buckets = reinterpret_cast<T *>(ptr); - return handle; -} - -template <typename T, typename CT = PkeHandle> -inline CT Buckets_NewHandle(PkeHandleItemIndex_T maxBucketItemCount, BucketContainer<T, CT> &bktContainer, bool &moved) { - CT returnValue{}; - returnValue.hash = Buckets_NewHandle<T>(maxBucketItemCount, bktContainer.incrementer, bktContainer.pkeHandle.bucketIndex, bktContainer.pkeHandle.itemIndex, bktContainer.buckets, moved).hash; - return returnValue; -} - -template <typename T, typename CT> -static inline constexpr void Buckets_Destroy(BucketContainer<T, CT> &bktContainer) { - if (bktContainer.buckets == nullptr || bktContainer.buckets == CAFE_BABE(T)) return; - Pke_Delete<T>(bktContainer.buckets, bktContainer.pkeHandle.bucketIndex + 1); - bktContainer.buckets = CAFE_BABE(T); -} - #endif /* PKE_MEMORY_HPP */ diff --git a/src/thread_pool.cpp b/src/thread_pool.cpp index 050db20..4a67054 100644 --- a/src/thread_pool.cpp +++ b/src/thread_pool.cpp @@ -1,6 +1,8 @@ #include "thread_pool.hpp" +#include "bucketed-array.hpp" + #include <functional> #include <future> @@ -17,11 +19,8 @@ struct ThreadPool { }; const PkeHandleItemIndex_T MAX_THREADS_PER_BUCKET = 8; -struct ThreadBucket { - ThreadPool threadPools[MAX_THREADS_PER_BUCKET]; -}; -BucketContainer<ThreadBucket, ThreadPoolHandle> ThreadPool_BucketContainer{}; +BucketContainer<ThreadPool, ThreadPoolHandle> ThreadPool_BucketContainer{}; void ThreadRun(ThreadPool *tp) { std::packaged_task<void()> *j = nullptr; @@ -126,14 +125,13 @@ void inline PkeThreads_Shutdown_Inner(ThreadPool &tp) { } ThreadPoolHandle PkeThreads_Init(uint8_t threadCount, uint8_t maxQueueCount, MemBucket *bkt) { - if (!ThreadPool_BucketContainer.buckets) { - Buckets_Init(ThreadPool_BucketContainer); + if (ThreadPool_BucketContainer.pkeHandle.hash == 0) { + Buckets_Init(ThreadPool_BucketContainer, MAX_THREADS_PER_BUCKET); } assert(threadCount > 0); - bool moved; - ThreadPoolHandle newHandle{Buckets_NewHandle(255, ThreadPool_BucketContainer, moved)}; + ThreadPoolHandle newHandle{Buckets_NewHandle(ThreadPool_BucketContainer)}; - auto *tp = &ThreadPool_BucketContainer.buckets[newHandle.bucketIndex].threadPools[newHandle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[newHandle.bucketIndex][newHandle.itemIndex]; tp->bkt = bkt; tp->isRunning = true; @@ -153,13 +151,13 @@ ThreadPoolHandle PkeThreads_Init(uint8_t threadCount, uint8_t maxQueueCount, Mem void PkeThreads_Reset(ThreadPoolHandle handle) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; PkeThreads_Reset_Inner(*tp); } bool PkeThreads_Enqueue(ThreadPoolHandle handle, std::packaged_task<void()> *job) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; if (tp->bkt != nullptr) { /* 2023-12-22 JCB * Note that if this becomes an issue we can change it. @@ -173,27 +171,27 @@ bool PkeThreads_Enqueue(ThreadPoolHandle handle, std::packaged_task<void()> *job } int64_t PkeThreads_GetQueueCount (ThreadPoolHandle handle) { - auto &threadPool = ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto &threadPool = ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; return threadPool.jobQueue->Count(); } void PkeThreads_Pause(ThreadPoolHandle handle) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; PkeThreads_Pause_Inner(*tp); } void PkeThreads_Resume(ThreadPoolHandle handle) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; PkeThreads_Resume_Inner(*tp); } void PkeThreads_Shutdown(ThreadPoolHandle handle) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; PkeThreads_Shutdown_Inner(*tp); PkeThreads_JoinAll_Inner(*tp); @@ -201,7 +199,7 @@ void PkeThreads_Shutdown(ThreadPoolHandle handle) { void PkeThreads_Teardown(ThreadPoolHandle handle) { assert(handle != ThreadPoolHandle_MAX); - auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex].threadPools[handle.itemIndex]; + auto *tp = &ThreadPool_BucketContainer.buckets[handle.bucketIndex][handle.itemIndex]; PkeThreads_Shutdown_Inner(*tp); PkeThreads_JoinAll_Inner(*tp); |
