| 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..8584df12164e280f646e3ece273a91383da67082
|
| --- /dev/null
|
| +++ b/blimp/client/core/render_widget/blimp_render_widget.cc
|
| @@ -0,0 +1,171 @@
|
| +// 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 "blimp/net/blimp_stats.h"
|
| +#include "cc/proto/compositor_message.pb.h"
|
| +
|
| +namespace blimp {
|
| +namespace client {
|
| +
|
| +class BlimpRenderWidget::DirectRenderingDeps {
|
| + public:
|
| + explicit DirectRenderingDeps(BlimpRenderWidget* render_widget)
|
| + : render_widget_(render_widget),
|
| + window_(gfx::kNullAcceleratedWidget),
|
| + visible_(false),
|
| + output_surface_request_pending_(false) {
|
| + DCHECK(render_widget_);
|
| + }
|
| +
|
| + ~DirectRenderingDeps() = default;
|
| +
|
| + void SetAcceleratedWidget(gfx::AcceleratedWidget widget) {
|
| + if (widget == gfx::kNullAcceleratedWidget &&
|
| + window_ == gfx::kNullAcceleratedWidget) {
|
| + return;
|
| + }
|
| +
|
| + // 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 SetVisible(bool visible) {
|
| + visible_ = visible;
|
| + UpdateVisibility(visible_ && window_ != gfx::kNullAcceleratedWidget);
|
| + }
|
| +
|
| + void RequestOutputSurface() {
|
| + DCHECK(!output_surface_request_pending_);
|
| + output_surface_request_pending_ = true;
|
| + HandlePendingOutputSurfaceRequest();
|
| + }
|
| +
|
| + private:
|
| + void HandlePendingOutputSurfaceRequest() {
|
| + if (!output_surface_request_pending_) {
|
| + return;
|
| + }
|
| +
|
| + render_widget_->compositor_->SetOutputSurface(
|
| + render_widget_->compositor_deps_provider_->CreateDelegatedOutputSurface(
|
| + window_));
|
| +
|
| + output_surface_request_pending_ = false;
|
| + }
|
| +
|
| + void UpdateVisibility(bool visible) {
|
| + if (visible) {
|
| + render_widget_->compositor_->SetVisible(true);
|
| + HandlePendingOutputSurfaceRequest();
|
| + } else {
|
| + render_widget_->compositor_->SetVisible(false);
|
| + render_widget_->compositor_->ReleaseOutputSurface();
|
| + }
|
| + }
|
| +
|
| + BlimpRenderWidget* render_widget_;
|
| +
|
| + gfx::AcceleratedWidget window_;
|
| + bool visible_;
|
| +
|
| + // Whether there is an OutputSurface request pending from the current
|
| + // compositor. Becomes |true| if RequestOutputSurface is called, and |false|
|
| + // if compositor is deleted or we succeed in creating an OutputSurface.
|
| + bool output_surface_request_pending_;
|
| +};
|
| +
|
| +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_internal_display()) {
|
| + direct_rendering_deps_ = base::MakeUnique<DirectRenderingDeps>(this);
|
| + }
|
| +}
|
| +
|
| +BlimpRenderWidget::~BlimpRenderWidget() {}
|
| +
|
| +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
|
|
|