Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: content/common/gpu/image_transport_surface_linux.cc

Issue 9564008: Aura: PostSubBuffer implementation for --ui-use-gpu-process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: "" Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium 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 "content/common/gpu/image_transport_surface.h" 5 #include "content/common/gpu/image_transport_surface.h"
6 6
7 // This conflicts with the defines in Xlib.h and must come first. 7 // This conflicts with the defines in Xlib.h and must come first.
8 #include "content/common/gpu/gpu_messages.h" 8 #include "content/common/gpu/gpu_messages.h"
9 9
10 #include <map> 10 #include <map>
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 virtual void OnBuffersSwappedACK() OVERRIDE; 102 virtual void OnBuffersSwappedACK() OVERRIDE;
103 virtual void OnPostSubBufferACK() OVERRIDE; 103 virtual void OnPostSubBufferACK() OVERRIDE;
104 virtual void OnResizeViewACK() OVERRIDE; 104 virtual void OnResizeViewACK() OVERRIDE;
105 virtual void OnResize(gfx::Size size) OVERRIDE; 105 virtual void OnResize(gfx::Size size) OVERRIDE;
106 106
107 private: 107 private:
108 virtual ~EGLImageTransportSurface() OVERRIDE; 108 virtual ~EGLImageTransportSurface() OVERRIDE;
109 void ReleaseSurface(scoped_refptr<EGLAcceleratedSurface>* surface); 109 void ReleaseSurface(scoped_refptr<EGLAcceleratedSurface>* surface);
110 void SendBuffersSwapped(); 110 void SendBuffersSwapped();
111 void SendPostSubBuffer(int x, int y, int width, int height); 111 void SendPostSubBuffer(int x, int y, int width, int height);
112 void GetRegionsToCopy(const gfx::Rect& new_damage_rect,
113 std::vector<gfx::Rect>* regions);
114 112
115 // Tracks the current surface visibility state. 113 // Tracks the current surface visibility state.
116 VisibilityState visibility_state_; 114 VisibilityState visibility_state_;
117 115
118 uint32 fbo_id_; 116 uint32 fbo_id_;
119 117
120 scoped_refptr<EGLAcceleratedSurface> back_surface_; 118 scoped_refptr<EGLAcceleratedSurface> back_surface_;
121 scoped_refptr<EGLAcceleratedSurface> front_surface_; 119 scoped_refptr<EGLAcceleratedSurface> front_surface_;
122 gfx::Rect previous_damage_rect_; 120 gfx::Rect previous_damage_rect_;
123 121
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 int x, int y, int width, int height) { 427 int x, int y, int width, int height) {
430 428
431 DCHECK_NE(back_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL)); 429 DCHECK_NE(back_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL));
432 gfx::Size expected_size = back_surface_->size(); 430 gfx::Size expected_size = back_surface_->size();
433 bool surfaces_same_size = front_surface_.get() && 431 bool surfaces_same_size = front_surface_.get() &&
434 front_surface_->size() == expected_size; 432 front_surface_->size() == expected_size;
435 433
436 const gfx::Rect new_damage_rect = gfx::Rect(x, y, width, height); 434 const gfx::Rect new_damage_rect = gfx::Rect(x, y, width, height);
437 if (surfaces_same_size) { 435 if (surfaces_same_size) {
438 std::vector<gfx::Rect> regions_to_copy; 436 std::vector<gfx::Rect> regions_to_copy;
439 GetRegionsToCopy(new_damage_rect, &regions_to_copy); 437 GetRegionsToCopy(previous_damage_rect_, new_damage_rect, &regions_to_copy);
440 438
441 GLint previous_texture_id = 0; 439 GLint previous_texture_id = 0;
442 glGetIntegerv(GL_ACTIVE_TEXTURE, &previous_texture_id); 440 glGetIntegerv(GL_ACTIVE_TEXTURE, &previous_texture_id);
443 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 441 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
444 GL_COLOR_ATTACHMENT0, 442 GL_COLOR_ATTACHMENT0,
445 GL_TEXTURE_2D, 443 GL_TEXTURE_2D,
446 front_surface_->texture(), 444 front_surface_->texture(),
447 0); 445 0);
448 glBindTexture(GL_TEXTURE_2D, back_surface_->texture()); 446 glBindTexture(GL_TEXTURE_2D, back_surface_->texture());
449 447
(...skipping 30 matching lines...) Expand all
480 params.surface_handle = front_surface_->pixmap(); 478 params.surface_handle = front_surface_->pixmap();
481 params.x = x; 479 params.x = x;
482 params.y = y; 480 params.y = y;
483 params.width = width; 481 params.width = width;
484 params.height = height; 482 params.height = height;
485 483
486 helper_->SendAcceleratedSurfacePostSubBuffer(params); 484 helper_->SendAcceleratedSurfacePostSubBuffer(params);
487 helper_->SetScheduled(false); 485 helper_->SetScheduled(false);
488 } 486 }
489 487
490 void EGLImageTransportSurface::GetRegionsToCopy(
491 const gfx::Rect& new_damage_rect,
492 std::vector<gfx::Rect>* regions) {
493 DCHECK(front_surface_->size() == back_surface_->size());
494 gfx::Rect intersection = previous_damage_rect_.Intersect(new_damage_rect);
495
496 if (intersection.IsEmpty()) {
497 regions->push_back(previous_damage_rect_);
498 return;
499 }
500
501 // Top (above the intersection).
502 regions->push_back(gfx::Rect(previous_damage_rect_.x(),
503 previous_damage_rect_.y(),
504 previous_damage_rect_.width(),
505 intersection.y() - previous_damage_rect_.y()));
506
507 // Left (of the intersection).
508 regions->push_back(gfx::Rect(previous_damage_rect_.x(),
509 intersection.y(),
510 intersection.x() - previous_damage_rect_.x(),
511 intersection.height()));
512
513 // Right (of the intersection).
514 regions->push_back(gfx::Rect(intersection.right(),
515 intersection.y(),
516 previous_damage_rect_.right() - intersection.right(),
517 intersection.height()));
518
519 // Bottom (below the intersection).
520 regions->push_back(gfx::Rect(previous_damage_rect_.x(),
521 intersection.bottom(),
522 previous_damage_rect_.width(),
523 previous_damage_rect_.bottom() - intersection.bottom()));
524 }
525
526 std::string EGLImageTransportSurface::GetExtensions() { 488 std::string EGLImageTransportSurface::GetExtensions() {
527 std::string extensions = gfx::GLSurface::GetExtensions(); 489 std::string extensions = gfx::GLSurface::GetExtensions();
528 extensions += extensions.empty() ? "" : " "; 490 extensions += extensions.empty() ? "" : " ";
529 extensions += "GL_CHROMIUM_front_buffer_cached "; 491 extensions += "GL_CHROMIUM_front_buffer_cached ";
530 extensions += "GL_CHROMIUM_post_sub_buffer"; 492 extensions += "GL_CHROMIUM_post_sub_buffer";
531 return extensions; 493 return extensions;
532 } 494 }
533 495
534 gfx::Size EGLImageTransportSurface::GetSize() { 496 gfx::Size EGLImageTransportSurface::GetSize() {
535 return back_surface_->size(); 497 return back_surface_->size();
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 stub, 933 stub,
972 surface.get(), 934 surface.get(),
973 handle.transport); 935 handle.transport);
974 } 936 }
975 937
976 if (surface->Initialize()) 938 if (surface->Initialize())
977 return surface; 939 return surface;
978 else 940 else
979 return NULL; 941 return NULL;
980 } 942 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698