diff options
author | boliu <boliu@chromium.org> | 2015-01-29 17:00:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-30 01:01:47 +0000 |
commit | a4baed454be2bb165cb12eb7df432e9138e746e6 (patch) | |
tree | a076435c5f63acf58b0d9811c291c8becfed829c /gpu | |
parent | d5f777b7342dfcfb64b8bdd635ec3599303be08a (diff) | |
download | chromium_src-a4baed454be2bb165cb12eb7df432e9138e746e6.zip chromium_src-a4baed454be2bb165cb12eb7df432e9138e746e6.tar.gz chromium_src-a4baed454be2bb165cb12eb7df432e9138e746e6.tar.bz2 |
Move AW renderer compositor context to gpu thread
Use TexSubImage2D instead of TexImage2D to avoid orphaning
EGLImage
Create the renderer compositor context on the gpu thread.
BUG=448168, 259924
Review URL: https://codereview.chromium.org/769703005
Cr-Commit-Position: refs/heads/master@{#313846}
Diffstat (limited to 'gpu')
6 files changed, 27 insertions, 18 deletions
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc index 2389dc1..9b6b7e2 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc @@ -77,13 +77,16 @@ bool AllowTransferThreadForGpu() { AsyncPixelTransferManager* AsyncPixelTransferManager::Create( gfx::GLContext* context) { DCHECK(context->IsCurrent(NULL)); + base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); + // Threaded mailbox uses EGLImage which conflicts with EGL uploader. // The spec only allows one EGL image per sibling group, but currently the // image handle cannot be shared between the threaded mailbox code and // AsyncPixelTransferManagerEGL. bool uses_threaded_mailboxes = - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableThreadedTextureMailboxes); + cl->HasSwitch(switches::kEnableThreadedTextureMailboxes); + // TexImage2D orphans the EGLImage used for threaded mailbox sharing. + bool use_teximage2d_over_texsubimage2d = !uses_threaded_mailboxes; switch (gfx::GetGLImplementation()) { case gfx::kGLImplementationEGLGLES2: DCHECK(context); @@ -93,15 +96,16 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create( context->HasExtension("EGL_KHR_image_base") && context->HasExtension("EGL_KHR_gl_texture_2D_image") && context->HasExtension("GL_OES_EGL_image") && - !uses_threaded_mailboxes && - AllowTransferThreadForGpu()) { + !uses_threaded_mailboxes && AllowTransferThreadForGpu()) { TRACE_EVENT0("gpu", "AsyncPixelTransferManager_CreateWithThread"); return new AsyncPixelTransferManagerEGL; } - return new AsyncPixelTransferManagerIdle; + return new AsyncPixelTransferManagerIdle( + use_teximage2d_over_texsubimage2d); case gfx::kGLImplementationOSMesaGL: { TRACE_EVENT0("gpu", "AsyncPixelTransferManager_CreateIdle"); - return new AsyncPixelTransferManagerIdle; + return new AsyncPixelTransferManagerIdle( + use_teximage2d_over_texsubimage2d); } case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc index 2ed4f7d..b44b477404 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc @@ -183,9 +183,8 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D( base::TimeTicks begin_time(base::TimeTicks::Now()); gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); - // If it's a full texture update, use glTexImage2D as it's faster. - // TODO(epenner): Make this configurable (http://crbug.com/259924) - if (tex_params.xoffset == 0 && + if (shared_state_->use_teximage2d_over_texsubimage2d && + tex_params.xoffset == 0 && tex_params.yoffset == 0 && tex_params.target == define_params_.target && tex_params.level == define_params_.level && @@ -234,8 +233,11 @@ AsyncPixelTransferManagerIdle::Task::Task( AsyncPixelTransferManagerIdle::Task::~Task() {} -AsyncPixelTransferManagerIdle::SharedState::SharedState() - : texture_upload_count(0) {} +AsyncPixelTransferManagerIdle::SharedState::SharedState( + bool use_teximage2d_over_texsubimage2d) + : use_teximage2d_over_texsubimage2d(use_teximage2d_over_texsubimage2d), + texture_upload_count(0) { +} AsyncPixelTransferManagerIdle::SharedState::~SharedState() {} @@ -250,8 +252,9 @@ void AsyncPixelTransferManagerIdle::SharedState::ProcessNotificationTasks() { } } -AsyncPixelTransferManagerIdle::AsyncPixelTransferManagerIdle() - : shared_state_() { +AsyncPixelTransferManagerIdle::AsyncPixelTransferManagerIdle( + bool use_teximage2d_over_texsubimage2d) + : shared_state_(use_teximage2d_over_texsubimage2d) { } AsyncPixelTransferManagerIdle::~AsyncPixelTransferManagerIdle() {} diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h index 8aba7ff..41a77b3 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h @@ -13,7 +13,8 @@ namespace gpu { class AsyncPixelTransferManagerIdle : public AsyncPixelTransferManager { public: - AsyncPixelTransferManagerIdle(); + explicit AsyncPixelTransferManagerIdle( + bool use_teximage2d_over_texsubimage2d); ~AsyncPixelTransferManagerIdle() override; // AsyncPixelTransferManager implementation: @@ -43,10 +44,11 @@ class AsyncPixelTransferManagerIdle : public AsyncPixelTransferManager { // State shared between Managers and Delegates. struct SharedState { - SharedState(); + explicit SharedState(bool use_teximage2d_over_texsubimage2d); ~SharedState(); void ProcessNotificationTasks(); + const bool use_teximage2d_over_texsubimage2d; int texture_upload_count; base::TimeDelta total_texture_upload_time; std::list<Task> tasks; diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc index e756a46..b0cc463 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc @@ -28,7 +28,7 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create( case gfx::kGLImplementationOSMesaGL: case gfx::kGLImplementationDesktopGL: case gfx::kGLImplementationEGLGLES2: - return new AsyncPixelTransferManagerIdle; + return new AsyncPixelTransferManagerIdle(true); case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; default: diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_mac.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_mac.cc index 6f7c5d1..dcc7e18 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_mac.cc +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_mac.cc @@ -18,7 +18,7 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create( case gfx::kGLImplementationOSMesaGL: case gfx::kGLImplementationDesktopGL: case gfx::kGLImplementationAppleGL: - return new AsyncPixelTransferManagerIdle; + return new AsyncPixelTransferManagerIdle(true); case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; default: diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_win.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_win.cc index 3bf32c0..dc106e8 100644 --- a/gpu/command_buffer/service/async_pixel_transfer_manager_win.cc +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_win.cc @@ -18,7 +18,7 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create( case gfx::kGLImplementationOSMesaGL: case gfx::kGLImplementationDesktopGL: case gfx::kGLImplementationEGLGLES2: - return new AsyncPixelTransferManagerIdle; + return new AsyncPixelTransferManagerIdle(true); case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; default: |