From: tokyo4j Date: Fri, 30 May 2025 11:58:15 +0000 (+0900) Subject: buffer: add buffer_create_from_wlr_buffer() X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=649773b4f83bee6daa34da7c6ab40b6de2eddc0e;p=proto%2Flabwc.git buffer: add buffer_create_from_wlr_buffer() --- diff --git a/include/buffer.h b/include/buffer.h index a756a7b5..2771334f 100644 --- a/include/buffer.h +++ b/include/buffer.h @@ -70,6 +70,13 @@ struct lab_data_buffer *buffer_create_cairo(uint32_t logical_width, struct lab_data_buffer *buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height, uint32_t stride); +/* + * Create a lab_data_buffer from a wlr_buffer by copying its content. + * The wlr_buffer must be backed by shm. + */ +struct lab_data_buffer *buffer_create_from_wlr_buffer( + struct wlr_buffer *wlr_buffer); + /* * Resize a buffer to the given size. The source buffer is rendered at the * center of the output buffer and shrunk if it overflows from the output buffer. diff --git a/src/buffer.c b/src/buffer.c index 08560116..1faa4620 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "buffer.h" #include "common/box.h" #include "common/mem.h" @@ -148,6 +149,32 @@ buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height, return buffer; } +struct lab_data_buffer * +buffer_create_from_wlr_buffer(struct wlr_buffer *wlr_buffer) +{ + void *data; + uint32_t format; + size_t stride; + if (!wlr_buffer_begin_data_ptr_access(wlr_buffer, + WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) { + wlr_log(WLR_ERROR, "failed to access wlr_buffer"); + return NULL; + } + if (format != DRM_FORMAT_ARGB8888) { + /* TODO: support other formats */ + wlr_buffer_end_data_ptr_access(wlr_buffer); + wlr_log(WLR_ERROR, "cannot create buffer: format=%d", format); + return NULL; + } + size_t buffer_size = stride * wlr_buffer->height; + void *copied_data = xmalloc(buffer_size); + memcpy(copied_data, data, buffer_size); + wlr_buffer_end_data_ptr_access(wlr_buffer); + + return buffer_create_from_data(copied_data, + wlr_buffer->width, wlr_buffer->height, stride); +} + struct lab_data_buffer * buffer_resize(struct lab_data_buffer *src_buffer, int width, int height, double scale)