Chromium Code Reviews| Index: src/gpu/GrAuditTrail.cpp |
| diff --git a/src/gpu/GrAuditTrail.cpp b/src/gpu/GrAuditTrail.cpp |
| index 59201f4450104c240c7ddc8fc412016c14300479..dae50221a2b783655e9c2b4d627b3c6de17a1c37 100644 |
| --- a/src/gpu/GrAuditTrail.cpp |
| +++ b/src/gpu/GrAuditTrail.cpp |
| @@ -8,29 +8,36 @@ |
| #include "GrAuditTrail.h" |
| #include "batches/GrBatch.h" |
| +const int GrAuditTrail::kInvalidID = -1; |
| + |
| void GrAuditTrail::batchingResultCombined(GrBatch* combiner) { |
| int* indexPtr = fIDLookup.find(combiner); |
| SkASSERT(indexPtr); |
| int index = *indexPtr; |
| - SkASSERT(index < fBatches.count()); |
| - Batch& batch = *fBatches[index]; |
| - |
| - // if this is our first child, we also push back a copy of the original batch and its |
| - // bounds |
| - if (batch.fChildren.empty()) { |
| - Batch* firstBatch = new Batch; |
| - firstBatch->fName = batch.fName; |
| - firstBatch->fBounds = batch.fBounds; |
| - fEvents.emplace_back(firstBatch); |
| - batch.fChildren.push_back(firstBatch); |
| - } |
| + SkASSERT(index < fBatchList.count()); |
| + BatchNode& batch = *fBatchList[index]; |
| + |
| + // set the ids for the child batch |
| + fCurrentBatch->fBatchListID = index; |
| + fCurrentBatch->fChildID = batch.fChildren.count(); |
| + |
| + // Update the bounds and store a pointer to the new batch |
| batch.fChildren.push_back(fCurrentBatch); |
| batch.fBounds = combiner->bounds(); |
| } |
| void GrAuditTrail::batchingResultNew(GrBatch* batch) { |
| - fIDLookup.set(batch, fBatches.count()); |
| - fBatches.push_back(fCurrentBatch); |
| + // Our algorithm doesn't bother to reorder inside of a BatchNode |
| + // so the ChildID will start at 0 |
| + fCurrentBatch->fBatchListID = fBatchList.count(); |
| + fCurrentBatch->fChildID = 0; |
| + |
| + // We use the batch pointer as a key to find the batchnode we are 'glomming' batches onto |
| + fIDLookup.set(batch, fCurrentBatch->fBatchListID); |
| + BatchNode* batchNode = new BatchNode; |
| + batchNode->fBounds = fCurrentBatch->fBounds; |
| + batchNode->fChildren.push_back(fCurrentBatch); |
| + fBatchList.emplace_back(batchNode); |
| } |
| template <typename T> |
| @@ -118,15 +125,27 @@ static SkString pretty_print_json(SkString json) { |
| return prettyPrintJson.prettify(json); |
| } |
| -SkString GrAuditTrail::toJson(bool batchList, bool prettyPrint) const { |
| +SkString GrAuditTrail::toJson(bool prettyPrint) const { |
| SkString json; |
| json.append("{"); |
| - if (!batchList) { |
| - JsonifyTArray(&json, "Stacks", fFrames, false); |
| + JsonifyTArray(&json, "Batches", fBatchList, false); |
| + json.append("}"); |
| + |
| + if (prettyPrint) { |
| + return pretty_print_json(json); |
| } else { |
| - JsonifyTArray(&json, "Batches", fBatches, false); |
| + return json; |
| } |
| - json.append("}"); |
| +} |
| + |
| +SkString GrAuditTrail::toJson(int clientID, bool prettyPrint) const { |
| + SkString json; |
| + json.append("{"); |
| + Batches** batches = fClientIDLookup.find(clientID); |
| + if (batches) { |
| + JsonifyTArray(&json, "Batches", **batches, false); |
| + } |
| + json.appendf("}"); |
| if (prettyPrint) { |
| return pretty_print_json(json); |
| @@ -135,26 +154,32 @@ SkString GrAuditTrail::toJson(bool batchList, bool prettyPrint) const { |
| } |
| } |
| -SkString GrAuditTrail::Frame::toJson() const { |
| +static void skrect_to_json(SkString* json, const char* name, const SkRect& rect) { |
| + json->appendf("\"%s\": {", name); |
| + json->appendf("\"Left\": %f,", rect.fLeft); |
|
ethannicholas
2016/02/26 20:55:32
I know it predates this change, but while we're at
joshualitt
2016/02/26 21:08:00
Can we do this as a follow on? I think we should f
|
| + json->appendf("\"Right\": %f,", rect.fRight); |
| + json->appendf("\"Top\": %f,", rect.fTop); |
| + json->appendf("\"Bottom\": %f", rect.fBottom); |
| + json->append("}"); |
| +} |
| + |
| +SkString GrAuditTrail::Batch::toJson() const { |
| SkString json; |
| json.append("{"); |
| - json.appendf("\"Name\": \"%s\"", fName); |
| - JsonifyTArray(&json, "Frames", fChildren, true); |
| + json.appendf("\"Name\": \"%s\",", fName.c_str()); |
| + json.appendf("\"ClientID\": \"%d\",", fClientID); |
| + json.appendf("\"BatchListID\": \"%d\",", fBatchListID); |
| + json.appendf("\"ChildID\": \"%d\",", fChildID); |
| + skrect_to_json(&json, "Bounds", fBounds); |
| json.append("}"); |
| return json; |
| } |
| -SkString GrAuditTrail::Batch::toJson() const { |
| +SkString GrAuditTrail::BatchNode::toJson() const { |
| SkString json; |
| json.append("{"); |
| - json.appendf("\"Name\": \"%s\",", fName); |
| - json.append("\"Bounds\": {"); |
| - json.appendf("\"Left\": %f,", fBounds.fLeft); |
| - json.appendf("\"Right\": %f,", fBounds.fRight); |
| - json.appendf("\"Top\": %f,", fBounds.fTop); |
| - json.appendf("\"Bottom\": %f", fBounds.fBottom); |
| - JsonifyTArray(&json, "Children", fChildren, true); |
| - json.append("}"); |
| + skrect_to_json(&json, "Bounds", fBounds); |
| + JsonifyTArray(&json, "Batches", fChildren, true); |
| json.append("}"); |
| return json; |
| } |