gl-renderer: Add hook to fill weston_buffer for EGL
Rather than only filling weston_buffer information when we first come to use it, add an explicit hook so we can fill the dimensions the first time the buffer's attached. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -68,8 +68,9 @@ screenshooter_take_shot(struct wl_client *client,
|
|||||||
{
|
{
|
||||||
struct weston_output *output =
|
struct weston_output *output =
|
||||||
weston_head_from_resource(output_resource)->output;
|
weston_head_from_resource(output_resource)->output;
|
||||||
|
struct weston_compositor *ec = output->compositor;
|
||||||
struct weston_buffer *buffer =
|
struct weston_buffer *buffer =
|
||||||
weston_buffer_from_resource(buffer_resource);
|
weston_buffer_from_resource(ec, buffer_resource);
|
||||||
|
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
wl_resource_post_no_memory(resource);
|
wl_resource_post_no_memory(resource);
|
||||||
|
|||||||
@@ -934,7 +934,6 @@ struct weston_renderer {
|
|||||||
float blue, float alpha);
|
float blue, float alpha);
|
||||||
void (*destroy)(struct weston_compositor *ec);
|
void (*destroy)(struct weston_compositor *ec);
|
||||||
|
|
||||||
|
|
||||||
/** See weston_surface_get_content_size() */
|
/** See weston_surface_get_content_size() */
|
||||||
void (*surface_get_content_size)(struct weston_surface *surface,
|
void (*surface_get_content_size)(struct weston_surface *surface,
|
||||||
int *width, int *height);
|
int *width, int *height);
|
||||||
@@ -951,6 +950,9 @@ struct weston_renderer {
|
|||||||
|
|
||||||
const struct weston_drm_format_array *
|
const struct weston_drm_format_array *
|
||||||
(*get_supported_formats)(struct weston_compositor *ec);
|
(*get_supported_formats)(struct weston_compositor *ec);
|
||||||
|
|
||||||
|
bool (*fill_buffer_info)(struct weston_compositor *ec,
|
||||||
|
struct weston_buffer *buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum weston_capability {
|
enum weston_capability {
|
||||||
@@ -1818,7 +1820,8 @@ weston_surface_copy_content(struct weston_surface *surface,
|
|||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
struct weston_buffer *
|
struct weston_buffer *
|
||||||
weston_buffer_from_resource(struct wl_resource *resource);
|
weston_buffer_from_resource(struct weston_compositor *ec,
|
||||||
|
struct wl_resource *resource);
|
||||||
|
|
||||||
void
|
void
|
||||||
weston_compositor_get_time(struct timespec *time);
|
weston_compositor_get_time(struct timespec *time);
|
||||||
|
|||||||
+15
-2
@@ -2385,7 +2385,8 @@ weston_buffer_destroy_handler(struct wl_listener *listener, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT struct weston_buffer *
|
WL_EXPORT struct weston_buffer *
|
||||||
weston_buffer_from_resource(struct wl_resource *resource)
|
weston_buffer_from_resource(struct weston_compositor *ec,
|
||||||
|
struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
struct weston_buffer *buffer;
|
struct weston_buffer *buffer;
|
||||||
struct wl_shm_buffer *shm;
|
struct wl_shm_buffer *shm;
|
||||||
@@ -2418,9 +2419,20 @@ weston_buffer_from_resource(struct wl_resource *resource)
|
|||||||
buffer->height = dmabuf->attributes.height;
|
buffer->height = dmabuf->attributes.height;
|
||||||
buffer->y_inverted =
|
buffer->y_inverted =
|
||||||
!(dmabuf->attributes.flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
|
!(dmabuf->attributes.flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
|
||||||
|
} else {
|
||||||
|
/* Only taken for legacy EGL buffers */
|
||||||
|
if (!ec->renderer->fill_buffer_info ||
|
||||||
|
!ec->renderer->fill_buffer_info(ec, buffer)) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
wl_list_remove(&buffer->destroy_listener.link);
|
||||||
|
free(buffer);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -3440,10 +3452,11 @@ surface_attach(struct wl_client *client,
|
|||||||
struct wl_resource *buffer_resource, int32_t sx, int32_t sy)
|
struct wl_resource *buffer_resource, int32_t sx, int32_t sy)
|
||||||
{
|
{
|
||||||
struct weston_surface *surface = wl_resource_get_user_data(resource);
|
struct weston_surface *surface = wl_resource_get_user_data(resource);
|
||||||
|
struct weston_compositor *ec = surface->compositor;
|
||||||
struct weston_buffer *buffer = NULL;
|
struct weston_buffer *buffer = NULL;
|
||||||
|
|
||||||
if (buffer_resource) {
|
if (buffer_resource) {
|
||||||
buffer = weston_buffer_from_resource(buffer_resource);
|
buffer = weston_buffer_from_resource(ec, buffer_resource);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
wl_client_post_no_memory(client);
|
wl_client_post_no_memory(client);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -2153,6 +2153,28 @@ unsupported:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
gl_renderer_fill_buffer_info(struct weston_compositor *ec,
|
||||||
|
struct weston_buffer *buffer)
|
||||||
|
{
|
||||||
|
struct gl_renderer *gr = get_renderer(ec);
|
||||||
|
bool ret = true;
|
||||||
|
|
||||||
|
buffer->legacy_buffer = (struct wl_buffer *)buffer->resource;
|
||||||
|
ret &= gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
||||||
|
EGL_WIDTH, &buffer->width);
|
||||||
|
ret &= gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
||||||
|
EGL_HEIGHT, &buffer->height);
|
||||||
|
|
||||||
|
/* Assume scanout co-ordinate space i.e. (0,0) is top-left
|
||||||
|
* if the query fails */
|
||||||
|
buffer->y_inverted = true;
|
||||||
|
gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
||||||
|
EGL_WAYLAND_Y_INVERTED_WL, &buffer->y_inverted);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
|
gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
|
||||||
uint32_t format)
|
uint32_t format)
|
||||||
@@ -2164,14 +2186,6 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
|
|||||||
GLenum target;
|
GLenum target;
|
||||||
int i, num_planes;
|
int i, num_planes;
|
||||||
|
|
||||||
buffer->legacy_buffer = (struct wl_buffer *)buffer->resource;
|
|
||||||
gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
EGL_WIDTH, &buffer->width);
|
|
||||||
gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
EGL_HEIGHT, &buffer->height);
|
|
||||||
gr->query_buffer(gr->egl_display, buffer->legacy_buffer,
|
|
||||||
EGL_WAYLAND_Y_INVERTED_WL, &buffer->y_inverted);
|
|
||||||
|
|
||||||
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->images[i] = NULL;
|
gs->images[i] = NULL;
|
||||||
@@ -3674,6 +3688,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
|
|||||||
gr->base.surface_get_content_size =
|
gr->base.surface_get_content_size =
|
||||||
gl_renderer_surface_get_content_size;
|
gl_renderer_surface_get_content_size;
|
||||||
gr->base.surface_copy_content = gl_renderer_surface_copy_content;
|
gr->base.surface_copy_content = gl_renderer_surface_copy_content;
|
||||||
|
gr->base.fill_buffer_info = gl_renderer_fill_buffer_info;
|
||||||
|
|
||||||
if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)
|
if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|||||||
Reference in New Issue
Block a user