1/* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#ifndef GrMtlRenderTarget_DEFINED 9#define GrMtlRenderTarget_DEFINED 10 11#include "GrRenderTarget.h" 12 13#include "GrBackendSurface.h" 14 15#import <Metal/Metal.h> 16 17class GrMtlGpu; 18 19class GrMtlRenderTarget: public GrRenderTarget { 20public: 21 static sk_sp<GrMtlRenderTarget> CreateNewRenderTarget(GrMtlGpu*, const GrSurfaceDesc&, 22 SkBudgeted); 23 24 static sk_sp<GrMtlRenderTarget> MakeWrappedRenderTarget(GrMtlGpu*, const GrSurfaceDesc&); 25 26 ~GrMtlRenderTarget() override; 27 28 // override of GrRenderTarget 29 ResolveType getResolveType() const override { 30 return kCantResolve_ResolveType; 31#if 0 // TODO figure this once we support msaa 32 if (this->numColorSamples() > 1) { 33 return kCanResolve_ResolveType; 34 } 35 return kAutoResolves_ResolveType; 36#endif 37 } 38 39 bool canAttemptStencilAttachment() const override { 40 return true; 41 } 42 43 GrBackendObject getRenderTargetHandle() const override; 44 45 GrBackendRenderTarget getBackendRenderTarget() const override { 46 return GrBackendRenderTarget(); // invalid 47 } 48 49protected: 50 GrMtlRenderTarget(GrMtlGpu* gpu, 51 const GrSurfaceDesc& desc, 52 id<MTLTexture> renderTexture, 53 id<MTLTexture> resolveTexture); 54 55 GrMtlRenderTarget(GrMtlGpu* gpu, 56 const GrSurfaceDesc& desc, 57 id<MTLTexture> renderTexture); 58 59 GrMtlGpu* getMtlGpu() const; 60 61 void onAbandon() override; 62 void onRelease() override; 63 64 // This accounts for the texture's memory and any MSAA renderbuffer's memory. 65 size_t onGpuMemorySize() const override { 66 int numColorSamples = this->numColorSamples(); 67 // The plus 1 is to account for the resolve texture or if not using msaa the RT itself 68 if (numColorSamples > 1) { 69 ++numColorSamples; 70 } 71 return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 72 numColorSamples, GrMipMapped::kNo); 73 } 74 75 id<MTLTexture> fRenderTexture; 76 id<MTLTexture> fResolveTexture; 77 78private: 79 GrMtlRenderTarget(GrMtlGpu* gpu, 80 const GrSurfaceDesc& desc, 81 SkBudgeted, 82 id<MTLTexture> renderTexture, 83 id<MTLTexture> resolveTexture); 84 85 GrMtlRenderTarget(GrMtlGpu* gpu, 86 const GrSurfaceDesc& desc, 87 SkBudgeted, 88 id<MTLTexture> renderTexture); 89 90 static sk_sp<GrMtlRenderTarget> Make(GrMtlGpu*, 91 const GrSurfaceDesc&, 92 SkBudgeted, 93 id<MTLTexture> renderTexture, 94 bool isWrapped); 95 96 bool completeStencilAttachment() override; 97}; 98 99 100#endif 101 102