12259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar/*
22259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar * Copyright 2017 Google Inc.
32259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar *
42259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar * Use of this source code is governed by a BSD-style license that can be
52259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar * found in the LICENSE file.
62259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar */
72259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
82259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#ifndef GrMtlRenderTarget_DEFINED
92259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#define GrMtlRenderTarget_DEFINED
102259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
112259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#include "GrRenderTarget.h"
122259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
132259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#include "GrBackendSurface.h"
142259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
152259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#import <Metal/Metal.h>
162259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
17ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteclass GrMtlGpu;
182259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
192259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyarclass GrMtlRenderTarget: public GrRenderTarget {
202259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyarpublic:
21ba069d50913c3fb250bb60ec310439db36895337Alan Viverette    static sk_sp<GrMtlRenderTarget> CreateNewRenderTarget(GrMtlGpu*, const GrSurfaceDesc&,
22ba069d50913c3fb250bb60ec310439db36895337Alan Viverette                                                          SkBudgeted);
23ba069d50913c3fb250bb60ec310439db36895337Alan Viverette
242259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    static sk_sp<GrMtlRenderTarget> MakeWrappedRenderTarget(GrMtlGpu*, const GrSurfaceDesc&);
252259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
262259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    ~GrMtlRenderTarget() override;
272259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
282259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    // override of GrRenderTarget
29e1635fb62c7bfac2b6f74fe6beacc050026f27fcSergey Vasilinets    ResolveType getResolveType() const override {
30e1635fb62c7bfac2b6f74fe6beacc050026f27fcSergey Vasilinets        return kCantResolve_ResolveType;
312259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar#if 0 // TODO figure this once we support msaa
322259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar        if (this->numColorSamples() > 1) {
33e1635fb62c7bfac2b6f74fe6beacc050026f27fcSergey Vasilinets            return kCanResolve_ResolveType;
342259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar        }
35e1635fb62c7bfac2b6f74fe6beacc050026f27fcSergey Vasilinets        return kAutoResolves_ResolveType;
36e1635fb62c7bfac2b6f74fe6beacc050026f27fcSergey Vasilinets#endif
3734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
38250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
39250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    bool canAttemptStencilAttachment() const override {
40250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar        return true;
41250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    }
42250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
43250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    GrBackendObject getRenderTargetHandle() const override;
44250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
45250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    GrBackendRenderTarget getBackendRenderTarget() const override {
46250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar        return GrBackendRenderTarget(); // invalid
472259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    }
482259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
49250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyarprotected:
50250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    GrMtlRenderTarget(GrMtlGpu* gpu,
51250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar                      const GrSurfaceDesc& desc,
52250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar                      id<MTLTexture> renderTexture,
53250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar                      id<MTLTexture> resolveTexture);
54250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
55250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    GrMtlRenderTarget(GrMtlGpu* gpu,
56250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar                      const GrSurfaceDesc& desc,
57250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar                      id<MTLTexture> renderTexture);
58250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
59250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    GrMtlGpu* getMtlGpu() const;
60250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
61250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    void onAbandon() override;
62250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    void onRelease() override;
63250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar
642259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    // This accounts for the texture's memory and any MSAA renderbuffer's memory.
652259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    size_t onGpuMemorySize() const override {
662259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar        // The plus 1 is to account for the resolve texture or if not using msaa the RT itself
672259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar        int numColorSamples = this->numColorSamples() + 1;
682259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar        return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
692259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                                      numColorSamples, GrMipMapped::kNo);
702259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    }
712259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
72250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar    id<MTLTexture> fRenderTexture;
732259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    id<MTLTexture> fResolveTexture;
742259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
752259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyarprivate:
762259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    GrMtlRenderTarget(GrMtlGpu* gpu,
772259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      const GrSurfaceDesc& desc,
782259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      SkBudgeted,
792259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      id<MTLTexture> renderTexture,
802259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      id<MTLTexture> resolveTexture);
812259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
822259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    GrMtlRenderTarget(GrMtlGpu* gpu,
832259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      const GrSurfaceDesc& desc,
842259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      SkBudgeted,
852259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                      id<MTLTexture> renderTexture);
862259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
872259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    static sk_sp<GrMtlRenderTarget> Make(GrMtlGpu*,
882259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                                         const GrSurfaceDesc&,
892259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                                         SkBudgeted,
902259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                                         id<MTLTexture> renderTexture,
912259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar                                         bool isWrapped);
922259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
932259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar    bool completeStencilAttachment() override;
942259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar};
952259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
962259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
97250a3e6dc5d50c533575b7d276730b89eecc7c19Yigit Boyar#endif
982259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar
992259e4dc433701d006db35df4c5e9f8d51e7d29bYigit Boyar