Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Unified Diff: ui/gl/gl_surface_egl.cc

Issue 1051253008: gpu: Upgrade to new ANGLE Platform Display init. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix double "command_line" Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gl/gl_surface_egl.cc
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 61c3c055bd0a573a3d541fd34c6ec054d7bf1507..86aeb7c68537509d677ff31c66379bf9e3f50752 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -169,7 +169,33 @@ bool GLSurfaceEGL::InitializeOneOff() {
return false;
}
- if (!eglInitialize(g_display, NULL, NULL)) {
+ const base::CommandLine* command_line =
+ base::CommandLine::ForCurrentProcess();
+
+ bool egl_init_success =
+ (eglInitialize(g_display, nullptr, nullptr) == EGL_TRUE);
+#if defined(OS_WIN)
+ // Try D3D9 if D3D11 init failed for ANGLE
+ if (!egl_init_success && !command_line->HasSwitch(switches::kDisableD3D11) &&
+ !command_line->HasSwitch(switches::kUseWarp) &&
+ command_line->GetSwitchValueASCII(switches::kUseGL) != "swiftshader") {
+ LOG(ERROR) << "eglInitialize (D3D11) failed with error "
+ << GetLastEGLErrorString() << ", trying D3D9";
+
+ g_display = GetPlatformANGLEDisplay(
+ g_native_display_type, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE);
+
+ if (!g_display) {
+ LOG(ERROR) << "eglGetDisplay (D3D9) failed with error "
+ << GetLastEGLErrorString();
+ return false;
+ }
+
+ egl_init_success = (eglInitialize(g_display, nullptr, nullptr) == EGL_TRUE);
+ }
+#endif
+ if (!egl_init_success) {
LOG(ERROR) << "eglInitialize failed with error " << GetLastEGLErrorString();
return false;
}
@@ -177,8 +203,7 @@ bool GLSurfaceEGL::InitializeOneOff() {
// Choose an EGL configuration.
// On X this is only used for PBuffer surfaces.
EGLint renderable_type = EGL_OPENGL_ES2_BIT;
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableUnsafeES3APIs)) {
+ if (command_line->HasSwitch(switches::kEnableUnsafeES3APIs)) {
renderable_type = EGL_OPENGL_ES3_BIT;
}
const EGLint kConfigAttribs[] = {
@@ -329,40 +354,67 @@ GLSurfaceEGL::~GLSurfaceEGL() {
}
#if defined(OS_WIN)
-static const EGLint kDisplayAttribsWarp[] {
- EGL_PLATFORM_ANGLE_TYPE_ANGLE,
- EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
-
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE,
-
- EGL_NONE
-};
// static
EGLDisplay GLSurfaceEGL::GetPlatformDisplay(
EGLNativeDisplayType native_display) {
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseWarp)) {
- // Check for availability of WARP via ANGLE extension.
- bool supports_warp = false;
- const char* no_display_extensions = eglQueryString(EGL_NO_DISPLAY,
- EGL_EXTENSIONS);
- // If EGL_EXT_client_extensions not supported this call to eglQueryString
- // will return NULL.
- if (no_display_extensions)
- supports_warp =
- ExtensionsContain(no_display_extensions, "ANGLE_platform_angle") &&
- ExtensionsContain(no_display_extensions, "ANGLE_platform_angle_d3d");
-
- if (!supports_warp)
- return NULL;
+ const base::CommandLine* command_line =
+ base::CommandLine::ForCurrentProcess();
+ bool using_swift_shader =
+ command_line->GetSwitchValueASCII(switches::kUseGL) == "swiftshader";
- return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, native_display,
- kDisplayAttribsWarp);
+ // SwiftShader does not use the platform extensions
+ if (using_swift_shader) {
+ return eglGetDisplay(native_display);
}
- return eglGetDisplay(native_display);
+ // If EGL_EXT_client_extensions not supported this call to eglQueryString
+ // will return NULL.
+ const char* client_extensions =
+ eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ bool supports_angle_d3d = false;
+ // Check for availability of ANGLE extensions.
+ if (client_extensions)
piman 2015/04/16 21:51:05 nit: need braces per style guide
zmo 2015/04/16 21:52:34 nit: use {} if the block is more than one line.
Jamie Madill 2015/04/17 19:14:13 Done.
+ supports_angle_d3d =
+ ExtensionsContain(client_extensions, "ANGLE_platform_angle") &&
+ ExtensionsContain(client_extensions, "ANGLE_platform_angle_d3d");
+
+ // If we aren't using SwiftShader, we're using ANGLE on EGL.
+ if (!supports_angle_d3d)
+ return nullptr;
+
+ if (command_line->HasSwitch(switches::kUseWarp)) {
+ return GetPlatformANGLEDisplay(native_display,
+ EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE);
+ }
+
+ if (command_line->HasSwitch(switches::kDisableD3D11)) {
+ 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_D3D11_ANGLE,
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE);
}
+
+// static
+EGLDisplay GLSurfaceEGL::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};
+ return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, native_display,
+ display_attribs);
+}
+
#endif
NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window)
« ui/gl/gl_surface_egl.h ('K') | « ui/gl/gl_surface_egl.h ('k') | ui/gl/gl_surface_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698