// 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 MOJO_SKIA_GANESH_CONTEXT_H_
#define MOJO_SKIA_GANESH_CONTEXT_H_

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "mojo/gpu/gl_context.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/gpu/GrContext.h"

namespace mojo {
namespace skia {

// Binds a Ganesh rendering context to a GL context.
//
// Instances of this object is not thread-safe and must be used on the
// same thread as the GL context was created on.
class GaneshContext : public base::RefCounted<GaneshContext>,
                      private GLContext::Observer {
 public:
  // RAII style helper for executing code within a Ganesh environment.
  //
  // Note that Ganesh assumes that it owns the state of the GL Context
  // for the duration while the scope is active.  Take care not to perform
  // any significant low-level GL operations while in the Ganesh scope
  // which might disrupt what Ganesh is doing!
  //
  // Recursively entering the scope of a particular GaneshContext is not
  // allowed.
  class Scope {
   public:
    // Upon entry to the scope, makes the GL context active and resets
    // the Ganesh context state.
    //
    // This operation is not allowed if |GaneshContext::is_lost()| is true.
    explicit Scope(const scoped_refptr<GaneshContext>& ganesh_context);

    // Upon exit from the scope, flushes the Ganesh context state and
    // reactivates the prior GL context.
    ~Scope();

    // Gets the underlying Ganesh context, never null.
    const scoped_refptr<GaneshContext>& ganesh_context() const {
      return ganesh_context_;
    }

    // Gets the underlying Ganesh rendering context, never null.
    const ::skia::RefPtr<GrContext>& gr_context() const {
      return ganesh_context_->gr_context_;
    }

    // Gets the underlying GL context scope.
    //
    // Be careful when manipulating the GL context from within a Ganesh
    // scope since the Ganesh renderer caches GL state.  Queries are safe
    // but operations which modify the state of the GL context, such as binding
    // textures, should be followed by a call to |GrContext::resetContext|
    // before performing other Ganesh related actions within the scope.
    const GLContext::Scope& gl_scope() const { return gl_scope_; }

   private:
    scoped_refptr<GaneshContext> ganesh_context_;
    GLContext::Scope gl_scope_;

    DISALLOW_COPY_AND_ASSIGN(Scope);
  };

  // Creates a Ganesh context bound to the specified GL context.
  explicit GaneshContext(const scoped_refptr<GLContext>& gl_context);

  // Gets the underlying GL context, never null.
  const scoped_refptr<GLContext>& gl_context() const { return gl_context_; }

  // Returns true if the GL context was lost.
  bool is_lost() const { return gl_context_->is_lost(); }

 private:
  friend class base::RefCounted<GaneshContext>;

  ~GaneshContext() override;
  void OnContextLost() override;

  const scoped_refptr<GLContext> gl_context_;
  ::skia::RefPtr<GrContext> gr_context_;
  bool scope_entered_ = false;

  DISALLOW_COPY_AND_ASSIGN(GaneshContext);
};

}  // namespace skia
}  // namespace mojo

#endif  // MOJO_SKIA_GANESH_CONTEXT_H_
