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