xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrAttachment.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrAttachment_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrAttachment_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
20*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker class GrCaps;
23*c8dee2aaSAndroid Build Coastguard Worker class GrGpu;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
26*c8dee2aaSAndroid Build Coastguard Worker class ScratchKey;
27*c8dee2aaSAndroid Build Coastguard Worker class UniqueKey;
28*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool;
29*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker /**
32*c8dee2aaSAndroid Build Coastguard Worker  * This is a generic attachment class for out GrSurfaces. It always represents a single gpu
33*c8dee2aaSAndroid Build Coastguard Worker  * allocation. It contains usage flags so that we know what the attachment can be used for.
34*c8dee2aaSAndroid Build Coastguard Worker  *
35*c8dee2aaSAndroid Build Coastguard Worker  * TODO: Once we can pull out GrRenderTarget to be more of a framebuffer and break apart our
36*c8dee2aaSAndroid Build Coastguard Worker  * texture render target diamond, we will merge this class with GrSurface. Until then this will
37*c8dee2aaSAndroid Build Coastguard Worker  * act as the staging class for the new surface and framebuffer world.
38*c8dee2aaSAndroid Build Coastguard Worker  */
39*c8dee2aaSAndroid Build Coastguard Worker class GrAttachment : public GrSurface {
40*c8dee2aaSAndroid Build Coastguard Worker public:
41*c8dee2aaSAndroid Build Coastguard Worker     enum class UsageFlags : uint8_t {
42*c8dee2aaSAndroid Build Coastguard Worker         kStencilAttachment = 0x1,
43*c8dee2aaSAndroid Build Coastguard Worker         kColorAttachment   = 0x2,
44*c8dee2aaSAndroid Build Coastguard Worker         kTexture           = 0x4,
45*c8dee2aaSAndroid Build Coastguard Worker     };
46*c8dee2aaSAndroid Build Coastguard Worker     SK_DECL_BITFIELD_CLASS_OPS_FRIENDS(UsageFlags);
47*c8dee2aaSAndroid Build Coastguard Worker 
~GrAttachment()48*c8dee2aaSAndroid Build Coastguard Worker     ~GrAttachment() override {}
49*c8dee2aaSAndroid Build Coastguard Worker 
supportedUsages()50*c8dee2aaSAndroid Build Coastguard Worker     UsageFlags supportedUsages() const { return fSupportedUsages; }
51*c8dee2aaSAndroid Build Coastguard Worker 
numSamples()52*c8dee2aaSAndroid Build Coastguard Worker     int numSamples() const { return fSampleCnt; }
53*c8dee2aaSAndroid Build Coastguard Worker 
mipmapped()54*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Mipmapped mipmapped() const { return fMipmapped; }
55*c8dee2aaSAndroid Build Coastguard Worker 
hasPerformedInitialClear()56*c8dee2aaSAndroid Build Coastguard Worker     bool hasPerformedInitialClear() const { return fHasPerformedInitialClear; }
markHasPerformedInitialClear()57*c8dee2aaSAndroid Build Coastguard Worker     void markHasPerformedInitialClear() { fHasPerformedInitialClear = true; }
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker     // This unique key is used for attachments of the same dimensions, usage, and sample cnt which
60*c8dee2aaSAndroid Build Coastguard Worker     // are shared between multiple render targets at the same time. Only one usage flag may be
61*c8dee2aaSAndroid Build Coastguard Worker     // passed in.
62*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Once attachments start having multiple usages, we'll need to figure out how to search
63*c8dee2aaSAndroid Build Coastguard Worker     // the cache for an attachment that simply contains the requested usage instead of equaling it.
64*c8dee2aaSAndroid Build Coastguard Worker     static void ComputeSharedAttachmentUniqueKey(const GrCaps& caps,
65*c8dee2aaSAndroid Build Coastguard Worker                                                  const GrBackendFormat& format,
66*c8dee2aaSAndroid Build Coastguard Worker                                                  SkISize dimensions,
67*c8dee2aaSAndroid Build Coastguard Worker                                                  UsageFlags requiredUsage,
68*c8dee2aaSAndroid Build Coastguard Worker                                                  int sampleCnt,
69*c8dee2aaSAndroid Build Coastguard Worker                                                  skgpu::Mipmapped mipmapped,
70*c8dee2aaSAndroid Build Coastguard Worker                                                  GrProtected isProtected,
71*c8dee2aaSAndroid Build Coastguard Worker                                                  GrMemoryless memoryless,
72*c8dee2aaSAndroid Build Coastguard Worker                                                  skgpu::UniqueKey* key);
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Once attachments start having multiple usages, we'll need to figure out how to search
75*c8dee2aaSAndroid Build Coastguard Worker     // the cache for an attachment that simply contains the requested usage instead of equaling it.
76*c8dee2aaSAndroid Build Coastguard Worker     static void ComputeScratchKey(const GrCaps& caps,
77*c8dee2aaSAndroid Build Coastguard Worker                                   const GrBackendFormat& format,
78*c8dee2aaSAndroid Build Coastguard Worker                                   SkISize dimensions,
79*c8dee2aaSAndroid Build Coastguard Worker                                   UsageFlags requiredUsage,
80*c8dee2aaSAndroid Build Coastguard Worker                                   int sampleCnt,
81*c8dee2aaSAndroid Build Coastguard Worker                                   skgpu::Mipmapped mipmapped,
82*c8dee2aaSAndroid Build Coastguard Worker                                   GrProtected,
83*c8dee2aaSAndroid Build Coastguard Worker                                   GrMemoryless,
84*c8dee2aaSAndroid Build Coastguard Worker                                   skgpu::ScratchKey* key);
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker protected:
87*c8dee2aaSAndroid Build Coastguard Worker     GrAttachment(GrGpu* gpu,
88*c8dee2aaSAndroid Build Coastguard Worker                  SkISize dimensions,
89*c8dee2aaSAndroid Build Coastguard Worker                  UsageFlags supportedUsages,
90*c8dee2aaSAndroid Build Coastguard Worker                  int sampleCnt,
91*c8dee2aaSAndroid Build Coastguard Worker                  skgpu::Mipmapped mipmapped,
92*c8dee2aaSAndroid Build Coastguard Worker                  GrProtected isProtected,
93*c8dee2aaSAndroid Build Coastguard Worker                  std::string_view label,
94*c8dee2aaSAndroid Build Coastguard Worker                  GrMemoryless memoryless = GrMemoryless::kNo)
INHERITED(gpu,dimensions,isProtected,label)95*c8dee2aaSAndroid Build Coastguard Worker             : INHERITED(gpu, dimensions, isProtected, label)
96*c8dee2aaSAndroid Build Coastguard Worker             , fSupportedUsages(supportedUsages)
97*c8dee2aaSAndroid Build Coastguard Worker             , fSampleCnt(sampleCnt)
98*c8dee2aaSAndroid Build Coastguard Worker             , fMipmapped(mipmapped)
99*c8dee2aaSAndroid Build Coastguard Worker             , fMemoryless(memoryless) {}
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker private:
102*c8dee2aaSAndroid Build Coastguard Worker     size_t onGpuMemorySize() const final;
103*c8dee2aaSAndroid Build Coastguard Worker 
onSetLabel()104*c8dee2aaSAndroid Build Coastguard Worker     void onSetLabel() override{}
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     void computeScratchKey(skgpu::ScratchKey*) const final;
107*c8dee2aaSAndroid Build Coastguard Worker 
getResourceType()108*c8dee2aaSAndroid Build Coastguard Worker     const char* getResourceType() const override {
109*c8dee2aaSAndroid Build Coastguard Worker         if (fSupportedUsages == UsageFlags::kStencilAttachment) {
110*c8dee2aaSAndroid Build Coastguard Worker             return "StencilAttachment";
111*c8dee2aaSAndroid Build Coastguard Worker         }
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker         // This is a general grouping of all textures and color attachments.
114*c8dee2aaSAndroid Build Coastguard Worker         return "Surface";
115*c8dee2aaSAndroid Build Coastguard Worker     }
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     UsageFlags fSupportedUsages;
118*c8dee2aaSAndroid Build Coastguard Worker     int fSampleCnt;
119*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Mipmapped fMipmapped;
120*c8dee2aaSAndroid Build Coastguard Worker     bool fHasPerformedInitialClear = false;
121*c8dee2aaSAndroid Build Coastguard Worker     GrMemoryless fMemoryless;
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrSurface;
124*c8dee2aaSAndroid Build Coastguard Worker };
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITFIELD_CLASS_OPS(GrAttachment::UsageFlags)
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker #endif
129