diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index d3e0e752..c3b7f438 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -1205,16 +1205,16 @@ namespace LINE(MakeCustomActionCall(member->m_post_load_action.get())) } } - else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure && computations.IsInRuntimeBlock()) + else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure) { - LINEF("const auto runtimeArraySize = static_cast({0});", MakeEvaluation(modifier.GetArrayPointerCountEvaluation())) - LINEF("const auto runtimeFill = m_stream.LoadWithFill({0} * runtimeArraySize);", member->m_member->m_type_declaration->m_type->GetSize()) - LINE("for (auto i = 0uz; i < runtimeArraySize; i++)") + LINEF("const auto fillArraySize = static_cast({0});", MakeEvaluation(modifier.GetArrayPointerCountEvaluation())) + LINEF("const auto fill = m_stream.LoadWithFill({0} * fillArraySize);", member->m_member->m_type_declaration->m_type->GetSize()) + LINE("for (auto i = 0uz; i < fillArraySize; i++)") LINE("{") m_intendation++; - LINEF("{0} = &{1}[i];", MakeTypeVarName(member->m_member->m_type_declaration->m_type), MakeMemberAccess(info, member, modifier)) - LINEF("FillStruct_{0}(runtimeFill.AtOffset(i * {1}));", - MakeSafeTypeName(member->m_member->m_type_declaration->m_type), + LINEF("{0} = &{1}[i];", MakeTypeVarName(member->m_type->m_definition), MakeMemberAccess(info, member, modifier)) + LINEF("FillStruct_{0}(fill.AtOffset(i * {1}));", + MakeSafeTypeName(member->m_type->m_definition), member->m_member->m_type_declaration->m_type->GetSize()) m_intendation--; LINE("}") @@ -1378,7 +1378,7 @@ namespace LINE(MakeCustomActionCall(member->m_post_load_action.get())) } } - else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure && computations.IsInRuntimeBlock()) + else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure) { LINEF("{0} = {1};", MakeTypeVarName(member->m_member->m_type_declaration->m_type), MakeMemberAccess(info, member, modifier)) LINEF("FillStruct_{0}(m_stream.LoadWithFill({1}));", diff --git a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp index 02f9c444..169efdf6 100644 --- a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp +++ b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp @@ -34,6 +34,7 @@ using namespace IW3; ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) : ContentLoaderBase(zone, stream), + varXAssetList(nullptr), varXAsset(nullptr), varScriptStringList(nullptr) { @@ -41,16 +42,17 @@ ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) void ContentLoader::LoadScriptStringList(const bool atStreamStart) { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - - if (atStreamStart) - m_stream.Load(varScriptStringList); + assert(!atStreamStart); if (varScriptStringList->strings != nullptr) { assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING); - varScriptStringList->strings = m_stream.Alloc(alignof(const char*)); +#ifdef ARCH_x86 + varScriptStringList->strings = m_stream.Alloc(4); +#else + varScriptStringList->strings = m_stream.AllocOutOfBlock(4, varScriptStringList->count); +#endif varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); @@ -58,8 +60,6 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) m_zone.m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } - m_stream.PopBlock(); - assert(m_zone.m_script_strings.Count() <= SCR_STRING_MAX + 1); } @@ -125,21 +125,50 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count assert(varXAsset != nullptr); if (atStreamStart) + { +#ifdef ARCH_x86 m_stream.Load(varXAsset, count); +#else + const auto fill = m_stream.LoadWithFill(8u * count); + + for (size_t index = 0; index < count; index++) + { + fill.Fill(varXAsset[index].type, 8u * index); + fill.FillPtr(varXAsset[index].header.data, 8u * index + 4u); + m_stream.AddPointerLookup(&varXAsset[index].header.data, fill.BlockBuffer(8u * index + 4u)); + } +#endif + } for (size_t index = 0; index < count; index++) { LoadXAsset(false); varXAsset++; + +#ifdef DEBUG_OFFSETS + m_stream.DebugOffsets(index); +#endif } } void ContentLoader::Load() { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - XAssetList assetList{}; + varXAssetList = &assetList; + +#ifdef ARCH_x86 m_stream.LoadDataRaw(&assetList, sizeof(assetList)); +#else + const auto fillAccessor = m_stream.LoadWithFill(16u); + varScriptStringList = &varXAssetList->stringList; + fillAccessor.Fill(varScriptStringList->count, 0u); + fillAccessor.FillPtr(varScriptStringList->strings, 4u); + + fillAccessor.Fill(varXAssetList->assetCount, 8u); + fillAccessor.FillPtr(varXAssetList->assets, 12u); +#endif + + m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); varScriptStringList = &assetList.stringList; LoadScriptStringList(false); @@ -148,7 +177,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING); - assetList.assets = m_stream.Alloc(alignof(XAsset)); +#ifdef ARCH_x86 + assetList.assets = m_stream.Alloc(4); +#else + assetList.assets = m_stream.AllocOutOfBlock(4, assetList.assetCount); +#endif varXAsset = assetList.assets; LoadXAssetArray(true, assetList.assetCount); } diff --git a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h index 32533a9d..b407e648 100644 --- a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h +++ b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h @@ -18,6 +18,7 @@ namespace IW3 void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); + XAssetList* varXAssetList; XAsset* varXAsset; ScriptStringList* varScriptStringList; }; diff --git a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp index c524d3b1..ada66414 100644 --- a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp +++ b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp @@ -49,6 +49,7 @@ using namespace IW5; ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) : ContentLoaderBase(zone, stream), + varXAssetList(nullptr), varXAsset(nullptr), varScriptStringList(nullptr) { @@ -56,16 +57,17 @@ ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) void ContentLoader::LoadScriptStringList(const bool atStreamStart) { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - - if (atStreamStart) - m_stream.Load(varScriptStringList); + assert(!atStreamStart); if (varScriptStringList->strings != nullptr) { assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING); - varScriptStringList->strings = m_stream.Alloc(alignof(const char*)); +#ifdef ARCH_x86 + varScriptStringList->strings = m_stream.Alloc(4); +#else + varScriptStringList->strings = m_stream.AllocOutOfBlock(4, varScriptStringList->count); +#endif varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); @@ -73,8 +75,6 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) m_zone.m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } - m_stream.PopBlock(); - assert(m_zone.m_script_strings.Count() <= SCR_STRING_MAX + 1); } @@ -154,21 +154,50 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count assert(count == 0 || varXAsset != nullptr); if (atStreamStart) + { +#ifdef ARCH_x86 m_stream.Load(varXAsset, count); +#else + const auto fill = m_stream.LoadWithFill(8u * count); + + for (size_t index = 0; index < count; index++) + { + fill.Fill(varXAsset[index].type, 8u * index); + fill.FillPtr(varXAsset[index].header.data, 8u * index + 4u); + m_stream.AddPointerLookup(&varXAsset[index].header.data, fill.BlockBuffer(8u * index + 4u)); + } +#endif + } for (size_t index = 0; index < count; index++) { LoadXAsset(false); varXAsset++; + +#ifdef DEBUG_OFFSETS + m_stream.DebugOffsets(index); +#endif } } void ContentLoader::Load() { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - XAssetList assetList{}; + varXAssetList = &assetList; + +#ifdef ARCH_x86 m_stream.LoadDataRaw(&assetList, sizeof(assetList)); +#else + const auto fillAccessor = m_stream.LoadWithFill(16u); + varScriptStringList = &varXAssetList->stringList; + fillAccessor.Fill(varScriptStringList->count, 0u); + fillAccessor.FillPtr(varScriptStringList->strings, 4u); + + fillAccessor.Fill(varXAssetList->assetCount, 8u); + fillAccessor.FillPtr(varXAssetList->assets, 12u); +#endif + + m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); varScriptStringList = &assetList.stringList; LoadScriptStringList(false); @@ -177,7 +206,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING); - assetList.assets = m_stream.Alloc(alignof(XAsset)); +#ifdef ARCH_x86 + assetList.assets = m_stream.Alloc(4); +#else + assetList.assets = m_stream.AllocOutOfBlock(4, assetList.assetCount); +#endif varXAsset = assetList.assets; LoadXAssetArray(true, assetList.assetCount); } diff --git a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h index e618f44f..3c3f9d93 100644 --- a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h +++ b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h @@ -18,6 +18,7 @@ namespace IW5 void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); + XAssetList* varXAssetList; XAsset* varXAsset; ScriptStringList* varScriptStringList; }; diff --git a/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp b/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp index 9536f02a..d8549be4 100644 --- a/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp +++ b/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp @@ -41,6 +41,7 @@ using namespace T5; ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) : ContentLoaderBase(zone, stream), + varXAssetList(nullptr), varXAsset(nullptr), varScriptStringList(nullptr) { @@ -48,16 +49,17 @@ ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) void ContentLoader::LoadScriptStringList(const bool atStreamStart) { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - - if (atStreamStart) - m_stream.Load(varScriptStringList); + assert(!atStreamStart); if (varScriptStringList->strings != nullptr) { assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING); - varScriptStringList->strings = m_stream.Alloc(alignof(const char*)); +#ifdef ARCH_x86 + varScriptStringList->strings = m_stream.Alloc(4); +#else + varScriptStringList->strings = m_stream.AllocOutOfBlock(4, varScriptStringList->count); +#endif varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); @@ -65,8 +67,6 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) m_zone.m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } - m_stream.PopBlock(); - assert(m_zone.m_script_strings.Count() <= SCR_STRING_MAX + 1); } @@ -138,21 +138,50 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count assert(varXAsset != nullptr); if (atStreamStart) + { +#ifdef ARCH_x86 m_stream.Load(varXAsset, count); +#else + const auto fill = m_stream.LoadWithFill(8u * count); + + for (size_t index = 0; index < count; index++) + { + fill.Fill(varXAsset[index].type, 8u * index); + fill.FillPtr(varXAsset[index].header.data, 8u * index + 4u); + m_stream.AddPointerLookup(&varXAsset[index].header.data, fill.BlockBuffer(8u * index + 4u)); + } +#endif + } for (size_t index = 0; index < count; index++) { LoadXAsset(false); varXAsset++; + +#ifdef DEBUG_OFFSETS + m_stream.DebugOffsets(index); +#endif } } void ContentLoader::Load() { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - XAssetList assetList{}; + varXAssetList = &assetList; + +#ifdef ARCH_x86 m_stream.LoadDataRaw(&assetList, sizeof(assetList)); +#else + const auto fillAccessor = m_stream.LoadWithFill(16u); + varScriptStringList = &varXAssetList->stringList; + fillAccessor.Fill(varScriptStringList->count, 0u); + fillAccessor.FillPtr(varScriptStringList->strings, 4u); + + fillAccessor.Fill(varXAssetList->assetCount, 8u); + fillAccessor.FillPtr(varXAssetList->assets, 12u); +#endif + + m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); varScriptStringList = &assetList.stringList; LoadScriptStringList(false); @@ -161,7 +190,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING); - assetList.assets = m_stream.Alloc(alignof(XAsset)); +#ifdef ARCH_x86 + assetList.assets = m_stream.Alloc(4); +#else + assetList.assets = m_stream.AllocOutOfBlock(4, assetList.assetCount); +#endif varXAsset = assetList.assets; LoadXAssetArray(true, assetList.assetCount); } diff --git a/src/ZoneLoading/Game/T5/ContentLoaderT5.h b/src/ZoneLoading/Game/T5/ContentLoaderT5.h index 1881cc57..a86be631 100644 --- a/src/ZoneLoading/Game/T5/ContentLoaderT5.h +++ b/src/ZoneLoading/Game/T5/ContentLoaderT5.h @@ -18,6 +18,7 @@ namespace T5 void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); + XAssetList* varXAssetList; XAsset* varXAsset; ScriptStringList* varScriptStringList; }; diff --git a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp index b551cd91..9c6dce81 100644 --- a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp +++ b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp @@ -57,6 +57,7 @@ using namespace T6; ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) : ContentLoaderBase(zone, stream), + varXAssetList(nullptr), varXAsset(nullptr), varScriptStringList(nullptr) { @@ -64,16 +65,17 @@ ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) void ContentLoader::LoadScriptStringList(const bool atStreamStart) { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - - if (atStreamStart) - m_stream.Load(varScriptStringList); + assert(!atStreamStart); if (varScriptStringList->strings != nullptr) { assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING); - varScriptStringList->strings = m_stream.Alloc(alignof(const char*)); +#ifdef ARCH_x86 + varScriptStringList->strings = m_stream.Alloc(4); +#else + varScriptStringList->strings = m_stream.AllocOutOfBlock(4, varScriptStringList->count); +#endif varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); @@ -81,8 +83,6 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) m_zone.m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } - m_stream.PopBlock(); - assert(m_zone.m_script_strings.Count() <= SCR_STRING_MAX + 1); } @@ -167,21 +167,52 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count assert(varXAsset != nullptr); if (atStreamStart) + { +#ifdef ARCH_x86 m_stream.Load(varXAsset, count); +#else + const auto fill = m_stream.LoadWithFill(8u * count); + + for (size_t index = 0; index < count; index++) + { + fill.Fill(varXAsset[index].type, 8u * index); + fill.FillPtr(varXAsset[index].header.data, 8u * index + 4u); + m_stream.AddPointerLookup(&varXAsset[index].header.data, fill.BlockBuffer(8u * index + 4u)); + } +#endif + } for (size_t index = 0; index < count; index++) { LoadXAsset(false); varXAsset++; + +#ifdef DEBUG_OFFSETS + m_stream.DebugOffsets(index); +#endif } } void ContentLoader::Load() { - m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); - XAssetList assetList{}; + varXAssetList = &assetList; + +#ifdef ARCH_x86 m_stream.LoadDataRaw(&assetList, sizeof(assetList)); +#else + const auto fillAccessor = m_stream.LoadWithFill(24u); + varScriptStringList = &varXAssetList->stringList; + fillAccessor.Fill(varScriptStringList->count, 0u); + fillAccessor.FillPtr(varScriptStringList->strings, 4u); + + fillAccessor.Fill(varXAssetList->dependCount, 8u); + fillAccessor.FillPtr(varXAssetList->depends, 12u); + fillAccessor.Fill(varXAssetList->assetCount, 16u); + fillAccessor.FillPtr(varXAssetList->assets, 20u); +#endif + + m_stream.PushBlock(XFILE_BLOCK_VIRTUAL); varScriptStringList = &assetList.stringList; LoadScriptStringList(false); @@ -190,7 +221,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.depends) == ZonePointerType::FOLLOWING); - assetList.depends = m_stream.Alloc(alignof(const char*)); +#ifdef ARCH_x86 + assetList.depends = m_stream.Alloc(4); +#else + assetList.depends = m_stream.AllocOutOfBlock(4, assetList.dependCount); +#endif varXString = assetList.depends; LoadXStringArray(true, assetList.dependCount); } @@ -199,7 +234,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING); - assetList.assets = m_stream.Alloc(alignof(XAsset)); +#ifdef ARCH_x86 + assetList.assets = m_stream.Alloc(4); +#else + assetList.assets = m_stream.AllocOutOfBlock(4, assetList.assetCount); +#endif varXAsset = assetList.assets; LoadXAssetArray(true, assetList.assetCount); } diff --git a/src/ZoneLoading/Game/T6/ContentLoaderT6.h b/src/ZoneLoading/Game/T6/ContentLoaderT6.h index acde76f7..0974e59f 100644 --- a/src/ZoneLoading/Game/T6/ContentLoaderT6.h +++ b/src/ZoneLoading/Game/T6/ContentLoaderT6.h @@ -18,6 +18,7 @@ namespace T6 void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); + XAssetList* varXAssetList; XAsset* varXAsset; ScriptStringList* varScriptStringList; };