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

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1617433002: Make swizzling in read/write pixel copy code more generic (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix loop in config conversion test create Created 4 years, 11 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/effects/GrConfigConversionEffect.cpp ('k') | no next file » | 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 8
9 #include "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLGLSL.h" 10 #include "GrGLGLSL.h"
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 if (GR_GL_TEXTURE_EXTERNAL == texture->target()) { 557 if (GR_GL_TEXTURE_EXTERNAL == texture->target()) {
558 // We don't currently support writing pixels to EXTERNAL textures. 558 // We don't currently support writing pixels to EXTERNAL textures.
559 return false; 559 return false;
560 } 560 }
561 } 561 }
562 562
563 if (GrPixelConfigIsSRGB(dstSurface->config()) != GrPixelConfigIsSRGB(srcConf ig)) { 563 if (GrPixelConfigIsSRGB(dstSurface->config()) != GrPixelConfigIsSRGB(srcConf ig)) {
564 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 564 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
565 } 565 }
566 566
567 tempDrawInfo->fSwapRAndB = false; 567 // Start off assuming no swizzling
568 tempDrawInfo->fSwizzle = GrSwizzle::RGBA();
569 tempDrawInfo->fWriteConfig = srcConfig;
568 570
569 // These settings we will always want if a temp draw is performed. Initially set the config 571 // These settings we will always want if a temp draw is performed. Initially set the config
570 // to srcConfig, though that may be modified if we decide to do a R/G swap. 572 // to srcConfig, though that may be modified if we decide to do a R/G swap.
571 tempDrawInfo->fTempSurfaceDesc.fFlags = kNone_GrSurfaceFlags; 573 tempDrawInfo->fTempSurfaceDesc.fFlags = kNone_GrSurfaceFlags;
572 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig; 574 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig;
573 tempDrawInfo->fTempSurfaceDesc.fWidth = width; 575 tempDrawInfo->fTempSurfaceDesc.fWidth = width;
574 tempDrawInfo->fTempSurfaceDesc.fHeight = height; 576 tempDrawInfo->fTempSurfaceDesc.fHeight = height;
575 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0; 577 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0;
576 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU y-flip for TL. 578 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU y-flip for TL.
577 579
578 bool configsAreRBSwaps = GrPixelConfigSwapRAndB(srcConfig) == dstSurface->co nfig(); 580 bool configsAreRBSwaps = GrPixelConfigSwapRAndB(srcConfig) == dstSurface->co nfig();
579 581
580 if (configsAreRBSwaps) { 582 if (configsAreRBSwaps) {
581 if (!this->caps()->isConfigTexturable(srcConfig)) { 583 if (!this->caps()->isConfigTexturable(srcConfig)) {
582 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 584 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
583 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config(); 585 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config();
584 tempDrawInfo->fSwapRAndB = true; 586 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
587 tempDrawInfo->fWriteConfig = dstSurface->config();
585 } else if (this->glCaps().rgba8888PixelsOpsAreSlow() && 588 } else if (this->glCaps().rgba8888PixelsOpsAreSlow() &&
586 kRGBA_8888_GrPixelConfig == srcConfig) { 589 kRGBA_8888_GrPixelConfig == srcConfig) {
587 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference ); 590 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference );
588 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config(); 591 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config();
589 tempDrawInfo->fSwapRAndB = true; 592 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
593 tempDrawInfo->fWriteConfig = dstSurface->config();
590 } else if (kGLES_GrGLStandard == this->glStandard() && 594 } else if (kGLES_GrGLStandard == this->glStandard() &&
591 this->glCaps().bgraIsInternalFormat()) { 595 this->glCaps().bgraIsInternalFormat()) {
592 // The internal format and external formats must match texture uploa ds so we can't 596 // The internal format and external formats must match texture uploa ds so we can't
593 // swizzle while uploading when BGRA is a distinct internal format. 597 // swizzle while uploading when BGRA is a distinct internal format.
594 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 598 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
595 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config(); 599 tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config();
596 tempDrawInfo->fSwapRAndB = true; 600 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
601 tempDrawInfo->fWriteConfig = dstSurface->config();
597 } 602 }
598 } 603 }
599 604
600 if (!this->glCaps().unpackFlipYSupport() && 605 if (!this->glCaps().unpackFlipYSupport() &&
601 kBottomLeft_GrSurfaceOrigin == dstSurface->origin()) { 606 kBottomLeft_GrSurfaceOrigin == dstSurface->origin()) {
602 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); 607 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference);
603 } 608 }
604 609
605 return true; 610 return true;
606 } 611 }
(...skipping 1357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1964 // This subclass can only read pixels from a render target. We could use glT exSubImage2D on 1969 // This subclass can only read pixels from a render target. We could use glT exSubImage2D on
1965 // GL versions that support it but we don't today. 1970 // GL versions that support it but we don't today.
1966 if (!srcSurface->asRenderTarget()) { 1971 if (!srcSurface->asRenderTarget()) {
1967 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 1972 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
1968 } 1973 }
1969 1974
1970 if (GrPixelConfigIsSRGB(srcSurface->config()) != GrPixelConfigIsSRGB(readCon fig)) { 1975 if (GrPixelConfigIsSRGB(srcSurface->config()) != GrPixelConfigIsSRGB(readCon fig)) {
1971 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 1976 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
1972 } 1977 }
1973 1978
1974 tempDrawInfo->fSwapRAndB = false; 1979 tempDrawInfo->fSwizzle = GrSwizzle::RGBA();
1980 tempDrawInfo->fReadConfig = readConfig;
1975 1981
1976 // These settings we will always want if a temp draw is performed. The confi g is set below 1982 // These settings we will always want if a temp draw is performed. The confi g is set below
1977 // depending on whether we want to do a R/B swap or not. 1983 // depending on whether we want to do a R/B swap or not.
1978 tempDrawInfo->fTempSurfaceDesc.fFlags = kRenderTarget_GrSurfaceFlag; 1984 tempDrawInfo->fTempSurfaceDesc.fFlags = kRenderTarget_GrSurfaceFlag;
1979 tempDrawInfo->fTempSurfaceDesc.fWidth = width; 1985 tempDrawInfo->fTempSurfaceDesc.fWidth = width;
1980 tempDrawInfo->fTempSurfaceDesc.fHeight = height; 1986 tempDrawInfo->fTempSurfaceDesc.fHeight = height;
1981 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0; 1987 tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0;
1982 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU y-flip for TL. 1988 tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin; // no CPU y-flip for TL.
1983 tempDrawInfo->fUseExactScratch = this->glCaps().partialFBOReadIsSlow(); 1989 tempDrawInfo->fUseExactScratch = this->glCaps().partialFBOReadIsSlow();
1984 1990
1985 // Start off assuming that any temp draw should be to the readConfig, then c heck if that will 1991 // Start off assuming that any temp draw should be to the readConfig, then c heck if that will
1986 // be inefficient. 1992 // be inefficient.
1987 GrPixelConfig srcConfig = srcSurface->config(); 1993 GrPixelConfig srcConfig = srcSurface->config();
1988 tempDrawInfo->fTempSurfaceDesc.fConfig = readConfig; 1994 tempDrawInfo->fTempSurfaceDesc.fConfig = readConfig;
1989 1995
1990 if (this->glCaps().rgba8888PixelsOpsAreSlow() && kRGBA_8888_GrPixelConfig == readConfig) { 1996 if (this->glCaps().rgba8888PixelsOpsAreSlow() && kRGBA_8888_GrPixelConfig == readConfig) {
1991 tempDrawInfo->fTempSurfaceDesc.fConfig = kBGRA_8888_GrPixelConfig; 1997 tempDrawInfo->fTempSurfaceDesc.fConfig = kBGRA_8888_GrPixelConfig;
1992 tempDrawInfo->fSwapRAndB = true; 1998 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
1999 tempDrawInfo->fReadConfig = kBGRA_8888_GrPixelConfig;
1993 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); 2000 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference);
1994 } else if (kMesa_GrGLDriver == this->glContext().driver() && 2001 } else if (kMesa_GrGLDriver == this->glContext().driver() &&
1995 GrBytesPerPixel(readConfig) == 4 && 2002 GrBytesPerPixel(readConfig) == 4 &&
1996 GrPixelConfigSwapRAndB(readConfig) == srcConfig) { 2003 GrPixelConfigSwapRAndB(readConfig) == srcConfig) {
1997 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA sur face and vice-versa. 2004 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA surf ace and vice-versa.
1998 // Better to do a draw with a R/B swap and then read as the original con fig. 2005 // Better to do a draw with a R/B swap and then read as the original con fig.
1999 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig; 2006 tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig;
2000 tempDrawInfo->fSwapRAndB = true; 2007 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
2008 tempDrawInfo->fReadConfig = srcConfig;
2001 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); 2009 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference);
2002 } else if (readConfig == kBGRA_8888_GrPixelConfig && 2010 } else if (readConfig == kBGRA_8888_GrPixelConfig &&
2003 !this->glCaps().readPixelsSupported(this->glInterface(), readConf ig, srcConfig)) { 2011 !this->glCaps().readPixelsSupported(this->glInterface(), readConf ig, srcConfig)) {
2004 tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig; 2012 tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig;
2005 tempDrawInfo->fSwapRAndB = true; 2013 tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
2014 tempDrawInfo->fReadConfig = kRGBA_8888_GrPixelConfig;
2006 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 2015 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
2007 } 2016 }
2008 2017
2009 GrRenderTarget* srcAsRT = srcSurface->asRenderTarget(); 2018 GrRenderTarget* srcAsRT = srcSurface->asRenderTarget();
2010 if (!srcAsRT) { 2019 if (!srcAsRT) {
2011 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference); 2020 ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
2012 } else if (read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, heigh t, readConfig, 2021 } else if (read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, heigh t, readConfig,
2013 rowBytes)) { 2022 rowBytes)) {
2014 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference); 2023 ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference);
2015 } 2024 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 switch (tgt->getResolveType()) { 2056 switch (tgt->getResolveType()) {
2048 case GrGLRenderTarget::kCantResolve_ResolveType: 2057 case GrGLRenderTarget::kCantResolve_ResolveType:
2049 return false; 2058 return false;
2050 case GrGLRenderTarget::kAutoResolves_ResolveType: 2059 case GrGLRenderTarget::kAutoResolves_ResolveType:
2051 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect()); 2060 this->flushRenderTarget(tgt, &SkIRect::EmptyIRect());
2052 break; 2061 break;
2053 case GrGLRenderTarget::kCanResolve_ResolveType: 2062 case GrGLRenderTarget::kCanResolve_ResolveType:
2054 this->onResolveRenderTarget(tgt); 2063 this->onResolveRenderTarget(tgt);
2055 // we don't track the state of the READ FBO ID. 2064 // we don't track the state of the READ FBO ID.
2056 fStats.incRenderTargetBinds(); 2065 fStats.incRenderTargetBinds();
2057 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, 2066 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, tgt->textureFBOID()) );
2058 tgt->textureFBOID()));
2059 break; 2067 break;
2060 default: 2068 default:
2061 SkFAIL("Unknown resolve type"); 2069 SkFAIL("Unknown resolve type");
2062 } 2070 }
2063 2071
2064 const GrGLIRect& glvp = tgt->getViewport(); 2072 const GrGLIRect& glvp = tgt->getViewport();
2065 2073
2066 // the read rect is viewport-relative 2074 // the read rect is viewport-relative
2067 GrGLIRect readRect; 2075 GrGLIRect readRect;
2068 readRect.setRelativeTo(glvp, left, top, width, height, tgt->origin()); 2076 readRect.setRelativeTo(glvp, left, top, width, height, tgt->origin());
(...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after
3500 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || 3508 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() ||
3501 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { 3509 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) {
3502 copyParams->fFilter = GrTextureParams::kNone_FilterMode; 3510 copyParams->fFilter = GrTextureParams::kNone_FilterMode;
3503 copyParams->fWidth = texture->width(); 3511 copyParams->fWidth = texture->width();
3504 copyParams->fHeight = texture->height(); 3512 copyParams->fHeight = texture->height();
3505 return true; 3513 return true;
3506 } 3514 }
3507 } 3515 }
3508 return false; 3516 return false;
3509 } 3517 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrConfigConversionEffect.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698