compositor: use GL_EXT_unpack_subimage only if available

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Pekka Paalanen 13 years ago
parent 2eaa11e954
commit 52bfbaae14
  1. 43
      src/compositor.c
  2. 3
      src/compositor.h

@ -1166,24 +1166,43 @@ surface_attach(struct wl_client *client,
} }
static void static void
surface_damage(struct wl_client *client, texture_set_subimage(struct weston_surface *surface,
struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height)
int32_t x, int32_t y, int32_t width, int32_t height)
{ {
struct weston_surface *es = resource->data; glBindTexture(GL_TEXTURE_2D, surface->texture);
weston_surface_damage_rectangle(es, x, y, width, height); #ifdef GL_UNPACK_ROW_LENGTH
/* Mesa does not define GL_EXT_unpack_subimage */
if (es->buffer && wl_buffer_is_shm(es->buffer)) { if (surface->compositor->has_unpack_subimage) {
glBindTexture(GL_TEXTURE_2D, es->texture); glPixelStorei(GL_UNPACK_ROW_LENGTH, surface->pitch);
glPixelStorei(GL_UNPACK_ROW_LENGTH, es->pitch);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, x); glPixelStorei(GL_UNPACK_SKIP_PIXELS, x);
glPixelStorei(GL_UNPACK_SKIP_ROWS, y); glPixelStorei(GL_UNPACK_SKIP_ROWS, y);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
wl_shm_buffer_get_data(es->buffer)); wl_shm_buffer_get_data(surface->buffer));
return;
} }
#endif
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
surface->pitch, surface->buffer->height, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE,
wl_shm_buffer_get_data(surface->buffer));
}
static void
surface_damage(struct wl_client *client,
struct wl_resource *resource,
int32_t x, int32_t y, int32_t width, int32_t height)
{
struct weston_surface *es = resource->data;
weston_surface_damage_rectangle(es, x, y, width, height);
if (es->buffer && wl_buffer_is_shm(es->buffer))
texture_set_subimage(es, x, y, width, height);
} }
static void static void
@ -2372,10 +2391,8 @@ weston_compositor_init(struct weston_compositor *ec, struct wl_display *display)
return -1; return -1;
} }
if (!strstr(extensions, "GL_EXT_unpack_subimage")) { if (strstr(extensions, "GL_EXT_unpack_subimage"))
fprintf(stderr, "GL_EXT_unpack_subimage not available\n"); ec->has_unpack_subimage = 1;
return -1;
}
extensions = extensions =
(const char *) eglQueryString(ec->display, EGL_EXTENSIONS); (const char *) eglQueryString(ec->display, EGL_EXTENSIONS);

@ -221,6 +221,9 @@ struct weston_compositor {
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
PFNEGLCREATEIMAGEKHRPROC create_image; PFNEGLCREATEIMAGEKHRPROC create_image;
PFNEGLDESTROYIMAGEKHRPROC destroy_image; PFNEGLDESTROYIMAGEKHRPROC destroy_image;
int has_unpack_subimage;
PFNEGLBINDWAYLANDDISPLAYWL bind_display; PFNEGLBINDWAYLANDDISPLAYWL bind_display;
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display; PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
int has_bind_display; int has_bind_display;

Loading…
Cancel
Save