31std::tuple<UniquePaintParamsID, const UniformDataBlock*, const TextureDataBlock*>
36 const SkM44& local2Dev,
46 recorder, local2Dev, targetColorInfo, p.color(), std::move(dstTexture), dstOffset);
47 p.toKey(keyContext, builder, gatherer);
63 return { paintID, uniforms,
textures };
74 step->writeUniformsAndTextures(
params, gatherer);
87 std::optional<SkBlendMode> blendMode,
109std::string get_uniform_header(
int bufferID,
const char*
name) {
117std::string get_uniforms(
Layout layout,
121 bool* wrotePaintColor) {
123 UniformOffsetCalculator offsetter(layout, *
offset);
125 std::string uniformName;
126 for (
const Uniform& u : uniforms) {
127 uniformName = u.name();
129 if (u.isPaintColor() && wrotePaintColor) {
130 if (*wrotePaintColor) {
135 *wrotePaintColor =
true;
137 if (manglingSuffix >= 0) {
138 uniformName.append(
"_");
139 uniformName.append(std::to_string(manglingSuffix));
144 " layout(offset=%d) %s %s",
145 offsetter.advanceOffset(u.type(), u.count()),
147 uniformName.c_str());
150 result.append(std::to_string(u.count()));
156 *
offset = offsetter.size();
160std::string get_node_uniforms(
Layout layout,
161 const ShaderNode* node,
164 bool* wrotePaintColor) {
168 if (!uniforms.
empty()) {
170 node->keyIndex(), node->entry()->fName);
171 result += get_uniforms(layout, uniforms,
offset, node->keyIndex(), wrotePaintColor);
174 *numUniforms += uniforms.
size();
175 for (
const ShaderNode* child : node->children()) {
176 result += get_node_uniforms(layout, child,
offset, numUniforms, wrotePaintColor);
183 bool* wrotePaintColor) {
186 std::string uniformName;
187 for (
const Uniform& u : uniforms) {
188 uniformName = u.name();
190 if (u.isPaintColor() && wrotePaintColor) {
191 if (*wrotePaintColor) {
196 *wrotePaintColor =
true;
198 if (manglingSuffix >= 0) {
199 uniformName.append(
"_");
200 uniformName.append(std::to_string(manglingSuffix));
214std::string get_node_ssbo_fields(
const ShaderNode* node,
int* numUniforms,
bool* wrotePaintColor) {
218 if (!uniforms.
empty()) {
220 node->keyIndex(), node->entry()->fName);
222 result += get_ssbo_fields(uniforms, node->keyIndex(), wrotePaintColor);
225 *numUniforms += uniforms.
size();
226 for (
const ShaderNode* child : node->children()) {
227 result += get_node_ssbo_fields(child, numUniforms, wrotePaintColor);
232std::string get_node_texture_samplers(
const ResourceBindingRequirements& bindingReqs,
233 const ShaderNode* node,
238 if (!samplers.
empty()) {
240 node->keyIndex(), node->entry()->fName);
242 for (
const TextureAndSampler& t : samplers) {
245 t.name(), node->keyIndex());
249 for (
const ShaderNode* child : node->children()) {
250 result += get_node_texture_samplers(bindingReqs, child, binding);
261 int* uniformsTotalBytes,
262 bool* wrotePaintColor) {
265 std::string
result = get_uniform_header(bufferID,
"FS");
267 result += get_node_uniforms(layout, n, &
offset, numUniforms, wrotePaintColor);
276 if (uniformsTotalBytes) {
277 *uniformsTotalBytes =
offset;
286 int* renderStepUniformsTotalBytes) {
289 std::string
result = get_uniform_header(bufferID,
"Step");
290 result += get_uniforms(layout, uniforms, &
offset, -1,
nullptr);
293 if (renderStepUniformsTotalBytes) {
294 *renderStepUniformsTotalBytes =
offset;
304 bool* wrotePaintColor) {
307 result +=
"struct FSUniformData {\n";
309 result += get_node_ssbo_fields(n, numUniforms, wrotePaintColor);
319 "layout (binding=%d) readonly buffer FSUniforms {\n"
320 " FSUniformData fsUniformData[];\n"
331 result +=
"struct StepUniformData {\n" +
332 get_ssbo_fields(uniforms, -1,
nullptr) +
336 "layout (binding=%d) readonly buffer StepUniforms {\n"
337 " StepUniformData stepUniformData[];\n"
344 const char* ssboIndex,
348 for (
const Uniform& u : uniforms) {
354 &
result,
" = %sUniformData[%s].%s;\n", bufferNamePrefix, ssboIndex, u.name());
361 const char* ssboIndex,
362 const char* uniformName) {
371 result += get_node_texture_samplers(bindingReqs, n, binding);
385 int samplerIndex = (*binding)++;
386 int textureIndex = (*binding)++;
392 int samplerIndex = (*binding)++;
407 for (
auto a : attrs) {
414 if (!vertexAttrs.
empty()) {
415 result.append(
"// vertex attrs\n");
416 add_attrs(vertexAttrs);
418 if (!instanceAttrs.
empty()) {
419 result.append(
"// instance attrs\n");
420 add_attrs(instanceAttrs);
428 const char* direction,
429 bool emitSsboIndicesVarying,
430 bool emitLocalCoordsVarying) {
434 if (emitSsboIndicesVarying) {
436 " layout(location=%d) %s flat ushort2 %s;\n",
442 if (emitLocalCoordsVarying) {
448 for (
auto v :
step->varyings()) {
459 bool useStorageBuffers,
460 bool defineLocalCoordsVarying) {
463 const bool hasStepUniforms =
step->numUniforms() > 0;
464 const bool useStepStorageBuffer = useStorageBuffers && hasStepUniforms;
465 const bool useShadingStorageBuffer = useStorageBuffers &&
step->performsShading();
477 "layout (binding=0) uniform intrinsicUniforms {\n"
478 " layout(offset=0) float4 rtAdjust;\n"
482 if (
step->numVertexAttributes() > 0 ||
step->numInstanceAttributes() > 0) {
483 sksl += emit_attributes(
step->vertexAttributes(),
step->instanceAttributes());
489 if (hasStepUniforms) {
490 if (useStepStorageBuffer) {
496 &
result.fRenderStepUniformsTotalBytes);
501 sksl +=
EmitVaryings(
step,
"out", useShadingStorageBuffer, defineLocalCoordsVarying);
504 sksl +=
"void main() {";
506 sksl +=
"float2 stepLocalCoords = float2(0);";
508 if (useStepStorageBuffer) {
516 sksl +=
step->vertexSkSL();
517 sksl +=
"sk_Position = float4(devPosition.xy * rtAdjust.xy + devPosition.ww * rtAdjust.zw,"
520 if (useShadingStorageBuffer) {
528 if (defineLocalCoordsVarying) {
530 sksl +=
"localCoordsVar = stepLocalCoords;";
534 result.fSkSL = std::move(sksl);
536 if (defineLocalCoordsVarying) {
537 result.fLabel +=
" (w/ local coords)";
548 bool useStorageBuffers,
556 const char* shadingSsboIndex =
557 useStorageBuffers &&
step->performsShading() ?
"shadingSsboIndex" :
nullptr;
558 ShaderInfo shaderInfo(paintID, dict, rteDict, shadingSsboIndex);
560 result.fSkSL = shaderInfo.toSkSL(caps,
563 &
result.fNumTexturesAndSamplers,
564 &
result.fNumPaintUniforms,
565 &
result.fRenderStepUniformsTotalBytes,
566 &
result.fPaintUniformsTotalBytes,
571 result.fBlendInfo = shaderInfo.blendInfo();
572 result.fRequiresLocalCoords = shaderInfo.needsLocalCoords();
589 label += renderStep->
name();
598 step->localDispatchSize().fWidth,
599 step->localDispatchSize().fHeight,
600 step->localDispatchSize().fDepth);
604 bool separateSampler = bindingReqs.fSeparateTextureAndSamplerBinding;
617 case Type::kUniformBuffer:
621 case Type::kStorageBuffer:
622 case Type::kIndirectBuffer:
626 case Type::kReadOnlyStorageBuffer:
630 case Type::kWriteOnlyStorageTexture:
632 distinctRanges ? texIdx++ : index++);
635 case Type::kReadOnlyTexture:
637 distinctRanges ? texIdx++ : index++);
640 case Type::kSampledTexture:
641 if (distinctRanges) {
643 }
else if (separateSampler) {
645 &sksl,
"layout(webgpu, sampler=%d, texture=%d) ", index, index + 1);
650 sksl +=
"sampler2D ";
657 sksl +=
step->computeSkSL();
static int step(int x, SkScalar min, SkScalar max)
@ kLastCoeffMode
last porter duff blend mode
@ kSrcOver
r = s + (1-sa)*d
static bool isLCD(const SkScalerContextRec &rec)
const char * SkSLTypeString(SkSLType t)
constexpr bool empty() const
constexpr size_t size() const
const char * c_str() const
SkString asString() const
const ResourceBindingRequirements & resourceBindingRequirements() const
DstReadRequirement getDstReadRequirement() const
const SkSL::ShaderCaps * shaderCaps() const
const T * insert(const T &dataBlock)
void resetWithNewLayout(Layout layout)
UniformDataBlock finishUniformDataBlock()
const TextureDataBlock & textureDataBlock()
const ShaderCodeDictionary * shaderCodeDictionary() const
TextureDataCache * textureDataCache()
UniformDataCache * uniformDataCache()
static const char * ssboIndicesAttribute()
const char * name() const
static const char * ssboIndicesVarying()
UniquePaintParamsID findOrCreate(PaintParamsKeyBuilder *) SK_EXCLUDES(fSpinLock)
SkString idToString(UniquePaintParamsID id) const
std::vector< std::shared_ptr< FakeTexture > > textures
const EmbeddedViewParams * params
std::string printf(const char *fmt,...) SK_PRINTF_LIKE(1
std::string void appendf(std::string *str, const char *fmt,...) SK_PRINTF_LIKE(2
VertSkSLInfo BuildVertexSkSL(const ResourceBindingRequirements &bindingReqs, const RenderStep *step, bool useStorageBuffers, bool defineLocalCoordsVarying)
std::string EmitPaintParamsUniforms(int bufferID, const Layout layout, SkSpan< const ShaderNode * > nodes, int *numUniforms, int *uniformsTotalBytes, bool *wrotePaintColor)
std::string BuildComputeSkSL(const Caps *caps, const ComputeStep *step)
std::string EmitStorageBufferAccess(const char *bufferNamePrefix, const char *ssboIndex, const char *uniformName)
DstReadRequirement GetDstReadRequirement(const Caps *caps, std::optional< SkBlendMode > blendMode, Coverage coverage)
std::string EmitTexturesAndSamplers(const ResourceBindingRequirements &bindingReqs, SkSpan< const ShaderNode * > nodes, int *binding)
FragSkSLInfo BuildFragmentSkSL(const Caps *caps, const ShaderCodeDictionary *dict, const RuntimeEffectDictionary *rteDict, const RenderStep *step, UniquePaintParamsID paintID, bool useStorageBuffers, skgpu::Swizzle writeSwizzle)
std::string GetPipelineLabel(const ShaderCodeDictionary *dict, const RenderPassDesc &renderPassDesc, const RenderStep *renderStep, UniquePaintParamsID paintID)
std::string EmitRenderStepStorageBuffer(int bufferID, SkSpan< const Uniform > uniforms)
std::string EmitRenderStepUniforms(int bufferID, const Layout layout, SkSpan< const Uniform > uniforms, int *renderStepUniformsTotalBytes)
std::tuple< UniquePaintParamsID, const UniformDataBlock *, const TextureDataBlock * > ExtractPaintData(Recorder *recorder, PipelineDataGatherer *gatherer, PaintParamsKeyBuilder *builder, const Layout layout, const SkM44 &local2Dev, const PaintParams &p, sk_sp< TextureProxy > dstTexture, SkIPoint dstOffset, const SkColorInfo &targetColorInfo)
std::string EmitVaryings(const RenderStep *step, const char *direction, bool emitSsboIndicesVarying, bool emitLocalCoordsVarying)
std::string EmitPaintParamsStorageBuffer(int bufferID, SkSpan< const ShaderNode * > nodes, int *numUniforms, bool *wrotePaintColor)
std::tuple< const UniformDataBlock *, const TextureDataBlock * > ExtractRenderStepData(UniformDataCache *uniformDataCache, TextureDataCache *textureDataCache, PipelineDataGatherer *gatherer, const Layout layout, const RenderStep *step, const DrawParams ¶ms)
std::string EmitSamplerLayout(const ResourceBindingRequirements &bindingReqs, int *binding)
std::string EmitUniformsFromStorageBuffer(const char *bufferNamePrefix, const char *ssboIndex, SkSpan< const Uniform > uniforms)
BlendFormula GetBlendFormula(bool isOpaque, bool hasCoverage, SkBlendMode xfermode)
BlendFormula GetLCDBlendFormula(SkBlendMode xfermode)
bool fDualSourceBlendingSupport
SkString toString() const
Layout fUniformBufferLayout
bool fDistinctIndexRanges
bool fSeparateTextureAndSamplerBinding