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;