diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
| commit | 40d69e7e40a18865a31af2f55efcde369d36dbbb (patch) | |
| tree | 95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/asset-manager.cpp | |
| parent | ead9e484db969a880470d625b1884aced296e722 (diff) | |
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/asset-manager.cpp')
| -rw-r--r-- | src/asset-manager.cpp | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index 2976643..b7a82fd 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -46,10 +46,11 @@ void AM_Load_Task(Asset &asset) { return; } asset.size = std::filesystem::file_size(asset.basePath); - asset.ptr = pk_new_base(asset.size, alignof(max_align_t)); + void *ptr = pk_new_base(asset.size, alignof(max_align_t)); file.seekg(0, std::ios::beg); - file.read(static_cast<char *>(asset.ptr), asset.size); + file.read(static_cast<char *>(ptr), asset.size); file.close(); + asset.ptr = ptr; asset.state = PKE_ASSET_LOADING_STATE_LOADED; } @@ -85,8 +86,9 @@ AssetHandle AM_Register(AssetKey key, AssetType type, const void *data, int64_t strncpy(asset.key, key, AssetKeyLength); asset.basePath = nullptr; asset.size = size; - asset.ptr = pk_new_base(size, alignment); - memcpy(asset.ptr, data, size); + void *ptr = pk_new_base(size, alignment); + memcpy(ptr, data, size); + asset.ptr = ptr; asset.state = PKE_ASSET_LOADING_STATE_LOADED; asset.type = type; return assetHandle; @@ -149,6 +151,28 @@ AssetHandle AM_Register(const char *path, AssetType type) { return assetHandle; } +AssetHandle AM_Register_Static(AssetKey key, AssetType type, const void *data, int64_t size) { + assert(data != nullptr && "Attempt to register invalid asset data"); + assert(data != CAFE_BABE(void) && "Attempt to register invalid asset data"); + assert(size != 0 && "Attempt to register asset data of size 0"); + Asset *searchedAsset = AM_Get_Inner(key); + if (searchedAsset != nullptr) { + return searchedAsset->handle; + } + 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); + asset.basePath = nullptr; + asset.size = size; + asset.ptr = data; + asset.state = PKE_ASSET_LOADING_STATE_LOADED; + asset.type = type; + asset.flags = PKE_ASSET_FLAGS_MEM_STATIC; + return assetHandle; +} + void AM_Release(AssetHandle assetHandle) { assert(assetHandle != AssetHandle_MAX); Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex]; @@ -243,9 +267,11 @@ 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][i]; - if (asset.referenceCount > 0) + if (asset.referenceCount > 0) { + fprintf(stderr, "[AM_GC] Asset '%.16s' still in use, count: %i", asset.key, asset.referenceCount); continue; - if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void)) { + } + if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void) && !PK_HAS_FLAG(asset.flags, PKE_ASSET_FLAGS_MEM_STATIC)) { pk_delete_base(asset.ptr, asset.size); } asset.size = 0; |
