Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: trunk/src/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc

Issue 12915008: Revert 189820 "Lazy initialize WGC3DInProcessCommandBufferImpl". Causing checkfailures. (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 91
92 // Create a GLInProcessContext that renders to an offscreen frame buffer. If 92 // Create a GLInProcessContext that renders to an offscreen frame buffer. If
93 // parent is not NULL, that GLInProcessContext can access a copy of the 93 // parent is not NULL, that GLInProcessContext can access a copy of the
94 // created GLInProcessContext's frame buffer that is updated every time 94 // created GLInProcessContext's frame buffer that is updated every time
95 // SwapBuffers is called. It is not as general as shared GLInProcessContexts 95 // SwapBuffers is called. It is not as general as shared GLInProcessContexts
96 // in other implementations of OpenGL. If parent is not NULL, it must be used 96 // in other implementations of OpenGL. If parent is not NULL, it must be used
97 // on the same thread as the parent. A child GLInProcessContext may not 97 // on the same thread as the parent. A child GLInProcessContext may not
98 // outlive its parent. attrib_list must be NULL or a NONE-terminated list of 98 // outlive its parent. attrib_list must be NULL or a NONE-terminated list of
99 // attribute/value pairs. 99 // attribute/value pairs.
100 static GLInProcessContext* CreateOffscreenContext( 100 static GLInProcessContext* CreateOffscreenContext(
101 GLInProcessContext* parent,
101 const gfx::Size& size, 102 const gfx::Size& size,
102 GLInProcessContext* context_group, 103 GLInProcessContext* context_group,
103 const char* allowed_extensions, 104 const char* allowed_extensions,
104 const int32* attrib_list, 105 const int32* attrib_list,
105 gfx::GpuPreference gpu_preference); 106 gfx::GpuPreference gpu_preference);
106 107
107 // For an offscreen frame buffer GLInProcessContext, return the texture ID 108 // For an offscreen frame buffer GLInProcessContext, return the texture ID
108 // with respect to the parent GLInProcessContext. Returns zero if 109 // with respect to the parent GLInProcessContext. Returns zero if
109 // GLInProcessContext does not have a parent. 110 // GLInProcessContext does not have a parent.
110 uint32 GetParentTextureId(); 111 uint32 GetParentTextureId();
(...skipping 26 matching lines...) Expand all
137 // Return the current error. 138 // Return the current error.
138 Error GetError(); 139 Error GetError();
139 140
140 // Return true if GPU process reported GLInProcessContext lost or there was a 141 // Return true if GPU process reported GLInProcessContext lost or there was a
141 // problem communicating with the GPU process. 142 // problem communicating with the GPU process.
142 bool IsCommandBufferContextLost(); 143 bool IsCommandBufferContextLost();
143 144
144 CommandBufferService* GetCommandBufferService(); 145 CommandBufferService* GetCommandBufferService();
145 146
146 private: 147 private:
147 GLInProcessContext(); 148 explicit GLInProcessContext(GLInProcessContext* parent);
148 149
149 bool Initialize(const gfx::Size& size, 150 bool Initialize(const gfx::Size& size,
150 GLInProcessContext* context_group, 151 GLInProcessContext* context_group,
151 const char* allowed_extensions, 152 const char* allowed_extensions,
152 const int32* attrib_list, 153 const int32* attrib_list,
153 gfx::GpuPreference gpu_preference); 154 gfx::GpuPreference gpu_preference);
154 void Destroy(); 155 void Destroy();
155 156
156 void OnContextLost(); 157 void OnContextLost();
157 158
159 base::WeakPtr<GLInProcessContext> parent_;
158 base::Closure context_lost_callback_; 160 base::Closure context_lost_callback_;
161 uint32 parent_texture_id_;
159 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; 162 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_;
160 scoped_ptr<CommandBufferService> command_buffer_; 163 scoped_ptr<CommandBufferService> command_buffer_;
161 scoped_ptr< ::gpu::GpuScheduler> gpu_scheduler_; 164 scoped_ptr< ::gpu::GpuScheduler> gpu_scheduler_;
162 scoped_ptr< ::gpu::gles2::GLES2Decoder> decoder_; 165 scoped_ptr< ::gpu::gles2::GLES2Decoder> decoder_;
163 scoped_refptr<gfx::GLContext> context_; 166 scoped_refptr<gfx::GLContext> context_;
164 scoped_refptr<gfx::GLSurface> surface_; 167 scoped_refptr<gfx::GLSurface> surface_;
165 scoped_ptr<GLES2CmdHelper> gles2_helper_; 168 scoped_ptr<GLES2CmdHelper> gles2_helper_;
166 scoped_ptr<TransferBuffer> transfer_buffer_; 169 scoped_ptr<TransferBuffer> transfer_buffer_;
167 scoped_ptr<GLES2Implementation> gles2_implementation_; 170 scoped_ptr<GLES2Implementation> gles2_implementation_;
168 Error last_error_; 171 Error last_error_;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 static base::LazyInstance<GLES2Initializer> g_gles2_initializer = 209 static base::LazyInstance<GLES2Initializer> g_gles2_initializer =
207 LAZY_INSTANCE_INITIALIZER; 210 LAZY_INSTANCE_INITIALIZER;
208 211
209 } // namespace anonymous 212 } // namespace anonymous
210 213
211 GLInProcessContext::~GLInProcessContext() { 214 GLInProcessContext::~GLInProcessContext() {
212 Destroy(); 215 Destroy();
213 } 216 }
214 217
215 GLInProcessContext* GLInProcessContext::CreateOffscreenContext( 218 GLInProcessContext* GLInProcessContext::CreateOffscreenContext(
219 GLInProcessContext* parent,
216 const gfx::Size& size, 220 const gfx::Size& size,
217 GLInProcessContext* context_group, 221 GLInProcessContext* context_group,
218 const char* allowed_extensions, 222 const char* allowed_extensions,
219 const int32* attrib_list, 223 const int32* attrib_list,
220 gfx::GpuPreference gpu_preference) { 224 gfx::GpuPreference gpu_preference) {
221 scoped_ptr<GLInProcessContext> context(new GLInProcessContext); 225 scoped_ptr<GLInProcessContext> context(new GLInProcessContext(parent));
222 if (!context->Initialize( 226 if (!context->Initialize(
223 size, 227 size,
224 context_group, 228 context_group,
225 allowed_extensions, 229 allowed_extensions,
226 attrib_list, 230 attrib_list,
227 gpu_preference)) 231 gpu_preference))
228 return NULL; 232 return NULL;
229 233
230 return context.release(); 234 return context.release();
231 } 235 }
(...skipping 16 matching lines...) Expand all
248 context_lost_ = true; 252 context_lost_ = true;
249 } 253 }
250 } 254 }
251 } 255 }
252 256
253 bool GLInProcessContext::GetBufferChanged(int32 transfer_buffer_id) { 257 bool GLInProcessContext::GetBufferChanged(int32 transfer_buffer_id) {
254 return gpu_scheduler_->SetGetBuffer(transfer_buffer_id); 258 return gpu_scheduler_->SetGetBuffer(transfer_buffer_id);
255 } 259 }
256 260
257 uint32 GLInProcessContext::GetParentTextureId() { 261 uint32 GLInProcessContext::GetParentTextureId() {
258 return 0; 262 return parent_texture_id_;
259 } 263 }
260 264
261 uint32 GLInProcessContext::CreateParentTexture(const gfx::Size& size) { 265 uint32 GLInProcessContext::CreateParentTexture(const gfx::Size& size) {
262 uint32 texture = 0; 266 uint32 texture = 0;
263 gles2_implementation_->GenTextures(1, &texture); 267 gles2_implementation_->GenTextures(1, &texture);
264 gles2_implementation_->Flush(); 268 gles2_implementation_->Flush();
265 return texture; 269 return texture;
266 } 270 }
267 271
268 void GLInProcessContext::DeleteParentTexture(uint32 texture) { 272 void GLInProcessContext::DeleteParentTexture(uint32 texture) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 334
331 // TODO(gman): Remove This 335 // TODO(gman): Remove This
332 void GLInProcessContext::DisableShaderTranslation() { 336 void GLInProcessContext::DisableShaderTranslation() {
333 NOTREACHED(); 337 NOTREACHED();
334 } 338 }
335 339
336 GLES2Implementation* GLInProcessContext::GetImplementation() { 340 GLES2Implementation* GLInProcessContext::GetImplementation() {
337 return gles2_implementation_.get(); 341 return gles2_implementation_.get();
338 } 342 }
339 343
340 GLInProcessContext::GLInProcessContext() 344 GLInProcessContext::GLInProcessContext(GLInProcessContext* parent)
341 : last_error_(SUCCESS), 345 : parent_(parent ?
346 parent->AsWeakPtr() : base::WeakPtr<GLInProcessContext>()),
347 parent_texture_id_(0),
348 last_error_(SUCCESS),
342 context_lost_(false) { 349 context_lost_(false) {
343 } 350 }
344 351
345 bool GLInProcessContext::Initialize(const gfx::Size& size, 352 bool GLInProcessContext::Initialize(const gfx::Size& size,
346 GLInProcessContext* context_group, 353 GLInProcessContext* context_group,
347 const char* allowed_extensions, 354 const char* allowed_extensions,
348 const int32* attrib_list, 355 const int32* attrib_list,
349 gfx::GpuPreference gpu_preference) { 356 gfx::GpuPreference gpu_preference) {
350 // Use one share group for all contexts. 357 // Use one share group for all contexts.
351 CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group, 358 CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group,
352 (new gfx::GLShareGroup)); 359 (new gfx::GLShareGroup));
353 360
354 DCHECK(size.width() >= 0 && size.height() >= 0); 361 DCHECK(size.width() >= 0 && size.height() >= 0);
355 362
356 // Ensure the gles2 library is initialized first in a thread safe way. 363 // Ensure the gles2 library is initialized first in a thread safe way.
357 g_gles2_initializer.Get(); 364 g_gles2_initializer.Get();
358 365
366 // Allocate a frame buffer ID with respect to the parent.
367 if (parent_.get()) {
368 // Flush any remaining commands in the parent context to make sure the
369 // texture id accounting stays consistent.
370 int32 token = parent_->gles2_helper_->InsertToken();
371 parent_->gles2_helper_->WaitForToken(token);
372 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId();
373 }
374
359 std::vector<int32> attribs; 375 std::vector<int32> attribs;
360 while (attrib_list) { 376 while (attrib_list) {
361 int32 attrib = *attrib_list++; 377 int32 attrib = *attrib_list++;
362 switch (attrib) { 378 switch (attrib) {
363 // Known attributes 379 // Known attributes
364 case ALPHA_SIZE: 380 case ALPHA_SIZE:
365 case BLUE_SIZE: 381 case BLUE_SIZE:
366 case GREEN_SIZE: 382 case GREEN_SIZE:
367 case RED_SIZE: 383 case RED_SIZE:
368 case DEPTH_SIZE: 384 case DEPTH_SIZE:
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 true, 458 true,
443 size, 459 size,
444 disallowed_features, 460 disallowed_features,
445 allowed_extensions, 461 allowed_extensions,
446 attribs)) { 462 attribs)) {
447 LOG(ERROR) << "Could not initialize decoder."; 463 LOG(ERROR) << "Could not initialize decoder.";
448 Destroy(); 464 Destroy();
449 return false; 465 return false;
450 } 466 }
451 467
468 if (!decoder_->SetParent(
469 parent_.get() ? parent_->decoder_.get() : NULL,
470 parent_texture_id_)) {
471 LOG(ERROR) << "Could not set parent.";
472 Destroy();
473 return false;
474 }
475
452 command_buffer_->SetPutOffsetChangeCallback( 476 command_buffer_->SetPutOffsetChangeCallback(
453 base::Bind(&GLInProcessContext::PumpCommands, base::Unretained(this))); 477 base::Bind(&GLInProcessContext::PumpCommands, base::Unretained(this)));
454 command_buffer_->SetGetBufferChangeCallback( 478 command_buffer_->SetGetBufferChangeCallback(
455 base::Bind( 479 base::Bind(
456 &GLInProcessContext::GetBufferChanged, base::Unretained(this))); 480 &GLInProcessContext::GetBufferChanged, base::Unretained(this)));
457 command_buffer_->SetParseErrorCallback( 481 command_buffer_->SetParseErrorCallback(
458 base::Bind(&GLInProcessContext::OnContextLost, base::Unretained(this))); 482 base::Bind(&GLInProcessContext::OnContextLost, base::Unretained(this)));
459 483
460 // Create the GLES2 helper, which writes the command buffer protocol. 484 // Create the GLES2 helper, which writes the command buffer protocol.
461 gles2_helper_.reset(new GLES2CmdHelper(command_buffer_.get())); 485 gles2_helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
(...skipping 19 matching lines...) Expand all
481 kMaxTransferBufferSize)) { 505 kMaxTransferBufferSize)) {
482 return false; 506 return false;
483 } 507 }
484 508
485 return true; 509 return true;
486 } 510 }
487 511
488 void GLInProcessContext::Destroy() { 512 void GLInProcessContext::Destroy() {
489 bool context_lost = IsCommandBufferContextLost(); 513 bool context_lost = IsCommandBufferContextLost();
490 514
515 if (parent_.get() && parent_texture_id_ != 0) {
516 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_);
517 parent_texture_id_ = 0;
518 }
519
491 if (gles2_implementation_.get()) { 520 if (gles2_implementation_.get()) {
492 // First flush the context to ensure that any pending frees of resources 521 // First flush the context to ensure that any pending frees of resources
493 // are completed. Otherwise, if this context is part of a share group, 522 // are completed. Otherwise, if this context is part of a share group,
494 // those resources might leak. Also, any remaining side effects of commands 523 // those resources might leak. Also, any remaining side effects of commands
495 // issued on this context might not be visible to other contexts in the 524 // issued on this context might not be visible to other contexts in the
496 // share group. 525 // share group.
497 gles2_implementation_->Flush(); 526 gles2_implementation_->Flush();
498 527
499 gles2_implementation_.reset(); 528 gles2_implementation_.reset();
500 } 529 }
501 530
502 transfer_buffer_.reset(); 531 transfer_buffer_.reset();
503 gles2_helper_.reset(); 532 gles2_helper_.reset();
504 command_buffer_.reset(); 533 command_buffer_.reset();
505 534
506 if (decoder_.get()) { 535 if (decoder_.get()) {
507 decoder_->Destroy(!context_lost); 536 decoder_->Destroy(!context_lost);
508 } 537 }
509 } 538 }
510 539
511 void GLInProcessContext::OnContextLost() { 540 void GLInProcessContext::OnContextLost() {
512 if (!context_lost_callback_.is_null()) 541 if (!context_lost_callback_.is_null())
513 context_lost_callback_.Run(); 542 context_lost_callback_.Run();
514 } 543 }
515 544
516 WebGraphicsContext3DInProcessCommandBufferImpl:: 545 WebGraphicsContext3DInProcessCommandBufferImpl::
517 WebGraphicsContext3DInProcessCommandBufferImpl( 546 WebGraphicsContext3DInProcessCommandBufferImpl()
518 const WebKit::WebGraphicsContext3D::Attributes& attributes) 547 : context_(NULL),
519 : initialized_(false),
520 initialize_failed_(false),
521 context_(NULL),
522 gl_(NULL), 548 gl_(NULL),
523 context_lost_callback_(NULL), 549 context_lost_callback_(NULL),
524 context_lost_reason_(GL_NO_ERROR), 550 context_lost_reason_(GL_NO_ERROR),
525 attributes_(attributes),
526 cached_width_(0), 551 cached_width_(0),
527 cached_height_(0), 552 cached_height_(0),
528 bound_fbo_(0) { 553 bound_fbo_(0) {
529 } 554 }
530 555
531 WebGraphicsContext3DInProcessCommandBufferImpl:: 556 WebGraphicsContext3DInProcessCommandBufferImpl::
532 ~WebGraphicsContext3DInProcessCommandBufferImpl() { 557 ~WebGraphicsContext3DInProcessCommandBufferImpl() {
533 base::AutoLock a(g_all_shared_contexts_lock.Get()); 558 base::AutoLock a(g_all_shared_contexts_lock.Get());
534 g_all_shared_contexts.Pointer()->erase(this); 559 g_all_shared_contexts.Pointer()->erase(this);
535 } 560 }
536 561
537 bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() { 562 bool WebGraphicsContext3DInProcessCommandBufferImpl::Initialize(
538 if (initialized_) 563 WebGraphicsContext3D::Attributes attributes,
539 return true; 564 WebKit::WebGraphicsContext3D* view_context) {
540
541 if (initialize_failed_)
542 return false;
543
544 // Convert WebGL context creation attributes into GLInProcessContext / EGL 565 // Convert WebGL context creation attributes into GLInProcessContext / EGL
545 // size requests. 566 // size requests.
546 const int alpha_size = attributes_.alpha ? 8 : 0; 567 const int alpha_size = attributes.alpha ? 8 : 0;
547 const int depth_size = attributes_.depth ? 24 : 0; 568 const int depth_size = attributes.depth ? 24 : 0;
548 const int stencil_size = attributes_.stencil ? 8 : 0; 569 const int stencil_size = attributes.stencil ? 8 : 0;
549 const int samples = attributes_.antialias ? 4 : 0; 570 const int samples = attributes.antialias ? 4 : 0;
550 const int sample_buffers = attributes_.antialias ? 1 : 0; 571 const int sample_buffers = attributes.antialias ? 1 : 0;
551 const int32 attribs[] = { 572 const int32 attribs[] = {
552 GLInProcessContext::ALPHA_SIZE, alpha_size, 573 GLInProcessContext::ALPHA_SIZE, alpha_size,
553 GLInProcessContext::DEPTH_SIZE, depth_size, 574 GLInProcessContext::DEPTH_SIZE, depth_size,
554 GLInProcessContext::STENCIL_SIZE, stencil_size, 575 GLInProcessContext::STENCIL_SIZE, stencil_size,
555 GLInProcessContext::SAMPLES, samples, 576 GLInProcessContext::SAMPLES, samples,
556 GLInProcessContext::SAMPLE_BUFFERS, sample_buffers, 577 GLInProcessContext::SAMPLE_BUFFERS, sample_buffers,
557 GLInProcessContext::NONE, 578 GLInProcessContext::NONE,
558 }; 579 };
559 580
560 const char* preferred_extensions = "*"; 581 const char* preferred_extensions = "*";
561 582
562 // TODO(kbr): More work will be needed in this implementation to 583 // TODO(kbr): More work will be needed in this implementation to
563 // properly support GPU switching. Like in the out-of-process 584 // properly support GPU switching. Like in the out-of-process
564 // command buffer implementation, all previously created contexts 585 // command buffer implementation, all previously created contexts
565 // will need to be lost either when the first context requesting the 586 // will need to be lost either when the first context requesting the
566 // discrete GPU is created, or the last one is destroyed. 587 // discrete GPU is created, or the last one is destroyed.
567 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; 588 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
568 589
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
569 WebGraphicsContext3DInProcessCommandBufferImpl* context_group = NULL; 598 WebGraphicsContext3DInProcessCommandBufferImpl* context_group = NULL;
570 base::AutoLock lock(g_all_shared_contexts_lock.Get()); 599 base::AutoLock lock(g_all_shared_contexts_lock.Get());
571 if (attributes_.shareResources) 600 if (attributes.shareResources)
572 context_group = g_all_shared_contexts.Pointer()->empty() ? 601 context_group = g_all_shared_contexts.Pointer()->empty() ?
573 NULL : *g_all_shared_contexts.Pointer()->begin(); 602 NULL : *g_all_shared_contexts.Pointer()->begin();
574 603
575 context_ = GLInProcessContext::CreateOffscreenContext( 604 context_ = GLInProcessContext::CreateOffscreenContext(
605 parent_context,
576 gfx::Size(1, 1), 606 gfx::Size(1, 1),
577 context_group ? context_group->context_ : NULL, 607 context_group ? context_group->context_ : NULL,
578 preferred_extensions, 608 preferred_extensions,
579 attribs, 609 attribs,
580 gpu_preference); 610 gpu_preference);
581 611
582 if (!context_) { 612 if (!context_)
583 initialize_failed_ = true;
584 return false; 613 return false;
585 }
586 614
587 gl_ = context_->GetImplementation(); 615 gl_ = context_->GetImplementation();
588 616
589 if (gl_ && attributes_.noExtensions) 617 if (gl_ && attributes.noExtensions)
590 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation"); 618 gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation");
591 619
592 context_->SetContextLostCallback( 620 context_->SetContextLostCallback(
593 base::Bind( 621 base::Bind(
594 &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, 622 &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost,
595 base::Unretained(this))); 623 base::Unretained(this)));
596 624
597 // Set attributes_ from created offscreen context. 625 // Set attributes_ from created offscreen context.
598 { 626 {
627 attributes_ = attributes;
599 GLint alpha_bits = 0; 628 GLint alpha_bits = 0;
600 getIntegerv(GL_ALPHA_BITS, &alpha_bits); 629 getIntegerv(GL_ALPHA_BITS, &alpha_bits);
601 attributes_.alpha = alpha_bits > 0; 630 attributes_.alpha = alpha_bits > 0;
602 GLint depth_bits = 0; 631 GLint depth_bits = 0;
603 getIntegerv(GL_DEPTH_BITS, &depth_bits); 632 getIntegerv(GL_DEPTH_BITS, &depth_bits);
604 attributes_.depth = depth_bits > 0; 633 attributes_.depth = depth_bits > 0;
605 GLint stencil_bits = 0; 634 GLint stencil_bits = 0;
606 getIntegerv(GL_STENCIL_BITS, &stencil_bits); 635 getIntegerv(GL_STENCIL_BITS, &stencil_bits);
607 attributes_.stencil = stencil_bits > 0; 636 attributes_.stencil = stencil_bits > 0;
608 GLint sample_buffers = 0; 637 GLint sample_buffers = 0;
609 getIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers); 638 getIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers);
610 attributes_.antialias = sample_buffers > 0; 639 attributes_.antialias = sample_buffers > 0;
611 } 640 }
641 makeContextCurrent();
612 642
613 if (attributes_.shareResources) 643 if (attributes.shareResources)
614 g_all_shared_contexts.Pointer()->insert(this); 644 g_all_shared_contexts.Pointer()->insert(this);
615 645
616 initialized_ = true;
617 return true; 646 return true;
618 } 647 }
619 648
620 bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() { 649 bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() {
621 if (!MaybeInitializeGL())
622 return false;
623
624 return GLInProcessContext::MakeCurrent(context_); 650 return GLInProcessContext::MakeCurrent(context_);
625 } 651 }
626 652
627 void WebGraphicsContext3DInProcessCommandBufferImpl::ClearContext() { 653 void WebGraphicsContext3DInProcessCommandBufferImpl::ClearContext() {
628 // NOTE: Comment in the line below to check for code that is not calling 654 // NOTE: Comment in the line below to check for code that is not calling
629 // eglMakeCurrent where appropriate. The issue is code using 655 // eglMakeCurrent where appropriate. The issue is code using
630 // WebGraphicsContext3D does not need to call makeContextCurrent. Code using 656 // WebGraphicsContext3D does not need to call makeContextCurrent. Code using
631 // direct OpenGL bindings needs to call the appropriate form of 657 // direct OpenGL bindings needs to call the appropriate form of
632 // eglMakeCurrent. If it doesn't it will be issuing commands on the wrong 658 // eglMakeCurrent. If it doesn't it will be issuing commands on the wrong
633 // context. Uncommenting the line below clears the current context so that 659 // context. Uncommenting the line below clears the current context so that
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*) 1684 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*)
1659 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM, 1685 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM,
1660 WGC3Denum, const WGC3Dbyte*) 1686 WGC3Denum, const WGC3Dbyte*)
1661 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM, 1687 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM,
1662 WGC3Denum, const WGC3Dbyte*) 1688 WGC3Denum, const WGC3Dbyte*)
1663 1689
1664 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT, 1690 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT,
1665 WGC3Dsizei, const WGC3Denum*) 1691 WGC3Dsizei, const WGC3Denum*)
1666 } // namespace gpu 1692 } // namespace gpu
1667 } // namespace webkit 1693 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698