81 return {condition,
value};
90 return {condition,
value};
94 std::unique_ptr<GrFragmentProcessor>
child;
97 return {std::move(child)};
124 std::unique_ptr<GrFragmentProcessor> inputFP,
125 std::unique_ptr<GrFragmentProcessor> destColorFP,
127 SkSpan<std::unique_ptr<GrFragmentProcessor>> childFPs);
157 template <
typename... Args>
160 std::unique_ptr<GrFragmentProcessor> inputFP,
164 checkArgs(effect->fUniforms.begin(),
165 effect->fUniforms.end(),
166 effect->fChildren.begin(),
167 effect->fChildren.end(),
168 std::forward<Args>(
args)...);
173 SkASSERT(!effect->usesColorTransform());
175 size_t uniformPayloadSize = UniformPayloadSize(effect);
176 std::unique_ptr<GrSkSLFP> fp(
new (uniformPayloadSize)
GrSkSLFP(
sk_ref_sp(effect),
178 fp->appendArgs(fp->uniformData(), fp->specialized(), std::forward<Args>(
args)...);
180 fp->setInput(std::move(inputFP));
185 const char*
name()
const override {
return fName; }
186 std::unique_ptr<GrFragmentProcessor>
clone()
const override;
196 void addChild(std::unique_ptr<GrFragmentProcessor> child,
bool mergeOptFlags);
197 void setInput(std::unique_ptr<GrFragmentProcessor> input);
198 void setDestColorFP(std::unique_ptr<GrFragmentProcessor> destColorFP);
199 void addColorTransformChildren(
SkColorSpace* dstColorSpace);
209 size_t uniformCount()
const {
return fEffect->
uniforms().size(); }
217 const uint8_t* uniformData()
const {
return reinterpret_cast<const uint8_t*
>(
this + 1); }
218 uint8_t* uniformData() {
return reinterpret_cast< uint8_t*
>(
this + 1); }
222 const Specialized* specialized()
const {
223 return reinterpret_cast<const Specialized*
>(this->uniformData() + fUniformSize);
225 Specialized* specialized() {
226 return reinterpret_cast<Specialized*
>(this->uniformData() + fUniformSize);
231 void appendArgs(uint8_t* uniformDataPtr, Specialized* specializedPtr) {
234 template <
typename... Args>
235 void appendArgs(uint8_t* uniformDataPtr,
236 Specialized* specializedPtr,
238 std::unique_ptr<GrFragmentProcessor>&& child,
239 Args&&... remainder) {
242 this->addChild(std::move(child),
true);
243 this->appendArgs(uniformDataPtr, specializedPtr, std::forward<Args>(remainder)...);
246 template <
typename... Args>
247 void appendArgs(uint8_t* uniformDataPtr,
248 Specialized* specializedPtr,
250 GrIgnoreOptFlags&& child,
251 Args&&... remainder) {
254 this->addChild(std::move(child.child),
false);
255 this->appendArgs(uniformDataPtr, specializedPtr, std::forward<Args>(remainder)...);
257 template <
typename T,
typename... Args>
258 void appendArgs(uint8_t* uniformDataPtr,
259 Specialized* specializedPtr,
261 const GrSpecializedUniform<T>& val,
262 Args&&... remainder) {
268 if (val.specialize) {
269 *specializedPtr = Specialized::kYes;
272 uniformDataPtr, specializedPtr,
name, val.value, std::forward<Args>(remainder)...);
274 template <
typename T,
typename... Args>
275 void appendArgs(uint8_t* uniformDataPtr,
276 Specialized* specializedPtr,
278 const GrOptionalUniform<T>& val,
279 Args&&... remainder) {
283 memcpy(uniformDataPtr, &val.value,
sizeof(val.value));
284 uniformDataPtr +=
sizeof(val.value);
288 this->appendArgs(uniformDataPtr, specializedPtr, std::forward<Args>(remainder)...);
290 template <
typename T,
typename... Args>
291 void appendArgs(uint8_t* uniformDataPtr,
292 Specialized* specializedPtr,
295 Args&&... remainder) {
301 this->appendArgs(uniformDataPtr, specializedPtr, std::forward<Args>(remainder)...);
303 template <
typename T,
typename... Args>
304 void appendArgs(uint8_t* uniformDataPtr,
305 Specialized* specializedPtr,
308 Args&&... remainder) {
311 memcpy(uniformDataPtr, &val,
sizeof(val));
312 uniformDataPtr +=
sizeof(val);
314 this->appendArgs(uniformDataPtr, specializedPtr, std::forward<Args>(remainder)...);
318 using child_iterator = std::vector<SkRuntimeEffect::Child>::const_iterator;
319 using uniform_iterator = std::vector<SkRuntimeEffect::Uniform>::const_iterator;
322 static void checkArgs(uniform_iterator uIter,
323 uniform_iterator uEnd,
324 child_iterator cIter,
325 child_iterator cEnd) {
327 "Expected more uniforms, starting with '%.*s'",
328 (
int)uIter->name.size(), uIter->name.data());
329 SkASSERTF(cIter == cEnd,
"Expected more children, starting with '%.*s'",
330 (
int)cIter->name.size(), cIter->name.data());
332 static void checkOneChild(child_iterator cIter, child_iterator cEnd,
const char*
name) {
333 SkASSERTF(cIter != cEnd,
"Too many children, wasn't expecting '%s'",
name);
335 "Expected child '%.*s', got '%s' instead",
336 (
int)cIter->name.size(), cIter->name.data(),
name);
338 template <
typename... Args>
339 static void checkArgs(uniform_iterator uIter,
340 uniform_iterator uEnd,
341 child_iterator cIter,
344 std::unique_ptr<GrFragmentProcessor>&& child,
345 Args&&... remainder) {
349 checkOneChild(cIter, cEnd,
name);
350 checkArgs(uIter, uEnd, ++cIter, cEnd, std::forward<Args>(remainder)...);
352 template <
typename... Args>
353 static void checkArgs(uniform_iterator uIter,
354 uniform_iterator uEnd,
355 child_iterator cIter,
358 GrIgnoreOptFlags&& child,
359 Args&&... remainder) {
363 checkOneChild(cIter, cEnd,
name);
364 checkArgs(uIter, uEnd, ++cIter, cEnd, std::forward<Args>(remainder)...);
366 template <
typename T,
typename... Args>
367 static void checkArgs(uniform_iterator uIter,
368 uniform_iterator uEnd,
369 child_iterator cIter,
372 const GrSpecializedUniform<T>& val,
373 Args&&... remainder) {
374 static_assert(!std::is_array<T>::value);
375 checkArgs(uIter, uEnd, cIter, cEnd,
name, val.value, std::forward<Args>(remainder)...);
377 template <
typename T,
typename... Args>
378 static void checkArgs(uniform_iterator uIter,
379 uniform_iterator uEnd,
380 child_iterator cIter,
383 const GrOptionalUniform<T>& val,
384 Args&&... remainder) {
386 checkArgs(uIter, uEnd, cIter, cEnd,
name, val.value, std::forward<Args>(remainder)...);
388 checkArgs(uIter, uEnd, cIter, cEnd, std::forward<Args>(remainder)...);
391 template <
typename T>
392 static void checkOneUniform(uniform_iterator uIter,
393 uniform_iterator uEnd,
397 SkASSERTF(uIter != uEnd,
"Too many uniforms, wasn't expecting '%s'",
name);
399 "Expected uniform '%.*s', got '%s' instead",
400 (
int)uIter->name.size(), uIter->name.data(),
name);
401 SkASSERTF(uIter->sizeInBytes() == valSize,
402 "Expected uniform '%s' to be %zu bytes, got %zu instead",
403 name, uIter->sizeInBytes(), valSize);
405 "Wrong type for uniform '%s'",
408 template <
typename T,
typename... Args>
409 static void checkArgs(uniform_iterator uIter,
410 uniform_iterator uEnd,
411 child_iterator cIter,
415 Args&&... remainder) {
417 checkArgs(++uIter, uEnd, cIter, cEnd, std::forward<Args>(remainder)...);
419 template <
typename T,
typename... Args>
420 static void checkArgs(uniform_iterator uIter,
421 uniform_iterator uEnd,
422 child_iterator cIter,
426 Args&&... remainder) {
427 checkOneUniform(uIter, uEnd,
name, &val,
sizeof(val));
428 checkArgs(++uIter, uEnd, cIter, cEnd, std::forward<Args>(remainder)...);
434 uint32_t fUniformSize;
435 int fInputChildIndex = -1;
436 int fDestColorChildIndex = -1;
437 int fToLinearSrgbChildIndex = -1;
438 int fFromLinearSrgbChildIndex = -1;