Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: src/gpu/GrDrawTarget.cpp

Issue 2237633003: Avoid creating full screen clear batches when there is already one in the queue. (Closed) Base URL: https://chromium.googlesource.com/skia.git@clear
Patch Set: use sk_sp<GrClearBatch> Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/batches/GrClearBatch.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrDrawTarget.cpp
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index c424f5a593929b6ba7db0d15685f99b4a9d3cfb3..32f755e0ebd5d086503db1add97777dee9f48e2f 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -45,7 +45,8 @@ static const int kDefaultMaxBatchLookahead = 10;
GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* resourceProvider,
GrAuditTrail* auditTrail, const Options& options)
- : fGpu(SkRef(gpu))
+ : fLastFullClearBatch(nullptr)
+ , fGpu(SkRef(gpu))
, fResourceProvider(resourceProvider)
, fAuditTrail(auditTrail)
, fFlags(0)
@@ -287,6 +288,7 @@ void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) {
}
void GrDrawTarget::reset() {
+ fLastFullClearBatch = nullptr;
fRecordedBatches.reset();
if (fInstancedRendering) {
fInstancedRendering->endFlush();
@@ -458,12 +460,23 @@ void GrDrawTarget::addBatch(sk_sp<GrBatch> batch) {
}
void GrDrawTarget::fullClear(GrRenderTarget* renderTarget, GrColor color) {
- // Currently this just inserts a clear batch. However, once in MDB this can remove all the
- // previously recorded batches and change the load op to clear with supplied color.
- sk_sp<GrBatch> batch = GrClearBatch::Make(SkIRect::MakeWH(renderTarget->width(),
- renderTarget->height()),
- color, renderTarget);
- this->recordBatch(batch.get(), batch->bounds());
+ // Currently this just inserts or updates the last clear batch. However, once in MDB this can
+ // remove all the previously recorded batches and change the load op to clear with supplied
+ // color.
+ if (fLastFullClearBatch &&
+ fLastFullClearBatch->renderTargetUniqueID() == renderTarget->getUniqueID()) {
+ // As currently implemented, fLastFullClearBatch should be the last batch because we would
+ // have cleared it when another batch was recorded.
+ SkASSERT(fRecordedBatches.back().fBatch.get() == fLastFullClearBatch);
+ fLastFullClearBatch->setColor(color);
+ return;
+ }
+ sk_sp<GrClearBatch> batch(GrClearBatch::Make(SkIRect::MakeWH(renderTarget->width(),
+ renderTarget->height()),
+ color, renderTarget));
+ if (batch.get() == this->recordBatch(batch.get(), batch->bounds())) {
+ fLastFullClearBatch = batch.get();
+ }
}
void GrDrawTarget::discard(GrRenderTarget* renderTarget) {
@@ -509,7 +522,7 @@ static void join(SkRect* out, const SkRect& a, const SkRect& b) {
out->fBottom = SkTMax(a.fBottom, b.fBottom);
}
-void GrDrawTarget::recordBatch(GrBatch* batch, const SkRect& clippedBounds) {
+GrBatch* GrDrawTarget::recordBatch(GrBatch* batch, const SkRect& clippedBounds) {
// A closed drawTarget should never receive new/more batches
SkASSERT(!this->isClosed());
@@ -546,7 +559,7 @@ void GrDrawTarget::recordBatch(GrBatch* batch, const SkRect& clippedBounds) {
GR_AUDIT_TRAIL_BATCHING_RESULT_COMBINED(fAuditTrail, candidate, batch);
join(&fRecordedBatches.fromBack(i).fClippedBounds,
fRecordedBatches.fromBack(i).fClippedBounds, clippedBounds);
- return;
+ return candidate;
}
// Stop going backwards if we would cause a painter's order violation.
const SkRect& candidateBounds = fRecordedBatches.fromBack(i).fClippedBounds;
@@ -566,6 +579,8 @@ void GrDrawTarget::recordBatch(GrBatch* batch, const SkRect& clippedBounds) {
}
GR_AUDIT_TRAIL_BATCHING_RESULT_NEW(fAuditTrail, batch);
fRecordedBatches.emplace_back(RecordedBatch{sk_ref_sp(batch), clippedBounds});
+ fLastFullClearBatch = nullptr;
+ return batch;
}
void GrDrawTarget::forwardCombine() {
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/batches/GrClearBatch.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698