Beispiel #1
0
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);
   }
}
Beispiel #2
0
wlc_resource
wlc_buffer_use(struct wlc_buffer *buffer)
{
   if (!buffer)
      return 0;

   buffer->references++;
   return convert_to_wlc_resource(buffer);
}
Beispiel #3
0
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));
}
Beispiel #4
0
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));
}
Beispiel #5
0
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;
}