diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-21 21:45:38 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-21 21:45:38 -0400 |
| commit | 8bbef6b1f8fe61ae8b0f24693af28b7fa6e68237 (patch) | |
| tree | eaddcd8a1f6f735dc6ea2fe3380e5fe1c90754e6 | |
| parent | 77d547596c23d5878fee417d3aa0a3bf38037e65 (diff) | |
pke: embed shaders in executable
| -rw-r--r-- | Makefile | 32 | ||||
| -rw-r--r-- | assets/shaders/3d.frag (renamed from assets/shaders/texture.frag) | 0 | ||||
| -rw-r--r-- | assets/shaders/3d.vert (renamed from assets/shaders/vertex.vert) | 0 | ||||
| -rw-r--r-- | embed/embedded-file.h | 4 | ||||
| -rw-r--r-- | embed/embedded-fonts.c | 4 | ||||
| -rw-r--r-- | embed/embedded-shaders.c | 24 | ||||
| -rw-r--r-- | embed/embedded-shaders.h | 19 | ||||
| -rw-r--r-- | src/asset-manager.cpp | 34 | ||||
| -rw-r--r-- | src/asset-manager.hpp | 8 | ||||
| -rw-r--r-- | src/asset-types.h | 7 | ||||
| -rw-r--r-- | src/project.cpp | 5 | ||||
| -rw-r--r-- | src/window.cpp | 21 |
12 files changed, 98 insertions, 60 deletions
@@ -60,13 +60,25 @@ $(1): $(2) $(CC) -std=c2x -O3 -c $$< -o $$@ endef -FLG_PKE = -Isub/imgui -Isub/stb -Isub/cgltf -Isub/bullet3/src +FLG_PKE = -Iembed -Isub/imgui -Isub/stb -Isub/cgltf -Isub/bullet3/src FLG_EDT = $(FLG_PKE) -Isrc -Isub/msdfgen -Isub/msdf-atlas-gen FLG_MPL = $(FLG_PKE) -Isrc FLG_RUN = $(FLG_PKE) -Isrc FLG_TST = $(FLG_PKE) -Isrc +DST_SHADERS = \ + $(DIR_OBJ)/shaders/3d.frag.spv \ + $(DIR_OBJ)/shaders/3d.vert.spv \ + $(DIR_OBJ)/shaders/glyph.frag.spv \ + $(DIR_OBJ)/shaders/glyph.vert.spv \ + $(DIR_OBJ)/shaders/present.frag.spv \ + $(DIR_OBJ)/shaders/present.vert.spv \ + $(DIR_OBJ)/shaders/ui-base.frag.spv \ + $(DIR_OBJ)/shaders/ui-base.vert.spv \ + $(DIR_OBJ)/shaders/ui-txtr.frag.spv \ + FILES_BIN = \ + $(DST_SHADERS) \ assets/fonts/font-mannequin.png \ assets/fonts/font-mannequin.glyph \ @@ -86,24 +98,12 @@ $(foreach f,$(FILES_BIN_SAFE), \ ) \ ) -DST_SHADERS = \ - $(DIR_OBJ)/shaders/vertex.vert.spv \ - $(DIR_OBJ)/shaders/present.vert.spv \ - $(DIR_OBJ)/shaders/texture.frag.spv \ - $(DIR_OBJ)/shaders/present.frag.spv \ - $(DIR_OBJ)/shaders/glyph.vert.spv \ - $(DIR_OBJ)/shaders/glyph.frag.spv \ - $(DIR_OBJ)/shaders/ui-base.vert.spv \ - $(DIR_OBJ)/shaders/ui-base.frag.spv \ - $(DIR_OBJ)/shaders/ui-txtr.frag.spv \ - .PHONY: default default: options .WAIT $(DIR_OBJ)/libpke-editor.$(OBJ_EXT) $(DIR_OBJ)/libpke-example.$(LIB_EXT) $(DIR_EXE)/pke-runtime ; .PHONY: prepare prepare: config.h prepare: config.mk -prepare: $(FILES_BIN_GCH) prepare: mkdir -p $(DIR_EXE) mkdir -p $(DIR_OBJ)/shaders @@ -136,7 +136,7 @@ $(DIR_OBJ)/shaders/%.frag.spv: assets/shaders/%.frag | prepare $(DIR_OBJ)/%.$(OBJ_EXT) : src/%.c | prepare $(cc-command) $(FLG_PKE) -$(DIR_OBJ)/%.$(OBJ_EXT) : embed/%.c | prepare +$(DIR_OBJ)/%.$(OBJ_EXT) : embed/%.c | prepare $(FILES_BIN_GCH) $(cc-command) $(FLG_PKE) $(DIR_OBJ)/%.$(OBJ_EXT) : editor/%.c | prepare $(cc-command) $(FLG_PKE) @@ -145,7 +145,7 @@ $(DIR_OBJ)/%.$(OBJ_EXT) : tests/%.c | prepare $(DIR_OBJ)/%.$(OBJ_EXT) : src/%.cpp | prepare $(cxx-command) $(FLG_PKE) -$(DIR_OBJ)/%.$(OBJ_EXT) : embed/%.cpp | prepare +$(DIR_OBJ)/%.$(OBJ_EXT) : embed/%.cpp | prepare $(FILES_BIN_GCH) $(cxx-command) $(FLG_PKE) $(DIR_OBJ)/%.$(OBJ_EXT) : editor/%.cpp | prepare $(cxx-command) $(FLG_EDT) @@ -185,7 +185,6 @@ $(DIR_OBJ)/libmsdf-atlas-gen.$(LIB_EXT): prepare ar rc $@ sub/msdf-atlas-gen/$(DIR_OBJ)/*.$(OBJ_EXT) ranlib $@ -$(DIR_OBJ)/libpke.$(LIB_EXT): $(DST_SHADERS) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/arg-handler.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/asset-manager.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/audio.$(OBJ_EXT) @@ -195,6 +194,7 @@ $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/camera.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/dynamic-array.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/ecs.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/embedded-fonts.$(OBJ_EXT) +$(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/embedded-shaders.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/entities.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/font.$(OBJ_EXT) $(DIR_OBJ)/libpke.$(LIB_EXT): $(DIR_OBJ)/game-settings.$(OBJ_EXT) diff --git a/assets/shaders/texture.frag b/assets/shaders/3d.frag index 9859bb6..9859bb6 100644 --- a/assets/shaders/texture.frag +++ b/assets/shaders/3d.frag diff --git a/assets/shaders/vertex.vert b/assets/shaders/3d.vert index 8b2c133..8b2c133 100644 --- a/assets/shaders/vertex.vert +++ b/assets/shaders/3d.vert diff --git a/embed/embedded-file.h b/embed/embedded-file.h index 85f2a34..504225c 100644 --- a/embed/embedded-file.h +++ b/embed/embedded-file.h @@ -1,10 +1,12 @@ #ifndef PKE_EMBED_EMBEDDED_FILE_H #define PKE_EMBED_EMBEDDED_FILE_H +#include "../src/asset-types.h" + #include <stddef.h> struct embedded_file { - const char *name; + AssetKey name; const unsigned char *data; const size_t size; }; diff --git a/embed/embedded-fonts.c b/embed/embedded-fonts.c index ca85d91..187072f 100644 --- a/embed/embedded-fonts.c +++ b/embed/embedded-fonts.c @@ -4,6 +4,6 @@ #include "../assets/fonts/font_mannequin_glyph.h" const struct embedded_file embedded_fonts[] = { - { "fnt_mquin_img\0\0", assets_fonts_font_mannequin_png, assets_fonts_font_mannequin_png_len }, - { "fnt_mquin_gly\0\0", assets_fonts_font_mannequin_glyph, assets_fonts_font_mannequin_glyph_len }, + { "fnt_mquin_img\0", assets_fonts_font_mannequin_png, assets_fonts_font_mannequin_png_len }, + { "fnt_mquin_gly\0", assets_fonts_font_mannequin_glyph, assets_fonts_font_mannequin_glyph_len }, }; diff --git a/embed/embedded-shaders.c b/embed/embedded-shaders.c new file mode 100644 index 0000000..5e0a71a --- /dev/null +++ b/embed/embedded-shaders.c @@ -0,0 +1,24 @@ + +#include "embedded-shaders.h" + +#include "../../obj/shaders/3d_frag_spv.h" +#include "../../obj/shaders/3d_vert_spv.h" +#include "../../obj/shaders/glyph_frag_spv.h" +#include "../../obj/shaders/glyph_vert_spv.h" +#include "../../obj/shaders/present_frag_spv.h" +#include "../../obj/shaders/present_vert_spv.h" +#include "../../obj/shaders/ui_base_frag_spv.h" +#include "../../obj/shaders/ui_base_vert_spv.h" +#include "../../obj/shaders/ui_txtr_frag_spv.h" + +const struct embedded_file embedded_shaders[] = { + { "shdr-3d-frag\0\0\0\0", obj_shaders_3d_frag_spv, obj_shaders_3d_frag_spv_len, }, + { "shdr-3d-vert\0\0\0\0", obj_shaders_3d_vert_spv, obj_shaders_3d_vert_spv_len, }, + { "shdr-glyph-frag\0", obj_shaders_glyph_frag_spv, obj_shaders_glyph_frag_spv_len, }, + { "shdr-glyph-vert\0", obj_shaders_glyph_vert_spv, obj_shaders_glyph_vert_spv_len, }, + { "shdr-prsnt-frag\0", obj_shaders_present_frag_spv, obj_shaders_present_frag_spv_len, }, + { "shdr-prsnt-vert\0", obj_shaders_present_vert_spv, obj_shaders_present_vert_spv_len, }, + { "shdr-ui-bs-frag\0", obj_shaders_ui_base_frag_spv, obj_shaders_ui_base_frag_spv_len, }, + { "shdr-ui-bs-vert\0", obj_shaders_ui_base_vert_spv, obj_shaders_ui_base_vert_spv_len, }, + { "shdr-ui-tx-frag\0", obj_shaders_ui_txtr_frag_spv, obj_shaders_ui_txtr_frag_spv_len, }, +}; diff --git a/embed/embedded-shaders.h b/embed/embedded-shaders.h new file mode 100644 index 0000000..94869e2 --- /dev/null +++ b/embed/embedded-shaders.h @@ -0,0 +1,19 @@ +#ifndef PKE_EMBED_EMBEDDED_SHADERS_H +#define PKE_EMBED_EMBEDDED_SHADERS_H + +#include "embedded-file.h" + +#define embedded_shader_index_3d_frag 0 +#define embedded_shader_index_3d_vert 1 +#define embedded_shader_index_glyph_frag 2 +#define embedded_shader_index_glyph_vert 3 +#define embedded_shader_index_present_frag 4 +#define embedded_shader_index_present_vert 5 +#define embedded_shader_index_ui_base_frag 6 +#define embedded_shader_index_ui_base_vert 7 +#define embedded_shader_index_ui_texture_frag 8 +#define embedded_shader_index_count 9 + +extern const struct embedded_file embedded_shaders[]; + +#endif /* PKE_EMBED_EMBEDDED_SHADERS_H */ diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index 7d595ce..5eef783 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -1,6 +1,7 @@ #include "asset-manager.hpp" +#include "embedded-shaders.h" #include "pk.h" #include "thread-pool.hpp" @@ -14,30 +15,13 @@ struct Asset_Master { ThreadPoolHandle thread_pool = ThreadPoolHandle_MAX; } asset_mstr; -AssetKey EngineDefinedAssets[EngineDefinedAssetCount] = { - "pke_prsnt_vrt\0\0", - "pke_prsnt_frg\0\0", - "pke_txtr_vrt\0\0\0", - "pke_txtr_frg\0\0\0", - "pke_glyph_vrt\0\0", - "pke_glyph_frg\0\0", - "pke_ui_bs_vrt\0\0", - "pke_ui_bs_frg\0\0", - "pke_ui_txt_frg\0", -}; - void AM_Init() { + int i; new (&asset_mstr.bc) pk_bkt_arr_t<Asset>{ pk_bkt_arr_handle_MAX_constexpr }; asset_mstr.thread_pool = PkeThreads_Init(2, 255); - AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv", nullptr); - AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv", nullptr); - AM_Register(EngineDefinedAssets[2], PKE_ASSET_TYPE_SHADER, "assets/shaders/vertex.vert.spv", nullptr); - AM_Register(EngineDefinedAssets[3], PKE_ASSET_TYPE_SHADER, "assets/shaders/texture.frag.spv", nullptr); - AM_Register(EngineDefinedAssets[4], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.vert.spv", nullptr); - AM_Register(EngineDefinedAssets[5], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.frag.spv", nullptr); - AM_Register(EngineDefinedAssets[6], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.vert.spv", nullptr); - AM_Register(EngineDefinedAssets[7], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.frag.spv", nullptr); - AM_Register(EngineDefinedAssets[8], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-txtr.frag.spv", nullptr); + for (i = 0; i < embedded_shader_index_count; ++i) { + AM_Register_Static(embedded_shaders[i].name, PKE_ASSET_TYPE_SHADER, embedded_shaders[i].data, embedded_shaders[i].size, nullptr); + } } void AM_Load_Task(Asset &asset) { @@ -256,6 +240,10 @@ void AM_GC() { auto asset_iter_fn = [](void *user_data, void *arr_obj_data) { (void)user_data; Asset &asset = *reinterpret_cast<Asset *>(arr_obj_data); + if (PK_HAS_FLAG(asset.flags, PKE_ASSET_FLAGS_MEM_STATIC)) { + fprintf(stdout, "[AM_GC] Asset '%.16s' is static, skipping.", asset.key); + return; + } switch (asset.state) { case PKE_ASSET_LOADING_STATE_LOADING: fprintf(stdout, "[AM_GC] Asset '%.16s' is still loading.", asset.key); @@ -267,7 +255,7 @@ void AM_GC() { fprintf(stdout, "[AM_GC] Asset '%.16s' still in use, count: %i\n", asset.key, asset.referenceCount); return; } - if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void) && !PK_HAS_FLAG(asset.flags, PKE_ASSET_FLAGS_MEM_STATIC)) { + if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void)) { pk_delete_base(asset.ptr, asset.size); fprintf(stdout, "[AM_GC] Asset '%.16s' not in use, freeing.\n", asset.key); } @@ -280,7 +268,7 @@ void AM_GC() { } void AM_Teardown() { + PkeThreads_Teardown(asset_mstr.thread_pool); AM_GC(); pk_bkt_arr_teardown(&asset_mstr.bc); - PkeThreads_Teardown(asset_mstr.thread_pool); } diff --git a/src/asset-manager.hpp b/src/asset-manager.hpp index f8ff6a8..d52145f 100644 --- a/src/asset-manager.hpp +++ b/src/asset-manager.hpp @@ -3,6 +3,8 @@ #include "pk.h" +#include "asset-types.h" + #include <cstdint> #include <future> @@ -14,9 +16,6 @@ TypeSafeInt_constexpr(AssetLoadingState, uint8_t, 0xFF); TypeSafeInt_constexpr(AssetType, uint8_t, 0xFF); TypeSafeInt_constexpr(AssetFlags, uint8_t, 0xFF); -const int64_t AssetKeyLength = 16; -using AssetKey = char[AssetKeyLength]; - const AssetLoadingState PKE_ASSET_LOADING_STATE_UNLOADED = AssetLoadingState {0}; const AssetLoadingState PKE_ASSET_LOADING_STATE_LOADING = AssetLoadingState {1}; const AssetLoadingState PKE_ASSET_LOADING_STATE_LOADED = AssetLoadingState {2}; @@ -33,9 +32,6 @@ const AssetType PKE_ASSET_TYPE_ALL = AssetType {0xFF}; const AssetFlags PKE_ASSET_FLAGS_NONE = AssetFlags {0x00}; const AssetFlags PKE_ASSET_FLAGS_MEM_STATIC = AssetFlags {0x01}; -constexpr int64_t EngineDefinedAssetCount = 9; -extern AssetKey EngineDefinedAssets[EngineDefinedAssetCount]; - union pke_asset_details { struct pke_asset_details_shader { } shader; diff --git a/src/asset-types.h b/src/asset-types.h new file mode 100644 index 0000000..8fbb793 --- /dev/null +++ b/src/asset-types.h @@ -0,0 +1,7 @@ +#ifndef PKE_ASSET_TYPES_H +#define PKE_ASSET_TYPES_H + +#define AssetKeyLength 16l +typedef char AssetKey[AssetKeyLength]; + +#endif /* PKE_ASSET_TYPES_H */ diff --git a/src/project.cpp b/src/project.cpp index c981f03..00c4c1f 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -3,6 +3,7 @@ #include "asset-manager.hpp" #include "components.hpp" +#include "embedded-shaders.h" #include "pk.h" #include "plugins.hpp" #include "entities.hpp" @@ -417,8 +418,8 @@ void PkeProject_Save(const char *filePath) { // TODO 2025-05-30 JCB // This should be a flag bool isGlobalAsset = false; - for (long k = 0; k < EngineDefinedAssetCount; ++k) { - if (strncmp(EngineDefinedAssets[k], arr_obj_data->key, AssetKeyLength) == 0) { + for (long k = 0; k < embedded_shader_index_count; ++k) { + if (strncmp(embedded_shaders[k].name, arr_obj_data->key, AssetKeyLength) == 0) { isGlobalAsset = true; break; } diff --git a/src/window.cpp b/src/window.cpp index 773c767..a0e33f6 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -9,6 +9,7 @@ #include "asset-manager.hpp" #include "camera.hpp" #include "ecs.hpp" +#include "embedded-shaders.h" #include "font.hpp" #include "game-settings.hpp" #include "math-helpers.hpp" @@ -1825,8 +1826,8 @@ void CreatePresentPipeline() { assert(pkvk_present.descriptor_sets == nullptr || pkvk_present.descriptor_sets == CAFE_BABE(VkDescriptorSet)); // enqueue asset loading - AssetHandle vertShaderAsset{AM_GetHandle(AssetKey{"pke_prsnt_vrt\0\0"})}; - AssetHandle fragShaderAsset{AM_GetHandle(AssetKey{"pke_prsnt_frg\0\0"})}; + AssetHandle vertShaderAsset{AM_GetHandle(embedded_shaders[embedded_shader_index_present_vert].name)}; + AssetHandle fragShaderAsset{AM_GetHandle(embedded_shaders[embedded_shader_index_present_frag].name)}; VkPipelineShaderStageCreateInfo shaderStages[2]; for (long i = 0; i < 2; ++i) { @@ -2262,13 +2263,13 @@ void CreateGraphicsPipelines() { // pipelines { // enqueue asset loading - AssetHandle vertShaderAssetHandle{AM_GetHandle(AssetKey{"pke_txtr_vrt\0\0\0"})}; - AssetHandle textureFragShaderAssetHandle { AM_GetHandle(AssetKey{"pke_txtr_frg\0\0\0"})}; - AssetHandle vertGlyphAssetHandle{AM_GetHandle(AssetKey{"pke_glyph_vrt\0\0"})}; - AssetHandle fragGlyphAssetHandle { AM_GetHandle(AssetKey{"pke_glyph_frg\0\0"})}; - AssetHandle asset_handle_vert_ui_base { AM_GetHandle(AssetKey{"pke_ui_bs_vrt\0\0"})}; - AssetHandle asset_handle_frag_ui_base { AM_GetHandle(AssetKey{"pke_ui_bs_frg\0\0"})}; - AssetHandle asset_handle_frag_ui_txtr { AM_GetHandle(AssetKey{"pke_ui_txt_frg\0"})}; + AssetHandle vertShaderAssetHandle { AM_GetHandle(embedded_shaders[embedded_shader_index_3d_vert].name)}; + AssetHandle textureFragShaderAssetHandle { AM_GetHandle(embedded_shaders[embedded_shader_index_3d_frag].name)}; + AssetHandle vertGlyphAssetHandle { AM_GetHandle(embedded_shaders[embedded_shader_index_glyph_vert].name)}; + AssetHandle fragGlyphAssetHandle { AM_GetHandle(embedded_shaders[embedded_shader_index_glyph_frag].name)}; + AssetHandle asset_handle_vert_ui_base { AM_GetHandle(embedded_shaders[embedded_shader_index_ui_base_vert].name)}; + AssetHandle asset_handle_frag_ui_base { AM_GetHandle(embedded_shaders[embedded_shader_index_ui_base_frag].name)}; + AssetHandle asset_handle_frag_ui_txtr { AM_GetHandle(embedded_shaders[embedded_shader_index_ui_texture_frag].name)}; const long vertexBindingCount = 4; long index = 0; @@ -4206,7 +4207,7 @@ VkShaderModule UploadShader(AssetHandle handle) { return NULL; } #ifndef NDEBUG - fprintf(stdout, "Uploading Shader: '%s'\n", asset->basePath); + fprintf(stdout, "Uploading Shader: '%s'\n", asset->key); #endif VkShaderModuleCreateInfo createInfo; |
