//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// SurfaceEGL.h: common interface for EGL surfaces

#ifndef LIBANGLE_RENDERER_GL_EGL_SURFACEEGL_H_
#define LIBANGLE_RENDERER_GL_EGL_SURFACEEGL_H_

#include <EGL/egl.h>

#include "libANGLE/renderer/gl/SurfaceGL.h"
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"

namespace rx
{

class SurfaceEGL : public SurfaceGL
{
  public:
    SurfaceEGL(const egl::SurfaceState &state, const FunctionsEGL *egl, EGLConfig config);
    ~SurfaceEGL() override;

    egl::Error makeCurrent(const gl::Context *context) override;
    egl::Error swap(const gl::Context *context) override;
    egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects) override;
    egl::Error postSubBuffer(const gl::Context *context,
                             EGLint x,
                             EGLint y,
                             EGLint width,
                             EGLint height) override;
    egl::Error setPresentationTime(EGLnsecsANDROID time) override;
    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
    egl::Error bindTexImage(const gl::Context *context,
                            gl::Texture *texture,
                            EGLint buffer) override;
    egl::Error releaseTexImage(const gl::Context *context, EGLint buffer) override;
    void setSwapInterval(EGLint interval) override;
    EGLint getWidth() const override;
    EGLint getHeight() const override;
    EGLint isPostSubBufferSupported() const override;
    EGLint getSwapBehavior() const override;

    void setTimestampsEnabled(bool enabled) override;
    egl::SupportedCompositorTimings getSupportedCompositorTimings() const override;
    egl::Error getCompositorTiming(EGLint numTimestamps,
                                   const EGLint *names,
                                   EGLnsecsANDROID *values) const override;
    egl::Error getNextFrameId(EGLuint64KHR *frameId) const override;
    egl::SupportedTimestamps getSupportedTimestamps() const override;
    egl::Error getFrameTimestamps(EGLuint64KHR frameId,
                                  EGLint numTimestamps,
                                  const EGLint *timestamps,
                                  EGLnsecsANDROID *values) const override;

    EGLSurface getSurface() const;

  protected:
    const FunctionsEGL *mEGL;
    EGLConfig mConfig;
    EGLSurface mSurface;

  private:
    bool mHasSwapBuffersWithDamage;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_GL_EGL_SURFACEEGL_H_
