blob: e2d1175fcbcc33b9d1963714b030b788d943c723 [file] [log] [blame]
/*
* Copyright 2024 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_RenderPassDesc_DEFINED
#define skgpu_graphite_RenderPassDesc_DEFINED
#include "include/core/SkString.h"
#include "src/gpu/graphite/ResourceTypes.h"
#include "src/gpu/graphite/TextureFormat.h"
#include "src/gpu/Swizzle.h"
#include <array>
namespace skgpu::graphite {
class Caps;
class TextureInfo;
struct AttachmentDesc {
TextureFormat fFormat = TextureFormat::kUnsupported;
LoadOp fLoadOp = LoadOp::kDiscard;
StoreOp fStoreOp = StoreOp::kDiscard;
// NOTE: GPU-supported sample counts should always fit in a byte, and this lets AttachmentDesc
// stay at 32-bits given the backing types of TextureFormat and Load/StoreOp.
uint8_t fSampleCount = 1;
bool operator==(const AttachmentDesc& other) const {
if (fFormat == TextureFormat::kUnsupported &&
other.fFormat == TextureFormat::kUnsupported) {
return true;
}
return fFormat == other.fFormat &&
fLoadOp == other.fLoadOp &&
fStoreOp == other.fStoreOp &&
fSampleCount == other.fSampleCount;
}
bool operator!=(const AttachmentDesc& other) const { return !(*this == other); }
bool isCompatible(const TextureInfo&) const;
SkString toString() const;
};
static_assert(sizeof(AttachmentDesc) == sizeof(uint32_t));
struct RenderPassDesc {
static RenderPassDesc Make(const Caps* caps,
const TextureInfo& targetInfo,
LoadOp loadOp,
StoreOp storeOp,
SkEnumBitMask<DepthStencilFlags> depthStencilFlags,
const std::array<float, 4>& clearColor,
bool requiresMSAA,
Swizzle writeSwizzle,
const DstReadStrategy);
bool operator==(const RenderPassDesc& other) const {
return (fWriteSwizzle == other.fWriteSwizzle &&
fClearDepth == other.fClearDepth &&
fClearColor == other.fClearColor &&
fColorAttachment == other.fColorAttachment &&
fColorResolveAttachment == other.fColorResolveAttachment &&
fDepthStencilAttachment == other.fDepthStencilAttachment &&
fDstReadStrategy == other.fDstReadStrategy);
}
bool operator!=(const RenderPassDesc& other) const {
return !(*this == other);
}
AttachmentDesc fColorAttachment;
AttachmentDesc fColorResolveAttachment;
AttachmentDesc fDepthStencilAttachment;
// The write swizzle is applied in shader, so affects SkSL code generation, but is determined by
// the desired SkColorType semantics and target TextureFormat combination of the render pass.
Swizzle fWriteSwizzle;
// The overall sample count of the render pass
uint8_t fSampleCount;
// The remaining fields are set on renderpasses, but don't change the structure of the pass.
// Each renderpass determines what strategy to use for reading the dst texture. If no draws
// within the renderpass require a dst read, this is set to be kNoneRequired. If any draw does
// read from the dst, then each pipeline used by this RP independently determines if a dst read
// is needed. When required, this strategy determines how to perform it.
DstReadStrategy fDstReadStrategy;
std::array<float, 4> fClearColor;
float fClearDepth = 0.f;
uint32_t fClearStencil = 0;
SkString toString() const;
// Only includes fixed state relevant to pipeline creation
SkString toPipelineLabel() const;
// TODO:
// * bounds (TBD whether exact bounds vs. granular)
// * input attachments
// * subpass makeup information
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_RenderPassDesc_DEFINED