summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-08-21 21:45:38 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-08-21 21:45:38 -0400
commit8bbef6b1f8fe61ae8b0f24693af28b7fa6e68237 (patch)
treeeaddcd8a1f6f735dc6ea2fe3380e5fe1c90754e6
parent77d547596c23d5878fee417d3aa0a3bf38037e65 (diff)
pke: embed shaders in executable
-rw-r--r--Makefile32
-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.h4
-rw-r--r--embed/embedded-fonts.c4
-rw-r--r--embed/embedded-shaders.c24
-rw-r--r--embed/embedded-shaders.h19
-rw-r--r--src/asset-manager.cpp34
-rw-r--r--src/asset-manager.hpp8
-rw-r--r--src/asset-types.h7
-rw-r--r--src/project.cpp5
-rw-r--r--src/window.cpp21
12 files changed, 98 insertions, 60 deletions
diff --git a/Makefile b/Makefile
index 6685083..ea46f58 100644
--- a/Makefile
+++ b/Makefile
@@ -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;