xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/metal/RenderTargetMtl.mm (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1//
2// Copyright 2019 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// RenderTargetMtl.mm:
7//    Implements the class methods for RenderTargetMtl.
8//
9
10#include "libANGLE/renderer/metal/RenderTargetMtl.h"
11
12namespace rx
13{
14RenderTargetMtl::RenderTargetMtl() {}
15
16RenderTargetMtl::~RenderTargetMtl()
17{
18    reset();
19}
20
21void RenderTargetMtl::set(const mtl::TextureRef &texture,
22                          const mtl::MipmapNativeLevel &level,
23                          uint32_t layer,
24                          const mtl::Format &format)
25{
26    setWithImplicitMSTexture(texture, nullptr, level, layer, format);
27}
28
29void RenderTargetMtl::setWithImplicitMSTexture(const mtl::TextureRef &texture,
30                                               const mtl::TextureRef &implicitMSTexture,
31                                               const mtl::MipmapNativeLevel &level,
32                                               uint32_t layer,
33                                               const mtl::Format &format)
34{
35    mTexture           = texture;
36    mImplicitMSTexture = implicitMSTexture;
37    mLevelIndex        = level;
38    mLayerIndex        = layer;
39    mFormat            = format;
40}
41
42void RenderTargetMtl::setTexture(const mtl::TextureRef &texture)
43{
44    mTexture = texture;
45}
46
47void RenderTargetMtl::setImplicitMSTexture(const mtl::TextureRef &implicitMSTexture)
48{
49    mImplicitMSTexture = implicitMSTexture;
50}
51
52void RenderTargetMtl::duplicateFrom(const RenderTargetMtl &src)
53{
54    setWithImplicitMSTexture(src.getTexture(), src.getImplicitMSTexture(), src.getLevelIndex(),
55                             src.getLayerIndex(), src.getFormat());
56}
57
58void RenderTargetMtl::reset()
59{
60    mTexture.reset();
61    mImplicitMSTexture.reset();
62    mLevelIndex = mtl::kZeroNativeMipLevel;
63    mLayerIndex = 0;
64    mFormat     = mtl::Format();
65}
66
67uint32_t RenderTargetMtl::getRenderSamples() const
68{
69    mtl::TextureRef implicitMSTex = getImplicitMSTexture();
70    mtl::TextureRef tex           = getTexture();
71    return implicitMSTex ? implicitMSTex->samples() : (tex ? tex->samples() : 1);
72}
73
74void RenderTargetMtl::toRenderPassAttachmentDesc(mtl::RenderPassAttachmentDesc *rpaDescOut) const
75{
76    rpaDescOut->texture           = mTexture.lock();
77    rpaDescOut->implicitMSTexture = mImplicitMSTexture.lock();
78    rpaDescOut->level             = mLevelIndex;
79    rpaDescOut->sliceOrDepth      = mLayerIndex;
80    rpaDescOut->blendable         = mFormat.getCaps().blendable;
81}
82}  // namespace rx
83