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 "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" | 5 #include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" |
6 | 6 |
7 #include <GLES2/gl2.h> | 7 #include <GLES2/gl2.h> |
8 #ifndef GL_GLEXT_PROTOTYPES | 8 #ifndef GL_GLEXT_PROTOTYPES |
9 #define GL_GLEXT_PROTOTYPES 1 | 9 #define GL_GLEXT_PROTOTYPES 1 |
10 #endif | 10 #endif |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
537 } | 537 } |
538 } | 538 } |
539 | 539 |
540 void GLInProcessContext::OnContextLost() { | 540 void GLInProcessContext::OnContextLost() { |
541 if (!context_lost_callback_.is_null()) | 541 if (!context_lost_callback_.is_null()) |
542 context_lost_callback_.Run(); | 542 context_lost_callback_.Run(); |
543 } | 543 } |
544 | 544 |
545 WebGraphicsContext3DInProcessCommandBufferImpl:: | 545 WebGraphicsContext3DInProcessCommandBufferImpl:: |
546 WebGraphicsContext3DInProcessCommandBufferImpl() | 546 WebGraphicsContext3DInProcessCommandBufferImpl() |
547 : context_(NULL), | 547 : pending_lazy_initialize_(false), |
548 context_(NULL), | |
548 gl_(NULL), | 549 gl_(NULL), |
549 context_lost_callback_(NULL), | 550 context_lost_callback_(NULL), |
550 context_lost_reason_(GL_NO_ERROR), | 551 context_lost_reason_(GL_NO_ERROR), |
551 cached_width_(0), | 552 cached_width_(0), |
552 cached_height_(0), | 553 cached_height_(0), |
553 bound_fbo_(0) { | 554 bound_fbo_(0) { |
554 } | 555 } |
555 | 556 |
556 WebGraphicsContext3DInProcessCommandBufferImpl:: | 557 WebGraphicsContext3DInProcessCommandBufferImpl:: |
557 ~WebGraphicsContext3DInProcessCommandBufferImpl() { | 558 ~WebGraphicsContext3DInProcessCommandBufferImpl() { |
558 base::AutoLock a(g_all_shared_contexts_lock.Get()); | 559 base::AutoLock a(g_all_shared_contexts_lock.Get()); |
559 g_all_shared_contexts.Pointer()->erase(this); | 560 g_all_shared_contexts.Pointer()->erase(this); |
560 } | 561 } |
561 | 562 |
562 bool WebGraphicsContext3DInProcessCommandBufferImpl::Initialize( | 563 bool WebGraphicsContext3DInProcessCommandBufferImpl::Initialize( |
563 WebGraphicsContext3D::Attributes attributes, | 564 const WebGraphicsContext3D::Attributes& attributes) { |
564 WebKit::WebGraphicsContext3D* view_context) { | 565 attributes_ = attributes; |
566 pending_lazy_initialize_ = true; | |
567 return true; | |
piman
2013/03/21 22:29:11
If Initialize doesn't do anything any more and can
boliu
2013/03/21 22:53:23
Done.
| |
568 } | |
569 | |
570 bool WebGraphicsContext3DInProcessCommandBufferImpl::DoInitialize() { | |
571 DCHECK(pending_lazy_initialize_); | |
572 | |
565 // Convert WebGL context creation attributes into GLInProcessContext / EGL | 573 // Convert WebGL context creation attributes into GLInProcessContext / EGL |
566 // size requests. | 574 // size requests. |
567 const int alpha_size = attributes.alpha ? 8 : 0; | 575 const int alpha_size = attributes_.alpha ? 8 : 0; |
568 const int depth_size = attributes.depth ? 24 : 0; | 576 const int depth_size = attributes_.depth ? 24 : 0; |
569 const int stencil_size = attributes.stencil ? 8 : 0; | 577 const int stencil_size = attributes_.stencil ? 8 : 0; |
570 const int samples = attributes.antialias ? 4 : 0; | 578 const int samples = attributes_.antialias ? 4 : 0; |
571 const int sample_buffers = attributes.antialias ? 1 : 0; | 579 const int sample_buffers = attributes_.antialias ? 1 : 0; |
572 const int32 attribs[] = { | 580 const int32 attribs[] = { |
573 GLInProcessContext::ALPHA_SIZE, alpha_size, | 581 GLInProcessContext::ALPHA_SIZE, alpha_size, |
574 GLInProcessContext::DEPTH_SIZE, depth_size, | 582 GLInProcessContext::DEPTH_SIZE, depth_size, |
575 GLInProcessContext::STENCIL_SIZE, stencil_size, | 583 GLInProcessContext::STENCIL_SIZE, stencil_size, |
576 GLInProcessContext::SAMPLES, samples, | 584 GLInProcessContext::SAMPLES, samples, |
577 GLInProcessContext::SAMPLE_BUFFERS, sample_buffers, | 585 GLInProcessContext::SAMPLE_BUFFERS, sample_buffers, |
578 GLInProcessContext::NONE, | 586 GLInProcessContext::NONE, |
579 }; | 587 }; |
580 | 588 |
581 const char* preferred_extensions = "*"; | 589 const char* preferred_extensions = "*"; |
582 | 590 |
583 // TODO(kbr): More work will be needed in this implementation to | 591 // TODO(kbr): More work will be needed in this implementation to |
584 // properly support GPU switching. Like in the out-of-process | 592 // properly support GPU switching. Like in the out-of-process |
585 // command buffer implementation, all previously created contexts | 593 // command buffer implementation, all previously created contexts |
586 // will need to be lost either when the first context requesting the | 594 // will need to be lost either when the first context requesting the |
587 // discrete GPU is created, or the last one is destroyed. | 595 // discrete GPU is created, or the last one is destroyed. |
588 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; | 596 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; |
589 | 597 |
590 GLInProcessContext* parent_context = NULL; | |
591 if (view_context) { | |
592 WebGraphicsContext3DInProcessCommandBufferImpl* context_impl = | |
593 static_cast<WebGraphicsContext3DInProcessCommandBufferImpl*>( | |
594 view_context); | |
595 parent_context = context_impl->context_; | |
596 } | |
597 | |
598 WebGraphicsContext3DInProcessCommandBufferImpl* context_group = NULL; | 598 WebGraphicsContext3DInProcessCommandBufferImpl* context_group = NULL; |
599 base::AutoLock lock(g_all_shared_contexts_lock.Get()); | 599 base::AutoLock lock(g_all_shared_contexts_lock.Get()); |
600 if (attributes.shareResources) | 600 if (attributes_.shareResources) |
601 context_group = g_all_shared_contexts.Pointer()->empty() ? | 601 context_group = g_all_shared_contexts.Pointer()->empty() ? |
602 NULL : *g_all_shared_contexts.Pointer()->begin(); | 602 NULL : *g_all_shared_contexts.Pointer()->begin(); |
603 | 603 |
604 context_ = GLInProcessContext::CreateOffscreenContext( | 604 context_ = GLInProcessContext::CreateOffscreenContext( |
605 parent_context, | 605 NULL, |
piman
2013/03/21 22:29:11
note: if we don't use parenting here any more, the
boliu
2013/03/21 22:53:23
Done.
| |
606 gfx::Size(1, 1), | 606 gfx::Size(1, 1), |
607 context_group ? context_group->context_ : NULL, | 607 context_group ? context_group->context_ : NULL, |
608 preferred_extensions, | 608 preferred_extensions, |
609 attribs, | 609 attribs, |
610 gpu_preference); | 610 gpu_preference); |
611 | 611 |
612 if (!context_) | 612 if (!context_) |
613 return false; | 613 return false; |
614 | 614 |
615 gl_ = context_->GetImplementation(); | 615 gl_ = context_->GetImplementation(); |
616 | 616 |
617 if (gl_ && attributes.noExtensions) | 617 if (gl_ && attributes_.noExtensions) |
618 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation"); | 618 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation"); |
619 | 619 |
620 context_->SetContextLostCallback( | 620 context_->SetContextLostCallback( |
621 base::Bind( | 621 base::Bind( |
622 &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, | 622 &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, |
623 base::Unretained(this))); | 623 base::Unretained(this))); |
624 | 624 |
625 // Set attributes_ from created offscreen context. | 625 // Set attributes_ from created offscreen context. |
626 { | 626 { |
627 attributes_ = attributes; | |
628 GLint alpha_bits = 0; | 627 GLint alpha_bits = 0; |
629 getIntegerv(GL_ALPHA_BITS, &alpha_bits); | 628 getIntegerv(GL_ALPHA_BITS, &alpha_bits); |
630 attributes_.alpha = alpha_bits > 0; | 629 attributes_.alpha = alpha_bits > 0; |
631 GLint depth_bits = 0; | 630 GLint depth_bits = 0; |
632 getIntegerv(GL_DEPTH_BITS, &depth_bits); | 631 getIntegerv(GL_DEPTH_BITS, &depth_bits); |
633 attributes_.depth = depth_bits > 0; | 632 attributes_.depth = depth_bits > 0; |
634 GLint stencil_bits = 0; | 633 GLint stencil_bits = 0; |
635 getIntegerv(GL_STENCIL_BITS, &stencil_bits); | 634 getIntegerv(GL_STENCIL_BITS, &stencil_bits); |
636 attributes_.stencil = stencil_bits > 0; | 635 attributes_.stencil = stencil_bits > 0; |
637 GLint sample_buffers = 0; | 636 GLint sample_buffers = 0; |
638 getIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers); | 637 getIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers); |
639 attributes_.antialias = sample_buffers > 0; | 638 attributes_.antialias = sample_buffers > 0; |
640 } | 639 } |
641 makeContextCurrent(); | |
642 | 640 |
643 if (attributes.shareResources) | 641 if (attributes_.shareResources) |
644 g_all_shared_contexts.Pointer()->insert(this); | 642 g_all_shared_contexts.Pointer()->insert(this); |
645 | 643 |
644 pending_lazy_initialize_ = false; | |
646 return true; | 645 return true; |
647 } | 646 } |
648 | 647 |
649 bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() { | 648 bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() { |
649 if (pending_lazy_initialize_ && !DoInitialize()) | |
650 return false; | |
651 | |
650 return GLInProcessContext::MakeCurrent(context_); | 652 return GLInProcessContext::MakeCurrent(context_); |
651 } | 653 } |
652 | 654 |
653 void WebGraphicsContext3DInProcessCommandBufferImpl::ClearContext() { | 655 void WebGraphicsContext3DInProcessCommandBufferImpl::ClearContext() { |
654 // NOTE: Comment in the line below to check for code that is not calling | 656 // NOTE: Comment in the line below to check for code that is not calling |
655 // eglMakeCurrent where appropriate. The issue is code using | 657 // eglMakeCurrent where appropriate. The issue is code using |
656 // WebGraphicsContext3D does not need to call makeContextCurrent. Code using | 658 // WebGraphicsContext3D does not need to call makeContextCurrent. Code using |
657 // direct OpenGL bindings needs to call the appropriate form of | 659 // direct OpenGL bindings needs to call the appropriate form of |
658 // eglMakeCurrent. If it doesn't it will be issuing commands on the wrong | 660 // eglMakeCurrent. If it doesn't it will be issuing commands on the wrong |
659 // context. Uncommenting the line below clears the current context so that | 661 // context. Uncommenting the line below clears the current context so that |
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1684 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*) | 1686 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*) |
1685 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM, | 1687 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM, |
1686 WGC3Denum, const WGC3Dbyte*) | 1688 WGC3Denum, const WGC3Dbyte*) |
1687 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM, | 1689 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM, |
1688 WGC3Denum, const WGC3Dbyte*) | 1690 WGC3Denum, const WGC3Dbyte*) |
1689 | 1691 |
1690 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, | 1692 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, |
1691 WGC3Dsizei, const WGC3Denum*) | 1693 WGC3Dsizei, const WGC3Denum*) |
1692 } // namespace gpu | 1694 } // namespace gpu |
1693 } // namespace webkit | 1695 } // namespace webkit |
OLD | NEW |