OLD | NEW |
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 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
6 | 6 |
7 #include "content/common/gpu/image_transport_surface.h" | 7 #include "content/common/gpu/image_transport_surface.h" |
8 | 8 |
9 // This conflicts with the defines in Xlib.h and must come first. | 9 // This conflicts with the defines in Xlib.h and must come first. |
10 #include "content/common/gpu/gpu_messages.h" | 10 #include "content/common/gpu/gpu_messages.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 // gfx::GLSurface implementation | 82 // gfx::GLSurface implementation |
83 virtual bool Initialize() OVERRIDE; | 83 virtual bool Initialize() OVERRIDE; |
84 virtual void Destroy() OVERRIDE; | 84 virtual void Destroy() OVERRIDE; |
85 virtual bool IsOffscreen() OVERRIDE; | 85 virtual bool IsOffscreen() OVERRIDE; |
86 virtual bool SwapBuffers() OVERRIDE; | 86 virtual bool SwapBuffers() OVERRIDE; |
87 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; | 87 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; |
88 virtual std::string GetExtensions() OVERRIDE; | 88 virtual std::string GetExtensions() OVERRIDE; |
89 virtual gfx::Size GetSize() OVERRIDE; | 89 virtual gfx::Size GetSize() OVERRIDE; |
90 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; | 90 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; |
91 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; | 91 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; |
92 virtual void SetVisible(bool visible) OVERRIDE; | 92 virtual void SetResourceUsage(ResourceUsage resourceUsage) OVERRIDE; |
93 | 93 |
94 protected: | 94 protected: |
95 // ImageTransportSurface implementation | 95 // ImageTransportSurface implementation |
96 virtual void OnNewSurfaceACK( | 96 virtual void OnNewSurfaceACK( |
97 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; | 97 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; |
98 virtual void OnBuffersSwappedACK() OVERRIDE; | 98 virtual void OnBuffersSwappedACK() OVERRIDE; |
99 virtual void OnPostSubBufferACK() OVERRIDE; | 99 virtual void OnPostSubBufferACK() OVERRIDE; |
100 virtual void OnResizeViewACK() OVERRIDE; | 100 virtual void OnResizeViewACK() OVERRIDE; |
101 virtual void OnResize(gfx::Size size) OVERRIDE; | 101 virtual void OnResize(gfx::Size size) OVERRIDE; |
102 | 102 |
(...skipping 26 matching lines...) Expand all Loading... |
129 GpuCommandBufferStub* stub); | 129 GpuCommandBufferStub* stub); |
130 | 130 |
131 // gfx::GLSurface implementation: | 131 // gfx::GLSurface implementation: |
132 virtual bool Initialize() OVERRIDE; | 132 virtual bool Initialize() OVERRIDE; |
133 virtual void Destroy() OVERRIDE; | 133 virtual void Destroy() OVERRIDE; |
134 virtual bool SwapBuffers() OVERRIDE; | 134 virtual bool SwapBuffers() OVERRIDE; |
135 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; | 135 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; |
136 virtual std::string GetExtensions(); | 136 virtual std::string GetExtensions(); |
137 virtual gfx::Size GetSize() OVERRIDE; | 137 virtual gfx::Size GetSize() OVERRIDE; |
138 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; | 138 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; |
139 virtual void SetVisible(bool visible) OVERRIDE; | 139 virtual void SetResourceUsage(ResourceUsage resourceUsage) OVERRIDE; |
140 | 140 |
141 protected: | 141 protected: |
142 // ImageTransportSurface implementation: | 142 // ImageTransportSurface implementation: |
143 virtual void OnNewSurfaceACK( | 143 virtual void OnNewSurfaceACK( |
144 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; | 144 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; |
145 virtual void OnBuffersSwappedACK() OVERRIDE; | 145 virtual void OnBuffersSwappedACK() OVERRIDE; |
146 virtual void OnPostSubBufferACK() OVERRIDE; | 146 virtual void OnPostSubBufferACK() OVERRIDE; |
147 virtual void OnResizeViewACK() OVERRIDE; | 147 virtual void OnResizeViewACK() OVERRIDE; |
148 virtual void OnResize(gfx::Size size) OVERRIDE; | 148 virtual void OnResize(gfx::Size size) OVERRIDE; |
149 | 149 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 } | 311 } |
312 | 312 |
313 made_current_ = true; | 313 made_current_ = true; |
314 return true; | 314 return true; |
315 } | 315 } |
316 | 316 |
317 unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() { | 317 unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() { |
318 return fbo_id_; | 318 return fbo_id_; |
319 } | 319 } |
320 | 320 |
321 void EGLImageTransportSurface::SetVisible(bool visible) { | 321 void EGLImageTransportSurface::SetResourceUsage(ResourceUsage resourceUsage) { |
322 if (!visible && back_surface_.get() && front_surface_.get()) { | 322 switch (resourceUsage) { |
323 ReleaseSurface(&back_surface_); | 323 case RESOURCE_USAGE_FULL: |
324 } else if (visible && !back_surface_.get() && front_surface_.get()) { | 324 if (!back_surface_.get() && front_surface_.get()) { |
325 // Leverage the OnResize hook because it does exactly what we want | 325 // Leverage the OnResize hook because it does exactly what we want |
326 OnResize(front_surface_->size()); | 326 OnResize(front_surface_->size()); |
| 327 } |
| 328 break; |
| 329 case RESOURCE_USAGE_LESS: |
| 330 if (back_surface_.get() && front_surface_.get()) |
| 331 ReleaseSurface(&back_surface_); |
| 332 break; |
| 333 case RESOURCE_USAGE_NONE: |
| 334 // TODO(mmocny): drop all the buffers |
| 335 break; |
327 } | 336 } |
328 } | 337 } |
329 | 338 |
330 void EGLImageTransportSurface::ReleaseSurface( | 339 void EGLImageTransportSurface::ReleaseSurface( |
331 scoped_refptr<EGLAcceleratedSurface>* surface) { | 340 scoped_refptr<EGLAcceleratedSurface>* surface) { |
332 if (surface->get()) { | 341 if (surface->get()) { |
333 GpuHostMsg_AcceleratedSurfaceRelease_Params params; | 342 GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
334 params.identifier = (*surface)->pixmap(); | 343 params.identifier = (*surface)->pixmap(); |
335 helper_->SendAcceleratedSurfaceRelease(params); | 344 helper_->SendAcceleratedSurfaceRelease(params); |
336 *surface = NULL; | 345 *surface = NULL; |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 516 } |
508 | 517 |
509 void GLXImageTransportSurface::ReleaseSurface() { | 518 void GLXImageTransportSurface::ReleaseSurface() { |
510 DCHECK(bound_); | 519 DCHECK(bound_); |
511 GpuHostMsg_AcceleratedSurfaceRelease_Params params; | 520 GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
512 params.identifier = window_; | 521 params.identifier = window_; |
513 helper_->SendAcceleratedSurfaceRelease(params); | 522 helper_->SendAcceleratedSurfaceRelease(params); |
514 bound_ = false; | 523 bound_ = false; |
515 } | 524 } |
516 | 525 |
517 void GLXImageTransportSurface::SetVisible(bool visible) { | 526 void GLXImageTransportSurface::SetResourceUsage(ResourceUsage resourceUsage) { |
518 Display* dpy = static_cast<Display*>(GetDisplay()); | 527 Display* dpy = static_cast<Display*>(GetDisplay()); |
519 if (!visible) { | 528 switch (resourceUsage) { |
520 XResizeWindow(dpy, window_, 1, 1); | 529 case RESOURCE_USAGE_FULL: |
521 } else { | 530 XResizeWindow(dpy, window_, size_.width(), size_.height()); |
522 XResizeWindow(dpy, window_, size_.width(), size_.height()); | 531 needs_resize_ = true; |
523 needs_resize_ = true; | 532 break; |
| 533 case RESOURCE_USAGE_LESS: |
| 534 XResizeWindow(dpy, window_, 1, 1); |
| 535 break; |
| 536 case RESOURCE_USAGE_NONE: |
| 537 // TODO(mmocny): drop all the buffers |
| 538 break; |
524 } | 539 } |
525 glXWaitX(); | 540 glXWaitX(); |
526 } | 541 } |
527 | 542 |
528 void GLXImageTransportSurface::OnResize(gfx::Size size) { | 543 void GLXImageTransportSurface::OnResize(gfx::Size size) { |
529 TRACE_EVENT0("gpu", "GLXImageTransportSurface::OnResize"); | 544 TRACE_EVENT0("gpu", "GLXImageTransportSurface::OnResize"); |
530 size_ = size; | 545 size_ = size; |
531 | 546 |
532 Display* dpy = static_cast<Display*>(GetDisplay()); | 547 Display* dpy = static_cast<Display*>(GetDisplay()); |
533 XResizeWindow(dpy, window_, size_.width(), size_.height()); | 548 XResizeWindow(dpy, window_, size_.width(), size_.height()); |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 | 834 |
820 surface = new PassThroughImageTransportSurface(manager, stub, surface.get()); | 835 surface = new PassThroughImageTransportSurface(manager, stub, surface.get()); |
821 #endif | 836 #endif |
822 if (surface->Initialize()) | 837 if (surface->Initialize()) |
823 return surface; | 838 return surface; |
824 else | 839 else |
825 return NULL; | 840 return NULL; |
826 } | 841 } |
827 | 842 |
828 #endif // defined(USE_GPU) | 843 #endif // defined(USE_GPU) |
OLD | NEW |