1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef GrMtlAttachment_DEFINED
9cb93a386Sopenharmony_ci#define GrMtlAttachment_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "include/gpu/mtl/GrMtlTypes.h"
12cb93a386Sopenharmony_ci#include "src/gpu/GrAttachment.h"
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_ci#import <Metal/Metal.h>
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ciclass GrMtlGpu;
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ciclass GrMtlAttachment : public GrAttachment {
19cb93a386Sopenharmony_cipublic:
20cb93a386Sopenharmony_ci    static sk_sp<GrMtlAttachment> MakeStencil(GrMtlGpu* gpu,
21cb93a386Sopenharmony_ci                                              SkISize dimensions,
22cb93a386Sopenharmony_ci                                              int sampleCnt,
23cb93a386Sopenharmony_ci                                              MTLPixelFormat format);
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ci    static sk_sp<GrMtlAttachment> MakeMSAA(GrMtlGpu* gpu,
26cb93a386Sopenharmony_ci                                           SkISize dimensions,
27cb93a386Sopenharmony_ci                                           int sampleCnt,
28cb93a386Sopenharmony_ci                                           MTLPixelFormat format);
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci    static sk_sp<GrMtlAttachment> MakeTexture(GrMtlGpu* gpu,
31cb93a386Sopenharmony_ci                                              SkISize dimensions,
32cb93a386Sopenharmony_ci                                              MTLPixelFormat format,
33cb93a386Sopenharmony_ci                                              uint32_t mipLevels,
34cb93a386Sopenharmony_ci                                              GrRenderable renderable,
35cb93a386Sopenharmony_ci                                              int numSamples,
36cb93a386Sopenharmony_ci                                              SkBudgeted budgeted);
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    static sk_sp<GrMtlAttachment> MakeWrapped(GrMtlGpu* gpu,
39cb93a386Sopenharmony_ci                                              SkISize dimensions,
40cb93a386Sopenharmony_ci                                              id<MTLTexture>,
41cb93a386Sopenharmony_ci                                              UsageFlags attachmentUsages,
42cb93a386Sopenharmony_ci                                              GrWrapCacheable);
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci    ~GrMtlAttachment() override;
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    GrBackendFormat backendFormat() const override {
47cb93a386Sopenharmony_ci        return GrBackendFormat::MakeMtl(fTexture.pixelFormat);
48cb93a386Sopenharmony_ci    }
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat() const { return fTexture.pixelFormat; }
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci    id<MTLTexture> mtlTexture() const { return fTexture; }
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci    unsigned int sampleCount() const { return fTexture.sampleCount; }
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci    bool framebufferOnly() const { return fTexture.framebufferOnly; }
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ciprotected:
59cb93a386Sopenharmony_ci    void onRelease() override;
60cb93a386Sopenharmony_ci    void onAbandon() override;
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ciprivate:
63cb93a386Sopenharmony_ci    static sk_sp<GrMtlAttachment> Make(GrMtlGpu* gpu,
64cb93a386Sopenharmony_ci                                       SkISize dimensions,
65cb93a386Sopenharmony_ci                                       UsageFlags attachmentUsages,
66cb93a386Sopenharmony_ci                                       int sampleCnt,
67cb93a386Sopenharmony_ci                                       MTLPixelFormat format,
68cb93a386Sopenharmony_ci                                       uint32_t mipLevels,
69cb93a386Sopenharmony_ci                                       int mtlTextureUsage,
70cb93a386Sopenharmony_ci                                       int mtlStorageMode,
71cb93a386Sopenharmony_ci                                       SkBudgeted);
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci    GrMtlAttachment(GrMtlGpu* gpu,
74cb93a386Sopenharmony_ci                    SkISize dimensions,
75cb93a386Sopenharmony_ci                    UsageFlags supportedUsages,
76cb93a386Sopenharmony_ci                    id<MTLTexture> texture,
77cb93a386Sopenharmony_ci                    SkBudgeted);
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci    GrMtlAttachment(GrMtlGpu* gpu,
80cb93a386Sopenharmony_ci                    SkISize dimensions,
81cb93a386Sopenharmony_ci                    UsageFlags supportedUsages,
82cb93a386Sopenharmony_ci                    id<MTLTexture> texture,
83cb93a386Sopenharmony_ci                    GrWrapCacheable);
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_ci    GrMtlGpu* getMtlGpu() const;
86cb93a386Sopenharmony_ci
87cb93a386Sopenharmony_ci    id<MTLTexture> fTexture;
88cb93a386Sopenharmony_ci};
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci#endif
91