1 From 663f2a362ff384098f4c32f5cc9e7b7b73f2a553 Mon Sep 17 00:00:00 2001
2 From: Prabhu Sundararaj <prabhu.sundararaj@freescale.com>
3 Date: Tue, 24 Jun 2014 15:44:13 -0500
4 Subject: [PATCH] ENGR00319247 : Distorted line and shadow if use 2d compositor
6 Organization: O.S. Systems Software LTDA.
8 Fixed blending for shadown and maintained separate surface for damage composite.
12 Signed-off-by: Prabhu Sundararaj <prabhu.sundararaj@freescale.com>
13 Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
15 src/compositor-fbdev.c | 8 ++--
16 src/gal2d-renderer.c | 102 +++++++++++++++++++++++++++++++++++--------------
17 src/gal2d-renderer.h | 6 +++
18 3 files changed, 83 insertions(+), 33 deletions(-)
20 diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
21 index a3d32e5..b27d199 100644
22 --- a/src/compositor-fbdev.c
23 +++ b/src/compositor-fbdev.c
24 @@ -55,7 +55,7 @@ struct fbdev_compositor {
27 struct wl_listener session_listener;
28 - EGLNativeDisplayType display;
29 + NativeDisplayType display;
32 struct fbdev_screeninfo {
33 @@ -91,8 +91,8 @@ struct fbdev_output {
37 - EGLNativeDisplayType display;
38 - EGLNativeWindowType window;
39 + NativeDisplayType display;
40 + NativeWindowType window;
43 struct fbdev_parameters {
44 @@ -667,7 +667,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
47 if (gl_renderer->output_create(&output->base,
48 - (EGLNativeWindowType)output->window,
49 + (NativeWindowType)output->window,
50 gl_renderer->opaque_attribs,
52 weston_log("gl_renderer_output_create failed.\n");
53 diff --git a/src/gal2d-renderer.c b/src/gal2d-renderer.c
54 index c651573..fbe39f6 100644
55 --- a/src/gal2d-renderer.c
56 +++ b/src/gal2d-renderer.c
57 @@ -42,7 +42,7 @@ struct gal2d_output_state {
60 pixman_region32_t buffer_damage[2];
61 - EGLNativeDisplayType display;
62 + NativeDisplayType display;
64 gctUINT32 nNumBuffers;
66 @@ -423,11 +423,9 @@ gal2dBindBuffer(struct weston_surface* es)
67 gcoSURF surface = gs->gco_Surface;
68 struct weston_buffer *buffer = gs->buffer_ref.buffer;
69 gcePOOL pool = gcvPOOL_DEFAULT;
73 - gcmVERIFY_OK(gcoSURF_QueryVidMemNode(surface, &node,
76 + gcmVERIFY_OK(gcoSURF_QueryVidMemNode(surface, gcvNULL,
79 if(pool != gcvPOOL_USER)
81 @@ -801,24 +799,26 @@ draw_view(struct weston_view *ev, struct weston_output *output,
82 ev->surface->width, ev->surface->height);
83 pixman_region32_subtract(&surface_blend, &surface_blend, &ev->surface->opaque);
85 + struct gal2d_renderer *gr = get_renderer(ec);
87 if (pixman_region32_not_empty(&ev->surface->opaque)) {
89 repaint_region(ev, output, go, &repaint, &ev->surface->opaque);
92 if (pixman_region32_not_empty(&surface_blend)) {
93 - struct gal2d_renderer *gr = get_renderer(ec);
96 gco2D_EnableAlphaBlend(gr->gcoEngine2d,
97 - ev->alpha * 0xFF, ev->alpha * 0xFF,
98 - gcvSURF_PIXEL_ALPHA_STRAIGHT, gcvSURF_PIXEL_ALPHA_STRAIGHT,
99 - gcvSURF_GLOBAL_ALPHA_OFF, gcvSURF_GLOBAL_ALPHA_OFF,
100 - gcvSURF_BLEND_ONE, gcvSURF_BLEND_INVERSED,
101 - gcvSURF_COLOR_STRAIGHT, gcvSURF_COLOR_STRAIGHT);
102 + ev->alpha * 0xFF, ev->alpha * 0xFF,
103 + gcvSURF_PIXEL_ALPHA_STRAIGHT, gcvSURF_PIXEL_ALPHA_STRAIGHT,
104 + gcvSURF_GLOBAL_ALPHA_SCALE, gcvSURF_GLOBAL_ALPHA_SCALE,
105 + gcvSURF_BLEND_STRAIGHT, gcvSURF_BLEND_INVERSED,
106 + gcvSURF_COLOR_STRAIGHT, gcvSURF_COLOR_STRAIGHT);
108 repaint_region(ev, output, go, &repaint, &surface_blend);
111 + gco2D_DisableAlphaBlend(gr->gcoEngine2d);
112 pixman_region32_fini(&surface_blend);
115 @@ -866,6 +866,48 @@ gal2d_renderer_repaint_output(struct weston_output *output,
119 +gal2d_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer)
121 + gcsWL_VIV_BUFFER *vivBuffer = wl_resource_get_user_data(buffer->resource);
123 + gctUINT height = 0;
125 + gceSURF_FORMAT format;
126 + gcoSURF srcSurf = vivBuffer->surface;
127 + gctUINT32 physical;
129 + gceSTATUS status = gcvSTATUS_OK;
130 + struct gal2d_surface_state *gs = get_surface_state(es);
132 + if(gs->gco_Surface == gcvNULL)
134 + /** Construct a wrapper. */
135 + gcmONERROR(gcoSURF_ConstructWrapper(gcvNULL, &gs->gco_Surface));
138 + gcmONERROR(gcoSURF_GetAlignedSize(srcSurf, &width, &height, &stride));
139 + gcmONERROR(gcoSURF_GetFormat(srcSurf, gcvNULL, &format));
140 + gcmONERROR(gcoSURF_Lock(srcSurf, &physical, (gctPOINTER *)&va));
142 + /* Set the buffer. */
143 + gcmONERROR(gcoSURF_SetBuffer(gs->gco_Surface,
144 + gcvSURF_BITMAP_NO_VIDMEM,
148 + (gctUINT32) physical));
150 + /* Set the window. */
151 + gcmONERROR(gcoSURF_SetWindow(gs->gco_Surface, 0, 0, width, height));
153 + buffer->width = vivBuffer->width;
154 + buffer->height = vivBuffer->height;
157 + galONERROR(status);
161 gal2d_renderer_flush_damage(struct weston_surface *surface)
163 struct gal2d_surface_state *gs = get_surface_state(surface);
164 @@ -900,10 +942,7 @@ gal2d_renderer_flush_damage(struct weston_surface *surface)
165 gal2dBindBuffer(surface);
169 - gcsWL_VIV_BUFFER *vivBuffer = (gcsWL_VIV_BUFFER *)buffer;
170 - gs->gco_Surface = vivBuffer->surface;
172 + gal2d_renderer_attach_egl(surface, buffer);
175 pixman_region32_fini(&gs->texture_damage);
176 @@ -937,19 +976,17 @@ gal2d_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
181 - gcsWL_VIV_BUFFER *vivBuffer = wl_resource_get_user_data(buffer->resource);
182 - gs->gco_Surface = vivBuffer->surface;
184 - buffer->width = vivBuffer->width;
185 - buffer->height = vivBuffer->height;
187 + gal2d_renderer_attach_egl(es, buffer);
191 surface_state_destroy(struct gal2d_surface_state *gs, struct gal2d_renderer *gr)
193 - wl_list_remove(&gs->surface_destroy_listener.link);
194 + if(gs->gco_Surface)
196 + gcoSURF_Destroy(gs->gco_Surface);
198 + wl_list_remove(&gs->surface_destroy_listener.link);
199 wl_list_remove(&gs->renderer_destroy_listener.link);
201 gs->surface->renderer_state = NULL;
202 @@ -1043,8 +1080,12 @@ gal2d_renderer_output_destroy(struct weston_output *output)
204 struct gal2d_output_state *go = get_output_state(output);
207 - if(go->nNumBuffers <= 1 )
209 + for (i = 0; i < 2; i++)
211 + pixman_region32_fini(&go->buffer_damage[i]);
213 + if(go->nNumBuffers <= 1 )
215 if(go->offscreenSurface)
216 gcmVERIFY_OK(gcoSURF_Destroy(go->offscreenSurface));
217 @@ -1107,8 +1148,8 @@ OnError:
221 -gal2d_renderer_output_create(struct weston_output *output, EGLNativeDisplayType display,
222 - EGLNativeWindowType window)
223 +gal2d_renderer_output_create(struct weston_output *output, NativeDisplayType display,
224 + NativeWindowType window)
227 struct gal2d_renderer *gr = get_renderer(output->compositor);
228 @@ -1174,6 +1215,9 @@ gal2d_renderer_output_create(struct weston_output *output, EGLNativeDisplayType
230 gal2d_flip_surface(output);
233 + for (i = 0; i < 2; i++)
234 + pixman_region32_init(&go->buffer_damage[i]);
237 /* Return the status. */
238 diff --git a/src/gal2d-renderer.h b/src/gal2d-renderer.h
239 index 3b89f73..1322a7d 100644
240 --- a/src/gal2d-renderer.h
241 +++ b/src/gal2d-renderer.h
243 #define __gal_2d_renderer_h_
245 #include "compositor.h"
249 +#include <HAL/gc_hal_eglplatform.h>
250 +typedef HALNativeDisplayType NativeDisplayType;
251 +typedef HALNativeWindowType NativeWindowType;
255 struct gal2d_renderer_interface {