| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 "GrDrawTarget.h" | 8 #include "GrDrawTarget.h" |
| 9 | 9 |
| 10 #include "GrAuditTrail.h" | 10 #include "GrAuditTrail.h" |
| 11 #include "GrCaps.h" | 11 #include "GrCaps.h" |
| 12 #include "GrDrawContext.h" |
| 12 #include "GrGpu.h" | 13 #include "GrGpu.h" |
| 13 #include "GrPath.h" | 14 #include "GrPath.h" |
| 14 #include "GrPipeline.h" | 15 #include "GrPipeline.h" |
| 15 #include "GrMemoryPool.h" | 16 #include "GrMemoryPool.h" |
| 16 #include "GrRenderTarget.h" | 17 #include "GrRenderTarget.h" |
| 17 #include "GrResourceProvider.h" | 18 #include "GrResourceProvider.h" |
| 18 #include "GrRenderTargetPriv.h" | 19 #include "GrRenderTargetPriv.h" |
| 19 #include "GrStencilAttachment.h" | 20 #include "GrStencilAttachment.h" |
| 20 #include "GrSurfacePriv.h" | 21 #include "GrSurfacePriv.h" |
| 21 #include "GrTexture.h" | 22 #include "GrTexture.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 39 | 40 |
| 40 GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* r
esourceProvider, | 41 GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* r
esourceProvider, |
| 41 GrAuditTrail* auditTrail, const Options& options) | 42 GrAuditTrail* auditTrail, const Options& options) |
| 42 : fGpu(SkRef(gpu)) | 43 : fGpu(SkRef(gpu)) |
| 43 , fResourceProvider(resourceProvider) | 44 , fResourceProvider(resourceProvider) |
| 44 , fAuditTrail(auditTrail) | 45 , fAuditTrail(auditTrail) |
| 45 , fFlags(0) | 46 , fFlags(0) |
| 46 , fRenderTarget(rt) { | 47 , fRenderTarget(rt) { |
| 47 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) | 48 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) |
| 48 fContext = fGpu->getContext(); | 49 fContext = fGpu->getContext(); |
| 49 fClipMaskManager.reset(new GrClipMaskManager(this)); | |
| 50 | 50 |
| 51 fClipBatchToBounds = options.fClipBatchToBounds; | 51 fClipBatchToBounds = options.fClipBatchToBounds; |
| 52 fDrawBatchBounds = options.fDrawBatchBounds; | 52 fDrawBatchBounds = options.fDrawBatchBounds; |
| 53 fMaxBatchLookback = (options.fMaxBatchLookback < 0) ? kDefaultMaxBatchLookba
ck : | 53 fMaxBatchLookback = (options.fMaxBatchLookback < 0) ? kDefaultMaxBatchLookba
ck : |
| 54 options.fMaxBatchLookb
ack; | 54 options.fMaxBatchLookb
ack; |
| 55 fMaxBatchLookahead = (options.fMaxBatchLookahead < 0) ? kDefaultMaxBatchLook
ahead : | 55 fMaxBatchLookahead = (options.fMaxBatchLookahead < 0) ? kDefaultMaxBatchLook
ahead : |
| 56 options.fMaxBatchLook
ahead; | 56 options.fMaxBatchLook
ahead; |
| 57 | 57 |
| 58 rt->setLastDrawTarget(this); | 58 rt->setLastDrawTarget(this); |
| 59 | 59 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 } | 228 } |
| 229 | 229 |
| 230 fGpu->finishDrawTarget(); | 230 fGpu->finishDrawTarget(); |
| 231 } | 231 } |
| 232 | 232 |
| 233 void GrDrawTarget::reset() { | 233 void GrDrawTarget::reset() { |
| 234 fBatches.reset(); | 234 fBatches.reset(); |
| 235 } | 235 } |
| 236 | 236 |
| 237 void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, | 237 void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
| 238 GrDrawContext* drawContext, |
| 238 const GrClip& clip, | 239 const GrClip& clip, |
| 239 GrDrawBatch* batch) { | 240 GrDrawBatch* batch) { |
| 240 // Setup clip | 241 // Setup clip |
| 241 GrAppliedClip appliedClip; | 242 GrAppliedClip appliedClip; |
| 242 if (!clip.apply(fClipMaskManager, pipelineBuilder, &batch->bounds(), &applie
dClip)) { | 243 if (!clip.apply(fContext, pipelineBuilder, drawContext, &batch->bounds(), &a
ppliedClip)) { |
| 243 return; | 244 return; |
| 244 } | 245 } |
| 245 | 246 |
| 246 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; | 247 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; |
| 247 if (appliedClip.clipCoverageFragmentProcessor()) { | 248 if (appliedClip.clipCoverageFragmentProcessor()) { |
| 248 arfps.set(&pipelineBuilder); | 249 arfps.set(&pipelineBuilder); |
| 249 arfps.addCoverageFragmentProcessor(appliedClip.clipCoverageFragmentProce
ssor()); | 250 arfps.addCoverageFragmentProcessor(appliedClip.clipCoverageFragmentProce
ssor()); |
| 250 } | 251 } |
| 251 | 252 |
| 252 GrPipeline::CreateArgs args; | 253 GrPipeline::CreateArgs args; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 | 304 |
| 304 #ifdef ENABLE_MDB | 305 #ifdef ENABLE_MDB |
| 305 SkASSERT(fRenderTarget); | 306 SkASSERT(fRenderTarget); |
| 306 batch->pipeline()->addDependenciesTo(fRenderTarget); | 307 batch->pipeline()->addDependenciesTo(fRenderTarget); |
| 307 #endif | 308 #endif |
| 308 | 309 |
| 309 this->recordBatch(batch); | 310 this->recordBatch(batch); |
| 310 } | 311 } |
| 311 | 312 |
| 312 void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, | 313 void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
| 314 GrDrawContext* drawContext, |
| 313 const GrClip& clip, | 315 const GrClip& clip, |
| 314 const SkMatrix& viewMatrix, | 316 const SkMatrix& viewMatrix, |
| 315 const GrPath* path, | 317 const GrPath* path, |
| 316 GrPathRendering::FillType fill) { | 318 GrPathRendering::FillType fill) { |
| 317 // TODO: extract portions of checkDraw that are relevant to path stenciling. | 319 // TODO: extract portions of checkDraw that are relevant to path stenciling. |
| 318 SkASSERT(path); | 320 SkASSERT(path); |
| 319 SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); | 321 SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
| 320 | 322 |
| 321 // Setup clip | 323 // Setup clip |
| 322 GrAppliedClip appliedClip; | 324 GrAppliedClip appliedClip; |
| 323 if (!clip.apply(fClipMaskManager, pipelineBuilder, nullptr, &appliedClip)) { | 325 if (!clip.apply(fContext, pipelineBuilder, drawContext, nullptr, &appliedCli
p)) { |
| 324 return; | 326 return; |
| 325 } | 327 } |
| 326 // TODO: respect fClipBatchToBounds if we ever start computing bounds here. | 328 // TODO: respect fClipBatchToBounds if we ever start computing bounds here. |
| 327 | 329 |
| 328 // Coverage AA does not make sense when rendering to the stencil buffer. The
caller should never | 330 // Coverage AA does not make sense when rendering to the stencil buffer. The
caller should never |
| 329 // attempt this in a situation that would require coverage AA. | 331 // attempt this in a situation that would require coverage AA. |
| 330 SkASSERT(!appliedClip.clipCoverageFragmentProcessor()); | 332 SkASSERT(!appliedClip.clipCoverageFragmentProcessor()); |
| 331 | 333 |
| 332 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); | 334 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
| 333 GrStencilAttachment* stencilAttachment = fResourceProvider->attachStencilAtt
achment(rt); | 335 GrStencilAttachment* stencilAttachment = fResourceProvider->attachStencilAtt
achment(rt); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 344 appliedClip.scissorState(), | 346 appliedClip.scissorState(), |
| 345 pipelineBuilder.getRenderTarget(
), | 347 pipelineBuilder.getRenderTarget(
), |
| 346 path); | 348 path); |
| 347 this->recordBatch(batch); | 349 this->recordBatch(batch); |
| 348 batch->unref(); | 350 batch->unref(); |
| 349 } | 351 } |
| 350 | 352 |
| 351 void GrDrawTarget::clear(const SkIRect* rect, | 353 void GrDrawTarget::clear(const SkIRect* rect, |
| 352 GrColor color, | 354 GrColor color, |
| 353 bool canIgnoreRect, | 355 bool canIgnoreRect, |
| 354 GrRenderTarget* renderTarget) { | 356 GrDrawContext* drawContext) { |
| 355 SkIRect rtRect = SkIRect::MakeWH(renderTarget->width(), renderTarget->height
()); | 357 SkIRect rtRect = SkIRect::MakeWH(drawContext->width(), drawContext->height()
); |
| 356 SkIRect clippedRect; | 358 SkIRect clippedRect; |
| 357 if (!rect || | 359 if (!rect || |
| 358 (canIgnoreRect && this->caps()->fullClearIsFree()) || | 360 (canIgnoreRect && this->caps()->fullClearIsFree()) || |
| 359 rect->contains(rtRect)) { | 361 rect->contains(rtRect)) { |
| 360 rect = &rtRect; | 362 rect = &rtRect; |
| 361 } else { | 363 } else { |
| 362 clippedRect = *rect; | 364 clippedRect = *rect; |
| 363 if (!clippedRect.intersect(rtRect)) { | 365 if (!clippedRect.intersect(rtRect)) { |
| 364 return; | 366 return; |
| 365 } | 367 } |
| 366 rect = &clippedRect; | 368 rect = &clippedRect; |
| 367 } | 369 } |
| 368 | 370 |
| 369 if (this->caps()->useDrawInsteadOfClear()) { | 371 if (this->caps()->useDrawInsteadOfClear()) { |
| 370 // This works around a driver bug with clear by drawing a rect instead. | 372 // This works around a driver bug with clear by drawing a rect instead. |
| 371 // The driver will ignore a clear if it is the only thing rendered to a | 373 // The driver will ignore a clear if it is the only thing rendered to a |
| 372 // target before the target is read. | 374 // target before the target is read. |
| 373 if (rect == &rtRect) { | 375 if (rect == &rtRect) { |
| 374 this->discard(renderTarget); | 376 drawContext->discard(); |
| 375 } | 377 } |
| 376 | 378 |
| 377 GrPipelineBuilder pipelineBuilder; | 379 GrPipelineBuilder pipelineBuilder; |
| 378 pipelineBuilder.setXPFactory( | 380 pipelineBuilder.setXPFactory( |
| 379 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); | 381 GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); |
| 380 pipelineBuilder.setRenderTarget(renderTarget); | 382 pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); |
| 381 | 383 |
| 382 SkRect scalarRect = SkRect::Make(*rect); | 384 SkRect scalarRect = SkRect::Make(*rect); |
| 383 SkAutoTUnref<GrDrawBatch> batch( | 385 SkAutoTUnref<GrDrawBatch> batch( |
| 384 GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), scalar
Rect, | 386 GrRectBatchFactory::CreateNonAAFill(color, SkMatrix::I(), scalar
Rect, |
| 385 nullptr, nullptr)); | 387 nullptr, nullptr)); |
| 386 this->drawBatch(pipelineBuilder, GrNoClip(), batch); | 388 this->drawBatch(pipelineBuilder, drawContext, GrNoClip(), batch); |
| 387 } else { | 389 } else { |
| 388 GrBatch* batch = new GrClearBatch(*rect, color, renderTarget); | 390 GrBatch* batch = new GrClearBatch(*rect, color, drawContext->accessRende
rTarget()); |
| 389 this->recordBatch(batch); | 391 this->recordBatch(batch); |
| 390 batch->unref(); | 392 batch->unref(); |
| 391 } | 393 } |
| 392 } | 394 } |
| 393 | 395 |
| 394 void GrDrawTarget::discard(GrRenderTarget* renderTarget) { | 396 void GrDrawTarget::discard(GrRenderTarget* renderTarget) { |
| 395 if (this->caps()->discardRenderTargetSupport()) { | 397 if (this->caps()->discardRenderTargetSupport()) { |
| 396 GrBatch* batch = new GrDiscardBatch(renderTarget); | 398 GrBatch* batch = new GrDiscardBatch(renderTarget); |
| 397 this->recordBatch(batch); | 399 this->recordBatch(batch); |
| 398 batch->unref(); | 400 batch->unref(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 } | 523 } |
| 522 } | 524 } |
| 523 | 525 |
| 524 /////////////////////////////////////////////////////////////////////////////// | 526 /////////////////////////////////////////////////////////////////////////////// |
| 525 | 527 |
| 526 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { | 528 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { |
| 527 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); | 529 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); |
| 528 this->recordBatch(batch); | 530 this->recordBatch(batch); |
| 529 batch->unref(); | 531 batch->unref(); |
| 530 } | 532 } |
| OLD | NEW |