diff options
39 files changed, 163 insertions, 144 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41f504bc..aca308b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -96,7 +96,7 @@ not use GNU extensions. Brackets always go on the same line, including in functions. Always include brackets for if/while/for, even if it's a single statement. ```c -void function() { +void function(void) { if (condition1) { do_thing1(); } diff --git a/backend/drm/drm.c b/backend/drm/drm.c index d54c93f8..c5db480e 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -255,7 +255,7 @@ static uint32_t drm_connector_get_gamma_size(struct wlr_output *output) { } static bool drm_connector_export_dmabuf(struct wlr_output *output, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output; struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend; diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c index 15cf8cce..0ab63c86 100644 --- a/backend/drm/renderer.c +++ b/backend/drm/renderer.c @@ -160,23 +160,22 @@ void post_drm_surface(struct wlr_drm_surface *surf) { } } -bool export_drm_bo(struct gbm_bo *bo, - struct wlr_dmabuf_buffer_attribs *attribs) { - memset(attribs, 0, sizeof(struct wlr_dmabuf_buffer_attribs)); +bool export_drm_bo(struct gbm_bo *bo, struct wlr_dmabuf_attributes *attribs) { + memset(attribs, 0, sizeof(struct wlr_dmabuf_attributes)); attribs->n_planes = gbm_bo_get_plane_count(bo); - if (attribs->n_planes > WLR_LINUX_DMABUF_MAX_PLANES) { + if (attribs->n_planes > WLR_DMABUF_MAX_PLANES) { return false; } attribs->width = gbm_bo_get_width(bo); attribs->height = gbm_bo_get_height(bo); attribs->format = gbm_bo_get_format(bo); + attribs->modifier = gbm_bo_get_modifier(bo); for (int i = 0; i < attribs->n_planes; ++i) { attribs->offset[i] = gbm_bo_get_offset(bo, i); attribs->stride[i] = gbm_bo_get_stride_for_plane(bo, i); - attribs->modifier[i] = gbm_bo_get_modifier(bo); attribs->fd[i] = gbm_bo_get_fd(bo); if (attribs->fd[i] < 0) { for (int j = 0; j < i; ++j) { @@ -215,7 +214,7 @@ static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer, return NULL; } - struct wlr_dmabuf_buffer_attribs attribs; + struct wlr_dmabuf_attributes attribs; if (!export_drm_bo(bo, &attribs)) { free(tex); return NULL; diff --git a/examples/layer-shell.c b/examples/layer-shell.c index ec25fe42..21ef3e93 100644 --- a/examples/layer-shell.c +++ b/examples/layer-shell.c @@ -149,7 +149,7 @@ static void draw(void) { demo.last_frame = ts; } -static void draw_popup() { +static void draw_popup(void) { static float alpha_mod = -0.01; eglMakeCurrent(egl.display, popup_egl_surface, popup_egl_surface, egl.context); @@ -188,7 +188,7 @@ static void xdg_popup_configure(void *data, struct xdg_popup *xdg_popup, } } -static void popup_destroy() { +static void popup_destroy(void) { wlr_egl_destroy_surface(&egl, popup_egl_surface); wl_egl_window_destroy(popup_egl_window); xdg_popup_destroy(popup); diff --git a/examples/output-layout.c b/examples/output-layout.c index 7b847a3b..bdc8d352 100644 --- a/examples/output-layout.c +++ b/examples/output-layout.c @@ -284,7 +284,7 @@ int main(int argc, char *argv[]) { wl_display_run(display); wlr_texture_destroy(state.cat_texture); - wlr_renderer_destroy(state.renderer); wlr_output_layout_destroy(state.layout); + wl_display_destroy(state.display); } diff --git a/examples/rotation.c b/examples/rotation.c index bd39a21e..9e9e059a 100644 --- a/examples/rotation.c +++ b/examples/rotation.c @@ -268,6 +268,5 @@ int main(int argc, char *argv[]) { wl_display_run(display); wlr_texture_destroy(state.cat_texture); - wlr_renderer_destroy(state.renderer); wl_display_destroy(display); } diff --git a/examples/simple.c b/examples/simple.c index 60acd7db..cbe60c98 100644 --- a/examples/simple.c +++ b/examples/simple.c @@ -143,7 +143,7 @@ void new_input_notify(struct wl_listener *listener, void *data) { } } -int main() { +int main(void) { wlr_log_init(L_DEBUG, NULL); struct wl_display *display = wl_display_create(); struct sample_state state = { diff --git a/examples/tablet.c b/examples/tablet.c index f5c4bbb5..e734ca84 100644 --- a/examples/tablet.c +++ b/examples/tablet.c @@ -372,6 +372,5 @@ int main(int argc, char *argv[]) { } wl_display_run(display); - wlr_renderer_destroy(state.renderer); wl_display_destroy(display); } diff --git a/examples/touch.c b/examples/touch.c index 68f78a0a..0e77b48e 100644 --- a/examples/touch.c +++ b/examples/touch.c @@ -277,6 +277,5 @@ int main(int argc, char *argv[]) { wl_display_run(display); wlr_texture_destroy(state.cat_texture); - wlr_renderer_destroy(state.renderer); wl_display_destroy(display); } diff --git a/include/backend/drm/renderer.h b/include/backend/drm/renderer.h index 00e26976..575758de 100644 --- a/include/backend/drm/renderer.h +++ b/include/backend/drm/renderer.h @@ -52,7 +52,6 @@ struct gbm_bo *get_drm_surface_front(struct wlr_drm_surface *surf); void post_drm_surface(struct wlr_drm_surface *surf); struct gbm_bo *copy_drm_surface_mgpu(struct wlr_drm_surface *dest, struct gbm_bo *src); -bool export_drm_bo(struct gbm_bo *bo, - struct wlr_dmabuf_buffer_attribs *attribs); +bool export_drm_bo(struct gbm_bo *bo, struct wlr_dmabuf_attributes *attribs); #endif diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index d39e4edc..8f87408a 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -24,7 +24,7 @@ struct wlr_output_impl { 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_buffer_attribs *attribs); + 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 new file mode 100644 index 00000000..78f8c2eb --- /dev/null +++ b/include/wlr/render/dmabuf.h @@ -0,0 +1,36 @@ +#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) +#endif + +#define WLR_DMABUF_MAX_PLANES 4 + +enum wlr_dmabuf_attributes_flags { + WLR_DMABUF_ATTRIBUTES_FLAGS_Y_INVERT = 1, + WLR_DMABUF_ATTRIBUTES_FLAGS_INTERLACED = 2, + WLR_DMABUF_ATTRIBUTES_FLAGS_BOTTOM_FIRST = 4, +}; + +struct wlr_dmabuf_attributes { + int32_t width, height; + uint32_t format; + uint32_t flags; // enum wlr_dmabuf_attributes_flags + uint64_t modifier; + + int n_planes; + uint32_t offset[WLR_DMABUF_MAX_PLANES]; + uint32_t stride[WLR_DMABUF_MAX_PLANES]; + 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 17fef7ed..39b1d3d9 100644 --- a/include/wlr/render/egl.h +++ b/include/wlr/render/egl.h @@ -6,7 +6,7 @@ #include <pixman.h> #include <stdbool.h> #include <wayland-server.h> -#include <wlr/types/wlr_linux_dmabuf.h> +#include <wlr/render/dmabuf.h> struct wlr_egl { EGLDisplay display; @@ -66,14 +66,14 @@ EGLImageKHR wlr_egl_create_image_from_wl_drm(struct wlr_egl *egl, * of the dmabuf with wlr_egl_check_import_dmabuf once first. */ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer_attribs *attributes); + struct wlr_dmabuf_attributes *attributes); /** * Try to import the given dmabuf. On success return true false otherwise. * If this succeeds the dmabuf can be used for rendering on a texture */ bool wlr_egl_check_import_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer *dmabuf); + struct wlr_dmabuf_attributes *attributes); /** * Get the available dmabuf formats @@ -88,7 +88,7 @@ int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl, int format, 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_buffer_attribs *attribs); + struct wlr_dmabuf_attributes *attribs); /** * Destroys an EGL image created with the given wlr_egl. diff --git a/include/wlr/render/gles2.h b/include/wlr/render/gles2.h index 65bb36c1..866c6658 100644 --- a/include/wlr/render/gles2.h +++ b/include/wlr/render/gles2.h @@ -14,6 +14,6 @@ struct wlr_texture *wlr_gles2_texture_from_pixels(struct wlr_egl *egl, struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl, struct wl_resource *data); struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer_attribs *attribs); + struct wlr_dmabuf_attributes *attribs); #endif diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 1f075e81..af4bc75e 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -8,8 +8,8 @@ #include <wlr/render/wlr_renderer.h> #include <wlr/render/wlr_texture.h> #include <wlr/types/wlr_box.h> -#include <wlr/types/wlr_linux_dmabuf.h> #include <wlr/types/wlr_output.h> +#include <wlr/render/dmabuf.h> struct wlr_renderer_impl { void (*begin)(struct wlr_renderer *renderer, uint32_t width, @@ -31,7 +31,7 @@ struct wlr_renderer_impl { void (*wl_drm_buffer_get_size)(struct wlr_renderer *renderer, struct wl_resource *buffer, int *width, int *height); bool (*check_import_dmabuf)(struct wlr_renderer *renderer, - struct wlr_dmabuf_buffer *dmabuf); + struct wlr_dmabuf_attributes *attribs); int (*get_dmabuf_formats)(struct wlr_renderer *renderer, int **formats); int (*get_dmabuf_modifiers)(struct wlr_renderer *renderer, int format, uint64_t **modifiers); @@ -47,7 +47,7 @@ struct wlr_renderer_impl { struct wlr_texture *(*texture_from_wl_drm)(struct wlr_renderer *renderer, struct wl_resource *data); struct wlr_texture *(*texture_from_dmabuf)(struct wlr_renderer *renderer, - struct wlr_dmabuf_buffer_attribs *attribs); + struct wlr_dmabuf_attributes *attribs); void (*destroy)(struct wlr_renderer *renderer); void (*init_wl_display)(struct wlr_renderer *renderer, struct wl_display *wl_display); @@ -63,7 +63,7 @@ struct wlr_texture_impl { 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_buffer_attribs *attribs); + struct wlr_dmabuf_attributes *attribs); void (*destroy)(struct wlr_texture *texture); }; diff --git a/include/wlr/render/wlr_renderer.h b/include/wlr/render/wlr_renderer.h index 039bb66e..dd62944f 100644 --- a/include/wlr/render/wlr_renderer.h +++ b/include/wlr/render/wlr_renderer.h @@ -89,7 +89,7 @@ int wlr_renderer_get_dmabuf_modifiers(struct wlr_renderer *renderer, int format, * If this succeeds the dmabuf can be used for rendering on a texture */ bool wlr_renderer_check_import_dmabuf(struct wlr_renderer *renderer, - struct wlr_dmabuf_buffer *dmabuf); + struct wlr_dmabuf_attributes *attributes); /** * Reads out of pixels of the currently bound surface into data. `stride` is in * bytes. diff --git a/include/wlr/render/wlr_texture.h b/include/wlr/render/wlr_texture.h index 481b2a37..785f4fc6 100644 --- a/include/wlr/render/wlr_texture.h +++ b/include/wlr/render/wlr_texture.h @@ -5,7 +5,7 @@ #include <EGL/eglext.h> #include <stdint.h> #include <wayland-server-protocol.h> -#include <wlr/types/wlr_linux_dmabuf.h> +#include <wlr/render/dmabuf.h> struct wlr_renderer; struct wlr_texture_impl; @@ -33,7 +33,7 @@ struct wlr_texture *wlr_texture_from_wl_drm(struct wlr_renderer *renderer, * Create a new texture from a DMA-BUF. The returned texture is immutable. */ struct wlr_texture *wlr_texture_from_dmabuf(struct wlr_renderer *renderer, - struct wlr_dmabuf_buffer_attribs *attribs); + struct wlr_dmabuf_attributes *attribs); /** * Get the texture width and height. @@ -49,7 +49,7 @@ bool wlr_texture_write_pixels(struct wlr_texture *texture, const void *data); bool wlr_texture_to_dmabuf(struct wlr_texture *texture, - struct wlr_dmabuf_buffer_attribs *attribs); + 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 index 218b1635..a094b3de 100644 --- a/include/wlr/types/wlr_export_dmabuf_v1.h +++ b/include/wlr/types/wlr_export_dmabuf_v1.h @@ -2,7 +2,7 @@ #define WLR_TYPES_WLR_EXPORT_DMABUF_V1_H #include <wayland-server.h> -#include <wlr/types/wlr_linux_dmabuf.h> +#include <wlr/render/dmabuf.h> struct wlr_export_dmabuf_manager_v1; @@ -11,7 +11,7 @@ struct wlr_export_dmabuf_frame_v1 { struct wlr_export_dmabuf_manager_v1 *manager; struct wl_list link; - struct wlr_dmabuf_buffer_attribs attribs; + struct wlr_dmabuf_attributes attribs; struct wlr_output *output; struct wl_listener output_swap_buffers; diff --git a/include/wlr/types/wlr_linux_dmabuf.h b/include/wlr/types/wlr_linux_dmabuf.h index 1677398b..ea219020 100644 --- a/include/wlr/types/wlr_linux_dmabuf.h +++ b/include/wlr/types/wlr_linux_dmabuf.h @@ -1,49 +1,19 @@ #ifndef WLR_TYPES_WLR_LINUX_DMABUF_H #define WLR_TYPES_WLR_LINUX_DMABUF_H -#define WLR_LINUX_DMABUF_MAX_PLANES 4 - #include <stdint.h> #include <wayland-server-protocol.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) -#endif - -enum { - WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT = 1, - WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_INTERLACED = 2, - WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_BOTTOM_FIRST = 4, -}; - -struct wlr_dmabuf_buffer_attribs { - /* set via params_add */ - int n_planes; - uint32_t offset[WLR_LINUX_DMABUF_MAX_PLANES]; - uint32_t stride[WLR_LINUX_DMABUF_MAX_PLANES]; - uint64_t modifier[WLR_LINUX_DMABUF_MAX_PLANES]; - int fd[WLR_LINUX_DMABUF_MAX_PLANES]; - /* set via params_create */ - int32_t width, height; - uint32_t format; - uint32_t flags; -}; +#include <wlr/render/dmabuf.h> struct wlr_dmabuf_buffer { struct wlr_renderer *renderer; struct wl_resource *buffer_resource; struct wl_resource *params_resource; - struct wlr_dmabuf_buffer_attribs attributes; + struct wlr_dmabuf_attributes attributes; + bool has_modifier; }; /** - * Closes all file descriptors in the DMA-BUF attributes. - */ -void wlr_dmabuf_buffer_attribs_finish( - struct wlr_dmabuf_buffer_attribs *attribs); - -/** * Returns true if the given resource was created via the linux-dmabuf * buffer protocol, false otherwise */ diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 96c98dc3..158d174e 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -170,7 +170,7 @@ 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_buffer_attribs *attribs); + 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); diff --git a/meson.build b/meson.build index 597236ca..b78eea01 100644 --- a/meson.build +++ b/meson.build @@ -46,7 +46,7 @@ endif # Avoid wl_buffer deprecation warnings add_project_arguments('-DWL_HIDE_DEPRECATED', language: 'c') -wayland_server = dependency('wayland-server') +wayland_server = dependency('wayland-server', version: '>=1.15') wayland_client = dependency('wayland-client') wayland_egl = dependency('wayland-egl') wayland_protos = dependency('wayland-protocols', version: '>=1.14') diff --git a/render/dmabuf.c b/render/dmabuf.c new file mode 100644 index 00000000..6b500748 --- /dev/null +++ b/render/dmabuf.c @@ -0,0 +1,10 @@ +#include <unistd.h> +#include <wlr/render/dmabuf.h> + +void wlr_dmabuf_attributes_finish( struct wlr_dmabuf_attributes *attribs) { + for (int i = 0; i < attribs->n_planes; ++i) { + close(attribs->fd[i]); + attribs->fd[i] = -1; + } + attribs->n_planes = 0; +} diff --git a/render/egl.c b/render/egl.c index 1182a72f..93e4ec55 100644 --- a/render/egl.c +++ b/render/egl.c @@ -344,9 +344,9 @@ EGLImageKHR wlr_egl_create_image_from_wl_drm(struct wlr_egl *egl, } EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer_attribs *attributes) { + struct wlr_dmabuf_attributes *attributes) { bool has_modifier = false; - if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) { + if (attributes->modifier != DRM_FORMAT_MOD_INVALID) { if (!egl->egl_exts.dmabuf_import_modifiers) { return NULL; } @@ -368,7 +368,7 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, EGLint pitch; EGLint mod_lo; EGLint mod_hi; - } attr_names[WLR_LINUX_DMABUF_MAX_PLANES] = { + } attr_names[WLR_DMABUF_MAX_PLANES] = { { EGL_DMA_BUF_PLANE0_FD_EXT, EGL_DMA_BUF_PLANE0_OFFSET_EXT, @@ -405,9 +405,9 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, attribs[atti++] = attributes->stride[i]; if (has_modifier) { attribs[atti++] = attr_names[i].mod_lo; - attribs[atti++] = attributes->modifier[i] & 0xFFFFFFFF; + attribs[atti++] = attributes->modifier & 0xFFFFFFFF; attribs[atti++] = attr_names[i].mod_hi; - attribs[atti++] = attributes->modifier[i] >> 32; + attribs[atti++] = attributes->modifier >> 32; } } attribs[atti++] = EGL_NONE; @@ -421,8 +421,8 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, #define DRM_FORMAT_BIG_ENDIAN 0x80000000 #endif bool wlr_egl_check_import_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer *dmabuf) { - switch (dmabuf->attributes.format & ~DRM_FORMAT_BIG_ENDIAN) { + struct wlr_dmabuf_attributes *attribs) { + switch (attribs->format & ~DRM_FORMAT_BIG_ENDIAN) { /* TODO: YUV based formats not yet supported, require multiple * wlr_create_image_from_dmabuf */ case WL_SHM_FORMAT_YUYV: @@ -435,8 +435,7 @@ bool wlr_egl_check_import_dmabuf(struct wlr_egl *egl, break; } - EGLImage egl_image = wlr_egl_create_image_from_dmabuf(egl, - &dmabuf->attributes); + EGLImage egl_image = wlr_egl_create_image_from_dmabuf(egl, attribs); if (egl_image) { /* We can import the image, good. No need to keep it since wlr_texture_upload_dmabuf will import it again */ @@ -507,8 +506,8 @@ int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl, 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_buffer_attribs *attribs) { - memset(attribs, 0, sizeof(struct wlr_dmabuf_buffer_attribs)); + struct wlr_dmabuf_attributes *attribs) { + memset(attribs, 0, sizeof(struct wlr_dmabuf_attributes)); if (!egl->egl_exts.dmabuf_export || !eglExportDMABUFImageQueryMESA || !eglExportDMABUFImageMESA) { @@ -516,19 +515,15 @@ bool wlr_egl_export_image_to_dmabuf(struct wlr_egl *egl, EGLImageKHR image, } // Only one set of modifiers is returned for all planes - EGLuint64KHR modifiers; if (!eglExportDMABUFImageQueryMESA(egl->display, image, - (int *)&attribs->format, &attribs->n_planes, &modifiers)) { + (int *)&attribs->format, &attribs->n_planes, &attribs->modifier)) { return false; } - if (attribs->n_planes > WLR_LINUX_DMABUF_MAX_PLANES) { + if (attribs->n_planes > WLR_DMABUF_MAX_PLANES) { wlr_log(L_ERROR, "EGL returned %d planes, but only %d are supported", - attribs->n_planes, WLR_LINUX_DMABUF_MAX_PLANES); + attribs->n_planes, WLR_DMABUF_MAX_PLANES); return false; } - for (int i = 0; i < attribs->n_planes; ++i) { - attribs->modifier[i] = modifiers; - } if (!eglExportDMABUFImageMESA(egl->display, image, attribs->fd, (EGLint *)attribs->stride, (EGLint *)attribs->offset)) { diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 5cea5c3b..00a5c285 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -84,7 +84,7 @@ static void gles2_scissor(struct wlr_renderer *wlr_renderer, POP_GLES2_DEBUG; } -static void draw_quad() { +static void draw_quad(void) { GLfloat verts[] = { 1, 0, // top right 0, 0, // top left @@ -243,9 +243,9 @@ static int gles2_get_dmabuf_modifiers(struct wlr_renderer *wlr_renderer, } static bool gles2_check_import_dmabuf(struct wlr_renderer *wlr_renderer, - struct wlr_dmabuf_buffer *dmabuf) { + struct wlr_dmabuf_attributes *attribs) { struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer); - return wlr_egl_check_import_dmabuf(renderer->egl, dmabuf); + return wlr_egl_check_import_dmabuf(renderer->egl, attribs); } static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer, @@ -299,7 +299,7 @@ static struct wlr_texture *gles2_texture_from_wl_drm( static struct wlr_texture *gles2_texture_from_dmabuf( struct wlr_renderer *wlr_renderer, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer); return wlr_gles2_texture_from_dmabuf(renderer->egl, attribs); } diff --git a/render/gles2/texture.c b/render/gles2/texture.c index 742f9da0..0f061f59 100644 --- a/render/gles2/texture.c +++ b/render/gles2/texture.c @@ -75,7 +75,7 @@ static bool gles2_texture_write_pixels(struct wlr_texture *wlr_texture, } static bool gles2_texture_to_dmabuf(struct wlr_texture *wlr_texture, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture); if (!texture->image) { @@ -95,7 +95,7 @@ static bool gles2_texture_to_dmabuf(struct wlr_texture *wlr_texture, uint32_t flags = 0; if (texture->inverted_y) { - flags |= WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT; + flags |= WLR_DMABUF_ATTRIBUTES_FLAGS_Y_INVERT; } return wlr_egl_export_image_to_dmabuf(texture->egl, texture->image, @@ -228,7 +228,7 @@ struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl, } struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { assert(wlr_egl_is_current(egl)); if (!glEGLImageTargetTexture2DOES) { @@ -254,7 +254,7 @@ struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl, texture->type = WLR_GLES2_TEXTURE_DMABUF; texture->has_alpha = true; texture->inverted_y = - (attribs->flags & WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT) != 0; + (attribs->flags & WLR_DMABUF_ATTRIBUTES_FLAGS_Y_INVERT) != 0; texture->image = wlr_egl_create_image_from_dmabuf(egl, attribs); if (texture->image == NULL) { diff --git a/render/meson.build b/render/meson.build index 4fe9ea67..4b90c229 100644 --- a/render/meson.build +++ b/render/meson.build @@ -9,6 +9,7 @@ glapi = custom_target('glapi', lib_wlr_render = static_library( 'wlr_render', files( + 'dmabuf.c', 'egl.c', 'gles2/pixel_format.c', 'gles2/renderer.c', diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index aed821c9..32b0a779 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -136,11 +136,11 @@ int wlr_renderer_get_dmabuf_modifiers(struct wlr_renderer *r, int format, } bool wlr_renderer_check_import_dmabuf(struct wlr_renderer *r, - struct wlr_dmabuf_buffer *dmabuf) { + struct wlr_dmabuf_attributes *attribs) { if (!r->impl->check_import_dmabuf) { return false; } - return r->impl->check_import_dmabuf(r, dmabuf); + return r->impl->check_import_dmabuf(r, attribs); } bool wlr_renderer_read_pixels(struct wlr_renderer *r, enum wl_shm_format fmt, diff --git a/render/wlr_texture.c b/render/wlr_texture.c index f7ce0b44..76986920 100644 --- a/render/wlr_texture.c +++ b/render/wlr_texture.c @@ -35,7 +35,7 @@ struct wlr_texture *wlr_texture_from_wl_drm(struct wlr_renderer *renderer, } struct wlr_texture *wlr_texture_from_dmabuf(struct wlr_renderer *renderer, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { if (!renderer->impl->texture_from_dmabuf) { return NULL; } @@ -56,7 +56,7 @@ bool wlr_texture_write_pixels(struct wlr_texture *texture, } bool wlr_texture_to_dmabuf(struct wlr_texture *texture, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { if (!texture->impl->to_dmabuf) { return false; } diff --git a/rootston/main.c b/rootston/main.c index cecdb23d..07a41d5d 100644 --- a/rootston/main.c +++ b/rootston/main.c @@ -72,6 +72,7 @@ int main(int argc, char **argv) { } wl_display_run(server.wl_display); + wl_display_destroy_clients(server.wl_display); wl_display_destroy(server.wl_display); return 0; } diff --git a/rootston/xdg_shell.c b/rootston/xdg_shell.c index 83a1caf0..03ae1dc6 100644 --- a/rootston/xdg_shell.c +++ b/rootston/xdg_shell.c @@ -135,11 +135,10 @@ static void get_size(const struct roots_view *view, struct wlr_box *box) { if (surface->geometry.width > 0 && surface->geometry.height > 0) { box->width = surface->geometry.width; box->height = surface->geometry.height; - } else if (view->wlr_surface != NULL) { - box->width = view->wlr_surface->current->width; - box->height = view->wlr_surface->current->height; } else { - box->width = box->height = 0; + assert(surface->surface); + box->width = surface->surface->current->width; + box->height = surface->surface->current->height; } } diff --git a/rootston/xdg_shell_v6.c b/rootston/xdg_shell_v6.c index 5a829f5d..90b11690 100644 --- a/rootston/xdg_shell_v6.c +++ b/rootston/xdg_shell_v6.c @@ -136,11 +136,10 @@ static void get_size(const struct roots_view *view, struct wlr_box *box) { if (surface->geometry.width > 0 && surface->geometry.height > 0) { box->width = surface->geometry.width; box->height = surface->geometry.height; - } else if (view->wlr_surface != NULL) { - box->width = view->wlr_surface->current->width; - box->height = view->wlr_surface->current->height; } else { - box->width = box->height = 0; + assert(surface->surface); + box->width = surface->surface->current->width; + box->height = surface->surface->current->height; } } diff --git a/types/wlr_box.c b/types/wlr_box.c index 2ea743d0..c92b0aa4 100644 --- a/types/wlr_box.c +++ b/types/wlr_box.c @@ -61,8 +61,8 @@ bool wlr_box_contains_point(const struct wlr_box *box, double x, double y) { if (wlr_box_empty(box)) { return false; } else { - return x >= box->x && x <= box->x + box->width && - y >= box->y && y <= box->y + box->height; + return x >= box->x && x < box->x + box->width && + y >= box->y && y < box->y + box->height; } } diff --git a/types/wlr_cursor.c b/types/wlr_cursor.c index 9a31fca2..32d990cf 100644 --- a/types/wlr_cursor.c +++ b/types/wlr_cursor.c @@ -56,7 +56,7 @@ struct wlr_cursor_state { struct wl_listener layout_destroy; }; -struct wlr_cursor *wlr_cursor_create() { +struct wlr_cursor *wlr_cursor_create(void) { struct wlr_cursor *cur = calloc(1, sizeof(struct wlr_cursor)); if (!cur) { wlr_log(L_ERROR, "Failed to allocate wlr_cursor"); diff --git a/types/wlr_export_dmabuf_v1.c b/types/wlr_export_dmabuf_v1.c index a86fe78c..40a0e289 100644 --- a/types/wlr_export_dmabuf_v1.c +++ b/types/wlr_export_dmabuf_v1.c @@ -33,7 +33,7 @@ static void frame_handle_resource_destroy(struct wl_resource *resource) { struct wlr_export_dmabuf_frame_v1 *frame = frame_from_resource(resource); wl_list_remove(&frame->link); wl_list_remove(&frame->output_swap_buffers.link); - wlr_dmabuf_buffer_attribs_finish(&frame->attribs); + wlr_dmabuf_attributes_finish(&frame->attribs); free(frame); } @@ -97,17 +97,16 @@ static void manager_handle_capture_output(struct wl_client *client, return; } - struct wlr_dmabuf_buffer_attribs *attribs = &frame->attribs; + struct wlr_dmabuf_attributes *attribs = &frame->attribs; if (!wlr_output_export_dmabuf(output, attribs)) { zwlr_export_dmabuf_frame_v1_send_cancel(frame->resource, ZWLR_EXPORT_DMABUF_FRAME_V1_CANCEL_REASON_TEMPORARY); return; } - assert(attribs->n_planes > 0); uint32_t frame_flags = ZWLR_EXPORT_DMABUF_FRAME_V1_FLAGS_TRANSIENT; - uint32_t mod_high = attribs->modifier[0] >> 32; - uint32_t mod_low = attribs->modifier[0] & 0xFFFFFFFF; + uint32_t mod_high = attribs->modifier >> 32; + uint32_t mod_low = attribs->modifier & 0xFFFFFFFF; zwlr_export_dmabuf_frame_v1_send_frame(frame->resource, output->width, output->height, 0, 0, attribs->flags, frame_flags, diff --git a/types/wlr_linux_dmabuf.c b/types/wlr_linux_dmabuf.c index 8f46539f..fb20ad74 100644 --- a/types/wlr_linux_dmabuf.c +++ b/types/wlr_linux_dmabuf.c @@ -51,17 +51,8 @@ struct wlr_dmabuf_buffer *wlr_dmabuf_buffer_from_buffer_resource( return buffer; } -void wlr_dmabuf_buffer_attribs_finish( - struct wlr_dmabuf_buffer_attribs *attribs) { - for (int i = 0; i < attribs->n_planes; ++i) { - close(attribs->fd[i]); - attribs->fd[i] = -1; - } - attribs->n_planes = 0; -} - static void linux_dmabuf_buffer_destroy(struct wlr_dmabuf_buffer *buffer) { - wlr_dmabuf_buffer_attribs_finish(&buffer->attributes); + wlr_dmabuf_attributes_finish(&buffer->attributes); free(buffer); } @@ -71,7 +62,7 @@ static void params_destroy(struct wl_client *client, } static void params_add(struct wl_client *client, - struct wl_resource *params_resource, int32_t name_fd, + struct wl_resource *params_resource, int32_t fd, uint32_t plane_idx, uint32_t offset, uint32_t stride, uint32_t modifier_hi, uint32_t modifier_lo) { struct wlr_dmabuf_buffer *buffer = @@ -81,33 +72,42 @@ static void params_add(struct wl_client *client, wl_resource_post_error(params_resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_ALREADY_USED, "params was already used to create a wl_buffer"); - close(name_fd); + close(fd); return; } - if (plane_idx >= WLR_LINUX_DMABUF_MAX_PLANES) { + if (plane_idx >= WLR_DMABUF_MAX_PLANES) { wl_resource_post_error(params_resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_IDX, - "plane index %u > %u", plane_idx, WLR_LINUX_DMABUF_MAX_PLANES); - close(name_fd); + "plane index %u > %u", plane_idx, WLR_DMABUF_MAX_PLANES); + close(fd); return; } if (buffer->attributes.fd[plane_idx] != -1) { wl_resource_post_error(params_resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_SET, - "a dmabuf with id %d has already been added for plane %u", - buffer->attributes.fd[plane_idx], - plane_idx); - close(name_fd); + "a dmabuf with FD %d has already been added for plane %u", + buffer->attributes.fd[plane_idx], plane_idx); + close(fd); + return; + } + + uint64_t modifier = ((uint64_t)modifier_hi << 32) | modifier_lo; + if (buffer->has_modifier && modifier != buffer->attributes.modifier) { + wl_resource_post_error(params_resource, + ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_FORMAT, + "sent modifier %lu for plane %u, expected modifier %lu like other planes", + modifier, plane_idx, buffer->attributes.modifier); + close(fd); return; } + buffer->attributes.modifier = modifier; + buffer->has_modifier = true; - buffer->attributes.fd[plane_idx] = name_fd; + buffer->attributes.fd[plane_idx] = fd; buffer->attributes.offset[plane_idx] = offset; buffer->attributes.stride[plane_idx] = stride; - buffer->attributes.modifier[plane_idx] = - ((uint64_t)modifier_hi << 32) | modifier_lo; buffer->attributes.n_planes++; } @@ -186,7 +186,8 @@ static void params_create_common(struct wl_client *client, } off_t size = lseek(buffer->attributes.fd[i], 0, SEEK_END); - if (size == -1) { /* Skip checks if kernel does no support seek on buffer */ + if (size == -1) { + // Skip checks if kernel does no support seek on buffer continue; } if (buffer->attributes.offset[i] >= size) { @@ -205,8 +206,9 @@ static void params_create_common(struct wl_client *client, goto err_out; } - if (i == 0 && /* planes > 0 might be subsampled according to fourcc format */ - buffer->attributes.offset[i] + buffer->attributes.stride[i] * height > size) { + // planes > 0 might be subsampled according to fourcc format + if (i == 0 && buffer->attributes.offset[i] + + buffer->attributes.stride[i] * height >= size) { wl_resource_post_error(params_resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS, "invalid buffer stride or height for plane %d", i); @@ -223,7 +225,8 @@ static void params_create_common(struct wl_client *client, } /* Check if dmabuf is usable */ - if (!wlr_renderer_check_import_dmabuf(buffer->renderer, buffer)) { + if (!wlr_renderer_check_import_dmabuf(buffer->renderer, + &buffer->attributes)) { goto err_failed; } @@ -324,7 +327,7 @@ static void linux_dmabuf_create_params(struct wl_client *client, goto err; } - for (int i = 0; i < WLR_LINUX_DMABUF_MAX_PLANES; i++) { + for (int i = 0; i < WLR_DMABUF_MAX_PLANES; i++) { buffer->attributes.fd[i] = -1; } diff --git a/types/wlr_output.c b/types/wlr_output.c index b0321d7f..2c8aef66 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -566,7 +566,7 @@ uint32_t wlr_output_get_gamma_size(struct wlr_output *output) { } bool wlr_output_export_dmabuf(struct wlr_output *output, - struct wlr_dmabuf_buffer_attribs *attribs) { + struct wlr_dmabuf_attributes *attribs) { if (!output->impl->export_dmabuf) { return false; } diff --git a/types/wlr_output_layout.c b/types/wlr_output_layout.c index 38329a48..bb1d399a 100644 --- a/types/wlr_output_layout.c +++ b/types/wlr_output_layout.c @@ -25,7 +25,7 @@ struct wlr_output_layout_output_state { struct wl_listener output_destroy; }; -struct wlr_output_layout *wlr_output_layout_create() { +struct wlr_output_layout *wlr_output_layout_create(void) { struct wlr_output_layout *layout = calloc(1, sizeof(struct wlr_output_layout)); if (layout == NULL) { diff --git a/types/wlr_surface.c b/types/wlr_surface.c index 8a05657e..61284416 100644 --- a/types/wlr_surface.c +++ b/types/wlr_surface.c @@ -4,6 +4,7 @@ #include <wlr/render/egl.h> #include <wlr/render/interface.h> #include <wlr/types/wlr_compositor.h> +#include <wlr/types/wlr_linux_dmabuf.h> #include <wlr/types/wlr_matrix.h> #include <wlr/types/wlr_region.h> #include <wlr/types/wlr_surface.h> @@ -569,7 +570,7 @@ struct wlr_surface *wlr_surface_from_resource(struct wl_resource *resource) { return wl_resource_get_user_data(resource); } -static struct wlr_surface_state *surface_state_create() { +static struct wlr_surface_state *surface_state_create(void) { struct wlr_surface_state *state = calloc(1, sizeof(struct wlr_surface_state)); if (state == NULL) { diff --git a/types/wlr_virtual_keyboard_v1.c b/types/wlr_virtual_keyboard_v1.c index 0673f394..49abde7f 100644 --- a/types/wlr_virtual_keyboard_v1.c +++ b/types/wlr_virtual_keyboard_v1.c @@ -231,6 +231,16 @@ struct wlr_virtual_keyboard_manager_v1* void wlr_virtual_keyboard_manager_v1_destroy( struct wlr_virtual_keyboard_manager_v1 *manager) { + wl_list_remove(&manager->display_destroy.link); wl_global_destroy(manager->global); + struct wl_resource *resource, *resource_tmp; + wl_resource_for_each_safe(resource, resource_tmp, &manager->resources) { + wl_resource_destroy(resource); + } + struct wlr_virtual_keyboard_v1 *keyboard, *keyboard_tmp; + wl_list_for_each_safe(keyboard, keyboard_tmp, &manager->virtual_keyboards, + link) { + wl_resource_destroy(keyboard->resource); + } free(manager); } |