Add SkVMDebugInfo::setSource.
This associates the input SkSL source with our debug info. It is serialized out to .trace files. This will actually let us display the code associated with `trace_line`. Bug: skia:12614 Change-Id: I6c10af6fa6dd97ed8411f3460e103f442722b7f6 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/472999 Commit-Queue: John Stiles <johnstiles@google.com> Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
parent
2fb8dac598
commit
54b7bd33a1
@ -349,6 +349,9 @@ void SkVMGenerator::writeProgram(SkSpan<skvm::Val> uniforms,
|
|||||||
|
|
||||||
void SkVMGenerator::setupGlobals(SkSpan<skvm::Val> uniforms, skvm::Coord device) {
|
void SkVMGenerator::setupGlobals(SkSpan<skvm::Val> uniforms, skvm::Coord device) {
|
||||||
if (fDebugInfo) {
|
if (fDebugInfo) {
|
||||||
|
// Copy the program source into the debug info so that it will be written in the trace file.
|
||||||
|
fDebugInfo->setSource(*fProgram.fSource);
|
||||||
|
|
||||||
// If we are debugging, we need to create a trace mask. This will be true when the current
|
// If we are debugging, we need to create a trace mask. This will be true when the current
|
||||||
// device coordinates match the requested trace coordinates.
|
// device coordinates match the requested trace coordinates.
|
||||||
if (fDebugInfo->fTraceCoord) {
|
if (fDebugInfo->fTraceCoord) {
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include "src/utils/SkJSON.h"
|
#include "src/utils/SkJSON.h"
|
||||||
#include "src/utils/SkJSONWriter.h"
|
#include "src/utils/SkJSONWriter.h"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace SkSL {
|
namespace SkSL {
|
||||||
|
|
||||||
void SkVMDebugInfo::setTraceCoord(skvm::Coord coord) {
|
void SkVMDebugInfo::setTraceCoord(skvm::Coord coord) {
|
||||||
@ -18,6 +20,14 @@ void SkVMDebugInfo::setTraceCoord(skvm::Coord coord) {
|
|||||||
fTraceCoord = {coord.x + 0.5, coord.y + 0.5};
|
fTraceCoord = {coord.x + 0.5, coord.y + 0.5};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SkVMDebugInfo::setSource(std::string source) {
|
||||||
|
std::stringstream stream{std::move(source)};
|
||||||
|
while (stream.good()) {
|
||||||
|
fSource.push_back({});
|
||||||
|
std::getline(stream, fSource.back(), '\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SkVMDebugInfo::dump(SkWStream* o) const {
|
void SkVMDebugInfo::dump(SkWStream* o) const {
|
||||||
for (size_t index = 0; index < fSlotInfo.size(); ++index) {
|
for (size_t index = 0; index < fSlotInfo.size(); ++index) {
|
||||||
const SkVMSlotInfo& info = fSlotInfo[index];
|
const SkVMSlotInfo& info = fSlotInfo[index];
|
||||||
@ -69,6 +79,13 @@ void SkVMDebugInfo::writeTrace(SkWStream* w) const {
|
|||||||
SkJSONWriter json(w);
|
SkJSONWriter json(w);
|
||||||
|
|
||||||
json.beginObject(); // root
|
json.beginObject(); // root
|
||||||
|
json.beginArray("source");
|
||||||
|
|
||||||
|
for (const std::string& line : fSource) {
|
||||||
|
json.appendString(line.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
json.endArray(); // code
|
||||||
json.beginArray("slots");
|
json.beginArray("slots");
|
||||||
|
|
||||||
for (size_t index = 0; index < fSlotInfo.size(); ++index) {
|
for (size_t index = 0; index < fSlotInfo.size(); ++index) {
|
||||||
@ -109,6 +126,20 @@ bool SkVMDebugInfo::readTrace(SkStream* r) {
|
|||||||
if (!root) {
|
if (!root) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const skjson::ArrayValue* source = (*root)["source"];
|
||||||
|
if (!source) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fSource.clear();
|
||||||
|
for (const skjson::StringValue* line : *source) {
|
||||||
|
if (!line) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fSource.push_back(line->begin());
|
||||||
|
}
|
||||||
|
|
||||||
const skjson::ArrayValue* slots = (*root)["slots"];
|
const skjson::ArrayValue* slots = (*root)["slots"];
|
||||||
if (!slots) {
|
if (!slots) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -45,6 +45,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setTraceCoord(skvm::Coord coord);
|
void setTraceCoord(skvm::Coord coord);
|
||||||
|
|
||||||
|
/** Attaches the SkSL source to be debugged. */
|
||||||
|
void setSource(std::string source);
|
||||||
|
|
||||||
/** Serialization for .trace files. */
|
/** Serialization for .trace files. */
|
||||||
bool readTrace(SkStream* r);
|
bool readTrace(SkStream* r);
|
||||||
void writeTrace(SkWStream* w) const;
|
void writeTrace(SkWStream* w) const;
|
||||||
@ -56,6 +59,9 @@ public:
|
|||||||
std::vector<SkVMSlotInfo> fSlotInfo;
|
std::vector<SkVMSlotInfo> fSlotInfo;
|
||||||
std::vector<SkVMFunctionInfo> fFuncInfo;
|
std::vector<SkVMFunctionInfo> fFuncInfo;
|
||||||
|
|
||||||
|
/** The SkSL code, split line-by-line. */
|
||||||
|
std::vector<std::string> fSource;
|
||||||
|
|
||||||
skvm::Coord fTraceCoord;
|
skvm::Coord fTraceCoord;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9,8 +9,27 @@
|
|||||||
#include "src/sksl/codegen/SkVMDebugInfo.h"
|
#include "src/sksl/codegen/SkVMDebugInfo.h"
|
||||||
#include "tests/Test.h"
|
#include "tests/Test.h"
|
||||||
|
|
||||||
|
DEF_TEST(SkVMDebugInfoSetSource, r) {
|
||||||
|
SkSL::SkVMDebugInfo i;
|
||||||
|
i.setSource("SkVMDebugInfo::setSource unit test\n"
|
||||||
|
"\t// first line\n"
|
||||||
|
"\t// second line\n"
|
||||||
|
"\t// third line");
|
||||||
|
|
||||||
|
REPORTER_ASSERT(r, i.fSource.size() == 4);
|
||||||
|
REPORTER_ASSERT(r, i.fSource[0] == "SkVMDebugInfo::setSource unit test");
|
||||||
|
REPORTER_ASSERT(r, i.fSource[1] == "\t// first line");
|
||||||
|
REPORTER_ASSERT(r, i.fSource[2] == "\t// second line");
|
||||||
|
REPORTER_ASSERT(r, i.fSource[3] == "\t// third line");
|
||||||
|
}
|
||||||
|
|
||||||
DEF_TEST(SkVMDebugInfoWriteTrace, r) {
|
DEF_TEST(SkVMDebugInfoWriteTrace, r) {
|
||||||
SkSL::SkVMDebugInfo i;
|
SkSL::SkVMDebugInfo i;
|
||||||
|
i.fSource = {
|
||||||
|
"\t// first line",
|
||||||
|
"// \"second line\"",
|
||||||
|
"//\\\\//\\\\ third line",
|
||||||
|
};
|
||||||
i.fSlotInfo = {
|
i.fSlotInfo = {
|
||||||
{"SkVM_Debug_Info", 1, 2, 3, (SkSL::Type::NumberKind)4, 5},
|
{"SkVM_Debug_Info", 1, 2, 3, (SkSL::Type::NumberKind)4, 5},
|
||||||
{"Unit_Test", 6, 7, 8, (SkSL::Type::NumberKind)9, 10},
|
{"Unit_Test", 6, 7, 8, (SkSL::Type::NumberKind)9, 10},
|
||||||
@ -23,9 +42,10 @@ DEF_TEST(SkVMDebugInfoWriteTrace, r) {
|
|||||||
sk_sp<SkData> trace = wstream.detachAsData();
|
sk_sp<SkData> trace = wstream.detachAsData();
|
||||||
|
|
||||||
static constexpr char kExpected[] =
|
static constexpr char kExpected[] =
|
||||||
R"({"slots":[{"slot":0,"name":"SkVM_Debug_Info","columns":1,"rows":2,"index":3,"ki)"
|
R"({"source":["\t// first line","// \"second line\"","//\\\\//\\\\ third line"],"s)"
|
||||||
R"(nd":4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"ki)"
|
R"(lots":[{"slot":0,"name":"SkVM_Debug_Info","columns":1,"rows":2,"index":3,"kind")"
|
||||||
R"(nd":9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}]})";
|
R"(:4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"kind")"
|
||||||
|
R"(:9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}]})";
|
||||||
|
|
||||||
skstd::string_view actual{reinterpret_cast<const char*>(trace->bytes()), trace->size()};
|
skstd::string_view actual{reinterpret_cast<const char*>(trace->bytes()), trace->size()};
|
||||||
|
|
||||||
@ -36,17 +56,23 @@ DEF_TEST(SkVMDebugInfoWriteTrace, r) {
|
|||||||
|
|
||||||
DEF_TEST(SkVMDebugInfoReadTrace, r) {
|
DEF_TEST(SkVMDebugInfoReadTrace, r) {
|
||||||
const skstd::string_view kJSONTrace =
|
const skstd::string_view kJSONTrace =
|
||||||
R"({"slots":[{"slot":0,"name":"SkVM_Debug_Info","columns":1,"rows":2,"index":3,"ki)"
|
R"({"source":["\t// first line","// \"second line\"","//\\\\//\\\\ third line"],"s)"
|
||||||
R"(nd":4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"ki)"
|
R"(lots":[{"slot":0,"name":"SkVM_Debug_Info","columns":1,"rows":2,"index":3,"kind")"
|
||||||
R"(nd":9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}]})";
|
R"(:4,"line":5},{"slot":1,"name":"Unit_Test","columns":6,"rows":7,"index":8,"kind")"
|
||||||
|
R"(:9,"line":10}],"functions":[{"slot":0,"name":"void testFunc();"}]})";
|
||||||
|
|
||||||
SkMemoryStream stream(kJSONTrace.data(), kJSONTrace.size(), /*copyData=*/false);
|
SkMemoryStream stream(kJSONTrace.data(), kJSONTrace.size(), /*copyData=*/false);
|
||||||
SkSL::SkVMDebugInfo i;
|
SkSL::SkVMDebugInfo i;
|
||||||
REPORTER_ASSERT(r, i.readTrace(&stream));
|
REPORTER_ASSERT(r, i.readTrace(&stream));
|
||||||
|
|
||||||
|
REPORTER_ASSERT(r, i.fSource.size() == 3);
|
||||||
REPORTER_ASSERT(r, i.fSlotInfo.size() == 2);
|
REPORTER_ASSERT(r, i.fSlotInfo.size() == 2);
|
||||||
REPORTER_ASSERT(r, i.fFuncInfo.size() == 1);
|
REPORTER_ASSERT(r, i.fFuncInfo.size() == 1);
|
||||||
|
|
||||||
|
REPORTER_ASSERT(r, i.fSource[0] == "\t// first line");
|
||||||
|
REPORTER_ASSERT(r, i.fSource[1] == "// \"second line\"");
|
||||||
|
REPORTER_ASSERT(r, i.fSource[2] == "//\\\\//\\\\ third line");
|
||||||
|
|
||||||
REPORTER_ASSERT(r, i.fSlotInfo[0].name == "SkVM_Debug_Info");
|
REPORTER_ASSERT(r, i.fSlotInfo[0].name == "SkVM_Debug_Info");
|
||||||
REPORTER_ASSERT(r, i.fSlotInfo[0].columns == 1);
|
REPORTER_ASSERT(r, i.fSlotInfo[0].columns == 1);
|
||||||
REPORTER_ASSERT(r, i.fSlotInfo[0].rows == 2);
|
REPORTER_ASSERT(r, i.fSlotInfo[0].rows == 2);
|
||||||
|
Loading…
Reference in New Issue
Block a user