From 1d89c93b2a61a9679f444b19b6fce4325ae7df65 Mon Sep 17 00:00:00 2001 From: "robertphillips@google.com" Date: Wed, 27 Jun 2012 19:31:41 +0000 Subject: Added ReadPixels format-supported check to GL Caps http://codereview.appspot.com/6336055/ git-svn-id: http://skia.googlecode.com/svn/trunk@4374 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/gpu/gl/GrGLCaps.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/gpu/gl/GrGLCaps.cpp') diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index ec125b7712..125e387fb0 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -35,6 +35,7 @@ void GrGLCaps::reset() { fTexStorageSupport = false; fTextureRedSupport = false; fImagingSupport = false; + fTwoFormatLimit = false; } GrGLCaps::GrGLCaps(const GrGLCaps& caps) { @@ -63,6 +64,7 @@ GrGLCaps& GrGLCaps::operator = (const GrGLCaps& caps) { fTexStorageSupport = caps.fTexStorageSupport; fTextureRedSupport = caps.fTextureRedSupport; fImagingSupport = caps.fImagingSupport; + fTwoFormatLimit = caps.fTwoFormatLimit; return *this; } @@ -151,10 +153,44 @@ void GrGLCaps::init(const GrGLContextInfo& ctxInfo) { fImagingSupport = kDesktop_GrGLBinding == binding && ctxInfo.hasExtension("GL_ARB_imaging"); + // ES 2 only guarantees RGBA/uchar + one other format/type combo for + // ReadPixels. The other format has to checked at run-time since it + // can change based on which render target is bound + fTwoFormatLimit = kES2_GrGLBinding == binding; + this->initFSAASupport(ctxInfo); this->initStencilFormats(ctxInfo); } +bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, + GrGLenum format, + GrGLenum type) const { + if (GR_GL_RGBA == format && GR_GL_UNSIGNED_BYTE == type) { + // ES 2 guarantees this format is supported + true; + } + + if (!fTwoFormatLimit) { + // not limited by ES 2's constraints + return true; + } + + int otherFormat = GR_GL_RGBA; + int otherType = GR_GL_UNSIGNED_BYTE; + + // The other supported format/type combo supported for ReadPixels + // can change based on which render target is bound + GR_GL_GetIntegerv(intf, + GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, + &otherFormat); + + GR_GL_GetIntegerv(intf, + GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, + &otherType); + + return otherFormat == format && otherType == type; +} + namespace { int coverage_mode_compare(const GrGLCaps::MSAACoverageMode* left, const GrGLCaps::MSAACoverageMode* right) { @@ -378,5 +414,6 @@ void GrGLCaps::print() const { (fPackRowLengthSupport ? "YES": "NO")); GrPrintf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO")); + GrPrintf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO")); } -- cgit v1.2.3