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

Side by Side Diff: src/gpu/GrDrawTarget.cpp

Issue 1414773002: Add the machinery to GrDrawTarget to enable topological sorting (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address code review comments Created 5 years, 2 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 unified diff | Download patch
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrDrawTarget.h" 9 #include "GrDrawTarget.h"
10 10
(...skipping 20 matching lines...) Expand all
31 #include "SkStrokeRec.h" 31 #include "SkStrokeRec.h"
32 32
33 //////////////////////////////////////////////////////////////////////////////// 33 ////////////////////////////////////////////////////////////////////////////////
34 34
35 GrDrawTarget::GrDrawTarget(GrGpu* gpu, GrResourceProvider* resourceProvider) 35 GrDrawTarget::GrDrawTarget(GrGpu* gpu, GrResourceProvider* resourceProvider)
36 : fGpu(SkRef(gpu)) 36 : fGpu(SkRef(gpu))
37 , fResourceProvider(resourceProvider) 37 , fResourceProvider(resourceProvider)
38 , fFlushState(fGpu, fResourceProvider, 0) 38 , fFlushState(fGpu, fResourceProvider, 0)
39 , fFlushing(false) 39 , fFlushing(false)
40 , fFirstUnpreparedBatch(0) 40 , fFirstUnpreparedBatch(0)
41 , fClosed(false) { 41 , fFlags(0) {
42 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) 42 // TODO: Stop extracting the context (currently needed by GrClipMaskManager)
43 fContext = fGpu->getContext(); 43 fContext = fGpu->getContext();
44 fClipMaskManager.reset(new GrClipMaskManager(this)); 44 fClipMaskManager.reset(new GrClipMaskManager(this));
45 } 45 }
46 46
47 GrDrawTarget::~GrDrawTarget() { 47 GrDrawTarget::~GrDrawTarget() {
48 fGpu->unref(); 48 fGpu->unref();
49 } 49 }
50 50
51 //////////////////////////////////////////////////////////////////////////////// 51 ////////////////////////////////////////////////////////////////////////////////
52 52
53 // Add a GrDrawTarget-based dependency
54 void GrDrawTarget::addDependency(GrDrawTarget* dependedOn) {
55 SkASSERT(!dependedOn->dependsOn(this)); // loops are bad
56
57 if (this->dependsOn(dependedOn)) {
58 return; // don't add duplicate dependencies
59 }
60
61 *fDependencies.push() = dependedOn;
62 }
63
64 // Convert from a GrSurface-based dependency to a GrDrawTarget one
65 void GrDrawTarget::addDependency(GrSurface* dependedOn) {
66 if (dependedOn->asRenderTarget() && dependedOn->asRenderTarget()->getLastDra wTarget()) {
67 // If it is still receiving dependencies, this DT shouldn't be closed
68 SkASSERT(!this->isClosed());
69
70 GrDrawTarget* dt = dependedOn->asRenderTarget()->getLastDrawTarget();
71 if (dt == this) {
72 // self-read - presumably for dst reads
73 } else {
74 this->addDependency(dt);
75
76 // Can't make it closed in the self-read case
77 dt->makeClosed();
78 }
79 }
80 }
81
53 bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil der, 82 bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuil der,
54 const GrProcOptInfo& colorPOI, 83 const GrProcOptInfo& colorPOI,
55 const GrProcOptInfo& coveragePOI, 84 const GrProcOptInfo& coveragePOI,
56 GrXferProcessor::DstTexture* dstTextu re, 85 GrXferProcessor::DstTexture* dstTextu re,
57 const SkRect& batchBounds) { 86 const SkRect& batchBounds) {
58 SkRect bounds = batchBounds; 87 SkRect bounds = batchBounds;
59 bounds.outset(0.5f, 0.5f); 88 bounds.outset(0.5f, 0.5f);
60 89
61 if (!pipelineBuilder.willXPNeedDstTexture(*this->caps(), colorPOI, coverageP OI)) { 90 if (!pipelineBuilder.willXPNeedDstTexture(*this->caps(), colorPOI, coverageP OI)) {
62 return true; 91 return true;
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 } 436 }
408 437
409 template <class Left, class Right> static bool intersect(const Left& a, const Ri ght& b) { 438 template <class Left, class Right> static bool intersect(const Left& a, const Ri ght& b) {
410 SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom && 439 SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom &&
411 b.fLeft <= b.fRight && b.fTop <= b.fBottom); 440 b.fLeft <= b.fRight && b.fTop <= b.fBottom);
412 return a.fLeft < b.fRight && b.fLeft < a.fRight && a.fTop < b.fBottom && b.f Top < a.fBottom; 441 return a.fLeft < b.fRight && b.fLeft < a.fRight && a.fTop < b.fBottom && b.f Top < a.fBottom;
413 } 442 }
414 443
415 void GrDrawTarget::recordBatch(GrBatch* batch) { 444 void GrDrawTarget::recordBatch(GrBatch* batch) {
416 // A closed drawTarget should never receive new/more batches 445 // A closed drawTarget should never receive new/more batches
417 SkASSERT(!fClosed); 446 SkASSERT(!this->isClosed());
418 447
419 // Check if there is a Batch Draw we can batch with by linearly searching ba ck until we either 448 // Check if there is a Batch Draw we can batch with by linearly searching ba ck until we either
420 // 1) check every draw 449 // 1) check every draw
421 // 2) intersect with something 450 // 2) intersect with something
422 // 3) find a 'blocker' 451 // 3) find a 'blocker'
423 // Experimentally we have found that most batching occurs within the first 1 0 comparisons. 452 // Experimentally we have found that most batching occurs within the first 1 0 comparisons.
424 static const int kMaxLookback = 10; 453 static const int kMaxLookback = 10;
425 454
426 GrBATCH_INFO("Re-Recording (%s, B%u)\n" 455 GrBATCH_INFO("Re-Recording (%s, B%u)\n"
427 "\tBounds LRTB (%f, %f, %f, %f)\n", 456 "\tBounds LRTB (%f, %f, %f, %f)\n",
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 } 520 }
492 521
493 return true; 522 return true;
494 } 523 }
495 524
496 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) { 525 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) {
497 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); 526 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt);
498 this->recordBatch(batch); 527 this->recordBatch(batch);
499 batch->unref(); 528 batch->unref();
500 } 529 }
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698