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