]> code.ossystems Code Review - meta-freescale.git/blob
65554d34a1b727108f7480f519094f40c6a31bcb
[meta-freescale.git] /
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
5  to run wayland apps.
6 Organization: O.S. Systems Software LTDA.
7
8 Fixed blending for shadown and maintained separate surface for damage composite.
9
10 Upstream Status: N/A
11
12 Signed-off-by: Prabhu Sundararaj <prabhu.sundararaj@freescale.com>
13 Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
14 ---
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(-)
19
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 {
25         int use_pixman;
26         int use_gal2d;
27         struct wl_listener session_listener;
28 -       EGLNativeDisplayType display;
29 +       NativeDisplayType display;
30  };
31  
32  struct fbdev_screeninfo {
33 @@ -91,8 +91,8 @@ struct fbdev_output {
34         void *shadow_buf;
35         uint8_t depth;
36  
37 -       EGLNativeDisplayType display;
38 -       EGLNativeWindowType  window;
39 +       NativeDisplayType display;
40 +       NativeWindowType  window;
41  };
42  
43  struct fbdev_parameters {
44 @@ -667,7 +667,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
45                         return 0;
46                 }
47                 if (gl_renderer->output_create(&output->base,
48 -                                               (EGLNativeWindowType)output->window,
49 +                                               (NativeWindowType)output->window,
50                                                 gl_renderer->opaque_attribs,
51                                                 NULL) < 0) {
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 {
58         
59         int current_buffer;
60         pixman_region32_t buffer_damage[2];
61 -       EGLNativeDisplayType display;
62 +       NativeDisplayType display;
63      gcoSURF* renderSurf;
64         gctUINT32 nNumBuffers;
65         int activebuffer;
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;
70 -       gctUINT64 node = 0;
71 -       gctUINT bytes;
72 -
73 -       gcmVERIFY_OK(gcoSURF_QueryVidMemNode(surface, &node,
74 -                                               &pool, &bytes));
75 +    
76 +       gcmVERIFY_OK(gcoSURF_QueryVidMemNode(surface, gcvNULL,
77 +                                               &pool, gcvNULL));
78  
79         if(pool != gcvPOOL_USER)
80         {
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);
84  
85 +    struct gal2d_renderer *gr = get_renderer(ec);
86 +    
87         if (pixman_region32_not_empty(&ev->surface->opaque)) {
88  
89                 repaint_region(ev, output, go, &repaint, &ev->surface->opaque);
90         }
91  
92         if (pixman_region32_not_empty(&surface_blend)) {
93 -        struct gal2d_renderer *gr = get_renderer(ec);
94 -        
95 +    
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);
107              
108                 repaint_region(ev, output, go, &repaint, &surface_blend);
109         }
110  
111 +    gco2D_DisableAlphaBlend(gr->gcoEngine2d);
112         pixman_region32_fini(&surface_blend);
113  
114  out:
115 @@ -866,6 +866,48 @@ gal2d_renderer_repaint_output(struct weston_output *output,
116  }
117  
118  static void
119 +gal2d_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer)
120 +{
121 +    gcsWL_VIV_BUFFER *vivBuffer = wl_resource_get_user_data(buffer->resource);
122 +    gctUINT width = 0;
123 +    gctUINT height = 0;
124 +    gctINT stride = 0;
125 +    gceSURF_FORMAT format;
126 +    gcoSURF srcSurf = vivBuffer->surface;
127 +    gctUINT32 physical;
128 +    gctPOINTER va =0;
129 +    gceSTATUS status = gcvSTATUS_OK;
130 +    struct gal2d_surface_state *gs = get_surface_state(es);
131 +        
132 +    if(gs->gco_Surface == gcvNULL)
133 +    {
134 +        /** Construct a wrapper. */
135 +        gcmONERROR(gcoSURF_ConstructWrapper(gcvNULL, &gs->gco_Surface));
136 +    }
137 +
138 +    gcmONERROR(gcoSURF_GetAlignedSize(srcSurf, &width, &height, &stride));
139 +    gcmONERROR(gcoSURF_GetFormat(srcSurf, gcvNULL, &format));
140 +    gcmONERROR(gcoSURF_Lock(srcSurf, &physical, (gctPOINTER *)&va));  
141 +
142 +    /* Set the buffer. */
143 +    gcmONERROR(gcoSURF_SetBuffer(gs->gco_Surface,
144 +                               gcvSURF_BITMAP_NO_VIDMEM,
145 +                               format,
146 +                               stride,
147 +                               (gctPOINTER) va,
148 +                               (gctUINT32) physical));
149 +
150 +    /* Set the window. */
151 +    gcmONERROR(gcoSURF_SetWindow(gs->gco_Surface, 0, 0, width, height));
152 +    
153 +    buffer->width = vivBuffer->width;
154 +    buffer->height = vivBuffer->height;
155 +    
156 +  OnError:
157 +    galONERROR(status);
158 +}
159 +
160 +static void
161  gal2d_renderer_flush_damage(struct weston_surface *surface)
162  {
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);
166         }
167         else
168 -       {
169 -               gcsWL_VIV_BUFFER *vivBuffer = (gcsWL_VIV_BUFFER *)buffer;
170 -               gs->gco_Surface = vivBuffer->surface;
171 -       }
172 +        gal2d_renderer_attach_egl(surface, buffer);
173  
174  done:
175         pixman_region32_fini(&gs->texture_damage);
176 @@ -937,19 +976,17 @@ gal2d_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
177                 }
178         }
179         else
180 -       {
181 -               gcsWL_VIV_BUFFER *vivBuffer = wl_resource_get_user_data(buffer->resource);
182 -               gs->gco_Surface = vivBuffer->surface;
183 -
184 -               buffer->width = vivBuffer->width;
185 -               buffer->height = vivBuffer->height;
186 -       }
187 +               gal2d_renderer_attach_egl(es, buffer);
188  }
189  
190  static void
191  surface_state_destroy(struct gal2d_surface_state *gs, struct gal2d_renderer *gr)
192  {
193 -       wl_list_remove(&gs->surface_destroy_listener.link);
194 +       if(gs->gco_Surface)
195 +    {
196 +        gcoSURF_Destroy(gs->gco_Surface);
197 +    }
198 +    wl_list_remove(&gs->surface_destroy_listener.link);
199         wl_list_remove(&gs->renderer_destroy_listener.link);
200         if(gs->surface)
201                 gs->surface->renderer_state = NULL;
202 @@ -1043,8 +1080,12 @@ gal2d_renderer_output_destroy(struct weston_output *output)
203  {
204      struct gal2d_output_state *go = get_output_state(output);
205      gctUINT32 i;
206 -    
207 -       if(go->nNumBuffers <= 1 )
208 +
209 +    for (i = 0; i < 2; i++)
210 +    {
211 +        pixman_region32_fini(&go->buffer_damage[i]);
212 +    }
213 +    if(go->nNumBuffers <= 1 )
214         {
215                 if(go->offscreenSurface)
216                         gcmVERIFY_OK(gcoSURF_Destroy(go->offscreenSurface));
217 @@ -1107,8 +1148,8 @@ OnError:
218  }
219  
220  static int
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)
225  
226   {
227      struct gal2d_renderer *gr = get_renderer(output->compositor);
228 @@ -1174,6 +1215,9 @@ gal2d_renderer_output_create(struct weston_output *output, EGLNativeDisplayType
229                 gal2d_clear(output);
230                 gal2d_flip_surface(output);
231         }
232 +
233 +       for (i = 0; i < 2; i++)
234 +               pixman_region32_init(&go->buffer_damage[i]);
235  OnError:
236      galONERROR(status);
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
242 @@ -24,7 +24,13 @@
243  #define __gal_2d_renderer_h_
244  
245  #include  "compositor.h"
246 +#ifdef ENABLE_EGL
247  #include <EGL/egl.h>
248 +#else
249 +#include <HAL/gc_hal_eglplatform.h>
250 +typedef HALNativeDisplayType NativeDisplayType;
251 +typedef HALNativeWindowType  NativeWindowType;
252 +#endif
253  
254  
255  struct gal2d_renderer_interface {
256 -- 
257 2.1.4
258