| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrAuditTrail.h" | 8 #include "GrAuditTrail.h" |
| 9 #include "batches/GrBatch.h" | 9 #include "batches/GrBatch.h" |
| 10 | 10 |
| 11 const int GrAuditTrail::kGrAuditTrailInvalidID = -1; | 11 const int GrAuditTrail::kGrAuditTrailInvalidID = -1; |
| 12 | 12 |
| 13 void GrAuditTrail::addBatch(const GrBatch* batch) { | 13 void GrAuditTrail::addBatch(const GrBatch* batch) { |
| 14 SkASSERT(fEnabled); | 14 SkASSERT(fEnabled); |
| 15 Batch* auditBatch = new Batch; | 15 Batch* auditBatch = new Batch; |
| 16 fBatchPool.emplace_back(auditBatch); | 16 fBatchPool.emplace_back(auditBatch); |
| 17 auditBatch->fName = batch->name(); | 17 auditBatch->fName = batch->name(); |
| 18 auditBatch->fBounds = batch->bounds(); | 18 auditBatch->fBounds = batch->bounds(); |
| 19 auditBatch->fClientID = kGrAuditTrailInvalidID; | 19 auditBatch->fClientID = kGrAuditTrailInvalidID; |
| 20 auditBatch->fBatchListID = kGrAuditTrailInvalidID; | 20 auditBatch->fBatchListID = kGrAuditTrailInvalidID; |
| 21 auditBatch->fChildID = kGrAuditTrailInvalidID; | 21 auditBatch->fChildID = kGrAuditTrailInvalidID; |
| 22 | 22 |
| 23 // consume the current stack trace if any | 23 // consume the current stack trace if any |
| 24 auditBatch->fStackTrace = fCurrentStackTrace; | 24 auditBatch->fStackTrace = fCurrentStackTrace; |
| 25 fCurrentStackTrace.reset(); | 25 fCurrentStackTrace.reset(); |
| 26 | 26 |
| 27 if (fClientID != kGrAuditTrailInvalidID) { | 27 if (fClientID != kGrAuditTrailInvalidID) { |
| 28 auditBatch->fClientID = fClientID; | 28 auditBatch->fClientID = fClientID; |
| 29 Batches** batchesLookup = fClientIDLookup.find(fClientID); | 29 Batches** batchesLookup = fClientIDLookup.find(fClientID); |
| 30 Batches* batches = nullptr; | 30 Batches* batches = nullptr; |
| 31 if (!batchesLookup) { | 31 if (!batchesLookup) { |
| 32 batches = new Batches; | 32 batches = new Batches; |
| 33 fClientIDLookup.set(fClientID, batches); | 33 fClientIDLookup.set(fClientID, batches); |
| 34 } else { | 34 } else { |
| 35 batches = *batchesLookup; | 35 batches = *batchesLookup; |
| 36 } | 36 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 63 // Look up the batch which will be glommed | 63 // Look up the batch which will be glommed |
| 64 int* consumedPtr = fIDLookup.find(consumed->uniqueID()); | 64 int* consumedPtr = fIDLookup.find(consumed->uniqueID()); |
| 65 SkASSERT(consumedPtr); | 65 SkASSERT(consumedPtr); |
| 66 int consumedIndex = *consumedPtr; | 66 int consumedIndex = *consumedPtr; |
| 67 SkASSERT(consumedIndex < fBatchList.count() && fBatchList[consumedIndex]); | 67 SkASSERT(consumedIndex < fBatchList.count() && fBatchList[consumedIndex]); |
| 68 BatchNode& consumedBatch = *fBatchList[consumedIndex]; | 68 BatchNode& consumedBatch = *fBatchList[consumedIndex]; |
| 69 | 69 |
| 70 // steal all of consumed's batches | 70 // steal all of consumed's batches |
| 71 for (int i = 0; i < consumedBatch.fChildren.count(); i++) { | 71 for (int i = 0; i < consumedBatch.fChildren.count(); i++) { |
| 72 Batch* childBatch = consumedBatch.fChildren[i]; | 72 Batch* childBatch = consumedBatch.fChildren[i]; |
| 73 | 73 |
| 74 // set the ids for the child batch | 74 // set the ids for the child batch |
| 75 childBatch->fBatchListID = index; | 75 childBatch->fBatchListID = index; |
| 76 childBatch->fChildID = consumerBatch.fChildren.count(); | 76 childBatch->fChildID = consumerBatch.fChildren.count(); |
| 77 consumerBatch.fChildren.push_back(childBatch); | 77 consumerBatch.fChildren.push_back(childBatch); |
| 78 } | 78 } |
| 79 | 79 |
| 80 // Update the bounds for the combineWith node | 80 // Update the bounds for the combineWith node |
| 81 consumerBatch.fBounds = consumer->bounds(); | 81 consumerBatch.fBounds = consumer->bounds(); |
| 82 | 82 |
| 83 // remove the old node from our batchlist and clear the combinee's lookup | 83 // remove the old node from our batchlist and clear the combinee's lookup |
| 84 // NOTE: because we can't change the shape of the batchlist, we use a sentin
el | 84 // NOTE: because we can't change the shape of the batchlist, we use a sentin
el |
| 85 fBatchList[consumedIndex].reset(nullptr); | 85 fBatchList[consumedIndex].reset(nullptr); |
| 86 fIDLookup.remove(consumed->uniqueID()); | 86 fIDLookup.remove(consumed->uniqueID()); |
| 87 } | 87 } |
| 88 | 88 |
| 89 void GrAuditTrail::copyOutFromBatchList(BatchInfo* outBatchInfo, int batchListID
) { | 89 void GrAuditTrail::copyOutFromBatchList(BatchInfo* outBatchInfo, int batchListID
) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 109 int currentBatchListID = kGrAuditTrailInvalidID; | 109 int currentBatchListID = kGrAuditTrailInvalidID; |
| 110 for (int i = 0; i < (*batchesLookup)->count(); i++) { | 110 for (int i = 0; i < (*batchesLookup)->count(); i++) { |
| 111 const Batch* batch = (**batchesLookup)[i]; | 111 const Batch* batch = (**batchesLookup)[i]; |
| 112 | 112 |
| 113 // Because we will copy out all of the batches associated with a giv
en | 113 // Because we will copy out all of the batches associated with a giv
en |
| 114 // batch list id everytime the id changes, we only have to update ou
r struct | 114 // batch list id everytime the id changes, we only have to update ou
r struct |
| 115 // when the id changes. | 115 // when the id changes. |
| 116 if (kGrAuditTrailInvalidID == currentBatchListID || | 116 if (kGrAuditTrailInvalidID == currentBatchListID || |
| 117 batch->fBatchListID != currentBatchListID) { | 117 batch->fBatchListID != currentBatchListID) { |
| 118 BatchInfo& outBatchInfo = outInfo->push_back(); | 118 BatchInfo& outBatchInfo = outInfo->push_back(); |
| 119 | 119 |
| 120 // copy out all of the batches so the client can display them ev
en if | 120 // copy out all of the batches so the client can display them ev
en if |
| 121 // they have a different clientID | 121 // they have a different clientID |
| 122 this->copyOutFromBatchList(&outBatchInfo, batch->fBatchListID); | 122 this->copyOutFromBatchList(&outBatchInfo, batch->fBatchListID); |
| 123 } | 123 } |
| 124 } | 124 } |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 | 127 |
| 128 void GrAuditTrail::getBoundsByBatchListID(BatchInfo* outInfo, int batchListID) { | 128 void GrAuditTrail::getBoundsByBatchListID(BatchInfo* outInfo, int batchListID) { |
| 129 this->copyOutFromBatchList(outInfo, batchListID); | 129 this->copyOutFromBatchList(outInfo, batchListID); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 | 289 |
| 290 SkString GrAuditTrail::BatchNode::toJson() const { | 290 SkString GrAuditTrail::BatchNode::toJson() const { |
| 291 SkString json; | 291 SkString json; |
| 292 json.append("{"); | 292 json.append("{"); |
| 293 json.appendf("\"RenderTarget\": \"%u\",", fRenderTargetUniqueID); | 293 json.appendf("\"RenderTarget\": \"%u\",", fRenderTargetUniqueID); |
| 294 skrect_to_json(&json, "Bounds", fBounds); | 294 skrect_to_json(&json, "Bounds", fBounds); |
| 295 JsonifyTArray(&json, "Batches", fChildren, true); | 295 JsonifyTArray(&json, "Batches", fChildren, true); |
| 296 json.append("}"); | 296 json.append("}"); |
| 297 return json; | 297 return json; |
| 298 } | 298 } |
| OLD | NEW |