| 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 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 if (!MakeCurrent()) | 244 if (!MakeCurrent()) |
| 245 return; | 245 return; |
| 246 | 246 |
| 247 executor_->PutChanged(); | 247 executor_->PutChanged(); |
| 248 } | 248 } |
| 249 | 249 |
| 250 bool InProcessCommandBuffer::Initialize( | 250 bool InProcessCommandBuffer::Initialize( |
| 251 scoped_refptr<gl::GLSurface> surface, | 251 scoped_refptr<gl::GLSurface> surface, |
| 252 bool is_offscreen, | 252 bool is_offscreen, |
| 253 gfx::AcceleratedWidget window, | 253 gfx::AcceleratedWidget window, |
| 254 const gfx::Size& size, | |
| 255 const gles2::ContextCreationAttribHelper& attribs, | 254 const gles2::ContextCreationAttribHelper& attribs, |
| 256 gl::GpuPreference gpu_preference, | |
| 257 InProcessCommandBuffer* share_group, | 255 InProcessCommandBuffer* share_group, |
| 258 GpuMemoryBufferManager* gpu_memory_buffer_manager, | 256 GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 259 ImageFactory* image_factory) { | 257 ImageFactory* image_factory) { |
| 260 DCHECK(!share_group || service_.get() == share_group->service_.get()); | 258 DCHECK(!share_group || service_.get() == share_group->service_.get()); |
| 261 | 259 |
| 262 if (surface) { | 260 if (surface) { |
| 263 // GPU thread must be the same as client thread due to GLSurface not being | 261 // GPU thread must be the same as client thread due to GLSurface not being |
| 264 // thread safe. | 262 // thread safe. |
| 265 sequence_checker_.reset(new base::SequenceChecker); | 263 sequence_checker_.reset(new base::SequenceChecker); |
| 266 surface_ = surface; | 264 surface_ = surface; |
| 267 } else { | 265 } else { |
| 268 origin_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 266 origin_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 269 client_thread_weak_ptr_ = client_thread_weak_ptr_factory_.GetWeakPtr(); | 267 client_thread_weak_ptr_ = client_thread_weak_ptr_factory_.GetWeakPtr(); |
| 270 } | 268 } |
| 271 | 269 |
| 272 gpu::Capabilities capabilities; | 270 gpu::Capabilities capabilities; |
| 273 InitializeOnGpuThreadParams params(is_offscreen, | 271 InitializeOnGpuThreadParams params(is_offscreen, window, attribs, |
| 274 window, | 272 &capabilities, share_group, image_factory); |
| 275 size, | |
| 276 attribs, | |
| 277 gpu_preference, | |
| 278 &capabilities, | |
| 279 share_group, | |
| 280 image_factory); | |
| 281 | 273 |
| 282 base::Callback<bool(void)> init_task = | 274 base::Callback<bool(void)> init_task = |
| 283 base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread, | 275 base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread, |
| 284 base::Unretained(this), | 276 base::Unretained(this), params); |
| 285 params); | |
| 286 | 277 |
| 287 base::WaitableEvent completion( | 278 base::WaitableEvent completion( |
| 288 base::WaitableEvent::ResetPolicy::MANUAL, | 279 base::WaitableEvent::ResetPolicy::MANUAL, |
| 289 base::WaitableEvent::InitialState::NOT_SIGNALED); | 280 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 290 bool result = false; | 281 bool result = false; |
| 291 QueueTask( | 282 QueueTask( |
| 292 base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion)); | 283 base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion)); |
| 293 completion.Wait(); | 284 completion.Wait(); |
| 294 | 285 |
| 295 gpu_memory_buffer_manager_ = gpu_memory_buffer_manager; | 286 gpu_memory_buffer_manager_ = gpu_memory_buffer_manager; |
| 296 | 287 |
| 297 if (result) { | 288 if (result) { |
| 298 capabilities_ = capabilities; | 289 capabilities_ = capabilities; |
| 299 capabilities_.image = capabilities_.image && gpu_memory_buffer_manager_; | 290 capabilities_.image = capabilities_.image && gpu_memory_buffer_manager_; |
| 300 } | 291 } |
| 301 | 292 |
| 302 return result; | 293 return result; |
| 303 } | 294 } |
| 304 | 295 |
| 305 bool InProcessCommandBuffer::InitializeOnGpuThread( | 296 bool InProcessCommandBuffer::InitializeOnGpuThread( |
| 306 const InitializeOnGpuThreadParams& params) { | 297 const InitializeOnGpuThreadParams& params) { |
| 307 CheckSequencedThread(); | 298 CheckSequencedThread(); |
| 308 gpu_thread_weak_ptr_ = gpu_thread_weak_ptr_factory_.GetWeakPtr(); | 299 gpu_thread_weak_ptr_ = gpu_thread_weak_ptr_factory_.GetWeakPtr(); |
| 309 | 300 |
| 310 DCHECK(params.size.width() >= 0 && params.size.height() >= 0); | |
| 311 | |
| 312 TransferBufferManager* manager = new TransferBufferManager(nullptr); | 301 TransferBufferManager* manager = new TransferBufferManager(nullptr); |
| 313 transfer_buffer_manager_ = manager; | 302 transfer_buffer_manager_ = manager; |
| 314 manager->Initialize(); | 303 manager->Initialize(); |
| 315 | 304 |
| 316 std::unique_ptr<CommandBufferService> command_buffer( | 305 std::unique_ptr<CommandBufferService> command_buffer( |
| 317 new CommandBufferService(transfer_buffer_manager_.get())); | 306 new CommandBufferService(transfer_buffer_manager_.get())); |
| 318 command_buffer->SetPutOffsetChangeCallback(base::Bind( | 307 command_buffer->SetPutOffsetChangeCallback(base::Bind( |
| 319 &InProcessCommandBuffer::PumpCommandsOnGpuThread, gpu_thread_weak_ptr_)); | 308 &InProcessCommandBuffer::PumpCommandsOnGpuThread, gpu_thread_weak_ptr_)); |
| 320 command_buffer->SetParseErrorCallback(base::Bind( | 309 command_buffer->SetParseErrorCallback(base::Bind( |
| 321 &InProcessCommandBuffer::OnContextLostOnGpuThread, gpu_thread_weak_ptr_)); | 310 &InProcessCommandBuffer::OnContextLostOnGpuThread, gpu_thread_weak_ptr_)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 339 executor_.reset(new CommandExecutor(command_buffer.get(), decoder_.get(), | 328 executor_.reset(new CommandExecutor(command_buffer.get(), decoder_.get(), |
| 340 decoder_.get())); | 329 decoder_.get())); |
| 341 command_buffer->SetGetBufferChangeCallback(base::Bind( | 330 command_buffer->SetGetBufferChangeCallback(base::Bind( |
| 342 &CommandExecutor::SetGetBuffer, base::Unretained(executor_.get()))); | 331 &CommandExecutor::SetGetBuffer, base::Unretained(executor_.get()))); |
| 343 command_buffer_ = std::move(command_buffer); | 332 command_buffer_ = std::move(command_buffer); |
| 344 | 333 |
| 345 decoder_->set_engine(executor_.get()); | 334 decoder_->set_engine(executor_.get()); |
| 346 | 335 |
| 347 if (!surface_.get()) { | 336 if (!surface_.get()) { |
| 348 if (params.is_offscreen) | 337 if (params.is_offscreen) |
| 349 surface_ = gl::init::CreateOffscreenGLSurface(params.size); | 338 surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size()); |
| 350 else | 339 else |
| 351 surface_ = gl::init::CreateViewGLSurface(params.window); | 340 surface_ = gl::init::CreateViewGLSurface(params.window); |
| 352 } | 341 } |
| 353 | 342 |
| 354 if (!surface_.get()) { | 343 if (!surface_.get()) { |
| 355 LOG(ERROR) << "Could not create GLSurface."; | 344 LOG(ERROR) << "Could not create GLSurface."; |
| 356 DestroyOnGpuThread(); | 345 DestroyOnGpuThread(); |
| 357 return false; | 346 return false; |
| 358 } | 347 } |
| 359 | 348 |
| 360 sync_point_order_data_ = SyncPointOrderData::Create(); | 349 sync_point_order_data_ = SyncPointOrderData::Create(); |
| 361 sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient( | 350 sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient( |
| 362 sync_point_order_data_, GetNamespaceID(), GetCommandBufferID()); | 351 sync_point_order_data_, GetNamespaceID(), GetCommandBufferID()); |
| 363 | 352 |
| 364 if (service_->UseVirtualizedGLContexts() || | 353 if (service_->UseVirtualizedGLContexts() || |
| 365 decoder_->GetContextGroup() | 354 decoder_->GetContextGroup() |
| 366 ->feature_info() | 355 ->feature_info() |
| 367 ->workarounds() | 356 ->workarounds() |
| 368 .use_virtualized_gl_contexts) { | 357 .use_virtualized_gl_contexts) { |
| 369 context_ = gl_share_group_->GetSharedContext(); | 358 context_ = gl_share_group_->GetSharedContext(); |
| 370 if (!context_.get()) { | 359 if (!context_.get()) { |
| 371 context_ = gl::init::CreateGLContext( | 360 context_ = gl::init::CreateGLContext( |
| 372 gl_share_group_.get(), surface_.get(), params.gpu_preference); | 361 gl_share_group_.get(), surface_.get(), params.attribs.gpu_preference); |
| 373 gl_share_group_->SetSharedContext(context_.get()); | 362 gl_share_group_->SetSharedContext(context_.get()); |
| 374 } | 363 } |
| 375 | 364 |
| 376 context_ = new GLContextVirtual( | 365 context_ = new GLContextVirtual( |
| 377 gl_share_group_.get(), context_.get(), decoder_->AsWeakPtr()); | 366 gl_share_group_.get(), context_.get(), decoder_->AsWeakPtr()); |
| 378 if (context_->Initialize(surface_.get(), params.gpu_preference)) { | 367 if (context_->Initialize(surface_.get(), params.attribs.gpu_preference)) { |
| 379 VLOG(1) << "Created virtual GL context."; | 368 VLOG(1) << "Created virtual GL context."; |
| 380 } else { | 369 } else { |
| 381 context_ = NULL; | 370 context_ = NULL; |
| 382 } | 371 } |
| 383 } else { | 372 } else { |
| 384 context_ = gl::init::CreateGLContext(gl_share_group_.get(), surface_.get(), | 373 context_ = gl::init::CreateGLContext(gl_share_group_.get(), surface_.get(), |
| 385 params.gpu_preference); | 374 params.attribs.gpu_preference); |
| 386 } | 375 } |
| 387 | 376 |
| 388 if (!context_.get()) { | 377 if (!context_.get()) { |
| 389 LOG(ERROR) << "Could not create GLContext."; | 378 LOG(ERROR) << "Could not create GLContext."; |
| 390 DestroyOnGpuThread(); | 379 DestroyOnGpuThread(); |
| 391 return false; | 380 return false; |
| 392 } | 381 } |
| 393 | 382 |
| 394 if (!context_->MakeCurrent(surface_.get())) { | 383 if (!context_->MakeCurrent(surface_.get())) { |
| 395 LOG(ERROR) << "Could not make context current."; | 384 LOG(ERROR) << "Could not make context current."; |
| 396 DestroyOnGpuThread(); | 385 DestroyOnGpuThread(); |
| 397 return false; | 386 return false; |
| 398 } | 387 } |
| 399 | 388 |
| 400 if (!decoder_->GetContextGroup()->has_program_cache() && | 389 if (!decoder_->GetContextGroup()->has_program_cache() && |
| 401 !decoder_->GetContextGroup() | 390 !decoder_->GetContextGroup() |
| 402 ->feature_info() | 391 ->feature_info() |
| 403 ->workarounds() | 392 ->workarounds() |
| 404 .disable_program_cache) { | 393 .disable_program_cache) { |
| 405 decoder_->GetContextGroup()->set_program_cache(service_->program_cache()); | 394 decoder_->GetContextGroup()->set_program_cache(service_->program_cache()); |
| 406 } | 395 } |
| 407 | 396 |
| 408 gles2::DisallowedFeatures disallowed_features; | 397 gles2::DisallowedFeatures disallowed_features; |
| 409 disallowed_features.gpu_memory_manager = true; | 398 disallowed_features.gpu_memory_manager = true; |
| 410 if (!decoder_->Initialize(surface_, | 399 if (!decoder_->Initialize(surface_, |
| 411 context_, | 400 context_, |
| 412 params.is_offscreen, | 401 params.is_offscreen, |
| 413 params.size, | |
| 414 disallowed_features, | 402 disallowed_features, |
| 415 params.attribs)) { | 403 params.attribs)) { |
| 416 LOG(ERROR) << "Could not initialize decoder."; | 404 LOG(ERROR) << "Could not initialize decoder."; |
| 417 DestroyOnGpuThread(); | 405 DestroyOnGpuThread(); |
| 418 return false; | 406 return false; |
| 419 } | 407 } |
| 420 *params.capabilities = decoder_->GetCapabilities(); | 408 *params.capabilities = decoder_->GetCapabilities(); |
| 421 | 409 |
| 422 decoder_->SetFenceSyncReleaseCallback( | 410 decoder_->SetFenceSyncReleaseCallback( |
| 423 base::Bind(&InProcessCommandBuffer::FenceSyncReleaseOnGpuThread, | 411 base::Bind(&InProcessCommandBuffer::FenceSyncReleaseOnGpuThread, |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 framebuffer_completeness_cache_ = | 1069 framebuffer_completeness_cache_ = |
| 1082 new gpu::gles2::FramebufferCompletenessCache; | 1070 new gpu::gles2::FramebufferCompletenessCache; |
| 1083 return framebuffer_completeness_cache_; | 1071 return framebuffer_completeness_cache_; |
| 1084 } | 1072 } |
| 1085 | 1073 |
| 1086 SyncPointManager* GpuInProcessThread::sync_point_manager() { | 1074 SyncPointManager* GpuInProcessThread::sync_point_manager() { |
| 1087 return sync_point_manager_; | 1075 return sync_point_manager_; |
| 1088 } | 1076 } |
| 1089 | 1077 |
| 1090 } // namespace gpu | 1078 } // namespace gpu |
| OLD | NEW |