#include #include #include #include #include #include #include "types/wlr_buffer.h" bool wlr_resource_is_buffer(struct wl_resource *resource) { return strcmp(wl_resource_get_class(resource), wl_buffer_interface.name) == 0; } /* struct wlr_buffer_resource_interface */ static struct wl_array buffer_resource_interfaces = {0}; void wlr_buffer_register_resource_interface( const struct wlr_buffer_resource_interface *iface) { assert(iface); assert(iface->is_instance); assert(iface->from_resource); const struct wlr_buffer_resource_interface **iface_ptr; wl_array_for_each(iface_ptr, &buffer_resource_interfaces) { if (*iface_ptr == iface) { wlr_log(WLR_DEBUG, "wlr_resource_buffer_interface %s has already" "been registered", iface->name); return; } } iface_ptr = wl_array_add(&buffer_resource_interfaces, sizeof(iface)); *iface_ptr = iface; } static const struct wlr_buffer_resource_interface *get_buffer_resource_iface( struct wl_resource *resource) { struct wlr_buffer_resource_interface **iface_ptr; wl_array_for_each(iface_ptr, &buffer_resource_interfaces) { if ((*iface_ptr)->is_instance(resource)) { return *iface_ptr; } } return NULL; } struct wlr_buffer *wlr_buffer_from_resource(struct wl_resource *resource) { assert(resource && wlr_resource_is_buffer(resource)); struct wlr_buffer *buffer; if (wlr_drm_buffer_is_resource(resource)) { struct wlr_drm_buffer *drm_buffer = wlr_drm_buffer_from_resource(resource); buffer = wlr_buffer_lock(&drm_buffer->base); } else { const struct wlr_buffer_resource_interface *iface = get_buffer_resource_iface(resource); if (!iface) { wlr_log(WLR_ERROR, "Unknown buffer type"); return NULL; } struct wlr_buffer *custom_buffer = iface->from_resource(resource); if (!custom_buffer) { wlr_log(WLR_ERROR, "Failed to create %s buffer", iface->name); return NULL; } buffer = wlr_buffer_lock(custom_buffer); } return buffer; }