Sort config IDs by smaller color component depth.
This helps select configs without alpha component.
Also fixed handling of EGL_DONT_CARE and EGL_BUFFER_SIZE.
Bug 21538709
Change-Id: I432a71e5df2a0da19a0c38195edf6c42c2d8b9aa
Reviewed-on: https://swiftshader-review.googlesource.com/3370
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libEGL/Config.cpp b/src/OpenGL/libEGL/Config.cpp
index ecafb74..f35a207 100644
--- a/src/OpenGL/libEGL/Config.cpp
+++ b/src/OpenGL/libEGL/Config.cpp
@@ -34,48 +34,44 @@
switch (renderTargetFormat)
{
- case sw::FORMAT_A1R5G5B5:
- mBufferSize = 16;
+ case sw::FORMAT_A1R5G5B5:
mRedSize = 5;
mGreenSize = 5;
mBlueSize = 5;
mAlphaSize = 1;
break;
- case sw::FORMAT_A2R10G10B10:
- mBufferSize = 32;
+ case sw::FORMAT_A2R10G10B10:
mRedSize = 10;
mGreenSize = 10;
mBlueSize = 10;
mAlphaSize = 2;
break;
- case sw::FORMAT_A8R8G8B8:
- mBufferSize = 32;
+ case sw::FORMAT_A8R8G8B8:
mRedSize = 8;
mGreenSize = 8;
mBlueSize = 8;
mAlphaSize = 8;
mBindToTextureRGBA = EGL_TRUE;
break;
- case sw::FORMAT_R5G6B5:
- mBufferSize = 16;
+ case sw::FORMAT_R5G6B5:
mRedSize = 5;
mGreenSize = 6;
mBlueSize = 5;
mAlphaSize = 0;
break;
- case sw::FORMAT_X8R8G8B8:
- mBufferSize = 32;
+ case sw::FORMAT_X8R8G8B8:
mRedSize = 8;
mGreenSize = 8;
mBlueSize = 8;
mAlphaSize = 0;
mBindToTextureRGB = EGL_TRUE;
break;
- default:
+ default:
UNREACHABLE(); // Other formats should not be valid
}
mLuminanceSize = 0;
+ mBufferSize = mRedSize + mGreenSize + mBlueSize + mLuminanceSize + mAlphaSize;
mAlphaMaskSize = 0;
mColorBufferType = EGL_RGB_BUFFER;
mConfigCaveat = isSlowConfig() ? EGL_SLOW_CONFIG : EGL_NONE;
@@ -124,7 +120,7 @@
// mDepthSize = 24;
// mStencilSize = 8;
// break;
- default:
+ default:
UNREACHABLE();
}
@@ -167,22 +163,16 @@
return x.attribute < y.attribute; \
}
- #define SORT_LARGER(attribute) \
- if(x.attribute != y.attribute) \
- { \
- return x.attribute > y.attribute; \
- }
-
META_ASSERT(EGL_NONE < EGL_SLOW_CONFIG && EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG);
SORT_SMALLER(mConfigCaveat);
META_ASSERT(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER);
SORT_SMALLER(mColorBufferType);
- SORT_LARGER(mRedSize);
- SORT_LARGER(mGreenSize);
- SORT_LARGER(mBlueSize);
- SORT_LARGER(mAlphaSize);
+ SORT_SMALLER(mRedSize);
+ SORT_SMALLER(mGreenSize);
+ SORT_SMALLER(mBlueSize);
+ SORT_SMALLER(mAlphaSize);
SORT_SMALLER(mBufferSize);
SORT_SMALLER(mSampleBuffers);
@@ -193,7 +183,6 @@
SORT_SMALLER(mNativeVisualType);
#undef SORT_SMALLER
- #undef SORT_LARGER
// Strict ordering requires sorting all non-equal fields above
assert(memcmp(&x, &y, sizeof(Config)) == 0);
@@ -201,22 +190,22 @@
return false;
}
-// Function object used by STL sorting routines for ordering Configs according to [EGL] section 3.4.1 page 24.
-class SortConfig
-{
-public:
- explicit SortConfig(const EGLint *attribList);
-
- bool operator()(const Config *x, const Config *y) const;
-
-private:
- EGLint wantedComponentsSize(const Config *config) const;
-
- bool mWantRed;
- bool mWantGreen;
- bool mWantBlue;
- bool mWantAlpha;
- bool mWantLuminance;
+// Function object used by STL sorting routines for ordering Configs according to [EGL] section 3.4.1 page 24.
+class SortConfig
+{
+public:
+ explicit SortConfig(const EGLint *attribList);
+
+ bool operator()(const Config *x, const Config *y) const;
+
+private:
+ EGLint wantedComponentsSize(const Config *config) const;
+
+ bool mWantRed;
+ bool mWantGreen;
+ bool mWantBlue;
+ bool mWantAlpha;
+ bool mWantLuminance;
};
SortConfig::SortConfig(const EGLint *attribList)
@@ -318,6 +307,11 @@
while(attribute[0] != EGL_NONE)
{
+ if(attribute[1] == EGL_DONT_CARE)
+ {
+ continue;
+ }
+
switch(attribute[0])
{
case EGL_BUFFER_SIZE: match = config->mBufferSize >= attribute[1]; break;