Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index 0049767e8b420cfde0bc53b8487920ea80584c9a..2171f1e93473ba168acede74efad9600d68029c8 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -309,14 +309,25 @@ void GrDrawTarget::clear(const SkIRect* rect, |
GrColor color, |
bool canIgnoreRect, |
GrRenderTarget* renderTarget) { |
+ SkIRect rtRect = SkIRect::MakeWH(renderTarget->width(), renderTarget->height()); |
+ SkIRect clippedRect; |
+ if (!rect || |
+ (canIgnoreRect && this->caps()->fullClearIsFree()) || |
+ rect->contains(rtRect)) { |
+ rect = &rtRect; |
+ } else { |
+ clippedRect = *rect; |
+ if (!clippedRect.intersect(rtRect)) { |
+ return; |
+ } |
+ rect = &clippedRect; |
+ } |
+ |
if (fCaps->useDrawInsteadOfClear()) { |
// This works around a driver bug with clear by drawing a rect instead. |
// The driver will ignore a clear if it is the only thing rendered to a |
// target before the target is read. |
- SkIRect rtRect = SkIRect::MakeWH(renderTarget->width(), renderTarget->height()); |
- if (NULL == rect || canIgnoreRect || rect->contains(rtRect)) { |
- rect = &rtRect; |
- // We first issue a discard() since that may help tilers. |
+ if (rect == &rtRect) { |
this->discard(renderTarget); |
} |
@@ -325,7 +336,7 @@ void GrDrawTarget::clear(const SkIRect* rect, |
this->drawSimpleRect(pipelineBuilder, color, SkMatrix::I(), *rect); |
} else { |
- this->onClear(rect, color, canIgnoreRect, renderTarget); |
+ this->onClear(*rect, color, renderTarget); |
} |
} |