//
// Copyright 2019 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.
//
// RenderTargetMtl.h:
//    Defines the class interface for RenderTargetMtl.
//

#ifndef LIBANGLE_RENDERER_METAL_RENDERTARGETMTL_H_
#define LIBANGLE_RENDERER_METAL_RENDERTARGETMTL_H_

#import <Metal/Metal.h>

#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/renderer/metal/mtl_format_utils.h"
#include "libANGLE/renderer/metal/mtl_resources.h"
#include "libANGLE/renderer/metal/mtl_state_cache.h"

namespace rx
{

// This is a very light-weight class that does not own to the resources it points to.
// It's meant only to copy across some information from a FramebufferAttachment to the
// business rendering logic.
class RenderTargetMtl final : public FramebufferAttachmentRenderTarget
{
  public:
    RenderTargetMtl();
    ~RenderTargetMtl() override;

    // Used in std::vector initialization.
    RenderTargetMtl(RenderTargetMtl &&other);

    void set(const mtl::TextureRef &texture,
             const mtl::MipmapNativeLevel &level,
             uint32_t layer,
             const mtl::Format &format);
    void setWithImplicitMSTexture(const mtl::TextureRef &texture,
                                  const mtl::TextureRef &implicitMSTexture,
                                  const mtl::MipmapNativeLevel &level,
                                  uint32_t layer,
                                  const mtl::Format &format);
    void setTexture(const mtl::TextureRef &texture);
    void setImplicitMSTexture(const mtl::TextureRef &implicitMSTexture);
    void duplicateFrom(const RenderTargetMtl &src);
    void reset();

    mtl::TextureRef getTexture() const { return mTexture.lock(); }
    mtl::TextureRef getImplicitMSTexture() const { return mImplicitMSTexture.lock(); }
    const mtl::MipmapNativeLevel &getLevelIndex() const { return mLevelIndex; }
    uint32_t getLayerIndex() const { return mLayerIndex; }
    uint32_t getRenderSamples() const;
    const mtl::Format *getFormat() const { return mFormat; }

    void toRenderPassAttachmentDesc(mtl::RenderPassAttachmentDesc *rpaDescOut) const;

  private:
    mtl::TextureWeakRef mTexture;
    mtl::TextureWeakRef mImplicitMSTexture;
    mtl::MipmapNativeLevel mLevelIndex = mtl::kZeroNativeMipLevel;
    uint32_t mLayerIndex               = 0;
    const mtl::Format *mFormat         = nullptr;
};
}  // namespace rx

#endif /* LIBANGLE_RENDERER_METAL_RENDERTARGETMTL_H */
