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 21RenderTargetMtl::RenderTargetMtl(RenderTargetMtl &&other) 22 : mTexture(std::move(other.mTexture)), 23 mImplicitMSTexture(std::move(other.mImplicitMSTexture)), 24 mLevelIndex(other.mLevelIndex), 25 mLayerIndex(other.mLayerIndex) 26{} 27 28void RenderTargetMtl::set(const mtl::TextureRef &texture, 29 const mtl::MipmapNativeLevel &level, 30 uint32_t layer, 31 const mtl::Format &format) 32{ 33 setWithImplicitMSTexture(texture, nullptr, level, layer, format); 34} 35 36void RenderTargetMtl::setWithImplicitMSTexture(const mtl::TextureRef &texture, 37 const mtl::TextureRef &implicitMSTexture, 38 const mtl::MipmapNativeLevel &level, 39 uint32_t layer, 40 const mtl::Format &format) 41{ 42 mTexture = texture; 43 mImplicitMSTexture = implicitMSTexture; 44 mLevelIndex = level; 45 mLayerIndex = layer; 46 mFormat = &format; 47} 48 49void RenderTargetMtl::setTexture(const mtl::TextureRef &texture) 50{ 51 mTexture = texture; 52} 53 54void RenderTargetMtl::setImplicitMSTexture(const mtl::TextureRef &implicitMSTexture) 55{ 56 mImplicitMSTexture = implicitMSTexture; 57} 58 59void RenderTargetMtl::duplicateFrom(const RenderTargetMtl &src) 60{ 61 setWithImplicitMSTexture(src.getTexture(), src.getImplicitMSTexture(), src.getLevelIndex(), 62 src.getLayerIndex(), *src.getFormat()); 63} 64 65void RenderTargetMtl::reset() 66{ 67 mTexture.reset(); 68 mImplicitMSTexture.reset(); 69 mLevelIndex = mtl::kZeroNativeMipLevel; 70 mLayerIndex = 0; 71 mFormat = nullptr; 72} 73 74uint32_t RenderTargetMtl::getRenderSamples() const 75{ 76 mtl::TextureRef implicitMSTex = getImplicitMSTexture(); 77 mtl::TextureRef tex = getTexture(); 78 return implicitMSTex ? implicitMSTex->samples() : (tex ? tex->samples() : 1); 79} 80void RenderTargetMtl::toRenderPassAttachmentDesc(mtl::RenderPassAttachmentDesc *rpaDescOut) const 81{ 82 rpaDescOut->texture = mTexture.lock(); 83 rpaDescOut->implicitMSTexture = mImplicitMSTexture.lock(); 84 rpaDescOut->level = mLevelIndex; 85 rpaDescOut->sliceOrDepth = mLayerIndex; 86 rpaDescOut->blendable = mFormat ? mFormat->getCaps().blendable : false; 87} 88} 89