From 79b4313384f32100def6994e5febfe378a5acb04 Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 24 Jun 2025 17:08:06 +0100 Subject: [PATCH] refactor: update T6 loading code for x64 support --- src/ZoneLoading/Game/T6/ContentLoaderT6.cpp | 61 +++++++++++++++++---- src/ZoneLoading/Game/T6/ContentLoaderT6.h | 1 + 2 files changed, 51 insertions(+), 11 deletions(-) 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; };