| OLD | NEW |
| 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 14 matching lines...) Expand all Loading... |
| 25 #include "batches/GrDiscardBatch.h" | 25 #include "batches/GrDiscardBatch.h" |
| 26 #include "batches/GrDrawBatch.h" | 26 #include "batches/GrDrawBatch.h" |
| 27 #include "batches/GrDrawPathBatch.h" | 27 #include "batches/GrDrawPathBatch.h" |
| 28 #include "batches/GrRectBatchFactory.h" | 28 #include "batches/GrRectBatchFactory.h" |
| 29 #include "batches/GrStencilPathBatch.h" | 29 #include "batches/GrStencilPathBatch.h" |
| 30 | 30 |
| 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 const Options& options) |
| 36 : fGpu(SkRef(gpu)) | 37 : fGpu(SkRef(gpu)) |
| 37 , fResourceProvider(resourceProvider) | 38 , fResourceProvider(resourceProvider) |
| 38 , fFlushState(fGpu, fResourceProvider, 0) | 39 , fFlushState(fGpu, fResourceProvider, 0) |
| 39 , fFlushing(false) | 40 , fFlushing(false) |
| 40 , fFirstUnpreparedBatch(0) | 41 , fFirstUnpreparedBatch(0) |
| 41 , fFlags(0) { | 42 , fFlags(0) |
| 43 , fOptions(options) { |
| 42 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) | 44 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) |
| 43 fContext = fGpu->getContext(); | 45 fContext = fGpu->getContext(); |
| 44 fClipMaskManager.reset(new GrClipMaskManager(this)); | 46 fClipMaskManager.reset(new GrClipMaskManager(this)); |
| 45 | 47 |
| 46 #ifdef SK_DEBUG | 48 #ifdef SK_DEBUG |
| 47 static int debugID = 0; | 49 static int debugID = 0; |
| 48 fDebugID = debugID++; | 50 fDebugID = debugID++; |
| 49 #endif | 51 #endif |
| 50 } | 52 } |
| 51 | 53 |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 | 467 |
| 466 template <class Left, class Right> static bool intersect(const Left& a, const Ri
ght& b) { | 468 template <class Left, class Right> static bool intersect(const Left& a, const Ri
ght& b) { |
| 467 SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom && | 469 SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom && |
| 468 b.fLeft <= b.fRight && b.fTop <= b.fBottom); | 470 b.fLeft <= b.fRight && b.fTop <= b.fBottom); |
| 469 return a.fLeft < b.fRight && b.fLeft < a.fRight && a.fTop < b.fBottom && b.f
Top < a.fBottom; | 471 return a.fLeft < b.fRight && b.fLeft < a.fRight && a.fTop < b.fBottom && b.f
Top < a.fBottom; |
| 470 } | 472 } |
| 471 | 473 |
| 472 void GrDrawTarget::recordBatch(GrBatch* batch) { | 474 void GrDrawTarget::recordBatch(GrBatch* batch) { |
| 473 // A closed drawTarget should never receive new/more batches | 475 // A closed drawTarget should never receive new/more batches |
| 474 SkASSERT(!this->isClosed()); | 476 SkASSERT(!this->isClosed()); |
| 477 // Should never have batches queued up when in immediate mode. |
| 478 SkASSERT(!fOptions.fImmediateMode || !fBatches.count()); |
| 475 | 479 |
| 476 // Check if there is a Batch Draw we can batch with by linearly searching ba
ck until we either | 480 // Check if there is a Batch Draw we can batch with by linearly searching ba
ck until we either |
| 477 // 1) check every draw | 481 // 1) check every draw |
| 478 // 2) intersect with something | 482 // 2) intersect with something |
| 479 // 3) find a 'blocker' | 483 // 3) find a 'blocker' |
| 480 // Experimentally we have found that most batching occurs within the first 1
0 comparisons. | 484 // Experimentally we have found that most batching occurs within the first 1
0 comparisons. |
| 481 static const int kMaxLookback = 10; | 485 static const int kMaxLookback = 10; |
| 482 | 486 |
| 483 GrBATCH_INFO("Re-Recording (%s, B%u)\n" | 487 GrBATCH_INFO("Re-Recording (%s, B%u)\n" |
| 484 "\tBounds LRTB (%f, %f, %f, %f)\n", | 488 "\tBounds LRTB (%f, %f, %f, %f)\n", |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 } | 521 } |
| 518 } | 522 } |
| 519 } else { | 523 } else { |
| 520 GrBATCH_INFO("\t\tFirstBatch\n"); | 524 GrBATCH_INFO("\t\tFirstBatch\n"); |
| 521 } | 525 } |
| 522 fBatches.push_back().reset(SkRef(batch)); | 526 fBatches.push_back().reset(SkRef(batch)); |
| 523 if (fBatches.count() > kMaxLookback) { | 527 if (fBatches.count() > kMaxLookback) { |
| 524 SkASSERT(fBatches.count() - kMaxLookback - fFirstUnpreparedBatch == 1); | 528 SkASSERT(fBatches.count() - kMaxLookback - fFirstUnpreparedBatch == 1); |
| 525 fBatches[fFirstUnpreparedBatch++]->prepare(&fFlushState); | 529 fBatches[fFirstUnpreparedBatch++]->prepare(&fFlushState); |
| 526 } | 530 } |
| 531 if (fOptions.fImmediateMode) { |
| 532 this->flush(); |
| 533 } |
| 527 } | 534 } |
| 528 | 535 |
| 529 /////////////////////////////////////////////////////////////////////////////// | 536 /////////////////////////////////////////////////////////////////////////////// |
| 530 | 537 |
| 531 bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineB
uilder, | 538 bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineB
uilder, |
| 532 const GrScissorState* scissor, | 539 const GrScissorState* scissor, |
| 533 GrDrawBatch* batch) { | 540 GrDrawBatch* batch) { |
| 534 GrPipeline::CreateArgs args; | 541 GrPipeline::CreateArgs args; |
| 535 args.fPipelineBuilder = pipelineBuilder; | 542 args.fPipelineBuilder = pipelineBuilder; |
| 536 args.fCaps = this->caps(); | 543 args.fCaps = this->caps(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 548 } | 555 } |
| 549 | 556 |
| 550 return true; | 557 return true; |
| 551 } | 558 } |
| 552 | 559 |
| 553 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { | 560 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { |
| 554 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); | 561 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); |
| 555 this->recordBatch(batch); | 562 this->recordBatch(batch); |
| 556 batch->unref(); | 563 batch->unref(); |
| 557 } | 564 } |
| OLD | NEW |