Chromium Code Reviews| Index: ui/gl/gl_surface_egl.cc |
| diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc |
| index 27bde64f6e28411f18fa7fbfc93abad010c33d04..694129de07e26d2bfc4563fe8c2193ee395cf34f 100644 |
| --- a/ui/gl/gl_surface_egl.cc |
| +++ b/ui/gl/gl_surface_egl.cc |
| @@ -249,7 +249,6 @@ bool ValidateEglConfig(EGLDisplay display, |
| return false; |
| } |
| if (*num_configs == 0) { |
| - LOG(ERROR) << "No suitable EGL configs found."; |
| return false; |
| } |
| return true; |
| @@ -264,11 +263,12 @@ EGLConfig ChooseConfig(GLSurface::Format format) { |
| // Choose an EGL configuration. |
| // On X this is only used for PBuffer surfaces. |
| - EGLint renderable_type = EGL_OPENGL_ES2_BIT; |
| + std::vector<EGLint> renderable_types; |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableUnsafeES3APIs)) { |
| - renderable_type = EGL_OPENGL_ES3_BIT; |
| + renderable_types.push_back(EGL_OPENGL_ES3_BIT); |
| } |
| + renderable_types.push_back(EGL_OPENGL_ES2_BIT); |
| EGLint buffer_size = 32; |
| EGLint alpha_size = 8; |
| @@ -291,99 +291,108 @@ EGLConfig ChooseConfig(GLSurface::Format format) { |
| ? EGL_DONT_CARE |
| : EGL_WINDOW_BIT | EGL_PBUFFER_BIT; |
| - EGLint config_attribs_8888[] = { |
| - EGL_BUFFER_SIZE, buffer_size, |
| - EGL_ALPHA_SIZE, alpha_size, |
| - EGL_BLUE_SIZE, 8, |
| - EGL_GREEN_SIZE, 8, |
| - EGL_RED_SIZE, 8, |
| - EGL_RENDERABLE_TYPE, renderable_type, |
| - EGL_SURFACE_TYPE, surface_type, |
| - EGL_NONE |
| - }; |
| - |
| - EGLint* choose_attributes = config_attribs_8888; |
| - EGLint config_attribs_565[] = { |
| - EGL_BUFFER_SIZE, 16, |
| - EGL_BLUE_SIZE, 5, |
| - EGL_GREEN_SIZE, 6, |
| - EGL_RED_SIZE, 5, |
| - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, |
| - EGL_SURFACE_TYPE, surface_type, |
| - EGL_NONE |
| - }; |
| - if (format == GLSurface::SURFACE_RGB565) { |
| - choose_attributes = config_attribs_565; |
| - } |
| + for (auto renderable_type : renderable_types) { |
| + EGLint config_attribs_8888[] = {EGL_BUFFER_SIZE, |
|
Geoff Lang
2016/09/07 14:56:14
This block produced a pretty bad diff, no changes
|
| + buffer_size, |
| + EGL_ALPHA_SIZE, |
| + alpha_size, |
| + EGL_BLUE_SIZE, |
| + 8, |
| + EGL_GREEN_SIZE, |
| + 8, |
| + EGL_RED_SIZE, |
| + 8, |
| + EGL_RENDERABLE_TYPE, |
| + renderable_type, |
| + EGL_SURFACE_TYPE, |
| + surface_type, |
| + EGL_NONE}; |
| + |
| + EGLint config_attribs_565[] = {EGL_BUFFER_SIZE, |
| + 16, |
| + EGL_BLUE_SIZE, |
| + 5, |
| + EGL_GREEN_SIZE, |
| + 6, |
| + EGL_RED_SIZE, |
| + 5, |
| + EGL_RENDERABLE_TYPE, |
| + renderable_type, |
| + EGL_SURFACE_TYPE, |
| + surface_type, |
| + EGL_NONE}; |
| + |
| + EGLint* choose_attributes = config_attribs_8888; |
| + if (format == GLSurface::SURFACE_RGB565) { |
| + choose_attributes = config_attribs_565; |
| + } |
| - EGLint num_configs; |
| - EGLint config_size = 1; |
| - EGLConfig config = nullptr; |
| - EGLConfig* config_data = &config; |
| - // Validate if there are any configs for given attribs. |
| - if (!ValidateEglConfig(g_display, choose_attributes, &num_configs)) { |
| - return config; |
| - } |
| + EGLint num_configs; |
| + EGLint config_size = 1; |
| + EGLConfig config = nullptr; |
| + EGLConfig* config_data = &config; |
| + // Validate if there are any configs for given attribs. |
| + if (!ValidateEglConfig(g_display, choose_attributes, &num_configs)) { |
| + // Try the next renderable_type |
| + continue; |
| + } |
| - std::unique_ptr<EGLConfig[]> matching_configs(new EGLConfig[num_configs]); |
| - if (format == GLSurface::SURFACE_RGB565) { |
| - config_size = num_configs; |
| - config_data = matching_configs.get(); |
| - } |
| + std::unique_ptr<EGLConfig[]> matching_configs(new EGLConfig[num_configs]); |
| + if (format == GLSurface::SURFACE_RGB565) { |
| + config_size = num_configs; |
| + config_data = matching_configs.get(); |
| + } |
| - if (!eglChooseConfig(g_display, choose_attributes, config_data, config_size, |
| - &num_configs)) { |
| - LOG(ERROR) << "eglChooseConfig failed with error " |
| - << GetLastEGLErrorString(); |
| - return config; |
| - } |
| + if (!eglChooseConfig(g_display, choose_attributes, config_data, config_size, |
| + &num_configs)) { |
| + LOG(ERROR) << "eglChooseConfig failed with error " |
| + << GetLastEGLErrorString(); |
| + return config; |
| + } |
| - if (format == GLSurface::SURFACE_RGB565) { |
| - // Because of the EGL config sort order, we have to iterate |
| - // through all of them (it'll put higher sum(R,G,B) bits |
| - // first with the above attribs). |
| - bool match_found = false; |
| - for (int i = 0; i < num_configs; i++) { |
| - EGLint red, green, blue, alpha; |
| - // Read the relevant attributes of the EGLConfig. |
| - if (eglGetConfigAttrib(g_display, matching_configs[i], |
| - EGL_RED_SIZE, &red) && |
| - eglGetConfigAttrib(g_display, matching_configs[i], |
| - EGL_BLUE_SIZE, &blue) && |
| - eglGetConfigAttrib(g_display, matching_configs[i], |
| - EGL_GREEN_SIZE, &green) && |
| - eglGetConfigAttrib(g_display, matching_configs[i], |
| - EGL_ALPHA_SIZE, &alpha) && |
| - alpha == 0 && |
| - red == 5 && |
| - green == 6 && |
| - blue == 5) { |
| - config = matching_configs[i]; |
| - match_found = true; |
| - break; |
| + if (format == GLSurface::SURFACE_RGB565) { |
| + // Because of the EGL config sort order, we have to iterate |
| + // through all of them (it'll put higher sum(R,G,B) bits |
| + // first with the above attribs). |
| + bool match_found = false; |
| + for (int i = 0; i < num_configs; i++) { |
| + EGLint red, green, blue, alpha; |
| + // Read the relevant attributes of the EGLConfig. |
| + if (eglGetConfigAttrib(g_display, matching_configs[i], EGL_RED_SIZE, |
| + &red) && |
| + eglGetConfigAttrib(g_display, matching_configs[i], EGL_BLUE_SIZE, |
| + &blue) && |
| + eglGetConfigAttrib(g_display, matching_configs[i], EGL_GREEN_SIZE, |
| + &green) && |
| + eglGetConfigAttrib(g_display, matching_configs[i], EGL_ALPHA_SIZE, |
| + &alpha) && |
| + alpha == 0 && red == 5 && green == 6 && blue == 5) { |
| + config = matching_configs[i]; |
| + match_found = true; |
| + break; |
| + } |
| } |
| - } |
| - if (!match_found) { |
| - // To fall back to default 32 bit format, choose with |
| - // the right attributes again. |
| - if (!ValidateEglConfig(g_display, |
| - config_attribs_8888, |
| + if (!match_found) { |
| + // To fall back to default 32 bit format, choose with |
| + // the right attributes again. |
| + if (!ValidateEglConfig(g_display, config_attribs_8888, &num_configs)) { |
| + // Try the next renderable_type |
| + continue; |
| + } |
| + if (!eglChooseConfig(g_display, config_attribs_8888, &config, 1, |
| &num_configs)) { |
| - return config; |
| - } |
| - if (!eglChooseConfig(g_display, |
| - config_attribs_8888, |
| - &config, |
| - 1, |
| - &num_configs)) { |
| - LOG(ERROR) << "eglChooseConfig failed with error " |
| - << GetLastEGLErrorString(); |
| - return config; |
| + LOG(ERROR) << "eglChooseConfig failed with error " |
| + << GetLastEGLErrorString(); |
| + return config; |
| + } |
| } |
| } |
| + config_map[format] = config; |
| + return config; |
| } |
| - config_map[format] = config; |
| - return config; |
| + |
| + LOG(ERROR) << "No suitable EGL configs found."; |
| + return nullptr; |
| } |
| } // namespace |