blob: 3ef4e35062da7c2f443ef4798032836e75c92c60 [file] [log] [blame]
/*
* 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 GrCaps;
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; }
skgpu::Mipmapped 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,
skgpu::Mipmapped 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,
skgpu::Mipmapped mipmapped,
GrProtected,
GrMemoryless,
skgpu::ScratchKey* key);
protected:
GrAttachment(GrGpu* gpu,
SkISize dimensions,
UsageFlags supportedUsages,
int sampleCnt,
skgpu::Mipmapped 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;
skgpu::Mipmapped fMipmapped;
bool fHasPerformedInitialClear = false;
GrMemoryless fMemoryless;
using INHERITED = GrSurface;
};
GR_MAKE_BITFIELD_CLASS_OPS(GrAttachment::UsageFlags)
#endif