| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 | 10 |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 } | 363 } |
| 364 | 364 |
| 365 // temp buffer for doing sw premul conversion, if needed. | 365 // temp buffer for doing sw premul conversion, if needed. |
| 366 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); | 366 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); |
| 367 if (tempTexture) { | 367 if (tempTexture) { |
| 368 SkAutoTUnref<const GrFragmentProcessor> fp; | 368 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 369 SkMatrix textureMatrix; | 369 SkMatrix textureMatrix; |
| 370 textureMatrix.setIDiv(tempTexture->width(), tempTexture->height()); | 370 textureMatrix.setIDiv(tempTexture->width(), tempTexture->height()); |
| 371 GrPaint paint; | 371 GrPaint paint; |
| 372 if (applyPremulToSrc) { | 372 if (applyPremulToSrc) { |
| 373 fp.reset(this->createUPMToPMEffect(paint.getProcessorDataManager(),
tempTexture, | 373 fp.reset(this->createUPMToPMEffect(tempTexture, tempDrawInfo.fSwapRA
ndB, |
| 374 tempDrawInfo.fSwapRAndB, textureM
atrix)); | 374 textureMatrix)); |
| 375 // If premultiplying was the only reason for the draw, fall back to
a straight write. | 375 // If premultiplying was the only reason for the draw, fall back to
a straight write. |
| 376 if (!fp) { | 376 if (!fp) { |
| 377 if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference)
{ | 377 if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference)
{ |
| 378 tempTexture.reset(nullptr); | 378 tempTexture.reset(nullptr); |
| 379 } | 379 } |
| 380 } else { | 380 } else { |
| 381 applyPremulToSrc = false; | 381 applyPremulToSrc = false; |
| 382 } | 382 } |
| 383 } | 383 } |
| 384 if (tempTexture) { | 384 if (tempTexture) { |
| 385 if (!fp) { | 385 if (!fp) { |
| 386 fp.reset(GrConfigConversionEffect::Create( | 386 fp.reset(GrConfigConversionEffect::Create(tempTexture, tempDrawI
nfo.fSwapRAndB, |
| 387 paint.getProcessorDataManager(), tempTexture, tempDrawInfo.f
SwapRAndB, | |
| 388 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); | 387 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); |
| 389 if (!fp) { | 388 if (!fp) { |
| 390 return false; | 389 return false; |
| 391 } | 390 } |
| 392 } | 391 } |
| 393 GrRenderTarget* renderTarget = surface->asRenderTarget(); | 392 GrRenderTarget* renderTarget = surface->asRenderTarget(); |
| 394 SkASSERT(renderTarget); | 393 SkASSERT(renderTarget); |
| 395 if (tempTexture->surfacePriv().hasPendingIO()) { | 394 if (tempTexture->surfacePriv().hasPendingIO()) { |
| 396 this->flush(); | 395 this->flush(); |
| 397 } | 396 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 } else { | 500 } else { |
| 502 temp.reset(this->textureProvider()->createApproxTexture(tempDrawInfo
.fTempSurfaceDesc)); | 501 temp.reset(this->textureProvider()->createApproxTexture(tempDrawInfo
.fTempSurfaceDesc)); |
| 503 } | 502 } |
| 504 if (temp) { | 503 if (temp) { |
| 505 SkMatrix textureMatrix; | 504 SkMatrix textureMatrix; |
| 506 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); | 505 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); |
| 507 textureMatrix.postIDiv(src->width(), src->height()); | 506 textureMatrix.postIDiv(src->width(), src->height()); |
| 508 GrPaint paint; | 507 GrPaint paint; |
| 509 SkAutoTUnref<const GrFragmentProcessor> fp; | 508 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 510 if (unpremul) { | 509 if (unpremul) { |
| 511 fp.reset(this->createPMToUPMEffect( | 510 fp.reset(this->createPMToUPMEffect(src->asTexture(), tempDrawInf
o.fSwapRAndB, |
| 512 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, | |
| 513 textureMatrix)); | 511 textureMatrix)); |
| 514 if (fp) { | 512 if (fp) { |
| 515 unpremul = false; // we no longer need to do this on CPU aft
er the read back. | 513 unpremul = false; // we no longer need to do this on CPU aft
er the read back. |
| 516 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe
rence) { | 514 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe
rence) { |
| 517 // We only wanted to do the draw in order to perform the unp
remul so don't | 515 // We only wanted to do the draw in order to perform the unp
remul so don't |
| 518 // bother. | 516 // bother. |
| 519 temp.reset(nullptr); | 517 temp.reset(nullptr); |
| 520 } | 518 } |
| 521 } | 519 } |
| 522 if (!fp && temp) { | 520 if (!fp && temp) { |
| 523 fp.reset(GrConfigConversionEffect::Create( | 521 fp.reset(GrConfigConversionEffect::Create(src->asTexture(), temp
DrawInfo.fSwapRAndB, |
| 524 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, | |
| 525 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); | 522 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); |
| 526 } | 523 } |
| 527 if (fp) { | 524 if (fp) { |
| 528 paint.addColorFragmentProcessor(fp); | 525 paint.addColorFragmentProcessor(fp); |
| 529 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar
(height)); | 526 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar
(height)); |
| 530 SkAutoTUnref<GrDrawContext> drawContext(this->drawContext()); | 527 SkAutoTUnref<GrDrawContext> drawContext(this->drawContext()); |
| 531 drawContext->drawRect(temp->asRenderTarget(), GrClip::WideOpen()
, paint, | 528 drawContext->drawRect(temp->asRenderTarget(), GrClip::WideOpen()
, paint, |
| 532 SkMatrix::I(), rect, nullptr); | 529 SkMatrix::I(), rect, nullptr); |
| 533 surfaceToRead.reset(SkRef(temp.get())); | 530 surfaceToRead.reset(SkRef(temp.get())); |
| 534 left = 0; | 531 left = 0; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 void GrContext::testPMConversionsIfNecessary(uint32_t flags) { | 687 void GrContext::testPMConversionsIfNecessary(uint32_t flags) { |
| 691 if (SkToBool(kUnpremul_PixelOpsFlag & flags)) { | 688 if (SkToBool(kUnpremul_PixelOpsFlag & flags)) { |
| 692 SkAutoMutexAcquire ama(fTestPMConversionsMutex); | 689 SkAutoMutexAcquire ama(fTestPMConversionsMutex); |
| 693 if (!fDidTestPMConversions) { | 690 if (!fDidTestPMConversions) { |
| 694 test_pm_conversions(this, &fPMToUPMConversion, &fUPMToPMConversion); | 691 test_pm_conversions(this, &fPMToUPMConversion, &fUPMToPMConversion); |
| 695 fDidTestPMConversions = true; | 692 fDidTestPMConversions = true; |
| 696 } | 693 } |
| 697 } | 694 } |
| 698 } | 695 } |
| 699 | 696 |
| 700 const GrFragmentProcessor* GrContext::createPMToUPMEffect(GrProcessorDataManager
* procDataManager, | 697 const GrFragmentProcessor* GrContext::createPMToUPMEffect(GrTexture* texture, |
| 701 GrTexture* texture, | |
| 702 bool swapRAndB, | 698 bool swapRAndB, |
| 703 const SkMatrix& matrix
) const { | 699 const SkMatrix& matrix
) const { |
| 704 // We should have already called this->testPMConversionsIfNecessary(). | 700 // We should have already called this->testPMConversionsIfNecessary(). |
| 705 SkASSERT(fDidTestPMConversions); | 701 SkASSERT(fDidTestPMConversions); |
| 706 GrConfigConversionEffect::PMConversion pmToUPM = | 702 GrConfigConversionEffect::PMConversion pmToUPM = |
| 707 static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); | 703 static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); |
| 708 if (GrConfigConversionEffect::kNone_PMConversion != pmToUPM) { | 704 if (GrConfigConversionEffect::kNone_PMConversion != pmToUPM) { |
| 709 return GrConfigConversionEffect::Create(procDataManager, texture, swapRA
ndB, pmToUPM, | 705 return GrConfigConversionEffect::Create(texture, swapRAndB, pmToUPM, mat
rix); |
| 710 matrix); | |
| 711 } else { | 706 } else { |
| 712 return nullptr; | 707 return nullptr; |
| 713 } | 708 } |
| 714 } | 709 } |
| 715 | 710 |
| 716 const GrFragmentProcessor* GrContext::createUPMToPMEffect(GrProcessorDataManager
* procDataManager, | 711 const GrFragmentProcessor* GrContext::createUPMToPMEffect(GrTexture* texture, |
| 717 GrTexture* texture, | |
| 718 bool swapRAndB, | 712 bool swapRAndB, |
| 719 const SkMatrix& matrix
) const { | 713 const SkMatrix& matrix
) const { |
| 720 // We should have already called this->testPMConversionsIfNecessary(). | 714 // We should have already called this->testPMConversionsIfNecessary(). |
| 721 SkASSERT(fDidTestPMConversions); | 715 SkASSERT(fDidTestPMConversions); |
| 722 GrConfigConversionEffect::PMConversion upmToPM = | 716 GrConfigConversionEffect::PMConversion upmToPM = |
| 723 static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion); | 717 static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion); |
| 724 if (GrConfigConversionEffect::kNone_PMConversion != upmToPM) { | 718 if (GrConfigConversionEffect::kNone_PMConversion != upmToPM) { |
| 725 return GrConfigConversionEffect::Create(procDataManager, texture, swapRA
ndB, upmToPM, | 719 return GrConfigConversionEffect::Create(texture, swapRAndB, upmToPM, mat
rix); |
| 726 matrix); | |
| 727 } else { | 720 } else { |
| 728 return nullptr; | 721 return nullptr; |
| 729 } | 722 } |
| 730 } | 723 } |
| 731 | 724 |
| 732 bool GrContext::didFailPMUPMConversionTest() const { | 725 bool GrContext::didFailPMUPMConversionTest() const { |
| 733 // We should have already called this->testPMConversionsIfNecessary(). | 726 // We should have already called this->testPMConversionsIfNecessary(). |
| 734 SkASSERT(fDidTestPMConversions); | 727 SkASSERT(fDidTestPMConversions); |
| 735 // The PM<->UPM tests fail or succeed together so we only need to check one. | 728 // The PM<->UPM tests fail or succeed together so we only need to check one. |
| 736 return GrConfigConversionEffect::kNone_PMConversion == fPMToUPMConversion; | 729 return GrConfigConversionEffect::kNone_PMConversion == fPMToUPMConversion; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 749 | 742 |
| 750 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ | 743 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ |
| 751 fResourceCache->setLimits(maxTextures, maxTextureBytes); | 744 fResourceCache->setLimits(maxTextures, maxTextureBytes); |
| 752 } | 745 } |
| 753 | 746 |
| 754 ////////////////////////////////////////////////////////////////////////////// | 747 ////////////////////////////////////////////////////////////////////////////// |
| 755 | 748 |
| 756 void GrContext::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { | 749 void GrContext::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { |
| 757 fResourceCache->dumpMemoryStatistics(traceMemoryDump); | 750 fResourceCache->dumpMemoryStatistics(traceMemoryDump); |
| 758 } | 751 } |
| OLD | NEW |