151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel/* 251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel * Copyright 2017 Google Inc. 351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel * 451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel * Use of this source code is governed by a BSD-style license that can be 551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel * found in the LICENSE file. 651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel */ 751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#ifndef GrMtlRenderTarget_DEFINED 951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#define GrMtlRenderTarget_DEFINED 1051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 1151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#include "GrRenderTarget.h" 1251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 13b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips#include "GrBackendSurface.h" 14b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips 1551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#import <Metal/Metal.h> 1651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 1751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Danielclass GrMtlGpu; 1851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 1951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Danielclass GrMtlRenderTarget: public GrRenderTarget { 2051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Danielpublic: 2151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel static sk_sp<GrMtlRenderTarget> CreateNewRenderTarget(GrMtlGpu*, const GrSurfaceDesc&, 2251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel SkBudgeted); 2351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 2451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel static sk_sp<GrMtlRenderTarget> MakeWrappedRenderTarget(GrMtlGpu*, const GrSurfaceDesc&); 2551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 2651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel ~GrMtlRenderTarget() override; 2751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 2851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel // override of GrRenderTarget 2951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel ResolveType getResolveType() const override { 3051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel return kCantResolve_ResolveType; 3151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#if 0 // TODO figure this once we support msaa 3251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel if (this->numColorSamples() > 1) { 3351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel return kCanResolve_ResolveType; 3451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel } 3551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel return kAutoResolves_ResolveType; 3651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#endif 3751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel } 3851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 3951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel bool canAttemptStencilAttachment() const override { 4051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel return true; 4151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel } 4251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 4351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrBackendObject getRenderTargetHandle() const override; 4451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 45b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips GrBackendRenderTarget getBackendRenderTarget() const override { 46b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips return GrBackendRenderTarget(); // invalid 47b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips } 48b67821da87ffa711c07af75ee618b13dbccd6b7dRobert Phillips 4951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Danielprotected: 5051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrMtlRenderTarget(GrMtlGpu* gpu, 5151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel const GrSurfaceDesc& desc, 5251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> renderTexture, 5351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> resolveTexture); 5451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 5551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrMtlRenderTarget(GrMtlGpu* gpu, 5651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel const GrSurfaceDesc& desc, 5751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> renderTexture); 5851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 5951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrMtlGpu* getMtlGpu() const; 6051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 6151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel void onAbandon() override; 6251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel void onRelease() override; 6351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 6451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel // This accounts for the texture's memory and any MSAA renderbuffer's memory. 6551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel size_t onGpuMemorySize() const override { 66bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon int numColorSamples = this->numColorSamples(); 6751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel // The plus 1 is to account for the resolve texture or if not using msaa the RT itself 68bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon if (numColorSamples > 1) { 69bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon ++numColorSamples; 70bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon } 7151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 72e252f08982b0c747cd4d34c00ce413ab1005e99aGreg Daniel numColorSamples, GrMipMapped::kNo); 7351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel } 7451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 7551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> fRenderTexture; 7651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> fResolveTexture; 7751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 7851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Danielprivate: 7951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrMtlRenderTarget(GrMtlGpu* gpu, 8051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel const GrSurfaceDesc& desc, 8151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel SkBudgeted, 8251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> renderTexture, 8351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> resolveTexture); 8451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 8551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel GrMtlRenderTarget(GrMtlGpu* gpu, 8651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel const GrSurfaceDesc& desc, 8751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel SkBudgeted, 8851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> renderTexture); 8951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 9051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel static sk_sp<GrMtlRenderTarget> Make(GrMtlGpu*, 9151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel const GrSurfaceDesc&, 9251fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel SkBudgeted, 9351fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel id<MTLTexture> renderTexture, 9451fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel bool isWrapped); 9551fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 9651fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel bool completeStencilAttachment() override; 9751fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel}; 9851fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 9951fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 10051fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel#endif 10151fd6d85aa442aa8c070e5c5e4ec55cf41f86833Greg Daniel 102