2023-02-28 01:15:26 +00:00
// AUTOGENERATED COPYRIGHT HEADER START
// Copyright (C) 2020-2023 Michael Fabian 'Xaymar' Dirks <info@xaymar.com>
// AUTOGENERATED COPYRIGHT HEADER END
2020-03-20 22:10:19 +00:00
# include "nvidia-cuda-context.hpp"
2022-08-29 10:29:44 +00:00
# include "util/util-logging.hpp"
# include "warning-disable.hpp"
2020-11-08 05:47:47 +00:00
# include <cassert>
2020-03-20 22:10:19 +00:00
# include <stdexcept>
2022-08-29 10:29:44 +00:00
# include "warning-enable.hpp"
2020-11-07 08:00:12 +00:00
# ifdef _DEBUG
# define ST_PREFIX "<%s> "
# define D_LOG_ERROR(x, ...) P_LOG_ERROR(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__)
# define D_LOG_WARNING(x, ...) P_LOG_WARN(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__)
# define D_LOG_INFO(x, ...) P_LOG_INFO(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__)
# define D_LOG_DEBUG(x, ...) P_LOG_DEBUG(ST_PREFIX##x, __FUNCTION_SIG__, __VA_ARGS__)
# else
# define ST_PREFIX "<nvidia::cuda::context> "
# define D_LOG_ERROR(...) P_LOG_ERROR(ST_PREFIX __VA_ARGS__)
# define D_LOG_WARNING(...) P_LOG_WARN(ST_PREFIX __VA_ARGS__)
# define D_LOG_INFO(...) P_LOG_INFO(ST_PREFIX __VA_ARGS__)
# define D_LOG_DEBUG(...) P_LOG_DEBUG(ST_PREFIX __VA_ARGS__)
# endif
2020-03-20 22:10:19 +00:00
# ifdef WIN32
2022-08-29 10:29:44 +00:00
# include "warning-disable.hpp"
2020-03-20 22:10:19 +00:00
# include <atlutil.h>
2022-08-29 10:29:44 +00:00
# include "warning-enable.hpp"
2020-03-20 22:10:19 +00:00
# endif
2020-11-08 05:47:47 +00:00
# define ENABLE_STACK_CHECKS
2021-06-16 10:16:35 +00:00
streamfx : : nvidia : : cuda : : context : : ~ context ( )
2020-03-20 22:10:19 +00:00
{
2020-11-07 08:00:12 +00:00
D_LOG_DEBUG ( " Finalizing... (Addr: 0x% " PRIuPTR " ) " , this ) ;
2020-03-20 22:10:19 +00:00
if ( _has_device ) {
_cuda - > cuDevicePrimaryCtxRelease ( _device ) ;
2021-06-17 10:13:22 +00:00
} else {
_cuda - > cuCtxDestroy ( _ctx ) ;
2020-03-20 22:10:19 +00:00
}
}
2023-05-13 12:35:46 +00:00
streamfx : : nvidia : : cuda : : context : : context ( ) : _cuda ( : : streamfx : : nvidia : : cuda : : cuda : : get ( ) ) , _ctx ( ) , _has_device ( false ) , _device ( )
2020-11-08 05:47:47 +00:00
{
D_LOG_DEBUG ( " Initializating... (Addr: 0x% " PRIuPTR " ) " , this ) ;
}
2020-03-20 22:10:19 +00:00
# ifdef WIN32
2021-06-16 10:16:35 +00:00
streamfx : : nvidia : : cuda : : context : : context ( ID3D11Device * device ) : context ( )
2020-03-20 22:10:19 +00:00
{
2021-06-16 10:16:35 +00:00
using namespace streamfx : : nvidia : : cuda ;
2020-03-20 22:10:19 +00:00
if ( ! device )
throw std : : invalid_argument ( " device " ) ;
// Get DXGI Device
IDXGIDevice * dxgi_device ; // Don't use ATL::CComPtr
device - > QueryInterface ( __uuidof ( IDXGIDevice ) , ( void * * ) & dxgi_device ) ;
// Get DXGI Adapter
ATL : : CComPtr < IDXGIAdapter > dxgi_adapter ;
dxgi_device - > GetAdapter ( & dxgi_adapter ) ;
// Get Device Index
2020-06-14 17:17:26 +00:00
if ( result res = _cuda - > cuD3D11GetDevice ( & _device , dxgi_adapter ) ; res ! = result : : SUCCESS ) {
2020-03-20 22:10:19 +00:00
throw std : : runtime_error ( " Failed to get device index for device. " ) ;
}
2021-06-17 10:13:22 +00:00
_cuda - > cuDevicePrimaryCtxSetFlags ( _device , context_flags : : SCHEDULER_BLOCKING_SYNC ) ;
2020-03-20 22:10:19 +00:00
// Acquire Context
2020-06-14 17:17:26 +00:00
if ( result res = _cuda - > cuDevicePrimaryCtxRetain ( & _ctx , _device ) ; res ! = result : : SUCCESS ) {
2020-03-20 22:10:19 +00:00
throw std : : runtime_error ( " Failed to acquire primary device context. " ) ;
}
2020-04-11 01:12:39 +00:00
2021-06-17 09:44:04 +00:00
// Log some information.
std : : string device_name ;
uuid_t device_uuid ;
luid_t device_luid ;
uint32_t device_luid_mask ;
{
// Device Name
std : : vector < char > name ( 256 , 0 ) ;
2021-09-07 03:11:04 +00:00
_cuda - > cuDeviceGetName ( name . data ( ) , static_cast < int32_t > ( name . size ( ) - 1 ) , _device ) ;
2021-06-17 09:44:04 +00:00
device_name = std : : string ( name . data ( ) , name . data ( ) + strlen ( name . data ( ) ) ) ;
// Device LUID
_cuda - > cuDeviceGetLuid ( & device_luid , & device_luid_mask , _device ) ;
// Device UUID
_cuda - > cuDeviceGetUuid ( & device_uuid , _device ) ;
}
2023-05-13 12:35:46 +00:00
D_LOG_INFO ( " Initialized CUDA on device '%s' (%08 " PRIx32 " -%04 " PRIx16 " -%04 " PRIx16 " -%04 " PRIx16 " -%04 " PRIx16 " %08 " PRIx32 " , %08 " PRIx64 " , % " PRIu32 " ). " , device_name . c_str ( ) , device_uuid . uuid . a , device_uuid . uuid . b , device_uuid . uuid . c , device_uuid . uuid . d , device_uuid . uuid . e , device_uuid . uuid . f , device_luid . luid , device_luid_mask ) ;
2021-06-17 09:44:04 +00:00
2020-03-20 22:10:19 +00:00
_has_device = true ;
}
# endif
2021-06-16 10:16:35 +00:00
: : streamfx : : nvidia : : cuda : : context_t streamfx : : nvidia : : cuda : : context : : get ( )
2020-03-20 22:10:19 +00:00
{
return _ctx ;
}
2020-11-08 05:47:47 +00:00
2021-06-16 10:16:35 +00:00
std : : shared_ptr < : : streamfx : : nvidia : : cuda : : context_stack > streamfx : : nvidia : : cuda : : context : : enter ( )
2020-11-08 05:47:47 +00:00
{
2021-06-16 10:16:35 +00:00
return std : : make_shared < : : streamfx : : nvidia : : cuda : : context_stack > ( shared_from_this ( ) ) ;
2020-11-08 05:47:47 +00:00
}
2021-06-16 10:16:35 +00:00
void streamfx : : nvidia : : cuda : : context : : push ( )
2020-11-08 05:47:47 +00:00
{
2021-06-16 10:16:35 +00:00
if ( auto res = _cuda - > cuCtxPushCurrent ( _ctx ) ; res ! = : : streamfx : : nvidia : : cuda : : result : : SUCCESS ) {
throw : : streamfx : : nvidia : : cuda : : cuda_error ( res ) ;
2020-11-08 05:47:47 +00:00
}
}
2021-06-16 10:16:35 +00:00
void streamfx : : nvidia : : cuda : : context : : pop ( )
2020-11-08 05:47:47 +00:00
{
# ifdef ENABLE_STACK_CHECKS
2021-06-16 10:16:35 +00:00
: : streamfx : : nvidia : : cuda : : context_t ctx ;
if ( _cuda - > cuCtxGetCurrent ( & ctx ) = = : : streamfx : : nvidia : : cuda : : result : : SUCCESS )
2020-11-08 05:47:47 +00:00
assert ( ctx = = _ctx ) ;
# endif
2021-06-16 10:16:35 +00:00
assert ( _cuda - > cuCtxPopCurrent ( & ctx ) = = : : streamfx : : nvidia : : cuda : : result : : SUCCESS ) ;
2020-11-08 05:47:47 +00:00
}
2021-06-16 10:16:35 +00:00
void streamfx : : nvidia : : cuda : : context : : synchronize ( )
2020-11-08 05:47:47 +00:00
{
2021-06-23 12:32:14 +00:00
//D_LOG_DEBUG("Synchronizing... (Addr: 0x%" PRIuPTR ")", this);
2020-11-08 05:47:47 +00:00
# ifdef ENABLE_STACK_CHECKS
2021-06-16 10:16:35 +00:00
: : streamfx : : nvidia : : cuda : : context_t ctx ;
if ( _cuda - > cuCtxGetCurrent ( & ctx ) = = : : streamfx : : nvidia : : cuda : : result : : SUCCESS )
2020-11-08 05:47:47 +00:00
assert ( ctx = = _ctx ) ;
# endif
2021-06-16 10:16:35 +00:00
if ( auto res = _cuda - > cuCtxSynchronize ( ) ; res ! = : : streamfx : : nvidia : : cuda : : result : : SUCCESS ) {
throw : : streamfx : : nvidia : : cuda : : cuda_error ( res ) ;
2020-11-08 05:47:47 +00:00
}
}