/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrMtlRenderTarget_DEFINED #define GrMtlRenderTarget_DEFINED #include "GrRenderTarget.h" #include "GrBackendSurface.h" #import <Metal/Metal.h> class GrMtlGpu; class GrMtlRenderTarget: public GrRenderTarget { public: static sk_sp<GrMtlRenderTarget> CreateNewRenderTarget(GrMtlGpu*, const GrSurfaceDesc&, SkBudgeted); static sk_sp<GrMtlRenderTarget> MakeWrappedRenderTarget(GrMtlGpu*, const GrSurfaceDesc&); ~GrMtlRenderTarget() override; // override of GrRenderTarget ResolveType getResolveType() const override { return kCantResolve_ResolveType; #if 0 // TODO figure this once we support msaa if (this->numColorSamples() > 1) { return kCanResolve_ResolveType; } return kAutoResolves_ResolveType; #endif } bool canAttemptStencilAttachment() const override { return true; } GrBackendObject getRenderTargetHandle() const override; GrBackendRenderTarget getBackendRenderTarget() const override { return GrBackendRenderTarget(); // invalid } protected: GrMtlRenderTarget(GrMtlGpu* gpu, const GrSurfaceDesc& desc, id<MTLTexture> renderTexture, id<MTLTexture> resolveTexture); GrMtlRenderTarget(GrMtlGpu* gpu, const GrSurfaceDesc& desc, id<MTLTexture> renderTexture); GrMtlGpu* getMtlGpu() const; void onAbandon() override; void onRelease() override; // This accounts for the texture's memory and any MSAA renderbuffer's memory. size_t onGpuMemorySize() const override { int numColorSamples = this->numColorSamples(); // The plus 1 is to account for the resolve texture or if not using msaa the RT itself if (numColorSamples > 1) { ++numColorSamples; } return GrSurface::ComputeSize(this->config(), this->width(), this->height(), numColorSamples, GrMipMapped::kNo); } id<MTLTexture> fRenderTexture; id<MTLTexture> fResolveTexture; private: GrMtlRenderTarget(GrMtlGpu* gpu, const GrSurfaceDesc& desc, SkBudgeted, id<MTLTexture> renderTexture, id<MTLTexture> resolveTexture); GrMtlRenderTarget(GrMtlGpu* gpu, const GrSurfaceDesc& desc, SkBudgeted, id<MTLTexture> renderTexture); static sk_sp<GrMtlRenderTarget> Make(GrMtlGpu*, const GrSurfaceDesc&, SkBudgeted, id<MTLTexture> renderTexture, bool isWrapped); bool completeStencilAttachment() override; }; #endif