OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "window_manager/gles/opengles_visitor.h" | 5 #include "window_manager/gles/opengles_visitor.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 #include <xcb/damage.h> | 8 #include <xcb/damage.h> |
9 | 9 |
10 #include <EGL/egl.h> | 10 #include <EGL/egl.h> |
(...skipping 15 matching lines...) Expand all Loading... |
26 // Work around broken eglext.h headers | 26 // Work around broken eglext.h headers |
27 #ifndef EGL_NO_IMAGE_KHR | 27 #ifndef EGL_NO_IMAGE_KHR |
28 #define EGL_NO_IMAGE_KHR (static_cast<EGLImageKHR>(0)) | 28 #define EGL_NO_IMAGE_KHR (static_cast<EGLImageKHR>(0)) |
29 #endif | 29 #endif |
30 #ifndef EGL_IMAGE_PRESERVED_KHR | 30 #ifndef EGL_IMAGE_PRESERVED_KHR |
31 #define EGL_IMAGE_PRESERVED_KHR 0x30D2 | 31 #define EGL_IMAGE_PRESERVED_KHR 0x30D2 |
32 #endif | 32 #endif |
33 | 33 |
34 namespace window_manager { | 34 namespace window_manager { |
35 | 35 |
| 36 // Base for rendering passes. |
| 37 class BasePass : virtual public RealCompositor::ActorVisitor { |
| 38 public: |
| 39 explicit BasePass(const OpenGlesDrawVisitor* gles_visitor) |
| 40 : gles_visitor_(gles_visitor) {} |
| 41 virtual ~BasePass() {} |
| 42 virtual void VisitActor(RealCompositor::Actor* actor) {} |
| 43 virtual void VisitContainer(RealCompositor::ContainerActor* actor) = 0; |
| 44 virtual void VisitTexturePixmap(RealCompositor::TexturePixmapActor* actor); |
| 45 virtual void VisitQuad(RealCompositor::QuadActor* actor) = 0; |
| 46 virtual void VisitImage(RealCompositor::ImageActor* actor) { |
| 47 VisitQuad(actor); |
| 48 } |
| 49 |
| 50 protected: |
| 51 const OpenGlesDrawVisitor* gles_visitor() const { return gles_visitor_; } |
| 52 |
| 53 private: |
| 54 const OpenGlesDrawVisitor* gles_visitor_; // Not owned. |
| 55 |
| 56 DISALLOW_COPY_AND_ASSIGN(BasePass); |
| 57 }; |
| 58 |
| 59 // Back to front pass with blending on. |
| 60 class TransparentPass : public BasePass { |
| 61 public: |
| 62 explicit TransparentPass(const OpenGlesDrawVisitor* gles_visitor) |
| 63 : BasePass(gles_visitor) {} |
| 64 virtual ~TransparentPass() {} |
| 65 virtual void VisitStage(RealCompositor::StageActor* actor); |
| 66 virtual void VisitContainer(RealCompositor::ContainerActor* actor); |
| 67 virtual void VisitQuad(RealCompositor::QuadActor* actor) { |
| 68 gles_visitor()->DrawQuad(actor, ancestor_opacity_); |
| 69 } |
| 70 |
| 71 private: |
| 72 // Cumulative opacity of the ancestors |
| 73 float ancestor_opacity_; |
| 74 |
| 75 DISALLOW_COPY_AND_ASSIGN(TransparentPass); |
| 76 }; |
| 77 |
| 78 // Front to back pass with blending off. |
| 79 class OpaquePass : public BasePass { |
| 80 public: |
| 81 explicit OpaquePass(const OpenGlesDrawVisitor* gles_visitor) |
| 82 : BasePass(gles_visitor) {} |
| 83 virtual ~OpaquePass() {} |
| 84 virtual void VisitContainer(RealCompositor::ContainerActor* actor); |
| 85 virtual void VisitQuad(RealCompositor::QuadActor* actor) { |
| 86 gles_visitor()->DrawQuad(actor, 1.f); |
| 87 } |
| 88 |
| 89 private: |
| 90 DISALLOW_COPY_AND_ASSIGN(OpaquePass); |
| 91 }; |
| 92 |
36 OpenGlesDrawVisitor::OpenGlesDrawVisitor(Gles2Interface* gl, | 93 OpenGlesDrawVisitor::OpenGlesDrawVisitor(Gles2Interface* gl, |
37 RealCompositor* compositor, | 94 RealCompositor* compositor, |
38 Compositor::StageActor* stage) | 95 Compositor::StageActor* stage) |
39 : gl_(gl), | 96 : gl_(gl), |
40 compositor_(compositor), | 97 compositor_(compositor), |
41 stage_(stage), | 98 stage_(stage), |
42 x_connection_(compositor_->x_conn()), | 99 x_connection_(compositor_->x_conn()), |
43 has_fullscreen_actor_(false) { | 100 has_fullscreen_actor_(false) { |
44 CHECK(gl_); | 101 CHECK(gl_); |
45 egl_display_ = gl_->egl_display(); | 102 egl_display_ = gl_->egl_display(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 gl_->GenBuffers(1, &vertex_buffer_object_); | 149 gl_->GenBuffers(1, &vertex_buffer_object_); |
93 CHECK(vertex_buffer_object_ > 0) << "VBO allocation failed."; | 150 CHECK(vertex_buffer_object_ > 0) << "VBO allocation failed."; |
94 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); | 151 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); |
95 static float kQuad[] = { | 152 static float kQuad[] = { |
96 0.f, 0.f, | 153 0.f, 0.f, |
97 0.f, 1.f, | 154 0.f, 1.f, |
98 1.f, 0.f, | 155 1.f, 0.f, |
99 1.f, 1.f, | 156 1.f, 1.f, |
100 }; | 157 }; |
101 gl_->BufferData(GL_ARRAY_BUFFER, sizeof(kQuad), kQuad, GL_STATIC_DRAW); | 158 gl_->BufferData(GL_ARRAY_BUFFER, sizeof(kQuad), kQuad, GL_STATIC_DRAW); |
| 159 |
| 160 // Unchanging state |
| 161 gl_->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| 162 gl_->Enable(GL_DEPTH_TEST); |
102 } | 163 } |
103 | 164 |
104 OpenGlesDrawVisitor::~OpenGlesDrawVisitor() { | 165 OpenGlesDrawVisitor::~OpenGlesDrawVisitor() { |
105 delete tex_color_shader_; | 166 delete tex_color_shader_; |
106 delete tex_shade_shader_; | 167 delete tex_shade_shader_; |
107 delete no_alpha_color_shader_; | 168 delete no_alpha_color_shader_; |
108 delete no_alpha_shade_shader_; | 169 delete no_alpha_shade_shader_; |
109 | 170 |
110 gl_->DeleteBuffers(1, &vertex_buffer_object_); | 171 gl_->DeleteBuffers(1, &vertex_buffer_object_); |
111 | 172 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 actor->unset_was_resized(); | 240 actor->unset_was_resized(); |
180 } | 241 } |
181 | 242 |
182 // No need to clear color buffer if something will cover up the screen. | 243 // No need to clear color buffer if something will cover up the screen. |
183 if (has_fullscreen_actor_) | 244 if (has_fullscreen_actor_) |
184 gl_->Clear(GL_DEPTH_BUFFER_BIT); | 245 gl_->Clear(GL_DEPTH_BUFFER_BIT); |
185 else | 246 else |
186 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 247 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
187 | 248 |
188 projection_ = actor->projection(); | 249 projection_ = actor->projection(); |
189 ancestor_opacity_ = actor->opacity(); | |
190 | 250 |
191 // Back to front rendering | 251 // Front to back opaque rendering pass |
192 // TODO: Switch to two pass Z-buffered rendering | 252 OpaquePass opaque_pass(this); |
193 gl_->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 253 actor->Accept(&opaque_pass); |
| 254 |
| 255 // Back to front rendering transparent pass |
194 gl_->Enable(GL_BLEND); | 256 gl_->Enable(GL_BLEND); |
195 | 257 gl_->DepthMask(GL_FALSE); |
196 // Back to front rendering | 258 TransparentPass transparent_pass(this); |
197 const RealCompositor::ActorVector children = actor->GetChildren(); | 259 actor->Accept(&transparent_pass); |
198 for (RealCompositor::ActorVector::const_reverse_iterator i = | 260 gl_->DepthMask(GL_TRUE); |
199 children.rbegin(); i != children.rend(); ++i) { | 261 gl_->Disable(GL_BLEND); |
200 (*i)->Accept(this); | |
201 } | |
202 | 262 |
203 gl_->EglSwapBuffers(egl_display_, egl_surface_); | 263 gl_->EglSwapBuffers(egl_display_, egl_surface_); |
204 } | 264 } |
205 | 265 |
206 void OpenGlesDrawVisitor::VisitTexturePixmap( | 266 void OpenGlesDrawVisitor::CreateTextureData( |
| 267 RealCompositor::TexturePixmapActor* actor) const { |
| 268 OpenGlesEglImageData image_data(gl_); |
| 269 |
| 270 if (!image_data.Bind(actor)) |
| 271 return; |
| 272 |
| 273 OpenGlesTextureData* texture = new OpenGlesTextureData(gl_); |
| 274 image_data.BindTexture(texture, !actor->pixmap_is_opaque()); |
| 275 actor->set_texture_data(texture); |
| 276 } |
| 277 |
| 278 void BasePass::VisitTexturePixmap( |
207 RealCompositor::TexturePixmapActor* actor) { | 279 RealCompositor::TexturePixmapActor* actor) { |
208 if (!actor->IsVisible()) | 280 if (!actor->IsVisible()) |
209 return; | 281 return; |
210 | 282 |
211 if (!actor->texture_data()) { | 283 if (!actor->texture_data()) |
212 OpenGlesEglImageData image_data(gl_); | 284 gles_visitor_->CreateTextureData(actor); |
213 | |
214 if (!image_data.Bind(actor)) | |
215 return; | |
216 | |
217 OpenGlesTextureData* texture = new OpenGlesTextureData(gl_); | |
218 image_data.BindTexture(texture, !actor->pixmap_is_opaque()); | |
219 actor->set_texture_data(texture); | |
220 } | |
221 | 285 |
222 VisitQuad(actor); | 286 VisitQuad(actor); |
223 } | 287 } |
224 | 288 |
225 void OpenGlesDrawVisitor::VisitQuad(RealCompositor::QuadActor* actor) { | 289 void TransparentPass::VisitStage(RealCompositor::StageActor* actor) { |
| 290 ancestor_opacity_ = actor->opacity(); |
| 291 VisitContainer(actor); |
| 292 } |
| 293 |
| 294 void OpenGlesDrawVisitor::DrawQuad(RealCompositor::QuadActor* actor, |
| 295 float ancestor_opacity) const { |
226 if (!actor->IsVisible()) | 296 if (!actor->IsVisible()) |
227 return; | 297 return; |
228 | 298 |
229 // This must live until after the draw call, so it's at the top level | 299 // This must live until after the draw call, so it's at the top level |
230 scoped_array<float> colors; | 300 GLfloat colors[4 * 4]; |
231 | 301 |
232 // mvp matrix | 302 // mvp matrix |
233 Matrix4 mvp = projection_ * actor->model_view(); | 303 Matrix4 mvp = projection_ * actor->model_view(); |
234 | 304 |
235 // texture | 305 // texture |
236 TextureData* texture_data = actor->texture_data(); | 306 TextureData* texture_data = actor->texture_data(); |
237 gl_->BindTexture(GL_TEXTURE_2D, | 307 gl_->BindTexture(GL_TEXTURE_2D, |
238 texture_data ? texture_data->texture() : 0); | 308 texture_data ? texture_data->texture() : 0); |
239 const bool texture_has_alpha = texture_data ? | 309 const bool texture_has_alpha = texture_data ? |
240 texture_data->has_alpha() : | 310 texture_data->has_alpha() : |
241 true; | 311 true; |
242 | 312 |
243 // shader | 313 // shader |
244 if (actor->dimmed_opacity_begin() == 0.f && | 314 if (actor->dimmed_opacity_begin() == 0.f && |
245 actor->dimmed_opacity_end() == 0.f) { | 315 actor->dimmed_opacity_end() == 0.f) { |
246 if (texture_has_alpha) { | 316 if (texture_has_alpha) { |
247 gl_->UseProgram(tex_color_shader_->program()); | 317 gl_->UseProgram(tex_color_shader_->program()); |
248 gl_->UniformMatrix4fv(tex_color_shader_->MvpLocation(), 1, GL_FALSE, | 318 gl_->UniformMatrix4fv(tex_color_shader_->MvpLocation(), 1, GL_FALSE, |
249 &mvp[0][0]); | 319 &mvp[0][0]); |
250 gl_->Uniform1i(tex_color_shader_->SamplerLocation(), 0); | 320 gl_->Uniform1i(tex_color_shader_->SamplerLocation(), 0); |
251 gl_->Uniform4f(tex_color_shader_->ColorLocation(), actor->color().red, | 321 gl_->Uniform4f(tex_color_shader_->ColorLocation(), actor->color().red, |
252 actor->color().green, actor->color().blue, | 322 actor->color().green, actor->color().blue, |
253 actor->opacity() * ancestor_opacity_); | 323 actor->opacity() * ancestor_opacity); |
254 | 324 |
255 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); | 325 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); |
256 gl_->VertexAttribPointer(tex_color_shader_->PosLocation(), | 326 gl_->VertexAttribPointer(tex_color_shader_->PosLocation(), |
257 2, GL_FLOAT, GL_FALSE, 0, 0); | 327 2, GL_FLOAT, GL_FALSE, 0, 0); |
258 gl_->VertexAttribPointer(tex_color_shader_->TexInLocation(), | 328 gl_->VertexAttribPointer(tex_color_shader_->TexInLocation(), |
259 2, GL_FLOAT, GL_FALSE, 0, 0); | 329 2, GL_FLOAT, GL_FALSE, 0, 0); |
260 tex_color_shader_->EnableVertexAttribs(); | 330 tex_color_shader_->EnableVertexAttribs(); |
261 } else { | 331 } else { |
262 gl_->UseProgram(no_alpha_color_shader_->program()); | 332 gl_->UseProgram(no_alpha_color_shader_->program()); |
263 gl_->UniformMatrix4fv(no_alpha_color_shader_->MvpLocation(), 1, GL_FALSE, | 333 gl_->UniformMatrix4fv(no_alpha_color_shader_->MvpLocation(), 1, GL_FALSE, |
264 &mvp[0][0]); | 334 &mvp[0][0]); |
265 gl_->Uniform1i(no_alpha_color_shader_->SamplerLocation(), 0); | 335 gl_->Uniform1i(no_alpha_color_shader_->SamplerLocation(), 0); |
266 gl_->Uniform4f(no_alpha_color_shader_->ColorLocation(), | 336 gl_->Uniform4f(no_alpha_color_shader_->ColorLocation(), |
267 actor->color().red, actor->color().green, | 337 actor->color().red, actor->color().green, |
268 actor->color().blue, | 338 actor->color().blue, |
269 actor->opacity() * ancestor_opacity_); | 339 actor->opacity() * ancestor_opacity); |
270 | 340 |
271 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); | 341 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); |
272 gl_->VertexAttribPointer(no_alpha_color_shader_->PosLocation(), | 342 gl_->VertexAttribPointer(no_alpha_color_shader_->PosLocation(), |
273 2, GL_FLOAT, GL_FALSE, 0, 0); | 343 2, GL_FLOAT, GL_FALSE, 0, 0); |
274 gl_->VertexAttribPointer(no_alpha_color_shader_->TexInLocation(), | 344 gl_->VertexAttribPointer(no_alpha_color_shader_->TexInLocation(), |
275 2, GL_FLOAT, GL_FALSE, 0, 0); | 345 2, GL_FLOAT, GL_FALSE, 0, 0); |
276 no_alpha_color_shader_->EnableVertexAttribs(); | 346 no_alpha_color_shader_->EnableVertexAttribs(); |
277 } | 347 } |
278 } else { | 348 } else { |
279 const float actor_opacity = actor->opacity() * ancestor_opacity_; | 349 const float actor_opacity = actor->opacity() * ancestor_opacity; |
280 const float dimmed_transparency_begin = 1.f - actor->dimmed_opacity_begin(); | 350 const float dimmed_transparency_begin = 1.f - actor->dimmed_opacity_begin(); |
281 const float dimmed_transparency_end = 1.f - actor->dimmed_opacity_end(); | 351 const float dimmed_transparency_end = 1.f - actor->dimmed_opacity_end(); |
282 | 352 |
283 // TODO: Consider managing a ring buffer in a VBO ourselves. Could be | 353 // TODO: Consider managing a ring buffer in a VBO ourselves. Could be |
284 // better performance depending on driver quality. | 354 // better performance depending on driver quality. |
285 colors_[ 0] = dimmed_transparency_begin * actor->color().red; | 355 colors[ 0] = dimmed_transparency_begin * actor->color().red; |
286 colors_[ 1] = dimmed_transparency_begin * actor->color().green; | 356 colors[ 1] = dimmed_transparency_begin * actor->color().green; |
287 colors_[ 2] = dimmed_transparency_begin * actor->color().blue; | 357 colors[ 2] = dimmed_transparency_begin * actor->color().blue; |
288 colors_[ 3] = actor_opacity; | 358 colors[ 3] = actor_opacity; |
289 | 359 |
290 colors_[ 4] = dimmed_transparency_begin * actor->color().red; | 360 colors[ 4] = dimmed_transparency_begin * actor->color().red; |
291 colors_[ 5] = dimmed_transparency_begin * actor->color().green; | 361 colors[ 5] = dimmed_transparency_begin * actor->color().green; |
292 colors_[ 6] = dimmed_transparency_begin * actor->color().blue; | 362 colors[ 6] = dimmed_transparency_begin * actor->color().blue; |
293 colors_[ 7] = actor_opacity; | 363 colors[ 7] = actor_opacity; |
294 | 364 |
295 colors_[ 8] = dimmed_transparency_end * actor->color().red; | 365 colors[ 8] = dimmed_transparency_end * actor->color().red; |
296 colors_[ 9] = dimmed_transparency_end * actor->color().green; | 366 colors[ 9] = dimmed_transparency_end * actor->color().green; |
297 colors_[10] = dimmed_transparency_end * actor->color().blue; | 367 colors[10] = dimmed_transparency_end * actor->color().blue; |
298 colors_[11] = actor_opacity; | 368 colors[11] = actor_opacity; |
299 | 369 |
300 colors_[12] = dimmed_transparency_end * actor->color().red; | 370 colors[12] = dimmed_transparency_end * actor->color().red; |
301 colors_[13] = dimmed_transparency_end * actor->color().green; | 371 colors[13] = dimmed_transparency_end * actor->color().green; |
302 colors_[14] = dimmed_transparency_end * actor->color().blue; | 372 colors[14] = dimmed_transparency_end * actor->color().blue; |
303 colors_[15] = actor_opacity; | 373 colors[15] = actor_opacity; |
304 | 374 |
305 if (texture_has_alpha) { | 375 if (texture_has_alpha) { |
306 gl_->UseProgram(tex_shade_shader_->program()); | 376 gl_->UseProgram(tex_shade_shader_->program()); |
307 gl_->UniformMatrix4fv(tex_shade_shader_->MvpLocation(), 1, GL_FALSE, | 377 gl_->UniformMatrix4fv(tex_shade_shader_->MvpLocation(), 1, GL_FALSE, |
308 &mvp[0][0]); | 378 &mvp[0][0]); |
309 gl_->Uniform1i(tex_shade_shader_->SamplerLocation(), 0); | 379 gl_->Uniform1i(tex_shade_shader_->SamplerLocation(), 0); |
310 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); | 380 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); |
311 gl_->VertexAttribPointer(tex_shade_shader_->PosLocation(), | 381 gl_->VertexAttribPointer(tex_shade_shader_->PosLocation(), |
312 2, GL_FLOAT, GL_FALSE, 0, 0); | 382 2, GL_FLOAT, GL_FALSE, 0, 0); |
313 gl_->VertexAttribPointer(tex_shade_shader_->TexInLocation(), | 383 gl_->VertexAttribPointer(tex_shade_shader_->TexInLocation(), |
314 2, GL_FLOAT, GL_FALSE, 0, 0); | 384 2, GL_FLOAT, GL_FALSE, 0, 0); |
315 gl_->BindBuffer(GL_ARRAY_BUFFER, 0); | 385 gl_->BindBuffer(GL_ARRAY_BUFFER, 0); |
316 gl_->VertexAttribPointer(tex_shade_shader_->ColorInLocation(), | 386 gl_->VertexAttribPointer(tex_shade_shader_->ColorInLocation(), |
317 4, GL_FLOAT, GL_FALSE, 0, colors_); | 387 4, GL_FLOAT, GL_FALSE, 0, colors); |
318 tex_shade_shader_->EnableVertexAttribs(); | 388 tex_shade_shader_->EnableVertexAttribs(); |
319 } else { | 389 } else { |
320 gl_->UseProgram(no_alpha_shade_shader_->program()); | 390 gl_->UseProgram(no_alpha_shade_shader_->program()); |
321 gl_->UniformMatrix4fv(no_alpha_shade_shader_->MvpLocation(), 1, GL_FALSE, | 391 gl_->UniformMatrix4fv(no_alpha_shade_shader_->MvpLocation(), 1, GL_FALSE, |
322 &mvp[0][0]); | 392 &mvp[0][0]); |
323 gl_->Uniform1i(no_alpha_shade_shader_->SamplerLocation(), 0); | 393 gl_->Uniform1i(no_alpha_shade_shader_->SamplerLocation(), 0); |
324 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); | 394 gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object_); |
325 gl_->VertexAttribPointer(no_alpha_shade_shader_->PosLocation(), | 395 gl_->VertexAttribPointer(no_alpha_shade_shader_->PosLocation(), |
326 2, GL_FLOAT, GL_FALSE, 0, 0); | 396 2, GL_FLOAT, GL_FALSE, 0, 0); |
327 gl_->VertexAttribPointer(no_alpha_shade_shader_->TexInLocation(), | 397 gl_->VertexAttribPointer(no_alpha_shade_shader_->TexInLocation(), |
328 2, GL_FLOAT, GL_FALSE, 0, 0); | 398 2, GL_FLOAT, GL_FALSE, 0, 0); |
329 gl_->BindBuffer(GL_ARRAY_BUFFER, 0); | 399 gl_->BindBuffer(GL_ARRAY_BUFFER, 0); |
330 gl_->VertexAttribPointer(no_alpha_shade_shader_->ColorInLocation(), | 400 gl_->VertexAttribPointer(no_alpha_shade_shader_->ColorInLocation(), |
331 4, GL_FLOAT, GL_FALSE, 0, colors_); | 401 4, GL_FLOAT, GL_FALSE, 0, colors); |
332 no_alpha_shade_shader_->EnableVertexAttribs(); | 402 no_alpha_shade_shader_->EnableVertexAttribs(); |
333 } | 403 } |
334 } | 404 } |
335 | 405 |
336 // Draw | 406 // Draw |
337 gl_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 407 gl_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
338 } | 408 } |
339 | 409 |
340 void OpenGlesDrawVisitor::VisitContainer( | 410 void TransparentPass::VisitContainer( |
341 RealCompositor::ContainerActor* actor) { | 411 RealCompositor::ContainerActor* actor) { |
342 if (!actor->IsVisible()) | 412 if (!actor->IsVisible()) |
343 return; | 413 return; |
344 | 414 |
345 LOG(INFO) << "Visit container: " << actor->name(); | 415 LOG(INFO) << "Visit container: " << actor->name(); |
346 | 416 |
347 const float original_opacity = ancestor_opacity_; | 417 const float original_opacity = ancestor_opacity_; |
348 ancestor_opacity_ *= actor->opacity(); | 418 ancestor_opacity_ *= actor->opacity(); |
349 | 419 |
350 // Back to front rendering | 420 // Back to front rendering |
351 const RealCompositor::ActorVector children = actor->GetChildren(); | 421 const RealCompositor::ActorVector children = actor->GetChildren(); |
352 for (RealCompositor::ActorVector::const_reverse_iterator i = | 422 for (RealCompositor::ActorVector::const_reverse_iterator i = |
353 children.rbegin(); i != children.rend(); ++i) { | 423 children.rbegin(); i != children.rend(); ++i) { |
354 (*i)->Accept(this); | 424 if (ancestor_opacity_ <= 0.999f || (*i)->has_children() || |
| 425 !(*i)->is_opaque()) |
| 426 (*i)->Accept(this); |
355 } | 427 } |
356 | 428 |
357 // Reset opacity. | 429 // Reset opacity. |
358 ancestor_opacity_ = original_opacity; | 430 ancestor_opacity_ = original_opacity; |
359 } | 431 } |
360 | 432 |
| 433 void OpaquePass::VisitContainer( |
| 434 RealCompositor::ContainerActor* actor) { |
| 435 if (!actor->IsVisible()) |
| 436 return; |
| 437 |
| 438 LOG(INFO) << "Visit container: " << actor->name(); |
| 439 |
| 440 // Front to back rendering |
| 441 const RealCompositor::ActorVector children = actor->GetChildren(); |
| 442 for (RealCompositor::ActorVector::const_iterator i = children.begin(); |
| 443 i != children.end(); ++i) { |
| 444 if ((*i)->is_opaque()) |
| 445 (*i)->Accept(this); |
| 446 } |
| 447 } |
| 448 |
361 OpenGlesTextureData::OpenGlesTextureData(Gles2Interface* gl) | 449 OpenGlesTextureData::OpenGlesTextureData(Gles2Interface* gl) |
362 : gl_(gl) {} | 450 : gl_(gl) {} |
363 | 451 |
364 OpenGlesTextureData::~OpenGlesTextureData() { | 452 OpenGlesTextureData::~OpenGlesTextureData() { |
365 gl_->DeleteTextures(1, texture_ptr()); | 453 gl_->DeleteTextures(1, texture_ptr()); |
366 } | 454 } |
367 | 455 |
368 void OpenGlesTextureData::SetTexture(GLuint texture) { | 456 void OpenGlesTextureData::SetTexture(GLuint texture) { |
369 gl_->DeleteTextures(1, texture_ptr()); | 457 gl_->DeleteTextures(1, texture_ptr()); |
370 set_texture(texture); | 458 set_texture(texture); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 507 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
420 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 508 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
421 gl_->EGLImageTargetTexture2DOES(GL_TEXTURE_2D, | 509 gl_->EGLImageTargetTexture2DOES(GL_TEXTURE_2D, |
422 static_cast<GLeglImageOES>(egl_image_)); | 510 static_cast<GLeglImageOES>(egl_image_)); |
423 | 511 |
424 texture_data->SetTexture(texture); | 512 texture_data->SetTexture(texture); |
425 texture_data->set_has_alpha(has_alpha); | 513 texture_data->set_has_alpha(has_alpha); |
426 } | 514 } |
427 | 515 |
428 } // namespace window_manager | 516 } // namespace window_manager |
OLD | NEW |