| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrBatchTest.h" | 8 #include "GrBatchTest.h" |
| 9 #include "GrColor.h" | 9 #include "GrColor.h" |
| 10 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 void GrDrawContext::clear(const SkIRect* rect, | 186 void GrDrawContext::clear(const SkIRect* rect, |
| 187 const GrColor color, | 187 const GrColor color, |
| 188 bool canIgnoreRect) { | 188 bool canIgnoreRect) { |
| 189 ASSERT_SINGLE_OWNER | 189 ASSERT_SINGLE_OWNER |
| 190 RETURN_IF_ABANDONED | 190 RETURN_IF_ABANDONED |
| 191 SkDEBUGCODE(this->validate();) | 191 SkDEBUGCODE(this->validate();) |
| 192 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::clear"); | 192 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::clear"); |
| 193 | 193 |
| 194 AutoCheckFlush acf(fDrawingManager); | 194 AutoCheckFlush acf(fDrawingManager); |
| 195 this->internalClear(rect ? GrFixedClip(*rect) : GrFixedClip::disabled(), col
or, canIgnoreRect); |
| 196 } |
| 195 | 197 |
| 196 const SkIRect rtRect = SkIRect::MakeWH(this->width(), this->height()); | 198 void GrDrawContextPriv::clear(const GrFixedClip& clip, |
| 197 SkIRect clippedRect; | 199 const GrColor color, |
| 198 bool isFull = false; | 200 bool canIgnoreClip) { |
| 199 if (!rect || | 201 ASSERT_SINGLE_OWNER_PRIV |
| 200 (canIgnoreRect && fContext->caps()->fullClearIsFree()) || | 202 RETURN_IF_ABANDONED_PRIV |
| 201 rect->contains(rtRect)) { | 203 SkDEBUGCODE(fDrawContext->validate();) |
| 202 rect = &rtRect; | 204 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContextPriv::cle
ar"); |
| 203 isFull = true; | 205 |
| 204 } else { | 206 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| 205 clippedRect = *rect; | 207 fDrawContext->internalClear(clip, color, canIgnoreClip); |
| 206 if (!clippedRect.intersect(rtRect)) { | 208 } |
| 207 return; | 209 |
| 208 } | 210 void GrDrawContext::internalClear(const GrFixedClip& clip, |
| 209 rect = &clippedRect; | 211 const GrColor color, |
| 210 } | 212 bool canIgnoreClip) { |
| 213 bool isFull = !clip.scissorEnabled() || |
| 214 (canIgnoreClip && fContext->caps()->fullClearIsFree()) || |
| 215 clip.scissorRect().contains(SkIRect::MakeWH(this->width(), thi
s->height())); |
| 211 | 216 |
| 212 if (fContext->caps()->useDrawInsteadOfClear()) { | 217 if (fContext->caps()->useDrawInsteadOfClear()) { |
| 213 // This works around a driver bug with clear by drawing a rect instead. | 218 // This works around a driver bug with clear by drawing a rect instead. |
| 214 // The driver will ignore a clear if it is the only thing rendered to a | 219 // The driver will ignore a clear if it is the only thing rendered to a |
| 215 // target before the target is read. | 220 // target before the target is read. |
| 216 if (rect == &rtRect) { | 221 SkRect clearRect = SkRect::MakeIWH(this->width(), this->height()); |
| 222 if (isFull) { |
| 217 this->discard(); | 223 this->discard(); |
| 224 } else if (!clearRect.intersect(SkRect::Make(clip.scissorRect()))) { |
| 225 return; |
| 218 } | 226 } |
| 219 | 227 |
| 220 GrPaint paint; | 228 GrPaint paint; |
| 221 paint.setColor4f(GrColor4f::FromGrColor(color)); | 229 paint.setColor4f(GrColor4f::FromGrColor(color)); |
| 222 paint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode)); | 230 paint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode)); |
| 223 | 231 |
| 224 this->drawRect(GrNoClip(), paint, SkMatrix::I(), SkRect::Make(*rect)); | 232 this->drawRect(clip, paint, SkMatrix::I(), clearRect); |
| 225 } else if (isFull) { | 233 } else if (isFull) { |
| 226 this->getDrawTarget()->fullClear(this->accessRenderTarget(), color); | 234 this->getDrawTarget()->fullClear(this->accessRenderTarget(), color); |
| 227 } else { | 235 } else { |
| 228 sk_sp<GrBatch> batch(GrClearBatch::Make(*rect, color, this->accessRender
Target())); | 236 sk_sp<GrBatch> batch(GrClearBatch::Make(clip, color, this->accessRenderT
arget())); |
| 237 if (!batch) { |
| 238 return; |
| 239 } |
| 229 this->getDrawTarget()->addBatch(std::move(batch)); | 240 this->getDrawTarget()->addBatch(std::move(batch)); |
| 230 } | 241 } |
| 231 } | 242 } |
| 232 | 243 |
| 233 | |
| 234 void GrDrawContext::drawPaint(const GrClip& clip, | 244 void GrDrawContext::drawPaint(const GrClip& clip, |
| 235 const GrPaint& origPaint, | 245 const GrPaint& origPaint, |
| 236 const SkMatrix& viewMatrix) { | 246 const SkMatrix& viewMatrix) { |
| 237 ASSERT_SINGLE_OWNER | 247 ASSERT_SINGLE_OWNER |
| 238 RETURN_IF_ABANDONED | 248 RETURN_IF_ABANDONED |
| 239 SkDEBUGCODE(this->validate();) | 249 SkDEBUGCODE(this->validate();) |
| 240 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawPaint"); | 250 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawPaint"); |
| 241 | 251 |
| 242 // set rect to be big enough to fill the space, but not super-huge, so we | 252 // set rect to be big enough to fill the space, but not super-huge, so we |
| 243 // don't overflow fixed-point implementations | 253 // don't overflow fixed-point implementations |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 return; | 534 return; |
| 525 } | 535 } |
| 526 } | 536 } |
| 527 | 537 |
| 528 SkPath path; | 538 SkPath path; |
| 529 path.setIsVolatile(true); | 539 path.setIsVolatile(true); |
| 530 path.addRect(rect); | 540 path.addRect(rect); |
| 531 this->internalDrawPath(clip, paint, viewMatrix, path, *style); | 541 this->internalDrawPath(clip, paint, viewMatrix, path, *style); |
| 532 } | 542 } |
| 533 | 543 |
| 534 void GrDrawContextPriv::clearStencilClip(const SkIRect& rect, bool insideClip) { | 544 void GrDrawContextPriv::clearStencilClip(const GrFixedClip& clip, bool insideSte
ncilMask) { |
| 535 ASSERT_SINGLE_OWNER_PRIV | 545 ASSERT_SINGLE_OWNER_PRIV |
| 536 RETURN_IF_ABANDONED_PRIV | 546 RETURN_IF_ABANDONED_PRIV |
| 537 SkDEBUGCODE(fDrawContext->validate();) | 547 SkDEBUGCODE(fDrawContext->validate();) |
| 538 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContextPriv::cle
arStencilClip"); | 548 GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContextPriv::cle
arStencilClip"); |
| 539 | 549 |
| 540 AutoCheckFlush acf(fDrawContext->fDrawingManager); | 550 AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| 541 fDrawContext->getDrawTarget()->clearStencilClip(rect, insideClip, | 551 fDrawContext->getDrawTarget()->clearStencilClip(clip, insideStencilMask, |
| 542 fDrawContext->accessRenderTa
rget()); | 552 fDrawContext->accessRenderTa
rget()); |
| 543 } | 553 } |
| 544 | 554 |
| 545 void GrDrawContextPriv::stencilPath(const GrClip& clip, | 555 void GrDrawContextPriv::stencilPath(const GrClip& clip, |
| 546 bool useHWAA, | 556 bool useHWAA, |
| 547 const SkMatrix& viewMatrix, | 557 const SkMatrix& viewMatrix, |
| 548 const GrPath* path) { | 558 const GrPath* path) { |
| 549 fDrawContext->getDrawTarget()->stencilPath(fDrawContext, clip, useHWAA, view
Matrix, path); | 559 fDrawContext->getDrawTarget()->stencilPath(fDrawContext, clip, useHWAA, view
Matrix, path); |
| 550 } | 560 } |
| 551 | 561 |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 | 1320 |
| 1311 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, | 1321 void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const Gr
Clip& clip, |
| 1312 GrDrawBatch* batch) { | 1322 GrDrawBatch* batch) { |
| 1313 ASSERT_SINGLE_OWNER | 1323 ASSERT_SINGLE_OWNER |
| 1314 RETURN_IF_ABANDONED | 1324 RETURN_IF_ABANDONED |
| 1315 SkDEBUGCODE(this->validate();) | 1325 SkDEBUGCODE(this->validate();) |
| 1316 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); | 1326 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| 1317 | 1327 |
| 1318 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); | 1328 this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| 1319 } | 1329 } |
| OLD | NEW |