surface: make wlr_surface.buffer a wlr_buffer

This commit is contained in:
Simon Ser 2021-04-13 11:14:16 +02:00 committed by Simon Zeni
parent 28aa803916
commit 8798fa36bd
2 changed files with 24 additions and 22 deletions

View file

@ -93,7 +93,7 @@ struct wlr_surface {
* have a buffer if it has never committed one, has committed a null buffer, * have a buffer if it has never committed one, has committed a null buffer,
* or something went wrong with uploading the buffer. * or something went wrong with uploading the buffer.
*/ */
struct wlr_client_buffer *buffer; struct wlr_buffer *buffer;
/** /**
* The buffer position, in surface-local units. * The buffer position, in surface-local units.
*/ */

View file

@ -363,40 +363,41 @@ static void surface_apply_damage(struct wlr_surface *surface) {
struct wl_resource *resource = surface->current.buffer_resource; struct wl_resource *resource = surface->current.buffer_resource;
if (resource == NULL) { if (resource == NULL) {
// NULL commit // NULL commit
if (surface->buffer != NULL) { wlr_buffer_unlock(surface->buffer);
wlr_buffer_unlock(&surface->buffer->base);
}
surface->buffer = NULL; surface->buffer = NULL;
return; return;
} }
if (surface->buffer != NULL) { struct wlr_client_buffer *client_buffer =
(surface->buffer ? wlr_client_buffer_get(surface->buffer) : NULL);
if (client_buffer) {
struct wlr_client_buffer *updated_buffer = struct wlr_client_buffer *updated_buffer =
wlr_client_buffer_apply_damage(surface->buffer, resource, wlr_client_buffer_apply_damage(client_buffer, resource,
&surface->buffer_damage); &surface->buffer_damage);
if (updated_buffer != NULL) { if (updated_buffer) {
wlr_buffer_unlock(surface->current.buffer); wlr_buffer_unlock(surface->current.buffer);
surface->current.buffer = NULL; surface->current.buffer = NULL;
surface->buffer = updated_buffer; surface->buffer = &updated_buffer->base;
return;
} }
} }
struct wlr_client_buffer *buffer = wlr_client_buffer_create( if (!surface->current.buffer) {
surface->current.buffer, surface->renderer); surface->current.buffer = wlr_buffer_from_resource(surface->renderer,
resource);
}
client_buffer = wlr_client_buffer_create(surface->current.buffer,
surface->renderer);
wlr_buffer_unlock(surface->current.buffer);
surface->current.buffer = NULL; surface->current.buffer = NULL;
if (buffer == NULL) { if (client_buffer == NULL) {
wlr_log(WLR_ERROR, "Failed to upload buffer"); wlr_log(WLR_ERROR, "Failed to upload buffer");
return; return;
} }
if (surface->buffer != NULL) { wlr_buffer_unlock(surface->buffer);
wlr_buffer_unlock(&surface->buffer->base); surface->buffer = &client_buffer->base;
}
surface->buffer = buffer;
} }
static void surface_update_opaque_region(struct wlr_surface *surface) { static void surface_update_opaque_region(struct wlr_surface *surface) {
@ -728,9 +729,7 @@ static void surface_handle_resource_destroy(struct wl_resource *resource) {
pixman_region32_fini(&surface->buffer_damage); pixman_region32_fini(&surface->buffer_damage);
pixman_region32_fini(&surface->opaque_region); pixman_region32_fini(&surface->opaque_region);
pixman_region32_fini(&surface->input_region); pixman_region32_fini(&surface->input_region);
if (surface->buffer != NULL) { wlr_buffer_unlock(surface->buffer);
wlr_buffer_unlock(&surface->buffer->base);
}
free(surface); free(surface);
} }
@ -790,7 +789,10 @@ struct wlr_texture *wlr_surface_get_texture(struct wlr_surface *surface) {
if (surface->buffer == NULL) { if (surface->buffer == NULL) {
return NULL; return NULL;
} }
return surface->buffer->texture; struct wlr_client_buffer *client_buffer =
wlr_client_buffer_get(surface->buffer);
assert(client_buffer);
return client_buffer->texture;
} }
bool wlr_surface_has_buffer(struct wlr_surface *surface) { bool wlr_surface_has_buffer(struct wlr_surface *surface) {