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

Unified Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1584563002: Make A8 readback work in more cases and improve testing. (Closed) Base URL: https://skia.googlesource.com/skia.git@outputswiz
Patch Set: fix test for ios 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 side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLGpu.cpp
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 8033ea60e5590de4efd3236c06048bb181435183..972049aa56b36327e24671d7c1d19e3138228035 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1951,7 +1951,8 @@ bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height,
ReadPixelTempDrawInfo* tempDrawInfo) {
// This subclass can only read pixels from a render target. We could use glTexSubImage2D on
// GL versions that support it but we don't today.
- if (!srcSurface->asRenderTarget()) {
+ GrRenderTarget* srcAsRT = srcSurface->asRenderTarget();
+ if (!srcAsRT) {
ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
}
@@ -1992,13 +1993,20 @@ bool GrGLGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height,
tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig;
tempDrawInfo->fSwapRAndB = true;
ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
+ } else if (kRequireDraw_DrawPreference == *drawPreference &&
+ readConfig == kAlpha_8_GrPixelConfig &&
+ !this->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) {
+ // On some GLs there is no renderable single channel format. In that case we fall back
+ // to rendering to a RGBA and then will extract the alpha from that.
+ if (this->caps()->isConfigRenderable(kRGBA_8888_GrPixelConfig, false)) {
+ tempDrawInfo->fTempSurfaceDesc.fConfig = kRGBA_8888_GrPixelConfig;
+ } else {
+ return false;
+ }
}
- GrRenderTarget* srcAsRT = srcSurface->asRenderTarget();
- if (!srcAsRT) {
- ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
- } else if (read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, height, readConfig,
- rowBytes)) {
+ if (srcAsRT && read_pixels_pays_for_y_flip(srcAsRT, this->glCaps(), width, height, readConfig,
+ rowBytes)) {
ElevateDrawPreference(drawPreference, kGpuPrefersDraw_DrawPreference);
}
@@ -2049,6 +2057,28 @@ bool GrGLGpu::onReadPixels(GrSurface* surface,
SkFAIL("Unknown resolve type");
}
+ // We have a special case fallback for reading alpha from a RGBA/BGRA surface. We will read
+ // back all the channels as RGBA and then extract A.
+ // This must be called after the RT is bound as the FBO above.
+ if (!this->glCaps().readPixelsSupported(this->glInterface(), config, tgt->config())) {
+ if ((tgt->config() == kRGBA_8888_GrPixelConfig ||
+ tgt->config() == kBGRA_8888_GrPixelConfig) &&
+ kAlpha_8_GrPixelConfig == config) {
+ SkAutoTDeleteArray<uint32_t> temp(new uint32_t[width * height * 4]);
+ if (this->onReadPixels(surface, left, top, width, height, kRGBA_8888_GrPixelConfig,
+ temp.get(), width*4)) {
+ uint8_t* dst = reinterpret_cast<uint8_t*>(buffer);
+ for (int j = 0; j < height; ++j) {
+ for (int i = 0; i < width; ++i) {
+ dst[j*rowBytes + i] = (0xFF000000U & temp[j*width+i]) >> 24;
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
const GrGLIRect& glvp = tgt->getViewport();
// the read rect is viewport-relative

Powered by Google App Engine
This is Rietveld 408576698