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

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

Issue 1542813004: Move read pixels format info into ConifgInfo in GrGLCaps (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: cleanup Created 5 years 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
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | src/gpu/gl/GrGLGpu.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLCaps.cpp
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index 5406e6f07db59ee1340ae9011931c6e045e2a2cb..c568646db6b37e189ca25777b5ab015bdef4601e 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -36,7 +36,6 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
fTexStorageSupport = false;
fTextureRedSupport = false;
fImagingSupport = false;
- fTwoFormatLimit = false;
fVertexArrayObjectSupport = false;
fDirectStateAccessSupport = false;
fDebugSupport = false;
@@ -50,8 +49,6 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
fRGBA8888PixelsOpsAreSlow = false;
fPartialFBOReadIsSlow = false;
- fReadPixelsSupportedCache.reset();
-
fShaderCaps.reset(new GrGLSLCaps(contextOptions));
this->init(contextOptions, ctxInfo, glInterface);
@@ -144,11 +141,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions,
fImagingSupport = kGL_GrGLStandard == standard &&
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 = kGLES_GrGLStandard == standard;
-
// We only enable srgb support if both textures and FBOs support srgb.
bool srgbSupport = false;
if (kGL_GrGLStandard == standard) {
@@ -960,46 +952,43 @@ void GrGLCaps::initConfigTexturableTable(const GrGLContextInfo& ctxInfo, const G
fConfigTextureSupport[kRGBA_half_GrPixelConfig] = hasHalfFPTextures;
}
-bool GrGLCaps::doReadPixelsSupported(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
- return true;
- }
+bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf,
+ GrPixelConfig readConfig,
+ GrPixelConfig currFBOConfig) const {
+ SkASSERT(this->isConfigRenderable(currFBOConfig, false));
- if (!fTwoFormatLimit) {
- // not limited by ES 2's constraints
+ if (kGL_GrGLStandard == intf->fStandard) {
+ // All of our renderable configs can be converted to each other by glReadPixels in OpenGL.
return true;
}
+ // See Section 16.1.2 in the ES 3.2 specification.
- GrGLint otherFormat = GR_GL_RGBA;
- GrGLint 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);
+ GrGLenum readFormat = fConfigTable[readConfig].fFormats.fExternalFormat;
+ GrGLenum readType = fConfigTable[readConfig].fFormats.fExternalType;
- GR_GL_GetIntegerv(intf,
- GR_GL_IMPLEMENTATION_COLOR_READ_TYPE,
- &otherType);
+ if (kNormalizedFixedPoint_FormatType == fConfigTable[currFBOConfig].fFormatType) {
+ if (GR_GL_RGBA == readFormat && GR_GL_UNSIGNED_BYTE == readType) {
+ return true;
+ }
+ } else {
+ SkASSERT(kFloat_FormatType == fConfigTable[currFBOConfig].fFormatType);
+ if (GR_GL_RGBA == readFormat && GR_GL_FLOAT == readType) {
+ return true;
+ }
+ }
- return (GrGLenum)otherFormat == format && (GrGLenum)otherType == type;
-}
+ if (0 == fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fFormat) {
+ ReadPixelsFormat* rpFormat =
+ const_cast<ReadPixelsFormat*>(&fConfigTable[currFBOConfig].fSecondReadPixelsFormat);
+ GrGLint format = 0, type = 0;
+ GR_GL_GetIntegerv(intf, GR_GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format);
+ GR_GL_GetIntegerv(intf, GR_GL_IMPLEMENTATION_COLOR_READ_TYPE, &type);
+ rpFormat->fFormat = format;
+ rpFormat->fType = type;
+ }
-bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf,
- GrGLenum format,
- GrGLenum type,
- GrGLenum currFboFormat) const {
- ReadPixelsSupportedFormat key = {format, type, currFboFormat};
- if (const bool* supported = fReadPixelsSupportedCache.find(key)) {
- return *supported;
- }
- bool supported = this->doReadPixelsSupported(intf, format, type);
- fReadPixelsSupportedCache.set(key, supported);
- return supported;
+ return fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fFormat == readFormat &&
+ fConfigTable[currFBOConfig].fSecondReadPixelsFormat.fType == readType;
}
void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
@@ -1210,7 +1199,6 @@ SkString GrGLCaps::dump() const {
r.appendf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO"));
r.appendf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO"));
r.appendf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO"));
- r.appendf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO"));
r.appendf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ? "YES": "NO"));
r.appendf("Direct state access support: %s\n", (fDirectStateAccessSupport ? "YES": "NO"));
r.appendf("Debug support: %s\n", (fDebugSupport ? "YES": "NO"));
@@ -1351,11 +1339,13 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0;
fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kUnknown_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8;
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
+ fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
if (this->bgraIsInternalFormat()) {
fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_BGRA;
@@ -1366,6 +1356,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
}
fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat= GR_GL_BGRA;
fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA;
@@ -1374,7 +1365,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
// external format is GL_RGBA. See below for note about ES2.0 and glTex[Sub]Image.
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA;
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
-
+ fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGB;
if (this->ES2CompatibilitySupport()) {
@@ -1384,11 +1375,13 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
}
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB;
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_5_6_5;
+ fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA4;
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_4_4_4_4;
+ fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
if (this->textureRedSupport()) {
@@ -1401,11 +1394,13 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalFormat = GR_GL_ALPHA;
}
fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE;
+ fConfigTable[kAlpha_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA32F;
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalType = GR_GL_FLOAT;
+ fConfigTable[kRGBA_float_GrPixelConfig].fFormatType = kFloat_FormatType;
if (this->textureRedSupport()) {
fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RED;
@@ -1421,6 +1416,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
} else {
fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES;
}
+ fConfigTable[kAlpha_half_GrPixelConfig].fFormatType = kFloat_FormatType;
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA;
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA16F;
@@ -1430,6 +1426,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
} else {
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES;
}
+ fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType;
// No sized/unsized internal format distinction for compressed formats, no external format.
@@ -1437,6 +1434,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_PALETTE8_RGBA8;
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kIndex_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
switch(this->latcAlias()) {
case GrGLCaps::kLATC_LATCAlias:
@@ -1459,16 +1457,19 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
}
fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kLATC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kETC1_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_ETC1_RGB8;
fConfigTable[kETC1_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMPRESSED_ETC1_RGB8;
fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kETC1_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_R11_EAC;
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMPRESSED_R11_EAC;
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kR11_EAC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fBaseInternalFormat =
GR_GL_COMPRESSED_RGBA_ASTC_12x12;
@@ -1476,6 +1477,7 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) {
GR_GL_COMPRESSED_RGBA_ASTC_12x12;
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalFormat = 0;
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalType = 0;
+ fConfigTable[kASTC_12x12_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType;
// Bulk populate the texture internal/external formats here and then deal with exceptions below.
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | src/gpu/gl/GrGLGpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698