Index: ui/gl/gl_surface_egl.cc |
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc |
index af32f5297c742e24051dc8724839aae5cd872cd2..b6cf38f88b348d0709298d92cfbfe4bc2efe2a37 100644 |
--- a/ui/gl/gl_surface_egl.cc |
+++ b/ui/gl/gl_surface_egl.cc |
@@ -62,6 +62,12 @@ extern "C" { |
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE 0x320C |
#endif /* EGL_ANGLE_platform_angle_d3d */ |
+#ifndef EGL_ANGLE_platform_angle_opengl |
+#define EGL_ANGLE_platform_angle_opengl 1 |
+#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D |
+#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E |
+#endif /* EGL_ANGLE_platform_angle_opengl */ |
+ |
using ui::GetLastEGLErrorString; |
namespace gfx { |
@@ -140,19 +146,24 @@ void DeinitializeEgl() { |
EGLDisplay GetPlatformANGLEDisplay(EGLNativeDisplayType native_display, |
EGLenum platform_type, |
- EGLenum device_type) { |
- const EGLint display_attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, |
- platform_type, |
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, |
- device_type, |
- EGL_NONE}; |
+ bool warpDevice) { |
+ std::vector<EGLint> display_attribs; |
+ |
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); |
+ display_attribs.push_back(platform_type); |
+ |
+ if (warpDevice) { |
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); |
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); |
+ } |
+ |
+ display_attribs.push_back(EGL_NONE); |
+ |
return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, |
reinterpret_cast<void*>(native_display), |
- display_attribs); |
+ &display_attribs[0]); |
} |
-enum DisplayType { DEFAULT, SWIFT_SHADER, ANGLE_WARP, ANGLE_D3D9, ANGLE_D3D11 }; |
- |
EGLDisplay GetDisplayFromType(DisplayType display_type, |
EGLNativeDisplayType native_display) { |
switch (display_type) { |
@@ -161,16 +172,19 @@ EGLDisplay GetDisplayFromType(DisplayType display_type, |
return eglGetDisplay(native_display); |
case ANGLE_WARP: |
return GetPlatformANGLEDisplay(native_display, |
- EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, |
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); |
+ EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, true); |
case ANGLE_D3D9: |
- return GetPlatformANGLEDisplay( |
- native_display, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, |
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); |
+ return GetPlatformANGLEDisplay(native_display, |
+ EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, false); |
case ANGLE_D3D11: |
return GetPlatformANGLEDisplay( |
- native_display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, |
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); |
+ native_display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, false); |
+ case ANGLE_OPENGL: |
+ return GetPlatformANGLEDisplay( |
+ native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, false); |
+ case ANGLE_OPENGLES: |
+ return GetPlatformANGLEDisplay( |
+ native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, false); |
default: |
NOTREACHED(); |
return EGL_NO_DISPLAY; |
@@ -189,48 +203,72 @@ const char* DisplayTypeString(DisplayType display_type) { |
return "D3D9"; |
case ANGLE_D3D11: |
return "D3D11"; |
+ case ANGLE_OPENGL: |
+ return "OpenGL"; |
+ case ANGLE_OPENGLES: |
+ return "OpenGLES"; |
default: |
NOTREACHED(); |
return "Err"; |
} |
} |
-void GetInitDisplays(bool supports_angle_d3d, |
- std::vector<DisplayType>* init_displays) { |
- const base::CommandLine* command_line = |
- base::CommandLine::ForCurrentProcess(); |
- bool using_swift_shader = |
- command_line->GetSwitchValueASCII(switches::kUseGL) == "swiftshader"; |
+} // namespace |
+void GetEGLInitDisplays(bool supports_angle_d3d, |
+ bool supports_angle_opengl, |
+ const base::CommandLine* command_line, |
+ std::vector<DisplayType>* init_displays) { |
// SwiftShader does not use the platform extensions |
- if (using_swift_shader) { |
+ if (command_line->GetSwitchValueASCII(switches::kUseGL) == |
+ kGLImplementationSwiftShaderName) { |
init_displays->push_back(SWIFT_SHADER); |
return; |
} |
- // If we're missing the ANGLE extensions, fall back to default. |
- if (!supports_angle_d3d) { |
- init_displays->push_back(DEFAULT); |
- return; |
- } |
+ std::string requested_renderer = |
+ command_line->GetSwitchValueASCII(switches::kUseANGLE); |
- if (command_line->HasSwitch(switches::kUseWarp)) { |
- init_displays->push_back(ANGLE_WARP); |
- return; |
+ if (supports_angle_d3d) { |
+ bool use_angle_default = |
+ !command_line->HasSwitch(switches::kUseANGLE) || |
+ requested_renderer == kANGLEImplementationDefaultName; |
+ |
+ if (use_angle_default) { |
+ // Default mode for ANGLE - try D3D11, else try D3D9 |
+ if (!command_line->HasSwitch(switches::kDisableD3D11)) { |
+ init_displays->push_back(ANGLE_D3D11); |
+ } |
+ init_displays->push_back(ANGLE_D3D9); |
+ } else { |
+ if (requested_renderer == kANGLEImplementationD3D11Name) { |
+ init_displays->push_back(ANGLE_D3D11); |
+ } |
+ if (requested_renderer == kANGLEImplementationD3D9Name) { |
+ init_displays->push_back(ANGLE_D3D9); |
+ } |
+ if (requested_renderer == kANGLEImplementationWARPName) { |
+ init_displays->push_back(ANGLE_WARP); |
+ } |
+ } |
} |
- if (command_line->HasSwitch(switches::kDisableD3D11)) { |
- init_displays->push_back(ANGLE_D3D9); |
- return; |
+ if (supports_angle_opengl) { |
+ if (requested_renderer == kANGLEImplementationOpenGLName) { |
+ init_displays->push_back(ANGLE_OPENGL); |
+ } |
+ if (requested_renderer == kANGLEImplementationOpenGLESName) { |
+ init_displays->push_back(ANGLE_OPENGLES); |
+ } |
} |
- // Default mode for ANGLE - try D3D11, else try D3D9 |
- init_displays->push_back(ANGLE_D3D11); |
- init_displays->push_back(ANGLE_D3D9); |
+ // If no displays are available due to missing angle extensions or invalid |
+ // flags, request the default display. |
+ if (init_displays->empty()) { |
+ init_displays->push_back(DEFAULT); |
+ } |
} |
-} // namespace |
- |
GLSurfaceEGL::GLSurfaceEGL() { |
++g_num_surfaces; |
if (!g_initialized) { |
@@ -418,15 +456,19 @@ EGLDisplay GLSurfaceEGL::InitializeDisplay() { |
eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); |
bool supports_angle_d3d = false; |
+ bool supports_angle_opengl = false; |
// Check for availability of ANGLE extensions. |
- if (client_extensions) { |
+ if (client_extensions && |
+ ExtensionsContain(client_extensions, "EGL_ANGLE_platform_angle")) { |
supports_angle_d3d = |
- ExtensionsContain(client_extensions, "ANGLE_platform_angle") && |
- ExtensionsContain(client_extensions, "ANGLE_platform_angle_d3d"); |
+ ExtensionsContain(client_extensions, "EGL_ANGLE_platform_angle_d3d"); |
+ supports_angle_opengl = |
+ ExtensionsContain(client_extensions, "EGL_ANGLE_platform_angle_opengl"); |
} |
std::vector<DisplayType> init_displays; |
- GetInitDisplays(supports_angle_d3d, &init_displays); |
+ GetEGLInitDisplays(supports_angle_d3d, supports_angle_opengl, |
+ base::CommandLine::ForCurrentProcess(), &init_displays); |
for (size_t disp_index = 0; disp_index < init_displays.size(); ++disp_index) { |
DisplayType display_type = init_displays[disp_index]; |