diff options
Diffstat (limited to 'include/wlr')
| -rw-r--r-- | include/wlr/interfaces/wlr_output.h | 2 | ||||
| -rw-r--r-- | include/wlr/render/dmabuf.h | 7 | ||||
| -rw-r--r-- | include/wlr/render/egl.h | 5 | ||||
| -rw-r--r-- | include/wlr/render/interface.h | 2 | ||||
| -rw-r--r-- | include/wlr/render/wlr_texture.h | 3 | ||||
| -rw-r--r-- | include/wlr/types/wlr_export_dmabuf_v1.h | 37 | ||||
| -rw-r--r-- | include/wlr/types/wlr_output.h | 11 | 
7 files changed, 66 insertions, 1 deletions
diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 7ecc7551..8f87408a 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -23,6 +23,8 @@ struct wlr_output_impl {  	void (*set_gamma)(struct wlr_output *output,  		uint32_t size, uint16_t *r, uint16_t *g, uint16_t *b);  	uint32_t (*get_gamma_size)(struct wlr_output *output); +	bool (*export_dmabuf)(struct wlr_output *output, +		struct wlr_dmabuf_attributes *attribs);  };  void wlr_output_init(struct wlr_output *output, struct wlr_backend *backend, diff --git a/include/wlr/render/dmabuf.h b/include/wlr/render/dmabuf.h index 2e13fe75..78f8c2eb 100644 --- a/include/wlr/render/dmabuf.h +++ b/include/wlr/render/dmabuf.h @@ -1,6 +1,8 @@  #ifndef WLR_RENDER_DMABUF_H  #define WLR_RENDER_DMABUF_H +#include <stdint.h> +  // So we don't have to pull in linux specific drm headers  #ifndef DRM_FORMAT_MOD_INVALID  #define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1) @@ -26,4 +28,9 @@ struct wlr_dmabuf_attributes {  	int fd[WLR_DMABUF_MAX_PLANES];  }; +/** + * Closes all file descriptors in the DMA-BUF attributes. + */ +void wlr_dmabuf_attributes_finish(struct wlr_dmabuf_attributes *attribs); +  #endif diff --git a/include/wlr/render/egl.h b/include/wlr/render/egl.h index 7cd5c5ca..39b1d3d9 100644 --- a/include/wlr/render/egl.h +++ b/include/wlr/render/egl.h @@ -20,6 +20,7 @@ struct wlr_egl {  		bool swap_buffers_with_damage;  		bool dmabuf_import;  		bool dmabuf_import_modifiers; +		bool dmabuf_export;  		bool bind_wayland_display;  	} egl_exts; @@ -85,6 +86,10 @@ int wlr_egl_get_dmabuf_formats(struct wlr_egl *egl, int **formats);  int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl, int format,  	uint64_t **modifiers); +bool wlr_egl_export_image_to_dmabuf(struct wlr_egl *egl, EGLImageKHR image, +	int32_t width, int32_t height, uint32_t flags, +	struct wlr_dmabuf_attributes *attribs); +  /**   * Destroys an EGL image created with the given wlr_egl.   */ diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 87b3c929..af4bc75e 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -62,6 +62,8 @@ struct wlr_texture_impl {  		enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width,  		uint32_t height, uint32_t src_x, uint32_t src_y, uint32_t dst_x,  		uint32_t dst_y, const void *data); +	bool (*to_dmabuf)(struct wlr_texture *texture, +		struct wlr_dmabuf_attributes *attribs);  	void (*destroy)(struct wlr_texture *texture);  }; diff --git a/include/wlr/render/wlr_texture.h b/include/wlr/render/wlr_texture.h index c1633820..785f4fc6 100644 --- a/include/wlr/render/wlr_texture.h +++ b/include/wlr/render/wlr_texture.h @@ -48,6 +48,9 @@ bool wlr_texture_write_pixels(struct wlr_texture *texture,  	uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y,  	const void *data); +bool wlr_texture_to_dmabuf(struct wlr_texture *texture, +	struct wlr_dmabuf_attributes *attribs); +  /**   * Destroys this wlr_texture.   */ diff --git a/include/wlr/types/wlr_export_dmabuf_v1.h b/include/wlr/types/wlr_export_dmabuf_v1.h new file mode 100644 index 00000000..a094b3de --- /dev/null +++ b/include/wlr/types/wlr_export_dmabuf_v1.h @@ -0,0 +1,37 @@ +#ifndef WLR_TYPES_WLR_EXPORT_DMABUF_V1_H +#define WLR_TYPES_WLR_EXPORT_DMABUF_V1_H + +#include <wayland-server.h> +#include <wlr/render/dmabuf.h> + +struct wlr_export_dmabuf_manager_v1; + +struct wlr_export_dmabuf_frame_v1 { +	struct wl_resource *resource; +	struct wlr_export_dmabuf_manager_v1 *manager; +	struct wl_list link; + +	struct wlr_dmabuf_attributes attribs; +	struct wlr_output *output; + +	struct wl_listener output_swap_buffers; +}; + +struct wlr_export_dmabuf_manager_v1 { +	struct wl_global *global; +	struct wl_list resources; +	struct wl_list frames; + +	struct wl_listener display_destroy; + +	struct { +		struct wl_signal destroy; +	} events; +}; + +struct wlr_export_dmabuf_manager_v1 *wlr_export_dmabuf_manager_v1_create( +	struct wl_display *display); +void wlr_export_dmabuf_manager_v1_destroy( +	struct wlr_export_dmabuf_manager_v1 *manager); + +#endif diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index cef3fc5d..158d174e 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -6,6 +6,7 @@  #include <time.h>  #include <wayland-server.h>  #include <wayland-util.h> +#include <wlr/types/wlr_linux_dmabuf.h>  struct wlr_output_mode {  	uint32_t flags; // enum wl_output_mode @@ -81,7 +82,7 @@ struct wlr_output {  	struct {  		struct wl_signal frame;  		struct wl_signal needs_swap; -		struct wl_signal swap_buffers; +		struct wl_signal swap_buffers; // wlr_output_event_swap_buffers  		struct wl_signal enable;  		struct wl_signal mode;  		struct wl_signal scale; @@ -107,6 +108,12 @@ struct wlr_output {  	void *data;  }; +struct wlr_output_event_swap_buffers { +	struct wlr_output *output; +	struct timespec *when; +	pixman_region32_t *damage; +}; +  struct wlr_surface;  void wlr_output_enable(struct wlr_output *output, bool enable); @@ -162,6 +169,8 @@ void wlr_output_schedule_frame(struct wlr_output *output);  void wlr_output_set_gamma(struct wlr_output *output,  	uint32_t size, uint16_t *r, uint16_t *g, uint16_t *b);  uint32_t wlr_output_get_gamma_size(struct wlr_output *output); +bool wlr_output_export_dmabuf(struct wlr_output *output, +	struct wlr_dmabuf_attributes *attribs);  void wlr_output_set_fullscreen_surface(struct wlr_output *output,  	struct wlr_surface *surface);  struct wlr_output *wlr_output_from_resource(struct wl_resource *resource);  | 
