types/wlr_surface: get buffer size from wlr_buffer_import

This commit is contained in:
Simon Zeni 2021-07-07 14:28:37 -04:00 committed by Simon Ser
parent 6d8029b07e
commit d086501fba
2 changed files with 26 additions and 4 deletions

View file

@ -35,6 +35,7 @@ struct wlr_surface_state {
// overflow. // overflow.
uint32_t seq; uint32_t seq;
struct wlr_buffer *buffer;
struct wl_resource *buffer_resource; struct wl_resource *buffer_resource;
int32_t dx, dy; // relative to previous position int32_t dx, dy; // relative to previous position
pixman_region32_t surface_damage, buffer_damage; // clipped to bounds pixman_region32_t surface_damage, buffer_damage; // clipped to bounds

View file

@ -170,9 +170,18 @@ static void surface_state_viewport_src_size(struct wlr_surface_state *state,
static void surface_state_finalize(struct wlr_surface *surface, static void surface_state_finalize(struct wlr_surface *surface,
struct wlr_surface_state *state) { struct wlr_surface_state *state) {
if ((state->committed & WLR_SURFACE_STATE_BUFFER)) { if ((state->committed & WLR_SURFACE_STATE_BUFFER)) {
if (state->buffer_resource != NULL) { if (state->buffer_resource) {
wlr_resource_get_buffer_size(state->buffer_resource, wlr_buffer_unlock(state->buffer);
&state->buffer_width, &state->buffer_height); state->buffer = wlr_buffer_from_resource(surface->renderer,
state->buffer_resource);
if (!state->buffer) {
wl_resource_post_error(state->buffer_resource, 0,
"unknown buffer type");
return;
}
state->buffer_width = state->buffer->width;
state->buffer_height = state->buffer->height;
} else { } else {
state->buffer_width = state->buffer_height = 0; state->buffer_width = state->buffer_height = 0;
} }
@ -303,9 +312,15 @@ static void surface_state_move(struct wlr_surface_state *state,
surface_state_copy(state, next); surface_state_copy(state, next);
if (next->committed & WLR_SURFACE_STATE_BUFFER) { if (next->committed & WLR_SURFACE_STATE_BUFFER) {
if (next->buffer) {
wlr_buffer_unlock(state->buffer);
state->buffer = wlr_buffer_lock(next->buffer);
}
surface_state_set_buffer(state, next->buffer_resource); surface_state_set_buffer(state, next->buffer_resource);
surface_state_reset_buffer(next); surface_state_reset_buffer(next);
next->dx = next->dy = 0; next->dx = next->dy = 0;
wlr_buffer_unlock(next->buffer);
next->buffer = NULL;
} }
if (next->committed & WLR_SURFACE_STATE_SURFACE_DAMAGE) { if (next->committed & WLR_SURFACE_STATE_SURFACE_DAMAGE) {
pixman_region32_clear(&next->surface_damage); pixman_region32_clear(&next->surface_damage);
@ -360,6 +375,8 @@ static void surface_apply_damage(struct wlr_surface *surface) {
wlr_client_buffer_apply_damage(surface->buffer, resource, wlr_client_buffer_apply_damage(surface->buffer, resource,
&surface->buffer_damage); &surface->buffer_damage);
if (updated_buffer != NULL) { if (updated_buffer != NULL) {
wlr_buffer_unlock(surface->current.buffer);
surface->current.buffer = NULL;
surface->buffer = updated_buffer; surface->buffer = updated_buffer;
return; return;
} }
@ -367,11 +384,14 @@ static void surface_apply_damage(struct wlr_surface *surface) {
struct wlr_client_buffer *buffer = wlr_client_buffer_create( struct wlr_client_buffer *buffer = wlr_client_buffer_create(
surface->current.buffer, surface->renderer, resource); surface->current.buffer, surface->renderer, resource);
wlr_buffer_unlock(surface->current.buffer);
surface->current.buffer = NULL;
if (buffer == NULL) { if (buffer == NULL) {
wlr_log(WLR_ERROR, "Failed to upload buffer"); wlr_log(WLR_ERROR, "Failed to upload buffer");
return; return;
} }
wlr_buffer_unlock(surface->current.buffer);
if (surface->buffer != NULL) { if (surface->buffer != NULL) {
wlr_buffer_unlock(&surface->buffer->base); wlr_buffer_unlock(&surface->buffer->base);
@ -638,6 +658,7 @@ static void surface_state_init(struct wlr_surface_state *state) {
static void surface_state_finish(struct wlr_surface_state *state) { static void surface_state_finish(struct wlr_surface_state *state) {
surface_state_reset_buffer(state); surface_state_reset_buffer(state);
wlr_buffer_unlock(state->buffer);
struct wl_resource *resource, *tmp; struct wl_resource *resource, *tmp;
wl_resource_for_each_safe(resource, tmp, &state->frame_callback_list) { wl_resource_for_each_safe(resource, tmp, &state->frame_callback_list) {