summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Vorobiov <s.vorobiov@samsung.com>2013-08-29 11:36:44 +0400
committerKristian Høgsberg <krh@bitplanet.net>2013-09-11 10:56:00 -0700
commitbfbb8e59fadda112fcdb0bf0a0ed2c0b6c1e1923 (patch)
treecf04a934fa0733a6e97d842dc155ca39f7151a5f
parent9a6f02a6b1b20e803e816cdf0aee69eea3c0ff85 (diff)
downloadweston-bfbb8e59fadda112fcdb0bf0a0ed2c0b6c1e1923.tar.gz
weston-bfbb8e59fadda112fcdb0bf0a0ed2c0b6c1e1923.tar.bz2
weston-bfbb8e59fadda112fcdb0bf0a0ed2c0b6c1e1923.zip
gl_renderer: Use EGL_WAYLAND_Y_INVERTED_WL to query wl_buffer's orientation
-rw-r--r--src/compositor.c1
-rw-r--r--src/compositor.h1
-rw-r--r--src/gl-renderer.c14
-rw-r--r--src/weston-egl-ext.h4
4 files changed, 19 insertions, 1 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 74f0aab4..8c9e0fe7 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1088,6 +1088,7 @@ weston_buffer_from_resource(struct wl_resource *resource)
buffer->resource = resource;
wl_signal_init(&buffer->destroy_signal);
buffer->destroy_listener.notify = weston_buffer_destroy_handler;
+ buffer->y_inverted = 1;
wl_resource_add_destroy_listener(resource, &buffer->destroy_listener);
return buffer;
diff --git a/src/compositor.h b/src/compositor.h
index a6f2c62c..50e96ff1 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -611,6 +611,7 @@ struct weston_buffer {
};
int32_t width, height;
uint32_t busy_count;
+ int y_inverted;
};
struct weston_buffer_reference {
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index af8011ba..4381a2ea 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -77,6 +77,7 @@ struct gl_surface_state {
enum buffer_type buffer_type;
int pitch; /* in pixels */
int height; /* in pixels */
+ int y_inverted;
};
struct gl_renderer {
@@ -599,7 +600,11 @@ texture_region(struct weston_surface *es, pixman_region32_t *region,
weston_surface_to_buffer_float(es, sx, sy,
&bx, &by);
*(v++) = bx * inv_width;
- *(v++) = by * inv_height;
+ if (gs->y_inverted) {
+ *(v++) = by * inv_height;
+ } else {
+ *(v++) = (gs->height - by) * inv_height;
+ }
}
vtxcnt[nvtx++] = n;
@@ -1260,6 +1265,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
gs->target = GL_TEXTURE_2D;
gs->buffer_type = BUFFER_TYPE_SHM;
gs->needs_full_upload = 1;
+ gs->y_inverted = 1;
ensure_textures(gs, 1);
glBindTexture(GL_TEXTURE_2D, gs->textures[0]);
@@ -1284,6 +1290,8 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *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++)
gr->destroy_image(gr->egl_display, gs->images[i]);
@@ -1340,6 +1348,7 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer,
gs->pitch = buffer->width;
gs->height = buffer->height;
gs->buffer_type = BUFFER_TYPE_EGL;
+ gs->y_inverted = buffer->y_inverted;
}
static void
@@ -1363,6 +1372,7 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
glDeleteTextures(gs->num_textures, gs->textures);
gs->num_textures = 0;
gs->buffer_type = BUFFER_TYPE_NULL;
+ gs->y_inverted = 1;
return;
}
@@ -1377,6 +1387,7 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
weston_log("unhandled buffer type!\n");
weston_buffer_reference(&gs->buffer_ref, NULL);
gs->buffer_type = BUFFER_TYPE_NULL;
+ gs->y_inverted = 1;
}
}
@@ -1409,6 +1420,7 @@ gl_renderer_create_surface(struct weston_surface *surface)
* by zero there.
*/
gs->pitch = 1;
+ gs->y_inverted = 1;
pixman_region32_init(&gs->texture_damage);
surface->renderer_state = gs;
diff --git a/src/weston-egl-ext.h b/src/weston-egl-ext.h
index 6aa49fd8..bab87be1 100644
--- a/src/weston-egl-ext.h
+++ b/src/weston-egl-ext.h
@@ -62,6 +62,10 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, st
#define EGL_BUFFER_AGE_EXT 0x313D
#endif
+#ifndef EGL_WAYLAND_Y_INVERTED_WL
+#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB /* eglQueryWaylandBufferWL attribute */
+#endif
+
/* Mesas gl2ext.h and probably Khronos upstream defined
* GL_EXT_unpack_subimage with non _EXT suffixed GL_UNPACK_* tokens.
* In case we're using that mess, manually define the _EXT versions