mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-25 23:07:18 +00:00
[c-host] dxgi: add the ability to specify the adapter and/or output.
Fixes #132
This commit is contained in:
parent
247e92937c
commit
83f63f4c42
@ -20,6 +20,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "interface/capture.h"
|
#include "interface/capture.h"
|
||||||
#include "interface/platform.h"
|
#include "interface/platform.h"
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
|
#include "common/option.h"
|
||||||
#include "windows/debug.h"
|
#include "windows/debug.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -101,6 +102,38 @@ static const char * dxgi_getName()
|
|||||||
return "DXGI";
|
return "DXGI";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dxgi_initOptions()
|
||||||
|
{
|
||||||
|
struct Option options[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.module = "dxgi",
|
||||||
|
.name = "adapter",
|
||||||
|
.description = "The name of the adapter to capture",
|
||||||
|
.value = {
|
||||||
|
.type = OPTION_TYPE_STRING,
|
||||||
|
.v.x_string = NULL
|
||||||
|
},
|
||||||
|
.validator = NULL,
|
||||||
|
.printHelp = NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.module = "dxgi",
|
||||||
|
.name = "output",
|
||||||
|
.description = "The name of the adapter's output to capture",
|
||||||
|
.value = {
|
||||||
|
.type = OPTION_TYPE_STRING,
|
||||||
|
.v.x_string = 0
|
||||||
|
},
|
||||||
|
.validator = NULL,
|
||||||
|
.printHelp = NULL
|
||||||
|
},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
option_register(options);
|
||||||
|
}
|
||||||
|
|
||||||
static bool dxgi_create()
|
static bool dxgi_create()
|
||||||
{
|
{
|
||||||
assert(!this);
|
assert(!this);
|
||||||
@ -170,11 +203,58 @@ static bool dxgi_init(void * pointerShape, const unsigned int pointerSize)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * optAdapter = option_get_string("dxgi", "adapter");
|
||||||
|
const char * optOutput = option_get_string("dxgi", "output" );
|
||||||
|
|
||||||
for(int i = 0; IDXGIFactory1_EnumAdapters1(this->factory, i, &this->adapter) != DXGI_ERROR_NOT_FOUND; ++i)
|
for(int i = 0; IDXGIFactory1_EnumAdapters1(this->factory, i, &this->adapter) != DXGI_ERROR_NOT_FOUND; ++i)
|
||||||
{
|
{
|
||||||
|
if (optAdapter)
|
||||||
|
{
|
||||||
|
DXGI_ADAPTER_DESC1 adapterDesc;
|
||||||
|
IDXGIAdapter1_GetDesc1(this->adapter, &adapterDesc);
|
||||||
|
|
||||||
|
const size_t s = (wcslen(adapterDesc.Description)+1) * 2;
|
||||||
|
size_t unused;
|
||||||
|
char * desc = malloc(s);
|
||||||
|
wcstombs_s(&unused, desc, s, adapterDesc.Description, _TRUNCATE);
|
||||||
|
|
||||||
|
if (strstr(desc, optAdapter) == NULL)
|
||||||
|
{
|
||||||
|
DEBUG_INFO("Not using adapter: %ls", adapterDesc.Description);
|
||||||
|
free(desc);
|
||||||
|
IDXGIAdapter1_Release(this->adapter);
|
||||||
|
this->adapter = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
free(desc);
|
||||||
|
|
||||||
|
DEBUG_INFO("Adapter matched, trying: %ls", adapterDesc.Description);
|
||||||
|
}
|
||||||
|
|
||||||
for(int n = 0; IDXGIAdapter1_EnumOutputs(this->adapter, n, &this->output) != DXGI_ERROR_NOT_FOUND; ++n)
|
for(int n = 0; IDXGIAdapter1_EnumOutputs(this->adapter, n, &this->output) != DXGI_ERROR_NOT_FOUND; ++n)
|
||||||
{
|
{
|
||||||
IDXGIOutput_GetDesc(this->output, &outputDesc);
|
IDXGIOutput_GetDesc(this->output, &outputDesc);
|
||||||
|
if (optOutput)
|
||||||
|
{
|
||||||
|
const size_t s = (wcslen(outputDesc.DeviceName)+1) * 2;
|
||||||
|
size_t unused;
|
||||||
|
char * desc = malloc(s);
|
||||||
|
wcstombs_s(&unused, desc, s, outputDesc.DeviceName, _TRUNCATE);
|
||||||
|
|
||||||
|
if (strstr(desc, optOutput) == NULL)
|
||||||
|
{
|
||||||
|
DEBUG_INFO("Not using adapter output: %ls", outputDesc.DeviceName);
|
||||||
|
free(desc);
|
||||||
|
IDXGIOutput_Release(this->output);
|
||||||
|
this->output = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(desc);
|
||||||
|
|
||||||
|
DEBUG_INFO("Adapter output matched, trying: %ls", outputDesc.DeviceName);
|
||||||
|
}
|
||||||
|
|
||||||
if (outputDesc.AttachedToDesktop)
|
if (outputDesc.AttachedToDesktop)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -745,6 +825,7 @@ static CaptureResult dxgi_releaseFrame()
|
|||||||
struct CaptureInterface Capture_DXGI =
|
struct CaptureInterface Capture_DXGI =
|
||||||
{
|
{
|
||||||
.getName = dxgi_getName,
|
.getName = dxgi_getName,
|
||||||
|
.initOptions = dxgi_initOptions,
|
||||||
.create = dxgi_create,
|
.create = dxgi_create,
|
||||||
.init = dxgi_init,
|
.init = dxgi_init,
|
||||||
.stop = dxgi_stop,
|
.stop = dxgi_stop,
|
||||||
|
Loading…
Reference in New Issue
Block a user