From 01413fdd7138507a843a3fcfc2f04e6d07c8840d Mon Sep 17 00:00:00 2001 From: hymei Date: Tue, 8 Mar 2022 22:32:33 +0800 Subject: [PATCH] arm64 : fix mempool align --- .gitignore | 1 + common/openal/alc.h | 4 +- common/studiobyteswap.cpp | 6 +- datacache/mdlcache.cpp | 6 +- engine/dt_stack.h | 4 +- engine/modelloader.cpp | 2 +- engine/r_decal.cpp | 2 +- .../NextBot/NextBotContextualQueryInterface.h | 2 +- public/studio.h | 93 +++++++++++++------ public/tier0/platform.h | 6 ++ public/tier1/mempool.h | 11 ++- public/zip_utils.cpp | 2 +- tier1/lzmaDecoder.cpp | 6 +- 13 files changed, 94 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 0344d749..36b252a4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build/ .lock-waf* __pycache__ *.pyc +.DS_Store \ No newline at end of file diff --git a/common/openal/alc.h b/common/openal/alc.h index 062e505a..e04c33f2 100644 --- a/common/openal/alc.h +++ b/common/openal/alc.h @@ -22,7 +22,7 @@ extern "C" { #define ALC_APIENTRY #endif -#if TARGET_OS_MAC +#if defined(TARGET_OS_MAC) && TARGET_OS_MAC #pragma export on #endif @@ -279,7 +279,7 @@ typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)( ALCdevice *device, A #endif /* ALC_NO_PROTOTYPES */ -#if TARGET_OS_MAC +#if defined(TARGET_OS_MAC) && TARGET_OS_MAC #pragma export off #endif diff --git a/common/studiobyteswap.cpp b/common/studiobyteswap.cpp index 0e4f8fd1..63e7ce37 100644 --- a/common/studiobyteswap.cpp +++ b/common/studiobyteswap.cpp @@ -2919,8 +2919,8 @@ END_BYTESWAP_DATADESC() BEGIN_BYTESWAP_DATADESC( mstudio_modelvertexdata_t ) #ifdef PLATFORM_64BITS - DEFINE_FIELD( unused_pVertexData, FIELD_INTEGER ), // void* - DEFINE_FIELD( unused_pTangentData, FIELD_INTEGER ), // void* + DEFINE_FIELD( index_ptr_pVertexData, FIELD_INTEGER ), // void* + DEFINE_FIELD( index_ptr_pTangentData, FIELD_INTEGER ), // void* #else DEFINE_FIELD( pVertexData, FIELD_INTEGER ), // void* DEFINE_FIELD( pTangentData, FIELD_INTEGER ), // void* @@ -3004,7 +3004,7 @@ END_BYTESWAP_DATADESC() BEGIN_BYTESWAP_DATADESC( mstudio_meshvertexdata_t ) #ifdef PLATFORM_64BITS - DEFINE_FIELD( unused_modelvertexdata, FIELD_INTEGER ), // mstudio_modelvertexdata_t* + DEFINE_FIELD( index_ptr_modelvertexdata, FIELD_INTEGER ), // mstudio_modelvertexdata_t* #else DEFINE_FIELD( modelvertexdata, FIELD_INTEGER ), // mstudio_modelvertexdata_t* #endif diff --git a/datacache/mdlcache.cpp b/datacache/mdlcache.cpp index 2b7a4e8d..eb676a95 100644 --- a/datacache/mdlcache.cpp +++ b/datacache/mdlcache.cpp @@ -126,7 +126,7 @@ struct studiodata_t // array of cache handles to demand loaded virtual model data int m_nAnimBlockCount; DataCacheHandle_t *m_pAnimBlock; - unsigned long *m_iFakeAnimBlockStall; + unsigned int *m_iFakeAnimBlockStall; // vertex data is usually compressed to save memory (model decal code only needs some data) DataCacheHandle_t m_VertexCache; @@ -1169,8 +1169,8 @@ void CMDLCache::AllocateAnimBlocks( studiodata_t *pStudioData, int nCount ) memset( pStudioData->m_pAnimBlock, 0, sizeof(DataCacheHandle_t) * pStudioData->m_nAnimBlockCount ); - pStudioData->m_iFakeAnimBlockStall = new unsigned long [pStudioData->m_nAnimBlockCount]; - memset( pStudioData->m_iFakeAnimBlockStall, 0, sizeof( unsigned long ) * pStudioData->m_nAnimBlockCount ); + pStudioData->m_iFakeAnimBlockStall = new unsigned int [pStudioData->m_nAnimBlockCount]; + memset( pStudioData->m_iFakeAnimBlockStall, 0, sizeof( unsigned int ) * pStudioData->m_nAnimBlockCount ); } void CMDLCache::FreeAnimBlocks( MDLHandle_t handle ) diff --git a/engine/dt_stack.h b/engine/dt_stack.h index 9fa48d4e..84e993de 100644 --- a/engine/dt_stack.h +++ b/engine/dt_stack.h @@ -121,7 +121,7 @@ inline unsigned char* UpdateRoutesExplicit_Template( DTStack *pStack, ProxyCalle // Early out. unsigned short iPropProxyIndex = pStack->m_pPrecalc->m_PropProxyIndices[pStack->m_iCurProp]; unsigned char **pTest = &pStack->m_pProxies[iPropProxyIndex]; - if ( *pTest != (unsigned char*)0xFFFFFFFF ) + if ( *pTest != (unsigned char*)-1 ) return *pTest; // Ok.. setup this proxy. @@ -133,7 +133,7 @@ inline unsigned char* UpdateRoutesExplicit_Template( DTStack *pStack, ProxyCalle CSendTablePrecalc::CProxyPathEntry *pEntry = &pStack->m_pPrecalc->m_ProxyPathEntries[proxyPath.m_iFirstEntry + i]; int iProxy = pEntry->m_iProxy; - if ( pStack->m_pProxies[iProxy] == (unsigned char*)0xFFFFFFFF ) + if ( pStack->m_pProxies[iProxy] == (unsigned char*)-1 ) { pStack->m_pProxies[iProxy] = ProxyCaller::CallProxy( pStack, pStructBase, pEntry->m_iDatatableProp ); if ( !pStack->m_pProxies[iProxy] ) diff --git a/engine/modelloader.cpp b/engine/modelloader.cpp index b3a851ad..481963a0 100644 --- a/engine/modelloader.cpp +++ b/engine/modelloader.cpp @@ -1831,7 +1831,7 @@ void *Hunk_AllocNameAlignedClear_( int size, int alignment, const char *pHunkNam Assert(IsPowerOfTwo(alignment)); void *pMem = Hunk_AllocName( alignment + size, pHunkName ); memset( pMem, 0, size + alignment ); - pMem = (void *)( ( ( ( unsigned long )pMem ) + (alignment-1) ) & ~(alignment-1) ); + pMem = (void *)( ( ( ( uintp )pMem ) + (alignment-1) ) & ~(alignment-1) ); return pMem; } diff --git a/engine/r_decal.cpp b/engine/r_decal.cpp index 69b11d68..1c76f4d0 100644 --- a/engine/r_decal.cpp +++ b/engine/r_decal.cpp @@ -2304,7 +2304,7 @@ inline void R_DrawDecalMeshList( DecalMeshList_t &meshList ) } #define DECALMARKERS_SWITCHSORTTREE ((decal_t *)0x00000000) -#define DECALMARKERS_SWITCHBUCKET ((decal_t *)0xFFFFFFFF) +#define DECALMARKERS_SWITCHBUCKET ((decal_t *)-1) //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- diff --git a/game/server/NextBot/NextBotContextualQueryInterface.h b/game/server/NextBot/NextBotContextualQueryInterface.h index d117bcab..d6040e0d 100644 --- a/game/server/NextBot/NextBotContextualQueryInterface.h +++ b/game/server/NextBot/NextBotContextualQueryInterface.h @@ -25,7 +25,7 @@ enum QueryResultType }; // Can pass this into IContextualQuery::IsHindrance to see if any hindrance is ever possible -#define IS_ANY_HINDRANCE_POSSIBLE ( (CBaseEntity*)0xFFFFFFFF ) +#define IS_ANY_HINDRANCE_POSSIBLE ( (CBaseEntity*)-1 ) //---------------------------------------------------------------------------------------------------------------- diff --git a/public/studio.h b/public/studio.h index b02c2d48..3b0edc98 100644 --- a/public/studio.h +++ b/public/studio.h @@ -1293,14 +1293,26 @@ struct mstudio_modelvertexdata_t // base of external vertex data stores #ifdef PLATFORM_64BITS - int unused_pVertexData; - int unused_pTangentData; - const void *pVertexData; - const void *pTangentData; + int index_ptr_pVertexData; + int index_ptr_pTangentData; #else const void *pVertexData; const void *pTangentData; #endif + const void *GetVertexData() const { +#ifdef PLATFORM_64BITS + return *(const void **)((byte *)this + index_ptr_pVertexData); +#else + return pVertexData; +#endif + } + const void *GetTangentData() const { +#ifdef PLATFORM_64BITS + return *(const void **)((byte *)this + index_ptr_pTangentData); +#else + return pTangentData; +#endif + } }; #ifdef PLATFORM_64BITS @@ -1323,17 +1335,22 @@ struct mstudio_meshvertexdata_t #ifdef PLATFORM_64BITS // MoeMod : fix 64bit ptr size - int unused_modelvertexdata; - int numLODVertexes[MAX_NUM_LODS]; - const mstudio_modelvertexdata_t *modelvertexdata; + int index_ptr_modelvertexdata; #else // indirection to this mesh's model's vertex data const mstudio_modelvertexdata_t *modelvertexdata; - +#endif // used for fixup calcs when culling top level lods // expected number of mesh verts at desired lod int numLODVertexes[MAX_NUM_LODS]; + + const mstudio_modelvertexdata_t *pModelVertexData() const { +#ifdef PLATFORM_64BITS + return *(const mstudio_modelvertexdata_t **)((byte *)this + index_ptr_modelvertexdata); +#else + return modelvertexdata; #endif + } }; struct mstudiomesh_t @@ -1364,13 +1381,12 @@ struct mstudiomesh_t Vector center; -#ifdef PLATFORM_64BITS mstudio_meshvertexdata_t vertexdata; +#ifdef PLATFORM_64BITS int unused[6]; // remove as appropriate + const mstudio_modelvertexdata_t *real_modelvertexdata; #else - mstudio_meshvertexdata_t vertexdata; - int unused[8]; // remove as appropriate #endif @@ -1414,14 +1430,12 @@ struct mstudiomodel_t int eyeballindex; inline mstudioeyeball_t *pEyeball( int i ) { return (mstudioeyeball_t *)(((byte *)this) + eyeballindex) + i; }; - -#ifdef PLATFORM_64BITS mstudio_modelvertexdata_t vertexdata; // sizeof(mstudio_modelvertexdata_t) == 16 - - int unused[6]; // remove as appropriate +#ifdef PLATFORM_64BITS + int unused[4]; // remove as appropriate + const void *real_pVertexData; + const void *real_pTangentData; #else - mstudio_modelvertexdata_t vertexdata; - int unused[8]; // remove as appropriate #endif }; @@ -1432,7 +1446,7 @@ struct mstudiomodel_t inline bool mstudio_modelvertexdata_t::HasTangentData( void ) const { - return (pTangentData != NULL); + return (GetTangentData() != NULL); } inline int mstudio_modelvertexdata_t::GetGlobalVertexIndex( int i ) const @@ -1453,7 +1467,7 @@ inline int mstudio_modelvertexdata_t::GetGlobalTangentIndex( int i ) const inline mstudiovertex_t *mstudio_modelvertexdata_t::Vertex( int i ) const { - return (mstudiovertex_t *)pVertexData + GetGlobalVertexIndex( i ); + return (mstudiovertex_t *)GetVertexData() + GetGlobalVertexIndex( i ); } inline Vector *mstudio_modelvertexdata_t::Position( int i ) const @@ -1471,7 +1485,7 @@ inline Vector4D *mstudio_modelvertexdata_t::TangentS( int i ) const // NOTE: The tangents vector is 16-bytes in a separate array // because it only exists on the high end, and if I leave it out // of the mstudiovertex_t, the vertex is 64-bytes (good for low end) - return (Vector4D *)pTangentData + GetGlobalTangentIndex( i ); + return (Vector4D *)GetTangentData() + GetGlobalTangentIndex( i ); } inline Vector2D *mstudio_modelvertexdata_t::Texcoord( int i ) const @@ -1491,7 +1505,7 @@ inline mstudiomodel_t *mstudiomesh_t::pModel() const inline bool mstudio_meshvertexdata_t::HasTangentData( void ) const { - return modelvertexdata->HasTangentData(); + return pModelVertexData()->HasTangentData(); } inline const mstudio_meshvertexdata_t *mstudiomesh_t::GetVertexData( void *pModelData ) @@ -1499,9 +1513,14 @@ inline const mstudio_meshvertexdata_t *mstudiomesh_t::GetVertexData( void *pMode // get this mesh's model's vertex data (allow for mstudiomodel_t::GetVertexData // returning NULL if the data has been converted to 'thin' vertices) this->pModel()->GetVertexData( pModelData ); +#ifdef PLATFORM_64BITS + real_modelvertexdata = &( this->pModel()->vertexdata ); + vertexdata.index_ptr_modelvertexdata = (byte *)&real_modelvertexdata - (byte *)&vertexdata; +#else vertexdata.modelvertexdata = &( this->pModel()->vertexdata ); +#endif - if ( !vertexdata.modelvertexdata->pVertexData ) + if ( !vertexdata.pModelVertexData()->GetVertexData() ) return NULL; return &vertexdata; @@ -1522,37 +1541,37 @@ inline int mstudio_meshvertexdata_t::GetModelVertexIndex( int i ) const inline int mstudio_meshvertexdata_t::GetGlobalVertexIndex( int i ) const { - return modelvertexdata->GetGlobalVertexIndex( GetModelVertexIndex( i ) ); + return pModelVertexData()->GetGlobalVertexIndex( GetModelVertexIndex( i ) ); } inline Vector *mstudio_meshvertexdata_t::Position( int i ) const { - return modelvertexdata->Position( GetModelVertexIndex( i ) ); + return pModelVertexData()->Position( GetModelVertexIndex( i ) ); }; inline Vector *mstudio_meshvertexdata_t::Normal( int i ) const { - return modelvertexdata->Normal( GetModelVertexIndex( i ) ); + return pModelVertexData()->Normal( GetModelVertexIndex( i ) ); }; inline Vector4D *mstudio_meshvertexdata_t::TangentS( int i ) const { - return modelvertexdata->TangentS( GetModelVertexIndex( i ) ); + return pModelVertexData()->TangentS( GetModelVertexIndex( i ) ); } inline Vector2D *mstudio_meshvertexdata_t::Texcoord( int i ) const { - return modelvertexdata->Texcoord( GetModelVertexIndex( i ) ); + return pModelVertexData()->Texcoord( GetModelVertexIndex( i ) ); }; inline mstudioboneweight_t *mstudio_meshvertexdata_t::BoneWeights( int i ) const { - return modelvertexdata->BoneWeights( GetModelVertexIndex( i ) ); + return pModelVertexData()->BoneWeights( GetModelVertexIndex( i ) ); }; inline mstudiovertex_t *mstudio_meshvertexdata_t::Vertex( int i ) const { - return modelvertexdata->Vertex( GetModelVertexIndex( i ) ); + return pModelVertexData()->Vertex( GetModelVertexIndex( i ) ); } // a group of studio model data @@ -1972,15 +1991,29 @@ inline const mstudio_modelvertexdata_t * mstudiomodel_t::GetVertexData( void *pM const vertexFileHeader_t * pVertexHdr = CacheVertexData( pModelData ); if ( !pVertexHdr ) { +#ifdef PLATFORM_64BITS + this->real_pVertexData = NULL; + this->real_pTangentData = NULL; + vertexdata.index_ptr_pVertexData = (byte *)&real_pVertexData - (byte *)&vertexdata; + vertexdata.index_ptr_pTangentData = (byte *)&real_pTangentData - (byte *)&vertexdata; +#else vertexdata.pVertexData = NULL; vertexdata.pTangentData = NULL; +#endif return NULL; } +#ifdef PLATFORM_64BITS + this->real_pVertexData = pVertexHdr->GetVertexData(); + this->real_pTangentData = pVertexHdr->GetTangentData(); + vertexdata.index_ptr_pVertexData = (byte *)&real_pVertexData - (byte *)&vertexdata; + vertexdata.index_ptr_pTangentData = (byte *)&real_pTangentData - (byte *)&vertexdata; +#else vertexdata.pVertexData = pVertexHdr->GetVertexData(); vertexdata.pTangentData = pVertexHdr->GetTangentData(); +#endif - if ( !vertexdata.pVertexData ) + if ( !vertexdata.GetVertexData() ) return NULL; return &vertexdata; diff --git a/public/tier0/platform.h b/public/tier0/platform.h index 89b678b9..2d770f69 100644 --- a/public/tier0/platform.h +++ b/public/tier0/platform.h @@ -441,7 +441,13 @@ typedef void * HINSTANCE; // So if being debugged, use INT3 which is precise. #ifdef OSX #if defined(__arm__) || defined(__arm64__) +#ifdef __clang__ #define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_debugtrap(); } else { raise(SIGTRAP); } } while(0) +#elif defined __GNUC__ +#define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __builtin_trap(); } else { raise(SIGTRAP); } } while(0) +#else +#define DebuggerBreak() raise(SIGTRAP) +#endif #else #define DebuggerBreak() do { if ( Plat_IsInDebugSession() ) { __asm ( "int $3" ); } else { raise(SIGTRAP); } } while(0) #endif diff --git a/public/tier1/mempool.h b/public/tier1/mempool.h index 0e3931b9..26b9ea23 100644 --- a/public/tier1/mempool.h +++ b/public/tier1/mempool.h @@ -111,7 +111,8 @@ protected: class CMemoryPoolMT : public CUtlMemoryPool { public: - CMemoryPoolMT(int blockSize, int numElements, int growMode = UTLMEMORYPOOL_GROW_FAST, const char *pszAllocOwner = NULL) : CUtlMemoryPool( blockSize, numElements, growMode, pszAllocOwner) {} + // MoeMod : add alignment + CMemoryPoolMT(int blockSize, int numElements, int growMode = UTLMEMORYPOOL_GROW_FAST, const char *pszAllocOwner = NULL, int nAlignment = 0) : CUtlMemoryPool( blockSize, numElements, growMode, pszAllocOwner, nAlignment) {} void* Alloc() { AUTO_LOCK( m_mutex ); return CUtlMemoryPool::Alloc(); } @@ -135,7 +136,8 @@ template< class T > class CClassMemoryPool : public CUtlMemoryPool { public: - CClassMemoryPool(int numElements, int growMode = GROW_FAST, int nAlignment = 0 ) : + // MoeMod : bad default align here, should be alignof(T) + CClassMemoryPool(int numElements, int growMode = GROW_FAST, int nAlignment = alignof(T) ) : CUtlMemoryPool( sizeof(T), numElements, growMode, MEM_ALLOC_CLASSNAME(T), nAlignment ) { #ifdef PLATFORM_64BITS COMPILE_TIME_ASSERT( sizeof(CUtlMemoryPool) == 64 ); @@ -315,7 +317,8 @@ inline void CClassMemoryPool::Clear() for( CBlob *pCur=m_BlobHead.m_pNext; pCur != &m_BlobHead; pCur=pCur->m_pNext ) { - T *p = (T *)pCur->m_Data; + // MoeMod : should realign to real data. + T *p = (T *)AlignValue( pCur->m_Data, m_nAlignment ); T *pLimit = (T *)(pCur->m_Data + pCur->m_NumBytes); while ( p < pLimit ) { @@ -361,7 +364,7 @@ inline void CClassMemoryPool::Clear() static CMemoryPoolMT s_Allocator #define DEFINE_FIXEDSIZE_ALLOCATOR_MT( _class, _initsize, _grow ) \ - CMemoryPoolMT _class::s_Allocator(sizeof(_class), _initsize, _grow, #_class " pool") + CMemoryPoolMT _class::s_Allocator(sizeof(_class), _initsize, _grow, #_class " pool", alignof(_class)) //----------------------------------------------------------------------------- // Macros that make it simple to make a class use a fixed-size allocator diff --git a/public/zip_utils.cpp b/public/zip_utils.cpp index 4366f47c..858931ab 100644 --- a/public/zip_utils.cpp +++ b/public/zip_utils.cpp @@ -1569,7 +1569,7 @@ void CZipFile::SaveDirectory( IWriteStream& stream ) free( e->m_pData ); // temp hackery for the logic below to succeed - e->m_pData = (void*)0xFFFFFFFF; + e->m_pData = (void*)-1; } } } diff --git a/tier1/lzmaDecoder.cpp b/tier1/lzmaDecoder.cpp index 209c7fc5..57f7745f 100644 --- a/tier1/lzmaDecoder.cpp +++ b/tier1/lzmaDecoder.cpp @@ -145,8 +145,8 @@ unsigned int CLZMA::Uncompress( unsigned char *pInput, unsigned char *pOutput ) } // These are in/out variables - SizeT outProcessed = pHeader->actualSize; - SizeT inProcessed = pHeader->lzmaSize; + SizeT outProcessed = LittleLong(pHeader->actualSize); + SizeT inProcessed = LittleLong(pHeader->lzmaSize); ELzmaStatus status; SRes result = LzmaDecode( (Byte *)pOutput, &outProcessed, (Byte *)(pInput + sizeof( lzma_header_t ) ), &inProcessed, (Byte *)pHeader->properties, LZMA_PROPS_SIZE, LZMA_FINISH_END, &status, &g_Alloc ); @@ -154,7 +154,7 @@ unsigned int CLZMA::Uncompress( unsigned char *pInput, unsigned char *pOutput ) LzmaDec_Free(&state, &g_Alloc); - if ( result != SZ_OK || pHeader->actualSize != outProcessed ) + if ( result != SZ_OK || LittleLong(pHeader->actualSize) != outProcessed ) { Warning( "LZMA Decompression failed (%i)\n", result ); return 0;