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