mirror of
https://github.com/swaywm/sway.git
synced 2024-11-28 10:51:28 +00:00
Drop wlr_client_buffer usage
This commit is contained in:
parent
33cfdbe886
commit
4bec692734
|
@ -1,10 +1,13 @@
|
||||||
#ifndef _SWAY_SURFACE_H
|
#ifndef _SWAY_SURFACE_H
|
||||||
#define _SWAY_SURFACE_H
|
#define _SWAY_SURFACE_H
|
||||||
#include <wlr/types/wlr_compositor.h>
|
#include <wlr/types/wlr_compositor.h>
|
||||||
|
#include <wlr/types/wlr_raster.h>
|
||||||
|
|
||||||
struct sway_surface {
|
struct sway_surface {
|
||||||
struct wlr_surface *wlr_surface;
|
struct wlr_surface *wlr_surface;
|
||||||
|
struct wlr_raster *raster;
|
||||||
|
|
||||||
|
struct wl_listener commit;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define _SWAY_VIEW_H
|
#define _SWAY_VIEW_H
|
||||||
#include <wayland-server-core.h>
|
#include <wayland-server-core.h>
|
||||||
#include <wlr/types/wlr_compositor.h>
|
#include <wlr/types/wlr_compositor.h>
|
||||||
|
#include <wlr/types/wlr_raster.h>
|
||||||
#include "sway/config.h"
|
#include "sway/config.h"
|
||||||
#if HAVE_XWAYLAND
|
#if HAVE_XWAYLAND
|
||||||
#include <wlr/xwayland.h>
|
#include <wlr/xwayland.h>
|
||||||
|
@ -57,7 +58,7 @@ struct sway_view_impl {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sway_saved_buffer {
|
struct sway_saved_buffer {
|
||||||
struct wlr_client_buffer *buffer;
|
struct wlr_raster *raster;
|
||||||
int x, y;
|
int x, y;
|
||||||
int width, height;
|
int width, height;
|
||||||
enum wl_output_transform transform;
|
enum wl_output_transform transform;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <wlr/config.h>
|
#include <wlr/config.h>
|
||||||
#include <wlr/backend/headless.h>
|
#include <wlr/backend/headless.h>
|
||||||
#include <wlr/render/wlr_renderer.h>
|
#include <wlr/render/wlr_renderer.h>
|
||||||
#include <wlr/types/wlr_buffer.h>
|
#include <wlr/types/wlr_raster.h>
|
||||||
#include <wlr/types/wlr_matrix.h>
|
#include <wlr/types/wlr_matrix.h>
|
||||||
#include <wlr/types/wlr_output_layout.h>
|
#include <wlr/types/wlr_output_layout.h>
|
||||||
#include <wlr/types/wlr_output.h>
|
#include <wlr/types/wlr_output.h>
|
||||||
|
@ -509,7 +509,8 @@ static bool scan_out_fullscreen_view(struct sway_output *output,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surface->buffer == NULL) {
|
struct wlr_raster *raster = wlr_raster_from_surface(surface);
|
||||||
|
if (raster == NULL || raster->buffer == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,7 +523,7 @@ static bool scan_out_fullscreen_view(struct sway_output *output,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wlr_output_attach_buffer(wlr_output, &surface->buffer->base);
|
wlr_output_attach_buffer(wlr_output, raster->buffer);
|
||||||
if (!wlr_output_test(wlr_output)) {
|
if (!wlr_output_test(wlr_output)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <wayland-server-core.h>
|
#include <wayland-server-core.h>
|
||||||
#include <wlr/config.h>
|
#include <wlr/config.h>
|
||||||
#include <wlr/render/wlr_renderer.h>
|
#include <wlr/render/wlr_renderer.h>
|
||||||
#include <wlr/types/wlr_buffer.h>
|
#include <wlr/types/wlr_raster.h>
|
||||||
#include <wlr/types/wlr_damage_ring.h>
|
#include <wlr/types/wlr_damage_ring.h>
|
||||||
#include <wlr/types/wlr_matrix.h>
|
#include <wlr/types/wlr_matrix.h>
|
||||||
#include <wlr/types/wlr_output_layout.h>
|
#include <wlr/types/wlr_output_layout.h>
|
||||||
|
@ -142,7 +142,13 @@ static void render_surface_iterator(struct sway_output *output,
|
||||||
const pixman_region32_t *output_damage = data->damage;
|
const pixman_region32_t *output_damage = data->damage;
|
||||||
float alpha = data->alpha;
|
float alpha = data->alpha;
|
||||||
|
|
||||||
struct wlr_texture *texture = wlr_surface_get_texture(surface);
|
struct wlr_raster *raster = wlr_raster_from_surface(surface);
|
||||||
|
if (!raster) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wlr_texture *texture = wlr_raster_create_texture(
|
||||||
|
raster, wlr_output->renderer);
|
||||||
if (!texture) {
|
if (!texture) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -303,7 +309,9 @@ static void render_saved_view(struct sway_view *view,
|
||||||
|
|
||||||
struct sway_saved_buffer *saved_buf;
|
struct sway_saved_buffer *saved_buf;
|
||||||
wl_list_for_each(saved_buf, &view->saved_buffers, link) {
|
wl_list_for_each(saved_buf, &view->saved_buffers, link) {
|
||||||
if (!saved_buf->buffer->texture) {
|
struct wlr_texture *texture = wlr_raster_create_texture(
|
||||||
|
saved_buf->raster, wlr_output->renderer);
|
||||||
|
if (!texture) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +351,7 @@ static void render_saved_view(struct sway_view *view,
|
||||||
}
|
}
|
||||||
scale_box(&dst_box, wlr_output->scale);
|
scale_box(&dst_box, wlr_output->scale);
|
||||||
|
|
||||||
render_texture(wlr_output, damage, saved_buf->buffer->texture,
|
render_texture(wlr_output, damage, texture,
|
||||||
&saved_buf->source_box, &dst_box, matrix, alpha);
|
&saved_buf->source_box, &dst_box, matrix, alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,15 +11,28 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
|
||||||
struct sway_surface *surface = wl_container_of(listener, surface, destroy);
|
struct sway_surface *surface = wl_container_of(listener, surface, destroy);
|
||||||
|
|
||||||
surface->wlr_surface->data = NULL;
|
surface->wlr_surface->data = NULL;
|
||||||
|
wl_list_remove(&surface->commit.link);
|
||||||
wl_list_remove(&surface->destroy.link);
|
wl_list_remove(&surface->destroy.link);
|
||||||
|
|
||||||
if (surface->frame_done_timer) {
|
if (surface->frame_done_timer) {
|
||||||
wl_event_source_remove(surface->frame_done_timer);
|
wl_event_source_remove(surface->frame_done_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wlr_raster_unlock(surface->raster);
|
||||||
|
|
||||||
free(surface);
|
free(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_commit(struct wl_listener *listener, void *data) {
|
||||||
|
struct sway_surface *surface = wl_container_of(listener, surface, commit);
|
||||||
|
|
||||||
|
// update the surface raster every surface commit
|
||||||
|
struct wlr_raster *raster = wlr_raster_from_surface(surface->wlr_surface);
|
||||||
|
|
||||||
|
wlr_raster_unlock(surface->raster);
|
||||||
|
surface->raster = raster;
|
||||||
|
}
|
||||||
|
|
||||||
static int surface_frame_done_timer_handler(void *data) {
|
static int surface_frame_done_timer_handler(void *data) {
|
||||||
struct sway_surface *surface = data;
|
struct sway_surface *surface = data;
|
||||||
|
|
||||||
|
@ -40,11 +53,16 @@ void handle_compositor_new_surface(struct wl_listener *listener, void *data) {
|
||||||
surface->destroy.notify = handle_destroy;
|
surface->destroy.notify = handle_destroy;
|
||||||
wl_signal_add(&wlr_surface->events.destroy, &surface->destroy);
|
wl_signal_add(&wlr_surface->events.destroy, &surface->destroy);
|
||||||
|
|
||||||
|
surface->commit.notify = handle_commit;
|
||||||
|
wl_signal_add(&wlr_surface->events.commit, &surface->commit);
|
||||||
|
|
||||||
surface->frame_done_timer = wl_event_loop_add_timer(server.wl_event_loop,
|
surface->frame_done_timer = wl_event_loop_add_timer(server.wl_event_loop,
|
||||||
surface_frame_done_timer_handler, surface);
|
surface_frame_done_timer_handler, surface);
|
||||||
if (!surface->frame_done_timer) {
|
if (!surface->frame_done_timer) {
|
||||||
wl_resource_post_no_memory(wlr_surface->resource);
|
wl_resource_post_no_memory(wlr_surface->resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
surface->raster = wlr_raster_from_surface(wlr_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
void surface_update_outputs(struct wlr_surface *surface) {
|
void surface_update_outputs(struct wlr_surface *surface) {
|
||||||
|
|
|
@ -103,8 +103,7 @@ bool server_init(struct sway_server *server) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->compositor = wlr_compositor_create(server->wl_display, 5,
|
server->compositor = wlr_compositor_create(server->wl_display, 5, NULL);
|
||||||
server->renderer);
|
|
||||||
server->compositor_new_surface.notify = handle_compositor_new_surface;
|
server->compositor_new_surface.notify = handle_compositor_new_surface;
|
||||||
wl_signal_add(&server->compositor->events.new_surface,
|
wl_signal_add(&server->compositor->events.new_surface,
|
||||||
&server->compositor_new_surface);
|
&server->compositor_new_surface);
|
||||||
|
|
|
@ -1412,7 +1412,7 @@ void view_remove_saved_buffer(struct sway_view *view) {
|
||||||
}
|
}
|
||||||
struct sway_saved_buffer *saved_buf, *tmp;
|
struct sway_saved_buffer *saved_buf, *tmp;
|
||||||
wl_list_for_each_safe(saved_buf, tmp, &view->saved_buffers, link) {
|
wl_list_for_each_safe(saved_buf, tmp, &view->saved_buffers, link) {
|
||||||
wlr_buffer_unlock(&saved_buf->buffer->base);
|
wlr_raster_unlock(saved_buf->raster);
|
||||||
wl_list_remove(&saved_buf->link);
|
wl_list_remove(&saved_buf->link);
|
||||||
free(saved_buf);
|
free(saved_buf);
|
||||||
}
|
}
|
||||||
|
@ -1423,9 +1423,8 @@ static void view_save_buffer_iterator(struct wlr_surface *surface,
|
||||||
struct sway_view *view = data;
|
struct sway_view *view = data;
|
||||||
|
|
||||||
if (surface && wlr_surface_has_buffer(surface)) {
|
if (surface && wlr_surface_has_buffer(surface)) {
|
||||||
wlr_buffer_lock(&surface->buffer->base);
|
|
||||||
struct sway_saved_buffer *saved_buffer = calloc(1, sizeof(struct sway_saved_buffer));
|
struct sway_saved_buffer *saved_buffer = calloc(1, sizeof(struct sway_saved_buffer));
|
||||||
saved_buffer->buffer = surface->buffer;
|
saved_buffer->raster = wlr_raster_from_surface(surface);
|
||||||
saved_buffer->width = surface->current.width;
|
saved_buffer->width = surface->current.width;
|
||||||
saved_buffer->height = surface->current.height;
|
saved_buffer->height = surface->current.height;
|
||||||
saved_buffer->x = view->container->surface_x + sx;
|
saved_buffer->x = view->container->surface_x + sx;
|
||||||
|
|
Loading…
Reference in a new issue