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>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<SDLCheck>true</SDLCheck>
|
<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>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -105,13 +105,13 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<SDLCheck>true</SDLCheck>
|
<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>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -126,15 +126,15 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<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>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb32\$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb32\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -149,15 +149,15 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<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>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalLibraryDirectories>$(CUDA_PATH)\lib\$(Platform);$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(SolutionDir)\OBSApi\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>cuda.lib;OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>OBSApi.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(SolutionDir)\rundir\pdb64\$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(SolutionDir)\rundir\pdb64\stripped\$(TargetName).pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -166,11 +166,13 @@
|
|||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="src\cudaDynload.cpp" />
|
||||||
<ClCompile Include="src\NVENCEncoder.cpp" />
|
<ClCompile Include="src\NVENCEncoder.cpp" />
|
||||||
<ClCompile Include="src\nvmain.cpp" />
|
<ClCompile Include="src\nvmain.cpp" />
|
||||||
<ClCompile Include="src\nvEncodeAPI.cpp" />
|
<ClCompile Include="src\nvEncodeAPI.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="inc\cudaDynload.h" />
|
||||||
<ClInclude Include="inc\license.h" />
|
<ClInclude Include="inc\license.h" />
|
||||||
<ClInclude Include="inc\NVENCEncoder.h" />
|
<ClInclude Include="inc\NVENCEncoder.h" />
|
||||||
<ClInclude Include="inc\nvmain.h" />
|
<ClInclude Include="inc\nvmain.h" />
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
<ClCompile Include="src\NVENCEncoder.cpp">
|
<ClCompile Include="src\NVENCEncoder.cpp">
|
||||||
<Filter>Quelldateien</Filter>
|
<Filter>Quelldateien</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\cudaDynload.cpp">
|
||||||
|
<Filter>Quelldateien</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="inc\nvEncodeAPI.h">
|
<ClInclude Include="inc\nvEncodeAPI.h">
|
||||||
@ -34,5 +37,8 @@
|
|||||||
<ClInclude Include="inc\NVENCEncoder.h">
|
<ClInclude Include="inc\NVENCEncoder.h">
|
||||||
<Filter>Headerdateien</Filter>
|
<Filter>Headerdateien</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="inc\cudaDynload.h">
|
||||||
|
<Filter>Headerdateien</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</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)
|
#pragma warning(disable: 4005)
|
||||||
|
|
||||||
#include <Main.h>
|
#include <Main.h>
|
||||||
#include <cuda.h>
|
#include "cudaDynload.h"
|
||||||
#include "nvEncodeAPI.h"
|
#include "nvEncodeAPI.h"
|
||||||
|
|
||||||
extern ConfigFile **NvAppConfig;
|
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)
|
if (iNvencDeviceCount != 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (!dyLoadCuda())
|
||||||
|
return false;
|
||||||
|
|
||||||
checkCudaErrors(cuInit(0));
|
checkCudaErrors(cuInit(0));
|
||||||
|
|
||||||
checkCudaErrors(cuDeviceGetCount(&deviceCount));
|
checkCudaErrors(cuDeviceGetCount(&deviceCount));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user