Skip to content

Commit 0b776ce

Browse files
jbeta51SkCQ
authored andcommitted
consolidate runtime effect builder logic to base class
1) move make functions to base class and make base class constructor public 2) prepare for Android APIs: allow base class copy constructor like SkRuntimeShaderBuilder subclass had before refactor Bug: b/365765693 Change-Id: I5eb1d8a6cdb1a1482897d23dfad983f9bb47cd0f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/897376 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Jorge Betancourt <jmbetancourt@google.com>
1 parent 082b2a7 commit 0b776ce

File tree

5 files changed

+63
-97
lines changed

5 files changed

+63
-97
lines changed

include/effects/SkImageFilters.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
class SkBlender;
2929
class SkColorFilter;
3030
class SkMatrix;
31-
class SkRuntimeShaderBuilder;
31+
class SkRuntimeEffectBuilder;
3232
enum class SkBlendMode;
3333
struct SkIPoint;
3434
struct SkISize;
@@ -382,7 +382,7 @@ class SK_API SkImageFilters {
382382

383383
/**
384384
* Create a filter that fills the output with the per-pixel evaluation of the SkShader produced
385-
* by the SkRuntimeShaderBuilder. The shader is defined in the image filter's local coordinate
385+
* by the SkRuntimeEffectBuilder. The shader is defined in the image filter's local coordinate
386386
* system, so it will automatically be affected by SkCanvas' transform.
387387
*
388388
* This variant assumes that the runtime shader samples 'childShaderName' with the same input
@@ -399,7 +399,7 @@ class SK_API SkImageFilters {
399399
* @param input The image filter that will be provided as input to the runtime
400400
* shader. If null the implicit source image is used instead
401401
*/
402-
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeShaderBuilder& builder,
402+
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeEffectBuilder& builder,
403403
std::string_view childShaderName,
404404
sk_sp<SkImageFilter> input) {
405405
return RuntimeShader(builder, /*sampleRadius=*/0.f, childShaderName, std::move(input));
@@ -416,14 +416,14 @@ class SK_API SkImageFilters {
416416
*
417417
* This requires a GPU backend or SkSL to be compiled in.
418418
*/
419-
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeShaderBuilder& builder,
419+
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeEffectBuilder& builder,
420420
SkScalar sampleRadius,
421421
std::string_view childShaderName,
422422
sk_sp<SkImageFilter> input);
423423

424424
/**
425425
* Create a filter that fills the output with the per-pixel evaluation of the SkShader produced
426-
* by the SkRuntimeShaderBuilder. The shader is defined in the image filter's local coordinate
426+
* by the SkRuntimeEffectBuilder. The shader is defined in the image filter's local coordinate
427427
* system, so it will automatically be affected by SkCanvas' transform.
428428
*
429429
* This requires a GPU backend or SkSL to be compiled in.
@@ -438,7 +438,7 @@ class SK_API SkImageFilters {
438438
* shader. If any are null, the implicit source image is used instead.
439439
* @param inputCount How many entries are present in 'childShaderNames' and 'inputs'.
440440
*/
441-
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeShaderBuilder& builder,
441+
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeEffectBuilder& builder,
442442
std::string_view childShaderNames[],
443443
const sk_sp<SkImageFilter> inputs[],
444444
int inputCount) {
@@ -455,7 +455,7 @@ class SK_API SkImageFilters {
455455
*
456456
* This requires a GPU backend or SkSL to be compiled in.
457457
*/
458-
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeShaderBuilder& builder,
458+
static sk_sp<SkImageFilter> RuntimeShader(const SkRuntimeEffectBuilder& builder,
459459
SkScalar maxSampleRadius,
460460
std::string_view childShaderNames[],
461461
const sk_sp<SkImageFilter> inputs[],

include/effects/SkRuntimeEffect.h

Lines changed: 48 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,45 @@ class SK_API SkRuntimeEffect : public SkRefCnt {
328328
uint32_t fFlags; // Flags
329329
};
330330

331-
/** Base class for SkRuntimeShaderBuilder, defined below. */
331+
/**
332+
* SkRuntimeEffectBuilder is a utility to simplify creating SkShader, SkColorFilter, and SkBlender
333+
* objects from SkRuntimeEffects.
334+
*
335+
* NOTE: Like SkRuntimeEffect, this API is experimental and subject to change!
336+
*
337+
* Given an SkRuntimeEffect, the SkRuntimeEffectBuilder manages creating an input data block and
338+
* provides named access to the 'uniform' variables in that block, as well as named access
339+
* to a list of child shader slots. Usage:
340+
*
341+
* sk_sp<SkRuntimeEffect> effect = ...;
342+
* SkRuntimeEffectBuilder builder(effect);
343+
* builder.uniform("some_uniform_float") = 3.14f;
344+
* builder.uniform("some_uniform_matrix") = SkM44::Rotate(...);
345+
* builder.child("some_child_effect") = mySkImage->makeShader(...);
346+
* ...
347+
* sk_sp<SkShader> shader = builder.makeShader(nullptr, false);
348+
*
349+
* Upon calling makeShader, makeColorFilter, or makeBlender, the builder will check the validity
350+
* of the SkSL to see if the entry point is correct.
351+
*
352+
* Note that SkRuntimeEffectBuilder is built entirely on the public API of SkRuntimeEffect,
353+
* so can be used as-is or serve as inspiration for other interfaces or binding techniques.
354+
*/
332355
class SkRuntimeEffectBuilder {
333356
public:
357+
explicit SkRuntimeEffectBuilder(sk_sp<SkRuntimeEffect> effect)
358+
: fEffect(std::move(effect))
359+
, fUniforms(SkData::MakeZeroInitialized(fEffect->uniformSize()))
360+
, fChildren(fEffect->children().size()) {}
361+
explicit SkRuntimeEffectBuilder(sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
362+
: fEffect(std::move(effect))
363+
, fUniforms(std::move(uniforms))
364+
, fChildren(fEffect->children().size()) {}
365+
366+
// This is currently required by Android Framework but may go away if that dependency
367+
// can be removed.
368+
SkRuntimeEffectBuilder(const SkRuntimeEffectBuilder&) = default;
369+
334370
struct BuilderUniform {
335371
// Copy 'val' to this variable. No type conversion is performed - 'val' must be same
336372
// size as expected by the effect. Information about the variable can be queried by
@@ -419,19 +455,17 @@ class SkRuntimeEffectBuilder {
419455
sk_sp<const SkData> uniforms() const { return fUniforms; }
420456
SkSpan<const SkRuntimeEffect::ChildPtr> children() const { return fChildren; }
421457

458+
// Build methods, at this point checks are made to ensure the SkSL entry point `main` is correct
459+
sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const;
460+
sk_sp<SkColorFilter> makeColorFilter() const;
461+
sk_sp<SkBlender> makeBlender() const;
462+
463+
~SkRuntimeEffectBuilder() = default;
464+
422465
protected:
423466
SkRuntimeEffectBuilder() = delete;
424-
explicit SkRuntimeEffectBuilder(sk_sp<SkRuntimeEffect> effect)
425-
: fEffect(std::move(effect))
426-
, fUniforms(SkData::MakeZeroInitialized(fEffect->uniformSize()))
427-
, fChildren(fEffect->children().size()) {}
428-
explicit SkRuntimeEffectBuilder(sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
429-
: fEffect(std::move(effect))
430-
, fUniforms(std::move(uniforms))
431-
, fChildren(fEffect->children().size()) {}
432467

433468
SkRuntimeEffectBuilder(SkRuntimeEffectBuilder&&) = default;
434-
SkRuntimeEffectBuilder(const SkRuntimeEffectBuilder&) = default;
435469

436470
SkRuntimeEffectBuilder& operator=(SkRuntimeEffectBuilder&&) = delete;
437471
SkRuntimeEffectBuilder& operator=(const SkRuntimeEffectBuilder&) = delete;
@@ -447,71 +481,15 @@ class SkRuntimeEffectBuilder {
447481
sk_sp<SkRuntimeEffect> fEffect;
448482
sk_sp<SkData> fUniforms;
449483
std::vector<SkRuntimeEffect::ChildPtr> fChildren;
450-
};
451-
452-
/**
453-
* SkRuntimeShaderBuilder is a utility to simplify creating SkShader objects from SkRuntimeEffects.
454-
*
455-
* NOTE: Like SkRuntimeEffect, this API is experimental and subject to change!
456-
*
457-
* Given an SkRuntimeEffect, the SkRuntimeShaderBuilder manages creating an input data block and
458-
* provides named access to the 'uniform' variables in that block, as well as named access
459-
* to a list of child shader slots. Usage:
460-
*
461-
* sk_sp<SkRuntimeEffect> effect = ...;
462-
* SkRuntimeShaderBuilder builder(effect);
463-
* builder.uniform("some_uniform_float") = 3.14f;
464-
* builder.uniform("some_uniform_matrix") = SkM44::Rotate(...);
465-
* builder.child("some_child_effect") = mySkImage->makeShader(...);
466-
* ...
467-
* sk_sp<SkShader> shader = builder.makeShader(nullptr, false);
468-
*
469-
* Note that SkRuntimeShaderBuilder is built entirely on the public API of SkRuntimeEffect,
470-
* so can be used as-is or serve as inspiration for other interfaces or binding techniques.
471-
*/
472-
class SK_API SkRuntimeShaderBuilder : public SkRuntimeEffectBuilder {
473-
public:
474-
explicit SkRuntimeShaderBuilder(sk_sp<SkRuntimeEffect>);
475-
// This is currently required by Android Framework but may go away if that dependency
476-
// can be removed.
477-
SkRuntimeShaderBuilder(const SkRuntimeShaderBuilder&) = default;
478-
~SkRuntimeShaderBuilder();
479-
480-
sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const;
481-
482-
private:
483-
explicit SkRuntimeShaderBuilder(sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
484-
: SkRuntimeEffectBuilder(std::move(effect), std::move(uniforms)) {}
485484

486485
friend class SkRuntimeImageFilter;
487486
};
488487

489488
/**
490-
* SkRuntimeColorFilterBuilder makes it easy to setup and assign uniforms to runtime color filters.
491-
*/
492-
class SK_API SkRuntimeColorFilterBuilder : public SkRuntimeEffectBuilder {
493-
public:
494-
explicit SkRuntimeColorFilterBuilder(sk_sp<SkRuntimeEffect>);
495-
~SkRuntimeColorFilterBuilder();
496-
497-
SkRuntimeColorFilterBuilder(const SkRuntimeColorFilterBuilder&) = delete;
498-
SkRuntimeColorFilterBuilder& operator=(const SkRuntimeColorFilterBuilder&) = delete;
499-
500-
sk_sp<SkColorFilter> makeColorFilter() const;
501-
};
502-
503-
/**
504-
* SkRuntimeBlendBuilder is a utility to simplify creation and uniform setup of runtime blenders.
489+
* DEPRECATED: Subclass logic has been moved to base class SkRuntimeEffectBuilder.
505490
*/
506-
class SK_API SkRuntimeBlendBuilder : public SkRuntimeEffectBuilder {
507-
public:
508-
explicit SkRuntimeBlendBuilder(sk_sp<SkRuntimeEffect>);
509-
~SkRuntimeBlendBuilder();
510-
511-
SkRuntimeBlendBuilder(const SkRuntimeBlendBuilder&) = delete;
512-
SkRuntimeBlendBuilder& operator=(const SkRuntimeBlendBuilder&) = delete;
513-
514-
sk_sp<SkBlender> makeBlender() const;
515-
};
491+
using SkRuntimeShaderBuilder = SkRuntimeEffectBuilder;
492+
using SkRuntimeColorFilterBuilder = SkRuntimeEffectBuilder;
493+
using SkRuntimeBlendBuilder = SkRuntimeEffectBuilder;
516494

517495
#endif // SkRuntimeEffect_DEFINED

relnotes/skslbuilders.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
A noop change to our SkSL runtime effect builder APIs. Moved make functions from subclasses
2+
SkRuntimeShaderBuilder, SkRuntimeColorFilterBuilder, and SkRuntimeBlendBuilder to the base class
3+
SkRuntimeEffectBuilder.

src/core/SkBlurEngine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
class SkDevice;
2222
class SkRuntimeEffect;
23-
class SkRuntimeShaderBuilder;
23+
class SkRuntimeEffectBuilder;
2424
class SkSpecialImage;
2525
struct SkImageInfo;
2626
struct SkIRect;
@@ -148,7 +148,7 @@ class SkShaderBlurAlgorithm : public SkBlurEngine::Algorithm {
148148
// Create a new surface, which can be approx-fit and have undefined contents.
149149
virtual sk_sp<SkDevice> makeDevice(const SkImageInfo&) const = 0;
150150

151-
sk_sp<SkSpecialImage> renderBlur(SkRuntimeShaderBuilder* blurEffectBuilder,
151+
sk_sp<SkSpecialImage> renderBlur(SkRuntimeEffectBuilder* blurEffectBuilder,
152152
SkFilterMode filter,
153153
SkISize radii,
154154
sk_sp<SkSpecialImage> input,

src/core/SkRuntimeEffect.cpp

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -965,29 +965,14 @@ void SkRuntimeEffect::RegisterFlattenables() {
965965
SkFlattenable::Register("SkRTShader", SkRuntimeShader::CreateProc);
966966
}
967967

968-
SkRuntimeShaderBuilder::SkRuntimeShaderBuilder(sk_sp<SkRuntimeEffect> effect)
969-
: SkRuntimeEffectBuilder(std::move(effect)) {}
970-
971-
SkRuntimeShaderBuilder::~SkRuntimeShaderBuilder() = default;
972-
973-
sk_sp<SkShader> SkRuntimeShaderBuilder::makeShader(const SkMatrix* localMatrix) const {
968+
sk_sp<SkShader> SkRuntimeEffectBuilder::makeShader(const SkMatrix* localMatrix) const {
974969
return this->effect()->makeShader(this->uniforms(), this->children(), localMatrix);
975970
}
976971

977-
SkRuntimeBlendBuilder::SkRuntimeBlendBuilder(sk_sp<SkRuntimeEffect> effect)
978-
: SkRuntimeEffectBuilder(std::move(effect)) {}
979-
980-
SkRuntimeBlendBuilder::~SkRuntimeBlendBuilder() = default;
981-
982-
sk_sp<SkBlender> SkRuntimeBlendBuilder::makeBlender() const {
972+
sk_sp<SkBlender> SkRuntimeEffectBuilder::makeBlender() const {
983973
return this->effect()->makeBlender(this->uniforms(), this->children());
984974
}
985975

986-
SkRuntimeColorFilterBuilder::SkRuntimeColorFilterBuilder(sk_sp<SkRuntimeEffect> effect)
987-
: SkRuntimeEffectBuilder(std::move(effect)) {}
988-
989-
SkRuntimeColorFilterBuilder::~SkRuntimeColorFilterBuilder() = default;
990-
991-
sk_sp<SkColorFilter> SkRuntimeColorFilterBuilder::makeColorFilter() const {
976+
sk_sp<SkColorFilter> SkRuntimeEffectBuilder::makeColorFilter() const {
992977
return this->effect()->makeColorFilter(this->uniforms(), this->children());
993978
}

0 commit comments

Comments
 (0)