Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index b89d70ea2be724e2a8fb5bff5e1f6364efd5f31d..111f455883e269d1b77838215119ef8f1f09a592 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -384,15 +384,15 @@ |
return true; |
} |
-bool GrDrawTarget::setupDstReadIfNecessary(GrPipelineBuilder* pipelineBuilder, |
+bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder, |
GrDeviceCoordTexture* dstCopy, |
const SkRect* drawBounds) { |
- if (this->caps()->dstReadInShaderSupport() || !pipelineBuilder->willEffectReadDstColor()) { |
+ if (!pipelineBuilder.willXPNeedDstCopy(*this->caps())) { |
return true; |
} |
SkIRect copyRect; |
const GrClipData* clip = this->getClip(); |
- GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); |
+ GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
clip->getConservativeBounds(rt, ©Rect); |
if (drawBounds) { |
@@ -470,14 +470,9 @@ |
info.setDevBounds(*devBounds); |
} |
- // TODO: We should continue with incorrect blending. |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) { |
- return; |
- } |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState, dstCopy.texture() ? &dstCopy : NULL); |
+ this->onDraw(*pipelineBuilder, gp, info, scissorState); |
} |
} |
@@ -514,15 +509,9 @@ |
info.setDevBounds(*devBounds); |
} |
- // TODO: We should continue with incorrect blending. |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) { |
- return; |
- } |
- |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState, dstCopy.texture() ? &dstCopy : NULL); |
+ this->onDraw(*pipelineBuilder, gp, info, scissorState); |
} |
} |
@@ -541,12 +530,7 @@ |
return; |
} |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) { |
- return; |
- } |
- |
- this->onDrawBatch(batch, *pipelineBuilder, scissorState, dstCopy.texture() ? &dstCopy : NULL); |
+ this->onDrawBatch(batch, *pipelineBuilder, scissorState, devBounds); |
} |
static const GrStencilSettings& winding_path_stencil_settings() { |
@@ -636,13 +620,8 @@ |
pipelineBuilder->getRenderTarget()->getStencilBuffer(), |
&stencilSettings); |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, &devBounds)) { |
- return; |
- } |
- |
this->onDrawPath(*pipelineBuilder, pathProc, path, scissorState, stencilSettings, |
- dstCopy.texture() ? &dstCopy : NULL); |
+ &devBounds); |
} |
void GrDrawTarget::drawPaths(GrPipelineBuilder* pipelineBuilder, |
@@ -676,18 +655,12 @@ |
pipelineBuilder->getRenderTarget()->getStencilBuffer(), |
&stencilSettings); |
- // Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt |
+ // Don't compute a bounding box for dst copy texture, we'll opt |
// 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. |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, NULL)) { |
- return; |
- } |
- |
this->onDrawPaths(*pipelineBuilder, pathProc, pathRange, indices, indexType, transformValues, |
- transformType, count, scissorState, stencilSettings, |
- dstCopy.texture() ? &dstCopy : NULL); |
+ transformType, count, scissorState, stencilSettings, NULL); |
} |
void GrDrawTarget::clear(const SkIRect* rect, |
@@ -793,12 +766,6 @@ |
info.setDevBounds(*devBounds); |
} |
- // TODO: We should continue with incorrect blending. |
- GrDeviceCoordTexture dstCopy; |
- if (!this->setupDstReadIfNecessary(pipelineBuilder, &dstCopy, devBounds)) { |
- return; |
- } |
- |
while (instanceCount) { |
info.fInstanceCount = SkTMin(instanceCount, maxInstancesPerDraw); |
info.fVertexCount = info.fInstanceCount * verticesPerInstance; |
@@ -812,8 +779,7 @@ |
info.fVertexCount, |
info.fIndexCount)) { |
this->setDrawBuffers(&info, gp->getVertexStride()); |
- this->onDraw(*pipelineBuilder, gp, info, scissorState, |
- dstCopy.texture() ? &dstCopy : NULL); |
+ this->onDraw(*pipelineBuilder, gp, info, scissorState); |
} |
info.fStartVertex += info.fVertexCount; |
instanceCount -= info.fInstanceCount; |