2020-09-19 07:38:13 +00:00
|
|
|
From 5af41c0c15639b58491b573e6c00eb6e9c7272a2 Mon Sep 17 00:00:00 2001
|
2020-09-01 10:47:53 +00:00
|
|
|
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
|
|
Date: Thu, 12 Mar 2020 23:50:18 -0300
|
2020-09-19 07:38:13 +00:00
|
|
|
Subject: [PATCH 22/24] libobs/graphics: Add Linux-only
|
2020-09-01 10:47:53 +00:00
|
|
|
device_texture_create_from_dmabuf
|
|
|
|
|
|
|
|
The implementation are stubs as of now
|
|
|
|
---
|
|
|
|
libobs-opengl/gl-nix.c | 11 +++++++++++
|
|
|
|
libobs-opengl/gl-nix.h | 6 ++++++
|
|
|
|
libobs-opengl/gl-wayland-egl.c | 21 +++++++++++++++++++++
|
|
|
|
libobs-opengl/gl-x11-egl.c | 21 +++++++++++++++++++++
|
|
|
|
libobs-opengl/gl-x11-glx.c | 21 +++++++++++++++++++++
|
|
|
|
libobs/graphics/device-exports.h | 10 ++++++++++
|
|
|
|
libobs/graphics/graphics-imports.c | 2 ++
|
|
|
|
libobs/graphics/graphics-internal.h | 6 ++++++
|
|
|
|
libobs/graphics/graphics.c | 19 +++++++++++++++++++
|
|
|
|
libobs/graphics/graphics.h | 9 +++++++++
|
|
|
|
10 files changed, 126 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/libobs-opengl/gl-nix.c b/libobs-opengl/gl-nix.c
|
|
|
|
index 6c272c3d..acbd154a 100644
|
|
|
|
--- a/libobs-opengl/gl-nix.c
|
|
|
|
+++ b/libobs-opengl/gl-nix.c
|
|
|
|
@@ -123,3 +123,14 @@ extern void device_present(gs_device_t *device)
|
|
|
|
{
|
|
|
|
gl_vtable->device_present(device);
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+extern struct gs_texture *device_texture_create_from_dmabuf(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers)
|
|
|
|
+{
|
|
|
|
+ return gl_vtable->device_texture_create_from_dmabuf(
|
|
|
|
+ device, width, height, color_format, n_planes, fds, strides,
|
|
|
|
+ offsets, modifiers);
|
|
|
|
+}
|
|
|
|
diff --git a/libobs-opengl/gl-nix.h b/libobs-opengl/gl-nix.h
|
|
|
|
index 741154da..3038c0cf 100644
|
|
|
|
--- a/libobs-opengl/gl-nix.h
|
|
|
|
+++ b/libobs-opengl/gl-nix.h
|
|
|
|
@@ -53,4 +53,10 @@ struct gl_winsys_vtable {
|
|
|
|
gs_swapchain_t *swap);
|
|
|
|
|
|
|
|
void (*device_present)(gs_device_t *device);
|
|
|
|
+
|
|
|
|
+ struct gs_texture *(*device_texture_create_from_dmabuf)(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes,
|
|
|
|
+ const int *fds, const uint32_t *strides,
|
|
|
|
+ const uint32_t *offsets, const uint64_t *modifiers);
|
|
|
|
};
|
|
|
|
diff --git a/libobs-opengl/gl-wayland-egl.c b/libobs-opengl/gl-wayland-egl.c
|
|
|
|
index aad6993e..3968736d 100644
|
|
|
|
--- a/libobs-opengl/gl-wayland-egl.c
|
|
|
|
+++ b/libobs-opengl/gl-wayland-egl.c
|
|
|
|
@@ -319,6 +319,25 @@ static void gl_wayland_egl_device_present(gs_device_t *device)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+static struct gs_texture *gl_wayland_egl_device_texture_create_from_dmabuf(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers)
|
|
|
|
+{
|
|
|
|
+ UNUSED_PARAMETER(device);
|
|
|
|
+ UNUSED_PARAMETER(width);
|
|
|
|
+ UNUSED_PARAMETER(height);
|
|
|
|
+ UNUSED_PARAMETER(color_format);
|
|
|
|
+ UNUSED_PARAMETER(n_planes);
|
|
|
|
+ UNUSED_PARAMETER(fds);
|
|
|
|
+ UNUSED_PARAMETER(strides);
|
|
|
|
+ UNUSED_PARAMETER(offsets);
|
|
|
|
+ UNUSED_PARAMETER(modifiers);
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static const struct gl_winsys_vtable egl_wayland_winsys_vtable = {
|
|
|
|
.windowinfo_create = gl_wayland_egl_windowinfo_create,
|
|
|
|
.windowinfo_destroy = gl_wayland_egl_windowinfo_destroy,
|
|
|
|
@@ -334,6 +353,8 @@ static const struct gl_winsys_vtable egl_wayland_winsys_vtable = {
|
|
|
|
.update = gl_wayland_egl_update,
|
|
|
|
.device_load_swapchain = gl_wayland_egl_device_load_swapchain,
|
|
|
|
.device_present = gl_wayland_egl_device_present,
|
|
|
|
+ .device_texture_create_from_dmabuf =
|
|
|
|
+ gl_wayland_egl_device_texture_create_from_dmabuf,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct gl_winsys_vtable *gl_wayland_egl_get_winsys_vtable(void)
|
|
|
|
diff --git a/libobs-opengl/gl-x11-egl.c b/libobs-opengl/gl-x11-egl.c
|
|
|
|
index 47b8e420..7a9c5975 100644
|
|
|
|
--- a/libobs-opengl/gl-x11-egl.c
|
|
|
|
+++ b/libobs-opengl/gl-x11-egl.c
|
|
|
|
@@ -634,6 +634,25 @@ static void gl_x11_egl_device_present(gs_device_t *device)
|
|
|
|
get_egl_error_string());
|
|
|
|
}
|
|
|
|
|
|
|
|
+static struct gs_texture *gl_x11_egl_device_texture_create_from_dmabuf(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers)
|
|
|
|
+{
|
|
|
|
+ UNUSED_PARAMETER(device);
|
|
|
|
+ UNUSED_PARAMETER(width);
|
|
|
|
+ UNUSED_PARAMETER(height);
|
|
|
|
+ UNUSED_PARAMETER(color_format);
|
|
|
|
+ UNUSED_PARAMETER(n_planes);
|
|
|
|
+ UNUSED_PARAMETER(fds);
|
|
|
|
+ UNUSED_PARAMETER(strides);
|
|
|
|
+ UNUSED_PARAMETER(offsets);
|
|
|
|
+ UNUSED_PARAMETER(modifiers);
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static const struct gl_winsys_vtable egl_x11_winsys_vtable = {
|
|
|
|
.windowinfo_create = gl_x11_egl_windowinfo_create,
|
|
|
|
.windowinfo_destroy = gl_x11_egl_windowinfo_destroy,
|
|
|
|
@@ -649,6 +668,8 @@ static const struct gl_winsys_vtable egl_x11_winsys_vtable = {
|
|
|
|
.update = gl_x11_egl_update,
|
|
|
|
.device_load_swapchain = gl_x11_egl_device_load_swapchain,
|
|
|
|
.device_present = gl_x11_egl_device_present,
|
|
|
|
+ .device_texture_create_from_dmabuf =
|
|
|
|
+ gl_x11_egl_device_texture_create_from_dmabuf,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct gl_winsys_vtable *gl_x11_egl_get_winsys_vtable(void)
|
|
|
|
diff --git a/libobs-opengl/gl-x11-glx.c b/libobs-opengl/gl-x11-glx.c
|
|
|
|
index a562b564..802be3ef 100644
|
|
|
|
--- a/libobs-opengl/gl-x11-glx.c
|
|
|
|
+++ b/libobs-opengl/gl-x11-glx.c
|
|
|
|
@@ -579,6 +579,25 @@ static void gl_x11_glx_device_present(gs_device_t *device)
|
|
|
|
glXSwapBuffers(display, window);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static struct gs_texture *gl_x11_glx_device_texture_create_from_dmabuf(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers)
|
|
|
|
+{
|
|
|
|
+ UNUSED_PARAMETER(device);
|
|
|
|
+ UNUSED_PARAMETER(width);
|
|
|
|
+ UNUSED_PARAMETER(height);
|
|
|
|
+ UNUSED_PARAMETER(color_format);
|
|
|
|
+ UNUSED_PARAMETER(n_planes);
|
|
|
|
+ UNUSED_PARAMETER(fds);
|
|
|
|
+ UNUSED_PARAMETER(strides);
|
|
|
|
+ UNUSED_PARAMETER(offsets);
|
|
|
|
+ UNUSED_PARAMETER(modifiers);
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static const struct gl_winsys_vtable glx_winsys_vtable = {
|
|
|
|
.windowinfo_create = gl_x11_glx_windowinfo_create,
|
|
|
|
.windowinfo_destroy = gl_x11_glx_windowinfo_destroy,
|
|
|
|
@@ -594,6 +613,8 @@ static const struct gl_winsys_vtable glx_winsys_vtable = {
|
|
|
|
.update = gl_x11_glx_update,
|
|
|
|
.device_load_swapchain = gl_x11_glx_device_load_swapchain,
|
|
|
|
.device_present = gl_x11_glx_device_present,
|
|
|
|
+ .device_texture_create_from_dmabuf =
|
|
|
|
+ gl_x11_glx_device_texture_create_from_dmabuf,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct gl_winsys_vtable *gl_x11_glx_get_winsys_vtable(void)
|
|
|
|
diff --git a/libobs/graphics/device-exports.h b/libobs/graphics/device-exports.h
|
|
|
|
index 9b4e14b7..06ae4885 100644
|
|
|
|
--- a/libobs/graphics/device-exports.h
|
|
|
|
+++ b/libobs/graphics/device-exports.h
|
|
|
|
@@ -166,6 +166,16 @@ EXPORT void device_debug_marker_begin(gs_device_t *device,
|
|
|
|
const float color[4]);
|
|
|
|
EXPORT void device_debug_marker_end(gs_device_t *device);
|
|
|
|
|
|
|
|
+#if __linux__
|
|
|
|
+
|
|
|
|
+EXPORT gs_texture_t *device_texture_create_from_dmabuf(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers);
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
diff --git a/libobs/graphics/graphics-imports.c b/libobs/graphics/graphics-imports.c
|
|
|
|
index 0d3c2593..1b5b6fda 100644
|
|
|
|
--- a/libobs/graphics/graphics-imports.c
|
|
|
|
+++ b/libobs/graphics/graphics-imports.c
|
|
|
|
@@ -216,6 +216,8 @@ bool load_graphics_imports(struct gs_exports *exports, void *module,
|
|
|
|
GRAPHICS_IMPORT_OPTIONAL(device_stagesurface_create_nv12);
|
|
|
|
GRAPHICS_IMPORT_OPTIONAL(device_register_loss_callbacks);
|
|
|
|
GRAPHICS_IMPORT_OPTIONAL(device_unregister_loss_callbacks);
|
|
|
|
+#elif __linux__
|
|
|
|
+ GRAPHICS_IMPORT(device_texture_create_from_dmabuf);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return success;
|
|
|
|
diff --git a/libobs/graphics/graphics-internal.h b/libobs/graphics/graphics-internal.h
|
|
|
|
index 4154688c..4e8f4e53 100644
|
|
|
|
--- a/libobs/graphics/graphics-internal.h
|
|
|
|
+++ b/libobs/graphics/graphics-internal.h
|
|
|
|
@@ -315,6 +315,12 @@ struct gs_exports {
|
|
|
|
gs_device_t *device, const struct gs_device_loss *callbacks);
|
|
|
|
void (*device_unregister_loss_callbacks)(gs_device_t *device,
|
|
|
|
void *data);
|
|
|
|
+#elif __linux__
|
|
|
|
+ struct gs_texture *(*device_texture_create_from_dmabuf)(
|
|
|
|
+ gs_device_t *device, unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format, uint32_t n_planes,
|
|
|
|
+ const int *fds, const uint32_t *strides,
|
|
|
|
+ const uint32_t *offsets, const uint64_t *modifiers);
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
diff --git a/libobs/graphics/graphics.c b/libobs/graphics/graphics.c
|
|
|
|
index 902ba4b6..ea403ac8 100644
|
|
|
|
--- a/libobs/graphics/graphics.c
|
|
|
|
+++ b/libobs/graphics/graphics.c
|
|
|
|
@@ -1358,6 +1358,25 @@ gs_texture_t *gs_texture_create(uint32_t width, uint32_t height,
|
|
|
|
levels, data, flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
+#if __linux__
|
|
|
|
+
|
|
|
|
+gs_texture_t *gs_texture_create_from_dmabuf(unsigned int width,
|
|
|
|
+ unsigned int height,
|
|
|
|
+ enum gs_color_format color_format,
|
|
|
|
+ uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides,
|
|
|
|
+ const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers)
|
|
|
|
+{
|
|
|
|
+ graphics_t *graphics = thread_graphics;
|
|
|
|
+
|
|
|
|
+ return graphics->exports.device_texture_create_from_dmabuf(
|
|
|
|
+ graphics->device, width, height, color_format, n_planes, fds,
|
|
|
|
+ strides, offsets, modifiers);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
gs_texture_t *gs_cubetexture_create(uint32_t size,
|
|
|
|
enum gs_color_format color_format,
|
|
|
|
uint32_t levels, const uint8_t **data,
|
|
|
|
diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h
|
|
|
|
index 341a55d1..b60ee9fd 100644
|
|
|
|
--- a/libobs/graphics/graphics.h
|
|
|
|
+++ b/libobs/graphics/graphics.h
|
|
|
|
@@ -892,6 +892,15 @@ EXPORT gs_stagesurf_t *gs_stagesurface_create_nv12(uint32_t width,
|
|
|
|
EXPORT void gs_register_loss_callbacks(const struct gs_device_loss *callbacks);
|
|
|
|
EXPORT void gs_unregister_loss_callbacks(void *data);
|
|
|
|
|
|
|
|
+#elif __linux__
|
|
|
|
+
|
|
|
|
+EXPORT gs_texture_t *
|
|
|
|
+gs_texture_create_from_dmabuf(unsigned int width, unsigned int height,
|
|
|
|
+ enum gs_color_format color_format,
|
|
|
|
+ uint32_t n_planes, const int *fds,
|
|
|
|
+ const uint32_t *strides, const uint32_t *offsets,
|
|
|
|
+ const uint64_t *modifiers);
|
|
|
|
+
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* inline functions used by modules */
|
|
|
|
--
|
|
|
|
2.28.0
|
|
|
|
|