Get rid of dependency on CUDA SDK by dynamicaly loading the required functions

This commit is contained in:
BtbN 2014-01-05 23:05:24 +01:00
parent 562f5b4ff2
commit fc17383815
6 changed files with 149 additions and 13 deletions

View File

@ -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" />

View File

@ -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>

View 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

View File

@ -22,7 +22,7 @@
#pragma warning(disable: 4005)
#include <Main.h>
#include <cuda.h>
#include "cudaDynload.h"
#include "nvEncodeAPI.h"
extern ConfigFile **NvAppConfig;

View 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;
}

View File

@ -55,6 +55,9 @@ bool checkNvEnc()
if (iNvencDeviceCount != 0)
return true;
if (!dyLoadCuda())
return false;
checkCudaErrors(cuInit(0));
checkCudaErrors(cuDeviceGetCount(&deviceCount));