Index: trunk/src/content/browser/compositor/reflector_impl.cc |
=================================================================== |
--- trunk/src/content/browser/compositor/reflector_impl.cc (revision 245194) |
+++ trunk/src/content/browser/compositor/reflector_impl.cc (working copy) |
@@ -1,182 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/compositor/reflector_impl.h" |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "content/browser/compositor/browser_compositor_output_surface.h" |
-#include "content/common/gpu/client/gl_helper.h" |
-#include "ui/compositor/layer.h" |
- |
-namespace content { |
- |
-ReflectorImpl::ReflectorImpl( |
- ui::Compositor* mirrored_compositor, |
- ui::Layer* mirroring_layer, |
- IDMap<BrowserCompositorOutputSurface>* output_surface_map, |
- int surface_id) |
- : texture_id_(0), |
- texture_size_(mirrored_compositor->size()), |
- output_surface_map_(output_surface_map), |
- mirrored_compositor_(mirrored_compositor), |
- mirroring_compositor_(mirroring_layer->GetCompositor()), |
- mirroring_layer_(mirroring_layer), |
- impl_message_loop_(ui::Compositor::GetCompositorMessageLoop()), |
- main_message_loop_(base::MessageLoopProxy::current()), |
- surface_id_(surface_id) { |
- CreateSharedTexture(); |
- impl_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::InitOnImplThread, this)); |
-} |
- |
-void ReflectorImpl::InitOnImplThread() { |
- // Ignore if the reflector was shutdown before |
- // initialized, or it's already initialized. |
- if (!output_surface_map_ || gl_helper_.get()) |
- return; |
- |
- BrowserCompositorOutputSurface* source_surface = |
- output_surface_map_->Lookup(surface_id_); |
- // Skip if the source surface isn't ready yet. This will be |
- // initiailze when the source surface becomes ready. |
- if (!source_surface) |
- return; |
- |
- AttachToOutputSurface(source_surface); |
- gl_helper_->CopyTextureFullImage(texture_id_, texture_size_); |
- // The shared texture doesn't have the data, so invokes full redraw |
- // now. |
- main_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::FullRedrawContentOnMainThread, |
- scoped_refptr<ReflectorImpl>(this))); |
-} |
- |
-void ReflectorImpl::OnSourceSurfaceReady(int surface_id) { |
- DCHECK_EQ(surface_id_, surface_id); |
- InitOnImplThread(); |
-} |
- |
-void ReflectorImpl::Shutdown() { |
- mirroring_compositor_ = NULL; |
- mirroring_layer_ = NULL; |
- shared_texture_ = NULL; |
- impl_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::ShutdownOnImplThread, this)); |
-} |
- |
-void ReflectorImpl::ShutdownOnImplThread() { |
- BrowserCompositorOutputSurface* output_surface = |
- output_surface_map_->Lookup(surface_id_); |
- if (output_surface) |
- output_surface->SetReflector(NULL); |
- output_surface_map_ = NULL; |
- gl_helper_.reset(); |
- // The instance must be deleted on main thread. |
- main_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::DeleteOnMainThread, |
- scoped_refptr<ReflectorImpl>(this))); |
-} |
- |
-// This must be called on ImplThread, or before the surface is passed to |
-// ImplThread. |
-void ReflectorImpl::AttachToOutputSurface( |
- BrowserCompositorOutputSurface* output_surface) { |
- gl_helper_.reset( |
- new GLHelper(output_surface->context_provider()->ContextGL(), |
- output_surface->context_provider()->ContextSupport())); |
- output_surface->SetReflector(this); |
-} |
- |
-void ReflectorImpl::OnMirroringCompositorResized() { |
- mirroring_compositor_->ScheduleFullRedraw(); |
-} |
- |
-void ReflectorImpl::OnLostResources() { |
- shared_texture_ = NULL; |
- mirroring_layer_->SetShowPaintedContent(); |
-} |
- |
-void ReflectorImpl::OnReshape(gfx::Size size) { |
- if (texture_size_ == size) |
- return; |
- texture_size_ = size; |
- DCHECK(texture_id_); |
- gl_helper_->ResizeTexture(texture_id_, size); |
- main_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::UpdateTextureSizeOnMainThread, |
- this->AsWeakPtr(), |
- texture_size_)); |
-} |
- |
-void ReflectorImpl::OnSwapBuffers() { |
- DCHECK(texture_id_); |
- gl_helper_->CopyTextureFullImage(texture_id_, texture_size_); |
- main_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::FullRedrawOnMainThread, |
- this->AsWeakPtr(), |
- texture_size_)); |
-} |
- |
-void ReflectorImpl::OnPostSubBuffer(gfx::Rect rect) { |
- DCHECK(texture_id_); |
- gl_helper_->CopyTextureSubImage(texture_id_, rect); |
- main_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&ReflectorImpl::UpdateSubBufferOnMainThread, |
- this->AsWeakPtr(), |
- texture_size_, |
- rect)); |
-} |
- |
-void ReflectorImpl::CreateSharedTexture() { |
- texture_id_ = |
- ImageTransportFactory::GetInstance()->GetGLHelper()->CreateTexture(); |
- shared_texture_ = |
- ImageTransportFactory::GetInstance()->CreateOwnedTexture( |
- texture_size_, 1.0f, texture_id_); |
- mirroring_layer_->SetExternalTexture(shared_texture_.get()); |
-} |
- |
-ReflectorImpl::~ReflectorImpl() { |
- // Make sure the reflector is deleted on main thread. |
- DCHECK_EQ(main_message_loop_.get(), |
- base::MessageLoopProxy::current().get()); |
-} |
- |
-void ReflectorImpl::UpdateTextureSizeOnMainThread(gfx::Size size) { |
- if (!mirroring_layer_) |
- return; |
- mirroring_layer_->SetBounds(gfx::Rect(size)); |
-} |
- |
-void ReflectorImpl::FullRedrawOnMainThread(gfx::Size size) { |
- if (!mirroring_compositor_) |
- return; |
- UpdateTextureSizeOnMainThread(size); |
- mirroring_compositor_->ScheduleFullRedraw(); |
-} |
- |
-void ReflectorImpl::UpdateSubBufferOnMainThread(gfx::Size size, |
- gfx::Rect rect) { |
- if (!mirroring_compositor_) |
- return; |
- UpdateTextureSizeOnMainThread(size); |
- // Flip the coordinates to compositor's one. |
- int y = size.height() - rect.y() - rect.height(); |
- gfx::Rect new_rect(rect.x(), y, rect.width(), rect.height()); |
- mirroring_layer_->SchedulePaint(new_rect); |
-} |
- |
-void ReflectorImpl::FullRedrawContentOnMainThread() { |
- mirrored_compositor_->ScheduleFullRedraw(); |
-} |
- |
-} // namespace content |