struct gl_surface_state *gs = get_surface_state(ev->surface);
/* repaint bounding region in global coordinates: */
pixman_region32_t repaint;
+ /* opaque region in surface coordinates: */
+ pixman_region32_t surface_opaque;
/* non-opaque region in surface coordinates: */
pixman_region32_t surface_blend;
GLint filter;
/* blended region is whole surface minus opaque region: */
pixman_region32_init_rect(&surface_blend, 0, 0,
ev->surface->width, ev->surface->height);
- pixman_region32_subtract(&surface_blend, &surface_blend, &ev->surface->opaque);
+ if (ev->geometry.scissor_enabled)
+ pixman_region32_intersect(&surface_blend, &surface_blend,
+ &ev->geometry.scissor);
+ pixman_region32_subtract(&surface_blend, &surface_blend,
+ &ev->surface->opaque);
/* XXX: Should we be using ev->transform.opaque here? */
- if (pixman_region32_not_empty(&ev->surface->opaque)) {
+ pixman_region32_init(&surface_opaque);
+ if (ev->geometry.scissor_enabled)
+ pixman_region32_intersect(&surface_opaque,
+ &ev->surface->opaque,
+ &ev->geometry.scissor);
+ else
+ pixman_region32_copy(&surface_opaque, &ev->surface->opaque);
+
+ if (pixman_region32_not_empty(&surface_opaque)) {
if (gs->shader == &gr->texture_shader_rgba) {
/* Special case for RGBA textures with possibly
* bad data in alpha channel: use the shader
else
glDisable(GL_BLEND);
- repaint_region(ev, &repaint, &ev->surface->opaque);
+ repaint_region(ev, &repaint, &surface_opaque);
}
if (pixman_region32_not_empty(&surface_blend)) {
}
pixman_region32_fini(&surface_blend);
+ pixman_region32_fini(&surface_opaque);
out:
pixman_region32_fini(&repaint);
ec->renderer = &gr->base;
ec->capabilities |= WESTON_CAP_ROTATION_ANY;
ec->capabilities |= WESTON_CAP_CAPTURE_YFLIP;
+ ec->capabilities |= WESTON_CAP_VIEW_CLIP_MASK;
if (gl_renderer_setup_egl_extensions(ec) < 0)
goto err_egl;