blob: 24511d8f8e48abd5058d58cf16e7e9aa0a54163e [file]
/*
* Copyright 2026 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_DrawListLayer_DEFINED
#define skgpu_graphite_DrawListLayer_DEFINED
#include "src/gpu/graphite/DrawListBase.h"
#include "include/private/base/SkDebug.h"
#include "src/base/SkBlockAllocator.h"
#include "src/base/SkEnumBitMask.h"
#include "src/base/SkTBlockList.h"
#include "src/gpu/graphite/ContextUtils.h"
#include "src/gpu/graphite/DrawCommands.h"
#include "src/gpu/graphite/DrawListTypes.h"
#include "src/gpu/graphite/DrawOrder.h"
#include "src/gpu/graphite/DrawParams.h"
#include "src/gpu/graphite/PaintParams.h"
#include "src/gpu/graphite/PipelineData.h"
#include "src/gpu/graphite/geom/Rect.h"
#include "src/gpu/graphite/geom/Transform.h"
#include <cstdint>
#include <functional>
#include <limits>
#include <optional>
namespace skgpu::graphite {
class DrawPass;
class Geometry;
class Renderer;
class DrawListLayer final : public DrawListBase {
public:
explicit DrawListLayer(bool storageBufferSupport)
: DrawListBase()
, fStorageBufferSupport(storageBufferSupport) {}
// DrawList requires that all Transforms be valid and asserts as much; invalid transforms should
// be detected at the Device level or similar. The provided Renderer must be compatible with the
// 'shape' and 'stroke' parameters.
std::pair<DrawParams*, Insertion> recordDraw(
const Renderer* renderer,
const Transform& localToDevice,
const Geometry& geometry,
const Clip& clip,
DrawOrder ordering,
UniquePaintParamsID paintID,
SkEnumBitMask<DstUsage> dstUsage,
BarrierType barrierBeforeDraws,
PipelineDataGatherer* gatherer,
const StrokeStyle* stroke,
const Insertion& latestInsertion) override;
std::unique_ptr<DrawPass> snapDrawPass(Recorder* recorder,
sk_sp<TextureProxy> target,
const SkImageInfo& targetInfo,
const DstReadStrategy dstReadStrategy) override;
// Discard all previously recorded draws and set to the requested load op (with optional clear
// color).
void reset(LoadOp op, SkColor4f clearColor = {0.f, 0.f, 0.f, 0.f}) override;
private:
void recordBackwards(int stepIndex,
bool isStencil,
bool isDepthOnly,
bool dependsOnDst,
bool requiresBarrier,
const RenderStep* step,
const UniformDataCache::Index& uniformIndex,
const LayerKey& key,
const DrawParams* drawParams,
const Insertion& stop,
Insertion* capture,
bool canForwardMerge);
void recordForwards(int stepIndex,
bool isStencil,
bool dependsOnDst,
bool requiresBarrier,
const RenderStep* step,
const UniformDataCache::Index& uniformIndex,
const LayerKey& key,
const DrawParams* drawParams,
Insertion& start);
friend class DrawPass;
static constexpr int32_t kMaxSearchLimit = 32;
static constexpr uint32_t kDefaultAllocation = 4096;
// TODO (thomsmit): Try using SkSTArenaAllocWithReset that has the first storage block stored
// inline so it's embedded in the DrawListLayer object.
SkArenaAllocWithReset fStorage{kDefaultAllocation};
SkTInternalLList<Layer> fLayers;
int fDrawCount = 0;
CompressedPaintersOrder fOrderCounter = CompressedPaintersOrder::First();
const bool fStorageBufferSupport;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_DrawListLayer_DEFINED