Quellcode durchsuchen

libobs: gs_duplicator_get_monitor_index

Helper function to find DXGI output index of HMONITOR.
jpark37 vor 4 Jahren
Ursprung
Commit
2b652cc763

+ 41 - 0
libobs-d3d11/d3d11-duplicator.cpp

@@ -122,6 +122,47 @@ EXPORT bool device_get_duplicator_monitor_info(gs_device_t *device,
 	return true;
 	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;
 static std::unordered_map<int, gs_duplicator *> instances;
 
 
 void reset_duplicators(void)
 void reset_duplicators(void)

+ 1 - 0
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_gdi_texture_available);
 	GRAPHICS_IMPORT(device_shared_texture_available);
 	GRAPHICS_IMPORT(device_shared_texture_available);
 	GRAPHICS_IMPORT_OPTIONAL(device_get_duplicator_monitor_info);
 	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(device_duplicator_create);
 	GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_destroy);
 	GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_destroy);
 	GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_update_frame);
 	GRAPHICS_IMPORT_OPTIONAL(gs_duplicator_update_frame);

+ 2 - 0
libobs/graphics/graphics-internal.h

@@ -287,6 +287,8 @@ struct gs_exports {
 	bool (*device_get_duplicator_monitor_info)(
 	bool (*device_get_duplicator_monitor_info)(
 		gs_device_t *device, int monitor_idx,
 		gs_device_t *device, int monitor_idx,
 		struct gs_monitor_info *monitor_info);
 		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,
 	gs_duplicator_t *(*device_duplicator_create)(gs_device_t *device,
 						     int monitor_idx);
 						     int monitor_idx);

+ 11 - 0
libobs/graphics/graphics.c

@@ -2850,6 +2850,17 @@ bool gs_get_duplicator_monitor_info(int monitor_idx,
 		thread_graphics->device, monitor_idx, monitor_info);
 		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)
 gs_duplicator_t *gs_duplicator_create(int monitor_idx)
 {
 {
 	if (!gs_valid("gs_duplicator_create"))
 	if (!gs_valid("gs_duplicator_create"))

+ 2 - 0
libobs/graphics/graphics.h

@@ -865,6 +865,8 @@ EXPORT bool
 gs_get_duplicator_monitor_info(int monitor_idx,
 gs_get_duplicator_monitor_info(int monitor_idx,
 			       struct gs_monitor_info *monitor_info);
 			       struct gs_monitor_info *monitor_info);
 
 
+EXPORT int gs_duplicator_get_monitor_index(void *monitor);
+
 /** creates a windows 8+ output duplicator (monitor capture) */
 /** creates a windows 8+ output duplicator (monitor capture) */
 EXPORT gs_duplicator_t *gs_duplicator_create(int monitor_idx);
 EXPORT gs_duplicator_t *gs_duplicator_create(int monitor_idx);
 EXPORT void gs_duplicator_destroy(gs_duplicator_t *duplicator);
 EXPORT void gs_duplicator_destroy(gs_duplicator_t *duplicator);