| 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), |
| 108 progress_reporter_(progress_reporter), |
| 106 passthrough_resources_(new PassthroughResources) { | 109 passthrough_resources_(new PassthroughResources) { |
| 107 { | 110 { |
| 108 DCHECK(feature_info_); | 111 DCHECK(feature_info_); |
| 112 DCHECK(progress_reporter_); |
| 109 if (!mailbox_manager_.get()) | 113 if (!mailbox_manager_.get()) |
| 110 mailbox_manager_ = new MailboxManagerImpl; | 114 mailbox_manager_ = new MailboxManagerImpl; |
| 111 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); | 115 transfer_buffer_manager_ = new TransferBufferManager(memory_tracker_.get()); |
| 112 } | 116 } |
| 113 } | 117 } |
| 114 | 118 |
| 115 bool ContextGroup::Initialize(GLES2Decoder* decoder, | 119 bool ContextGroup::Initialize(GLES2Decoder* decoder, |
| 116 ContextType context_type, | 120 ContextType context_type, |
| 117 const DisallowedFeatures& disallowed_features) { | 121 const DisallowedFeatures& disallowed_features) { |
| 118 if (HaveContexts()) { | 122 if (HaveContexts()) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 } | 209 } |
| 206 | 210 |
| 207 buffer_manager_.reset( | 211 buffer_manager_.reset( |
| 208 new BufferManager(memory_tracker_.get(), feature_info_.get())); | 212 new BufferManager(memory_tracker_.get(), feature_info_.get())); |
| 209 framebuffer_manager_.reset(new FramebufferManager( | 213 framebuffer_manager_.reset(new FramebufferManager( |
| 210 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), | 214 max_draw_buffers_, max_color_attachments_, feature_info_->context_type(), |
| 211 framebuffer_completeness_cache_)); | 215 framebuffer_completeness_cache_)); |
| 212 renderbuffer_manager_.reset(new RenderbufferManager( | 216 renderbuffer_manager_.reset(new RenderbufferManager( |
| 213 memory_tracker_.get(), max_renderbuffer_size, max_samples, | 217 memory_tracker_.get(), max_renderbuffer_size, max_samples, |
| 214 feature_info_.get())); | 218 feature_info_.get())); |
| 215 shader_manager_.reset(new ShaderManager()); | 219 shader_manager_.reset(new ShaderManager(progress_reporter_)); |
| 216 sampler_manager_.reset(new SamplerManager(feature_info_.get())); | 220 sampler_manager_.reset(new SamplerManager(feature_info_.get())); |
| 217 | 221 |
| 218 // Lookup GL things we need to know. | 222 // Lookup GL things we need to know. |
| 219 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 223 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
| 220 if (!QueryGLFeatureU( | 224 if (!QueryGLFeatureU( |
| 221 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 225 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
| 222 &max_vertex_attribs_)) { | 226 &max_vertex_attribs_)) { |
| 223 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 227 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
| 224 << "vertex attributes supported (" << max_vertex_attribs_ | 228 << "vertex attributes supported (" << max_vertex_attribs_ |
| 225 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; | 229 << ", should be " << kGLES2RequiredMinimumVertexAttribs << ")."; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 296 |
| 293 if (feature_info_->workarounds().max_texture_size) { | 297 if (feature_info_->workarounds().max_texture_size) { |
| 294 max_texture_size = std::min( | 298 max_texture_size = std::min( |
| 295 max_texture_size, | 299 max_texture_size, |
| 296 feature_info_->workarounds().max_texture_size); | 300 feature_info_->workarounds().max_texture_size); |
| 297 max_rectangle_texture_size = std::min( | 301 max_rectangle_texture_size = std::min( |
| 298 max_rectangle_texture_size, | 302 max_rectangle_texture_size, |
| 299 feature_info_->workarounds().max_texture_size); | 303 feature_info_->workarounds().max_texture_size); |
| 300 } | 304 } |
| 301 | 305 |
| 302 texture_manager_.reset(new TextureManager(memory_tracker_.get(), | 306 texture_manager_.reset(new TextureManager( |
| 303 feature_info_.get(), | 307 memory_tracker_.get(), feature_info_.get(), max_texture_size, |
| 304 max_texture_size, | 308 max_cube_map_texture_size, max_rectangle_texture_size, |
| 305 max_cube_map_texture_size, | 309 max_3d_texture_size, max_array_texture_layers, bind_generates_resource_, |
| 306 max_rectangle_texture_size, | 310 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()); | 311 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); |
| 311 | 312 |
| 312 const GLint kMinTextureImageUnits = 8; | 313 const GLint kMinTextureImageUnits = 8; |
| 313 const GLint kMinVertexTextureImageUnits = 0; | 314 const GLint kMinVertexTextureImageUnits = 0; |
| 314 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, | 315 if (!QueryGLFeatureU(GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, |
| 315 &max_texture_image_units_)) { | 316 &max_texture_image_units_)) { |
| 316 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " | 317 DLOG(ERROR) << "ContextGroup::Initialize failed because too few " |
| 317 << "texture image units supported (" | 318 << "texture image units supported (" |
| 318 << max_texture_image_units_ | 319 << max_texture_image_units_ |
| 319 << ", should be " << kMinTextureImageUnits << ")."; | 320 << ", should be " << kMinTextureImageUnits << ")."; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " | 429 DLOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
| 429 << "cube texture size is too small (" | 430 << "cube texture size is too small (" |
| 430 << max_cube_map_texture_size << ", should be " | 431 << max_cube_map_texture_size << ", should be " |
| 431 << kES3MinCubeMapSize << ")."; | 432 << kES3MinCubeMapSize << ")."; |
| 432 return false; | 433 return false; |
| 433 } | 434 } |
| 434 } | 435 } |
| 435 | 436 |
| 436 path_manager_.reset(new PathManager()); | 437 path_manager_.reset(new PathManager()); |
| 437 | 438 |
| 438 program_manager_.reset( | 439 program_manager_.reset(new ProgramManager( |
| 439 new ProgramManager(program_cache_, | 440 program_cache_, max_varying_vectors_, max_draw_buffers_, |
| 440 max_varying_vectors_, | 441 max_dual_source_draw_buffers_, max_vertex_attribs_, gpu_preferences_, |
| 441 max_draw_buffers_, | 442 feature_info_.get(), progress_reporter_)); |
| 442 max_dual_source_draw_buffers_, | |
| 443 max_vertex_attribs_, | |
| 444 gpu_preferences_, | |
| 445 feature_info_.get())); | |
| 446 | 443 |
| 447 if (!texture_manager_->Initialize()) { | 444 if (!texture_manager_->Initialize()) { |
| 448 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " | 445 DLOG(ERROR) << "Context::Group::Initialize failed because texture manager " |
| 449 << "failed to initialize."; | 446 << "failed to initialize."; |
| 450 return false; | 447 return false; |
| 451 } | 448 } |
| 452 | 449 |
| 453 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); | 450 decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder)); |
| 454 return true; | 451 return true; |
| 455 } | 452 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 if (HaveContexts()) { | 486 if (HaveContexts()) { |
| 490 return; | 487 return; |
| 491 } | 488 } |
| 492 | 489 |
| 493 if (buffer_manager_ != nullptr) { | 490 if (buffer_manager_ != nullptr) { |
| 494 if (!have_context) { | 491 if (!have_context) { |
| 495 buffer_manager_->MarkContextLost(); | 492 buffer_manager_->MarkContextLost(); |
| 496 } | 493 } |
| 497 buffer_manager_->Destroy(); | 494 buffer_manager_->Destroy(); |
| 498 buffer_manager_.reset(); | 495 buffer_manager_.reset(); |
| 496 progress_reporter_->ReportProgress(); |
| 499 } | 497 } |
| 500 | 498 |
| 501 if (framebuffer_manager_ != NULL) { | 499 if (framebuffer_manager_ != NULL) { |
| 502 framebuffer_manager_->Destroy(have_context); | 500 framebuffer_manager_->Destroy(have_context); |
| 503 if (texture_manager_) | 501 if (texture_manager_) |
| 504 texture_manager_->set_framebuffer_manager(NULL); | 502 texture_manager_->set_framebuffer_manager(NULL); |
| 505 framebuffer_manager_.reset(); | 503 framebuffer_manager_.reset(); |
| 504 progress_reporter_->ReportProgress(); |
| 506 } | 505 } |
| 507 | 506 |
| 508 if (renderbuffer_manager_ != NULL) { | 507 if (renderbuffer_manager_ != NULL) { |
| 509 renderbuffer_manager_->Destroy(have_context); | 508 renderbuffer_manager_->Destroy(have_context); |
| 510 renderbuffer_manager_.reset(); | 509 renderbuffer_manager_.reset(); |
| 510 progress_reporter_->ReportProgress(); |
| 511 } | 511 } |
| 512 | 512 |
| 513 if (texture_manager_ != NULL) { | 513 if (texture_manager_ != NULL) { |
| 514 texture_manager_->Destroy(have_context); | 514 texture_manager_->Destroy(have_context); |
| 515 texture_manager_.reset(); | 515 texture_manager_.reset(); |
| 516 progress_reporter_->ReportProgress(); |
| 516 } | 517 } |
| 517 | 518 |
| 518 if (path_manager_ != NULL) { | 519 if (path_manager_ != NULL) { |
| 519 path_manager_->Destroy(have_context); | 520 path_manager_->Destroy(have_context); |
| 520 path_manager_.reset(); | 521 path_manager_.reset(); |
| 522 progress_reporter_->ReportProgress(); |
| 521 } | 523 } |
| 522 | 524 |
| 523 if (program_manager_ != NULL) { | 525 if (program_manager_ != NULL) { |
| 524 program_manager_->Destroy(have_context); | 526 program_manager_->Destroy(have_context); |
| 525 program_manager_.reset(); | 527 program_manager_.reset(); |
| 528 progress_reporter_->ReportProgress(); |
| 526 } | 529 } |
| 527 | 530 |
| 528 if (shader_manager_ != NULL) { | 531 if (shader_manager_ != NULL) { |
| 529 shader_manager_->Destroy(have_context); | 532 shader_manager_->Destroy(have_context); |
| 530 shader_manager_.reset(); | 533 shader_manager_.reset(); |
| 534 progress_reporter_->ReportProgress(); |
| 531 } | 535 } |
| 532 | 536 |
| 533 if (sampler_manager_ != NULL) { | 537 if (sampler_manager_ != NULL) { |
| 534 sampler_manager_->Destroy(have_context); | 538 sampler_manager_->Destroy(have_context); |
| 535 sampler_manager_.reset(); | 539 sampler_manager_.reset(); |
| 540 progress_reporter_->ReportProgress(); |
| 536 } | 541 } |
| 537 | 542 |
| 538 memory_tracker_ = NULL; | 543 memory_tracker_ = NULL; |
| 539 | 544 |
| 540 passthrough_resources_->Destroy(have_context); | 545 passthrough_resources_->Destroy(have_context); |
| 541 passthrough_resources_.reset(); | 546 passthrough_resources_.reset(); |
| 547 progress_reporter_->ReportProgress(); |
| 542 } | 548 } |
| 543 | 549 |
| 544 uint32_t ContextGroup::GetMemRepresented() const { | 550 uint32_t ContextGroup::GetMemRepresented() const { |
| 545 uint32_t total = 0; | 551 uint32_t total = 0; |
| 546 if (buffer_manager_.get()) | 552 if (buffer_manager_.get()) |
| 547 total += buffer_manager_->mem_represented(); | 553 total += buffer_manager_->mem_represented(); |
| 548 if (renderbuffer_manager_.get()) | 554 if (renderbuffer_manager_.get()) |
| 549 total += renderbuffer_manager_->mem_represented(); | 555 total += renderbuffer_manager_->mem_represented(); |
| 550 if (texture_manager_.get()) | 556 if (texture_manager_.get()) |
| 551 total += texture_manager_->mem_represented(); | 557 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 { | 613 GLuint client_id, GLuint* service_id) const { |
| 608 Buffer* buffer = buffer_manager_->GetBuffer(client_id); | 614 Buffer* buffer = buffer_manager_->GetBuffer(client_id); |
| 609 if (!buffer) | 615 if (!buffer) |
| 610 return false; | 616 return false; |
| 611 *service_id = buffer->service_id(); | 617 *service_id = buffer->service_id(); |
| 612 return true; | 618 return true; |
| 613 } | 619 } |
| 614 | 620 |
| 615 } // namespace gles2 | 621 } // namespace gles2 |
| 616 } // namespace gpu | 622 } // namespace gpu |
| OLD | NEW |