Index: src/gpu/GrImmediateDrawTarget.cpp |
diff --git a/src/gpu/GrImmediateDrawTarget.cpp b/src/gpu/GrImmediateDrawTarget.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4c42a30f864d7c3982b80642882329ddeff24446 |
--- /dev/null |
+++ b/src/gpu/GrImmediateDrawTarget.cpp |
@@ -0,0 +1,106 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrImmediateDrawTarget.h" |
+ |
+#include "GrBatch.h" |
+#include "GrGpu.h" |
+#include "GrPipeline.h" |
+#include "GrRenderTarget.h" |
+#include "SkRect.h" |
+#include "SkTypes.h" |
+ |
+GrImmediateDrawTarget::GrImmediateDrawTarget(GrContext* context) |
+ : INHERITED(context) |
+ , fBatchTarget(this->getGpu()) |
+ , fDrawID(0) { |
+} |
+ |
+GrImmediateDrawTarget::~GrImmediateDrawTarget() { |
+ this->reset(); |
+} |
+ |
+void GrImmediateDrawTarget::onDrawBatch(GrBatch* batch, |
+ const PipelineInfo& pipelineInfo) { |
+ SkAlignedSStorage<sizeof(GrPipeline)> pipelineStorage; |
+ GrPipeline* pipeline = reinterpret_cast<GrPipeline*>(pipelineStorage.get()); |
+ if (!this->setupPipelineAndShouldDraw(pipeline, pipelineInfo)) { |
+ pipeline->~GrPipeline(); |
+ return; |
+ } |
+ |
+ batch->initBatchTracker(pipeline->getInitBatchTracker()); |
+ |
+ fBatchTarget.resetNumberOfDraws(); |
+ |
+ batch->generateGeometry(&fBatchTarget, pipeline); |
+ batch->setNumberOfDraws(fBatchTarget.numberOfDraws()); |
+ |
+ fBatchTarget.preFlush(); |
+ fBatchTarget.flushNext(batch->numberOfDraws()); |
+ fBatchTarget.postFlush(); |
+ |
+ pipeline->~GrPipeline(); |
+} |
+ |
+void GrImmediateDrawTarget::onClear(const SkIRect* rect, GrColor color, |
+ bool canIgnoreRect, GrRenderTarget* renderTarget) { |
+ this->getGpu()->clear(rect, color, canIgnoreRect, renderTarget); |
+} |
+ |
+void GrImmediateDrawTarget::onCopySurface(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint) { |
+ SkASSERT(this->getGpu()->canCopySurface(dst, src, srcRect, dstPoint)); |
+ this->getGpu()->copySurface(dst, src, srcRect, dstPoint); |
+} |
+ |
+void GrImmediateDrawTarget::clearStencilClip(const SkIRect& rect, |
+ bool insideClip, |
+ GrRenderTarget* renderTarget) { |
+ this->getGpu()->clearStencilClip(rect, insideClip, renderTarget); |
+} |
+ |
+void GrImmediateDrawTarget::discard(GrRenderTarget* renderTarget) { |
+ if (!this->caps()->discardRenderTargetSupport()) { |
+ return; |
+ } |
+ |
+ this->getGpu()->discard(renderTarget); |
+} |
+ |
+void GrImmediateDrawTarget::onReset() { |
+ fBatchTarget.reset(); |
+} |
+ |
+void GrImmediateDrawTarget::onFlush() { |
+ ++fDrawID; |
+} |
+ |
+bool |
+GrImmediateDrawTarget::setupPipelineAndShouldDraw(GrPipeline* pipeline, |
+ const GrDrawTarget::PipelineInfo& pipelineInfo) { |
+ this->setupPipeline(pipelineInfo, pipeline); |
+ |
+ if (pipeline->mustSkip()) { |
+ return false; |
+ } |
+ |
+ this->recordXferBarrierIfNecessary(pipeline); |
+ return true; |
+} |
+ |
+void GrImmediateDrawTarget::recordXferBarrierIfNecessary(const GrPipeline* pipeline) { |
+ const GrXferProcessor& xp = *pipeline->getXferProcessor(); |
+ GrRenderTarget* rt = pipeline->getRenderTarget(); |
+ |
+ GrXferBarrierType barrierType; |
+ if (xp.willNeedXferBarrier(rt, *this->caps(), &barrierType)) { |
+ this->getGpu()->xferBarrier(rt, barrierType); |
+ } |
+} |