19 return stream.detachAsData();
23 return std::string_view(
static_cast<const char*
>(
dump->data()),
dump->size());
30 "Output did not match expectation:\n%.*s",
31 (
int)
dump->size(),
static_cast<const char*
>(
dump->data()));
66 builder.enableExecutionMaskWrites();
70 builder.disableExecutionMaskWrites();
73 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(10,
77R
"(store_src_rg v0..1 = src.rg
78store_src v2..5 = src.rgba
79store_dst v4..7 = dst.rgba
80store_device_xy01 v6..9 = DeviceCoords.xy01
81init_lane_masks CondMask = LoopMask = RetMask = true
82mask_off_return_mask RetMask &= ~(CondMask & LoopMask & RetMask)
83mask_off_loop_mask LoopMask &= ~(CondMask & LoopMask & RetMask)
84reenable_loop_mask LoopMask |= v4
85load_src src.rgba = v1..4
86load_dst dst.rgba = v3..6
90DEF_TEST(RasterPipelineBuilderPushPopMaskRegisters, r) {
95 builder.enableExecutionMaskWrites();
101 builder.merge_condition_mask();
102 builder.merge_inv_condition_mask();
110 builder.pop_and_reenable_loop_mask();
113 builder.disableExecutionMaskWrites();
116 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
120R
"(store_condition_mask $0 = CondMask
121store_loop_mask $1 = LoopMask
122store_return_mask $2 = RetMask
123merge_condition_mask CondMask = $1 & $2
124merge_inv_condition_mask CondMask = $1 & ~$2
125load_condition_mask CondMask = $2
126merge_loop_mask LoopMask &= $1
127store_condition_mask $2 = CondMask
128load_condition_mask CondMask = $2
129load_loop_mask LoopMask = $1
130load_return_mask RetMask = $0
131store_condition_mask $0 = CondMask
132reenable_loop_mask LoopMask |= $0
137DEF_TEST(RasterPipelineBuilderCaseOp, r) {
147 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
151R
"(copy_constant $0 = 0x0000007B (1.723597e-43)
152copy_constant $1 = 0xFFFFFFFF
153case_op if ($0 == 0x0000007B) { LoopMask = true; $1 = false; }
154case_op if ($0 == 0x0000007C) { LoopMask = true; $1 = false; }
158DEF_TEST(RasterPipelineBuilderPushPopSrcDst, r) {
170 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
174R
"(store_src $0..3 = src.rgba
175store_dst $4..7 = dst.rgba
176load_src src.rgba = $4..7
177exchange_src swap(src.rgba, $0..3)
178load_dst dst.rgba = $0..3
182DEF_TEST(RasterPipelineBuilderInvokeChild, r) {
187 builder.invoke_color_filter(2);
190 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
194R
"(invoke_shader invoke_shader 0x00000001
195invoke_color_filter invoke_color_filter 0x00000002
196invoke_blender invoke_blender 0x00000003
200DEF_TEST(RasterPipelineBuilderPushPopTempImmediates, r) {
206 builder.push_constant_f(13.5f);
220 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(1,
224R
"(copy_constant $2 = 0x000003E7 (1.399897e-42)
225copy_constant $0 = 0x41580000 (13.5)
226copy_constant $1 = 0x00000165 (5.002636e-43)
230DEF_TEST(RasterPipelineBuilderPushPopIndirect, r) {
248 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(20,
252R
"(copy_constant $10 = 0x00000003 (4.203895e-45)
253copy_from_indirect_unmasked $0..1 = Indirect(v0..1 + $10)
254copy_from_indirect_unmasked $2..5 = Indirect(v10..13 + $10)
255copy_from_indirect_uniform_unm $6 = Indirect(u0 + $10)
256copy_from_indirect_uniform_unm $7..9 = Indirect(u5..7 + $10)
257swizzle_copy_to_indirect_maske Indirect(v6..8 + $10).zyx = Mask($7..9)
258copy_to_indirect_masked Indirect(v4..6 + $10) = Mask($7..9)
259copy_to_indirect_masked Indirect(v0..4 + $10) = Mask($5..9)
260copy_to_indirect_masked Indirect(v10..14 + $10) = Mask($0..4)
264DEF_TEST(RasterPipelineBuilderCopySlotsMasked, r) {
269 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(9,
273R
"(copy_2_slots_masked v0..1 = Mask(v2..3)
274copy_4_slots_masked v1..4 = Mask(v5..8)
278DEF_TEST(RasterPipelineBuilderCopySlotsUnmasked, r) {
283 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(10,
287R
"(copy_3_slots_unmasked v0..2 = v2..4
288copy_4_slots_unmasked v1..4 = v5..8
289copy_slot_unmasked v5 = v9
293DEF_TEST(RasterPipelineBuilderPushPopSlots, r) {
299 builder.enableExecutionMaskWrites();
303 builder.disableExecutionMaskWrites();
305 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(50,
309R
"(copy_4_slots_unmasked $0..3 = v10..13
310copy_slot_unmasked v5 = $1
311copy_2_slots_unmasked v20..21 = $2..3
312copy_slot_unmasked v4 = $0
313copy_3_slots_unmasked $2..4 = v30..32
314copy_4_slots_masked v0..3 = Mask($0..3)
315copy_slot_masked v4 = Mask($4)
319DEF_TEST(RasterPipelineBuilderDuplicateSelectAndSwizzleSlots, r) {
332 builder.swizzle(4, {3, 2, 1, 0});
336 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(6,
340R
"(splat_4_constants $0..3 = 0x3F800000 (1.0)
341splat_4_constants $4..7 = 0x3F800000 (1.0)
342splat_4_constants $8..11 = 0x3F800000 (1.0)
343copy_4_slots_masked $4..7 = Mask($8..11)
344copy_3_slots_masked $2..4 = Mask($5..7)
345copy_slot_masked $3 = Mask($4)
346swizzle_copy_4_slots_masked (v1..4).wzyx = Mask($0..3)
347swizzle_copy_3_slots_masked (v0..3).xyw = Mask($1..3)
348swizzle_4 $0..3 = ($0..3).wzyx
349swizzle_2 $0..1 = ($0..2).yz
353DEF_TEST(RasterPipelineBuilderTransposeMatrix, r) {
364 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
368R
"(splat_4_constants $0..3 = 0x3F800000 (1.0)
369splat_4_constants $4..7 = 0x3F800000 (1.0)
370splat_4_constants $8..11 = 0x3F800000 (1.0)
371splat_4_constants $12..15 = 0x3F800000 (1.0)
372swizzle_3 $13..15 = ($13..15).yxz
373shuffle $8..15 = ($8..15)[2 5 0 3 6 1 4 7]
374shuffle $1..15 = ($1..15)[3 7 11 0 4 8 12 1 5 9 13 2 6 10 14]
375shuffle $9..15 = ($9..15)[3 0 4 1 5 2 6]
376shuffle $5..15 = ($5..15)[2 5 8 0 3 6 9 1 4 7 10]
380DEF_TEST(RasterPipelineBuilderDiagonalMatrix, r) {
395 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
399R
"(copy_constant $0 = 0
400copy_constant $1 = 0x3F800000 (1.0)
401swizzle_4 $0..3 = ($0..3).yxxy
403copy_constant $1 = 0x40000000 (2.0)
404shuffle $0..15 = ($0..15)[1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]
406copy_constant $1 = 0x40400000 (3.0)
407shuffle $0..5 = ($0..5)[1 0 0 0 1 0]
411DEF_TEST(RasterPipelineBuilderMatrixResize, r) {
418 builder.matrix_resize(2, 2, 4, 4);
419 builder.matrix_resize(4, 4, 2, 2);
420 builder.matrix_resize(2, 2, 2, 4);
421 builder.matrix_resize(2, 4, 4, 2);
422 builder.matrix_resize(4, 2, 3, 3);
424 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
428R
"(copy_constant $0 = 0x3F800000 (1.0)
429copy_constant $1 = 0x40000000 (2.0)
430copy_constant $2 = 0x40400000 (3.0)
431copy_constant $3 = 0x40800000 (4.0)
433copy_constant $5 = 0x3F800000 (1.0)
434shuffle $2..15 = ($2..15)[2 2 0 1 2 2 2 2 3 2 2 2 2 3]
435shuffle $2..3 = ($2..3)[2 3]
437shuffle $2..7 = ($2..7)[2 2 0 1 2 2]
439shuffle $2..7 = ($2..7)[2 3 6 6 6 6]
441copy_constant $9 = 0x3F800000 (1.0)
442shuffle $2..8 = ($2..8)[6 0 1 6 2 3 7]
446DEF_TEST(RasterPipelineBuilderBranches, r) {
449 static constexpr char kExpectationWithKnownExecutionMask[] =
450R
"(jump jump +9 (label 3 at #10)
453label label 0x00000001
455jump jump -4 (label 0 at #2)
456label label 0x00000002
458jump jump -7 (label 0 at #2)
459label label 0x00000003
460branch_if_no_active_lanes_eq branch -4 (label 2 at #7) if no lanes of v2 == 0
461branch_if_no_active_lanes_eq branch -10 (label 0 at #2) if no lanes of v2 == 0x00000001 (1.401298e-45)
463 static constexpr char kExpectationWithExecutionMaskWrites[] =
464R
"(jump jump +10 (label 3 at #11)
467label label 0x00000001
469branch_if_no_lanes_active branch_if_no_lanes_active -2 (label 1 at #4)
470branch_if_all_lanes_active branch_if_all_lanes_active -5 (label 0 at #2)
471label label 0x00000002
473branch_if_any_lanes_active branch_if_any_lanes_active -8 (label 0 at #2)
474label label 0x00000003
475branch_if_no_active_lanes_eq branch -4 (label 2 at #8) if no lanes of v2 == 0
476branch_if_no_active_lanes_eq branch -11 (label 0 at #2) if no lanes of v2 == 0x00000001 (1.401298e-45)
481 static constexpr char kExpectationWithKnownExecutionMask[] =
482R
"(jump jump +11 (label 3 at #12)
485label label 0x00000001
488jump jump -5 (label 0 at #2)
489label label 0x00000002
492jump jump -9 (label 0 at #2)
493label label 0x00000003
495branch_if_no_active_lanes_eq branch -6 (label 2 at #8) if no lanes of v2 == 0
497branch_if_no_active_lanes_eq branch -14 (label 0 at #2) if no lanes of v2 == 0x00000001 (1.401298e-45)
499 static constexpr char kExpectationWithExecutionMaskWrites[] =
500R
"(jump jump +13 (label 3 at #14)
503label label 0x00000001
506branch_if_no_lanes_active branch_if_no_lanes_active -3 (label 1 at #4)
508branch_if_all_lanes_active branch_if_all_lanes_active -7 (label 0 at #2)
509label label 0x00000002
512branch_if_any_lanes_active branch_if_any_lanes_active -11 (label 0 at #2)
513label label 0x00000003
515branch_if_no_active_lanes_eq branch -6 (label 2 at #10) if no lanes of v2 == 0
517branch_if_no_active_lanes_eq branch -16 (label 0 at #2) if no lanes of v2 == 0x00000001 (1.401298e-45)
521 for (
bool enableExecutionMaskWrites : {
false,
true}) {
524 int label1 =
builder.nextLabelID();
525 int label2 =
builder.nextLabelID();
526 int label3 =
builder.nextLabelID();
527 int label4 =
builder.nextLabelID();
529 if (enableExecutionMaskWrites) {
530 builder.enableExecutionMaskWrites();
538 builder.branch_if_no_lanes_active(label2);
539 builder.branch_if_no_lanes_active(label3);
540 builder.branch_if_all_lanes_active(label1);
543 builder.branch_if_any_lanes_active(label1);
544 builder.branch_if_any_lanes_active(label1);
546 builder.branch_if_no_active_lanes_on_stack_top_equal(0, label3);
547 builder.branch_if_no_active_lanes_on_stack_top_equal(0, label2);
548 builder.branch_if_no_active_lanes_on_stack_top_equal(1, label1);
549 builder.branch_if_no_active_lanes_on_stack_top_equal(1, label4);
551 if (enableExecutionMaskWrites) {
552 builder.disableExecutionMaskWrites();
555 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(3,
559 check(r, *program, enableExecutionMaskWrites ? kExpectationWithExecutionMaskWrites
560 : kExpectationWithKnownExecutionMask);
564DEF_TEST(RasterPipelineBuilderBinaryFloatOps, r) {
568 builder.push_constant_f(10.0f);
570 builder.binary_op(BuilderOp::add_n_floats, 1);
571 builder.binary_op(BuilderOp::sub_n_floats, 2);
572 builder.binary_op(BuilderOp::mul_n_floats, 3);
573 builder.binary_op(BuilderOp::div_n_floats, 4);
574 builder.binary_op(BuilderOp::max_n_floats, 3);
575 builder.binary_op(BuilderOp::min_n_floats, 2);
576 builder.binary_op(BuilderOp::cmplt_n_floats, 5);
577 builder.binary_op(BuilderOp::cmple_n_floats, 4);
578 builder.binary_op(BuilderOp::cmpeq_n_floats, 3);
579 builder.binary_op(BuilderOp::cmpne_n_floats, 2);
581 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
585R
"(splat_4_constants $0..3 = 0x41200000 (10.0)
586splat_4_constants $4..7 = 0x41200000 (10.0)
587splat_4_constants $8..11 = 0x41200000 (10.0)
588splat_4_constants $12..15 = 0x41200000 (10.0)
589splat_4_constants $16..19 = 0x41200000 (10.0)
590splat_4_constants $20..23 = 0x41200000 (10.0)
591splat_4_constants $24..27 = 0x41200000 (10.0)
592splat_2_constants $28..29 = 0x41200000 (10.0)
593add_imm_float $29 += 0x41200000 (10.0)
594sub_2_floats $26..27 -= $28..29
595mul_3_floats $22..24 *= $25..27
596div_4_floats $17..20 /= $21..24
597max_3_floats $15..17 = max($15..17, $18..20)
598min_2_floats $14..15 = min($14..15, $16..17)
599cmplt_n_floats $6..10 = lessThan($6..10, $11..15)
600cmple_4_floats $3..6 = lessThanEqual($3..6, $7..10)
601cmpeq_3_floats $1..3 = equal($1..3, $4..6)
602cmpne_2_floats $0..1 = notEqual($0..1, $2..3)
606DEF_TEST(RasterPipelineBuilderBinaryIntOps, r) {
612 builder.binary_op(BuilderOp::bitwise_and_n_ints, 1);
613 builder.binary_op(BuilderOp::bitwise_xor_n_ints, 2);
614 builder.binary_op(BuilderOp::bitwise_or_n_ints, 3);
615 builder.binary_op(BuilderOp::add_n_ints, 2);
616 builder.binary_op(BuilderOp::sub_n_ints, 3);
617 builder.binary_op(BuilderOp::mul_n_ints, 4);
618 builder.binary_op(BuilderOp::div_n_ints, 5);
619 builder.binary_op(BuilderOp::max_n_ints, 4);
620 builder.binary_op(BuilderOp::min_n_ints, 3);
621 builder.binary_op(BuilderOp::cmplt_n_ints, 1);
622 builder.binary_op(BuilderOp::cmple_n_ints, 2);
623 builder.binary_op(BuilderOp::cmpeq_n_ints, 3);
624 builder.binary_op(BuilderOp::cmpne_n_ints, 4);
626 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
630R
"(splat_4_constants $0..3 = 0x0000007B (1.723597e-43)
631splat_4_constants $4..7 = 0x0000007B (1.723597e-43)
632splat_4_constants $8..11 = 0x0000007B (1.723597e-43)
633splat_4_constants $12..15 = 0x0000007B (1.723597e-43)
634splat_4_constants $16..19 = 0x0000007B (1.723597e-43)
635splat_4_constants $20..23 = 0x0000007B (1.723597e-43)
636splat_4_constants $24..27 = 0x0000007B (1.723597e-43)
637splat_4_constants $28..31 = 0x0000007B (1.723597e-43)
638splat_4_constants $32..35 = 0x0000007B (1.723597e-43)
639splat_4_constants $36..39 = 0x0000007B (1.723597e-43)
640bitwise_and_imm_int $39 &= 0x0000007B
641bitwise_xor_2_ints $36..37 ^= $38..39
642bitwise_or_3_ints $32..34 |= $35..37
643add_2_ints $31..32 += $33..34
644sub_3_ints $27..29 -= $30..32
645mul_4_ints $22..25 *= $26..29
646div_n_ints $16..20 /= $21..25
647max_4_ints $13..16 = max($13..16, $17..20)
648min_3_ints $11..13 = min($11..13, $14..16)
649cmplt_int $12 = lessThan($12, $13)
650cmple_2_ints $9..10 = lessThanEqual($9..10, $11..12)
651cmpeq_3_ints $5..7 = equal($5..7, $8..10)
652cmpne_4_ints $0..3 = notEqual($0..3, $4..7)
656DEF_TEST(RasterPipelineBuilderBinaryUIntOps, r) {
662 builder.binary_op(BuilderOp::div_n_uints, 6);
663 builder.binary_op(BuilderOp::cmplt_n_uints, 5);
664 builder.binary_op(BuilderOp::cmple_n_uints, 4);
665 builder.binary_op(BuilderOp::max_n_uints, 3);
666 builder.binary_op(BuilderOp::min_n_uints, 2);
668 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
672R
"(splat_4_constants $0..3 = 0x000001C8 (6.389921e-43)
673splat_4_constants $4..7 = 0x000001C8 (6.389921e-43)
674splat_4_constants $8..11 = 0x000001C8 (6.389921e-43)
675splat_4_constants $12..15 = 0x000001C8 (6.389921e-43)
676splat_4_constants $16..19 = 0x000001C8 (6.389921e-43)
677splat_2_constants $20..21 = 0x000001C8 (6.389921e-43)
678div_n_uints $10..15 /= $16..21
679cmplt_n_uints $6..10 = lessThan($6..10, $11..15)
680cmple_4_uints $3..6 = lessThanEqual($3..6, $7..10)
681max_3_uints $1..3 = max($1..3, $4..6)
682min_2_uints $0..1 = min($0..1, $2..3)
686DEF_TEST(RasterPipelineBuilderUnaryOps, r) {
692 builder.unary_op(BuilderOp::cast_to_float_from_int, 1);
693 builder.unary_op(BuilderOp::cast_to_float_from_uint, 2);
694 builder.unary_op(BuilderOp::cast_to_int_from_float, 3);
695 builder.unary_op(BuilderOp::cast_to_uint_from_float, 4);
696 builder.unary_op(BuilderOp::cos_float, 4);
697 builder.unary_op(BuilderOp::tan_float, 3);
698 builder.unary_op(BuilderOp::sin_float, 2);
699 builder.unary_op(BuilderOp::sqrt_float, 1);
700 builder.unary_op(BuilderOp::abs_int, 2);
701 builder.unary_op(BuilderOp::floor_float, 3);
702 builder.unary_op(BuilderOp::ceil_float, 4);
704 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
708R
"(splat_4_constants $0..3 = 0x000001C8 (6.389921e-43)
709copy_constant $4 = 0x000001C8 (6.389921e-43)
710cast_to_float_from_int $4 = IntToFloat($4)
711cast_to_float_from_2_uints $3..4 = UintToFloat($3..4)
712cast_to_int_from_3_floats $2..4 = FloatToInt($2..4)
713cast_to_uint_from_4_floats $1..4 = FloatToUint($1..4)
714cos_float $1 = cos($1)
715cos_float $2 = cos($2)
716cos_float $3 = cos($3)
717cos_float $4 = cos($4)
718tan_float $2 = tan($2)
719tan_float $3 = tan($3)
720tan_float $4 = tan($4)
721sin_float $3 = sin($3)
722sin_float $4 = sin($4)
723sqrt_float $4 = sqrt($4)
724abs_2_ints $3..4 = abs($3..4)
725floor_3_floats $2..4 = floor($2..4)
726ceil_4_floats $1..4 = ceil($1..4)
730DEF_TEST(RasterPipelineBuilderUniforms, r) {
740 builder.unary_op(BuilderOp::abs_int, 1);
742 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
746R
"(copy_4_uniforms $0..3 = u0..3
747copy_4_uniforms $4..7 = u4..7
748copy_2_uniforms $8..9 = u8..9
749copy_4_uniforms $10..13 = u0..3
751abs_int $14 = abs($14)
755DEF_TEST(RasterPipelineBuilderPushZeros, r) {
765 builder.unary_op(BuilderOp::abs_int, 1);
767 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
771R
"(splat_4_constants $0..3 = 0
772splat_4_constants $4..7 = 0
773splat_4_constants $8..11 = 0
774splat_3_constants $12..14 = 0
775abs_int $14 = abs($14)
779DEF_TEST(RasterPipelineBuilderTernaryFloatOps, r) {
783 builder.push_constant_f(0.75f);
785 builder.ternary_op(BuilderOp::mix_n_floats, 3);
787 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
791R
"(splat_4_constants $0..3 = 0x3F400000 (0.75)
792splat_4_constants $4..7 = 0x3F400000 (0.75)
793copy_constant $8 = 0x3F400000 (0.75)
794mix_3_floats $0..2 = mix($3..5, $6..8, $0..2)
798DEF_TEST(RasterPipelineBuilderAutomaticStackRewinding, r) {
804 builder.unary_op(BuilderOp::abs_int, 1);
806 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(0,
821DEF_TEST(RasterPipelineBuilderTraceOps, r) {
822 for (
bool provideDebugTrace : {
false,
true}) {
825 builder.set_current_stack(123);
837 if (!provideDebugTrace) {
839 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(20,
843R
"(copy_constant $0 = 0xFFFFFFFF
844trace_enter TraceEnter(???) when $0 is true
845trace_scope TraceScope(+1) when $0 is true
846trace_line TraceLine(456) when $0 is true
847trace_var TraceVar(v3..4) when $0 is true
848trace_scope TraceScope(-1) when $0 is true
849trace_exit TraceExit(???) when $0 is true
854 trace.
fFuncInfo = {{
"FunctionA"}, {
"FunctionB"}, {
"FunctionC"}, {
"FunctionD"}};
868 std::unique_ptr<SkSL::RP::Program> program =
builder.finish(20,
873R
"(copy_constant $0 = 0xFFFFFFFF
874trace_enter TraceEnter(FunctionC) when $0 is true
875trace_scope TraceScope(+1) when $0 is true
876trace_line TraceLine(456) when $0 is true
877trace_var TraceVar(Var3, Var4) when $0 is true
878trace_scope TraceScope(-1) when $0 is true
879trace_exit TraceExit(FunctionC) when $0 is true
static SkSL::RP::SlotRange ten_slots_at(SkSL::RP::Slot index)
static SkSL::RP::SlotRange one_slot_at(SkSL::RP::Slot index)
static SkSL::RP::SlotRange three_slots_at(SkSL::RP::Slot index)
static SkSL::RP::SlotRange four_slots_at(SkSL::RP::Slot index)
static std::string_view as_string_view(const sk_sp< SkData > &dump)
static void check(skiatest::Reporter *r, SkSL::RP::Program &program, std::string_view expected)
static sk_sp< SkData > get_program_dump(SkSL::RP::Program &program)
static SkSL::RP::SlotRange five_slots_at(SkSL::RP::Slot index)
DEF_TEST(RasterPipelineBuilder, r)
static SkSL::RP::SlotRange two_slots_at(SkSL::RP::Slot index)
static void dump(const float m[20], SkYUVColorSpace cs, bool rgb2yuv)
#define REPORTER_ASSERT(r, cond,...)
std::vector< FunctionDebugInfo > fFuncInfo
std::vector< SlotDebugInfo > fSlotInfo
void dump(SkWStream *out, bool writeInstructionCount=false) const
constexpr bool contains(std::string_view str, std::string_view needle)