| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/in_process_command_buffer.h" | 5 #include "gpu/command_buffer/service/in_process_command_buffer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <queue> | 10 #include <queue> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "base/numerics/safe_conversions.h" | 21 #include "base/numerics/safe_conversions.h" |
| 22 #include "base/sequence_checker.h" | 22 #include "base/sequence_checker.h" |
| 23 #include "base/single_thread_task_runner.h" | 23 #include "base/single_thread_task_runner.h" |
| 24 #include "base/thread_task_runner_handle.h" | 24 #include "base/thread_task_runner_handle.h" |
| 25 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" | 25 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
| 26 #include "gpu/command_buffer/common/sync_token.h" | 26 #include "gpu/command_buffer/common/sync_token.h" |
| 27 #include "gpu/command_buffer/common/value_state.h" | 27 #include "gpu/command_buffer/common/value_state.h" |
| 28 #include "gpu/command_buffer/service/command_buffer_service.h" | 28 #include "gpu/command_buffer/service/command_buffer_service.h" |
| 29 #include "gpu/command_buffer/service/context_group.h" | 29 #include "gpu/command_buffer/service/context_group.h" |
| 30 #include "gpu/command_buffer/service/gl_context_virtual.h" | 30 #include "gpu/command_buffer/service/gl_context_virtual.h" |
| 31 #include "gpu/command_buffer/service/gpu_preferences.h" |
| 31 #include "gpu/command_buffer/service/gpu_scheduler.h" | 32 #include "gpu/command_buffer/service/gpu_scheduler.h" |
| 32 #include "gpu/command_buffer/service/gpu_switches.h" | |
| 33 #include "gpu/command_buffer/service/image_factory.h" | 33 #include "gpu/command_buffer/service/image_factory.h" |
| 34 #include "gpu/command_buffer/service/image_manager.h" | 34 #include "gpu/command_buffer/service/image_manager.h" |
| 35 #include "gpu/command_buffer/service/mailbox_manager.h" | 35 #include "gpu/command_buffer/service/mailbox_manager.h" |
| 36 #include "gpu/command_buffer/service/memory_program_cache.h" | 36 #include "gpu/command_buffer/service/memory_program_cache.h" |
| 37 #include "gpu/command_buffer/service/memory_tracking.h" | 37 #include "gpu/command_buffer/service/memory_tracking.h" |
| 38 #include "gpu/command_buffer/service/query_manager.h" | 38 #include "gpu/command_buffer/service/query_manager.h" |
| 39 #include "gpu/command_buffer/service/sync_point_manager.h" | 39 #include "gpu/command_buffer/service/sync_point_manager.h" |
| 40 #include "gpu/command_buffer/service/transfer_buffer_manager.h" | 40 #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
| 41 #include "gpu/command_buffer/service/valuebuffer_manager.h" | 41 #include "gpu/command_buffer/service/valuebuffer_manager.h" |
| 42 #include "ui/gfx/geometry/size.h" | 42 #include "ui/gfx/geometry/size.h" |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 // delete the ThreadTaskRunnerHandle before the GPU thread's message loop, | 143 // delete the ThreadTaskRunnerHandle before the GPU thread's message loop, |
| 144 // and when the message loop is shutdown, it will recreate | 144 // and when the message loop is shutdown, it will recreate |
| 145 // ThreadTaskRunnerHandle, which will re-add a new task to the, AtExitManager, | 145 // ThreadTaskRunnerHandle, which will re-add a new task to the, AtExitManager, |
| 146 // which causes a deadlock because it's already locked. | 146 // which causes a deadlock because it's already locked. |
| 147 base::ThreadTaskRunnerHandle::IsSet(); | 147 base::ThreadTaskRunnerHandle::IsSet(); |
| 148 return g_default_service.Get().gpu_thread; | 148 return g_default_service.Get().gpu_thread; |
| 149 } | 149 } |
| 150 | 150 |
| 151 } // anonyous namespace | 151 } // anonyous namespace |
| 152 | 152 |
| 153 InProcessCommandBuffer::Service::Service() {} | 153 InProcessCommandBuffer::Service::Service(const GpuPreferences& gpu_preferences) |
| 154 : gpu_preferences_(gpu_preferences) {} |
| 154 | 155 |
| 155 InProcessCommandBuffer::Service::~Service() {} | 156 InProcessCommandBuffer::Service::~Service() {} |
| 156 | 157 |
| 158 const gpu::GpuPreferences& |
| 159 InProcessCommandBuffer::Service::gpu_preferences() { |
| 160 return gpu_preferences_; |
| 161 } |
| 162 |
| 157 scoped_refptr<gfx::GLShareGroup> | 163 scoped_refptr<gfx::GLShareGroup> |
| 158 InProcessCommandBuffer::Service::share_group() { | 164 InProcessCommandBuffer::Service::share_group() { |
| 159 if (!share_group_.get()) | 165 if (!share_group_.get()) |
| 160 share_group_ = new gfx::GLShareGroup; | 166 share_group_ = new gfx::GLShareGroup; |
| 161 return share_group_; | 167 return share_group_; |
| 162 } | 168 } |
| 163 | 169 |
| 164 scoped_refptr<gles2::MailboxManager> | 170 scoped_refptr<gles2::MailboxManager> |
| 165 InProcessCommandBuffer::Service::mailbox_manager() { | 171 InProcessCommandBuffer::Service::mailbox_manager() { |
| 166 if (!mailbox_manager_.get()) { | 172 if (!mailbox_manager_.get()) { |
| 167 mailbox_manager_ = gles2::MailboxManager::Create(); | 173 mailbox_manager_ = gles2::MailboxManager::Create(gpu_preferences()); |
| 168 } | 174 } |
| 169 return mailbox_manager_; | 175 return mailbox_manager_; |
| 170 } | 176 } |
| 171 | 177 |
| 172 scoped_refptr<gles2::SubscriptionRefSet> | 178 scoped_refptr<gles2::SubscriptionRefSet> |
| 173 InProcessCommandBuffer::Service::subscription_ref_set() { | 179 InProcessCommandBuffer::Service::subscription_ref_set() { |
| 174 if (!subscription_ref_set_.get()) { | 180 if (!subscription_ref_set_.get()) { |
| 175 subscription_ref_set_ = new gles2::SubscriptionRefSet(); | 181 subscription_ref_set_ = new gles2::SubscriptionRefSet(); |
| 176 } | 182 } |
| 177 return subscription_ref_set_; | 183 return subscription_ref_set_; |
| 178 } | 184 } |
| 179 | 185 |
| 180 scoped_refptr<ValueStateMap> | 186 scoped_refptr<ValueStateMap> |
| 181 InProcessCommandBuffer::Service::pending_valuebuffer_state() { | 187 InProcessCommandBuffer::Service::pending_valuebuffer_state() { |
| 182 if (!pending_valuebuffer_state_.get()) { | 188 if (!pending_valuebuffer_state_.get()) { |
| 183 pending_valuebuffer_state_ = new ValueStateMap(); | 189 pending_valuebuffer_state_ = new ValueStateMap(); |
| 184 } | 190 } |
| 185 return pending_valuebuffer_state_; | 191 return pending_valuebuffer_state_; |
| 186 } | 192 } |
| 187 | 193 |
| 188 gpu::gles2::ProgramCache* InProcessCommandBuffer::Service::program_cache() { | 194 gpu::gles2::ProgramCache* InProcessCommandBuffer::Service::program_cache() { |
| 189 if (!program_cache_.get() && | 195 if (!program_cache_.get() && |
| 190 (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary || | 196 (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary || |
| 191 gfx::g_driver_gl.ext.b_GL_OES_get_program_binary) && | 197 gfx::g_driver_gl.ext.b_GL_OES_get_program_binary) && |
| 192 !base::CommandLine::ForCurrentProcess()->HasSwitch( | 198 !gpu_preferences().disable_gpu_program_cache) { |
| 193 switches::kDisableGpuProgramCache)) { | 199 program_cache_.reset(new gpu::gles2::MemoryProgramCache( |
| 194 program_cache_.reset(new gpu::gles2::MemoryProgramCache()); | 200 gpu_preferences().gpu_program_cache_size, |
| 201 gpu_preferences().disable_gpu_shader_disk_cache)); |
| 195 } | 202 } |
| 196 return program_cache_.get(); | 203 return program_cache_.get(); |
| 197 } | 204 } |
| 198 | 205 |
| 199 InProcessCommandBuffer::InProcessCommandBuffer( | 206 InProcessCommandBuffer::InProcessCommandBuffer( |
| 200 const scoped_refptr<Service>& service) | 207 const scoped_refptr<Service>& service) |
| 201 : command_buffer_id_( | 208 : command_buffer_id_( |
| 202 CommandBufferId::FromUnsafeValue(g_next_command_buffer_id.GetNext())), | 209 CommandBufferId::FromUnsafeValue(g_next_command_buffer_id.GetNext())), |
| 203 context_lost_(false), | 210 context_lost_(false), |
| 204 delayed_work_pending_(false), | 211 delayed_work_pending_(false), |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 : service_->share_group(); | 336 : service_->share_group(); |
| 330 | 337 |
| 331 #if defined(OS_ANDROID) | 338 #if defined(OS_ANDROID) |
| 332 stream_texture_manager_.reset(new StreamTextureManagerInProcess); | 339 stream_texture_manager_.reset(new StreamTextureManagerInProcess); |
| 333 #endif | 340 #endif |
| 334 | 341 |
| 335 bool bind_generates_resource = false; | 342 bool bind_generates_resource = false; |
| 336 decoder_.reset(gles2::GLES2Decoder::Create( | 343 decoder_.reset(gles2::GLES2Decoder::Create( |
| 337 params.context_group | 344 params.context_group |
| 338 ? params.context_group->decoder_->GetContextGroup() | 345 ? params.context_group->decoder_->GetContextGroup() |
| 339 : new gles2::ContextGroup(service_->mailbox_manager(), NULL, | 346 : new gles2::ContextGroup(service_->gpu_preferences(), |
| 347 service_->mailbox_manager(), NULL, |
| 340 service_->shader_translator_cache(), | 348 service_->shader_translator_cache(), |
| 341 service_->framebuffer_completeness_cache(), | 349 service_->framebuffer_completeness_cache(), |
| 342 NULL, service_->subscription_ref_set(), | 350 NULL, service_->subscription_ref_set(), |
| 343 service_->pending_valuebuffer_state(), | 351 service_->pending_valuebuffer_state(), |
| 344 bind_generates_resource))); | 352 bind_generates_resource))); |
| 345 | 353 |
| 346 gpu_scheduler_.reset( | 354 gpu_scheduler_.reset( |
| 347 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); | 355 new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); |
| 348 command_buffer->SetGetBufferChangeCallback(base::Bind( | 356 command_buffer->SetGetBufferChangeCallback(base::Bind( |
| 349 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); | 357 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); |
| (...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1032 base::Bind(&InProcessCommandBuffer::CreateStreamTextureOnGpuThread, | 1040 base::Bind(&InProcessCommandBuffer::CreateStreamTextureOnGpuThread, |
| 1033 base::Unretained(this), texture_id); | 1041 base::Unretained(this), texture_id); |
| 1034 QueueTask( | 1042 QueueTask( |
| 1035 base::Bind(&RunTaskWithResult<uint32_t>, task, &stream_id, &completion)); | 1043 base::Bind(&RunTaskWithResult<uint32_t>, task, &stream_id, &completion)); |
| 1036 completion.Wait(); | 1044 completion.Wait(); |
| 1037 return stream_id; | 1045 return stream_id; |
| 1038 } | 1046 } |
| 1039 #endif | 1047 #endif |
| 1040 | 1048 |
| 1041 GpuInProcessThread::GpuInProcessThread(SyncPointManager* sync_point_manager) | 1049 GpuInProcessThread::GpuInProcessThread(SyncPointManager* sync_point_manager) |
| 1042 : base::Thread("GpuThread"), sync_point_manager_(sync_point_manager) { | 1050 : base::Thread("GpuThread"), Service(gpu_preferences_), |
| 1051 sync_point_manager_(sync_point_manager) { |
| 1043 Start(); | 1052 Start(); |
| 1044 } | 1053 } |
| 1045 | 1054 |
| 1046 GpuInProcessThread::~GpuInProcessThread() { | 1055 GpuInProcessThread::~GpuInProcessThread() { |
| 1047 Stop(); | 1056 Stop(); |
| 1048 } | 1057 } |
| 1049 | 1058 |
| 1050 void GpuInProcessThread::AddRef() const { | 1059 void GpuInProcessThread::AddRef() const { |
| 1051 base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); | 1060 base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); |
| 1052 } | 1061 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1063 task_runner()->PostDelayedTask(FROM_HERE, callback, | 1072 task_runner()->PostDelayedTask(FROM_HERE, callback, |
| 1064 base::TimeDelta::FromMilliseconds(2)); | 1073 base::TimeDelta::FromMilliseconds(2)); |
| 1065 } | 1074 } |
| 1066 | 1075 |
| 1067 bool GpuInProcessThread::UseVirtualizedGLContexts() { | 1076 bool GpuInProcessThread::UseVirtualizedGLContexts() { |
| 1068 return false; | 1077 return false; |
| 1069 } | 1078 } |
| 1070 | 1079 |
| 1071 scoped_refptr<gles2::ShaderTranslatorCache> | 1080 scoped_refptr<gles2::ShaderTranslatorCache> |
| 1072 GpuInProcessThread::shader_translator_cache() { | 1081 GpuInProcessThread::shader_translator_cache() { |
| 1073 if (!shader_translator_cache_.get()) | 1082 if (!shader_translator_cache_.get()) { |
| 1074 shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; | 1083 shader_translator_cache_ = |
| 1084 new gpu::gles2::ShaderTranslatorCache(gpu_preferences()); |
| 1085 } |
| 1075 return shader_translator_cache_; | 1086 return shader_translator_cache_; |
| 1076 } | 1087 } |
| 1077 | 1088 |
| 1078 scoped_refptr<gles2::FramebufferCompletenessCache> | 1089 scoped_refptr<gles2::FramebufferCompletenessCache> |
| 1079 GpuInProcessThread::framebuffer_completeness_cache() { | 1090 GpuInProcessThread::framebuffer_completeness_cache() { |
| 1080 if (!framebuffer_completeness_cache_.get()) | 1091 if (!framebuffer_completeness_cache_.get()) |
| 1081 framebuffer_completeness_cache_ = | 1092 framebuffer_completeness_cache_ = |
| 1082 new gpu::gles2::FramebufferCompletenessCache; | 1093 new gpu::gles2::FramebufferCompletenessCache; |
| 1083 return framebuffer_completeness_cache_; | 1094 return framebuffer_completeness_cache_; |
| 1084 } | 1095 } |
| 1085 | 1096 |
| 1086 SyncPointManager* GpuInProcessThread::sync_point_manager() { | 1097 SyncPointManager* GpuInProcessThread::sync_point_manager() { |
| 1087 return sync_point_manager_; | 1098 return sync_point_manager_; |
| 1088 } | 1099 } |
| 1089 | 1100 |
| 1090 } // namespace gpu | 1101 } // namespace gpu |
| OLD | NEW |