#include "include/effects/SkRuntimeEffect.h"
#include "include/core/SkAlphaType.h"
#include "include/core/SkBlender.h"
#include "include/core/SkCapabilities.h"
#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkData.h"
#include "include/private/base/SkAlign.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkMutex.h"
#include "include/private/base/SkOnce.h"
#include "include/private/base/SkTArray.h"
#include "src/base/SkArenaAlloc.h"
#include "src/base/SkEnumBitMask.h"
#include "src/base/SkNoDestructor.h"
#include "src/core/SkBlenderBase.h"
#include "src/core/SkChecksum.h"
#include "src/core/SkColorSpacePriv.h"
#include "src/core/SkColorSpaceXformSteps.h"
#include "src/core/SkEffectPriv.h"
#include "src/core/SkLRUCache.h"
#include "src/core/SkRasterPipeline.h"
#include "src/core/SkRasterPipelineOpList.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkRuntimeBlender.h"
#include "src/core/SkRuntimeEffectPriv.h"
#include "src/core/SkStreamPriv.h"
#include "src/core/SkWriteBuffer.h"
#include "src/effects/colorfilters/SkColorFilterBase.h"
#include "src/effects/colorfilters/SkRuntimeColorFilter.h"
#include "src/shaders/SkLocalMatrixShader.h"
#include "src/shaders/SkRuntimeShader.h"
#include "src/shaders/SkShaderBase.h"
#include "src/sksl/SkSLAnalysis.h"
#include "src/sksl/SkSLBuiltinTypes.h"
#include "src/sksl/SkSLCompiler.h"
#include "src/sksl/SkSLContext.h"
#include "src/sksl/SkSLDefines.h"
#include "src/sksl/SkSLProgramKind.h"
#include "src/sksl/SkSLProgramSettings.h"
#include "src/sksl/analysis/SkSLProgramUsage.h"
#include "src/sksl/codegen/SkSLRasterPipelineBuilder.h"
#include "src/sksl/codegen/SkSLRasterPipelineCodeGenerator.h"
#include "src/sksl/ir/SkSLFunctionDeclaration.h"
#include "src/sksl/ir/SkSLLayout.h"
#include "src/sksl/ir/SkSLModifierFlags.h"
#include "src/sksl/ir/SkSLProgram.h"
#include "src/sksl/ir/SkSLProgramElement.h"
#include "src/sksl/ir/SkSLStatement.h"
#include "src/sksl/ir/SkSLType.h"
#include "src/sksl/ir/SkSLVarDeclarations.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/tracing/SkSLDebugTracePriv.h"
#include "src/sksl/transform/SkSLTransform.h"
#include <algorithm>
usingnamespaceskia_private;
class SkColorSpace;
struct SkIPoint;
constexpr bool kRPEnableLiveTrace = …;
ChildType;
static bool init_uniform_type(const SkSL::Context& ctx,
const SkSL::Type* type,
SkRuntimeEffect::Uniform* v) { … }
SkRuntimeEffect::Uniform SkRuntimeEffectPriv::VarAsUniform(const SkSL::Variable& var,
const SkSL::Context& context,
size_t* offset) { … }
static ChildType child_type(const SkSL::Type& type) { … }
const char* SkRuntimeEffectPriv::ChildTypeToStr(ChildType type) { … }
SkRuntimeEffect::Child SkRuntimeEffectPriv::VarAsChild(const SkSL::Variable& var, int index) { … }
sk_sp<const SkData> SkRuntimeEffectPriv::TransformUniforms(
SkSpan<const SkRuntimeEffect::Uniform> uniforms,
sk_sp<const SkData> originalData,
const SkColorSpace* dstCS) { … }
sk_sp<const SkData> SkRuntimeEffectPriv::TransformUniforms(
SkSpan<const SkRuntimeEffect::Uniform> uniforms,
sk_sp<const SkData> originalData,
const SkColorSpaceXformSteps& steps) { … }
const SkSL::RP::Program* SkRuntimeEffect::getRPProgram(SkSL::DebugTracePriv* debugTrace) const { … }
SkSpan<const float> SkRuntimeEffectPriv::UniformsAsSpan(
SkSpan<const SkRuntimeEffect::Uniform> uniforms,
sk_sp<const SkData> originalData,
bool alwaysCopyIntoAlloc,
const SkColorSpace* destColorSpace,
SkArenaAlloc* alloc) { … }
bool RuntimeEffectRPCallbacks::appendShader(int index) { … }
bool RuntimeEffectRPCallbacks::appendColorFilter(int index) { … }
bool RuntimeEffectRPCallbacks::appendBlender(int index) { … }
void RuntimeEffectRPCallbacks::toLinearSrgb(const void* color) { … }
void RuntimeEffectRPCallbacks::fromLinearSrgb(const void* color) { … }
void RuntimeEffectRPCallbacks::applyColorSpaceXform(const SkColorSpaceXformSteps& tempXform,
const void* color) { … }
bool SkRuntimeEffectPriv::CanDraw(const SkCapabilities* caps, const SkSL::Program* program) { … }
bool SkRuntimeEffectPriv::CanDraw(const SkCapabilities* caps, const SkRuntimeEffect* effect) { … }
static bool flattenable_is_valid_as_child(const SkFlattenable* f) { … }
SkRuntimeEffect::ChildPtr::ChildPtr(sk_sp<SkFlattenable> f) : … { … }
static bool verify_child_effects(const std::vector<SkRuntimeEffect::Child>& reflected,
SkSpan<const SkRuntimeEffect::ChildPtr> effectPtrs) { … }
bool SkRuntimeEffectPriv::ReadChildEffects(SkReadBuffer& buffer,
const SkRuntimeEffect* effect,
TArray<SkRuntimeEffect::ChildPtr>* children) { … }
void SkRuntimeEffectPriv::WriteChildEffects(
SkWriteBuffer& buffer, SkSpan<const SkRuntimeEffect::ChildPtr> children) { … }
SkSL::ProgramSettings SkRuntimeEffect::MakeSettings(const Options& options) { … }
#define RETURN_FAILURE …
SkRuntimeEffect::Result SkRuntimeEffect::MakeFromSource(SkString sksl,
const Options& options,
SkSL::ProgramKind kind) { … }
SkRuntimeEffect::Result SkRuntimeEffect::MakeInternal(std::unique_ptr<SkSL::Program> program,
const Options& options,
SkSL::ProgramKind kind) { … }
sk_sp<SkRuntimeEffect> SkRuntimeEffect::makeUnoptimizedClone() { … }
SkRuntimeEffect::Result SkRuntimeEffect::MakeForColorFilter(SkString sksl, const Options& options) { … }
SkRuntimeEffect::Result SkRuntimeEffect::MakeForShader(SkString sksl, const Options& options) { … }
SkRuntimeEffect::Result SkRuntimeEffect::MakeForBlender(SkString sksl, const Options& options) { … }
sk_sp<SkRuntimeEffect> SkMakeCachedRuntimeEffect(
SkRuntimeEffect::Result (*make)(SkString sksl, const SkRuntimeEffect::Options&),
SkString sksl) { … }
static size_t uniform_element_size(SkRuntimeEffect::Uniform::Type type) { … }
size_t SkRuntimeEffect::Uniform::sizeInBytes() const { … }
SkRuntimeEffect::SkRuntimeEffect(std::unique_ptr<SkSL::Program> baseProgram,
const Options& options,
const SkSL::FunctionDefinition& main,
std::vector<Uniform>&& uniforms,
std::vector<Child>&& children,
std::vector<SkSL::SampleUsage>&& sampleUsages,
uint32_t flags)
: … { … }
SkRuntimeEffect::~SkRuntimeEffect() = default;
const std::string& SkRuntimeEffect::source() const { … }
size_t SkRuntimeEffect::uniformSize() const { … }
const SkRuntimeEffect::Uniform* SkRuntimeEffect::findUniform(std::string_view name) const { … }
const SkRuntimeEffect::Child* SkRuntimeEffect::findChild(std::string_view name) const { … }
sk_sp<SkShader> SkRuntimeEffectPriv::MakeDeferredShader(
const SkRuntimeEffect* effect,
UniformsCallback uniformsCallback,
SkSpan<const SkRuntimeEffect::ChildPtr> children,
const SkMatrix* localMatrix) { … }
sk_sp<SkShader> SkRuntimeEffect::makeShader(sk_sp<const SkData> uniforms,
sk_sp<SkShader> childShaders[],
size_t childCount,
const SkMatrix* localMatrix) const { … }
sk_sp<SkShader> SkRuntimeEffect::makeShader(sk_sp<const SkData> uniforms,
SkSpan<const ChildPtr> children,
const SkMatrix* localMatrix) const { … }
sk_sp<SkColorFilter> SkRuntimeEffect::makeColorFilter(sk_sp<const SkData> uniforms,
sk_sp<SkColorFilter> childColorFilters[],
size_t childCount) const { … }
sk_sp<SkColorFilter> SkRuntimeEffect::makeColorFilter(sk_sp<const SkData> uniforms,
SkSpan<const ChildPtr> children) const { … }
sk_sp<SkColorFilter> SkRuntimeEffect::makeColorFilter(sk_sp<const SkData> uniforms) const { … }
sk_sp<SkBlender> SkRuntimeEffect::makeBlender(sk_sp<const SkData> uniforms,
SkSpan<const ChildPtr> children) const { … }
SkRuntimeEffect::TracedShader SkRuntimeEffect::MakeTraced(sk_sp<SkShader> shader,
const SkIPoint& traceCoord) { … }
std::optional<ChildType> SkRuntimeEffect::ChildPtr::type() const { … }
SkShader* SkRuntimeEffect::ChildPtr::shader() const { … }
SkColorFilter* SkRuntimeEffect::ChildPtr::colorFilter() const { … }
SkBlender* SkRuntimeEffect::ChildPtr::blender() const { … }
void SkRuntimeEffect::RegisterFlattenables() { … }
SkRuntimeShaderBuilder::SkRuntimeShaderBuilder(sk_sp<SkRuntimeEffect> effect)
: … { … }
SkRuntimeShaderBuilder::~SkRuntimeShaderBuilder() = default;
sk_sp<SkShader> SkRuntimeShaderBuilder::makeShader(const SkMatrix* localMatrix) const { … }
SkRuntimeBlendBuilder::SkRuntimeBlendBuilder(sk_sp<SkRuntimeEffect> effect)
: … { … }
SkRuntimeBlendBuilder::~SkRuntimeBlendBuilder() = default;
sk_sp<SkBlender> SkRuntimeBlendBuilder::makeBlender() const { … }
SkRuntimeColorFilterBuilder::SkRuntimeColorFilterBuilder(sk_sp<SkRuntimeEffect> effect)
: … { … }
SkRuntimeColorFilterBuilder::~SkRuntimeColorFilterBuilder() = default;
sk_sp<SkColorFilter> SkRuntimeColorFilterBuilder::makeColorFilter() const { … }