OSDN Git Service

Fix infinite loop when using EGL_DONT_CARE.
authorNicolas Capens <capn@google.com>
Thu, 4 Jun 2015 12:59:09 +0000 (08:59 -0400)
committerNicolas Capens <capn@google.com>
Thu, 4 Jun 2015 17:41:36 +0000 (17:41 +0000)
Change-Id: I27471691cc0d0d475c089483c560ca5e00f5d64a
Reviewed-on: https://swiftshader-review.googlesource.com/3380
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libEGL/Config.cpp

index f35a207..81eb1c1 100644 (file)
@@ -307,58 +307,56 @@ bool ConfigSet::getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint
 
         while(attribute[0] != EGL_NONE)
         {
-                       if(attribute[1] == EGL_DONT_CARE)
+                       if(attribute[1] != EGL_DONT_CARE)
                        {
-                               continue;
+                               switch(attribute[0])
+                               {
+                               case EGL_BUFFER_SIZE:                match = config->mBufferSize >= attribute[1];                      break;
+                               case EGL_ALPHA_SIZE:                 match = config->mAlphaSize >= attribute[1];                       break;
+                               case EGL_BLUE_SIZE:                  match = config->mBlueSize >= attribute[1];                        break;
+                               case EGL_GREEN_SIZE:                 match = config->mGreenSize >= attribute[1];                       break;
+                               case EGL_RED_SIZE:                   match = config->mRedSize >= attribute[1];                         break;
+                               case EGL_DEPTH_SIZE:                 match = config->mDepthSize >= attribute[1];                       break;
+                               case EGL_STENCIL_SIZE:               match = config->mStencilSize >= attribute[1];                     break;
+                               case EGL_CONFIG_CAVEAT:              match = config->mConfigCaveat == attribute[1];                    break;
+                               case EGL_CONFIG_ID:                  match = config->mConfigID == attribute[1];                        break;
+                               case EGL_LEVEL:                      match = config->mLevel >= attribute[1];                           break;
+                               case EGL_NATIVE_RENDERABLE:          match = config->mNativeRenderable == attribute[1];                break;
+                               case EGL_NATIVE_VISUAL_ID:           match = config->mNativeVisualID == attribute[1];                  break;
+                               case EGL_NATIVE_VISUAL_TYPE:         match = config->mNativeVisualType == attribute[1];                break;
+                               case EGL_SAMPLES:                    match = config->mSamples >= attribute[1];                         break;
+                               case EGL_SAMPLE_BUFFERS:             match = config->mSampleBuffers >= attribute[1];                   break;
+                               case EGL_SURFACE_TYPE:               match = (config->mSurfaceType & attribute[1]) == attribute[1];    break;
+                               case EGL_TRANSPARENT_TYPE:           match = config->mTransparentType == attribute[1];                 break;
+                               case EGL_TRANSPARENT_BLUE_VALUE:     match = config->mTransparentBlueValue == attribute[1];            break;
+                               case EGL_TRANSPARENT_GREEN_VALUE:    match = config->mTransparentGreenValue == attribute[1];           break;
+                               case EGL_TRANSPARENT_RED_VALUE:      match = config->mTransparentRedValue == attribute[1];             break;
+                               case EGL_BIND_TO_TEXTURE_RGB:        match = config->mBindToTextureRGB == attribute[1];                break;
+                               case EGL_BIND_TO_TEXTURE_RGBA:       match = config->mBindToTextureRGBA == attribute[1];               break;
+                               case EGL_MIN_SWAP_INTERVAL:          match = config->mMinSwapInterval == attribute[1];                 break;
+                               case EGL_MAX_SWAP_INTERVAL:          match = config->mMaxSwapInterval == attribute[1];                 break;
+                               case EGL_LUMINANCE_SIZE:             match = config->mLuminanceSize >= attribute[1];                   break;
+                               case EGL_ALPHA_MASK_SIZE:            match = config->mAlphaMaskSize >= attribute[1];                   break;
+                               case EGL_COLOR_BUFFER_TYPE:          match = config->mColorBufferType == attribute[1];                 break;
+                               case EGL_RENDERABLE_TYPE:            match = (config->mRenderableType & attribute[1]) == attribute[1]; break;
+                               case EGL_MATCH_NATIVE_PIXMAP:        match = false; UNIMPLEMENTED();                                   break;
+                               case EGL_CONFORMANT:                 match = (config->mConformant & attribute[1]) == attribute[1];     break;
+                               case EGL_MAX_PBUFFER_WIDTH:          match = config->mMaxPBufferWidth >= attribute[1];                 break;
+                               case EGL_MAX_PBUFFER_HEIGHT:         match = config->mMaxPBufferHeight >= attribute[1];                break;
+                               case EGL_MAX_PBUFFER_PIXELS:         match = config->mMaxPBufferPixels >= attribute[1];                break;
+                               case EGL_RECORDABLE_ANDROID:         match = true; /* UNIMPLEMENTED(); EGL_ANDROID_recordable */       break;
+                               case EGL_FRAMEBUFFER_TARGET_ANDROID: match = true; /* UNIMPLEMENTED(); EGL_ANDROID_framebuffer_target */ break;
+                               default:
+                                       UNIMPLEMENTED();
+                                       match = false;
+                               }
+
+                               if(!match)
+                               {
+                                       break;
+                               }
                        }
 
-            switch(attribute[0])
-            {
-            case EGL_BUFFER_SIZE:                match = config->mBufferSize >= attribute[1];                      break;
-            case EGL_ALPHA_SIZE:                 match = config->mAlphaSize >= attribute[1];                       break;
-            case EGL_BLUE_SIZE:                  match = config->mBlueSize >= attribute[1];                        break;
-            case EGL_GREEN_SIZE:                 match = config->mGreenSize >= attribute[1];                       break;
-            case EGL_RED_SIZE:                   match = config->mRedSize >= attribute[1];                         break;
-            case EGL_DEPTH_SIZE:                 match = config->mDepthSize >= attribute[1];                       break;
-            case EGL_STENCIL_SIZE:               match = config->mStencilSize >= attribute[1];                     break;
-            case EGL_CONFIG_CAVEAT:              match = config->mConfigCaveat == attribute[1];                    break;
-            case EGL_CONFIG_ID:                  match = config->mConfigID == attribute[1];                        break;
-            case EGL_LEVEL:                      match = config->mLevel >= attribute[1];                           break;
-            case EGL_NATIVE_RENDERABLE:          match = config->mNativeRenderable == attribute[1];                break;
-            case EGL_NATIVE_VISUAL_ID:           match = config->mNativeVisualID == attribute[1];                  break;
-            case EGL_NATIVE_VISUAL_TYPE:         match = config->mNativeVisualType == attribute[1];                break;
-            case EGL_SAMPLES:                    match = config->mSamples >= attribute[1];                         break;
-            case EGL_SAMPLE_BUFFERS:             match = config->mSampleBuffers >= attribute[1];                   break;
-            case EGL_SURFACE_TYPE:               match = (config->mSurfaceType & attribute[1]) == attribute[1];    break;
-            case EGL_TRANSPARENT_TYPE:           match = config->mTransparentType == attribute[1];                 break;
-            case EGL_TRANSPARENT_BLUE_VALUE:     match = config->mTransparentBlueValue == attribute[1];            break;
-            case EGL_TRANSPARENT_GREEN_VALUE:    match = config->mTransparentGreenValue == attribute[1];           break;
-            case EGL_TRANSPARENT_RED_VALUE:      match = config->mTransparentRedValue == attribute[1];             break;
-            case EGL_BIND_TO_TEXTURE_RGB:        match = config->mBindToTextureRGB == attribute[1];                break;
-            case EGL_BIND_TO_TEXTURE_RGBA:       match = config->mBindToTextureRGBA == attribute[1];               break;
-            case EGL_MIN_SWAP_INTERVAL:          match = config->mMinSwapInterval == attribute[1];                 break;
-            case EGL_MAX_SWAP_INTERVAL:          match = config->mMaxSwapInterval == attribute[1];                 break;
-            case EGL_LUMINANCE_SIZE:             match = config->mLuminanceSize >= attribute[1];                   break;
-            case EGL_ALPHA_MASK_SIZE:            match = config->mAlphaMaskSize >= attribute[1];                   break;
-            case EGL_COLOR_BUFFER_TYPE:          match = config->mColorBufferType == attribute[1];                 break;
-            case EGL_RENDERABLE_TYPE:            match = (config->mRenderableType & attribute[1]) == attribute[1]; break;
-            case EGL_MATCH_NATIVE_PIXMAP:        match = false; UNIMPLEMENTED();                                   break;
-            case EGL_CONFORMANT:                 match = (config->mConformant & attribute[1]) == attribute[1];     break;
-            case EGL_MAX_PBUFFER_WIDTH:          match = config->mMaxPBufferWidth >= attribute[1];                 break;
-            case EGL_MAX_PBUFFER_HEIGHT:         match = config->mMaxPBufferHeight >= attribute[1];                break;
-            case EGL_MAX_PBUFFER_PIXELS:         match = config->mMaxPBufferPixels >= attribute[1];                break;
-            case EGL_RECORDABLE_ANDROID:         match = true; /* UNIMPLEMENTED(); EGL_ANDROID_recordable */       break;
-            case EGL_FRAMEBUFFER_TARGET_ANDROID: match = true; /* UNIMPLEMENTED(); EGL_ANDROID_framebuffer_target */ break;
-                       default:
-                               UNIMPLEMENTED();
-                               match = false;
-            }
-
-            if(!match)
-            {
-                break;
-            }
-
             attribute += 2;
         }