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