OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/context_group.h" | 5 #include "gpu/command_buffer/service/context_group.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "gpu/command_buffer/service/buffer_manager.h" | 14 #include "gpu/command_buffer/service/buffer_manager.h" |
15 #include "gpu/command_buffer/service/framebuffer_manager.h" | 15 #include "gpu/command_buffer/service/framebuffer_manager.h" |
16 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h" | 16 #include "gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h" |
17 #include "gpu/command_buffer/service/gpu_preferences.h" | 17 #include "gpu/command_buffer/service/gpu_preferences.h" |
18 #include "gpu/command_buffer/service/mailbox_manager_impl.h" | 18 #include "gpu/command_buffer/service/mailbox_manager_impl.h" |
19 #include "gpu/command_buffer/service/path_manager.h" | 19 #include "gpu/command_buffer/service/path_manager.h" |
20 #include "gpu/command_buffer/service/program_manager.h" | 20 #include "gpu/command_buffer/service/program_manager.h" |
21 #include "gpu/command_buffer/service/progress_reporter.h" | |
21 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 22 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
22 #include "gpu/command_buffer/service/sampler_manager.h" | 23 #include "gpu/command_buffer/service/sampler_manager.h" |
23 #include "gpu/command_buffer/service/shader_manager.h" | 24 #include "gpu/command_buffer/service/shader_manager.h" |
24 #include "gpu/command_buffer/service/texture_manager.h" | 25 #include "gpu/command_buffer/service/texture_manager.h" |
25 #include "gpu/command_buffer/service/transfer_buffer_manager.h" | 26 #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
26 #include "ui/gl/gl_bindings.h" | 27 #include "ui/gl/gl_bindings.h" |
27 #include "ui/gl/gl_version_info.h" | 28 #include "ui/gl/gl_version_info.h" |
28 | 29 |
29 namespace gpu { | 30 namespace gpu { |
30 namespace gles2 { | 31 namespace gles2 { |
(...skipping 27 matching lines...) Expand all Loading... | |
58 | 59 |
59 ContextGroup::ContextGroup( | 60 ContextGroup::ContextGroup( |
60 const GpuPreferences& gpu_preferences, | 61 const GpuPreferences& gpu_preferences, |
61 const scoped_refptr<MailboxManager>& mailbox_manager, | 62 const scoped_refptr<MailboxManager>& mailbox_manager, |
62 const scoped_refptr<MemoryTracker>& memory_tracker, | 63 const scoped_refptr<MemoryTracker>& memory_tracker, |
63 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, | 64 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, |
64 const scoped_refptr<FramebufferCompletenessCache>& | 65 const scoped_refptr<FramebufferCompletenessCache>& |
65 framebuffer_completeness_cache, | 66 framebuffer_completeness_cache, |
66 const scoped_refptr<FeatureInfo>& feature_info, | 67 const scoped_refptr<FeatureInfo>& feature_info, |
67 bool bind_generates_resource, | 68 bool bind_generates_resource, |
68 gpu::ImageFactory* image_factory) | 69 gpu::ImageFactory* image_factory, |
70 ProgressReporter* progress_reporter) | |
69 : gpu_preferences_(gpu_preferences), | 71 : gpu_preferences_(gpu_preferences), |
70 mailbox_manager_(mailbox_manager), | 72 mailbox_manager_(mailbox_manager), |
71 memory_tracker_(memory_tracker), | 73 memory_tracker_(memory_tracker), |
72 shader_translator_cache_(shader_translator_cache), | 74 shader_translator_cache_(shader_translator_cache), |
73 #if defined(OS_MACOSX) | 75 #if defined(OS_MACOSX) |
74 // Framebuffer completeness is not cacheable on OS X because of dynamic | 76 // Framebuffer completeness is not cacheable on OS X because of dynamic |
75 // graphics switching. | 77 // graphics switching. |
76 // http://crbug.com/180876 | 78 // http://crbug.com/180876 |
77 // TODO(tobiasjs): determine whether GPU switching is possible | 79 // TODO(tobiasjs): determine whether GPU switching is possible |
78 // programmatically, rather than just hardcoding this behaviour | 80 // programmatically, rather than just hardcoding this behaviour |
(...skipping 17 matching lines...) Expand all Loading... | |
96 max_vertex_output_components_(0u), | 98 max_vertex_output_components_(0u), |
97 max_fragment_input_components_(0u), | 99 max_fragment_input_components_(0u), |
98 min_program_texel_offset_(0), | 100 min_program_texel_offset_(0), |
99 max_program_texel_offset_(0), | 101 max_program_texel_offset_(0), |
100 max_transform_feedback_separate_attribs_(0u), | 102 max_transform_feedback_separate_attribs_(0u), |
101 max_uniform_buffer_bindings_(0u), | 103 max_uniform_buffer_bindings_(0u), |
102 uniform_buffer_offset_alignment_(1u), | 104 uniform_buffer_offset_alignment_(1u), |
103 program_cache_(NULL), | 105 program_cache_(NULL), |
104 feature_info_(feature_info), | 106 feature_info_(feature_info), |
105 image_factory_(image_factory), | 107 image_factory_(image_factory), |
106 passthrough_resources_(new PassthroughResources) { | 108 passthrough_resources_(new PassthroughResources), |
109 progress_reporter_(progress_reporter) { | |
107 { | 110 { |
108 DCHECK(feature_info_); | 111 DCHECK(feature_info_); |
109 if (!mailbox_manager_.get()) | 112 if (!mailbox_manager_.get()) |
110 mailbox_manager_ = new MailboxManagerImpl; | 113 mailbox_manager_ = new MailboxManagerImpl; |
111 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); | 114 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); |
112 } | 115 } |
113 } | 116 } |
114 | 117 |
115 bool ContextGroup::Initialize(GLES2Decoder* decoder, | 118 bool ContextGroup::Initialize(GLES2Decoder* decoder, |
116 ContextType context_type, | 119 ContextType context_type, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 } | 208 } |
206 | 209 |
207 buffer_manager_.reset( | 210 buffer_manager_.reset( |
208 new BufferManager(memory_tracker_.get(), feature_info_.get())); | 211 new BufferManager(memory_tracker_.get(), feature_info_.get())); |
209 framebuffer_manager_.reset( | 212 framebuffer_manager_.reset( |
210 new FramebufferManager(max_draw_buffers_, max_color_attachments_, | 213 new FramebufferManager(max_draw_buffers_, max_color_attachments_, |
211 framebuffer_completeness_cache_)); | 214 framebuffer_completeness_cache_)); |
212 renderbuffer_manager_.reset(new RenderbufferManager( | 215 renderbuffer_manager_.reset(new RenderbufferManager( |
213 memory_tracker_.get(), max_renderbuffer_size, max_samples, | 216 memory_tracker_.get(), max_renderbuffer_size, max_samples, |
214 feature_info_.get())); | 217 feature_info_.get())); |
215 shader_manager_.reset(new ShaderManager()); | 218 shader_manager_.reset(new ShaderManager(progress_reporter_)); |
216 sampler_manager_.reset(new SamplerManager(feature_info_.get())); | 219 sampler_manager_.reset(new SamplerManager(feature_info_.get())); |
217 | 220 |
218 // Lookup GL things we need to know. | 221 // Lookup GL things we need to know. |
219 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 222 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
220 if (!QueryGLFeatureU( | 223 if (!QueryGLFeatureU( |
221 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 224 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
222 &max_vertex_attribs_)) { | 225 &max_vertex_attribs_)) { |
223 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 226 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
224 << "vertex attributes supported (" << max_vertex_attribs_ | 227 << "vertex attributes supported (" << max_vertex_attribs_ |
225 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; | 228 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
292 | 295 |
293 if (feature_info_->workarounds().max_texture_size) { | 296 if (feature_info_->workarounds().max_texture_size) { |
294 max_texture_size = std::min( | 297 max_texture_size = std::min( |
295 max_texture_size, | 298 max_texture_size, |
296 feature_info_->workarounds().max_texture_size); | 299 feature_info_->workarounds().max_texture_size); |
297 max_rectangle_texture_size = std::min( | 300 max_rectangle_texture_size = std::min( |
298 max_rectangle_texture_size, | 301 max_rectangle_texture_size, |
299 feature_info_->workarounds().max_texture_size); | 302 feature_info_->workarounds().max_texture_size); |
300 } | 303 } |
301 | 304 |
302 texture_manager_.reset(new TextureManager(memory_tracker_.get(), | 305 texture_manager_.reset(new TextureManager( |
303 feature_info_.get(), | 306 memory_tracker_.get(), feature_info_.get(), max_texture_size, |
304 max_texture_size, | 307 max_cube_map_texture_size, max_rectangle_texture_size, |
305 max_cube_map_texture_size, | 308 max_3d_texture_size, max_array_texture_layers, bind_generates_resource_, |
306 max_rectangle_texture_size, | 309 progress_reporter_)); |
307 max_3d_texture_size, | |
308 max_array_texture_layers, | |
309 bind_generates_resource_)); | |
310 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); | 310 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); |
311 | 311 |
312 const GLint kMinTextureImageUnits = 8; | 312 const GLint kMinTextureImageUnits = 8; |
313 const GLint kMinVertexTextureImageUnits = 0; | 313 const GLint kMinVertexTextureImageUnits = 0; |
314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, | 314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, |
315 &max_texture_image_units_)) { | 315 &max_texture_image_units_)) { |
316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
317 << "texture image units supported (" | 317 << "texture image units supported (" |
318 << max_texture_image_units_ | 318 << max_texture_image_units_ |
319 << ", should be " << kMinTextureImageUnits << ")."; | 319 << ", should be " << kMinTextureImageUnits << ")."; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " | 428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
429 << "cube texture size is too small (" | 429 << "cube texture size is too small (" |
430 << max_cube_map_texture_size << ", should be " | 430 << max_cube_map_texture_size << ", should be " |
431 << kES3MinCubeMapSize << ")."; | 431 << kES3MinCubeMapSize << ")."; |
432 return false; | 432 return false; |
433 } | 433 } |
434 } | 434 } |
435 | 435 |
436 path_manager_.reset(new PathManager()); | 436 path_manager_.reset(new PathManager()); |
437 | 437 |
438 program_manager_.reset( | 438 program_manager_.reset(new ProgramManager( |
439 new ProgramManager(program_cache_, | 439 program_cache_, max_varying_vectors_, max_draw_buffers_, |
440 max_varying_vectors_, | 440 max_dual_source_draw_buffers_, max_vertex_attribs_, gpu_preferences_, |
441 max_draw_buffers_, | 441 feature_info_.get(), progress_reporter_)); |
442 max_dual_source_draw_buffers_, | |
443 max_vertex_attribs_, | |
444 gpu_preferences_, | |
445 feature_info_.get())); | |
446 | 442 |
447 if (!texture_manager_->Initialize()) { | 443 if (!texture_manager_->Initialize()) { |
448 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " | 444 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " |
449 << "failed to initialize."; | 445 << "failed to initialize."; |
450 return false; | 446 return false; |
451 } | 447 } |
452 | 448 |
453 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); | 449 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
454 return true; | 450 return true; |
455 } | 451 } |
(...skipping 18 matching lines...) Expand all Loading... | |
474 }; | 470 }; |
475 | 471 |
476 } // namespace anonymous | 472 } // namespace anonymous |
477 | 473 |
478 bool ContextGroup::HaveContexts() { | 474 bool ContextGroup::HaveContexts() { |
479 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull), | 475 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull), |
480 decoders_.end()); | 476 decoders_.end()); |
481 return !decoders_.empty(); | 477 return !decoders_.empty(); |
482 } | 478 } |
483 | 479 |
480 void ContextGroup::ReportProgress() { | |
481 if (progress_reporter_) | |
482 progress_reporter_->ReportProgress(); | |
483 } | |
484 | |
484 void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) { | 485 void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) { |
485 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), | 486 decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), |
486 WeakPtrEquals<gles2::GLES2Decoder>(decoder)), | 487 WeakPtrEquals<gles2::GLES2Decoder>(decoder)), |
487 decoders_.end()); | 488 decoders_.end()); |
488 // If we still have contexts do nothing. | 489 // If we still have contexts do nothing. |
489 if (HaveContexts()) { | 490 if (HaveContexts()) { |
490 return; | 491 return; |
491 } | 492 } |
492 | 493 |
493 if (buffer_manager_ != nullptr) { | 494 if (buffer_manager_ != nullptr) { |
494 if (!have_context) { | 495 if (!have_context) { |
495 buffer_manager_->MarkContextLost(); | 496 buffer_manager_->MarkContextLost(); |
496 } | 497 } |
497 buffer_manager_->Destroy(); | 498 buffer_manager_->Destroy(); |
498 buffer_manager_.reset(); | 499 buffer_manager_.reset(); |
500 ReportProgress(); | |
499 } | 501 } |
500 | 502 |
501 if (framebuffer_manager_ != NULL) { | 503 if (framebuffer_manager_ != NULL) { |
502 framebuffer_manager_->Destroy(have_context); | 504 framebuffer_manager_->Destroy(have_context); |
503 if (texture_manager_) | 505 if (texture_manager_) |
504 texture_manager_->set_framebuffer_manager(NULL); | 506 texture_manager_->set_framebuffer_manager(NULL); |
505 framebuffer_manager_.reset(); | 507 framebuffer_manager_.reset(); |
508 ReportProgress(); | |
506 } | 509 } |
507 | 510 |
508 if (renderbuffer_manager_ != NULL) { | 511 if (renderbuffer_manager_ != NULL) { |
509 renderbuffer_manager_->Destroy(have_context); | 512 renderbuffer_manager_->Destroy(have_context); |
510 renderbuffer_manager_.reset(); | 513 renderbuffer_manager_.reset(); |
514 ReportProgress(); | |
511 } | 515 } |
512 | 516 |
513 if (texture_manager_ != NULL) { | 517 if (texture_manager_ != NULL) { |
514 texture_manager_->Destroy(have_context); | 518 texture_manager_->Destroy(have_context); |
515 texture_manager_.reset(); | 519 texture_manager_.reset(); |
520 ReportProgress(); | |
516 } | 521 } |
517 | 522 |
518 if (path_manager_ != NULL) { | 523 if (path_manager_ != NULL) { |
519 path_manager_->Destroy(have_context); | 524 path_manager_->Destroy(have_context); |
520 path_manager_.reset(); | 525 path_manager_.reset(); |
526 ReportProgress(); | |
521 } | 527 } |
522 | 528 |
523 if (program_manager_ != NULL) { | 529 if (program_manager_ != NULL) { |
524 program_manager_->Destroy(have_context); | 530 program_manager_->Destroy(have_context); |
525 program_manager_.reset(); | 531 program_manager_.reset(); |
532 ReportProgress(); | |
526 } | 533 } |
527 | 534 |
528 if (shader_manager_ != NULL) { | 535 if (shader_manager_ != NULL) { |
529 shader_manager_->Destroy(have_context); | 536 shader_manager_->Destroy(have_context); |
530 shader_manager_.reset(); | 537 shader_manager_.reset(); |
538 ReportProgress(); | |
531 } | 539 } |
532 | 540 |
533 if (sampler_manager_ != NULL) { | 541 if (sampler_manager_ != NULL) { |
534 sampler_manager_->Destroy(have_context); | 542 sampler_manager_->Destroy(have_context); |
535 sampler_manager_.reset(); | 543 sampler_manager_.reset(); |
544 ReportProgress(); | |
536 } | 545 } |
537 | 546 |
538 memory_tracker_ = NULL; | 547 memory_tracker_ = NULL; |
539 | 548 |
540 passthrough_resources_->Destroy(have_context); | 549 passthrough_resources_->Destroy(have_context); |
541 passthrough_resources_.reset(); | 550 passthrough_resources_.reset(); |
551 ReportProgress(); | |
danakj
2016/10/06 21:49:54
nit: This one seems unneeded, when you're leaving
danakj
2016/10/06 21:51:01
Or maybe it's worth keeping to chain with other fu
| |
542 } | 552 } |
543 | 553 |
544 uint32_t ContextGroup::GetMemRepresented() const { | 554 uint32_t ContextGroup::GetMemRepresented() const { |
545 uint32_t total = 0; | 555 uint32_t total = 0; |
546 if (buffer_manager_.get()) | 556 if (buffer_manager_.get()) |
547 total += buffer_manager_->mem_represented(); | 557 total += buffer_manager_->mem_represented(); |
548 if (renderbuffer_manager_.get()) | 558 if (renderbuffer_manager_.get()) |
549 total += renderbuffer_manager_->mem_represented(); | 559 total += renderbuffer_manager_->mem_represented(); |
550 if (texture_manager_.get()) | 560 if (texture_manager_.get()) |
551 total += texture_manager_->mem_represented(); | 561 total += texture_manager_->mem_represented(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
607 GLuint client_id, GLuint* service_id) const { | 617 GLuint client_id, GLuint* service_id) const { |
608 Buffer* buffer = buffer_manager_->GetBuffer(client_id); | 618 Buffer* buffer = buffer_manager_->GetBuffer(client_id); |
609 if (!buffer) | 619 if (!buffer) |
610 return false; | 620 return false; |
611 *service_id = buffer->service_id(); | 621 *service_id = buffer->service_id(); |
612 return true; | 622 return true; |
613 } | 623 } |
614 | 624 |
615 } // namespace gles2 | 625 } // namespace gles2 |
616 } // namespace gpu | 626 } // namespace gpu |
OLD | NEW |