From 2df8d41bb322115273dfa77665d9be64c277352b Mon Sep 17 00:00:00 2001 From: "boliu@chromium.org" Date: Sat, 15 Mar 2014 05:28:41 +0000 Subject: [PATCH] gpu: Add extension check when initializing MailboxSync And do not enable accelerated canvas in webview if extensions are missing. BUG=332146 Review URL: https://codereview.chromium.org/196653019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257295 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/aw_browser_main_parts.cc | 8 +++++++ android_webview/lib/main/aw_main_delegate.cc | 3 --- .../service/mailbox_synchronizer.cc | 24 +++++++++++++++++++ .../service/texture_definition.cc | 9 ++++--- ui/gl/generate_bindings.py | 3 ++- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc index c018d1e8927e03..653f8c5f90816c 100644 --- a/android_webview/browser/aw_browser_main_parts.cc +++ b/android_webview/browser/aw_browser_main_parts.cc @@ -8,12 +8,15 @@ #include "android_webview/browser/aw_result_codes.h" #include "base/android/build_info.h" #include "base/android/memory_pressure_listener_android.h" +#include "base/command_line.h" #include "base/files/file_path.h" #include "base/path_service.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_client.h" +#include "content/public/common/content_switches.h" #include "content/public/common/result_codes.h" #include "content/public/common/url_utils.h" +#include "gpu/command_buffer/service/mailbox_synchronizer.h" #include "net/android/network_change_notifier_factory_android.h" #include "net/base/network_change_notifier.h" #include "ui/base/l10n/l10n_util_android.h" @@ -59,6 +62,11 @@ int AwBrowserMainParts::PreCreateThreads() { } void AwBrowserMainParts::PreMainMessageLoopRun() { + if (!gpu::gles2::MailboxSynchronizer::Initialize()) { + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableAccelerated2dCanvas); + } + browser_context_->PreMainMessageLoopRun(); // This is needed for WebView Classic backwards compatibility // See crbug.com/298495 diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index 34097b0e7e96a0..c11f7a032cf5c2 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc @@ -25,7 +25,6 @@ #include "content/public/common/content_switches.h" #include "gpu/command_buffer/client/gl_in_process_context.h" #include "gpu/command_buffer/service/in_process_command_buffer.h" -#include "gpu/command_buffer/service/mailbox_synchronizer.h" #include "media/base/media_switches.h" #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" @@ -67,8 +66,6 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) { cl->AppendSwitch(switches::kDisableExperimentalWebGL); cl->AppendSwitch(switches::kDisableSharedWorkers); - if (!gpu::gles2::MailboxSynchronizer::Initialize()) - cl->AppendSwitch(switches::kDisableAccelerated2dCanvas); // File system API not supported (requires some new API; internal bug 6930981) cl->AppendSwitch(switches::kDisableFileSystem); diff --git a/gpu/command_buffer/service/mailbox_synchronizer.cc b/gpu/command_buffer/service/mailbox_synchronizer.cc index 09a3f1dcc9e189..0503fb12bdaba7 100644 --- a/gpu/command_buffer/service/mailbox_synchronizer.cc +++ b/gpu/command_buffer/service/mailbox_synchronizer.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/texture_manager.h" +#include "ui/gl/gl_implementation.h" namespace gpu { namespace gles2 { @@ -20,6 +21,29 @@ MailboxSynchronizer* g_instance = NULL; // static bool MailboxSynchronizer::Initialize() { DCHECK(!g_instance); + DCHECK(gfx::GetGLImplementation() != gfx::kGLImplementationNone) + << "GL bindings not initialized"; + switch (gfx::GetGLImplementation()) { + case gfx::kGLImplementationMockGL: + break; + case gfx::kGLImplementationEGLGLES2: +#if !defined(OS_MACOSX) + { + if (!gfx::g_driver_egl.ext.b_EGL_KHR_image_base || + !gfx::g_driver_egl.ext.b_EGL_KHR_gl_texture_2D_image || + !gfx::g_driver_gl.ext.b_GL_OES_EGL_image || + !gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) { + LOG(WARNING) << "MailboxSync not supported due to missing EGL " + "image/fence support"; + return false; + } + } + break; +#endif + default: + NOTREACHED(); + return false; + } g_instance = new MailboxSynchronizer; return true; } diff --git a/gpu/command_buffer/service/texture_definition.cc b/gpu/command_buffer/service/texture_definition.cc index 686ece7f21ca9f..462131fdc12e4d 100644 --- a/gpu/command_buffer/service/texture_definition.cc +++ b/gpu/command_buffer/service/texture_definition.cc @@ -120,11 +120,10 @@ scoped_refptr NativeImageBufferEGL::Create( DCHECK_NE(EGL_NO_DISPLAY, egl_display); DCHECK(glIsTexture(texture_id)); - // TODO: Need to generate and check EGL_KHR_gl_texture_2D_image - if (!gfx::g_driver_egl.ext.b_EGL_KHR_image_base || - !gfx::g_driver_gl.ext.b_GL_OES_EGL_image) { - return NULL; - } + DCHECK(gfx::g_driver_egl.ext.b_EGL_KHR_image_base && + gfx::g_driver_egl.ext.b_EGL_KHR_gl_texture_2D_image && + gfx::g_driver_gl.ext.b_GL_OES_EGL_image && + gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync); const EGLint egl_attrib_list[] = { EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py index 8b41bf26b12e90..6bf14dd4898659 100755 --- a/ui/gl/generate_bindings.py +++ b/ui/gl/generate_bindings.py @@ -906,7 +906,8 @@ 'EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value', }, { 'return_type': 'EGLImageKHR', 'versions': [{ 'name': 'eglCreateImageKHR', - 'extensions': ['EGL_KHR_image_base'] }], + 'extensions': + ['EGL_KHR_image_base', 'EGL_KHR_gl_texture_2D_image'] }], 'arguments': 'EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, ' 'const EGLint* attrib_list' },