Get rid of dependency on CUDA SDK by dynamicaly loading the required functions
This commit is contained in:
parent
562f5b4ff2
commit
fc17383815
@ -86,13 +86,13 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(CUDA_PATH)\include;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||
</Link>
|
||||
@ -105,13 +105,13 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(CUDA_PATH)\include;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||
</Link>
|
||||
@ -126,15 +126,15 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(CUDA_PATH)\include;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||
</Link>
|
||||
@ -149,15 +149,15 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(CUDA_PATH)\include;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)\license;$(ProjectDir)\inc;$(SolutionDir)\OBSApi;$(SolutionDir)\Source;$(SolutionDir)\extras;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||
</Link>
|
||||
@ -166,11 +166,13 @@
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\cudaDynload.cpp" />
|
||||
<ClCompile Include="src\NVENCEncoder.cpp" />
|
||||
<ClCompile Include="src\nvmain.cpp" />
|
||||
<ClCompile Include="src\nvEncodeAPI.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="inc\cudaDynload.h" />
|
||||
<ClInclude Include="inc\license.h" />
|
||||
<ClInclude Include="inc\NVENCEncoder.h" />
|
||||
<ClInclude Include="inc\nvmain.h" />
|
||||
|
@ -20,6 +20,9 @@
|
||||
<ClCompile Include="src\NVENCEncoder.cpp">
|
||||
<Filter>Quelldateien</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\cudaDynload.cpp">
|
||||
<Filter>Quelldateien</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="inc\nvEncodeAPI.h">
|
||||
@ -34,5 +37,8 @@
|
||||
<ClInclude Include="inc\NVENCEncoder.h">
|
||||
<Filter>Headerdateien</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\cudaDynload.h">
|
||||
<Filter>Headerdateien</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
50
ObsNvenc/inc/cudaDynload.h
Normal file
50
ObsNvenc/inc/cudaDynload.h
Normal file
@ -0,0 +1,50 @@
|
||||
/********************************************************************************
|
||||
Copyright (C) 2014 Timo Rothenpieler <timo@rothenpieler.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
********************************************************************************/
|
||||
|
||||
#ifndef H_OBSNVENC_CUDADYNLOAD__H
|
||||
#define H_OBSNVENC_CUDADYNLOAD__H
|
||||
|
||||
typedef enum cudaError_enum {
|
||||
CUDA_SUCCESS = 0
|
||||
} CUresult;
|
||||
typedef int CUdevice;
|
||||
typedef void* CUcontext;
|
||||
|
||||
#define CUDAAPI __stdcall
|
||||
|
||||
typedef CUresult(CUDAAPI *PCUINIT)(unsigned int Flags);
|
||||
typedef CUresult(CUDAAPI *PCUDEVICEGETCOUNT)(int *count);
|
||||
typedef CUresult(CUDAAPI *PCUDEVICEGET)(CUdevice *device, int ordinal);
|
||||
typedef CUresult(CUDAAPI *PCUDEVICEGETNAME)(char *name, int len, CUdevice dev);
|
||||
typedef CUresult(CUDAAPI *PCUDEVICECOMPUTECAPABILITY)(int *major, int *minor, CUdevice dev);
|
||||
typedef CUresult(CUDAAPI *PCUCTXCREATE)(CUcontext *pctx, unsigned int flags, CUdevice dev);
|
||||
typedef CUresult(CUDAAPI *PCUCTXPOPCURRENT)(CUcontext *pctx);
|
||||
typedef CUresult(CUDAAPI *PCUCTXDESTROY)(CUcontext ctx);
|
||||
|
||||
extern PCUINIT cuInit;
|
||||
extern PCUDEVICEGETCOUNT cuDeviceGetCount;
|
||||
extern PCUDEVICEGET cuDeviceGet;
|
||||
extern PCUDEVICEGETNAME cuDeviceGetName;
|
||||
extern PCUDEVICECOMPUTECAPABILITY cuDeviceComputeCapability;
|
||||
extern PCUCTXCREATE cuCtxCreate;
|
||||
extern PCUCTXPOPCURRENT cuCtxPopCurrent;
|
||||
extern PCUCTXDESTROY cuCtxDestroy;
|
||||
|
||||
bool dyLoadCuda();
|
||||
|
||||
#endif
|
@ -22,7 +22,7 @@
|
||||
#pragma warning(disable: 4005)
|
||||
|
||||
#include <Main.h>
|
||||
#include <cuda.h>
|
||||
#include "cudaDynload.h"
|
||||
#include "nvEncodeAPI.h"
|
||||
|
||||
extern ConfigFile **NvAppConfig;
|
||||
|
75
ObsNvenc/src/cudaDynload.cpp
Normal file
75
ObsNvenc/src/cudaDynload.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
/********************************************************************************
|
||||
Copyright (C) 2014 Timo Rothenpieler <timo@rothenpieler.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
********************************************************************************/
|
||||
|
||||
#include "nvmain.h"
|
||||
#include "cudaDynload.h"
|
||||
|
||||
PCUINIT cuInit = NULL;
|
||||
PCUDEVICEGETCOUNT cuDeviceGetCount = NULL;
|
||||
PCUDEVICEGET cuDeviceGet = NULL;
|
||||
PCUDEVICEGETNAME cuDeviceGetName = NULL;
|
||||
PCUDEVICECOMPUTECAPABILITY cuDeviceComputeCapability = NULL;
|
||||
PCUCTXCREATE cuCtxCreate = NULL;
|
||||
PCUCTXPOPCURRENT cuCtxPopCurrent = NULL;
|
||||
PCUCTXDESTROY cuCtxDestroy = NULL;
|
||||
|
||||
static HMODULE cudaLib = NULL;
|
||||
|
||||
#define CHECK_LOAD_FUNC(f, s) \
|
||||
{ \
|
||||
f = (decltype(f))GetProcAddress(cudaLib, s); \
|
||||
if (f == NULL) \
|
||||
{ \
|
||||
NvLog(TEXT("Failed loading %S from CUDA library"), s); \
|
||||
goto error; \
|
||||
} \
|
||||
}
|
||||
|
||||
bool dyLoadCuda()
|
||||
{
|
||||
if (cudaLib != NULL)
|
||||
return true;
|
||||
|
||||
cudaLib = LoadLibrary(TEXT("nvcuda.dll"));
|
||||
if (cudaLib == NULL)
|
||||
{
|
||||
NvLog(TEXT("Failed loading CUDA dll"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
CHECK_LOAD_FUNC(cuInit, "cuInit");
|
||||
CHECK_LOAD_FUNC(cuDeviceGetCount, "cuDeviceGetCount");
|
||||
CHECK_LOAD_FUNC(cuDeviceGet, "cuDeviceGet");
|
||||
CHECK_LOAD_FUNC(cuDeviceGetName, "cuDeviceGetName");
|
||||
CHECK_LOAD_FUNC(cuDeviceComputeCapability, "cuDeviceComputeCapability");
|
||||
CHECK_LOAD_FUNC(cuCtxCreate, "cuCtxCreate_v2");
|
||||
CHECK_LOAD_FUNC(cuCtxPopCurrent, "cuCtxPopCurrent_v2");
|
||||
CHECK_LOAD_FUNC(cuCtxDestroy, "cuCtxDestroy");
|
||||
|
||||
NvLog(TEXT("CUDA loaded successfully"));
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
|
||||
if (cudaLib != NULL)
|
||||
FreeLibrary(cudaLib);
|
||||
cudaLib = NULL;
|
||||
|
||||
return false;
|
||||
}
|
@ -55,6 +55,9 @@ bool checkNvEnc()
|
||||
if (iNvencDeviceCount != 0)
|
||||
return true;
|
||||
|
||||
if (!dyLoadCuda())
|
||||
return false;
|
||||
|
||||
checkCudaErrors(cuInit(0));
|
||||
|
||||
checkCudaErrors(cuDeviceGetCount(&deviceCount));
|
||||
|
Loading…
x
Reference in New Issue
Block a user