mirror of
				https://github.com/intel/intel-graphics-compiler.git
				synced 2025-10-30 08:18:26 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			216 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*========================== begin_copyright_notice ============================
 | |
| 
 | |
| Copyright (C) 2019-2021 Intel Corporation
 | |
| 
 | |
| SPDX-License-Identifier: MIT
 | |
| 
 | |
| ============================= end_copyright_notice ===========================*/
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "LinearAllocator.h"
 | |
| #include "MemCopy.h"
 | |
| 
 | |
| namespace iSTD
 | |
| {
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Class:
 | |
|     CBuffer
 | |
| 
 | |
| Description:
 | |
|     Allocates and manages a system memory buffer
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| class CBuffer : public CLinearAllocator<CAllocatorType>
 | |
| {
 | |
| public:
 | |
| 
 | |
|     CBuffer( void );
 | |
|     virtual ~CBuffer( void );
 | |
| 
 | |
|     bool    Allocate( const DWORD allocSize, const DWORD alignSize );
 | |
|     void    Deallocate( void );
 | |
| 
 | |
|     DWORD   GetBlockSize( void ) const;
 | |
|     void*   GetLinearAddress( void ) const;
 | |
| 
 | |
| protected:
 | |
| 
 | |
|     BYTE*   m_pAllocAddress;    // Address of allocation pointer
 | |
| };
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer Constructor
 | |
| 
 | |
| Description:
 | |
|     Initializes internal data
 | |
| 
 | |
| Input:
 | |
|     none
 | |
| 
 | |
| Output:
 | |
|     none
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline CBuffer<CAllocatorType>::CBuffer( void )
 | |
|     : CLinearAllocator<CAllocatorType>( NULL, 0 )
 | |
| {
 | |
|     m_pAllocAddress = NULL;
 | |
| }
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer Destructor
 | |
| 
 | |
| Description:
 | |
|     Deletes internal data
 | |
| 
 | |
| Input:
 | |
|     none
 | |
| 
 | |
| Output:
 | |
|     none
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline CBuffer<CAllocatorType>::~CBuffer( void )
 | |
| {
 | |
|     Deallocate();
 | |
| }
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer::Allocate
 | |
| 
 | |
| Description:
 | |
|     Allocates memory for the buffer
 | |
| 
 | |
| Input:
 | |
|     const DWORD allocSize - size in bytes
 | |
|     const DWORD alignSize - alignment in bytes
 | |
| 
 | |
| Output:
 | |
|     bool - success or fail
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline bool CBuffer<CAllocatorType>::Allocate(
 | |
|     const DWORD allocSize,
 | |
|     const DWORD alignSize )
 | |
| {
 | |
|     Deallocate();
 | |
| 
 | |
|     const DWORD alignedAllocSize = allocSize + alignSize;
 | |
| 
 | |
|     if( alignedAllocSize )
 | |
|     {
 | |
|         m_pAllocAddress = (BYTE*)CAllocatorType::Allocate( alignedAllocSize );
 | |
| 
 | |
|         if( m_pAllocAddress )
 | |
|         {
 | |
|             const DWORD offset = ( alignSize )
 | |
|                 ? GetAlignmentOffset( m_pAllocAddress, alignSize )
 | |
|                 : 0;
 | |
| 
 | |
|             this->m_pBaseAddress = this->m_pAllocAddress + offset;
 | |
|             this->m_Size = allocSize;
 | |
| 
 | |
|             SafeMemSet( this->m_pBaseAddress, 0, this->m_Size );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             ASSERT(0);
 | |
|             this->m_Size = 0;
 | |
|         }
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         ASSERT(0);
 | |
|         this->m_Size = 0;
 | |
|     }
 | |
| 
 | |
|     this->m_SizeUsed = 0;
 | |
|     this->m_SizeReserved = 0;
 | |
| 
 | |
|     return ( this->m_Size ) ? true : false;
 | |
| }
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer::Deallocate
 | |
| 
 | |
| Description:
 | |
|     Deallocates memory for the buffer
 | |
| 
 | |
| Input:
 | |
|     none
 | |
| 
 | |
| Output:
 | |
|     none
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline void CBuffer<CAllocatorType>::Deallocate( void )
 | |
| {
 | |
|     CAllocatorType::Deallocate( m_pAllocAddress );
 | |
|     m_pAllocAddress = NULL;
 | |
| 
 | |
|     this->m_pBaseAddress = NULL;
 | |
|     this->m_Size = 0;
 | |
|     this->m_SizeUsed = 0;
 | |
|     this->m_SizeReserved = 0;
 | |
| }
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer::GetBlockSize
 | |
| 
 | |
| Description:
 | |
|     Gets the total size of the buffer
 | |
| 
 | |
| Input:
 | |
|     none
 | |
| 
 | |
| Output:
 | |
|     DWORD - size in bytes
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline DWORD CBuffer<CAllocatorType>::GetBlockSize( void ) const
 | |
| {
 | |
|     return this->m_Size;
 | |
| }
 | |
| 
 | |
| /*****************************************************************************\
 | |
| 
 | |
| Function:
 | |
|     CBuffer::GetLinearAddress
 | |
| 
 | |
| Description:
 | |
|     Gets the base address of the buffer
 | |
| 
 | |
| Input:
 | |
|     void
 | |
| 
 | |
| Output:
 | |
|     void* - linear address
 | |
| 
 | |
| \*****************************************************************************/
 | |
| template<class CAllocatorType>
 | |
| inline void* CBuffer<CAllocatorType>::GetLinearAddress( void ) const
 | |
| {
 | |
|     return (void*)(this->m_pBaseAddress);
 | |
| }
 | |
| 
 | |
| } // iSTD
 | 
