[c-host] dxgi: add the ability to specify the adapter and/or output.

Fixes #132
This commit is contained in:
Geoffrey McRae 2019-05-09 22:48:39 +10:00
parent 247e92937c
commit 83f63f4c42
2 changed files with 82 additions and 1 deletions

View File

@ -1 +1 @@
a12-164-g63314941f6+1 a12-165-g247e92937c+1

View File

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