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
This commit is contained in:
robertphillips@google.com 2012-06-27 19:31:41 +00:00
parent 7f581a9728
commit 1d89c93b2a
2 changed files with 43 additions and 0 deletions

View File

@ -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"));
}

View File

@ -214,6 +214,11 @@ public:
/// Is GL_ARB_IMAGING supported
bool imagingSupport() const { return fImagingSupport; }
// Does ReadPixels support the provided format/type combo?
bool readPixelsSupported(const GrGLInterface* intf,
GrGLenum format,
GrGLenum type) const;
private:
/**
* Maintains a bit per GrPixelConfig. It is used to avoid redundantly
@ -285,6 +290,7 @@ private:
bool fTexStorageSupport : 1;
bool fTextureRedSupport : 1;
bool fImagingSupport : 1;
bool fTwoFormatLimit : 1;
};
#endif