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 // The plus 1 is to account for the resolve texture or if not using msaa the RT itself 67 int numColorSamples = this->numColorSamples() + 1; 68 return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 69 numColorSamples, GrMipMapped::kNo); 70 } 71 72 id<MTLTexture> fRenderTexture; 73 id<MTLTexture> fResolveTexture; 74 75private: 76 GrMtlRenderTarget(GrMtlGpu* gpu, 77 const GrSurfaceDesc& desc, 78 SkBudgeted, 79 id<MTLTexture> renderTexture, 80 id<MTLTexture> resolveTexture); 81 82 GrMtlRenderTarget(GrMtlGpu* gpu, 83 const GrSurfaceDesc& desc, 84 SkBudgeted, 85 id<MTLTexture> renderTexture); 86 87 static sk_sp<GrMtlRenderTarget> Make(GrMtlGpu*, 88 const GrSurfaceDesc&, 89 SkBudgeted, 90 id<MTLTexture> renderTexture, 91 bool isWrapped); 92 93 bool completeStencilAttachment() override; 94}; 95 96 97#endif 98 99