uint32_t fs_surf_fb_id;
uint32_t pending_fs_surf_fb_id;
+ struct wl_buffer *scanout_buffer;
+ struct wl_listener scanout_buffer_destroy_listener;
+ struct wl_buffer *pending_scanout_buffer;
+ struct wl_listener pending_scanout_buffer_destroy_listener;
};
static int
output->pending_fs_surf_fb_id = fb_id;
/* assert output->pending_scanout_buffer == NULL */
- output->base.pending_scanout_buffer = es->buffer;
- output->base.pending_scanout_buffer->busy_count++;
+ output->pending_scanout_buffer = es->buffer;
+ output->pending_scanout_buffer->busy_count++;
- wl_list_insert(output->base.pending_scanout_buffer->resource.destroy_listener_list.prev,
- &output->base.pending_scanout_buffer_destroy_listener.link);
+ wl_list_insert(output->pending_scanout_buffer->resource.destroy_listener_list.prev,
+ &output->pending_scanout_buffer_destroy_listener.link);
pixman_region32_fini(&es->damage);
pixman_region32_init(&es->damage);
(struct drm_compositor *) output->base.compositor;
uint32_t msecs;
- if (output->fs_surf_fb_id) {
+ if (output->scanout_buffer) {
+ weston_buffer_post_release(output->scanout_buffer);
+ wl_list_remove(&output->scanout_buffer_destroy_listener.link);
+ output->scanout_buffer = NULL;
drmModeRmFB(c->drm.fd, output->fs_surf_fb_id);
output->fs_surf_fb_id = 0;
}
- if (output->pending_fs_surf_fb_id) {
+ if (output->pending_scanout_buffer) {
+ output->scanout_buffer = output->pending_scanout_buffer;
+ wl_list_remove(&output->pending_scanout_buffer_destroy_listener.link);
+ wl_list_insert(output->scanout_buffer->resource.destroy_listener_list.prev,
+ &output->scanout_buffer_destroy_listener.link);
+ output->pending_scanout_buffer = NULL;
output->fs_surf_fb_id = output->pending_fs_surf_fb_id;
output->pending_fs_surf_fb_id = 0;
}
}
}
+static void
+output_handle_scanout_buffer_destroy(struct wl_listener *listener,
+ struct wl_resource *resource,
+ uint32_t time)
+{
+ struct drm_output *output =
+ container_of(listener, struct drm_output,
+ scanout_buffer_destroy_listener);
+
+ output->scanout_buffer = NULL;
+
+ if (!output->pending_scanout_buffer)
+ weston_compositor_schedule_repaint(output->base.compositor);
+}
+
+static void
+output_handle_pending_scanout_buffer_destroy(struct wl_listener *listener,
+ struct wl_resource *resource,
+ uint32_t time)
+{
+ struct drm_output *output =
+ container_of(listener, struct drm_output,
+ pending_scanout_buffer_destroy_listener);
+
+ output->pending_scanout_buffer = NULL;
+
+ weston_compositor_schedule_repaint(output->base.compositor);
+}
+
static int
create_output_for_connector(struct drm_compositor *ec,
drmModeRes *resources,
wl_list_insert(ec->base.output_list.prev, &output->base.link);
+ output->scanout_buffer_destroy_listener.func =
+ output_handle_scanout_buffer_destroy;
+ output->pending_scanout_buffer_destroy_listener.func =
+ output_handle_pending_scanout_buffer_destroy;
+
output->pending_fs_surf_fb_id = 0;
output->base.repaint = drm_output_repaint;
output->base.set_hardware_cursor = drm_output_set_cursor;
es->buffer = NULL;
}
-static void
-output_handle_scanout_buffer_destroy(struct wl_listener *listener,
- struct wl_resource *resource,
- uint32_t time)
-{
- struct weston_output *output =
- container_of(listener, struct weston_output,
- scanout_buffer_destroy_listener);
-
- output->scanout_buffer = NULL;
-
- if (!output->pending_scanout_buffer)
- weston_compositor_schedule_repaint(output->compositor);
-}
-
-static void
-output_handle_pending_scanout_buffer_destroy(struct wl_listener *listener,
- struct wl_resource *resource,
- uint32_t time)
-{
- struct weston_output *output =
- container_of(listener, struct weston_output,
- pending_scanout_buffer_destroy_listener);
-
- output->pending_scanout_buffer = NULL;
-
- weston_compositor_schedule_repaint(output->compositor);
-}
-
-
WL_EXPORT struct weston_surface *
weston_surface_create(struct weston_compositor *compositor,
int32_t x, int32_t y, int32_t width, int32_t height)
weston_output_damage(output);
}
-static inline void
+WL_EXPORT void
weston_buffer_post_release(struct wl_buffer *buffer)
{
if (--buffer->busy_count > 0)
WL_EXPORT void
weston_output_finish_frame(struct weston_output *output, int msecs)
{
- if (output->scanout_buffer) {
- weston_buffer_post_release(output->scanout_buffer);
- wl_list_remove(&output->scanout_buffer_destroy_listener.link);
- output->scanout_buffer = NULL;
- }
-
- if (output->pending_scanout_buffer) {
- output->scanout_buffer = output->pending_scanout_buffer;
- wl_list_remove(&output->pending_scanout_buffer_destroy_listener.link);
- wl_list_insert(output->scanout_buffer->resource.destroy_listener_list.prev,
- &output->scanout_buffer_destroy_listener.link);
- output->pending_scanout_buffer = NULL;
- }
-
if (output->repaint_needed)
repaint(output, msecs);
else
output->flags = flags;
weston_output_move(output, x, y);
- output->scanout_buffer_destroy_listener.func =
- output_handle_scanout_buffer_destroy;
- output->pending_scanout_buffer_destroy_listener.func =
- output_handle_pending_scanout_buffer_destroy;
-
wl_list_init(&output->frame_callback_list);
wl_display_add_global(c->wl_display,