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 #ifndef SKSLDEBUGTRACEPRIV 9*c8dee2aaSAndroid Build Coastguard Worker #define SKSLDEBUGTRACEPRIV 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/sksl/SkSLDebugTrace.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLPosition.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLType.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/tracing/SkSLTraceHook.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 18*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 19*c8dee2aaSAndroid Build Coastguard Worker #include <string> 20*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 23*c8dee2aaSAndroid Build Coastguard Worker class SkWStream; 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker struct TraceInfo { 28*c8dee2aaSAndroid Build Coastguard Worker enum class Op { 29*c8dee2aaSAndroid Build Coastguard Worker kLine, /** data: line number, (unused) */ 30*c8dee2aaSAndroid Build Coastguard Worker kVar, /** data: slot, value */ 31*c8dee2aaSAndroid Build Coastguard Worker kEnter, /** data: function index, (unused) */ 32*c8dee2aaSAndroid Build Coastguard Worker kExit, /** data: function index, (unused) */ 33*c8dee2aaSAndroid Build Coastguard Worker kScope, /** data: scope delta, (unused) */ 34*c8dee2aaSAndroid Build Coastguard Worker }; 35*c8dee2aaSAndroid Build Coastguard Worker Op op; 36*c8dee2aaSAndroid Build Coastguard Worker int32_t data[2]; 37*c8dee2aaSAndroid Build Coastguard Worker }; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker struct SlotDebugInfo { 40*c8dee2aaSAndroid Build Coastguard Worker /** The full name of this variable (without component), e.g. `myArray[3].myStruct.myVector` */ 41*c8dee2aaSAndroid Build Coastguard Worker std::string name; 42*c8dee2aaSAndroid Build Coastguard Worker /** The dimensions of this variable: 1x1 is a scalar, Nx1 is a vector, NxM is a matrix. */ 43*c8dee2aaSAndroid Build Coastguard Worker uint8_t columns = 1, rows = 1; 44*c8dee2aaSAndroid Build Coastguard Worker /** Which component of the variable is this slot? (e.g. `vec4.z` is component 2) */ 45*c8dee2aaSAndroid Build Coastguard Worker uint8_t componentIndex = 0; 46*c8dee2aaSAndroid Build Coastguard Worker /** Complex types (arrays/structs) can be tracked as a "group" of adjacent slots. */ 47*c8dee2aaSAndroid Build Coastguard Worker int groupIndex = 0; 48*c8dee2aaSAndroid Build Coastguard Worker /** What kind of numbers belong in this slot? */ 49*c8dee2aaSAndroid Build Coastguard Worker SkSL::Type::NumberKind numberKind = SkSL::Type::NumberKind::kNonnumeric; 50*c8dee2aaSAndroid Build Coastguard Worker /** Where is this variable located in the program? */ 51*c8dee2aaSAndroid Build Coastguard Worker int line = 0; 52*c8dee2aaSAndroid Build Coastguard Worker Position pos = {}; 53*c8dee2aaSAndroid Build Coastguard Worker /** If this slot holds a function's return value, contains 1; if not, -1. */ 54*c8dee2aaSAndroid Build Coastguard Worker int fnReturnValue = -1; 55*c8dee2aaSAndroid Build Coastguard Worker }; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker struct FunctionDebugInfo { 58*c8dee2aaSAndroid Build Coastguard Worker /** Full function declaration: `float myFunction(half4 color)`) */ 59*c8dee2aaSAndroid Build Coastguard Worker std::string name; 60*c8dee2aaSAndroid Build Coastguard Worker }; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker class DebugTracePriv : public DebugTrace { 63*c8dee2aaSAndroid Build Coastguard Worker public: 64*c8dee2aaSAndroid Build Coastguard Worker /** 65*c8dee2aaSAndroid Build Coastguard Worker * Sets the device-coordinate pixel to trace. If it's not set, the point at (0, 0) will be used. 66*c8dee2aaSAndroid Build Coastguard Worker */ 67*c8dee2aaSAndroid Build Coastguard Worker void setTraceCoord(const SkIPoint& coord); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker /** Attaches the SkSL source to be debugged. */ 70*c8dee2aaSAndroid Build Coastguard Worker void setSource(const std::string& source); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker /** Serializes a debug trace to JSON which can be parsed by our debugger. */ 73*c8dee2aaSAndroid Build Coastguard Worker bool readTrace(SkStream* r); 74*c8dee2aaSAndroid Build Coastguard Worker void writeTrace(SkWStream* w) const override; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker /** Generates a human-readable dump of the debug trace. */ 77*c8dee2aaSAndroid Build Coastguard Worker void dump(SkWStream* o) const override; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker /** Returns a slot's component as a variable-name suffix, e.g. ".x" or "[2][2]". */ 80*c8dee2aaSAndroid Build Coastguard Worker std::string getSlotComponentSuffix(int slotIndex) const; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker /** Bit-casts a slot's value, then converts to text, e.g. "3.14" or "true" or "12345". */ 83*c8dee2aaSAndroid Build Coastguard Worker std::string getSlotValue(int slotIndex, int32_t value) const; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker /** Bit-casts a value for a given slot into a double, honoring the slot's NumberKind. */ 86*c8dee2aaSAndroid Build Coastguard Worker double interpretValueBits(int slotIndex, int32_t valueBits) const; 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker /** Converts a numeric value into text, based on the slot's NumberKind. */ 89*c8dee2aaSAndroid Build Coastguard Worker std::string slotValueToString(int slotIndex, double value) const; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker /** The device-coordinate pixel to trace (controlled by setTraceCoord) */ 92*c8dee2aaSAndroid Build Coastguard Worker SkIPoint fTraceCoord = {}; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker /** SkRP stores uniform slot info in fUniformInfo. (In SkVM, they were mixed into fSlotInfo.) */ 95*c8dee2aaSAndroid Build Coastguard Worker std::vector<SlotDebugInfo> fUniformInfo; 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker /** A 1:1 mapping of slot numbers to debug information. */ 98*c8dee2aaSAndroid Build Coastguard Worker std::vector<SlotDebugInfo> fSlotInfo; 99*c8dee2aaSAndroid Build Coastguard Worker std::vector<FunctionDebugInfo> fFuncInfo; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker /** The SkSL debug trace. */ 102*c8dee2aaSAndroid Build Coastguard Worker std::vector<TraceInfo> fTraceInfo; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker /** The SkSL code, split line-by-line. */ 105*c8dee2aaSAndroid Build Coastguard Worker std::vector<std::string> fSource; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker /** 108*c8dee2aaSAndroid Build Coastguard Worker * A trace hook which populates fTraceInfo during shader evaluation. This will be created 109*c8dee2aaSAndroid Build Coastguard Worker * automatically during code generation. 110*c8dee2aaSAndroid Build Coastguard Worker */ 111*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::TraceHook> fTraceHook; 112*c8dee2aaSAndroid Build Coastguard Worker }; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker #endif 117