// 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.

#ifndef ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
#define ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_

#include "android_webview/browser/parent_compositor_draw_constraints.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/synchronization/lock.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_ack.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/vector2d.h"

namespace cc {
class CompositorFrameAck;
}

namespace gpu {
class GLInProcessContext;
}

namespace android_webview {

class BrowserViewRendererClient;
class InsideHardwareReleaseReset;

// Set by BrowserViewRenderer and read by HardwareRenderer.
struct DrawGLInput {
  gfx::Vector2d scroll_offset;
  int width;
  int height;
  cc::CompositorFrame frame;

  DrawGLInput();
  ~DrawGLInput();
};

// This class is used to pass data between UI thread and RenderThread.
class SharedRendererState {
 public:
  SharedRendererState(scoped_refptr<base::MessageLoopProxy> ui_loop,
                      BrowserViewRendererClient* client);
  ~SharedRendererState();

  bool CurrentlyOnUIThread();
  void ClientRequestDrawGL();

  void SetDrawGLInput(scoped_ptr<DrawGLInput> input);
  scoped_ptr<DrawGLInput> PassDrawGLInput();

  bool IsInsideHardwareRelease() const;
  void PostExternalDrawConstraintsToChildCompositor(
      const ParentCompositorDrawConstraints& parent_draw_constraints);

  const ParentCompositorDrawConstraints ParentDrawConstraints() const;

  void SetSharedContext(gpu::GLInProcessContext* context);
  gpu::GLInProcessContext* GetSharedContext() const;

  void InsertReturnedResources(const cc::ReturnedResourceArray& resources);
  void SwapReturnedResources(cc::ReturnedResourceArray* resources);
  bool ReturnedResourcesEmpty() const;

 private:
  friend class InsideHardwareReleaseReset;

  void ClientRequestDrawGLOnUIThread();
  void UpdateParentDrawConstraintsOnUIThread();
  void SetInsideHardwareRelease(bool inside);

  scoped_refptr<base::MessageLoopProxy> ui_loop_;
  BrowserViewRendererClient* client_on_ui_;
  base::WeakPtrFactory<SharedRendererState> weak_factory_on_ui_thread_;
  base::WeakPtr<SharedRendererState> ui_thread_weak_ptr_;

  // Accessed by both UI and RT thread.
  mutable base::Lock lock_;
  scoped_ptr<DrawGLInput> draw_gl_input_;
  bool inside_hardware_release_;
  ParentCompositorDrawConstraints parent_draw_constraints_;
  gpu::GLInProcessContext* share_context_;
  cc::ReturnedResourceArray returned_resources_;

  DISALLOW_COPY_AND_ASSIGN(SharedRendererState);
};

class InsideHardwareReleaseReset {
 public:
  explicit InsideHardwareReleaseReset(
      SharedRendererState* shared_renderer_state);
  ~InsideHardwareReleaseReset();

 private:
  SharedRendererState* shared_renderer_state_;

  DISALLOW_COPY_AND_ASSIGN(InsideHardwareReleaseReset);
};

}  // namespace android_webview

#endif  // ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
