From a98adc9d59faff1833e78bbeb095e97e1997a6f5 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 28 May 2025 16:19:03 +0100 Subject: [PATCH] fix: make x64 modified loading code compatible with x86 again --- .../Generating/Templates/ZoneLoadTemplate.cpp | 35 ++++++++++------- .../Parsing/Commands/CommandsFileReader.cpp | 6 ++- .../Parsing/Header/HeaderFileReader.cpp | 6 +-- src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp | 39 +++++++++++-------- src/ZoneLoading/Game/IW4/ContentLoaderIW4.h | 3 -- 5 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index 573a32bc..d8f7945b 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -60,12 +60,15 @@ namespace m_intendation++; // Method Declarations - for (const auto* type : m_env.m_used_types) + if (m_env.m_architecture_mismatch) { - if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure - && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + for (const auto* type : m_env.m_used_types) { - PrintFillStructMethodDeclaration(type->m_info); + if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure + && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + { + PrintFillStructMethodDeclaration(type->m_info); + } } } for (const auto* type : m_env.m_used_types) @@ -160,13 +163,16 @@ namespace LINE("") PrintMainLoadMethod(); - for (const auto* type : m_env.m_used_types) + if (m_env.m_architecture_mismatch) { - if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure - && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + for (const auto* type : m_env.m_used_types) { - LINE("") - PrintFillStructMethod(type->m_info); + if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure + && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + { + LINE("") + PrintFillStructMethod(type->m_info); + } } } for (const auto* type : m_env.m_used_types) @@ -232,7 +238,7 @@ namespace return std::format("{0}** var{1}Ptr;", def->GetFullName(), MakeSafeTypeName(def)); } - void PrintFillStructMethodDeclaration(const StructureInformation* info) + void PrintFillStructMethodDeclaration(const StructureInformation* info) const { LINEF("void FillStruct_{1}(const ZoneStreamFillReadAccessor& fillAccessor);", LoaderClassName(m_env.m_asset), MakeSafeTypeName(info->m_definition)) } @@ -738,7 +744,7 @@ namespace LINE("{") m_intendation++; - LINEF("{0} = var;", MakeTypeVarName(def)) + LINEF("{0} = var;", MakeTypeVarName(info->m_definition)) LINEF("Load_{0}(false);", info->m_definition->m_name) LINE("var++;") @@ -1072,7 +1078,8 @@ namespace const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); const auto allocOutOfBlock = - (member->m_type && !member->m_type->m_has_matching_cross_platform_structure) || loadType == MemberLoadType::POINTER_ARRAY; + m_env.m_architecture_mismatch + && ((member->m_type && !member->m_type->m_has_matching_cross_platform_structure) || loadType == MemberLoadType::POINTER_ARRAY); LINE_STARTF("{0} = m_stream.", MakeMemberAccess(info, member, modifier)) if (allocOutOfBlock) @@ -1517,7 +1524,7 @@ namespace } else { - LINE("assert(!atStreamStart);"); + LINE("assert(!atStreamStart);") } LINE("") @@ -1651,7 +1658,7 @@ namespace LINE("assert(pAsset != nullptr);") LINE("") LINEF("{0} marker(m_zone);", MarkerClassName(m_env.m_asset)) - LINE("// marker.Mark(*pAsset); // TODO") + LINE("marker.Mark(*pAsset);") LINE("") LINEF("auto* reallocatedAsset = m_zone.Memory().Alloc<{0}>();", info->m_definition->GetFullName()) LINEF("std::memcpy(reallocatedAsset, *pAsset, sizeof({0}));", info->m_definition->GetFullName()) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp index 18527df9..449ead72 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp @@ -7,6 +7,7 @@ #include "Parsing/Impl/IncludingStreamProxy.h" #include "Parsing/Impl/ParserFilesystemStream.h" #include "Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h" +#include "Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h" #include "Parsing/PostProcessing/LeafsPostProcessor.h" #include "Parsing/PostProcessing/MarkingRequiredPostProcessor.h" #include "Parsing/PostProcessing/MemberLeafsPostProcessor.h" @@ -19,8 +20,8 @@ namespace { - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; + constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; + constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; } // namespace CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename) @@ -62,6 +63,7 @@ void CommandsFileReader::SetupStreamProxies() void CommandsFileReader::SetupPostProcessors() { // Order is important + m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index 605c9226..64ba8d46 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp @@ -9,7 +9,6 @@ #include "Parsing/Impl/ParserFilesystemStream.h" #include "Parsing/PostProcessing/CreateMemberInformationPostProcessor.h" #include "Parsing/PostProcessing/CreateStructureInformationPostProcessor.h" -#include "Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h" #include "Parsing/PostProcessing/IPostProcessor.h" #include @@ -19,8 +18,8 @@ namespace { - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; + constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; + constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; } // namespace HeaderFileReader::HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename) @@ -68,7 +67,6 @@ void HeaderFileReader::SetupPostProcessors() // Order is important m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); - m_post_processors.emplace_back(std::make_unique()); } bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) diff --git a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp index 9182b0c8..d0a16e10 100644 --- a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp +++ b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp @@ -50,21 +50,6 @@ ContentLoader::ContentLoader(Zone& zone, ZoneInputStream& stream) { } -void ContentLoader::FillStruct_XAssetList(const ZoneStreamFillReadAccessor& fillAccessor) -{ - varScriptStringList = &varXAssetList->stringList; - FillStruct_ScriptStringList(fillAccessor.AtOffset(0u)); - - fillAccessor.Fill(varXAssetList->assetCount, 8u); - fillAccessor.FillPtr(varXAssetList->assets, 12u); -} - -void ContentLoader::FillStruct_ScriptStringList(const ZoneStreamFillReadAccessor& fillAccessor) const -{ - fillAccessor.Fill(varScriptStringList->count, 0u); - fillAccessor.FillPtr(varScriptStringList->strings, 4u); -} - void ContentLoader::LoadScriptStringList(const bool atStreamStart) { assert(!atStreamStart); @@ -73,7 +58,11 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) { assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING); +#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); @@ -157,6 +146,9 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count 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++) @@ -165,6 +157,7 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count fill.FillPtr(varXAsset[index].header.data, 8u * index + 4u); fill.InsertPointerRedirect(m_stream.AllocRedirectEntry(varXAsset[index].header.data), 8u * index + 4u); } +#endif } for (size_t index = 0; index < count; index++) @@ -179,7 +172,17 @@ void ContentLoader::Load() XAssetList assetList{}; varXAssetList = &assetList; - FillStruct_XAssetList(m_stream.LoadWithFill(16u)); +#ifdef ARCH_x86 + m_stream.LoadDataRaw(&assetList, sizeof(assetList)); +#else + 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); @@ -190,7 +193,11 @@ void ContentLoader::Load() { assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING); +#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/IW4/ContentLoaderIW4.h b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h index 8b7452de..1c110cd8 100644 --- a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h +++ b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h @@ -13,9 +13,6 @@ namespace IW4 void Load() override; private: - void FillStruct_XAssetList(const ZoneStreamFillReadAccessor& fillAccessor); - void FillStruct_ScriptStringList(const ZoneStreamFillReadAccessor& fillAccessor) const; - void LoadScriptStringList(bool atStreamStart); void LoadXAsset(bool atStreamStart) const;