2017-12-21 07:45:38 +08:00
/*
2020-01-02 20:20:18 +08:00
* Copyright ( C ) 2017 - 2020 Intel Corporation
2017-12-21 07:45:38 +08:00
*
2018-09-18 15:11:08 +08:00
* SPDX - License - Identifier : MIT
2017-12-21 07:45:38 +08:00
*
*/
# pragma once
2020-02-24 05:44:01 +08:00
# include "shared/source/helpers/options.h"
# include "shared/source/utilities/api_intercept.h"
2017-12-21 07:45:38 +08:00
2019-02-27 18:39:32 +08:00
# include <d3dkmthk.h>
2019-03-26 18:59:46 +08:00
namespace NEO {
2019-12-09 22:29:30 +08:00
template < typename Param >
2017-12-21 07:45:38 +08:00
class ThkWrapper {
typedef NTSTATUS ( APIENTRY * Func ) ( Param ) ;
public :
2018-04-19 20:11:45 +08:00
Func mFunc = nullptr ;
2017-12-21 07:45:38 +08:00
inline NTSTATUS operator ( ) ( Param param ) const {
2019-12-09 22:29:30 +08:00
if ( KMD_PROFILING ) {
2017-12-21 07:45:38 +08:00
SYSTEM_ENTER ( )
NTSTATUS Status ;
Status = mFunc ( param ) ;
2019-02-07 22:09:27 +08:00
SYSTEM_LEAVE ( getId < Param > ( ) ) ;
2017-12-21 07:45:38 +08:00
return Status ;
} else {
return mFunc ( param ) ;
}
}
template < class T >
inline T & operator = ( T func ) {
return mFunc = func ;
}
// This operator overload is for implicit casting ThkWrapper struct to Function Pointer in GetPfn methods like GetEscapePfn() or for comparing against NULL function pointer
operator Func ( ) const {
return mFunc ;
}
private :
// Default template for GetID( ) for Thk function, causing compilation error !!
// Returns ID for specific ThkWrapper type
template < class Param >
unsigned int getId ( ) const {
static_assert ( 0 , " Template specialization for GetID is required for each new THKWrapper " ) ;
return 0 ;
}
// Template specializations of GetID(), required for every new Thk function
# define GET_ID(TYPE, VALUE) \
template < > \
unsigned int getId < TYPE > ( ) const { \
return VALUE ; \
}
GET_ID ( D3DKMT_OPENADAPTERFROMHDC * , SYSTIMER_ID_OPENADAPTERFROMHDC )
GET_ID ( D3DKMT_OPENADAPTERFROMLUID * , SYSTIMER_ID_OPENADAPTERFROMLUID )
GET_ID ( CONST D3DKMT_CLOSEADAPTER * , SYSTIMER_ID_CLOSEADAPTER )
GET_ID ( CONST D3DKMT_QUERYADAPTERINFO * , SYSTIMER_ID_QUERYADAPTERINFO )
GET_ID ( CONST D3DKMT_ESCAPE * , SYSTIMER_ID_ESCAPE )
GET_ID ( D3DKMT_CREATEDEVICE * , SYSTIMER_ID_CREATEDEVICE )
GET_ID ( CONST D3DKMT_DESTROYDEVICE * , SYSTIMER_ID_DESTROYDEVICE )
GET_ID ( D3DKMT_CREATECONTEXT * , SYSTIMER_ID_CREATECONTEXT )
GET_ID ( CONST D3DKMT_DESTROYCONTEXT * , SYSTIMER_ID_DESTROYCONTEXT )
GET_ID ( D3DKMT_CREATEALLOCATION * , SYSTIMER_ID_CREATEALLOCATION )
GET_ID ( CONST D3DKMT_DESTROYALLOCATION * , SYSTIMER_ID_DESTROYALLOCATION )
GET_ID ( D3DKMT_OPENRESOURCE * , SYSTIMER_ID_OPENRESOURCE )
GET_ID ( D3DKMT_QUERYRESOURCEINFO * , SYSTIMER_ID_QUERYRESOURCEINFO )
GET_ID ( D3DKMT_LOCK * , SYSTIMER_ID_LOCK )
GET_ID ( CONST D3DKMT_UNLOCK * , SYSTIMER_ID_UNLOCK )
GET_ID ( D3DKMT_RENDER * , SYSTIMER_ID_RENDER )
GET_ID ( D3DKMT_CREATESYNCHRONIZATIONOBJECT * , SYSTIMER_ID_CREATESYNCHRONIZATIONOBJECT )
GET_ID ( CONST D3DKMT_DESTROYSYNCHRONIZATIONOBJECT * , SYSTIMER_ID_DESTROYSYNCHRONIZATIONOBJECT )
GET_ID ( CONST D3DKMT_SIGNALSYNCHRONIZATIONOBJECT * , SYSTIMER_ID_SIGNALSYNCHRONIZATIONOBJECT )
2019-02-08 01:08:35 +08:00
GET_ID ( CONST_FROM_WDK_10_0_18328_0 D3DKMT_WAITFORSYNCHRONIZATIONOBJECT * , SYSTIMER_ID_WAITFORSYNCHRONIZATIONOBJECT )
2017-12-21 07:45:38 +08:00
GET_ID ( D3DKMT_CREATESYNCHRONIZATIONOBJECT2 * , SYSTIMER_ID_CREATESYNCHRONIZATIONOBJECT2 )
GET_ID ( D3DKMT_GETDEVICESTATE * , SYSTIMER_ID_GETDEVICESTATE )
GET_ID ( D3DDDI_MAKERESIDENT * , SYSTIMER_ID_MAKERESIDENT )
GET_ID ( D3DKMT_EVICT * , SYSTIMER_ID_EVICT )
GET_ID ( CONST D3DKMT_WAITFORSYNCHRONIZATIONOBJECTFROMCPU * , SYSTIMER_ID_WAITFORSYNCHRONIZATIONOBJECTFROMCPU )
GET_ID ( CONST D3DKMT_SIGNALSYNCHRONIZATIONOBJECTFROMCPU * , SYSTIMER_ID_SIGNALSYNCHRONIZATIONOBJECTFROMCPU )
GET_ID ( CONST D3DKMT_WAITFORSYNCHRONIZATIONOBJECTFROMGPU * , SYSTIMER_ID_WAITFORSYNCHRONIZATIONOBJECTFROMGPU )
GET_ID ( CONST D3DKMT_SIGNALSYNCHRONIZATIONOBJECTFROMGPU * , SYSTIMER_ID_SIGNALSYNCHRONIZATIONOBJECTFROMGPU )
GET_ID ( D3DKMT_CREATEPAGINGQUEUE * , SYSTIMER_ID_CREATEPAGINGQUEUE )
GET_ID ( D3DDDI_DESTROYPAGINGQUEUE * , SYSTIMER_ID_D3DDDI_DESTROYPAGINGQUEUE )
GET_ID ( D3DKMT_LOCK2 * , SYSTIMER_ID_LOCK2 )
GET_ID ( CONST D3DKMT_UNLOCK2 * , SYSTIMER_ID_UNLOCK2 )
GET_ID ( CONST D3DKMT_INVALIDATECACHE * , SYSTIMER_ID_INVALIDATECACHE )
GET_ID ( D3DDDI_MAPGPUVIRTUALADDRESS * , SYSTIMER_ID_D3DDDI_MAPGPUVIRTUALADDRESS )
GET_ID ( D3DDDI_RESERVEGPUVIRTUALADDRESS * , SYSTIMER_ID_D3DDDI_RESERVEGPUVIRTUALADDRESS )
GET_ID ( CONST D3DKMT_FREEGPUVIRTUALADDRESS * , SYSTIMER_ID_FREEGPUVIRTUALADDRESS )
GET_ID ( CONST D3DKMT_UPDATEGPUVIRTUALADDRESS * , SYSTIMER_ID_UPDATEGPUVIRTUALADDRESS )
GET_ID ( D3DKMT_CREATECONTEXTVIRTUAL * , SYSTIMER_ID_CREATECONTEXTVIRTUAL )
GET_ID ( CONST D3DKMT_SUBMITCOMMAND * , SYSTIMER_ID_SUBMITCOMMAND )
GET_ID ( D3DKMT_OPENSYNCOBJECTFROMNTHANDLE2 * , SYSTIMER_ID_OPENSYNCOBJECTFROMNTHANDLE2 )
GET_ID ( D3DKMT_OPENSYNCOBJECTNTHANDLEFROMNAME * , SYSTIMER_ID_OPENSYNCOBJECTNTHANDLEFROMNAME )
GET_ID ( CONST D3DKMT_DESTROYALLOCATION2 * , SYSTIMER_ID_DESTROYALLOCATION2 )
GET_ID ( D3DKMT_REGISTERTRIMNOTIFICATION * , SYSTIMER_ID_REGISTERTRIMNOTIFICATION )
GET_ID ( D3DKMT_UNREGISTERTRIMNOTIFICATION * , SYSTIMER_ID_UNREGISTERTRIMNOTIFICATION )
GET_ID ( D3DKMT_OPENRESOURCEFROMNTHANDLE * , SYSTIMER_ID_OPENRESOURCEFROMNTHANDLE )
GET_ID ( D3DKMT_QUERYRESOURCEINFOFROMNTHANDLE * , SYSTIMER_ID_QUERYRESOURCEINFOFROMNTHANDLE )
2018-05-18 16:18:16 +08:00
GET_ID ( D3DKMT_CREATEHWQUEUE * , SYSTIMER_ID_CREATEHWQUEUE )
GET_ID ( CONST D3DKMT_DESTROYHWQUEUE * , SYSTIMER_ID_DESTROYHWQUEUE )
GET_ID ( CONST D3DKMT_SUBMITCOMMANDTOHWQUEUE * , SYSTIMER_ID_SUBMITCOMMANDTOHWQUEUE )
2017-12-21 07:45:38 +08:00
} ;
2019-03-26 18:59:46 +08:00
} // namespace NEO