Chromium Code Reviews| Index: blimp/client/core/render_widget/blimp_render_widget.cc |
| diff --git a/blimp/client/core/render_widget/blimp_render_widget.cc b/blimp/client/core/render_widget/blimp_render_widget.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..861b94e28ef8a429282a735ed8e02db218e2ea8b |
| --- /dev/null |
| +++ b/blimp/client/core/render_widget/blimp_render_widget.cc |
| @@ -0,0 +1,153 @@ |
| +// Copyright 2016 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 "blimp/client/core/render_widget/blimp_render_widget.h" |
| + |
| +#include "base/logging.h" |
| +#include "blimp/client/core/compositor/blob_image_serialization_processor.h" |
| +#include "blimp/client/core/compositor/compositor_deps_provider.h" |
| +#include "blimp/client/core/render_widget/blimp_render_widget_delegate.h" |
| +#include "cc/proto/compositor_message.pb.h" |
| + |
| +namespace blimp { |
| +namespace client { |
| + |
| +BlimpRenderWidget::BlimpRenderWidget( |
| + int32_t render_widget_id, |
| + CompositorDepsProvider* compositor_deps_provider, |
| + BlimpRenderWidgetDelegate* delegate) |
| + : render_widget_id_(render_widget_id), |
| + compositor_deps_provider_(compositor_deps_provider), |
| + delegate_(delegate) { |
| + DCHECK(delegate_); |
| + |
| + compositor_ = base::MakeUnique<BlimpCompositor>( |
| + compositor_deps_provider->GetTaskGraphRunner(), |
| + compositor_deps_provider_->GetGpuMemoryBufferManager(), |
| + BlobImageSerializationProcessor::current(), |
| + compositor_deps_provider_->GetLayerTreeSettings(), |
| + compositor_deps_provider_->GetCompositorTaskRunner(), this); |
| + |
| + if (compositor_deps_provider_->use_direct_rendering()) |
|
nyquist
2016/08/12 07:34:28
curlies throughout this file
Khushal
2016/08/13 00:03:22
Done.
|
| + direct_rendering_deps_ = base::MakeUnique<DirectRenderingDeps>(this); |
| +} |
| + |
| +BlimpRenderWidget::~BlimpRenderWidget() {} |
| + |
| +BlimpRenderWidget::DirectRenderingDeps::DirectRenderingDeps( |
| + BlimpRenderWidget* render_widget) |
| + : render_widget_(render_widget), |
| + window_(gfx::kNullAcceleratedWidget), |
| + visible_(false), |
| + output_surface_request_pending_(false) { |
| + DCHECK(render_widget_); |
| +} |
| + |
| +BlimpRenderWidget::DirectRenderingDeps::~DirectRenderingDeps() {} |
| + |
| +void BlimpRenderWidget::DirectRenderingDeps::SetAcceleratedWidget( |
| + gfx::AcceleratedWidget widget) { |
| + if (widget == gfx::kNullAcceleratedWidget && |
| + window_ == gfx::kNullAcceleratedWidget) |
| + return; |
|
nyquist
2016/08/12 07:34:28
braces
Khushal
2016/08/13 00:03:22
Done.
|
| + |
| + // If we did not have a widget, the compositor should not be visible. |
| + DCHECK(window_ != gfx::kNullAcceleratedWidget || |
| + !render_widget_->compositor_->IsVisible()); |
| + |
| + // Release any references to the old widget. |
| + UpdateVisibility(false); |
| + |
| + window_ = widget; |
| + UpdateVisibility(visible_ && window_ != gfx::kNullAcceleratedWidget); |
| +} |
| + |
| +void BlimpRenderWidget::DirectRenderingDeps::SetVisible(bool visible) { |
| + visible_ = visible; |
| + UpdateVisibility(visible_ && window_ != gfx::kNullAcceleratedWidget); |
| +} |
| + |
| +void BlimpRenderWidget::DirectRenderingDeps::RequestOutputSurface() { |
| + DCHECK(!output_surface_request_pending_); |
| + output_surface_request_pending_ = true; |
| + HandlePendingOutputSurfaceRequest(); |
| +} |
| + |
| +void BlimpRenderWidget::DirectRenderingDeps:: |
| + HandlePendingOutputSurfaceRequest() { |
| + if (!output_surface_request_pending_) |
| + return; |
| + |
| + render_widget_->compositor_->SetOutputSurface( |
| + render_widget_->compositor_deps_provider_ |
| + ->CreateDirectRenderingOutputSurface(window_)); |
| + |
| + output_surface_request_pending_ = false; |
| +} |
| + |
| +void BlimpRenderWidget::DirectRenderingDeps::UpdateVisibility(bool visible) { |
| + if (visible) { |
| + render_widget_->compositor_->SetVisible(true); |
| + HandlePendingOutputSurfaceRequest(); |
| + } else { |
| + render_widget_->compositor_->SetVisible(false); |
| + render_widget_->compositor_->ReleaseOutputSurface(); |
| + } |
| +} |
| + |
| +int32_t BlimpRenderWidget::GetId() const { |
| + return render_widget_id_; |
| +} |
| + |
| +void BlimpRenderWidget::SetAcceleratedWidget(gfx::AcceleratedWidget widget) { |
| + DCHECK(direct_rendering_deps_); |
| + direct_rendering_deps_->SetAcceleratedWidget(widget); |
| +} |
| + |
| +void BlimpRenderWidget::SetVisible(bool visible) { |
| + if (direct_rendering_deps_) |
| + direct_rendering_deps_->SetVisible(visible); |
| + else |
| + compositor_->SetVisible(visible); |
| +} |
| + |
| +// Move to the BlimpRenderWidgetView. |
| +bool BlimpRenderWidget::OnTouchEvent(const ui::MotionEvent& motion_event) { |
| + if (compositor_->input_manager()) |
| + return compositor_->input_manager()->OnTouchEvent(motion_event); |
| + return false; |
| +} |
| + |
| +void BlimpRenderWidget::OnCompositorMessageReceived( |
| + std::unique_ptr<cc::proto::CompositorMessage> message) { |
| + compositor_->OnCompositorMessageReceived(std::move(message)); |
| +} |
| + |
| +void BlimpRenderWidget::DidCompleteSwapBuffers() { |
| + delegate_->CompositorDidCompleteSwapBuffers(); |
| +} |
| + |
| +void BlimpRenderWidget::DidCommitAndDrawFrame() { |
| + // BlimpStats::GetInstance()->Add(BlimpStats::EventType::COMMIT, 1); |
| +} |
| + |
| +void BlimpRenderWidget::SendWebGestureEvent( |
| + const blink::WebGestureEvent& gesture_event) { |
| + delegate_->SendWebGestureEvent(this, gesture_event); |
| +} |
| + |
| +void BlimpRenderWidget::SendCompositorMessage( |
| + const cc::proto::CompositorMessage& message) { |
| + delegate_->SendCompositorMessage(this, message); |
| +} |
| + |
| +void BlimpRenderWidget::RequestOutputSurface() { |
| + if (direct_rendering_deps_) |
| + direct_rendering_deps_->RequestOutputSurface(); |
| + |
| + // TODO(khushalsagar): Add support for delegated rendering. |
| +} |
| + |
| +} // namespace client |
| +} // namespace blimp |