diff --git a/libobs-d3d11/d3d11-duplicator.cpp b/libobs-d3d11/d3d11-duplicator.cpp index 844a86c9a..e2968e797 100644 --- a/libobs-d3d11/d3d11-duplicator.cpp +++ b/libobs-d3d11/d3d11-duplicator.cpp @@ -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 instances; void reset_duplicators(void) diff --git a/libobs/graphics/graphics-imports.c b/libobs/graphics/graphics-imports.c index c12a993c3..bd4555bb3 100644 --- a/libobs/graphics/graphics-imports.c +++ b/libobs/graphics/graphics-imports.c @@ -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); diff --git a/libobs/graphics/graphics-internal.h b/libobs/graphics/graphics-internal.h index 260837160..5b3f29bac 100644 --- a/libobs/graphics/graphics-internal.h +++ b/libobs/graphics/graphics-internal.h @@ -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); diff --git a/libobs/graphics/graphics.c b/libobs/graphics/graphics.c index d15fd9881..bc8c436d1 100644 --- a/libobs/graphics/graphics.c +++ b/libobs/graphics/graphics.c @@ -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")) diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h index ec1eb9979..f461d0a15 100644 --- a/libobs/graphics/graphics.h +++ b/libobs/graphics/graphics.h @@ -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);