/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrAttachment_DEFINED #define GrAttachment_DEFINED #include "src/core/SkClipStack.h" #include "src/gpu/ganesh/GrSurface.h" class GrRenderTarget; /** * This is a generic attachment class for out GrSurfaces. It always represents a single gpu * allocation. It contains usage flags so that we know what the attachment can be used for. * * TODO: Once we can pull out GrRenderTarget to be more of a framebuffer and break apart our * texture render target diamond, we will merge this class with GrSurface. Until then this will * act as the staging class for the new surface and framebuffer world. */ class GrAttachment : public GrSurface { public: enum class UsageFlags : uint8_t { kStencilAttachment = 0x1, kColorAttachment = 0x2, kTexture = 0x4, }; GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(UsageFlags); ~GrAttachment() override {} UsageFlags supportedUsages() const { return fSupportedUsages; } int numSamples() const { return fSampleCnt; } GrMipmapped mipmapped() const { return fMipmapped; } bool hasPerformedInitialClear() const { return fHasPerformedInitialClear; } void markHasPerformedInitialClear() { fHasPerformedInitialClear = true; } // This unique key is used for attachments of the same dimensions, usage, and sample cnt which // are shared between multiple render targets at the same time. Only one usage flag may be // passed in. // TODO: Once attachments start having multiple usages, we'll need to figure out how to search // the cache for an attachment that simply contains the requested usage instead of equaling it. static void ComputeSharedAttachmentUniqueKey(const GrCaps& caps, const GrBackendFormat& format, SkISize dimensions, UsageFlags requiredUsage, int sampleCnt, GrMipmapped mipmapped, GrProtected isProtected, GrMemoryless memoryless, skgpu::UniqueKey* key); // TODO: Once attachments start having multiple usages, we'll need to figure out how to search // the cache for an attachment that simply contains the requested usage instead of equaling it. static void ComputeScratchKey(const GrCaps& caps, const GrBackendFormat& format, SkISize dimensions, UsageFlags requiredUsage, int sampleCnt, GrMipmapped mipmapped, GrProtected, GrMemoryless, skgpu::ScratchKey* key); protected: GrAttachment(GrGpu* gpu, SkISize dimensions, UsageFlags supportedUsages, int sampleCnt, GrMipmapped mipmapped, GrProtected isProtected, std::string_view label, GrMemoryless memoryless = GrMemoryless::kNo) : INHERITED(gpu, dimensions, isProtected, label) , fSupportedUsages(supportedUsages) , fSampleCnt(sampleCnt) , fMipmapped(mipmapped) , fMemoryless(memoryless) {} private: size_t onGpuMemorySize() const final; void onSetLabel() override{} void computeScratchKey(skgpu::ScratchKey*) const final; const char* getResourceType() const override { if (fSupportedUsages == UsageFlags::kStencilAttachment) { return "StencilAttachment"; } // This is a general grouping of all textures and color attachments. return "Surface"; } UsageFlags fSupportedUsages; int fSampleCnt; GrMipmapped fMipmapped; bool fHasPerformedInitialClear = false; GrMemoryless fMemoryless; using INHERITED = GrSurface; }; GR_MAKE_BITFIELD_CLASS_OPS(GrAttachment::UsageFlags) #endif