/*
 * Copyright 2015 The Cobalt Authors. 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 GLIMP_EGL_DISPLAY_H_
#define GLIMP_EGL_DISPLAY_H_

#include <set>

#include "glimp/egl/config.h"
#include "glimp/egl/display_impl.h"
#include "glimp/gles/context.h"
#include "nb/scoped_ptr.h"

namespace glimp {
namespace egl {

// Encapsulates the concept of an EGL display.  There is usually only one of
// these per process, and it represents the entire graphics system.  It is
// the highest level object, and the "factory" responsible for generating
// graphics contexts.  It is a platform-independent object that wraps a
// platform-dependent DisplayImpl object which must be injected into the Display
// upon construction.
class Display {
 public:
  static void RepeatSubmitDoneDuringSuspend();
  static bool repeat_submit_done_during_suspend;

  // In order to create a display, it must have a platform-specific
  // implementation injected into it, where many methods will forward to.
  explicit Display(nb::scoped_ptr<DisplayImpl> display_impl);
  ~Display();

  void GetVersionInfo(EGLint* major, EGLint* minor);

  bool ChooseConfig(const EGLint* attrib_list,
                    EGLConfig* configs,
                    EGLint config_size,
                    EGLint* num_config);
  bool ConfigIsValid(EGLConfig config);

  EGLSurface CreateWindowSurface(EGLConfig config,
                                 EGLNativeWindowType win,
                                 const EGLint* attrib_list);
  EGLSurface CreatePbufferSurface(EGLConfig config, const EGLint* attrib_list);

  bool SurfaceIsValid(EGLSurface surface);
  bool DestroySurface(EGLSurface surface);

  EGLContext CreateContext(EGLConfig config,
                           EGLContext share_context,
                           const EGLint* attrib_list);
  bool ContextIsValid(EGLContext context);
  bool DestroyContext(EGLContext ctx);

  bool MakeCurrent(EGLSurface draw, EGLSurface read, EGLContext ctx);
  bool SwapBuffers(EGLSurface surface);
  bool SwapInterval(EGLint interval);

  DisplayImpl* impl() const { return impl_.get(); }

 private:
  nb::scoped_ptr<DisplayImpl> impl_;

  // Keeps track of all created but not destroyed surfaces.
  std::set<Surface*> active_surfaces_;

  // Keeps track of all created but not destroyed contexts.
  std::set<gles::Context*> active_contexts_;
};

}  // namespace egl
}  // namespace glimp

#endif  // GLIMP_EGL_DISPLAY_H_
