From b4028d719f5bdc302c39325df196a89b5b50dfe4 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Fri, 22 Nov 2024 22:26:06 +0800 Subject: [PATCH] yaml bugfix --- engine/assets/shader/simple.frag.meta | 6 +- engine/assets/shader/simple.vert.meta | 8 +- engine/include/engine.natvis | 14 ++ .../asset/impl/resource_system_impl.inl | 1 + engine/modules/engine/asset/src/module.cpp | 2 + .../engine/core/include/archive/register.inl | 1 + .../engine/core/include/archive/yaml.h | 4 +- .../core/include/archive/yaml/serialize.inl | 130 +++++++++++++++++- .../engine/render/src/pass/demo_pass.cpp | 2 +- engine/modules/engine/zlib/include/pmr/name.h | 6 +- .../modules/engine/zlib/include/pmr/name.inl | 7 +- .../engine/zlib/include/refl/detail/any.h | 11 +- .../engine/zlib/include/refl/detail/any.inl | 31 +++++ .../zlib/include/refl/detail/container.inl | 5 + .../vulkan/src/loader/vulkan_glsl_loader.cpp | 3 + engine/xmake.lua | 1 + engine/xmake/rule_plugin/xmake.lua | 2 +- 17 files changed, 216 insertions(+), 18 deletions(-) create mode 100644 engine/include/engine.natvis diff --git a/engine/assets/shader/simple.frag.meta b/engine/assets/shader/simple.frag.meta index 226bff8..da33eac 100644 --- a/engine/assets/shader/simple.frag.meta +++ b/engine/assets/shader/simple.frag.meta @@ -2,5 +2,9 @@ metadatas: - guid: 2b4239ff-796a-4b55-9d8f-272c80a16b17 name: "" t_hash: api::ShaderProgram - meta: ~ + meta: + __class__: api::ShaderProgram + __data__: + mOwner: + guid: 3585c167-9cff-4327-88db-d07601382640 includes: ~ \ No newline at end of file diff --git a/engine/assets/shader/simple.vert.meta b/engine/assets/shader/simple.vert.meta index d4f9f81..347aa53 100644 --- a/engine/assets/shader/simple.vert.meta +++ b/engine/assets/shader/simple.vert.meta @@ -1,6 +1,10 @@ metadatas: - - guid: d05a5912-57ef-4447-b9cc-1e117c083ef3 + - guid: 3890e4a2-7b6c-47d3-9bd2-578a50f8d684 name: "" t_hash: api::ShaderProgram - meta: ~ + meta: + __class__: api::ShaderProgram + __data__: + mOwner: + guid: 3585c167-9cff-4327-88db-d07601382640 includes: ~ \ No newline at end of file diff --git a/engine/include/engine.natvis b/engine/include/engine.natvis new file mode 100644 index 0000000..d575aad --- /dev/null +++ b/engine/include/engine.natvis @@ -0,0 +1,14 @@ + + + + + {{{Data1,nvoxb}-{Data2,nvoxb}-{Data3,nvoxb}-{Data4[0],nvoxb}{Data4[1],nvoxb}-{Data4[2],nvoxb}{Data4[3],nvoxb}{Data4[4],nvoxb}{Data4[5],nvoxb}{Data4[6],nvoxb}{Data4[7],nvoxb}}} + + + + {g_memory_blocks[(flag3_memory29 >> 16) % 0x2000] + 2*(flag3_memory29 % 0x10000) + 2,s} + + \ 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 fcadd00..dd5f88c 100644 --- a/engine/modules/engine/asset/impl/resource_system_impl.inl +++ b/engine/modules/engine/asset/impl/resource_system_impl.inl @@ -140,6 +140,7 @@ namespace api { return; } auto& res = it->second; + res.MetaDirty(true); mDirtyBlock.push_back(&res); } void ResourceSystemImpl::SaveDirtyFile() diff --git a/engine/modules/engine/asset/src/module.cpp b/engine/modules/engine/asset/src/module.cpp index 0ef90c5..a3e0022 100644 --- a/engine/modules/engine/asset/src/module.cpp +++ b/engine/modules/engine/asset/src/module.cpp @@ -1,11 +1,13 @@ #include "asset/module.h" #include "asset/resource_system.h" #include "asset/asset_loader.h" +#include "archive/pch.h" namespace api { void AssetModule::OnLoad(int argc, char** argv) { AddSystem(); AssetLoader::Init(); + TextArchive::Register(); } void AssetModule::OnUnload() { diff --git a/engine/modules/engine/core/include/archive/register.inl b/engine/modules/engine/core/include/archive/register.inl index d332339..9364515 100644 --- a/engine/modules/engine/core/include/archive/register.inl +++ b/engine/modules/engine/core/include/archive/register.inl @@ -1,4 +1,5 @@ #ifdef RegisterAny +RegisterAny(Name); RegisterAny(string_view); RegisterAny(int); RegisterAny(unsigned int); diff --git a/engine/modules/engine/core/include/archive/yaml.h b/engine/modules/engine/core/include/archive/yaml.h index d78d3f5..c55c568 100644 --- a/engine/modules/engine/core/include/archive/yaml.h +++ b/engine/modules/engine/core/include/archive/yaml.h @@ -4,11 +4,11 @@ namespace gen { template<> inline bool YamlRead(const YAML::Node& node, const refl::Any& t) { if (!node) return false; - return api::YamlArchive::Deserialize(node, t); + return api::YamlArchive::Deserialize(node, refl::Any{ &t, refl::meta_info() }); } template<> inline YAML::Node YamlWrite(const refl::Any& t) { - return api::YamlArchive::Serialize(t); + return api::YamlArchive::Serialize(refl::Any{&t, refl::meta_info()}); } } namespace YAML { diff --git a/engine/modules/engine/core/include/archive/yaml/serialize.inl b/engine/modules/engine/core/include/archive/yaml/serialize.inl index 84ffe7e..ab95365 100644 --- a/engine/modules/engine/core/include/archive/yaml/serialize.inl +++ b/engine/modules/engine/core/include/archive/yaml/serialize.inl @@ -19,16 +19,138 @@ namespace api { auto uclass = meta_info(); auto [bfind, it] = uclass->vtable.FindLast(VYamlSerdeRead()); if (!bfind && it) { - it = it->Insert(VYamlSerdeRead(), (void*)&gen::JsonSerde::Read); - it = it->Insert(VYamlSerdeWrite(), (void*)&gen::JsonSerde::Write); + it = it->Insert(VYamlSerdeRead(), (void*)&gen::YamlSerde::Read); + it = it->Insert(VYamlSerdeWrite(), (void*)&gen::YamlSerde::Write); } } inline YAML::Node YamlArchive::Serialize(Any any) { - return YAML::Node(); + if (!any) { + return YAML::Node(); + } + auto it_func = any.FindVtable(VYamlSerdeWrite()); + if (it_func) { + return it_func(any.ptr); + } + YAML::Node result; + if (any.cls == meta_info()) { + Any obj = any.CastTo(); + if (obj) { + result["__class__"] = obj.cls->name.ToStringView(); + result["__data__"] = Serialize(obj); + } + return result; + } + if (any.IsContainer()) { + refl::Container docker(any); + bool isMap = any.IsMap(); + auto fieldList = any.ContainerType()->GetFields(refl::FIND_ALL_MEMBER, Name("")); + for (auto obj : docker) { + if (isMap) { + Any first = obj.Member(fieldList[0]); + Any second = obj.Member(fieldList[1]); + result[Serialize(first)] = Serialize(second); + } + else { + result.push_back(Serialize(obj)); + } + } + return result; + } + if (any.IsArray()) { + int n = any.ArraySize(); + for (int i = 0; i < n; i++) { + result.push_back(Serialize(any.Member(i))); + } + return result; + } + if (Any p = any.Parent()) { + result["__parent__"] = Serialize(p); + } + auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, Name("")); + for (auto& field : fieldList) { + YAML::Node child = Serialize(any.Member(field)); + result[field.name.ToStringView()] = child; + } + return result; } - inline bool YamlArchive::Deserialize(const YAML::Node& node, Any any) + inline bool YamlArchive::Deserialize(const YAML::Node& res, Any any) { + if (!any) { + return false; + } + auto it_func = any.FindVtable(VYamlSerdeRead()); + if (it_func) { + return it_func(res, any.ptr); + } + if (any.cls == meta_info() && res) { + auto __class = res["__class__"]; + if (!__class) { + return false; + } + auto name = __class.Scalar(); + auto cls = refl::find_info(name); + if (cls) { + Any obj = cls->New(FramePool()); + *any.CastTo() = obj; + return Deserialize(res["__data__"], obj); + } + *any.CastTo() = {}; + return false; + } + if (any.IsContainer()) { + refl::Container docker(any); + docker.construct(); + Any any = docker.malloc(FramePool()); + bool isMap = res.IsMap() && any.IsMap(); + Any first, second; + if (isMap) { + auto fieldList = any.ContainerType()->GetFields(refl::FIND_ALL_MEMBER, Name("")); + first = any.Member(fieldList[0]); + second = any.Member(fieldList[1]); + } + for (auto it : res) { + if (isMap) { + Deserialize(it.first, first); + Deserialize(it.second, second); + } + else { + Deserialize(it, any); + } + docker.insert(any); + any.Destruct(); + } + return true; + } + if (res.IsSequence() && any.IsArray()) { + for (std::size_t i = 0; i < res.size(); i++) { + Deserialize(res[i], any.Member(i)); + } + return true; + } + if (res.IsMap() && any.IsObject()) { + auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, Name("")); + auto rt = res.begin(); + int diff = res.size() - fieldList.size(); + if (diff > 1 || (diff == 1 && !any.HasParent())) { + return false; + } + if (diff == 1) { + Deserialize(rt++->second, any.Parent()); + } + auto ft = fieldList.begin(); + for (; ft != fieldList.end() && rt != res.end(); ++ft, ++rt) { + if (ft->name != Name(rt->first.Scalar())) { + return false; + } + Deserialize(rt->second, any.Member(*ft)); + } + return true; + } + if (res.IsScalar() && any.IsObject()) { + const std::string& str = res.Scalar(); + return any.Construct(Any{ str }); + } return false; } } \ No newline at end of file diff --git a/engine/modules/engine/render/src/pass/demo_pass.cpp b/engine/modules/engine/render/src/pass/demo_pass.cpp index 81d87b6..b324acf 100644 --- a/engine/modules/engine/render/src/pass/demo_pass.cpp +++ b/engine/modules/engine/render/src/pass/demo_pass.cpp @@ -27,7 +27,7 @@ namespace api { void DemoPass::Execute(FrameGraph& graph, RenderPassContext& ctx) { if (!shader) { - shader = ResourceSystem::Ptr()->LoadEmplaceResource(); + shader = ResourceSystem::Ptr()->LoadEmplaceResource(Guid("3585c167-9cff-4327-88db-d07601382640")); shader->Name("api::PosVertex"); shader->ubName("api::ubSimple"); auto vert = ResourceSystem::Ptr()->Load("/engine/assets/shader/simple.vert"); diff --git a/engine/modules/engine/zlib/include/pmr/name.h b/engine/modules/engine/zlib/include/pmr/name.h index 63419ef..b551cdd 100644 --- a/engine/modules/engine/zlib/include/pmr/name.h +++ b/engine/modules/engine/zlib/include/pmr/name.h @@ -156,6 +156,7 @@ namespace pmr { static constexpr uint32_t ALIGN_BYTES = 2u; static constexpr uint32_t MAX_MEMORY_BLOCK_SIZE = (1u << 16u) * 2u; private: + std::array slotPoolArray; uint16_t currentMemoryBlockIndex; uint16_t currentMemoryBlockAlignedCursor; char* memoryBlockArray[MAX_MEMORY_BLOCK_ARRAY_SIZE]; @@ -167,9 +168,8 @@ namespace pmr { private: void CreateNewMemoryBlock(); }; - using tSlotPoolArray = std::array; - inline UNIQUER_STATIC(tSlotPoolArray, slotPoolArray, "pmr::name::slotPoolArray") - inline UNIQUER_STATIC(StringEntryMemoryManager, stringEntryMemoryManager, "pmr::name::stringEntryMemoryManager") + inline static char** g_memory_blocks = nullptr; + UNIQUER_INLINE_STATIC(StringEntryMemoryManager, stringEntryMemoryManager, "pmr::name::stringEntryMemoryManager") uint32_t flag3_memory29; public: Name()noexcept : flag3_memory29(0) {}; diff --git a/engine/modules/engine/zlib/include/pmr/name.inl b/engine/modules/engine/zlib/include/pmr/name.inl index 96ed3b7..8092918 100644 --- a/engine/modules/engine/zlib/include/pmr/name.inl +++ b/engine/modules/engine/zlib/include/pmr/name.inl @@ -75,7 +75,6 @@ namespace pmr { } inline Name::StringEntryMemoryManager::StringEntryMemoryManager() { - auto& slotPoolArray = UNIQUER_VAL(slotPoolArray); for (auto& slotPool : slotPoolArray) { slotPool.size = 0; @@ -83,6 +82,7 @@ namespace pmr { slotPool.slotArray = (Slot*)(xmalloc(SlotPool::SLOT_POOL_INITIALIZE_SIZE * sizeof(Slot))); std::memset(slotPool.slotArray, 0, SlotPool::SLOT_POOL_INITIALIZE_SIZE); } + g_memory_blocks = memoryBlockArray; currentMemoryBlockIndex = 0; currentMemoryBlockAlignedCursor = 0; memoryBlockArray[0] = (char*)(xmalloc(MAX_MEMORY_BLOCK_SIZE)); @@ -131,7 +131,8 @@ namespace pmr { return 0u; } HashInfo hashInfo(view); - auto& slotPool = UNIQUER_VAL(slotPoolArray)[0]; + auto& stringEntryMemoryManager = UNIQUER_VAL(stringEntryMemoryManager); + auto& slotPool = stringEntryMemoryManager.slotPoolArray[hashInfo.GetSlotPoolIndex()]; uint32_t slotValue = 0u; { std::unique_lock lock(slotPool.mutex); @@ -140,7 +141,7 @@ namespace pmr { if (!slot.IsUsed()) { slotPool.size++; - StringEntryHandle stringEntryHandle = UNIQUER_VAL(stringEntryMemoryManager).AllocateStringEntry(hashInfo.GetStringEntryHeader(), hashInfo.GetData()); + StringEntryHandle stringEntryHandle = stringEntryMemoryManager.AllocateStringEntry(hashInfo.GetStringEntryHeader(), hashInfo.GetData()); slot.Load(hashInfo.GetSlotHashProbe(), stringEntryHandle); } slotValue = slot.GetSlotValue(); diff --git a/engine/modules/engine/zlib/include/refl/detail/any.h b/engine/modules/engine/zlib/include/refl/detail/any.h index 5b53445..97d2737 100644 --- a/engine/modules/engine/zlib/include/refl/detail/any.h +++ b/engine/modules/engine/zlib/include/refl/detail/any.h @@ -41,16 +41,25 @@ namespace refl { template T FindVtable(Name name)const; bool Construct(span ArgsList) const; + void Destruct()const; Any New(pmr::memory_resource* pool)const; Any Member(const FieldPtr& field)const; Any Member(int i)const; Any Parent()const; - + + bool HasParent()const; bool IsArray()const; bool IsObject()const; bool IsContainer()const; bool IsSequence()const; bool IsMap()const; + const UClass* ContainerType()const; + int ArraySize()const; + void CopyTo(void* ptr)const; + void MoveTo(void* ptr)const { + CopyTo(ptr); + Destruct(); + } }; } \ No newline at end of file diff --git a/engine/modules/engine/zlib/include/refl/detail/any.inl b/engine/modules/engine/zlib/include/refl/detail/any.inl index 8db21be..b22c958 100644 --- a/engine/modules/engine/zlib/include/refl/detail/any.inl +++ b/engine/modules/engine/zlib/include/refl/detail/any.inl @@ -2,6 +2,10 @@ #include "uclass.h" #include "convert.h" namespace refl{ + inline bool Any::HasParent() const + { + return cls->flag & CLASS_PARENT_FLAG; + } inline bool Any::IsArray() const { return cls->flag & CLASS_ARRAY_FLAG; @@ -22,6 +26,29 @@ namespace refl{ { return cls->flag & CLASS_MAP_FLAG; } + inline const UClass* Any::ContainerType() const + { + if (IsContainer()) { + return cls->parent; + } + return nullptr; + } + inline int Any::ArraySize() const + { + if (cls->flag & CLASS_ARRAY_FLAG) { + return cls->size / cls->parent->size; + } + return 0; + } + inline void Any::CopyTo(void* ptr) const + { + Any to{ ptr, cls }; + auto fieldList = cls->GetFields(refl::FIND_ALL_MEMBER, Name("")); + for (auto field : fieldList) { + Any obj = to.Member(field); + Convert::Construct(obj, Member(field)); + } + } inline bool Any::Check(const UClass* parent)const { if (cls == parent) { @@ -36,6 +63,10 @@ namespace refl{ { return cls->Construct((void*)ptr, ArgsList); } + inline void Any::Destruct() const + { + cls->Destruct((void*)ptr); + } inline Any Any::New(pmr::memory_resource* pool) const { void* data = pool->allocate(cls->size); diff --git a/engine/modules/engine/zlib/include/refl/detail/container.inl b/engine/modules/engine/zlib/include/refl/detail/container.inl index be3f7ea..a26b627 100644 --- a/engine/modules/engine/zlib/include/refl/detail/container.inl +++ b/engine/modules/engine/zlib/include/refl/detail/container.inl @@ -12,6 +12,11 @@ namespace refl { operator Any()const{ return Any{ ptr, cls }; } + Any malloc(pmr::memory_resource* alloc)const { + void* it = alloc->allocate(cls->parent->size); + cls->Construct(it); + return Any{ it, cls }; + } span GetFields() { return cls->parent->GetFields(EFieldFind::FIND_ALL_MEMBER, Name("")); } diff --git a/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp b/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp index e80167e..9f640b0 100644 --- a/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp +++ b/engine/modules/render/vulkan/src/loader/vulkan_glsl_loader.cpp @@ -26,6 +26,9 @@ namespace vkn { auto shader_stage = GlslToSpirv::GetShaderStage(shader_kind); auto program = m ? ResourceSystem::Ptr()->LoadEmplaceResource(m->guid, shader_stage) : ResourceSystem::Ptr()->LoadEmplaceResource(shader_stage); + if (m && m->meta) { + m->meta.MoveTo(program.Ptr()); + } FileHandle handle(path); if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) { return program; diff --git a/engine/xmake.lua b/engine/xmake.lua index aa99536..04edaf1 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -7,6 +7,7 @@ target("editor") add_files("src/editor/*.cpp") target("engine") add_defines("ENGINE_ROOT="..os.curdir():gsub("\\", "\\\\"),{public = false}) + add_headerfiles("include/*.natvis") add_includedirs("include", {public = true}) set_kind("shared") set_group("Engine") diff --git a/engine/xmake/rule_plugin/xmake.lua b/engine/xmake/rule_plugin/xmake.lua index e87a77a..cbdddc1 100644 --- a/engine/xmake/rule_plugin/xmake.lua +++ b/engine/xmake/rule_plugin/xmake.lua @@ -3,6 +3,6 @@ rule("engine.plugin") on_config(function (target) import("make_plugin") local file = target:extraconf("rules", "engine.plugin", "file") - make_plugin(target, file or "module.h") + --make_plugin(target, file or "module.h") end) \ No newline at end of file