// Copyright 2015 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 "services/native_viewport/onscreen_context_provider.h"

#include "services/gles2/command_buffer_driver.h"
#include "services/gles2/gpu_state.h"

namespace native_viewport {

OnscreenContextProvider::OnscreenContextProvider(
    const scoped_refptr<gles2::GpuState>& state)
    : requested_configuration_(gfx::SurfaceConfiguration()),
      command_buffer_impl_(nullptr),
      state_(state),
      widget_(gfx::kNullAcceleratedWidget),
      binding_(this) {
}

OnscreenContextProvider::~OnscreenContextProvider() {
  if (command_buffer_impl_)
    command_buffer_impl_->set_observer(nullptr);
}

void OnscreenContextProvider::Bind(
    mojo::InterfaceRequest<mojo::ContextProvider> request) {
  binding_.Bind(request.Pass());
}

void OnscreenContextProvider::SetAcceleratedWidget(
    gfx::AcceleratedWidget widget) {
  widget_ = widget;

  if (widget_ == gfx::kNullAcceleratedWidget) {
    if (command_buffer_impl_) {
      command_buffer_impl_->DidLoseContext();
    }
    return;
  }

  if (pending_create_callback_.is_null())
    return;

  CreateAndReturnCommandBuffer();
}

void OnscreenContextProvider::Create(
    mojo::InterfaceHandle<mojo::ViewportParameterListener>
        viewport_parameter_listener,
    const CreateCallback& callback) {
  if (!pending_create_callback_.is_null()) {
    DCHECK(!command_buffer_impl_);
    pending_create_callback_.Run(nullptr);
  }

  pending_listener_ = mojo::ViewportParameterListenerPtr::Create(
      std::move(viewport_parameter_listener));
  pending_create_callback_ = callback;

  if (widget_ != gfx::kNullAcceleratedWidget)
    CreateAndReturnCommandBuffer();
}

void OnscreenContextProvider::OnCommandBufferImplDestroyed() {
  DCHECK(command_buffer_impl_);
  command_buffer_impl_ = nullptr;
}

void OnscreenContextProvider::CreateAndReturnCommandBuffer() {
  mojo::CommandBufferPtr cb;
  command_buffer_impl_ = new gles2::CommandBufferImpl(
      GetProxy(&cb), pending_listener_.Pass(), state_->control_task_runner(),
      state_->sync_point_manager(),
      make_scoped_ptr(new gles2::CommandBufferDriver(
          widget_, state_->share_group(), state_->mailbox_manager(),
          state_->sync_point_manager(), requested_configuration_)));
  command_buffer_impl_->set_observer(this);
  pending_create_callback_.Run(cb.Pass());
  pending_create_callback_.reset();
}

}  // namespace mojo
