libobs: gs_duplicator_get_monitor_index
Helper function to find DXGI output index of HMONITOR.master
parent
db35a022cd
commit
2b652cc763
|
@ -122,6 +122,47 @@ EXPORT bool device_get_duplicator_monitor_info(gs_device_t *device,
|
|||
return true;
|
||||
}
|
||||
|
||||
EXPORT int device_duplicator_get_monitor_index(gs_device_t *device,
|
||||
void *monitor)
|
||||
{
|
||||
const HMONITOR handle = (HMONITOR)monitor;
|
||||
|
||||
int index = -1;
|
||||
|
||||
UINT output = 0;
|
||||
while (index == -1) {
|
||||
IDXGIOutput *pOutput;
|
||||
const HRESULT hr =
|
||||
device->adapter->EnumOutputs(output, &pOutput);
|
||||
if (hr == DXGI_ERROR_NOT_FOUND)
|
||||
break;
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
DXGI_OUTPUT_DESC desc;
|
||||
if (SUCCEEDED(pOutput->GetDesc(&desc))) {
|
||||
if (desc.Monitor == handle)
|
||||
index = output;
|
||||
} else {
|
||||
blog(LOG_ERROR,
|
||||
"device_duplicator_get_monitor_index: "
|
||||
"Failed to get desc (%08lX)",
|
||||
hr);
|
||||
}
|
||||
|
||||
pOutput->Release();
|
||||
} else if (hr == DXGI_ERROR_NOT_FOUND) {
|
||||
blog(LOG_ERROR,
|
||||
"device_duplicator_get_monitor_index: "
|
||||
"Failed to get output (%08lX)",
|
||||
hr);
|
||||
}
|
||||
|
||||
++output;
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
static std::unordered_map<int, gs_duplicator *> instances;
|
||||
|
||||
void reset_duplicators(void)
|
||||
|
|
|
@ -205,6 +205,7 @@ bool load_graphics_imports(struct gs_exports *exports, void *module,
|
|||
GRAPHICS_IMPORT(device_gdi_texture_available);
|
||||
GRAPHICS_IMPORT(device_shared_texture_available);
|
||||
GRAPHICS_IMPORT_OPTIONAL(device_get_duplicator_monitor_info);
|
||||
GRAPHICS_IMPORT_OPTIONAL(device_duplicator_get_monitor_index);
|
||||
GRAPHICS_IMPORT_OPTIONAL(device_duplicator_create);
|
||||
GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_destroy);
|
||||
GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_update_frame);
|
||||
|
|
|
@ -287,6 +287,8 @@ struct gs_exports {
|
|||
bool (*device_get_duplicator_monitor_info)(
|
||||
gs_device_t *device, int monitor_idx,
|
||||
struct gs_monitor_info *monitor_info);
|
||||
int (*device_duplicator_get_monitor_index)(gs_device_t *device,
|
||||
void *monitor);
|
||||
|
||||
gs_duplicator_t *(*device_duplicator_create)(gs_device_t *device,
|
||||
int monitor_idx);
|
||||
|
|
|
@ -2850,6 +2850,17 @@ bool gs_get_duplicator_monitor_info(int monitor_idx,
|
|||
thread_graphics->device, monitor_idx, monitor_info);
|
||||
}
|
||||
|
||||
int gs_duplicator_get_monitor_index(void *monitor)
|
||||
{
|
||||
if (!gs_valid("gs_duplicator_get_monitor_index"))
|
||||
return false;
|
||||
if (!thread_graphics->exports.device_duplicator_get_monitor_index)
|
||||
return false;
|
||||
|
||||
return thread_graphics->exports.device_duplicator_get_monitor_index(
|
||||
thread_graphics->device, monitor);
|
||||
}
|
||||
|
||||
gs_duplicator_t *gs_duplicator_create(int monitor_idx)
|
||||
{
|
||||
if (!gs_valid("gs_duplicator_create"))
|
||||
|
|
|
@ -865,6 +865,8 @@ EXPORT bool
|
|||
gs_get_duplicator_monitor_info(int monitor_idx,
|
||||
struct gs_monitor_info *monitor_info);
|
||||
|
||||
EXPORT int gs_duplicator_get_monitor_index(void *monitor);
|
||||
|
||||
/** creates a windows 8+ output duplicator (monitor capture) */
|
||||
EXPORT gs_duplicator_t *gs_duplicator_create(int monitor_idx);
|
||||
EXPORT void gs_duplicator_destroy(gs_duplicator_t *duplicator);
|
||||
|
|
Loading…
Reference in New Issue