diff --git a/include/types/wlr_buffer.h b/include/types/wlr_buffer.h new file mode 100644 index 00000000..8f62179a --- /dev/null +++ b/include/types/wlr_buffer.h @@ -0,0 +1,15 @@ +#ifndef TYPES_WLR_BUFFER +#define TYPES_WLR_BUFFER + +#include +/** + * Access a pointer to the allocated data from the underlying implementation, + * and its stride. + * + * The returned pointer should be pointing to a valid memory location for read + * and write operations. + */ +bool buffer_get_data_ptr(struct wlr_buffer *buffer, void **data, + size_t *stride); + +#endif diff --git a/include/wlr/types/wlr_buffer.h b/include/wlr/types/wlr_buffer.h index 84555899..59996fce 100644 --- a/include/wlr/types/wlr_buffer.h +++ b/include/wlr/types/wlr_buffer.h @@ -19,6 +19,8 @@ struct wlr_buffer_impl { void (*destroy)(struct wlr_buffer *buffer); bool (*get_dmabuf)(struct wlr_buffer *buffer, struct wlr_dmabuf_attributes *attribs); + bool (*get_data_ptr)(struct wlr_buffer *buffer, void **data, + size_t *stride); }; /** diff --git a/types/wlr_buffer.c b/types/wlr_buffer.c index 0bc290ca..cc20af59 100644 --- a/types/wlr_buffer.c +++ b/types/wlr_buffer.c @@ -5,6 +5,7 @@ #include #include #include "render/pixel_format.h" +#include "types/wlr_buffer.h" #include "util/signal.h" void wlr_buffer_init(struct wlr_buffer *buffer, @@ -65,6 +66,13 @@ bool wlr_buffer_get_dmabuf(struct wlr_buffer *buffer, return buffer->impl->get_dmabuf(buffer, attribs); } +bool buffer_get_data_ptr(struct wlr_buffer *buffer, void **data, + size_t *size) { + if (!buffer->impl->get_data_ptr) { + return false; + } + return buffer->impl->get_data_ptr(buffer, data, size); +} bool wlr_resource_is_buffer(struct wl_resource *resource) { return strcmp(wl_resource_get_class(resource), wl_buffer_interface.name) == 0;