mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-21 21:30:11 +01:00
renderers: Set buffer properties earlier
When we first see a buffer attached, we create a weston_buffer for it. The weston_buffer doesn't contain any useful information in and of itself; that's left to renderers to populate later. Switch this to doing it in the core at the first opportunity, at least for SHM and dmabuf buffers; EGL buffers will follow in the next commit. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
fec0400886
commit
ca9bb01fe6
4 changed files with 14 additions and 24 deletions
|
|
@ -2388,6 +2388,8 @@ WL_EXPORT struct weston_buffer *
|
||||||
weston_buffer_from_resource(struct wl_resource *resource)
|
weston_buffer_from_resource(struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
struct weston_buffer *buffer;
|
struct weston_buffer *buffer;
|
||||||
|
struct wl_shm_buffer *shm;
|
||||||
|
struct linux_dmabuf_buffer *dmabuf;
|
||||||
struct wl_listener *listener;
|
struct wl_listener *listener;
|
||||||
|
|
||||||
listener = wl_resource_get_destroy_listener(resource,
|
listener = wl_resource_get_destroy_listener(resource,
|
||||||
|
|
@ -2404,9 +2406,20 @@ weston_buffer_from_resource(struct wl_resource *resource)
|
||||||
buffer->resource = resource;
|
buffer->resource = resource;
|
||||||
wl_signal_init(&buffer->destroy_signal);
|
wl_signal_init(&buffer->destroy_signal);
|
||||||
buffer->destroy_listener.notify = weston_buffer_destroy_handler;
|
buffer->destroy_listener.notify = weston_buffer_destroy_handler;
|
||||||
buffer->y_inverted = 1;
|
|
||||||
wl_resource_add_destroy_listener(resource, &buffer->destroy_listener);
|
wl_resource_add_destroy_listener(resource, &buffer->destroy_listener);
|
||||||
|
|
||||||
|
if ((shm = wl_shm_buffer_get(buffer->resource))) {
|
||||||
|
buffer->shm_buffer = shm;
|
||||||
|
buffer->width = wl_shm_buffer_get_width(shm);
|
||||||
|
buffer->height = wl_shm_buffer_get_height(shm);
|
||||||
|
buffer->y_inverted = true;
|
||||||
|
} else if ((dmabuf = linux_dmabuf_buffer_get(buffer->resource))) {
|
||||||
|
buffer->width = dmabuf->attributes.width;
|
||||||
|
buffer->height = dmabuf->attributes.height;
|
||||||
|
buffer->y_inverted =
|
||||||
|
!(dmabuf->attributes.flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
|
||||||
|
}
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -666,10 +666,6 @@ pixman_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
|
||||||
|
|
||||||
es->is_opaque = pixel_format_is_opaque(pixel_info);
|
es->is_opaque = pixel_format_is_opaque(pixel_info);
|
||||||
|
|
||||||
buffer->shm_buffer = shm_buffer;
|
|
||||||
buffer->width = wl_shm_buffer_get_width(shm_buffer);
|
|
||||||
buffer->height = wl_shm_buffer_get_height(shm_buffer);
|
|
||||||
|
|
||||||
ps->image = pixman_image_create_bits(pixel_info->pixman_format,
|
ps->image = pixman_image_create_bits(pixel_info->pixman_format,
|
||||||
buffer->width, buffer->height,
|
buffer->width, buffer->height,
|
||||||
wl_shm_buffer_get_data(shm_buffer),
|
wl_shm_buffer_get_data(shm_buffer),
|
||||||
|
|
|
||||||
|
|
@ -1965,10 +1965,6 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
|
||||||
int num_planes;
|
int num_planes;
|
||||||
bool using_glesv2 = gr->gl_version < gr_gl_version(3, 0);
|
bool using_glesv2 = gr->gl_version < gr_gl_version(3, 0);
|
||||||
|
|
||||||
buffer->shm_buffer = shm_buffer;
|
|
||||||
buffer->width = wl_shm_buffer_get_width(shm_buffer);
|
|
||||||
buffer->height = wl_shm_buffer_get_height(shm_buffer);
|
|
||||||
|
|
||||||
num_planes = 1;
|
num_planes = 1;
|
||||||
gs->offset[0] = 0;
|
gs->offset[0] = 0;
|
||||||
gs->hsub[0] = 1;
|
gs->hsub[0] = 1;
|
||||||
|
|
@ -2820,17 +2816,6 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
|
||||||
GLenum target;
|
GLenum target;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
buffer->width = dmabuf->attributes.width;
|
|
||||||
buffer->height = dmabuf->attributes.height;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* GL-renderer uses the OpenGL convention of texture coordinates, where
|
|
||||||
* the origin is at bottom-left. Because dmabuf buffers have the origin
|
|
||||||
* at top-left, we must invert the Y_INVERT flag to get the image right.
|
|
||||||
*/
|
|
||||||
buffer->y_inverted =
|
|
||||||
!(dmabuf->attributes.flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
|
|
||||||
|
|
||||||
for (i = 0; i < gs->num_images; i++)
|
for (i = 0; i < gs->num_images; i++)
|
||||||
egl_image_unref(gs->images[i]);
|
egl_image_unref(gs->images[i]);
|
||||||
gs->num_images = 0;
|
gs->num_images = 0;
|
||||||
|
|
|
||||||
|
|
@ -186,10 +186,6 @@ weston_screenshooter_shoot(struct weston_output *output,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->shm_buffer = wl_shm_buffer_get(buffer->resource);
|
|
||||||
buffer->width = wl_shm_buffer_get_width(buffer->shm_buffer);
|
|
||||||
buffer->height = wl_shm_buffer_get_height(buffer->shm_buffer);
|
|
||||||
|
|
||||||
if (buffer->width < output->current_mode->width ||
|
if (buffer->width < output->current_mode->width ||
|
||||||
buffer->height < output->current_mode->height) {
|
buffer->height < output->current_mode->height) {
|
||||||
done(data, WESTON_SCREENSHOOTER_BAD_BUFFER);
|
done(data, WESTON_SCREENSHOOTER_BAD_BUFFER);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue