Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index cb60f11c09ecb55fdade3c2f4926865ef3a2d88c..e22c45bafc186ec711fad2ec32402b6af293b7e3 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -12,6 +12,7 @@ |
#include "GrContext.h" |
#include "GrDrawTargetCaps.h" |
#include "GrPath.h" |
+#include "GrPipeline.h" |
#include "GrRenderTarget.h" |
#include "GrSurfacePriv.h" |
#include "GrTemplates.h" |
@@ -385,9 +386,11 @@ bool GrDrawTarget::checkDraw(const GrPipelineBuilder& pipelineBuilder, |
} |
bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder, |
+ const GrProcOptInfo& colorPOI, |
+ const GrProcOptInfo& coveragePOI, |
GrDeviceCoordTexture* dstCopy, |
const SkRect* drawBounds) { |
- if (!pipelineBuilder.willXPNeedDstCopy(*this->caps())) { |
+ if (!pipelineBuilder.willXPNeedDstCopy(*this->caps(), colorPOI, coveragePOI)) { |
return true; |
} |
SkIRect copyRect; |
@@ -470,9 +473,15 @@ void GrDrawTarget::drawIndexed(GrPipelineBuilder* pipelineBuilder, |
info.setDevBounds(*devBounds); |
} |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds, |
+ this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState); |
+ this->onDraw(gp, info, pipelineInfo); |
} |
} |
@@ -509,9 +518,15 @@ void GrDrawTarget::drawNonIndexed(GrPipelineBuilder* pipelineBuilder, |
info.setDevBounds(*devBounds); |
} |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds, |
+ this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState); |
+ this->onDraw(gp, info, pipelineInfo); |
} |
} |
@@ -530,7 +545,17 @@ void GrDrawTarget::drawBatch(GrPipelineBuilder* pipelineBuilder, |
return; |
} |
- this->onDrawBatch(batch, *pipelineBuilder, scissorState, devBounds); |
+ // init batch and my other crap |
+ GrBatchOpt batchOpt; |
+ batchOpt.fCanTweakAlphaForCoverage = pipelineBuilder->canTweakAlphaForCoverage(); |
+ batch->initBatchOpt(batchOpt); |
+ |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, batch, devBounds, this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
+ this->onDrawBatch(batch, pipelineInfo); |
} |
static const GrStencilSettings& winding_path_stencil_settings() { |
@@ -620,8 +645,13 @@ void GrDrawTarget::drawPath(GrPipelineBuilder* pipelineBuilder, |
pipelineBuilder->getRenderTarget()->getStencilBuffer(), |
&stencilSettings); |
- this->onDrawPath(*pipelineBuilder, pathProc, path, scissorState, stencilSettings, |
- &devBounds); |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, pathProc, &devBounds, |
+ this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
+ this->onDrawPath(pathProc, path, stencilSettings, pipelineInfo); |
} |
void GrDrawTarget::drawPaths(GrPipelineBuilder* pipelineBuilder, |
@@ -659,8 +689,13 @@ void GrDrawTarget::drawPaths(GrPipelineBuilder* pipelineBuilder, |
// instead for it to just copy the entire dst. Realistically this is a moot |
// point, because any context that supports NV_path_rendering will also |
// support NV_blend_equation_advanced. |
- this->onDrawPaths(*pipelineBuilder, pathProc, pathRange, indices, indexType, transformValues, |
- transformType, count, scissorState, stencilSettings, NULL); |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, pathProc, NULL, this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
+ this->onDrawPaths(pathProc, pathRange, indices, indexType, transformValues, |
+ transformType, count, stencilSettings, pipelineInfo); |
} |
void GrDrawTarget::clear(const SkIRect* rect, |
@@ -778,8 +813,15 @@ void GrDrawTarget::drawIndexedInstances(GrPipelineBuilder* pipelineBuilder, |
info.fStartIndex, |
info.fVertexCount, |
info.fIndexCount)) { |
+ |
+ GrDrawTarget::PipelineInfo pipelineInfo(pipelineBuilder, &scissorState, gp, devBounds, |
+ this); |
+ if (pipelineInfo.mustSkipDraw()) { |
+ return; |
+ } |
+ |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState); |
+ this->onDraw(gp, info, pipelineInfo); |
} |
info.fStartVertex += info.fVertexCount; |
instanceCount -= info.fInstanceCount; |
@@ -985,6 +1027,47 @@ bool GrDrawTarget::internalCanCopySurface(const GrSurface* dst, |
this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
} |
+void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, |
+ GrPipeline* pipeline) { |
+ SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, |
+ pipelineInfo.fColorPOI, |
+ pipelineInfo.fCoveragePOI, |
+ *this->caps(), |
+ *pipelineInfo.fScissor, |
+ &pipelineInfo.fDstCopy)); |
+} |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+GrDrawTarget::PipelineInfo::PipelineInfo(GrPipelineBuilder* pipelineBuilder, |
+ GrScissorState* scissor, |
+ const GrPrimitiveProcessor* primProc, |
+ const SkRect* devBounds, |
+ GrDrawTarget* target) |
+ : fPipelineBuilder(pipelineBuilder) |
+ , fScissor(scissor) { |
+ fColorPOI = fPipelineBuilder->colorProcInfo(primProc); |
+ fCoveragePOI = fPipelineBuilder->coverageProcInfo(primProc); |
+ if (!target->setupDstReadIfNecessary(*fPipelineBuilder, fColorPOI, fCoveragePOI, |
+ &fDstCopy, devBounds)) { |
+ fPipelineBuilder = NULL; |
+ } |
+} |
+ |
+GrDrawTarget::PipelineInfo::PipelineInfo(GrPipelineBuilder* pipelineBuilder, |
+ GrScissorState* scissor, |
+ const GrBatch* batch, |
+ const SkRect* devBounds, |
+ GrDrawTarget* target) |
+ : fPipelineBuilder(pipelineBuilder) |
+ , fScissor(scissor) { |
+ fColorPOI = fPipelineBuilder->colorProcInfo(batch); |
+ fCoveragePOI = fPipelineBuilder->coverageProcInfo(batch); |
+ if (!target->setupDstReadIfNecessary(*fPipelineBuilder, fColorPOI, fCoveragePOI, |
+ &fDstCopy, devBounds)) { |
+ fPipelineBuilder = NULL; |
+ } |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
void GrDrawTargetCaps::reset() { |