//================ Copyright (c) Valve Corporation. All Rights Reserved. =========================== // // Local memory manager // //================================================================================================== #ifndef INCLUDED_PS3GCMMEMORY_H #define INCLUDED_PS3GCMMEMORY_H #ifndef SPU #include "tier1/strtools.h" #include "shaderapi/gpumemorystats.h" #include "cell/gcm.h" #include "gcmconfig.h" #else #endif //-------------------------------------------------------------------------------------------------- // Externals //-------------------------------------------------------------------------------------------------- #ifndef SPU extern void GetGPUMemoryStats( GPUMemoryStats &stats ); extern void Ps3gcmLocalMemoryAllocator_Init(); #endif //-------------------------------------------------------------------------------------------------- // Memory Pools, Types and LocalMemoryBlock //-------------------------------------------------------------------------------------------------- enum CPs3gcmAllocationPool_t { kGcmAllocPoolDefault, kGcmAllocPoolDynamicNewPath, kGcmAllocPoolDynamic, kGcmAllocPoolTiledColorFB, // Frame-buffer tiled color memory (should be first preset tiled region) kGcmAllocPoolTiledColorFBQ, // Quarter-frame-buffer tiled color memory kGcmAllocPoolTiledColor512, // 512x512 tiled color memory kGcmAllocPoolTiledColorMisc, // Last tiled color region kGcmAllocPoolTiledD24S8, kGcmAllocPoolMainMemory, // Pool in the main RSX-mapped IO memory kGcmAllocPoolMallocMemory, // Pool in malloc-backed non-RSX-mapped memory kGcmAllocPoolCount }; #define PS3GCMALLOCATIONPOOL( uType ) ( (CPs3gcmAllocationPool_t)( ( ((uint32)(uType)) >> 28 ) & 0xF ) ) #define PS3GCMALLOCATIONALIGN( uType ) ( ((uint32)(uType)) & 0xFFFFFF ) #define PS3GCMALLOCATIONTYPE( uAlign, ePool, iType ) (((uint32)(uAlign))&0xFFFFFF) | ( (((uint32)(iType))&0xF) << 24 ) | ( (((uint32)(ePool))&0xF) << 28 ) enum CPs3gcmAllocationType_t { // Default pool kAllocPs3gcmTextureData0 = PS3GCMALLOCATIONTYPE( 128, kGcmAllocPoolMainMemory, 0 ), kAllocPs3gcmTextureData = PS3GCMALLOCATIONTYPE( 128, kGcmAllocPoolDefault, 1 ), kAllocPs3GcmVertexBuffer = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolDefault, 2 ), kAllocPs3GcmIndexBuffer = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolDefault, 3 ), kAllocPs3GcmShader = PS3GCMALLOCATIONTYPE( 128, kGcmAllocPoolDefault, 4 ), kAllocPs3GcmEdgeGeomBuffer = PS3GCMALLOCATIONTYPE( 128, kGcmAllocPoolDefault, 5 ), // Dynamic pool kAllocPs3GcmVertexBufferDynamic = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolDynamic, 1 ), kAllocPs3GcmIndexBufferDynamic = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolDynamic, 2 ), kAllocPs3GcmDynamicBufferPool = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolDynamicNewPath, 1 ), // Malloc memory pool kAllocPs3GcmVertexBufferDma = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolMallocMemory, 1 ), kAllocPs3GcmIndexBufferDma = PS3GCMALLOCATIONTYPE( 32, kGcmAllocPoolMallocMemory, 2 ), // Tiled pools kAllocPs3gcmColorBufferFB = PS3GCMALLOCATIONTYPE( 64, kGcmAllocPoolTiledColorFB, 1 ), kAllocPs3gcmColorBufferFBQ = PS3GCMALLOCATIONTYPE( 64, kGcmAllocPoolTiledColorFBQ, 1 ), kAllocPs3gcmColorBuffer512 = PS3GCMALLOCATIONTYPE( 64, kGcmAllocPoolTiledColor512, 1 ), kAllocPs3gcmColorBufferMisc = PS3GCMALLOCATIONTYPE( 64*1024, kGcmAllocPoolTiledColorMisc,1 ), kAllocPs3gcmDepthBuffer = PS3GCMALLOCATIONTYPE( 64*1024, kGcmAllocPoolTiledD24S8, 1 ), }; struct CPs3gcmLocalMemoryBlockSystemGlobal; struct ALIGN16 CPs3gcmLocalMemoryBlock { public: CPs3gcmLocalMemoryBlock() {} #if 0 #define GCMLOCALMEMORYBLOCKDEBUG uint64 m_dbgGuardCookie; // Debug cookie used to guard when calling code let block go out of scope without freeing it #endif protected: uint32 m_nLocalMemoryOffset; // Offset in RSX local memory uint32 m_uiSize; // Actual allocation size, might be larger than requested allocation size CPs3gcmAllocationType_t m_uType; // Allocation type with required alignment uint32 m_uiIndex; // Index of the allocation in allocation tracking system bool Alloc(); // Internal implementation of Local Memory Allocator // Prevent copying (since patch-back mechanism needs to access the allocated blocks) CPs3gcmLocalMemoryBlock( CPs3gcmLocalMemoryBlock const &x ) { V_memcpy( this, &x, sizeof( CPs3gcmLocalMemoryBlock ) ); } CPs3gcmLocalMemoryBlock& operator =( CPs3gcmLocalMemoryBlock const &x ) { V_memcpy( this, &x, sizeof( CPs3gcmLocalMemoryBlock ) ); return *this; } public: inline void Assign( CPs3gcmLocalMemoryBlockSystemGlobal const &x ) { V_memcpy( this, &x, sizeof( CPs3gcmLocalMemoryBlock ) ); } inline bool Alloc( CPs3gcmAllocationType_t uType, uint32 uiSize ) { m_uType = uType; m_uiSize = uiSize; return Alloc(); } inline void AttachToExternalMemory( CPs3gcmAllocationType_t uType, uint32 nOffset, uint32 uiSize ) { m_uType = uType; m_uiSize = uiSize; m_nLocalMemoryOffset = nOffset; m_uiIndex = ~0; } void Free(); void FreeAndAllocNew() { Free(); Alloc(); } inline uint32 Offset() const { return m_nLocalMemoryOffset; } inline uint32 Size() const { return m_uiSize; } inline bool IsLocalMemory() const { return PS3GCMALLOCATIONPOOL( m_uType ) < kGcmAllocPoolMainMemory; } inline bool IsRsxMappedMemory() const { return PS3GCMALLOCATIONPOOL( m_uType ) < kGcmAllocPoolMallocMemory; } inline uint8 GcmMemoryLocation() const { return IsLocalMemory() ? CELL_GCM_LOCATION_LOCAL : CELL_GCM_LOCATION_MAIN; } #ifndef SPU char * DataInLocalMemory() const; char * DataInMainMemory() const; char * DataInMallocMemory() const; char * DataInAnyMemory() const; #endif // Tiled memory access uint32 TiledMemoryTagAreaBase() const; uint32 TiledMemoryIndex() const; // Zcull memory access uint32 ZcullMemoryIndex() const; uint32 ZcullMemoryStart() const; } ALIGN16_POST; struct CPs3gcmLocalMemoryBlockSystemGlobal : public CPs3gcmLocalMemoryBlock { public: CPs3gcmLocalMemoryBlockSystemGlobal() {} private: // Prevent copying (since patch-back mechanism needs to access the allocated blocks) CPs3gcmLocalMemoryBlockSystemGlobal( CPs3gcmLocalMemoryBlock const &x ); CPs3gcmLocalMemoryBlockSystemGlobal& operator =( CPs3gcmLocalMemoryBlockSystemGlobal const &x ); }; //-------------------------------------------------------------------------------------------------- // Buffer (used by IB and VBs) //-------------------------------------------------------------------------------------------------- struct CPs3gcmBuffer { CPs3gcmLocalMemoryBlock m_lmBlock; public: inline uint32 Offset() { return m_lmBlock.Offset(); } public: #ifndef SPU static CPs3gcmBuffer * New( uint32 uiSize, CPs3gcmAllocationType_t uType ); void Release(); #endif }; #endif // INCLUDED_PS3GCMMEMORY_H