summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorboliu <boliu@chromium.org>2015-01-29 17:00:45 -0800
committerCommit bot <commit-bot@chromium.org>2015-01-30 01:01:47 +0000
commita4baed454be2bb165cb12eb7df432e9138e746e6 (patch)
treea076435c5f63acf58b0d9811c291c8becfed829c /gpu
parentd5f777b7342dfcfb64b8bdd635ec3599303be08a (diff)
downloadchromium_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')
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_android.cc16
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc17
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_idle.h6
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_linux.cc2
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_mac.cc2
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager_win.cc2
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: