Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index a28f1bc698f59f38e90d1f5e6326adae81482dbd..c94c1a925b6092ae21f95cbf38313bfc134b6c5b 100644 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -66,6 +66,9 @@ static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4; |
#define ASSERT_OWNED_RESOURCE(R) GrAssert(!(R) || (R)->getContext() == this) |
+// Glorified typedef to avoid including GrDrawState.h in GrContext.h |
+class GrContext::AutoRestoreEffects : public GrDrawState::AutoRestoreEffects {}; |
+ |
GrContext* GrContext::Create(GrBackend backend, GrBackendContext backendContext) { |
GrContext* context = SkNEW(GrContext); |
if (context->init(backend, backendContext)) { |
@@ -259,7 +262,7 @@ void convolve_gaussian(GrDrawTarget* target, |
direction, |
radius, |
sigma)); |
- drawState->setEffect(0, conv); |
+ drawState->addColorEffect(conv); |
target->drawSimpleRect(rect, NULL); |
} |
@@ -372,7 +375,7 @@ GrTexture* GrContext::createResizedTexture(const GrTextureDesc& desc, |
// texels in the resampled image are copies of texels from |
// the original. |
GrTextureParams params(SkShader::kClamp_TileMode, needsFiltering); |
- drawState->createTextureEffect(0, clampedTexture, SkMatrix::I(), params); |
+ drawState->addColorTextureEffect(clampedTexture, SkMatrix::I(), params); |
drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttribs)); |
@@ -602,7 +605,8 @@ bool GrContext::supportsIndex8PixelConfig(const GrTextureParams* params, |
void GrContext::clear(const GrIRect* rect, |
const GrColor color, |
GrRenderTarget* target) { |
- this->prepareToDraw(NULL, BUFFERED_DRAW)->clear(rect, color, target); |
+ AutoRestoreEffects are; |
+ this->prepareToDraw(NULL, BUFFERED_DRAW, &are)->clear(rect, color, target); |
} |
void GrContext::drawPaint(const GrPaint& origPaint) { |
@@ -765,8 +769,8 @@ void GrContext::drawRect(const GrPaint& paint, |
const SkMatrix* matrix) { |
SK_TRACE_EVENT0("GrContext::drawRect"); |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
GrRect devRect; |
SkMatrix combinedMatrix; |
@@ -846,8 +850,8 @@ void GrContext::drawRectToRect(const GrPaint& paint, |
const SkMatrix* dstMatrix, |
const SkMatrix* localMatrix) { |
SK_TRACE_EVENT0("GrContext::drawRectToRect"); |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); |
} |
@@ -902,8 +906,8 @@ void GrContext::drawVertices(const GrPaint& paint, |
GrDrawTarget::AutoReleaseGeometry geo; |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
GrDrawState* drawState = target->drawState(); |
@@ -951,8 +955,8 @@ void GrContext::drawRRect(const GrPaint& paint, |
const SkRRect& rect, |
const SkStrokeRec& stroke) { |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
bool useAA = paint.isAntiAlias() && |
!target->getDrawState().getRenderTarget()->isMultisampled() && |
@@ -971,8 +975,8 @@ void GrContext::drawOval(const GrPaint& paint, |
const GrRect& oval, |
const SkStrokeRec& stroke) { |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
bool useAA = paint.isAntiAlias() && |
!target->getDrawState().getRenderTarget()->isMultisampled() && |
@@ -1045,8 +1049,8 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok |
// cache. This presents a potential hazard for buffered drawing. However, |
// the writePixels that uploads to the scratch will perform a flush so we're |
// OK. |
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
- GrDrawState::AutoStageDisable atr(fDrawState); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget()->isMultisampled(); |
if (useAA && stroke.getWidth() < 0 && !path.isConvex()) { |
@@ -1346,7 +1350,7 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target, |
GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRInit); |
GrDrawState* drawState = fGpu->drawState(); |
GrAssert(effect); |
- drawState->setEffect(0, effect); |
+ drawState->addColorEffect(effect); |
drawState->setRenderTarget(texture->asRenderTarget()); |
GrRect rect = GrRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); |
@@ -1421,7 +1425,7 @@ void GrContext::copyTexture(GrTexture* src, GrRenderTarget* dst, const SkIPoint* |
return; |
} |
sampleM.preTranslate(SkIntToScalar(srcRect.fLeft), SkIntToScalar(srcRect.fTop)); |
- drawState->createTextureEffect(0, src, sampleM); |
+ drawState->addColorTextureEffect(src, sampleM); |
SkRect dstR = SkRect::MakeWH(SkIntToScalar(srcRect.width()), SkIntToScalar(srcRect.height())); |
fGpu->drawSimpleRect(dstR, NULL); |
} |
@@ -1539,7 +1543,7 @@ bool GrContext::writeRenderTargetPixels(GrRenderTarget* target, |
GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRInit, &matrix); |
GrDrawState* drawState = fGpu->drawState(); |
GrAssert(effect); |
- drawState->setEffect(0, effect); |
+ drawState->addColorEffect(effect); |
drawState->setRenderTarget(target); |
@@ -1548,14 +1552,21 @@ bool GrContext::writeRenderTargetPixels(GrRenderTarget* target, |
} |
//////////////////////////////////////////////////////////////////////////////// |
-GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, BufferedDraw buffered) { |
+GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, |
+ BufferedDraw buffered, |
+ AutoRestoreEffects* are) { |
+ // All users of this draw state should be freeing up all effects when they're done. |
+ // Otherwise effects that own resources may keep those resources alive indefinitely. |
+ GrAssert(0 == fDrawState->numColorStages() && 0 == fDrawState->numCoverageStages()); |
+ |
if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffered) { |
this->flushDrawBuffer(); |
fLastDrawWasBuffered = kNo_BufferedDraw; |
} |
ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
if (NULL != paint) { |
- GrAssert(fDrawState->stagesDisabled()); |
+ GrAssert(NULL != are); |
+ are->set(fDrawState); |
fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); |
#if GR_DEBUG_PARTIAL_COVERAGE_CHECK |
if ((paint->hasMask() || 0xff != paint->fCoverage) && |
@@ -1655,7 +1666,7 @@ void GrContext::setupDrawBuffer() { |
} |
GrDrawTarget* GrContext::getTextTarget() { |
- return this->prepareToDraw(NULL, BUFFERED_DRAW); |
+ return this->prepareToDraw(NULL, BUFFERED_DRAW, NULL); |
} |
const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { |
@@ -1779,7 +1790,8 @@ GrTexture* GrContext::gaussianBlur(GrTexture* srcTexture, |
} |
this->setRenderTarget(dstTexture->asRenderTarget()); |
- GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
convolve_gaussian(target, srcTexture, srcRect, sigmaX, radiusX, |
Gr1DKernelEffect::kX_Direction); |
srcTexture = dstTexture; |
@@ -1796,7 +1808,8 @@ GrTexture* GrContext::gaussianBlur(GrTexture* srcTexture, |
} |
this->setRenderTarget(dstTexture->asRenderTarget()); |
- GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW); |
+ AutoRestoreEffects are; |
+ GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); |
convolve_gaussian(target, srcTexture, srcRect, sigmaY, radiusY, |
Gr1DKernelEffect::kY_Direction); |
srcTexture = dstTexture; |