1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterPipeline.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLCompiler.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramKind.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLString.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLUtil.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/codegen/SkSLRasterPipelineBuilder.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/codegen/SkSLRasterPipelineCodeGenerator.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLFunctionDeclaration.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgram.h" // IWYU pragma: keep
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/tracing/SkSLDebugTracePlayer.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/tracing/SkSLDebugTracePriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
25*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
26*c8dee2aaSAndroid Build Coastguard Worker #include <string>
27*c8dee2aaSAndroid Build Coastguard Worker #include <unordered_map>
28*c8dee2aaSAndroid Build Coastguard Worker #include <unordered_set>
29*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
30*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker using LineNumberMap = SkSL::SkSLDebugTracePlayer::LineNumberMap;
33*c8dee2aaSAndroid Build Coastguard Worker
make_trace(skiatest::Reporter * r,std::string src)34*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkSL::DebugTracePriv> make_trace(skiatest::Reporter* r,
35*c8dee2aaSAndroid Build Coastguard Worker std::string src) {
36*c8dee2aaSAndroid Build Coastguard Worker auto debugTrace = sk_make_sp<SkSL::DebugTracePriv>();
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker SkSL::Compiler compiler;
39*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramSettings settings;
40*c8dee2aaSAndroid Build Coastguard Worker settings.fOptimize = false;
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::Program> program =
43*c8dee2aaSAndroid Build Coastguard Worker compiler.convertProgram(SkSL::ProgramKind::kRuntimeShader, std::move(src), settings);
44*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, program);
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker if (program) {
47*c8dee2aaSAndroid Build Coastguard Worker const SkSL::FunctionDeclaration* main = program->getFunction("main");
48*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, main);
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker if (main) {
51*c8dee2aaSAndroid Build Coastguard Worker // Compile our program.
52*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc alloc(/*firstHeapAllocation=*/1000);
53*c8dee2aaSAndroid Build Coastguard Worker SkRasterPipeline pipeline(&alloc);
54*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::RP::Program> rasterProg = SkSL::MakeRasterPipelineProgram(
55*c8dee2aaSAndroid Build Coastguard Worker *program, *main->definition(), debugTrace.get(), /*writeTraceOps=*/true);
56*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, rasterProg);
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker if (rasterProg) {
59*c8dee2aaSAndroid Build Coastguard Worker // Append the SkSL program to the raster pipeline, and run it at xy=(0.5, 0.5).
60*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kCoordinates[4] = {0.5f, 0.5f, 0.0f, 1.0f};
61*c8dee2aaSAndroid Build Coastguard Worker pipeline.appendConstantColor(&alloc, kCoordinates);
62*c8dee2aaSAndroid Build Coastguard Worker rasterProg->appendStages(&pipeline,
63*c8dee2aaSAndroid Build Coastguard Worker &alloc,
64*c8dee2aaSAndroid Build Coastguard Worker /*callbacks=*/nullptr,
65*c8dee2aaSAndroid Build Coastguard Worker /*uniforms=*/{});
66*c8dee2aaSAndroid Build Coastguard Worker pipeline.run(0, 0, 1, 1);
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker }
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker return debugTrace;
72*c8dee2aaSAndroid Build Coastguard Worker }
73*c8dee2aaSAndroid Build Coastguard Worker
make_stack_string(const SkSL::DebugTracePriv & trace,const SkSL::SkSLDebugTracePlayer & player)74*c8dee2aaSAndroid Build Coastguard Worker static std::string make_stack_string(const SkSL::DebugTracePriv& trace,
75*c8dee2aaSAndroid Build Coastguard Worker const SkSL::SkSLDebugTracePlayer& player) {
76*c8dee2aaSAndroid Build Coastguard Worker std::vector<int> callStack = player.getCallStack();
77*c8dee2aaSAndroid Build Coastguard Worker std::string text;
78*c8dee2aaSAndroid Build Coastguard Worker const char* separator = "";
79*c8dee2aaSAndroid Build Coastguard Worker for (int frame : callStack) {
80*c8dee2aaSAndroid Build Coastguard Worker text += separator;
81*c8dee2aaSAndroid Build Coastguard Worker separator = " -> ";
82*c8dee2aaSAndroid Build Coastguard Worker
83*c8dee2aaSAndroid Build Coastguard Worker if (frame >= 0 && (size_t)frame < trace.fFuncInfo.size()) {
84*c8dee2aaSAndroid Build Coastguard Worker text += trace.fFuncInfo[frame].name;
85*c8dee2aaSAndroid Build Coastguard Worker } else {
86*c8dee2aaSAndroid Build Coastguard Worker text += "???";
87*c8dee2aaSAndroid Build Coastguard Worker }
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker return text;
91*c8dee2aaSAndroid Build Coastguard Worker }
92*c8dee2aaSAndroid Build Coastguard Worker
make_vars_string(const SkSL::DebugTracePriv & trace,const std::vector<SkSL::SkSLDebugTracePlayer::VariableData> & vars)93*c8dee2aaSAndroid Build Coastguard Worker static std::string make_vars_string(
94*c8dee2aaSAndroid Build Coastguard Worker const SkSL::DebugTracePriv& trace,
95*c8dee2aaSAndroid Build Coastguard Worker const std::vector<SkSL::SkSLDebugTracePlayer::VariableData>& vars) {
96*c8dee2aaSAndroid Build Coastguard Worker std::string text;
97*c8dee2aaSAndroid Build Coastguard Worker auto separator = SkSL::String::Separator();
98*c8dee2aaSAndroid Build Coastguard Worker for (const SkSL::SkSLDebugTracePlayer::VariableData& var : vars) {
99*c8dee2aaSAndroid Build Coastguard Worker text += separator();
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker if (var.fSlotIndex < 0 || (size_t)var.fSlotIndex >= trace.fSlotInfo.size()) {
102*c8dee2aaSAndroid Build Coastguard Worker text += "???";
103*c8dee2aaSAndroid Build Coastguard Worker continue;
104*c8dee2aaSAndroid Build Coastguard Worker }
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker const SkSL::SlotDebugInfo& slot = trace.fSlotInfo[var.fSlotIndex];
107*c8dee2aaSAndroid Build Coastguard Worker text += var.fDirty ? "##" : "";
108*c8dee2aaSAndroid Build Coastguard Worker text += slot.name;
109*c8dee2aaSAndroid Build Coastguard Worker text += trace.getSlotComponentSuffix(var.fSlotIndex);
110*c8dee2aaSAndroid Build Coastguard Worker text += " = ";
111*c8dee2aaSAndroid Build Coastguard Worker text += trace.slotValueToString(var.fSlotIndex, var.fValue);
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
114*c8dee2aaSAndroid Build Coastguard Worker return text;
115*c8dee2aaSAndroid Build Coastguard Worker }
116*c8dee2aaSAndroid Build Coastguard Worker
make_local_vars_string(const SkSL::DebugTracePriv & trace,const SkSL::SkSLDebugTracePlayer & player)117*c8dee2aaSAndroid Build Coastguard Worker static std::string make_local_vars_string(const SkSL::DebugTracePriv& trace,
118*c8dee2aaSAndroid Build Coastguard Worker const SkSL::SkSLDebugTracePlayer& player) {
119*c8dee2aaSAndroid Build Coastguard Worker int frame = player.getStackDepth() - 1;
120*c8dee2aaSAndroid Build Coastguard Worker return make_vars_string(trace, player.getLocalVariables(frame));
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker
make_global_vars_string(const SkSL::DebugTracePriv & trace,const SkSL::SkSLDebugTracePlayer & player)123*c8dee2aaSAndroid Build Coastguard Worker static std::string make_global_vars_string(const SkSL::DebugTracePriv& trace,
124*c8dee2aaSAndroid Build Coastguard Worker const SkSL::SkSLDebugTracePlayer& player) {
125*c8dee2aaSAndroid Build Coastguard Worker return make_vars_string(trace, player.getGlobalVariables());
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerCanResetToNull,r)128*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerCanResetToNull, r) {
129*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
130*c8dee2aaSAndroid Build Coastguard Worker player.reset(nullptr);
131*c8dee2aaSAndroid Build Coastguard Worker
132*c8dee2aaSAndroid Build Coastguard Worker // We should be in a reasonable state.
133*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() == 0);
134*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
135*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
136*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
137*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
138*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLineNumbersReached().empty());
139*c8dee2aaSAndroid Build Coastguard Worker }
140*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerHelloWorld,r)141*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerHelloWorld, r) {
142*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
143*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
144*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
145*c8dee2aaSAndroid Build Coastguard Worker return half4(2 + 2); // Line 3
146*c8dee2aaSAndroid Build Coastguard Worker } // Line 4
147*c8dee2aaSAndroid Build Coastguard Worker )");
148*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
149*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
150*c8dee2aaSAndroid Build Coastguard Worker
151*c8dee2aaSAndroid Build Coastguard Worker // We have not started tracing yet.
152*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() == 0);
153*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
154*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
155*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
156*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
157*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLineNumbersReached() == LineNumberMap({{3, 1}}));
158*c8dee2aaSAndroid Build Coastguard Worker
159*c8dee2aaSAndroid Build Coastguard Worker player.step();
160*c8dee2aaSAndroid Build Coastguard Worker
161*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside main.
162*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() > 0);
163*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
164*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
165*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
166*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
167*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLocalVariables(0).size() == 2); // xy
168*c8dee2aaSAndroid Build Coastguard Worker
169*c8dee2aaSAndroid Build Coastguard Worker player.step();
170*c8dee2aaSAndroid Build Coastguard Worker
171*c8dee2aaSAndroid Build Coastguard Worker // We have now completed the trace.
172*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() > 0);
173*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
174*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
175*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
176*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
177*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
178*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 4, ##[main].result.y = 4, ##[main].result.z = "
179*c8dee2aaSAndroid Build Coastguard Worker "4, ##[main].result.w = 4");
180*c8dee2aaSAndroid Build Coastguard Worker }
181*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerReset,r)182*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerReset, r) {
183*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
184*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
185*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
186*c8dee2aaSAndroid Build Coastguard Worker return half4(2 + 2); // Line 3
187*c8dee2aaSAndroid Build Coastguard Worker } // Line 4
188*c8dee2aaSAndroid Build Coastguard Worker )");
189*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
190*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
191*c8dee2aaSAndroid Build Coastguard Worker
192*c8dee2aaSAndroid Build Coastguard Worker // We have not started tracing yet.
193*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() == 0);
194*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
195*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
196*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
197*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker player.step();
200*c8dee2aaSAndroid Build Coastguard Worker
201*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside main.
202*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() > 0);
203*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
204*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
205*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
206*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLocalVariables(0).size() == 2); // xy
207*c8dee2aaSAndroid Build Coastguard Worker
208*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker // We should be back to square one.
211*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() == 0);
212*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
213*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
214*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
215*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
216*c8dee2aaSAndroid Build Coastguard Worker }
217*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerFunctions,r)218*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerFunctions, r) {
219*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
220*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
221*c8dee2aaSAndroid Build Coastguard Worker int fnB() { // Line 2
222*c8dee2aaSAndroid Build Coastguard Worker return 2 + 2; // Line 3
223*c8dee2aaSAndroid Build Coastguard Worker } // Line 4
224*c8dee2aaSAndroid Build Coastguard Worker int fnA() { // Line 5
225*c8dee2aaSAndroid Build Coastguard Worker return fnB(); // Line 6
226*c8dee2aaSAndroid Build Coastguard Worker } // Line 7
227*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 8
228*c8dee2aaSAndroid Build Coastguard Worker return half4(fnA()); // Line 9
229*c8dee2aaSAndroid Build Coastguard Worker } // Line 10
230*c8dee2aaSAndroid Build Coastguard Worker )");
231*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
232*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
233*c8dee2aaSAndroid Build Coastguard Worker
234*c8dee2aaSAndroid Build Coastguard Worker // We have not started tracing yet.
235*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.cursor() == 0);
236*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
237*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
238*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
239*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
240*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLineNumbersReached() == LineNumberMap({{3, 1}, {6, 1}, {9, 1}}));
241*c8dee2aaSAndroid Build Coastguard Worker
242*c8dee2aaSAndroid Build Coastguard Worker player.step();
243*c8dee2aaSAndroid Build Coastguard Worker
244*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside main.
245*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
246*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
247*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
248*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getGlobalVariables().empty());
249*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getLocalVariables(0).size() == 2); // xy
250*c8dee2aaSAndroid Build Coastguard Worker
251*c8dee2aaSAndroid Build Coastguard Worker player.stepOver();
252*c8dee2aaSAndroid Build Coastguard Worker
253*c8dee2aaSAndroid Build Coastguard Worker // We should now have completed execution.
254*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
255*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == -1);
256*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCallStack().empty());
257*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
258*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
259*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 4, ##[main].result.y = 4, ##[main].result.z = "
260*c8dee2aaSAndroid Build Coastguard Worker "4, ##[main].result.w = 4");
261*c8dee2aaSAndroid Build Coastguard Worker
262*c8dee2aaSAndroid Build Coastguard Worker // Watch the stack grow and shrink as single-step.
263*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
264*c8dee2aaSAndroid Build Coastguard Worker player.step();
265*c8dee2aaSAndroid Build Coastguard Worker
266*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
267*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(0) == 9);
268*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
269*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_global_vars_string(*trace, player) == "");
270*c8dee2aaSAndroid Build Coastguard Worker player.step();
271*c8dee2aaSAndroid Build Coastguard Worker
272*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fnA()");
273*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(0) == 9);
274*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(1) == 6);
275*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "");
276*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_global_vars_string(*trace, player) == "");
277*c8dee2aaSAndroid Build Coastguard Worker player.step();
278*c8dee2aaSAndroid Build Coastguard Worker
279*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
280*c8dee2aaSAndroid Build Coastguard Worker r,
281*c8dee2aaSAndroid Build Coastguard Worker make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fnA() -> int fnB()");
282*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "");
283*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_global_vars_string(*trace, player) == "");
284*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(0) == 9);
285*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(1) == 6);
286*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLineInStackFrame(2) == 3);
287*c8dee2aaSAndroid Build Coastguard Worker player.step();
288*c8dee2aaSAndroid Build Coastguard Worker
289*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fnA()");
290*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##[fnB].result = 4");
291*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_global_vars_string(*trace, player) == "");
292*c8dee2aaSAndroid Build Coastguard Worker player.step();
293*c8dee2aaSAndroid Build Coastguard Worker
294*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
295*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
296*c8dee2aaSAndroid Build Coastguard Worker r,
297*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##[fnA].result = 4, xy.x = 0.5, xy.y = 0.5");
298*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_global_vars_string(*trace, player) == "");
299*c8dee2aaSAndroid Build Coastguard Worker
300*c8dee2aaSAndroid Build Coastguard Worker player.step();
301*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
302*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
303*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
304*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 4, ##[main].result.y = 4, ##[main].result.z = "
305*c8dee2aaSAndroid Build Coastguard Worker "4, ##[main].result.w = 4");
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerVariables,r)308*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerVariables, r) {
309*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
310*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
311*c8dee2aaSAndroid Build Coastguard Worker float func() { // Line 2
312*c8dee2aaSAndroid Build Coastguard Worker float x = 4, y = 5, z = 6; // Line 3
313*c8dee2aaSAndroid Build Coastguard Worker return z; // Line 4
314*c8dee2aaSAndroid Build Coastguard Worker } // Line 5
315*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 6
316*c8dee2aaSAndroid Build Coastguard Worker int a = 123; // Line 7
317*c8dee2aaSAndroid Build Coastguard Worker bool b = true; // Line 8
318*c8dee2aaSAndroid Build Coastguard Worker func(); // Line 9
319*c8dee2aaSAndroid Build Coastguard Worker float4 c = float4(0, 0.5, 1, -1); // Line 10
320*c8dee2aaSAndroid Build Coastguard Worker float3x3 d = float3x3(2); // Line 11
321*c8dee2aaSAndroid Build Coastguard Worker return half4(a); // Line 12
322*c8dee2aaSAndroid Build Coastguard Worker } // Line 13
323*c8dee2aaSAndroid Build Coastguard Worker )");
324*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
325*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
326*c8dee2aaSAndroid Build Coastguard Worker
327*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
328*c8dee2aaSAndroid Build Coastguard Worker r,
329*c8dee2aaSAndroid Build Coastguard Worker player.getLineNumbersReached() ==
330*c8dee2aaSAndroid Build Coastguard Worker LineNumberMap(
331*c8dee2aaSAndroid Build Coastguard Worker {{3, 1}, {4, 1}, {7, 1}, {8, 1}, {9, 1}, {10, 1}, {11, 1}, {12, 1}}));
332*c8dee2aaSAndroid Build Coastguard Worker player.step();
333*c8dee2aaSAndroid Build Coastguard Worker
334*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
335*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
336*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
337*c8dee2aaSAndroid Build Coastguard Worker player.step();
338*c8dee2aaSAndroid Build Coastguard Worker
339*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
340*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
341*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
342*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##a = 123, xy.x = 0.5, xy.y = 0.5");
343*c8dee2aaSAndroid Build Coastguard Worker player.step();
344*c8dee2aaSAndroid Build Coastguard Worker
345*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
346*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
347*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
348*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
349*c8dee2aaSAndroid Build Coastguard Worker "##b = true, a = 123, xy.x = 0.5, xy.y = 0.5");
350*c8dee2aaSAndroid Build Coastguard Worker player.step();
351*c8dee2aaSAndroid Build Coastguard Worker
352*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
353*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
354*c8dee2aaSAndroid Build Coastguard Worker make_stack_string(*trace, player) == "half4 main(float2 xy) -> float func()");
355*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "");
356*c8dee2aaSAndroid Build Coastguard Worker player.step();
357*c8dee2aaSAndroid Build Coastguard Worker
358*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
359*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
360*c8dee2aaSAndroid Build Coastguard Worker make_stack_string(*trace, player) == "half4 main(float2 xy) -> float func()");
361*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##z = 6, ##y = 5, ##x = 4");
362*c8dee2aaSAndroid Build Coastguard Worker player.step();
363*c8dee2aaSAndroid Build Coastguard Worker
364*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
365*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
366*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
367*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
368*c8dee2aaSAndroid Build Coastguard Worker "##[func].result = 6, b = true, a = 123, xy.x = 0.5, xy.y = 0.5");
369*c8dee2aaSAndroid Build Coastguard Worker player.step();
370*c8dee2aaSAndroid Build Coastguard Worker
371*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
372*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
373*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
374*c8dee2aaSAndroid Build Coastguard Worker r,
375*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "b = true, a = 123, xy.x = 0.5, xy.y = 0.5");
376*c8dee2aaSAndroid Build Coastguard Worker player.step();
377*c8dee2aaSAndroid Build Coastguard Worker
378*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 11);
379*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
380*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
381*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
382*c8dee2aaSAndroid Build Coastguard Worker "##c.x = 0, ##c.y = 0.5, ##c.z = 1, ##c.w = -1, b = true, a = 123, "
383*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
384*c8dee2aaSAndroid Build Coastguard Worker player.step();
385*c8dee2aaSAndroid Build Coastguard Worker
386*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 12);
387*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
388*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
389*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
390*c8dee2aaSAndroid Build Coastguard Worker "##d[0][0] = 2, ##d[0][1] = 0, ##d[0][2] = 0, "
391*c8dee2aaSAndroid Build Coastguard Worker "##d[1][0] = 0, ##d[1][1] = 2, ##d[1][2] = 0, "
392*c8dee2aaSAndroid Build Coastguard Worker "##d[2][0] = 0, ##d[2][1] = 0, ##d[2][2] = 2, "
393*c8dee2aaSAndroid Build Coastguard Worker "c.x = 0, c.y = 0.5, c.z = 1, c.w = -1, b = true, a = 123, "
394*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
395*c8dee2aaSAndroid Build Coastguard Worker
396*c8dee2aaSAndroid Build Coastguard Worker player.step();
397*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
398*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "");
399*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
400*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
401*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 123, ##[main].result.y = 123, "
402*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.z = 123, ##[main].result.w = 123");
403*c8dee2aaSAndroid Build Coastguard Worker }
404*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerVariableGroups,r)405*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerVariableGroups, r) {
406*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
407*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
408*c8dee2aaSAndroid Build Coastguard Worker struct S { int x, y, z; }; // Line 2
409*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 3
410*c8dee2aaSAndroid Build Coastguard Worker S s; // Line 4
411*c8dee2aaSAndroid Build Coastguard Worker int arr[3]; // Line 5
412*c8dee2aaSAndroid Build Coastguard Worker s.y = 1; // Line 6
413*c8dee2aaSAndroid Build Coastguard Worker arr[1] = 2; // Line 7
414*c8dee2aaSAndroid Build Coastguard Worker s.x = 3; // Line 8
415*c8dee2aaSAndroid Build Coastguard Worker arr[2] = 4; // Line 9
416*c8dee2aaSAndroid Build Coastguard Worker return half4(0); // Line 10
417*c8dee2aaSAndroid Build Coastguard Worker } // Line 11
418*c8dee2aaSAndroid Build Coastguard Worker )");
419*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
420*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
421*c8dee2aaSAndroid Build Coastguard Worker player.step();
422*c8dee2aaSAndroid Build Coastguard Worker
423*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
424*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
425*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
426*c8dee2aaSAndroid Build Coastguard Worker player.step();
427*c8dee2aaSAndroid Build Coastguard Worker
428*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
429*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
430*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
431*c8dee2aaSAndroid Build Coastguard Worker "##s.x = 0, ##s.y = 0, ##s.z = 0, xy.x = 0.5, xy.y = 0.5");
432*c8dee2aaSAndroid Build Coastguard Worker player.step();
433*c8dee2aaSAndroid Build Coastguard Worker
434*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 6);
435*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
436*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
437*c8dee2aaSAndroid Build Coastguard Worker "##arr[0] = 0, ##arr[1] = 0, ##arr[2] = 0, s.x = 0, s.y = 0, s.z = "
438*c8dee2aaSAndroid Build Coastguard Worker "0, xy.x = 0.5, xy.y = 0.5");
439*c8dee2aaSAndroid Build Coastguard Worker player.step();
440*c8dee2aaSAndroid Build Coastguard Worker
441*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
442*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
443*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
444*c8dee2aaSAndroid Build Coastguard Worker "s.x = 0, ##s.y = 1, s.z = 0, arr[0] = 0, arr[1] = 0, arr[2] = 0, "
445*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
446*c8dee2aaSAndroid Build Coastguard Worker player.step();
447*c8dee2aaSAndroid Build Coastguard Worker
448*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
449*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
450*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
451*c8dee2aaSAndroid Build Coastguard Worker "arr[0] = 0, ##arr[1] = 2, arr[2] = 0, s.x = 0, s.y = 1, s.z = 0, "
452*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
453*c8dee2aaSAndroid Build Coastguard Worker player.step();
454*c8dee2aaSAndroid Build Coastguard Worker
455*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
456*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
457*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
458*c8dee2aaSAndroid Build Coastguard Worker "##s.x = 3, s.y = 1, s.z = 0, arr[0] = 0, arr[1] = 2, arr[2] = 0, "
459*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
460*c8dee2aaSAndroid Build Coastguard Worker player.step();
461*c8dee2aaSAndroid Build Coastguard Worker
462*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
463*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
464*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
465*c8dee2aaSAndroid Build Coastguard Worker "arr[0] = 0, arr[1] = 2, ##arr[2] = 4, s.x = 3, s.y = 1, s.z = 0, "
466*c8dee2aaSAndroid Build Coastguard Worker "xy.x = 0.5, xy.y = 0.5");
467*c8dee2aaSAndroid Build Coastguard Worker }
468*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerIfStatement,r)469*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerIfStatement, r) {
470*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
471*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
472*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
473*c8dee2aaSAndroid Build Coastguard Worker int val; // Line 3
474*c8dee2aaSAndroid Build Coastguard Worker if (true) { // Line 4
475*c8dee2aaSAndroid Build Coastguard Worker int temp = 1; // Line 5
476*c8dee2aaSAndroid Build Coastguard Worker val = temp; // Line 6
477*c8dee2aaSAndroid Build Coastguard Worker } else { // Line 7
478*c8dee2aaSAndroid Build Coastguard Worker val = 2; // Line 8
479*c8dee2aaSAndroid Build Coastguard Worker } // Line 9
480*c8dee2aaSAndroid Build Coastguard Worker if (false) { // Line 10
481*c8dee2aaSAndroid Build Coastguard Worker int temp = 3; // Line 11
482*c8dee2aaSAndroid Build Coastguard Worker val = temp; // Line 12
483*c8dee2aaSAndroid Build Coastguard Worker } else { // Line 13
484*c8dee2aaSAndroid Build Coastguard Worker val = 4; // Line 14
485*c8dee2aaSAndroid Build Coastguard Worker } // Line 15
486*c8dee2aaSAndroid Build Coastguard Worker return half4(val); // Line 16
487*c8dee2aaSAndroid Build Coastguard Worker } // Line 17
488*c8dee2aaSAndroid Build Coastguard Worker )");
489*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
490*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
491*c8dee2aaSAndroid Build Coastguard Worker
492*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
493*c8dee2aaSAndroid Build Coastguard Worker r,
494*c8dee2aaSAndroid Build Coastguard Worker player.getLineNumbersReached() ==
495*c8dee2aaSAndroid Build Coastguard Worker LineNumberMap({{3, 1}, {4, 1}, {5, 1}, {6, 1}, {10, 1}, {14, 1}, {16, 1}}));
496*c8dee2aaSAndroid Build Coastguard Worker player.step();
497*c8dee2aaSAndroid Build Coastguard Worker
498*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
499*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
500*c8dee2aaSAndroid Build Coastguard Worker player.step();
501*c8dee2aaSAndroid Build Coastguard Worker
502*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
503*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
504*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 0, xy.x = 0.5, xy.y = 0.5");
505*c8dee2aaSAndroid Build Coastguard Worker player.step();
506*c8dee2aaSAndroid Build Coastguard Worker
507*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
508*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "val = 0, xy.x = 0.5, xy.y = 0.5");
509*c8dee2aaSAndroid Build Coastguard Worker player.step();
510*c8dee2aaSAndroid Build Coastguard Worker
511*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 6);
512*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
513*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
514*c8dee2aaSAndroid Build Coastguard Worker "##temp = 1, val = 0, xy.x = 0.5, xy.y = 0.5");
515*c8dee2aaSAndroid Build Coastguard Worker player.step();
516*c8dee2aaSAndroid Build Coastguard Worker
517*c8dee2aaSAndroid Build Coastguard Worker // We skip over the false-branch.
518*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
519*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
520*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 1, xy.x = 0.5, xy.y = 0.5");
521*c8dee2aaSAndroid Build Coastguard Worker player.step();
522*c8dee2aaSAndroid Build Coastguard Worker
523*c8dee2aaSAndroid Build Coastguard Worker // We skip over the true-branch.
524*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 14);
525*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "val = 1, xy.x = 0.5, xy.y = 0.5");
526*c8dee2aaSAndroid Build Coastguard Worker player.step();
527*c8dee2aaSAndroid Build Coastguard Worker
528*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 16);
529*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
530*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 4, xy.x = 0.5, xy.y = 0.5");
531*c8dee2aaSAndroid Build Coastguard Worker player.step();
532*c8dee2aaSAndroid Build Coastguard Worker
533*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
534*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
535*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
536*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 4, ##[main].result.y = 4, ##[main].result.z = "
537*c8dee2aaSAndroid Build Coastguard Worker "4, ##[main].result.w = 4");
538*c8dee2aaSAndroid Build Coastguard Worker }
539*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerForLoop,r)540*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerForLoop, r) {
541*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
542*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
543*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
544*c8dee2aaSAndroid Build Coastguard Worker int val = 0; // Line 3
545*c8dee2aaSAndroid Build Coastguard Worker for (int x = 1; x < 3; ++x) { // Line 4
546*c8dee2aaSAndroid Build Coastguard Worker val = x; // Line 5
547*c8dee2aaSAndroid Build Coastguard Worker } // Line 6
548*c8dee2aaSAndroid Build Coastguard Worker return half4(val); // Line 7
549*c8dee2aaSAndroid Build Coastguard Worker } // Line 8
550*c8dee2aaSAndroid Build Coastguard Worker )");
551*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
552*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
553*c8dee2aaSAndroid Build Coastguard Worker
554*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
555*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 1}, {4, 3}, {5, 2}, {7, 1}}));
556*c8dee2aaSAndroid Build Coastguard Worker player.step();
557*c8dee2aaSAndroid Build Coastguard Worker
558*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
559*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
560*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 3}, {5, 2}, {7, 1}}));
561*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
562*c8dee2aaSAndroid Build Coastguard Worker player.step();
563*c8dee2aaSAndroid Build Coastguard Worker
564*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
565*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
566*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 2}, {5, 2}, {7, 1}}));
567*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
568*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 0, xy.x = 0.5, xy.y = 0.5");
569*c8dee2aaSAndroid Build Coastguard Worker player.step();
570*c8dee2aaSAndroid Build Coastguard Worker
571*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
572*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
573*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 2}, {5, 1}, {7, 1}}));
574*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
575*c8dee2aaSAndroid Build Coastguard Worker r,
576*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##x = 1, val = 0, xy.x = 0.5, xy.y = 0.5");
577*c8dee2aaSAndroid Build Coastguard Worker player.step();
578*c8dee2aaSAndroid Build Coastguard Worker
579*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
580*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
581*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 1}, {5, 1}, {7, 1}}));
582*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
583*c8dee2aaSAndroid Build Coastguard Worker r,
584*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 1, x = 1, xy.x = 0.5, xy.y = 0.5");
585*c8dee2aaSAndroid Build Coastguard Worker player.step();
586*c8dee2aaSAndroid Build Coastguard Worker
587*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
588*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
589*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 1}, {5, 0}, {7, 1}}));
590*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
591*c8dee2aaSAndroid Build Coastguard Worker r,
592*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##x = 2, val = 1, xy.x = 0.5, xy.y = 0.5");
593*c8dee2aaSAndroid Build Coastguard Worker player.step();
594*c8dee2aaSAndroid Build Coastguard Worker
595*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
596*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
597*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 0}, {5, 0}, {7, 1}}));
598*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
599*c8dee2aaSAndroid Build Coastguard Worker r,
600*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##val = 2, x = 2, xy.x = 0.5, xy.y = 0.5");
601*c8dee2aaSAndroid Build Coastguard Worker player.step();
602*c8dee2aaSAndroid Build Coastguard Worker
603*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
604*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
605*c8dee2aaSAndroid Build Coastguard Worker r, player.getLineNumbersReached() == LineNumberMap({{3, 0}, {4, 0}, {5, 0}, {7, 0}}));
606*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "val = 2, xy.x = 0.5, xy.y = 0.5");
607*c8dee2aaSAndroid Build Coastguard Worker player.step();
608*c8dee2aaSAndroid Build Coastguard Worker
609*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
610*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
611*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
612*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 2, ##[main].result.y = 2, ##[main].result.z = "
613*c8dee2aaSAndroid Build Coastguard Worker "2, ##[main].result.w = 2");
614*c8dee2aaSAndroid Build Coastguard Worker }
615*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerStepOut,r)616*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerStepOut, r) {
617*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
618*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
619*c8dee2aaSAndroid Build Coastguard Worker int fn() { // Line 2
620*c8dee2aaSAndroid Build Coastguard Worker int a = 11; // Line 3
621*c8dee2aaSAndroid Build Coastguard Worker int b = 22; // Line 4
622*c8dee2aaSAndroid Build Coastguard Worker int c = 33; // Line 5
623*c8dee2aaSAndroid Build Coastguard Worker int d = 44; // Line 6
624*c8dee2aaSAndroid Build Coastguard Worker return d; // Line 7
625*c8dee2aaSAndroid Build Coastguard Worker } // Line 8
626*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 9
627*c8dee2aaSAndroid Build Coastguard Worker return half4(fn()); // Line 10
628*c8dee2aaSAndroid Build Coastguard Worker } // Line 11
629*c8dee2aaSAndroid Build Coastguard Worker )");
630*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
631*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
632*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
633*c8dee2aaSAndroid Build Coastguard Worker player.getLineNumbersReached() ==
634*c8dee2aaSAndroid Build Coastguard Worker LineNumberMap({{3, 1}, {4, 1}, {5, 1}, {6, 1}, {7, 1}, {10, 1}}));
635*c8dee2aaSAndroid Build Coastguard Worker player.step();
636*c8dee2aaSAndroid Build Coastguard Worker
637*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside main.
638*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
639*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
640*c8dee2aaSAndroid Build Coastguard Worker player.step();
641*c8dee2aaSAndroid Build Coastguard Worker
642*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside fn.
643*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
644*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fn()");
645*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "");
646*c8dee2aaSAndroid Build Coastguard Worker player.step();
647*c8dee2aaSAndroid Build Coastguard Worker
648*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
649*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fn()");
650*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##a = 11");
651*c8dee2aaSAndroid Build Coastguard Worker player.step();
652*c8dee2aaSAndroid Build Coastguard Worker
653*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
654*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy) -> int fn()");
655*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##b = 22, a = 11");
656*c8dee2aaSAndroid Build Coastguard Worker player.stepOut();
657*c8dee2aaSAndroid Build Coastguard Worker
658*c8dee2aaSAndroid Build Coastguard Worker // We should now be back inside main(), right where we left off.
659*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
660*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_stack_string(*trace, player) == "half4 main(float2 xy)");
661*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
662*c8dee2aaSAndroid Build Coastguard Worker r,
663*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) == "##[fn].result = 44, xy.x = 0.5, xy.y = 0.5");
664*c8dee2aaSAndroid Build Coastguard Worker player.stepOut();
665*c8dee2aaSAndroid Build Coastguard Worker
666*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
667*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
668*c8dee2aaSAndroid Build Coastguard Worker make_global_vars_string(*trace, player) ==
669*c8dee2aaSAndroid Build Coastguard Worker "##[main].result.x = 44, ##[main].result.y = 44, ##[main].result.z "
670*c8dee2aaSAndroid Build Coastguard Worker "= 44, ##[main].result.w = 44");
671*c8dee2aaSAndroid Build Coastguard Worker }
672*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerVariableScope,r)673*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerVariableScope, r) {
674*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
675*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
676*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
677*c8dee2aaSAndroid Build Coastguard Worker int a = 1; // Line 3
678*c8dee2aaSAndroid Build Coastguard Worker { // Line 4
679*c8dee2aaSAndroid Build Coastguard Worker int b = 2; // Line 5
680*c8dee2aaSAndroid Build Coastguard Worker { // Line 6
681*c8dee2aaSAndroid Build Coastguard Worker int c = 3; // Line 7
682*c8dee2aaSAndroid Build Coastguard Worker } // Line 8
683*c8dee2aaSAndroid Build Coastguard Worker int d = 4; // Line 9
684*c8dee2aaSAndroid Build Coastguard Worker } // Line 10
685*c8dee2aaSAndroid Build Coastguard Worker int e = 5; // Line 11
686*c8dee2aaSAndroid Build Coastguard Worker { // Line 12
687*c8dee2aaSAndroid Build Coastguard Worker int f = 6; // Line 13
688*c8dee2aaSAndroid Build Coastguard Worker { // Line 14
689*c8dee2aaSAndroid Build Coastguard Worker int g = 7; // Line 15
690*c8dee2aaSAndroid Build Coastguard Worker } // Line 16
691*c8dee2aaSAndroid Build Coastguard Worker int h = 8; // Line 17
692*c8dee2aaSAndroid Build Coastguard Worker } // Line 18
693*c8dee2aaSAndroid Build Coastguard Worker int i = 9; // Line 19
694*c8dee2aaSAndroid Build Coastguard Worker return half4(0); // Line 20
695*c8dee2aaSAndroid Build Coastguard Worker }
696*c8dee2aaSAndroid Build Coastguard Worker )");
697*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
698*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
699*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
700*c8dee2aaSAndroid Build Coastguard Worker player.getLineNumbersReached() == LineNumberMap({{3, 1},
701*c8dee2aaSAndroid Build Coastguard Worker {5, 1},
702*c8dee2aaSAndroid Build Coastguard Worker {7, 1},
703*c8dee2aaSAndroid Build Coastguard Worker {9, 1},
704*c8dee2aaSAndroid Build Coastguard Worker {11, 1},
705*c8dee2aaSAndroid Build Coastguard Worker {13, 1},
706*c8dee2aaSAndroid Build Coastguard Worker {15, 1},
707*c8dee2aaSAndroid Build Coastguard Worker {17, 1},
708*c8dee2aaSAndroid Build Coastguard Worker {19, 1},
709*c8dee2aaSAndroid Build Coastguard Worker {20, 1}}));
710*c8dee2aaSAndroid Build Coastguard Worker player.step();
711*c8dee2aaSAndroid Build Coastguard Worker
712*c8dee2aaSAndroid Build Coastguard Worker // We should now be inside main.
713*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
714*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##xy.x = 0.5, ##xy.y = 0.5");
715*c8dee2aaSAndroid Build Coastguard Worker player.step();
716*c8dee2aaSAndroid Build Coastguard Worker
717*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 5);
718*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "##a = 1, xy.x = 0.5, xy.y = 0.5");
719*c8dee2aaSAndroid Build Coastguard Worker player.step();
720*c8dee2aaSAndroid Build Coastguard Worker
721*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
722*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
723*c8dee2aaSAndroid Build Coastguard Worker r, make_local_vars_string(*trace, player) == "##b = 2, a = 1, xy.x = 0.5, xy.y = 0.5");
724*c8dee2aaSAndroid Build Coastguard Worker player.step();
725*c8dee2aaSAndroid Build Coastguard Worker
726*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
727*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
728*c8dee2aaSAndroid Build Coastguard Worker r, make_local_vars_string(*trace, player) == "b = 2, a = 1, xy.x = 0.5, xy.y = 0.5");
729*c8dee2aaSAndroid Build Coastguard Worker player.step();
730*c8dee2aaSAndroid Build Coastguard Worker
731*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 11);
732*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, make_local_vars_string(*trace, player) == "a = 1, xy.x = 0.5, xy.y = 0.5");
733*c8dee2aaSAndroid Build Coastguard Worker player.step();
734*c8dee2aaSAndroid Build Coastguard Worker
735*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 13);
736*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
737*c8dee2aaSAndroid Build Coastguard Worker r, make_local_vars_string(*trace, player) == "##e = 5, a = 1, xy.x = 0.5, xy.y = 0.5");
738*c8dee2aaSAndroid Build Coastguard Worker player.step();
739*c8dee2aaSAndroid Build Coastguard Worker
740*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 15);
741*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
742*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
743*c8dee2aaSAndroid Build Coastguard Worker "##f = 6, e = 5, a = 1, xy.x = 0.5, xy.y = 0.5");
744*c8dee2aaSAndroid Build Coastguard Worker player.step();
745*c8dee2aaSAndroid Build Coastguard Worker
746*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 17);
747*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
748*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
749*c8dee2aaSAndroid Build Coastguard Worker "f = 6, e = 5, a = 1, xy.x = 0.5, xy.y = 0.5");
750*c8dee2aaSAndroid Build Coastguard Worker player.step();
751*c8dee2aaSAndroid Build Coastguard Worker
752*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 19);
753*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(
754*c8dee2aaSAndroid Build Coastguard Worker r, make_local_vars_string(*trace, player) == "e = 5, a = 1, xy.x = 0.5, xy.y = 0.5");
755*c8dee2aaSAndroid Build Coastguard Worker player.step();
756*c8dee2aaSAndroid Build Coastguard Worker
757*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 20);
758*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r,
759*c8dee2aaSAndroid Build Coastguard Worker make_local_vars_string(*trace, player) ==
760*c8dee2aaSAndroid Build Coastguard Worker "##i = 9, e = 5, a = 1, xy.x = 0.5, xy.y = 0.5");
761*c8dee2aaSAndroid Build Coastguard Worker player.step();
762*c8dee2aaSAndroid Build Coastguard Worker
763*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
764*c8dee2aaSAndroid Build Coastguard Worker }
765*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerNestedBlocks,r)766*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerNestedBlocks, r) {
767*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
768*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
769*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
770*c8dee2aaSAndroid Build Coastguard Worker {{{{{{{ // Line 3
771*c8dee2aaSAndroid Build Coastguard Worker int a, b; // Line 4
772*c8dee2aaSAndroid Build Coastguard Worker }}}}}}} // Line 5
773*c8dee2aaSAndroid Build Coastguard Worker return half4(0); // Line 6
774*c8dee2aaSAndroid Build Coastguard Worker }
775*c8dee2aaSAndroid Build Coastguard Worker )");
776*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
777*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
778*c8dee2aaSAndroid Build Coastguard Worker player.step();
779*c8dee2aaSAndroid Build Coastguard Worker
780*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
781*c8dee2aaSAndroid Build Coastguard Worker player.step();
782*c8dee2aaSAndroid Build Coastguard Worker
783*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 6);
784*c8dee2aaSAndroid Build Coastguard Worker player.step();
785*c8dee2aaSAndroid Build Coastguard Worker
786*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
787*c8dee2aaSAndroid Build Coastguard Worker }
788*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerSwitchStatement,r)789*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerSwitchStatement, r) {
790*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
791*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
792*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 2
793*c8dee2aaSAndroid Build Coastguard Worker int x = 2; // Line 3
794*c8dee2aaSAndroid Build Coastguard Worker switch (x) { // Line 4
795*c8dee2aaSAndroid Build Coastguard Worker case 1: // Line 5
796*c8dee2aaSAndroid Build Coastguard Worker break; // Line 6
797*c8dee2aaSAndroid Build Coastguard Worker case 2: // Line 7
798*c8dee2aaSAndroid Build Coastguard Worker ++x; // Line 8
799*c8dee2aaSAndroid Build Coastguard Worker case 3: // Line 9
800*c8dee2aaSAndroid Build Coastguard Worker break; // Line 10
801*c8dee2aaSAndroid Build Coastguard Worker case 4: // Line 11
802*c8dee2aaSAndroid Build Coastguard Worker } // Line 12
803*c8dee2aaSAndroid Build Coastguard Worker return half4(x); // Line 13
804*c8dee2aaSAndroid Build Coastguard Worker }
805*c8dee2aaSAndroid Build Coastguard Worker )");
806*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
807*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
808*c8dee2aaSAndroid Build Coastguard Worker player.step();
809*c8dee2aaSAndroid Build Coastguard Worker
810*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 3);
811*c8dee2aaSAndroid Build Coastguard Worker player.step();
812*c8dee2aaSAndroid Build Coastguard Worker
813*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
814*c8dee2aaSAndroid Build Coastguard Worker player.step();
815*c8dee2aaSAndroid Build Coastguard Worker
816*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
817*c8dee2aaSAndroid Build Coastguard Worker player.step();
818*c8dee2aaSAndroid Build Coastguard Worker
819*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 10);
820*c8dee2aaSAndroid Build Coastguard Worker player.step();
821*c8dee2aaSAndroid Build Coastguard Worker
822*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 13);
823*c8dee2aaSAndroid Build Coastguard Worker player.step();
824*c8dee2aaSAndroid Build Coastguard Worker
825*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
826*c8dee2aaSAndroid Build Coastguard Worker }
827*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerBreakpoint,r)828*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerBreakpoint, r) {
829*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
830*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
831*c8dee2aaSAndroid Build Coastguard Worker int counter = 0; // Line 2
832*c8dee2aaSAndroid Build Coastguard Worker void func() { // Line 3
833*c8dee2aaSAndroid Build Coastguard Worker --counter; // Line 4 BREAKPOINT 4 5
834*c8dee2aaSAndroid Build Coastguard Worker } // Line 5
835*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 6
836*c8dee2aaSAndroid Build Coastguard Worker for (int x = 1; x <= 3; ++x) { // Line 7
837*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 8 BREAKPOINT 1 2 3
838*c8dee2aaSAndroid Build Coastguard Worker } // Line 9
839*c8dee2aaSAndroid Build Coastguard Worker func(); // Line 10
840*c8dee2aaSAndroid Build Coastguard Worker func(); // Line 11
841*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 12 BREAKPOINT 6
842*c8dee2aaSAndroid Build Coastguard Worker return half4(counter); // Line 13
843*c8dee2aaSAndroid Build Coastguard Worker } // Line 14
844*c8dee2aaSAndroid Build Coastguard Worker )");
845*c8dee2aaSAndroid Build Coastguard Worker // Run the simulation with a variety of breakpoints set.
846*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
847*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
848*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{8, 13, 20});
849*c8dee2aaSAndroid Build Coastguard Worker player.run();
850*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
851*c8dee2aaSAndroid Build Coastguard Worker
852*c8dee2aaSAndroid Build Coastguard Worker player.run();
853*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
854*c8dee2aaSAndroid Build Coastguard Worker
855*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{1, 4, 8});
856*c8dee2aaSAndroid Build Coastguard Worker player.run();
857*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
858*c8dee2aaSAndroid Build Coastguard Worker
859*c8dee2aaSAndroid Build Coastguard Worker player.run();
860*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
861*c8dee2aaSAndroid Build Coastguard Worker
862*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{4, 12, 14});
863*c8dee2aaSAndroid Build Coastguard Worker player.run();
864*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
865*c8dee2aaSAndroid Build Coastguard Worker
866*c8dee2aaSAndroid Build Coastguard Worker player.run();
867*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 12);
868*c8dee2aaSAndroid Build Coastguard Worker
869*c8dee2aaSAndroid Build Coastguard Worker player.run();
870*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
871*c8dee2aaSAndroid Build Coastguard Worker
872*c8dee2aaSAndroid Build Coastguard Worker // Run the simulation again with no breakpoints set. We should reach the end of the trace
873*c8dee2aaSAndroid Build Coastguard Worker // instantly.
874*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
875*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{});
876*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !player.traceHasCompleted());
877*c8dee2aaSAndroid Build Coastguard Worker
878*c8dee2aaSAndroid Build Coastguard Worker player.run();
879*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.traceHasCompleted());
880*c8dee2aaSAndroid Build Coastguard Worker }
881*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerStepOverWithBreakpoint,r)882*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerStepOverWithBreakpoint, r) {
883*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
884*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
885*c8dee2aaSAndroid Build Coastguard Worker int counter = 0; // Line 2
886*c8dee2aaSAndroid Build Coastguard Worker void func() { // Line 3
887*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 4 BREAKPOINT
888*c8dee2aaSAndroid Build Coastguard Worker } // Line 5
889*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 6
890*c8dee2aaSAndroid Build Coastguard Worker func(); // Line 7
891*c8dee2aaSAndroid Build Coastguard Worker return half4(counter); // Line 8
892*c8dee2aaSAndroid Build Coastguard Worker } // Line 9
893*c8dee2aaSAndroid Build Coastguard Worker )");
894*c8dee2aaSAndroid Build Coastguard Worker // Try stepping over with no breakpoint set; we will step over.
895*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
896*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
897*c8dee2aaSAndroid Build Coastguard Worker player.step();
898*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
899*c8dee2aaSAndroid Build Coastguard Worker
900*c8dee2aaSAndroid Build Coastguard Worker player.stepOver();
901*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 8);
902*c8dee2aaSAndroid Build Coastguard Worker
903*c8dee2aaSAndroid Build Coastguard Worker // Try stepping over with a breakpoint set; we will stop at the breakpoint.
904*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
905*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{4});
906*c8dee2aaSAndroid Build Coastguard Worker player.step();
907*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 7);
908*c8dee2aaSAndroid Build Coastguard Worker
909*c8dee2aaSAndroid Build Coastguard Worker player.stepOver();
910*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
911*c8dee2aaSAndroid Build Coastguard Worker }
912*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(SkSLTracePlayerStepOutWithBreakpoint,r)913*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSLTracePlayerStepOutWithBreakpoint, r) {
914*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSL::DebugTracePriv> trace = make_trace(r,
915*c8dee2aaSAndroid Build Coastguard Worker R"( // Line 1
916*c8dee2aaSAndroid Build Coastguard Worker int counter = 0; // Line 2
917*c8dee2aaSAndroid Build Coastguard Worker void func() { // Line 3
918*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 4
919*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 5
920*c8dee2aaSAndroid Build Coastguard Worker ++counter; // Line 6 BREAKPOINT
921*c8dee2aaSAndroid Build Coastguard Worker } // Line 7
922*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) { // Line 8
923*c8dee2aaSAndroid Build Coastguard Worker func(); // Line 9
924*c8dee2aaSAndroid Build Coastguard Worker return half4(counter); // Line 10
925*c8dee2aaSAndroid Build Coastguard Worker } // Line 11
926*c8dee2aaSAndroid Build Coastguard Worker )");
927*c8dee2aaSAndroid Build Coastguard Worker // Try stepping out with no breakpoint set; we will step out.
928*c8dee2aaSAndroid Build Coastguard Worker SkSL::SkSLDebugTracePlayer player;
929*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
930*c8dee2aaSAndroid Build Coastguard Worker player.step();
931*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
932*c8dee2aaSAndroid Build Coastguard Worker
933*c8dee2aaSAndroid Build Coastguard Worker player.step();
934*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
935*c8dee2aaSAndroid Build Coastguard Worker
936*c8dee2aaSAndroid Build Coastguard Worker player.stepOut();
937*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
938*c8dee2aaSAndroid Build Coastguard Worker
939*c8dee2aaSAndroid Build Coastguard Worker // Try stepping out with a breakpoint set; we will stop at the breakpoint.
940*c8dee2aaSAndroid Build Coastguard Worker player.reset(trace);
941*c8dee2aaSAndroid Build Coastguard Worker player.setBreakpoints(std::unordered_set<int>{6});
942*c8dee2aaSAndroid Build Coastguard Worker player.step();
943*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 9);
944*c8dee2aaSAndroid Build Coastguard Worker
945*c8dee2aaSAndroid Build Coastguard Worker player.step();
946*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 4);
947*c8dee2aaSAndroid Build Coastguard Worker
948*c8dee2aaSAndroid Build Coastguard Worker player.stepOut();
949*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, player.getCurrentLine() == 6);
950*c8dee2aaSAndroid Build Coastguard Worker }
951