aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2016-03-07 11:50:44 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-07 11:50:44 -0800
commitaecc018f86d911198b7c7775cee04f61bd10b430 (patch)
treee952d99ee53a5437878203018a2e955152457eac /src
parent673748a3201a1611bc1c484e18ba558661d2839c (diff)
Attempt to combine batches in forward direction before flush
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrContext.cpp1
-rw-r--r--src/gpu/GrDrawTarget.cpp64
-rw-r--r--src/gpu/GrDrawTarget.h16
3 files changed, 70 insertions, 11 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 8844f1ac83..a16d5c009a 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -95,6 +95,7 @@ void GrContext::initCommon(const GrContextOptions& options) {
dtOptions.fClipBatchToBounds = options.fClipBatchToBounds;
dtOptions.fDrawBatchBounds = options.fDrawBatchBounds;
dtOptions.fMaxBatchLookback = options.fMaxBatchLookback;
+ dtOptions.fMaxBatchLookahead = options.fMaxBatchLookahead;
fDrawingManager.reset(new GrDrawingManager(this, dtOptions, &fSingleOwner));
// GrBatchFontCache will eventually replace GrFontCache
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index fc8c71b443..cf3baa1a12 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -35,7 +35,8 @@
////////////////////////////////////////////////////////////////////////////////
// Experimentally we have found that most batching occurs within the first 10 comparisons.
-static const int kDefaultMaxBatchLookback = 10;
+static const int kDefaultMaxBatchLookback = 10;
+static const int kDefaultMaxBatchLookahead = 10;
GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* resourceProvider,
GrAuditTrail* auditTrail, const Options& options)
@@ -51,6 +52,8 @@ GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* r
fDrawBatchBounds = options.fDrawBatchBounds;
fMaxBatchLookback = (options.fMaxBatchLookback < 0) ? kDefaultMaxBatchLookback :
options.fMaxBatchLookback;
+ fMaxBatchLookahead = (options.fMaxBatchLookahead < 0) ? kDefaultMaxBatchLookahead :
+ options.fMaxBatchLookahead;
rt->setLastDrawTarget(this);
@@ -113,11 +116,15 @@ void GrDrawTarget::dump() const {
#if 0
SkDebugf("*******************************\n");
#endif
- SkDebugf("%d: %s\n", i, fBatches[i]->name());
+ if (fBatches[i]) {
+ SkDebugf("%d: <combined forward>\n", i);
+ } else {
+ SkDebugf("%d: %s\n", i, fBatches[i]->name());
#if 0
- SkString str = fBatches[i]->dumpInfo();
- SkDebugf("%s\n", str.c_str());
+ SkString str = fBatches[i]->dumpInfo();
+ SkDebugf("%s\n", str.c_str());
#endif
+ }
}
}
#endif
@@ -193,7 +200,9 @@ void GrDrawTarget::prepareBatches(GrBatchFlushState* flushState) {
// Loop over the batches that haven't yet generated their geometry
for (int i = 0; i < fBatches.count(); ++i) {
- fBatches[i]->prepare(flushState);
+ if (fBatches[i]) {
+ fBatches[i]->prepare(flushState);
+ }
}
}
@@ -201,6 +210,9 @@ void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) {
// Draw all the generated geometry.
SkRandom random;
for (int i = 0; i < fBatches.count(); ++i) {
+ if (!fBatches[i]) {
+ continue;
+ }
if (fDrawBatchBounds) {
const SkRect& bounds = fBatches[i]->bounds();
SkIRect ibounds;
@@ -496,6 +508,48 @@ void GrDrawTarget::recordBatch(GrBatch* batch) {
fBatches.push_back().reset(SkRef(batch));
}
+void GrDrawTarget::forwardCombine() {
+ for (int i = 0; i < fBatches.count() - 2; ++i) {
+ GrBatch* batch = fBatches[i];
+ int maxCandidateIdx = SkTMin(i + fMaxBatchLookahead, fBatches.count() - 1);
+ int j = i + 1;
+ while (true) {
+ GrBatch* candidate = fBatches[j];
+ // We cannot continue to search if the render target changes
+ if (candidate->renderTargetUniqueID() != batch->renderTargetUniqueID()) {
+ GrBATCH_INFO("\t\tBreaking because of (%s, B%u) Rendertarget\n",
+ candidate->name(), candidate->uniqueID());
+ break;
+ }
+ if (j == i +1) {
+ // We assume batch would have combined with candidate when the candidate was added
+ // via backwards combining in recordBatch.
+ SkASSERT(!batch->combineIfPossible(candidate, *this->caps()));
+ } else if (batch->combineIfPossible(candidate, *this->caps())) {
+ GrBATCH_INFO("\t\tCombining with (%s, B%u)\n", candidate->name(),
+ candidate->uniqueID());
+ GR_AUDIT_TRAIL_BATCHING_RESULT_COMBINED(fAuditTrail, candidate);
+ fBatches[j].reset(SkRef(batch));
+ fBatches[i].reset(nullptr);
+ break;
+ }
+ // Stop going traversing if we would cause a painter's order violation.
+ // TODO: The bounds used here do not fully consider the clip. It may be advantageous
+ // to clip each batch's bounds to the clip.
+ if (intersect(candidate->bounds(), batch->bounds())) {
+ GrBATCH_INFO("\t\tIntersects with (%s, B%u)\n", candidate->name(),
+ candidate->uniqueID());
+ break;
+ }
+ ++j;
+ if (j > maxCandidateIdx) {
+ GrBATCH_INFO("\t\tReached max lookahead or end of batch array %d\n", i);
+ break;
+ }
+ }
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder,
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 8b30ab9b60..9a6dbc9e71 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -45,10 +45,15 @@ class GrDrawTarget final : public SkRefCnt {
public:
/** Options for GrDrawTarget behavior. */
struct Options {
- Options () : fClipBatchToBounds(false), fDrawBatchBounds(false), fMaxBatchLookback(-1) {}
+ Options ()
+ : fClipBatchToBounds(false)
+ , fDrawBatchBounds(false)
+ , fMaxBatchLookback(-1)
+ , fMaxBatchLookahead(-1) {}
bool fClipBatchToBounds;
bool fDrawBatchBounds;
int fMaxBatchLookback;
+ int fMaxBatchLookahead;
};
GrDrawTarget(GrRenderTarget*, GrGpu*, GrResourceProvider*, GrAuditTrail*, const Options&);
@@ -61,7 +66,9 @@ public:
#ifdef ENABLE_MDB
this->setFlag(kClosed_Flag);
#endif
+ this->forwardCombine();
}
+
bool isClosed() const { return this->isSetFlag(kClosed_Flag); }
// TODO: this entry point is only needed in the non-MDB world. Remove when
@@ -216,6 +223,7 @@ private:
};
void recordBatch(GrBatch*);
+ void forwardCombine();
bool installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder,
const GrScissorState* scissor,
GrDrawBatch* batch);
@@ -232,11 +240,6 @@ private:
void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
const GrStencilAttachment*,
GrStencilSettings*);
- bool setupClip(const GrPipelineBuilder&,
- GrPipelineBuilder::AutoRestoreFragmentProcessorState*,
- GrPipelineBuilder::AutoRestoreStencil*,
- GrScissorState*,
- const SkRect* devBounds);
void addDependency(GrDrawTarget* dependedOn);
@@ -260,6 +263,7 @@ private:
bool fDrawBatchBounds;
int fMaxBatchLookback;
+ int fMaxBatchLookahead;
typedef SkRefCnt INHERITED;
};