//
// Copyright (c) 2015 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.
//

// Image.h: Defines the egl::Image class representing the EGLimage object.

#ifndef LIBANGLE_IMAGE_H_
#define LIBANGLE_IMAGE_H_

#include "common/angleutils.h"
#include "libANGLE/AttributeMap.h"
#include "libANGLE/Error.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/RefCountObject.h"
#include "libANGLE/formatutils.h"

#include <set>

namespace rx
{
class EGLImplFactory;
class ImageImpl;
}

namespace egl
{
class Image;

// Only currently Renderbuffers and Textures can be bound with images. This makes the relationship
// explicit, and also ensures that an image sibling can determine if it's been initialized or not,
// which is important for the robust resource init extension with Textures and EGLImages.
class ImageSibling : public RefCountObject, public gl::FramebufferAttachmentObject
{
  public:
    ImageSibling(GLuint id);
    virtual ~ImageSibling();

  protected:
    // Set the image target of this sibling
    void setTargetImage(egl::Image *imageTarget);

    // Orphan all EGL image sources and targets
    gl::Error orphanImages();

  private:
    friend class Image;

    // Called from Image only to add a new source image
    void addImageSource(egl::Image *imageSource);

    // Called from Image only to remove a source image when the Image is being deleted
    void removeImageSource(egl::Image *imageSource);

    std::set<Image *> mSourcesOf;
    BindingPointer<Image> mTargetOf;
};

struct ImageState : private angle::NonCopyable
{
    ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap &attribs);

    gl::ImageIndex imageIndex;
    BindingPointer<ImageSibling> source;
    std::set<ImageSibling *> targets;
};

class Image final : public RefCountObject
{
  public:
    Image(rx::EGLImplFactory *factory,
          EGLenum target,
          ImageSibling *buffer,
          const AttributeMap &attribs);
    ~Image();

    const gl::Format &getFormat() const;
    size_t getWidth() const;
    size_t getHeight() const;
    size_t getSamples() const;

    Error initialize();

    rx::ImageImpl *getImplementation() const;

  private:
    friend class ImageSibling;

    // Called from ImageSibling only notify the image that a new target sibling exists for state
    // tracking.
    void addTargetSibling(ImageSibling *sibling);

    // Called from ImageSibling only to notify the image that a sibling (source or target) has
    // been respecified and state tracking should be updated.
    gl::Error orphanSibling(ImageSibling *sibling);

    ImageState mState;
    rx::ImageImpl *mImplementation;
};
}  // namespace egl

#endif  // LIBANGLE_IMAGE_H_
