diff options
author | bsalomon <bsalomon@google.com> | 2016-01-25 14:33:25 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-25 14:33:25 -0800 |
commit | e9573317d35d08254412eb407211f3607f8f74fb (patch) | |
tree | d0f09a353f0ed4f60b0f40a276f67270f9904fe4 /src/gpu/gl/GrGLCaps.cpp | |
parent | 64b0f5f95754c4d354d2e09cebf2a0c43d4cdd50 (diff) |
Make A8 readbacks work from non-A8 surfaces
Expand testing of A8 readbacks.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1613903005
Review URL: https://codereview.chromium.org/1613903005
Diffstat (limited to 'src/gpu/gl/GrGLCaps.cpp')
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 81d0b4483b..237412a7fc 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -643,7 +643,11 @@ bool GrGLCaps::readPixelsSupported(GrPixelConfig rtConfig, GrPixelConfig readConfig, std::function<void (GrGLenum, GrGLint*)> getIntegerv, std::function<bool ()> bindRenderTarget) const { - SkASSERT(this->isConfigRenderable(rtConfig, false)); + // If it's not possible to even have a render target of rtConfig then read pixels is + // not supported regardless of readConfig. + if (!this->isConfigRenderable(rtConfig, false)) { + return false; + } GrGLenum readFormat; GrGLenum readType; @@ -652,7 +656,22 @@ bool GrGLCaps::readPixelsSupported(GrPixelConfig rtConfig, } if (kGL_GrGLStandard == fStandard) { - // All of our renderable configs can be converted to each other by glReadPixels in OpenGL. + // Some OpenGL implementations allow GL_ALPHA as a format to glReadPixels. However, + // the manual (https://www.opengl.org/sdk/docs/man/) says only these formats are allowed: + // GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL, GL_RED, GL_GREEN, GL_BLUE, + // GL_RGB, GL_BGR, GL_RGBA, and GL_BGRA. We check for the subset that we would use. + if (readFormat != GR_GL_RED && readFormat != GR_GL_RGB && readFormat != GR_GL_RGBA && + readFormat != GR_GL_BGRA) { + return false; + } + // There is also a set of allowed types, but all the types we use are in the set: + // GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, + // GL_HALF_FLOAT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, GL_UNSIGNED_BYTE_2_3_3_REV, + // GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, + // GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, + // GL_UNSIGNED_INT_8_8_8_8, GL_UNSIGNED_INT_8_8_8_8_REV,GL_UNSIGNED_INT_10_10_10_2, + // GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_INT_10F_11F_11F_REV, + // GL_UNSIGNED_INT_5_9_9_9_REV, or GL_FLOAT_32_UNSIGNED_INT_24_8_REV. return true; } @@ -1070,6 +1089,17 @@ bool GrGLCaps::getExternalFormat(GrPixelConfig surfaceConfig, GrPixelConfig memo *externalFormat = fConfigTable[memoryConfig].fFormats.fExternalFormat[usage]; *externalType = fConfigTable[memoryConfig].fFormats.fExternalType; + // When GL_RED is supported as a texture format, our alpha-only textures are stored using + // GL_RED and we swizzle in order to map all components to 'r'. However, in this case the + // surface is not alpha-only and we want alpha to really mean the alpha component of the + // texture, not the red component. + if (memoryIsAlphaOnly && !surfaceIsAlphaOnly) { + if (this->textureRedSupport()) { + SkASSERT(GR_GL_RED == *externalFormat); + *externalFormat = GR_GL_ALPHA; + } + } + return true; } |