mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-05-31 21:47:44 +00:00
fix: make x64 modified loading code compatible with x86 again
This commit is contained in:
parent
46de4f9be0
commit
a98adc9d59
@ -60,12 +60,15 @@ namespace
|
|||||||
m_intendation++;
|
m_intendation++;
|
||||||
|
|
||||||
// Method Declarations
|
// 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
|
for (const auto* type : m_env.m_used_types)
|
||||||
&& (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset()))
|
|
||||||
{
|
{
|
||||||
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)
|
for (const auto* type : m_env.m_used_types)
|
||||||
@ -160,13 +163,16 @@ namespace
|
|||||||
LINE("")
|
LINE("")
|
||||||
PrintMainLoadMethod();
|
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
|
for (const auto* type : m_env.m_used_types)
|
||||||
&& (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset()))
|
|
||||||
{
|
{
|
||||||
LINE("")
|
if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure
|
||||||
PrintFillStructMethod(type->m_info);
|
&& (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset()))
|
||||||
|
{
|
||||||
|
LINE("")
|
||||||
|
PrintFillStructMethod(type->m_info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const auto* type : m_env.m_used_types)
|
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));
|
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))
|
LINEF("void FillStruct_{1}(const ZoneStreamFillReadAccessor& fillAccessor);", LoaderClassName(m_env.m_asset), MakeSafeTypeName(info->m_definition))
|
||||||
}
|
}
|
||||||
@ -738,7 +744,7 @@ namespace
|
|||||||
LINE("{")
|
LINE("{")
|
||||||
m_intendation++;
|
m_intendation++;
|
||||||
|
|
||||||
LINEF("{0} = var;", MakeTypeVarName(def))
|
LINEF("{0} = var;", MakeTypeVarName(info->m_definition))
|
||||||
LINEF("Load_{0}(false);", info->m_definition->m_name)
|
LINEF("Load_{0}(false);", info->m_definition->m_name)
|
||||||
LINE("var++;")
|
LINE("var++;")
|
||||||
|
|
||||||
@ -1072,7 +1078,8 @@ namespace
|
|||||||
const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers());
|
const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers());
|
||||||
|
|
||||||
const auto allocOutOfBlock =
|
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))
|
LINE_STARTF("{0} = m_stream.", MakeMemberAccess(info, member, modifier))
|
||||||
if (allocOutOfBlock)
|
if (allocOutOfBlock)
|
||||||
@ -1517,7 +1524,7 @@ namespace
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LINE("assert(!atStreamStart);");
|
LINE("assert(!atStreamStart);")
|
||||||
}
|
}
|
||||||
|
|
||||||
LINE("")
|
LINE("")
|
||||||
@ -1651,7 +1658,7 @@ namespace
|
|||||||
LINE("assert(pAsset != nullptr);")
|
LINE("assert(pAsset != nullptr);")
|
||||||
LINE("")
|
LINE("")
|
||||||
LINEF("{0} marker(m_zone);", MarkerClassName(m_env.m_asset))
|
LINEF("{0} marker(m_zone);", MarkerClassName(m_env.m_asset))
|
||||||
LINE("// marker.Mark(*pAsset); // TODO")
|
LINE("marker.Mark(*pAsset);")
|
||||||
LINE("")
|
LINE("")
|
||||||
LINEF("auto* reallocatedAsset = m_zone.Memory().Alloc<{0}>();", info->m_definition->GetFullName())
|
LINEF("auto* reallocatedAsset = m_zone.Memory().Alloc<{0}>();", info->m_definition->GetFullName())
|
||||||
LINEF("std::memcpy(reallocatedAsset, *pAsset, sizeof({0}));", info->m_definition->GetFullName())
|
LINEF("std::memcpy(reallocatedAsset, *pAsset, sizeof({0}));", info->m_definition->GetFullName())
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "Parsing/Impl/IncludingStreamProxy.h"
|
#include "Parsing/Impl/IncludingStreamProxy.h"
|
||||||
#include "Parsing/Impl/ParserFilesystemStream.h"
|
#include "Parsing/Impl/ParserFilesystemStream.h"
|
||||||
#include "Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h"
|
#include "Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h"
|
||||||
|
#include "Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h"
|
||||||
#include "Parsing/PostProcessing/LeafsPostProcessor.h"
|
#include "Parsing/PostProcessing/LeafsPostProcessor.h"
|
||||||
#include "Parsing/PostProcessing/MarkingRequiredPostProcessor.h"
|
#include "Parsing/PostProcessing/MarkingRequiredPostProcessor.h"
|
||||||
#include "Parsing/PostProcessing/MemberLeafsPostProcessor.h"
|
#include "Parsing/PostProcessing/MemberLeafsPostProcessor.h"
|
||||||
@ -19,8 +20,8 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator";
|
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_VALUE = "1";
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename)
|
CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename)
|
||||||
@ -62,6 +63,7 @@ void CommandsFileReader::SetupStreamProxies()
|
|||||||
void CommandsFileReader::SetupPostProcessors()
|
void CommandsFileReader::SetupPostProcessors()
|
||||||
{
|
{
|
||||||
// Order is important
|
// Order is important
|
||||||
|
m_post_processors.emplace_back(std::make_unique<CrossPlatformStructurePostProcessor>());
|
||||||
m_post_processors.emplace_back(std::make_unique<CalculateSizeAndAlignPostProcessor>());
|
m_post_processors.emplace_back(std::make_unique<CalculateSizeAndAlignPostProcessor>());
|
||||||
m_post_processors.emplace_back(std::make_unique<UsagesPostProcessor>());
|
m_post_processors.emplace_back(std::make_unique<UsagesPostProcessor>());
|
||||||
m_post_processors.emplace_back(std::make_unique<LeafsPostProcessor>());
|
m_post_processors.emplace_back(std::make_unique<LeafsPostProcessor>());
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "Parsing/Impl/ParserFilesystemStream.h"
|
#include "Parsing/Impl/ParserFilesystemStream.h"
|
||||||
#include "Parsing/PostProcessing/CreateMemberInformationPostProcessor.h"
|
#include "Parsing/PostProcessing/CreateMemberInformationPostProcessor.h"
|
||||||
#include "Parsing/PostProcessing/CreateStructureInformationPostProcessor.h"
|
#include "Parsing/PostProcessing/CreateStructureInformationPostProcessor.h"
|
||||||
#include "Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h"
|
|
||||||
#include "Parsing/PostProcessing/IPostProcessor.h"
|
#include "Parsing/PostProcessing/IPostProcessor.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -19,8 +18,8 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator";
|
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_VALUE = "1";
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
HeaderFileReader::HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename)
|
HeaderFileReader::HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename)
|
||||||
@ -68,7 +67,6 @@ void HeaderFileReader::SetupPostProcessors()
|
|||||||
// Order is important
|
// Order is important
|
||||||
m_post_processors.emplace_back(std::make_unique<CreateStructureInformationPostProcessor>());
|
m_post_processors.emplace_back(std::make_unique<CreateStructureInformationPostProcessor>());
|
||||||
m_post_processors.emplace_back(std::make_unique<CreateMemberInformationPostProcessor>());
|
m_post_processors.emplace_back(std::make_unique<CreateMemberInformationPostProcessor>());
|
||||||
m_post_processors.emplace_back(std::make_unique<CrossPlatformStructurePostProcessor>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository)
|
bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository)
|
||||||
|
@ -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)
|
void ContentLoader::LoadScriptStringList(const bool atStreamStart)
|
||||||
{
|
{
|
||||||
assert(!atStreamStart);
|
assert(!atStreamStart);
|
||||||
@ -73,7 +58,11 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart)
|
|||||||
{
|
{
|
||||||
assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING);
|
assert(GetZonePointerType(varScriptStringList->strings) == ZonePointerType::FOLLOWING);
|
||||||
|
|
||||||
|
#ifdef ARCH_x86
|
||||||
|
varScriptStringList->strings = m_stream.Alloc<const char*>(4);
|
||||||
|
#else
|
||||||
varScriptStringList->strings = m_stream.AllocOutOfBlock<const char*>(4, varScriptStringList->count);
|
varScriptStringList->strings = m_stream.AllocOutOfBlock<const char*>(4, varScriptStringList->count);
|
||||||
|
#endif
|
||||||
varXString = varScriptStringList->strings;
|
varXString = varScriptStringList->strings;
|
||||||
LoadXStringArray(true, varScriptStringList->count);
|
LoadXStringArray(true, varScriptStringList->count);
|
||||||
|
|
||||||
@ -157,6 +146,9 @@ void ContentLoader::LoadXAssetArray(const bool atStreamStart, const size_t count
|
|||||||
|
|
||||||
if (atStreamStart)
|
if (atStreamStart)
|
||||||
{
|
{
|
||||||
|
#ifdef ARCH_x86
|
||||||
|
m_stream.Load<XAsset>(varXAsset, count);
|
||||||
|
#else
|
||||||
const auto fill = m_stream.LoadWithFill(8u * count);
|
const auto fill = m_stream.LoadWithFill(8u * count);
|
||||||
|
|
||||||
for (size_t index = 0; index < count; index++)
|
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.FillPtr(varXAsset[index].header.data, 8u * index + 4u);
|
||||||
fill.InsertPointerRedirect(m_stream.AllocRedirectEntry(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++)
|
for (size_t index = 0; index < count; index++)
|
||||||
@ -179,7 +172,17 @@ void ContentLoader::Load()
|
|||||||
XAssetList assetList{};
|
XAssetList assetList{};
|
||||||
varXAssetList = &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);
|
m_stream.PushBlock(XFILE_BLOCK_VIRTUAL);
|
||||||
|
|
||||||
@ -190,7 +193,11 @@ void ContentLoader::Load()
|
|||||||
{
|
{
|
||||||
assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING);
|
assert(GetZonePointerType(assetList.assets) == ZonePointerType::FOLLOWING);
|
||||||
|
|
||||||
|
#ifdef ARCH_x86
|
||||||
|
assetList.assets = m_stream.Alloc<XAsset>(4);
|
||||||
|
#else
|
||||||
assetList.assets = m_stream.AllocOutOfBlock<XAsset>(4, assetList.assetCount);
|
assetList.assets = m_stream.AllocOutOfBlock<XAsset>(4, assetList.assetCount);
|
||||||
|
#endif
|
||||||
varXAsset = assetList.assets;
|
varXAsset = assetList.assets;
|
||||||
LoadXAssetArray(true, assetList.assetCount);
|
LoadXAssetArray(true, assetList.assetCount);
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,6 @@ namespace IW4
|
|||||||
void Load() override;
|
void Load() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void FillStruct_XAssetList(const ZoneStreamFillReadAccessor& fillAccessor);
|
|
||||||
void FillStruct_ScriptStringList(const ZoneStreamFillReadAccessor& fillAccessor) const;
|
|
||||||
|
|
||||||
void LoadScriptStringList(bool atStreamStart);
|
void LoadScriptStringList(bool atStreamStart);
|
||||||
|
|
||||||
void LoadXAsset(bool atStreamStart) const;
|
void LoadXAsset(bool atStreamStart) const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user