//
// 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.
//
// FramebufferAttachmentObjectImpl.h:
//   Common ancenstor for all implementations of FBO attachable-objects.
//   This means Surfaces, Textures and Renderbuffers.
//

#ifndef LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_
#define LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_

#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/Observer.h"

namespace rx
{

class FramebufferAttachmentObjectImpl : public angle::Subject
{
  public:
    FramebufferAttachmentObjectImpl() {}
    virtual ~FramebufferAttachmentObjectImpl() {}

    virtual gl::Error getAttachmentRenderTarget(const gl::Context *context,
                                                GLenum binding,
                                                const gl::ImageIndex &imageIndex,
                                                FramebufferAttachmentRenderTarget **rtOut);

    virtual gl::Error initializeContents(const gl::Context *context,
                                         const gl::ImageIndex &imageIndex);
};

inline gl::Error FramebufferAttachmentObjectImpl::getAttachmentRenderTarget(
    const gl::Context *context,
    GLenum binding,
    const gl::ImageIndex &imageIndex,
    FramebufferAttachmentRenderTarget **rtOut)
{
    UNIMPLEMENTED();
    return gl::OutOfMemory() << "getAttachmentRenderTarget not supported.";
}

inline gl::Error FramebufferAttachmentObjectImpl::initializeContents(
    const gl::Context *context,
    const gl::ImageIndex &imageIndex)
{
    UNIMPLEMENTED();
    return gl::OutOfMemory() << "initialize not supported.";
}

}  // namespace rx

#endif  // LIBANGLE_RENDERER_FRAMEBUFFER_ATTACHMENT_OBJECT_IMPL_H_
