// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_
#define COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_

#include <EGL/egl.h>

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread.h"

namespace cobalt {
namespace renderer {
namespace backend {

class TextureData;
class RawTextureMemory;

// The ResourceContext class encapsulates a GL context and a private thread
// upon which that GL context is always current.  The GL context is associated
// with a dummy surface.  The GL context will be shared with all other contexts
// created by the GraphicsSystem that owns this ResourceContext.  This class
// is useful when one wishes to create and allocate pixel buffer data (e.g. for
// a texture) from any thread, that can later be converted to a texture for
// a specific grpahics context.  Resource management GL operations can be
// performed (from any thread) by calling the method
// RunSynchronouslyWithinResourceContext() and passing a function which one
// wishes to run under the resource management GL context.
class ResourceContext {
 public:
  ResourceContext(EGLDisplay display, EGLConfig config);
  ~ResourceContext();

  EGLContext context() const { return context_; }

  // This method can be used to execute a function on the resource context
  // thread, under which it can be assumed that the resource context is
  // current.
  void RunSynchronouslyWithinResourceContext(const base::Closure& function);

  // When called, asserts that the current thread is the resource context
  // thread, which is the only thread which has the resource context current.
  void AssertWithinResourceContext();

 private:
  // Called once upon construction on the resource context thread.
  void MakeCurrent();

  // Releases the current context from the resource context thread, and then
  // destroys the resource context (and dummy surface).  This is intended to
  // be called from the destructor.
  void ShutdownOnResourceThread();

  EGLDisplay display_;

  // The EGL/OpenGL ES context hosted by this GraphicsContextEGL object.
  EGLContext context_;
  EGLConfig config_;

  // Since this context will be used only for resource management, it will
  // not need an output surface associated with it.  We create a dummy surface
  // to satisfy EGL requirements.
  EGLSurface null_surface_;

  // A private thread on which all resource management GL operations can be
  // performed.  The resource context will always be current on this thread.
  base::Thread thread_;

  friend class ScopedMakeCurrent;
};

}  // namespace backend
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_
