void wlc_buffer_release(struct wlc_buffer *buffer) { struct wlc_surface *surface; if ((surface = convert_from_wlc_resource(buffer->surface, "surface"))) { if (surface->commit.buffer == convert_to_wlc_resource(buffer)) surface->commit.buffer = 0; if (surface->pending.buffer == convert_to_wlc_resource(buffer)) surface->pending.buffer = 0; } struct wl_resource *resource; if ((resource = convert_to_wl_resource(buffer, "buffer"))) { wlc_resource_invalidate(convert_to_wlc_resource(buffer)); wl_resource_queue_event(resource, WL_BUFFER_RELEASE); } }
wlc_resource wlc_buffer_use(struct wlc_buffer *buffer) { if (!buffer) return 0; buffer->references++; return convert_to_wlc_resource(buffer); }
void wlc_view_set_surface(struct wlc_view *view, struct wlc_surface *surface) { if (!view || view->surface == convert_to_wlc_resource(surface)) return; wlc_handle old = view->surface; view->surface = convert_to_wlc_resource(surface); wlc_surface_attach_to_view(convert_from_wlc_resource(old, "surface"), NULL); wlc_surface_attach_to_view(surface, view); if (surface && surface->commit.attached) { wlc_view_map(view); } else { wlc_view_unmap(view); } wlc_dlog(WLC_DBG_RENDER, "-> Linked surface (%" PRIuWLC ") to view (%" PRIuWLC ")", convert_to_wlc_resource(surface), convert_to_wlc_handle(view)); }
void wlc_buffer_dispose(struct wlc_buffer *buffer) { if (!buffer) return; if (buffer->references && --buffer->references > 0) return; wlc_resource_release(convert_to_wlc_resource(buffer)); }
static bool surface_attach(struct ctx *context, struct wlc_context *bound, struct wlc_surface *surface, struct wlc_buffer *buffer) { assert(context && bound && surface); struct wl_resource *wl_buffer; if (!buffer || !(wl_buffer = convert_to_wl_resource(buffer, "buffer"))) { surface_destroy(context, bound, surface); return true; } EGLint format; bool attached = false; struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get(wl_buffer); if (shm_buffer) { attached = shm_attach(surface, buffer, shm_buffer); } else if (wlc_context_query_buffer(bound, (void*)wl_buffer, EGL_TEXTURE_FORMAT, &format)) { attached = egl_attach(context, bound, surface, buffer, format); } else { /* unknown buffer */ wlc_log(WLC_LOG_WARN, "Unknown buffer"); } if (attached) wlc_dlog(WLC_DBG_RENDER, "-> Attached surface (%" PRIuWLC ") with buffer of size (%ux%u)", convert_to_wlc_resource(surface), buffer->size.w, buffer->size.h); return attached; }