[host] nvfbc: try all NVIDIA adapters in the system

This will allow LG to start if the VM still has a virtual device as
the primary output.
This commit is contained in:
Geoffrey McRae 2022-05-18 16:27:17 +10:00
parent 0f8c0b5fb3
commit a41ab81a90
2 changed files with 33 additions and 5 deletions

View File

@ -12,6 +12,7 @@ include_directories(file, "${nvfbc_sdk}/inc")
target_link_libraries(capture_NVFBC target_link_libraries(capture_NVFBC
platform_Windows platform_Windows
dwmapi dwmapi
d3d9
) )
target_include_directories(capture_NVFBC target_include_directories(capture_NVFBC

View File

@ -36,6 +36,7 @@
#include <stdatomic.h> #include <stdatomic.h>
#include <windows.h> #include <windows.h>
#include <dwmapi.h> #include <dwmapi.h>
#include <d3d9.h>
#include <NvFBC/nvFBC.h> #include <NvFBC/nvFBC.h>
#include "wrapper.h" #include "wrapper.h"
@ -232,7 +233,7 @@ static void nvfbc_initOptions(void)
.name = "adapterIndex", .name = "adapterIndex",
.description = "The index of the adapter to capture from", .description = "The index of the adapter to capture from",
.type = OPTION_TYPE_INT, .type = OPTION_TYPE_INT,
.value.x_int = 0 .value.x_int = -1
}, },
{ {
.module = "nvfbc", .module = "nvfbc",
@ -315,16 +316,42 @@ static bool nvfbc_init(void)
} }
int adapterIndex = option_get_int("nvfbc", "adapterIndex"); int adapterIndex = option_get_int("nvfbc", "adapterIndex");
// NOTE: Calling this on hardware that doesn't support NvFBC such as GeForce // NOTE: Calling this on hardware that doesn't support NvFBC such as GeForce
// causes a substantial performance pentalty even if it fails! As such we only // causes a substantial performance pentalty even if it fails! As such we only
// attempt NvFBC as a last resort, or if configured via the app:capture // attempt NvFBC as a last resort, or if configured via the app:capture
// option. // option.
if (!NvFBCToSysCreate(adapterIndex, privData, privDataLen, &this->nvfbc, &this->maxWidth, &this->maxHeight)) if (adapterIndex < 0)
{ {
free(privData); IDirect3D9 * d3d = Direct3DCreate9(D3D_SDK_VERSION);
return false; int adapterCount = IDirect3D9_GetAdapterCount(d3d);
for(int i = 0; i < adapterCount; ++i)
{
D3DADAPTER_IDENTIFIER9 ident;
IDirect3D9_GetAdapterIdentifier(d3d, i, 0, &ident);
if (ident.VendorId != 0x10DE)
continue;
if (NvFBCToSysCreate(i, privData, privDataLen, &this->nvfbc,
&this->maxWidth, &this->maxHeight))
{
adapterIndex = i;
break;
}
}
IDirect3D9_Release(d3d);
if (adapterIndex < 0)
{
free(privData);
return false;
}
} }
else
if (!NvFBCToSysCreate(adapterIndex, privData, privDataLen, &this->nvfbc, &this->maxWidth, &this->maxHeight))
{
free(privData);
return false;
}
int diffRes = option_get_int("nvfbc", "diffRes"); int diffRes = option_get_int("nvfbc", "diffRes");
enum DiffMapBlockSize blockSize; enum DiffMapBlockSize blockSize;