libobs: gs_duplicator_get_monitor_index

Helper function to find DXGI output index of HMONITOR.
master
jpark37 2021-01-26 16:22:21 -08:00
parent db35a022cd
commit 2b652cc763
5 changed files with 57 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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

View File

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