Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1227)

Side by Side Diff: src/gpu/GrContext.cpp

Issue 2041113004: sk_sp for gpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Reserve correctly. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrDefaultGeoProcFactory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "GrContext.h" 8 #include "GrContext.h"
9 #include "GrContextOptions.h" 9 #include "GrContextOptions.h"
10 #include "GrDrawingManager.h" 10 #include "GrDrawingManager.h"
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 tempTexture.reset( 310 tempTexture.reset(
311 this->textureProvider()->createApproxTexture(tempDrawInfo.fTempSurfa ceDesc)); 311 this->textureProvider()->createApproxTexture(tempDrawInfo.fTempSurfa ceDesc));
312 if (!tempTexture && GrGpu::kRequireDraw_DrawPreference == drawPreference ) { 312 if (!tempTexture && GrGpu::kRequireDraw_DrawPreference == drawPreference ) {
313 return false; 313 return false;
314 } 314 }
315 } 315 }
316 316
317 // temp buffer for doing sw premul conversion, if needed. 317 // temp buffer for doing sw premul conversion, if needed.
318 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); 318 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0);
319 if (tempTexture) { 319 if (tempTexture) {
320 SkAutoTUnref<const GrFragmentProcessor> fp; 320 sk_sp<GrFragmentProcessor> fp;
321 SkMatrix textureMatrix; 321 SkMatrix textureMatrix;
322 textureMatrix.setIDiv(tempTexture->width(), tempTexture->height()); 322 textureMatrix.setIDiv(tempTexture->width(), tempTexture->height());
323 if (applyPremulToSrc) { 323 if (applyPremulToSrc) {
324 fp.reset(this->createUPMToPMEffect(tempTexture, tempDrawInfo.fSwizzl e, 324 fp = this->createUPMToPMEffect(tempTexture, tempDrawInfo.fSwizzle, t extureMatrix);
325 textureMatrix));
326 // If premultiplying was the only reason for the draw, fall back to a straight write. 325 // If premultiplying was the only reason for the draw, fall back to a straight write.
327 if (!fp) { 326 if (!fp) {
328 if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference) { 327 if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPreference) {
329 tempTexture.reset(nullptr); 328 tempTexture.reset(nullptr);
330 } 329 }
331 } else { 330 } else {
332 applyPremulToSrc = false; 331 applyPremulToSrc = false;
333 } 332 }
334 } 333 }
335 if (tempTexture) { 334 if (tempTexture) {
336 if (!fp) { 335 if (!fp) {
337 fp.reset(GrConfigConversionEffect::Create(tempTexture, tempDrawI nfo.fSwizzle, 336 fp = GrConfigConversionEffect::Make(tempTexture, tempDrawInfo.fS wizzle,
338 GrConfigConversionEffect::kNone_PMConversion, textureMatrix) ); 337 GrConfigConversionEffect::kN one_PMConversion,
338 textureMatrix);
339 if (!fp) { 339 if (!fp) {
340 return false; 340 return false;
341 } 341 }
342 } 342 }
343 GrRenderTarget* renderTarget = surface->asRenderTarget(); 343 GrRenderTarget* renderTarget = surface->asRenderTarget();
344 SkASSERT(renderTarget); 344 SkASSERT(renderTarget);
345 if (tempTexture->surfacePriv().hasPendingIO()) { 345 if (tempTexture->surfacePriv().hasPendingIO()) {
346 this->flush(); 346 this->flush();
347 } 347 }
348 if (applyPremulToSrc) { 348 if (applyPremulToSrc) {
(...skipping 12 matching lines...) Expand all
361 rowBytes)) { 361 rowBytes)) {
362 return false; 362 return false;
363 } 363 }
364 SkMatrix matrix; 364 SkMatrix matrix;
365 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); 365 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top));
366 sk_sp<GrDrawContext> drawContext(this->drawContext(sk_ref_sp(renderT arget))); 366 sk_sp<GrDrawContext> drawContext(this->drawContext(sk_ref_sp(renderT arget)));
367 if (!drawContext) { 367 if (!drawContext) {
368 return false; 368 return false;
369 } 369 }
370 GrPaint paint; 370 GrPaint paint;
371 paint.addColorFragmentProcessor(fp); 371 paint.addColorFragmentProcessor(std::move(fp));
372 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 372 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
373 paint.setAllowSRGBInputs(true); 373 paint.setAllowSRGBInputs(true);
374 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(hei ght)); 374 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(hei ght));
375 drawContext->drawRect(GrNoClip(), paint, matrix, rect, nullptr); 375 drawContext->drawRect(GrNoClip(), paint, matrix, rect, nullptr);
376 376
377 if (kFlushWrites_PixelOp & pixelOpsFlags) { 377 if (kFlushWrites_PixelOp & pixelOpsFlags) {
378 this->flushSurfaceWrites(surface); 378 this->flushSurfaceWrites(surface);
379 } 379 }
380 } 380 }
381 } 381 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 if (tempDrawInfo.fUseExactScratch) { 454 if (tempDrawInfo.fUseExactScratch) {
455 temp.reset(this->textureProvider()->createTexture(tempDrawInfo.fTemp SurfaceDesc, 455 temp.reset(this->textureProvider()->createTexture(tempDrawInfo.fTemp SurfaceDesc,
456 SkBudgeted::kYes)) ; 456 SkBudgeted::kYes)) ;
457 } else { 457 } else {
458 temp.reset(this->textureProvider()->createApproxTexture(tempDrawInfo .fTempSurfaceDesc)); 458 temp.reset(this->textureProvider()->createApproxTexture(tempDrawInfo .fTempSurfaceDesc));
459 } 459 }
460 if (temp) { 460 if (temp) {
461 SkMatrix textureMatrix; 461 SkMatrix textureMatrix;
462 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); 462 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top));
463 textureMatrix.postIDiv(src->width(), src->height()); 463 textureMatrix.postIDiv(src->width(), src->height());
464 SkAutoTUnref<const GrFragmentProcessor> fp; 464 sk_sp<GrFragmentProcessor> fp;
465 if (unpremul) { 465 if (unpremul) {
466 fp.reset(this->createPMToUPMEffect(src->asTexture(), tempDrawInf o.fSwizzle, 466 fp = this->createPMToUPMEffect(src->asTexture(), tempDrawInfo.fS wizzle,
467 textureMatrix)); 467 textureMatrix);
468 if (fp) { 468 if (fp) {
469 unpremul = false; // we no longer need to do this on CPU aft er the read back. 469 unpremul = false; // we no longer need to do this on CPU aft er the read back.
470 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe rence) { 470 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe rence) {
471 // We only wanted to do the draw in order to perform the unp remul so don't 471 // We only wanted to do the draw in order to perform the unp remul so don't
472 // bother. 472 // bother.
473 temp.reset(nullptr); 473 temp.reset(nullptr);
474 } 474 }
475 } 475 }
476 if (!fp && temp) { 476 if (!fp && temp) {
477 fp.reset(GrConfigConversionEffect::Create(src->asTexture(), temp DrawInfo.fSwizzle, 477 fp = GrConfigConversionEffect::Make(src->asTexture(), tempDrawIn fo.fSwizzle,
478 GrConfigConversionEffect::kNone_PMConversion, textureMatrix) ); 478 GrConfigConversionEffect::kN one_PMConversion,
479 textureMatrix);
479 } 480 }
480 if (fp) { 481 if (fp) {
481 GrPaint paint; 482 GrPaint paint;
482 paint.addColorFragmentProcessor(fp); 483 paint.addColorFragmentProcessor(std::move(fp));
483 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 484 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
484 paint.setAllowSRGBInputs(true); 485 paint.setAllowSRGBInputs(true);
485 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar (height)); 486 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar (height));
486 sk_sp<GrDrawContext> drawContext( 487 sk_sp<GrDrawContext> drawContext(
487 this->drawContext(sk_ref_sp(temp->as RenderTarget()))); 488 this->drawContext(sk_ref_sp(temp->as RenderTarget())));
488 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect, nu llptr); 489 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect, nu llptr);
489 surfaceToRead.reset(SkRef(temp.get())); 490 surfaceToRead.reset(SkRef(temp.get()));
490 left = 0; 491 left = 0;
491 top = 0; 492 top = 0;
492 didTempDraw = true; 493 didTempDraw = true;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 SkSurfaceProps props(SkSurfaceProps::kGammaCorrect_Flag, 544 SkSurfaceProps props(SkSurfaceProps::kGammaCorrect_Flag,
544 SkSurfaceProps::kLegacyFontHost_InitType); 545 SkSurfaceProps::kLegacyFontHost_InitType);
545 sk_sp<GrDrawContext> drawContext(this->drawContext(sk_ref_sp(dst), &props)); 546 sk_sp<GrDrawContext> drawContext(this->drawContext(sk_ref_sp(dst), &props));
546 if (!drawContext) { 547 if (!drawContext) {
547 return false; 548 return false;
548 } 549 }
549 550
550 GrPaint paint; 551 GrPaint paint;
551 paint.addColorTextureProcessor(src, GrCoordTransform::MakeDivByTextureWHMatr ix(src)); 552 paint.addColorTextureProcessor(src, GrCoordTransform::MakeDivByTextureWHMatr ix(src));
552 if (!SkScalarNearlyEqual(gamma, 1.0f)) { 553 if (!SkScalarNearlyEqual(gamma, 1.0f)) {
553 paint.addColorFragmentProcessor(GrGammaEffect::Create(gamma))->unref(); 554 paint.addColorFragmentProcessor(GrGammaEffect::Make(gamma));
554 } 555 }
555 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 556 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
556 paint.setGammaCorrect(true); 557 paint.setGammaCorrect(true);
557 558
558 SkRect rect; 559 SkRect rect;
559 src->getBoundsRect(&rect); 560 src->getBoundsRect(&rect);
560 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect); 561 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect);
561 562
562 this->flushSurfaceWrites(dst); 563 this->flushSurfaceWrites(dst);
563 return true; 564 return true;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 ASSERT_SINGLE_OWNER 703 ASSERT_SINGLE_OWNER
703 if (SkToBool(kUnpremul_PixelOpsFlag & flags)) { 704 if (SkToBool(kUnpremul_PixelOpsFlag & flags)) {
704 SkAutoMutexAcquire ama(fTestPMConversionsMutex); 705 SkAutoMutexAcquire ama(fTestPMConversionsMutex);
705 if (!fDidTestPMConversions) { 706 if (!fDidTestPMConversions) {
706 test_pm_conversions(this, &fPMToUPMConversion, &fUPMToPMConversion); 707 test_pm_conversions(this, &fPMToUPMConversion, &fUPMToPMConversion);
707 fDidTestPMConversions = true; 708 fDidTestPMConversions = true;
708 } 709 }
709 } 710 }
710 } 711 }
711 712
712 const GrFragmentProcessor* GrContext::createPMToUPMEffect(GrTexture* texture, 713 sk_sp<GrFragmentProcessor> GrContext::createPMToUPMEffect(GrTexture* texture,
713 const GrSwizzle& swizz le, 714 const GrSwizzle& swizz le,
714 const SkMatrix& matrix ) const { 715 const SkMatrix& matrix ) const {
715 ASSERT_SINGLE_OWNER 716 ASSERT_SINGLE_OWNER
716 // We should have already called this->testPMConversionsIfNecessary(). 717 // We should have already called this->testPMConversionsIfNecessary().
717 SkASSERT(fDidTestPMConversions); 718 SkASSERT(fDidTestPMConversions);
718 GrConfigConversionEffect::PMConversion pmToUPM = 719 GrConfigConversionEffect::PMConversion pmToUPM =
719 static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion); 720 static_cast<GrConfigConversionEffect::PMConversion>(fPMToUPMConversion);
720 if (GrConfigConversionEffect::kNone_PMConversion != pmToUPM) { 721 if (GrConfigConversionEffect::kNone_PMConversion != pmToUPM) {
721 return GrConfigConversionEffect::Create(texture, swizzle, pmToUPM, matri x); 722 return GrConfigConversionEffect::Make(texture, swizzle, pmToUPM, matrix) ;
722 } else { 723 } else {
723 return nullptr; 724 return nullptr;
724 } 725 }
725 } 726 }
726 727
727 const GrFragmentProcessor* GrContext::createUPMToPMEffect(GrTexture* texture, 728 sk_sp<GrFragmentProcessor> GrContext::createUPMToPMEffect(GrTexture* texture,
728 const GrSwizzle& swizz le, 729 const GrSwizzle& swizz le,
729 const SkMatrix& matrix ) const { 730 const SkMatrix& matrix ) const {
730 ASSERT_SINGLE_OWNER 731 ASSERT_SINGLE_OWNER
731 // We should have already called this->testPMConversionsIfNecessary(). 732 // We should have already called this->testPMConversionsIfNecessary().
732 SkASSERT(fDidTestPMConversions); 733 SkASSERT(fDidTestPMConversions);
733 GrConfigConversionEffect::PMConversion upmToPM = 734 GrConfigConversionEffect::PMConversion upmToPM =
734 static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion); 735 static_cast<GrConfigConversionEffect::PMConversion>(fUPMToPMConversion);
735 if (GrConfigConversionEffect::kNone_PMConversion != upmToPM) { 736 if (GrConfigConversionEffect::kNone_PMConversion != upmToPM) {
736 return GrConfigConversionEffect::Create(texture, swizzle, upmToPM, matri x); 737 return GrConfigConversionEffect::Make(texture, swizzle, upmToPM, matrix) ;
737 } else { 738 } else {
738 return nullptr; 739 return nullptr;
739 } 740 }
740 } 741 }
741 742
742 bool GrContext::didFailPMUPMConversionTest() const { 743 bool GrContext::didFailPMUPMConversionTest() const {
743 ASSERT_SINGLE_OWNER 744 ASSERT_SINGLE_OWNER
744 // We should have already called this->testPMConversionsIfNecessary(). 745 // We should have already called this->testPMConversionsIfNecessary().
745 SkASSERT(fDidTestPMConversions); 746 SkASSERT(fDidTestPMConversions);
746 // The PM<->UPM tests fail or succeed together so we only need to check one. 747 // The PM<->UPM tests fail or succeed together so we only need to check one.
(...skipping 16 matching lines...) Expand all
763 ASSERT_SINGLE_OWNER 764 ASSERT_SINGLE_OWNER
764 fResourceCache->setLimits(maxTextures, maxTextureBytes); 765 fResourceCache->setLimits(maxTextures, maxTextureBytes);
765 } 766 }
766 767
767 ////////////////////////////////////////////////////////////////////////////// 768 //////////////////////////////////////////////////////////////////////////////
768 769
769 void GrContext::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const { 770 void GrContext::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const {
770 ASSERT_SINGLE_OWNER 771 ASSERT_SINGLE_OWNER
771 fResourceCache->dumpMemoryStatistics(traceMemoryDump); 772 fResourceCache->dumpMemoryStatistics(traceMemoryDump);
772 } 773 }
OLDNEW
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrDefaultGeoProcFactory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698