blob: 1a4557b8bdf89bd1d3983eb4ecf58626bbfd232b [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/graphite/Renderer.h"
namespace skgpu::graphite {
static uint32_t next_id() {
static std::atomic<uint32_t> nextID{0};
// Not worried about overflow since each Context won't have that many RenderSteps, so even if
// it wraps back to 0, that RenderStep will not be in the same Context as the original 0.
return nextID.fetch_add(1, std::memory_order_relaxed);
}
RenderStep::RenderStep(std::string_view className,
std::string_view variantName,
SkEnumBitMask<Flags> flags,
std::initializer_list<Uniform> uniforms,
PrimitiveType primitiveType,
DepthStencilSettings depthStencilSettings,
SkSpan<const Attribute> vertexAttrs,
SkSpan<const Attribute> instanceAttrs,
SkSpan<const Varying> varyings)
: fUniqueID(next_id())
, fFlags(flags)
, fPrimitiveType(primitiveType)
, fDepthStencilSettings(depthStencilSettings)
, fUniforms(uniforms)
, fVertexAttrs(vertexAttrs.begin(), vertexAttrs.end())
, fInstanceAttrs(instanceAttrs.begin(), instanceAttrs.end())
, fVaryings(varyings.begin(), varyings.end())
, fVertexStride(0)
, fInstanceStride(0)
, fName(className) {
for (auto v : this->vertexAttributes()) {
fVertexStride += v.sizeAlign4();
}
for (auto i : this->instanceAttributes()) {
fInstanceStride += i.sizeAlign4();
}
if (variantName.size() > 0) {
fName += "[";
fName += variantName;
fName += "]";
}
}
Coverage RenderStep::GetCoverage(SkEnumBitMask<Flags> flags) {
return !(flags & Flags::kEmitsCoverage) ? Coverage::kNone
: (flags & Flags::kLCDCoverage) ? Coverage::kLCD
: Coverage::kSingleChannel;
}
} // namespace skgpu::graphite