summaryrefslogtreecommitdiff
path: root/src/asset-manager.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-08-29 14:15:10 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-06 17:19:09 -0400
commit6a3de7eeacc21e2a6ccec853a24c9d0917d274e4 (patch)
tree4d79080adda9fed223c1ca0e46f7f57c6b7702ee /src/asset-manager.cpp
parent86ece47fd62bbaaf76581828936946555211459b (diff)
move boilerplate bucket code to memory file
Diffstat (limited to 'src/asset-manager.cpp')
-rw-r--r--src/asset-manager.cpp60
1 files changed, 20 insertions, 40 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp
index 37a2a17..dcfde4d 100644
--- a/src/asset-manager.cpp
+++ b/src/asset-manager.cpp
@@ -2,30 +2,14 @@
#include "asset-manager.hpp"
TypeSafeInt_B(AssetHandle);
-constexpr AssetHandle_T AssetIndexer_T{1ULL << 32};
-constexpr AssetHandle AssetIndexer{AssetIndexer_T};
-constexpr AssetHandle_T AssetIndexMax_T{63ULL << 32};
-constexpr AssetHandle AssetIndexMax{AssetIndexMax_T};
-constexpr AssetHandle_T AssetBucketMask_T{0x00000000FFFFFFFF};
-constexpr AssetHandle AssetBucketMask{AssetBucketMask_T};
-constexpr AssetHandle_T AssetIndexMask_T{0xFFFFFFFF00000000};
-constexpr AssetHandle AssetIndexMask{AssetIndexMask_T};
-
-static inline constexpr AssetHandle_T GetBucketIndex(AssetHandle assetHandle) {
- return static_cast<AssetHandle_T>(assetHandle & AssetBucketMask);
-}
-static inline constexpr AssetHandle_T GetAssetIndex(AssetHandle assetHandle) {
- AssetHandle_T index = static_cast<AssetHandle_T>(assetHandle & AssetIndexMask);
- return index >> 32;
-}
struct AssetBucket {
- Asset assets[64];
+ Asset assets[256];
};
uint64_t bucketIncrementer = 2;
-AssetHandle bucketCounter{0};
-AssetHandle assetCounter{0};
+AssetHandle_T bucketCounter{0};
+AssetHandle_T assetCounter{0};
AssetBucket *assetBuckets = nullptr;
void AssetManagerInit() {
@@ -33,29 +17,14 @@ void AssetManagerInit() {
}
AssetHandle RegisterAsset_Inner(const void *src, void *dst, int64_t size, const char *key) {
- AssetHandle assetHandle{assetCounter | bucketCounter};
- // update our counters and buckets
- {
- assetCounter = assetCounter + AssetIndexer;
- if (assetCounter > AssetIndexMax) {
- assetCounter = AssetHandle{0};
- ++bucketCounter;
- }
- if (bucketCounter > AssetHandle{bucketIncrementer}) {
- int64_t newIncrement = bucketIncrementer * 1.5;
- AssetBucket *newBuckets = pke::PkeNew<AssetBucket>(newIncrement);
- memcpy(newBuckets, assetBuckets, sizeof(AssetBucket) * bucketIncrementer);
- pke::PkeDelete<AssetBucket>(assetBuckets, bucketIncrementer);
- assetBuckets = newBuckets;
- bucketIncrementer = newIncrement;
- }
- }
+ AssetHandle_T assetHandle_T{Buckets_NewHandle<AssetBucket>(256ULL, bucketIncrementer, bucketCounter, assetCounter, assetBuckets)};
+ AssetHandle assetHandle{assetHandle_T};
if (src != nullptr) {
std::memcpy(dst, src, size);
}
- Asset *asset = &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)];
+ Asset *asset = &assetBuckets[Buckets_GetBucketIndex(assetHandle_T)].assets[Buckets_GetItemIndex(assetHandle_T)];
asset->ptr = dst;
asset->size = size;
int64_t keyLen = std::strlen(key);
@@ -81,7 +50,8 @@ AssetHandle RegisterAsset(const char *path) {
int64_t pathLen = strlen(path);
auto assetHandle = RegisterAsset_Inner(nullptr, target, 0, path + (pathLen > 16 ? pathLen - 16 : 0));
- Asset *asset = &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)];
+ AssetHandle_T assetHandle_T = static_cast<AssetHandle_T>(assetHandle);
+ Asset *asset = &assetBuckets[Buckets_GetBucketIndex(assetHandle_T)].assets[Buckets_GetItemIndex(assetHandle_T)];
file.seekg(0);
file.read(static_cast<char *>(asset->ptr), fileSize);
file.close();
@@ -90,12 +60,22 @@ AssetHandle RegisterAsset(const char *path) {
}
void DestroyAsset(AssetHandle assetHandle) {
- Asset *asset = &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)];
+ AssetHandle_T assetHandle_T = static_cast<AssetHandle_T>(assetHandle);
+ auto itemIndex = Buckets_GetItemIndex(assetHandle_T);
+ Asset *asset = &assetBuckets[Buckets_GetBucketIndex(assetHandle_T)].assets[itemIndex];
pke::PkeDelete(asset->ptr, asset->size);
+ for (long i = 0; i < 16; ++i) {
+ asset->key[i] = 0;
+ }
+ asset->size = 0;
asset->ptr = CAFE_BABE(void);
+ if (itemIndex == assetCounter - (1ULL << 32)) {
+ assetCounter -= (1ULL << 32);
+ }
}
const Asset *GetAsset(AssetHandle assetHandle) {
- return &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)];
+ AssetHandle_T assetHandle_T = static_cast<AssetHandle_T>(assetHandle);
+ return &assetBuckets[Buckets_GetBucketIndex(assetHandle_T)].assets[Buckets_GetItemIndex(assetHandle_T)];
}