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

// ImageEGL.h: Defines the rx::ImageEGL class, the EGL implementation of EGL images

#ifndef LIBANGLE_RENDERER_GL_EGL_IMAGEEGL_H_
#define LIBANGLE_RENDERER_GL_EGL_IMAGEEGL_H_

#include "libANGLE/renderer/gl/ImageGL.h"

namespace egl
{
class AttributeMap;
}

namespace rx
{

class FunctionsEGL;

class ImageEGL final : public ImageGL
{
  public:
    ImageEGL(const egl::ImageState &state,
             const gl::Context *context,
             EGLenum target,
             const egl::AttributeMap &attribs,
             const FunctionsEGL *egl);
    ~ImageEGL() override;

    egl::Error initialize(const egl::Display *display) override;

    angle::Result orphan(const gl::Context *context, egl::ImageSibling *sibling) override;

    angle::Result setTexture2D(const gl::Context *context,
                               gl::TextureType type,
                               TextureGL *texture,
                               GLenum *outInternalFormat) override;
    angle::Result setRenderbufferStorage(const gl::Context *context,
                                         RenderbufferGL *renderbuffer,
                                         GLenum *outInternalFormat) override;

  private:
    const FunctionsEGL *mEGL;

    // State needed for initialization
    EGLContext mContext;
    EGLenum mTarget;
    bool mPreserveImage;

    GLenum mNativeInternalFormat;

    std::shared_ptr<EGLImage> mImage;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_GL_EGL_IMAGEEGL_H_
