From e7683d6e0e1528c6edb493593ab89140961d9e72 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Tue, 22 Oct 2024 21:52:43 +0800 Subject: [PATCH] global singleton bugfix --- .gitignore | 3 +- engine/3rdparty/xmake.lua | 3 +- engine/assets/shader/simple.frag | 7 ++ engine/assets/shader/simple.frag.meta | 6 ++ engine/assets/shader/simple.vert | 11 +++ engine/assets/shader/simple.vert.meta | 6 ++ .../asset/impl/resource_system_impl.inl | 2 + .../engine/asset/include/asset/asset.h | 3 +- .../engine/asset/include/asset/res/guid.h | 2 + .../asset/include/asset/resource_system.h | 3 +- .../modules/engine/core/3rdparty/singleton.h | 16 ---- .../engine/core/impl/file_manager_impl.inl | 4 +- .../engine/core/include/module/module.inl | 16 +--- .../engine/core/include/os/file_manager.h | 4 +- .../engine/render/impl/renderapi_impl.inl | 7 +- .../engine/render/impl/window_impl.inl | 2 + .../render/include/render/asset/material.h | 3 + .../render/include/render/asset/shader.h | 6 ++ .../engine/render/include/render/renderapi.h | 3 +- .../include/render/tool/glsl_to_spirv.h | 16 ++++ .../engine/render/include/render/window.h | 4 +- .../engine/render/src/pass/demo_pass.cpp | 14 ++- .../engine/render/src/tool/glsl_to_spirv.cpp | 39 ++++++++ engine/modules/engine/render/xmake.lua | 2 +- .../engine/singleton/include/singleton.h | 92 +++++++++++++++++++ .../engine/singleton/src/singleton.cpp | 13 +++ engine/modules/engine/singleton/xmake.lua | 7 ++ .../engine/zlib/include/pmr/memory.inl | 40 +++++--- engine/modules/engine/zlib/include/pmr/name.h | 17 ---- .../modules/engine/zlib/include/pmr/name.inl | 10 +- .../zlib/include/refl/detail/uclass.inl | 7 +- .../include/vkn/loader/vulkan_glsl_loader.h | 22 +++++ .../render/vulkan/include/vkn/vulkan_api.h | 1 - .../vulkan/src/loader/vulkan_glsl_loader.cpp | 51 ++++++++++ engine/modules/render/vulkan/src/module.cpp | 4 +- engine/modules/xmake.lua | 2 + game/zworld/xmake.lua | 3 +- 37 files changed, 358 insertions(+), 93 deletions(-) create mode 100644 engine/assets/shader/simple.frag create mode 100644 engine/assets/shader/simple.frag.meta create mode 100644 engine/assets/shader/simple.vert create mode 100644 engine/assets/shader/simple.vert.meta delete mode 100644 engine/modules/engine/core/3rdparty/singleton.h create mode 100644 engine/modules/engine/render/include/render/tool/glsl_to_spirv.h create mode 100644 engine/modules/engine/render/src/tool/glsl_to_spirv.cpp create mode 100644 engine/modules/engine/singleton/include/singleton.h create mode 100644 engine/modules/engine/singleton/src/singleton.cpp create mode 100644 engine/modules/engine/singleton/xmake.lua create mode 100644 engine/modules/render/vulkan/include/vkn/loader/vulkan_glsl_loader.h create mode 100644 engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp diff --git a/.gitignore b/.gitignore index f8c16b1..08e8cec 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ .xmake/ build/ vsxmake*/ -/tools \ No newline at end of file +/tools +engine/3rdparty/ diff --git a/engine/3rdparty/xmake.lua b/engine/3rdparty/xmake.lua index 64e4b8a..e2e3d99 100644 --- a/engine/3rdparty/xmake.lua +++ b/engine/3rdparty/xmake.lua @@ -1 +1,2 @@ -add_requires("spdlog", "lemon", "libsdl", "vulkansdk") \ No newline at end of file +add_requires("spdlog", "lemon", "libsdl", "vulkansdk") +includes("*/xmake.lua") \ No newline at end of file diff --git a/engine/assets/shader/simple.frag b/engine/assets/shader/simple.frag new file mode 100644 index 0000000..23398b2 --- /dev/null +++ b/engine/assets/shader/simple.frag @@ -0,0 +1,7 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable +layout (location = 0) in vec4 vColor; +layout (location = 0) out vec4 oColor; +void main() { + oColor = vColor; +} \ No newline at end of file diff --git a/engine/assets/shader/simple.frag.meta b/engine/assets/shader/simple.frag.meta new file mode 100644 index 0000000..78a9e5f --- /dev/null +++ b/engine/assets/shader/simple.frag.meta @@ -0,0 +1,6 @@ +metadatas: + - guid: a4064a70-89d5-4d8f-b3c3-6486dcf786c0 + name: "" + t_hash: engineapi::ShaderProgram + meta: ~ +includes: ~ \ No newline at end of file diff --git a/engine/assets/shader/simple.vert b/engine/assets/shader/simple.vert new file mode 100644 index 0000000..c8d3930 --- /dev/null +++ b/engine/assets/shader/simple.vert @@ -0,0 +1,11 @@ +#version 450 +layout (location = 0) in vec3 iPos; +layout (location = 1) in vec2 iTex; + +layout (location = 0) out vec4 vColor; + +void main() +{ + gl_Position = vec4(iPos.x, iPos.y, iTex.x, 1.0); + vColor = vec4(gl_Position.x, gl_Position.y, gl_Position.z, 1.0); +} diff --git a/engine/assets/shader/simple.vert.meta b/engine/assets/shader/simple.vert.meta new file mode 100644 index 0000000..a9a2173 --- /dev/null +++ b/engine/assets/shader/simple.vert.meta @@ -0,0 +1,6 @@ +metadatas: + - guid: 020486aa-8987-4bd1-9de9-eeb7ab82c437 + name: "" + t_hash: engineapi::ShaderProgram + meta: ~ +includes: ~ \ No newline at end of file diff --git a/engine/modules/engine/asset/impl/resource_system_impl.inl b/engine/modules/engine/asset/impl/resource_system_impl.inl index a0117ca..24334f9 100644 --- a/engine/modules/engine/asset/impl/resource_system_impl.inl +++ b/engine/modules/engine/asset/impl/resource_system_impl.inl @@ -4,6 +4,7 @@ #include "os/file_handle.h" #include "archive/json.h" namespace api { + SINGLETON_DEFINE(ResourceSystem) using GenericPtr = ResourceSystem::GenericPtr; using ResourceFileBlock = ResourceSystem::ResourceFileBlock; class ResourceSystemImpl @@ -202,6 +203,7 @@ namespace api { } inline ResourceSystem::ResourceSystem() { + SINGLETON_VAL(); impl = new(GlobalPool()) ResourceSystemImpl(this); } inline void api::ResourceSystem::Initialize() diff --git a/engine/modules/engine/asset/include/asset/asset.h b/engine/modules/engine/asset/include/asset/asset.h index 8040b8f..eadb856 100644 --- a/engine/modules/engine/asset/include/asset/asset.h +++ b/engine/modules/engine/asset/include/asset/asset.h @@ -1,7 +1,6 @@ #pragma once #include "resource_system.h" namespace api { - using refl::type_info; class Asset : public Resource { public: using Base = Resource; @@ -16,7 +15,7 @@ namespace api { { if (h) { - metadatas.emplace_back(SerializedMeta{ h.guid, h->Name(), refl::type_name().View(), h->Meta()}); + metadatas.emplace_back(SerializedMeta{ h.guid, h->Name(), type_name().View(), h->Meta()}); } } } \ No newline at end of file diff --git a/engine/modules/engine/asset/include/asset/res/guid.h b/engine/modules/engine/asset/include/asset/res/guid.h index 98d2a88..0b72c3e 100644 --- a/engine/modules/engine/asset/include/asset/res/guid.h +++ b/engine/modules/engine/asset/include/asset/res/guid.h @@ -4,6 +4,8 @@ #include namespace api { + using refl::type_info; + using refl::type_name; using pmr::Name; using std::string_view; using std::span; diff --git a/engine/modules/engine/asset/include/asset/resource_system.h b/engine/modules/engine/asset/include/asset/resource_system.h index 1a8d1e2..87f9db0 100644 --- a/engine/modules/engine/asset/include/asset/resource_system.h +++ b/engine/modules/engine/asset/include/asset/resource_system.h @@ -47,8 +47,9 @@ namespace api { template using LoadResult = result; class ResourceSystemImpl; - class ASSET_API ResourceSystem : public ISystem + class ASSET_API ResourceSystem : public ISystem { + SINGLETON_API_PTR(ResourceSystem) public: struct ResourceFileBlock; template diff --git a/engine/modules/engine/core/3rdparty/singleton.h b/engine/modules/engine/core/3rdparty/singleton.h deleted file mode 100644 index f12444e..0000000 --- a/engine/modules/engine/core/3rdparty/singleton.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -template -class Singleton{ -protected: - inline static T* ms_Singleton = nullptr; -public: - explicit Singleton() { - ms_Singleton = static_cast(this); - } - ~Singleton() { - ms_Singleton = nullptr; - } - static T* Ptr(void) { - return ms_Singleton; - } -}; \ No newline at end of file diff --git a/engine/modules/engine/core/impl/file_manager_impl.inl b/engine/modules/engine/core/impl/file_manager_impl.inl index 959ed60..12959ff 100644 --- a/engine/modules/engine/core/impl/file_manager_impl.inl +++ b/engine/modules/engine/core/impl/file_manager_impl.inl @@ -10,6 +10,7 @@ namespace zlog { } } namespace api { + SINGLETON_DEFINE(FileManager) class FileManagerImpl { public: @@ -77,7 +78,7 @@ namespace api { FileManagerImpl::FileManagerImpl() { Mount("exe", fs::GetExecutablePath()); - Mount("engine", fs::GetWorkPath()); + Mount("work", fs::GetWorkPath()); LoadFileMap(); } FileManagerImpl::~FileManagerImpl() @@ -113,6 +114,7 @@ namespace api { FileManager::FileManager() { impl = new(GlobalPool()) FileManagerImpl(); + SINGLETON_VAL() } FileManager::~FileManager() { diff --git a/engine/modules/engine/core/include/module/module.inl b/engine/modules/engine/core/include/module/module.inl index 6415206..7f2b627 100644 --- a/engine/modules/engine/core/include/module/module.inl +++ b/engine/modules/engine/core/include/module/module.inl @@ -1,19 +1,5 @@ namespace api { - template - class ISystem : public ISubSystem { - protected: - inline static T* ms_system = nullptr; - public: - explicit ISystem() { - ms_system = static_cast(this); - } - ~ISystem() override{ - ms_system = nullptr; - } - static constexpr T* Ptr(void) { - return ms_system; - } - }; + using ISystem = ISubSystem; template struct ModuleRegistrantImpl; struct IDynamicModule : public IModule { diff --git a/engine/modules/engine/core/include/os/file_manager.h b/engine/modules/engine/core/include/os/file_manager.h index e22977b..942cf30 100644 --- a/engine/modules/engine/core/include/os/file_manager.h +++ b/engine/modules/engine/core/include/os/file_manager.h @@ -1,12 +1,12 @@ #pragma once -#include "singleton.h" #include "package_path.h" namespace api { class FileManagerImpl; - class CORE_API FileManager : public Singleton + class CORE_API FileManager { FileManagerImpl* impl; + SINGLETON_API_PTR(FileManager) public: FileManager(); ~FileManager(); diff --git a/engine/modules/engine/render/impl/renderapi_impl.inl b/engine/modules/engine/render/impl/renderapi_impl.inl index b7ad8e0..4e2a602 100644 --- a/engine/modules/engine/render/impl/renderapi_impl.inl +++ b/engine/modules/engine/render/impl/renderapi_impl.inl @@ -1,7 +1,7 @@ #include "render/renderapi.h" #include "render/module.h" namespace api { - RenderAPI* API; + SINGLETON_DEFINE(RenderAPI) IMPLEMENT_STATIC_MODULE(RENDER_API, RenderModule, render); void RenderAPI::RenderView(FRenderView& view) { @@ -18,13 +18,10 @@ namespace api { } RenderAPI::RenderAPI(RenderContext* ctx) : context(*ctx) { - API = this; + SINGLETON_VAL(); } RenderAPI::~RenderAPI() { delete& context; } - RenderAPI* RenderAPI::Ptr() { - return API; - } } \ No newline at end of file diff --git a/engine/modules/engine/render/impl/window_impl.inl b/engine/modules/engine/render/impl/window_impl.inl index 0edce80..d097ebb 100644 --- a/engine/modules/engine/render/impl/window_impl.inl +++ b/engine/modules/engine/render/impl/window_impl.inl @@ -1,7 +1,9 @@ #include "render/window.h" namespace api { + SINGLETON_DEFINE(Window) inline Window::Window(CreatePFN createPFN, const Args& args, int width, int height) noexcept : mHeight(height), mWidth(width) { + SINGLETON_VAL(); uint32_t windowFlags = args.windowFlags | SDL_WINDOW_SHOWN; windowFlags |= args.resizeable ? SDL_WINDOW_RESIZABLE : 0; windowFlags |= args.headless ? SDL_WINDOW_HIDDEN : 0; diff --git a/engine/modules/engine/render/include/render/asset/material.h b/engine/modules/engine/render/include/render/asset/material.h index 2136982..4893ccd 100644 --- a/engine/modules/engine/render/include/render/asset/material.h +++ b/engine/modules/engine/render/include/render/asset/material.h @@ -15,5 +15,8 @@ namespace api { RscHandle GetShader() { return mShader; } + void SetShader(RscHandle shader) { + mShader = shader; + } }; }; \ No newline at end of file diff --git a/engine/modules/engine/render/include/render/asset/shader.h b/engine/modules/engine/render/include/render/asset/shader.h index 387ddef..316be4d 100644 --- a/engine/modules/engine/render/include/render/asset/shader.h +++ b/engine/modules/engine/render/include/render/asset/shader.h @@ -21,5 +21,11 @@ namespace api { RscHandle GetFragHandle() { return mFrag; } + void SetVertHandle(RscHandle vert) { + mVert = vert; + } + void SetFragHandle(RscHandle frag) { + mFrag = frag; + } }; }; \ No newline at end of file diff --git a/engine/modules/engine/render/include/render/renderapi.h b/engine/modules/engine/render/include/render/renderapi.h index 37482f5..3e0c296 100644 --- a/engine/modules/engine/render/include/render/renderapi.h +++ b/engine/modules/engine/render/include/render/renderapi.h @@ -1,5 +1,4 @@ #pragma once -#include "singleton.h" #include "pmr/frame_allocator.h" #include "render_context.h" #include "graph/frame_graph.h" @@ -14,12 +13,12 @@ namespace api { FrameGraph graph; RenderAPI(RenderContext* ctx); virtual ~RenderAPI(); + SINGLETON_API_PTR(RenderAPI) public: void* operator new(size_t size) { return ::operator new(size, GlobalPool()); } void operator delete(void* p) {} - static RenderAPI* Ptr(); public: virtual void Init() = 0; diff --git a/engine/modules/engine/render/include/render/tool/glsl_to_spirv.h b/engine/modules/engine/render/include/render/tool/glsl_to_spirv.h new file mode 100644 index 0000000..b666c13 --- /dev/null +++ b/engine/modules/engine/render/include/render/tool/glsl_to_spirv.h @@ -0,0 +1,16 @@ +#pragma once +#include "pmr/name.h" +#include +#include +namespace api +{ + using pmr::Name; + using std::optional; + using std::string_view; + class GlslToSpirv + { + public: + static shaderc_shader_kind GetShaderKind(Name name); + static optional> ToSpirv(const pmr::string& glsl, shaderc_shader_kind kind, string_view code_id = "unknown_shader"); + }; +} \ No newline at end of file diff --git a/engine/modules/engine/render/include/render/window.h b/engine/modules/engine/render/include/render/window.h index 601d07e..4297b18 100644 --- a/engine/modules/engine/render/include/render/window.h +++ b/engine/modules/engine/render/include/render/window.h @@ -1,9 +1,8 @@ #pragma once #include -#include "singleton.h" #include "pmr/frame_allocator.h" namespace api { - class RENDER_API Window : public Singleton { + class RENDER_API Window { protected: using CreatePFN = decltype(&SDL_CreateWindow); int mWidth; @@ -15,6 +14,7 @@ namespace api { bool resizeable = true; bool headless = false; }; + SINGLETON_API_PTR(Window) public: void* operator new(size_t size) { return ::operator new(size, GlobalPool()); diff --git a/engine/modules/engine/render/src/pass/demo_pass.cpp b/engine/modules/engine/render/src/pass/demo_pass.cpp index 3605af8..c23080b 100644 --- a/engine/modules/engine/render/src/pass/demo_pass.cpp +++ b/engine/modules/engine/render/src/pass/demo_pass.cpp @@ -1,8 +1,20 @@ #include "render/pass/demo_pass.h" - +#include "render/asset/shader.h" +#include "render/asset/material.h" +#include "render/renderapi.h" +#include "asset/resource_system.h" namespace api { bool DemoPass::Setup(FrameGraph& graph, FrameGraph::RenderPassBuilder& builder) { + static RscHandle shader; + if (!shader) { + shader = ResourceSystem::Ptr()->LoadEmplaceResource(); + auto vert = ResourceSystem::Ptr()->Load("/engine/assets/shader/simple.frag"); + auto frag = ResourceSystem::Ptr()->Load("/engine/assets/shader/simple.frag"); + shader->SetVertHandle(vert); + shader->SetFragHandle(frag); + RenderAPI::Ptr()->LoadShader(*shader); + } AttachmentDesc surface{}; surface.FromTexture(graph.mSurface); surface.colorFormat = TinyImageFormat_B8G8R8A8_SRGB; diff --git a/engine/modules/engine/render/src/tool/glsl_to_spirv.cpp b/engine/modules/engine/render/src/tool/glsl_to_spirv.cpp new file mode 100644 index 0000000..4b82cdb --- /dev/null +++ b/engine/modules/engine/render/src/tool/glsl_to_spirv.cpp @@ -0,0 +1,39 @@ +#include "render/tool/glsl_to_spirv.h" +#include +#include "zlog.h" +namespace api +{ + optional> GlslToSpirv::ToSpirv(const pmr::string& glsl, shaderc_shader_kind kind, string_view code_id) + { + optional> spirv_out{FramePool()}; + { + shaderc::Compiler compiler; + shaderc::CompileOptions options; + options.SetOptimizationLevel(shaderc_optimization_level_performance); + options.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_3); + auto result = compiler.CompileGlslToSpv(glsl.data(), kind, code_id.data(), options); + if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) { + auto err_m = result.GetErrorMessage(); + auto err_msg = err_m.c_str(); + zlog::error("load spirv failed!!! {}", err_msg); + return spirv_out; + } + spirv_out = pmr::vector{ result.cbegin(),result.cend() }; + } + return spirv_out; + } + using pmr::string_hash; + shaderc_shader_kind GlslToSpirv::GetShaderKind(Name name) + { + switch (name.Hash()) + { + case string_hash(".vert"): return shaderc_shader_kind::shaderc_vertex_shader; + case string_hash(".geom"): return shaderc_shader_kind::shaderc_geometry_shader; + case string_hash(".tese"): return shaderc_shader_kind::shaderc_tess_evaluation_shader; + case string_hash(".tesc"): return shaderc_shader_kind::shaderc_tess_control_shader; + case string_hash(".frag"): return shaderc_shader_kind::shaderc_fragment_shader; + default: return shaderc_shader_kind::shaderc_miss_shader; + } + } + +} diff --git a/engine/modules/engine/render/xmake.lua b/engine/modules/engine/render/xmake.lua index de7c9ba..1e2d34b 100644 --- a/engine/modules/engine/render/xmake.lua +++ b/engine/modules/engine/render/xmake.lua @@ -2,6 +2,6 @@ static_component("render","engine") add_includedirs("3rdparty", {public = true}) add_headerfiles("include/**.h", "include/**.inl", "impl/*.inl") add_files("src/**.cpp") - add_deps("asset", "zlib", "core") + add_deps("asset", "zlib", "core","shaderc") add_syslinks("user32", {public = true}) add_packages("lemon", "libsdl", {public = true}) \ No newline at end of file diff --git a/engine/modules/engine/singleton/include/singleton.h b/engine/modules/engine/singleton/include/singleton.h new file mode 100644 index 0000000..6a3b926 --- /dev/null +++ b/engine/modules/engine/singleton/include/singleton.h @@ -0,0 +1,92 @@ +#pragma once +#include +#include +namespace singleapi { + namespace pmr { + using std::pmr::unsynchronized_pool_resource; + using std::pmr::unordered_map; + }; + struct MemoryInfo { + void* data; + bool isAlive; + static pmr::unsynchronized_pool_resource* Pool(); + static void* Allocate(size_t size, size_t align) { + return Pool()->allocate(size, align); + } + }; + class SINGLETON_API GlobalManager { + public: + MemoryInfo GetInstance(size_t hash, size_t size, size_t align = 8) { + auto it = instances.find(hash); + if (it == instances.end()) { + void* data = MemoryInfo::Allocate(size, align); + instances.emplace(hash, MemoryInfo{data, true}); + return MemoryInfo{ data, false }; + } + bool isAlive = it->second.isAlive; + it->second.isAlive = true; + return MemoryInfo{ it->second.data, isAlive }; + } + void* KillInstance(size_t hash) { + auto it = instances.find(hash); + if (it != instances.end()) { + it->second.isAlive = false; + } + return nullptr; + } + GlobalManager(pmr::unsynchronized_pool_resource* pool) : instances{pool} {} + ~GlobalManager() {} + static GlobalManager* Ptr(); + private: + pmr::unordered_map instances; + }; +} +template +class UniquePtr { +protected: + inline static T* ms_Singleton = nullptr; +public: + template + UniquePtr(Args&&... args) { + using namespace singleapi; + MemoryInfo info{}; + if constexpr (hash == 0) { + size_t tHash = typeid(T).hash_code(); + info = GlobalManager::Ptr()->GetInstance(tHash, sizeof(T)); + } + else { + info = GlobalManager::Ptr()->GetInstance(hash, sizeof(T)); + } + if (info.isAlive) { + ms_Singleton = (T*)info.data; + } + else { + ms_Singleton = new(info.data)T(std::forward(args)...); + } + } + ~UniquePtr() { + using namespace singleapi; + if (ms_Singleton) { + ms_Singleton->~T(); + } + if constexpr (hash == 0) { + size_t tHash = typeid(T).hash_code(); + ms_Singleton = (T*)GlobalManager::Ptr()->KillInstance(tHash); + } + else { + ms_Singleton = (T*)GlobalManager::Ptr()->KillInstance(hash); + } + } + static T* Ptr(void) { + return ms_Singleton; + } +}; +#define SINGLETON_API_PTR(T) \ +protected:\ + static T* ms_Singleton;\ +public:\ + static T* Ptr(void); +#define SINGLETON_DEFINE(T) T* T::ms_Singleton = nullptr;\ + T* T::Ptr(){ return ms_Singleton; } + +#define SINGLETON_VAL() ms_Singleton = this; \ No newline at end of file diff --git a/engine/modules/engine/singleton/src/singleton.cpp b/engine/modules/engine/singleton/src/singleton.cpp new file mode 100644 index 0000000..c799396 --- /dev/null +++ b/engine/modules/engine/singleton/src/singleton.cpp @@ -0,0 +1,13 @@ +#include "singleton.h" + +namespace singleapi { + pmr::unsynchronized_pool_resource* MemoryInfo::Pool() { + static pmr::unsynchronized_pool_resource pool; + return &pool; + } + GlobalManager* GlobalManager::Ptr() + { + static GlobalManager globalManager{ MemoryInfo::Pool()}; + return &globalManager; + } +} diff --git a/engine/modules/engine/singleton/xmake.lua b/engine/modules/engine/singleton/xmake.lua new file mode 100644 index 0000000..9eec785 --- /dev/null +++ b/engine/modules/engine/singleton/xmake.lua @@ -0,0 +1,7 @@ +target("singleton") + set_kind("shared") + set_group("Engine/engine__comp") + add_rules("engine.api") + add_includedirs("include", {public = true}) + add_headerfiles("include/*.h") + add_files("src/*.cpp") \ No newline at end of file diff --git a/engine/modules/engine/zlib/include/pmr/memory.inl b/engine/modules/engine/zlib/include/pmr/memory.inl index 2d9c97d..30a3fc1 100644 --- a/engine/modules/engine/zlib/include/pmr/memory.inl +++ b/engine/modules/engine/zlib/include/pmr/memory.inl @@ -1,21 +1,37 @@ #pragma once -//全局生命周期,不回收内存 -ZLIB_API extern pmr::FrameAllocatorPool* GlobalPool(); -//局部生命周期,每帧回收内存 -ZLIB_API extern pmr::FrameAllocatorPool* FramePool(); +#include "singleton.h" +namespace pmr { + constexpr inline size_t string_hash(std::string_view str) noexcept + { + constexpr size_t fnv_offset_basis = 0xcbf29ce484222325; + constexpr size_t fnv_prime = 0x100000001b3; + auto hash = fnv_offset_basis; + for (auto& elem : str) + { + hash *= fnv_prime; + hash ^= elem; + } + hash *= fnv_prime; + hash ^= 0; + + return hash; + } +} +//全局生命周期,不回收内存 +inline UniquePtr GlobalPoolPtr; +//局部生命周期,每帧回收内存 +inline UniquePtr FramePoolPtr; +inline pmr::FrameAllocatorPool* GlobalPool() { + return GlobalPoolPtr.Ptr(); +} +inline pmr::FrameAllocatorPool* FramePool() { + return FramePoolPtr.Ptr(); +} extern void* operator new(std::size_t size); extern void operator delete(void* ptr) noexcept; extern void* operator new(std::size_t size, std::align_val_t align); #ifdef ZLIB_API_VAL -ZLIB_API inline pmr::FrameAllocatorPool* GlobalPool() { - static pmr::FrameAllocatorPool globalPool; - return &globalPool; -} -ZLIB_API inline pmr::FrameAllocatorPool* FramePool() { - static pmr::FrameAllocatorPool framePool; - return &framePool; -} struct MemDetail { int count{ 0 }; int new_count{ 0 }; diff --git a/engine/modules/engine/zlib/include/pmr/name.h b/engine/modules/engine/zlib/include/pmr/name.h index 3063928..43c45c7 100644 --- a/engine/modules/engine/zlib/include/pmr/name.h +++ b/engine/modules/engine/zlib/include/pmr/name.h @@ -7,7 +7,6 @@ namespace pmr using table = std::pmr::unordered_map; using std::pmr::string; static consteval inline size_t InvalidValue() noexcept { return static_cast(-1); } - constexpr inline size_t string_hash(std::string_view str) noexcept; struct Name { private: size_t hash; @@ -61,22 +60,6 @@ namespace pmr std::hash hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } - constexpr inline size_t string_hash(std::string_view str) noexcept - { - constexpr size_t fnv_offset_basis = 0xcbf29ce484222325; - constexpr size_t fnv_prime = 0x100000001b3; - - auto hash = fnv_offset_basis; - for (auto& elem : str) - { - hash *= fnv_prime; - hash ^= elem; - } - hash *= fnv_prime; - hash ^= 0; - - return hash; - } consteval static CName FName(std::string_view view) { return CName{ view }; }; } namespace std { diff --git a/engine/modules/engine/zlib/include/pmr/name.inl b/engine/modules/engine/zlib/include/pmr/name.inl index 84496e7..8801652 100644 --- a/engine/modules/engine/zlib/include/pmr/name.inl +++ b/engine/modules/engine/zlib/include/pmr/name.inl @@ -1,13 +1,9 @@ namespace pmr { using NameTable_t = table; - ZLIB_API extern NameTable_t& TableRef(); -#ifdef ZLIB_API_VAL - ZLIB_API inline NameTable_t& TableRef() { - static NameTable_t Table; - return Table; + inline NameTable_t& TableRef() { + static UniquePtr Table; + return *Table.Ptr(); } -#endif // ZLIB_API_VAL - struct NameTable { static const string& Find(size_t id); template diff --git a/engine/modules/engine/zlib/include/refl/detail/uclass.inl b/engine/modules/engine/zlib/include/refl/detail/uclass.inl index a9ec38a..4f2c1d4 100644 --- a/engine/modules/engine/zlib/include/refl/detail/uclass.inl +++ b/engine/modules/engine/zlib/include/refl/detail/uclass.inl @@ -40,11 +40,9 @@ namespace refl { } }; - ZLIB_API extern table ClassTable; -#ifdef ZLIB_API_VAL - ZLIB_API inline table ClassTable; -#endif // ZLIB_API_VAL + inline UniquePtr, string_hash("refl::ClassTable")> ClassTablePtr; inline const UClass* find_info(Name name) { + auto& ClassTable = *ClassTablePtr.Ptr(); if (auto it = ClassTable.find(name); it != ClassTable.end()) { return it->second; } @@ -68,6 +66,7 @@ namespace refl { else { cls = new(GlobalPool()) UClass_Auto{}; } + auto& ClassTable = *ClassTablePtr.Ptr(); ClassTable[name.View()] = cls; return cls; } diff --git a/engine/modules/render/vulkan/include/vkn/loader/vulkan_glsl_loader.h b/engine/modules/render/vulkan/include/vkn/loader/vulkan_glsl_loader.h new file mode 100644 index 0000000..d91bb2b --- /dev/null +++ b/engine/modules/render/vulkan/include/vkn/loader/vulkan_glsl_loader.h @@ -0,0 +1,22 @@ +#pragma once +#include "render/asset/shader.h" +#include "asset/resource_system.h" +#include "vkn/vulkan_api.h" +namespace vkn { + class vkShaderProgram : public api::ShaderProgram { + private: + VkShaderModule mPtr; + public: + VkShaderModule Ptr() { + return mPtr; + } + void Load(const pmr::vector& spirv); + }; + class VulkanGlslLoader : public api::IFileLoader + { + inline static table ShaderTable; + public: + static void Init(); + api::ResourceBundle LoadFile(api::PackagePath handle, const api::MetaBundle& meta) override; + }; +} \ No newline at end of file diff --git a/engine/modules/render/vulkan/include/vkn/vulkan_api.h b/engine/modules/render/vulkan/include/vkn/vulkan_api.h index afea79a..a23ac87 100644 --- a/engine/modules/render/vulkan/include/vkn/vulkan_api.h +++ b/engine/modules/render/vulkan/include/vkn/vulkan_api.h @@ -28,7 +28,6 @@ namespace vkn { table FramebufferCache; public: VulkanAPI(); - void Init() override; void Shutdown() override; diff --git a/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp b/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp new file mode 100644 index 0000000..222704b --- /dev/null +++ b/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp @@ -0,0 +1,51 @@ +#include "vkn/loader/vulkan_glsl_loader.h" +#include "vkn/vulkan_api.h" +#include "vkn/wrapper/device.h" +#include "render/tool/glsl_to_spirv.h" +#include "render/asset/vertex.h" +#include "os/file_handle.h" +using namespace api; +namespace vkn { + void VulkanGlslLoader::Init() + { + //REGISTER_META_TABLE(PosVertex); + //REGISTER_META_TABLE(TexVertex); + //REGISTER_META_TABLE(BoneVertex); + ResourceSystem::Ptr()->RegisterLoader(".geom"); + ResourceSystem::Ptr()->RegisterLoader(".frag"); + ResourceSystem::Ptr()->RegisterLoader(".vert"); + } + ResourceBundle VulkanGlslLoader::LoadFile(PackagePath path, const MetaBundle& meta) + { + auto m = meta.FetchMeta(); + auto program = m ? ResourceSystem::Ptr()->LoadEmplaceResource(m->guid) + : ResourceSystem::Ptr()->LoadEmplaceResource(); + FileHandle handle(path); + if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) { + return program; + } + if (mFileFlag & FileFlag::File_Binary) { + pmr::vector data = handle.ReadAll(); + pmr::vector spirv(data.size() / 4); + std::memcpy(spirv.data(), data.data(), data.size()); + program->Load(spirv); + //LoadShaderInfo(program->GetGuid(), spirv); + } + else { + pmr::string glsl = handle.ReadAll(); + auto shader_kind = GlslToSpirv::GetShaderKind(path.GetExtension().ToStringView()); + auto spirv = GlslToSpirv::ToSpirv(glsl, shader_kind, path.GetFileName()); + if (spirv) { + program->Load(*spirv); + //LoadShaderInfo(program->GetGuid(), *spirv); + } + } + return program; + } + void vkShaderProgram::Load(const pmr::vector& spirv) + { + VulkanAPI* API = VulkanAPI::Ptr(); + mPtr = API->GetBackend().GetDevice().CreateShaderModule(spirv); + } +} + diff --git a/engine/modules/render/vulkan/src/module.cpp b/engine/modules/render/vulkan/src/module.cpp index a5081ab..c15c5c5 100644 --- a/engine/modules/render/vulkan/src/module.cpp +++ b/engine/modules/render/vulkan/src/module.cpp @@ -1,8 +1,10 @@ #include "vkn/module.h" +#include "vkn/loader/vulkan_glsl_loader.h" #include "pmr/frame_allocator.h" +using namespace vkn; void VulkanModule::OnLoad(int argc, char** argv) { - + VulkanGlslLoader::Init(); } void VulkanModule::OnUnload() diff --git a/engine/modules/xmake.lua b/engine/modules/xmake.lua index fb7805d..f4d73b2 100644 --- a/engine/modules/xmake.lua +++ b/engine/modules/xmake.lua @@ -7,6 +7,7 @@ function header_component(name, owner, opt) set_group("Engine/"..owner.."__comp") add_rules("engine.api") add_includedirs("include", {public = true}) + add_deps("singleton") end function static_component(name, owner, opt) target(owner) @@ -18,6 +19,7 @@ function static_component(name, owner, opt) add_rules("engine.api") add_includedirs("include", {public = true}) add_includedirs("impl") + add_deps("singleton") end function shared_module(name, owner, opt) target(name) diff --git a/game/zworld/xmake.lua b/game/zworld/xmake.lua index 670ffe8..5186946 100644 --- a/game/zworld/xmake.lua +++ b/game/zworld/xmake.lua @@ -1,8 +1,9 @@ game_instance("zworld", "src/zworld.h") target("zworld") + set_rundir(".") add_files("src/*.cpp") add_headerfiles("src/*.h") - add_deps("engine", "editor", "vulkan", {public = true}) + add_dependency("engine", "editor", "vulkan", {public = true}) target("zworld-editor") add_files("editor/*.cpp") add_headerfiles("editor/*.h")