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

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

Issue 14048018: Add create WGC3DInProcessCommandBuffer for on-screen context (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove out-of-date comment. Created 7 years, 8 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
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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 82
83 // Terminate the library. This must be called after any other functions 83 // Terminate the library. This must be called after any other functions
84 // have completed. 84 // have completed.
85 static bool Terminate(); 85 static bool Terminate();
86 86
87 ~GLInProcessContext(); 87 ~GLInProcessContext();
88 88
89 void PumpCommands(); 89 void PumpCommands();
90 bool GetBufferChanged(int32 transfer_buffer_id); 90 bool GetBufferChanged(int32 transfer_buffer_id);
91 91
92 // Create a GLInProcessContext that renders to an offscreen frame buffer. If 92 // Create a GLInProcessContext, if |is_offscreen| is true, renders to an
93 // parent is not NULL, that GLInProcessContext can access a copy of the 93 // offscreen context. |attrib_list| must be NULL or a NONE-terminated list
94 // created GLInProcessContext's frame buffer that is updated every time 94 // of attribute/value pairs.
95 // SwapBuffers is called. It is not as general as shared GLInProcessContexts 95 static GLInProcessContext* CreateContext(
96 // in other implementations of OpenGL. If parent is not NULL, it must be used 96 bool is_offscreen,
97 // on the same thread as the parent. A child GLInProcessContext may not 97 gfx::AcceleratedWidget window,
98 // outlive its parent. attrib_list must be NULL or a NONE-terminated list of
99 // attribute/value pairs.
100 static GLInProcessContext* CreateOffscreenContext(
101 const gfx::Size& size, 98 const gfx::Size& size,
102 bool share_resources, 99 bool share_resources,
103 const char* allowed_extensions, 100 const char* allowed_extensions,
104 const int32* attrib_list, 101 const int32* attrib_list,
105 gfx::GpuPreference gpu_preference); 102 gfx::GpuPreference gpu_preference);
106 103
107 // For an offscreen frame buffer GLInProcessContext, return the texture ID 104 // For an offscreen frame buffer GLInProcessContext, return the texture ID
108 // with respect to the parent GLInProcessContext. Returns zero if 105 // with respect to the parent GLInProcessContext. Returns zero if
109 // GLInProcessContext does not have a parent. 106 // GLInProcessContext does not have a parent.
110 uint32 GetParentTextureId(); 107 uint32 GetParentTextureId();
(...skipping 30 matching lines...) Expand all
141 // problem communicating with the GPU process. 138 // problem communicating with the GPU process.
142 bool IsCommandBufferContextLost(); 139 bool IsCommandBufferContextLost();
143 140
144 CommandBufferService* GetCommandBufferService(); 141 CommandBufferService* GetCommandBufferService();
145 142
146 ::gpu::gles2::GLES2Decoder* GetDecoder(); 143 ::gpu::gles2::GLES2Decoder* GetDecoder();
147 144
148 private: 145 private:
149 explicit GLInProcessContext(bool share_resources); 146 explicit GLInProcessContext(bool share_resources);
150 147
151 bool Initialize(const gfx::Size& size, 148 bool Initialize(bool is_offscreen,
149 gfx::AcceleratedWidget window,
150 const gfx::Size& size,
152 const char* allowed_extensions, 151 const char* allowed_extensions,
153 const int32* attrib_list, 152 const int32* attrib_list,
154 gfx::GpuPreference gpu_preference); 153 gfx::GpuPreference gpu_preference);
155 void Destroy(); 154 void Destroy();
156 155
157 void OnContextLost(); 156 void OnContextLost();
158 157
159 base::Closure context_lost_callback_; 158 base::Closure context_lost_callback_;
160 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; 159 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_;
161 scoped_ptr<CommandBufferService> command_buffer_; 160 scoped_ptr<CommandBufferService> command_buffer_;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 200
202 static base::LazyInstance<GLES2Initializer> g_gles2_initializer = 201 static base::LazyInstance<GLES2Initializer> g_gles2_initializer =
203 LAZY_INSTANCE_INITIALIZER; 202 LAZY_INSTANCE_INITIALIZER;
204 203
205 } // namespace anonymous 204 } // namespace anonymous
206 205
207 GLInProcessContext::~GLInProcessContext() { 206 GLInProcessContext::~GLInProcessContext() {
208 Destroy(); 207 Destroy();
209 } 208 }
210 209
211 GLInProcessContext* GLInProcessContext::CreateOffscreenContext( 210 GLInProcessContext* GLInProcessContext::CreateContext(
211 bool is_offscreen,
212 gfx::AcceleratedWidget window,
212 const gfx::Size& size, 213 const gfx::Size& size,
213 bool share_resources, 214 bool share_resources,
214 const char* allowed_extensions, 215 const char* allowed_extensions,
215 const int32* attrib_list, 216 const int32* attrib_list,
216 gfx::GpuPreference gpu_preference) { 217 gfx::GpuPreference gpu_preference) {
217 scoped_ptr<GLInProcessContext> context( 218 scoped_ptr<GLInProcessContext> context(
218 new GLInProcessContext(share_resources)); 219 new GLInProcessContext(share_resources));
219 if (!context->Initialize( 220 if (!context->Initialize(
221 is_offscreen,
222 window,
220 size, 223 size,
221 allowed_extensions, 224 allowed_extensions,
222 attrib_list, 225 attrib_list,
223 gpu_preference)) 226 gpu_preference))
224 return NULL; 227 return NULL;
225 228
226 return context.release(); 229 return context.release();
227 } 230 }
228 231
229 // In the normal command buffer implementation, all commands are passed over IPC 232 // In the normal command buffer implementation, all commands are passed over IPC
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 GLES2Implementation* GLInProcessContext::GetImplementation() { 381 GLES2Implementation* GLInProcessContext::GetImplementation() {
379 return gles2_implementation_.get(); 382 return gles2_implementation_.get();
380 } 383 }
381 384
382 GLInProcessContext::GLInProcessContext(bool share_resources) 385 GLInProcessContext::GLInProcessContext(bool share_resources)
383 : last_error_(SUCCESS), 386 : last_error_(SUCCESS),
384 share_resources_(share_resources), 387 share_resources_(share_resources),
385 context_lost_(false) { 388 context_lost_(false) {
386 } 389 }
387 390
388 bool GLInProcessContext::Initialize(const gfx::Size& size, 391 bool GLInProcessContext::Initialize(
389 const char* allowed_extensions, 392 bool is_offscreen,
390 const int32* attrib_list, 393 gfx::AcceleratedWidget window,
391 gfx::GpuPreference gpu_preference) { 394 const gfx::Size& size,
395 const char* allowed_extensions,
396 const int32* attrib_list,
397 gfx::GpuPreference gpu_preference) {
392 // Use one share group for all contexts. 398 // Use one share group for all contexts.
393 CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group, 399 CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group,
394 (new gfx::GLShareGroup)); 400 (new gfx::GLShareGroup));
395 401
396 DCHECK(size.width() >= 0 && size.height() >= 0); 402 DCHECK(size.width() >= 0 && size.height() >= 0);
397 403
398 // Ensure the gles2 library is initialized first in a thread safe way. 404 // Ensure the gles2 library is initialized first in a thread safe way.
399 g_gles2_initializer.Get(); 405 g_gles2_initializer.Get();
400 406
401 std::vector<int32> attribs; 407 std::vector<int32> attribs;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 context_group->decoder_->GetContextGroup() : 460 context_group->decoder_->GetContextGroup() :
455 new ::gpu::gles2::ContextGroup( 461 new ::gpu::gles2::ContextGroup(
456 NULL, NULL, NULL, bind_generates_resource))); 462 NULL, NULL, NULL, bind_generates_resource)));
457 463
458 gpu_scheduler_.reset(new GpuScheduler(command_buffer_.get(), 464 gpu_scheduler_.reset(new GpuScheduler(command_buffer_.get(),
459 decoder_.get(), 465 decoder_.get(),
460 decoder_.get())); 466 decoder_.get()));
461 467
462 decoder_->set_engine(gpu_scheduler_.get()); 468 decoder_->set_engine(gpu_scheduler_.get());
463 469
464 surface_ = gfx::GLSurface::CreateOffscreenGLSurface(false, gfx::Size(1, 1)); 470 if (is_offscreen)
471 surface_ = gfx::GLSurface::CreateOffscreenGLSurface(false, size);
472 else
473 surface_ = gfx::GLSurface::CreateViewGLSurface(false, window);
465 474
466 if (!surface_.get()) { 475 if (!surface_.get()) {
467 LOG(ERROR) << "Could not create GLSurface."; 476 LOG(ERROR) << "Could not create GLSurface.";
468 Destroy(); 477 Destroy();
469 return false; 478 return false;
470 } 479 }
471 480
472 context_ = gfx::GLContext::CreateGLContext(share_group.get(), 481 context_ = gfx::GLContext::CreateGLContext(share_group.get(),
473 surface_.get(), 482 surface_.get(),
474 gpu_preference); 483 gpu_preference);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 } 576 }
568 577
569 g_all_shared_contexts.Pointer()->erase(this); 578 g_all_shared_contexts.Pointer()->erase(this);
570 } 579 }
571 580
572 void GLInProcessContext::OnContextLost() { 581 void GLInProcessContext::OnContextLost() {
573 if (!context_lost_callback_.is_null()) 582 if (!context_lost_callback_.is_null())
574 context_lost_callback_.Run(); 583 context_lost_callback_.Run();
575 } 584 }
576 585
586
587 // static
588 WebGraphicsContext3DInProcessCommandBufferImpl*
589 WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
590 const WebKit::WebGraphicsContext3D::Attributes& attributes,
591 gfx::AcceleratedWidget window) {
592 return new WebGraphicsContext3DInProcessCommandBufferImpl(
593 attributes, false, window);
594 }
595
596 // static
597 WebGraphicsContext3DInProcessCommandBufferImpl*
598 WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
599 const WebKit::WebGraphicsContext3D::Attributes& attributes) {
600 return new WebGraphicsContext3DInProcessCommandBufferImpl(
601 attributes, true, gfx::kNullAcceleratedWidget);
602 }
603
577 WebGraphicsContext3DInProcessCommandBufferImpl:: 604 WebGraphicsContext3DInProcessCommandBufferImpl::
578 WebGraphicsContext3DInProcessCommandBufferImpl( 605 WebGraphicsContext3DInProcessCommandBufferImpl(
579 const WebKit::WebGraphicsContext3D::Attributes& attributes) 606 const WebKit::WebGraphicsContext3D::Attributes& attributes,
580 : initialized_(false), 607 bool is_offscreen,
608 gfx::AcceleratedWidget window)
609 : is_offscreen_(is_offscreen),
610 window_(window),
611 initialized_(false),
581 initialize_failed_(false), 612 initialize_failed_(false),
582 context_(NULL), 613 context_(NULL),
583 gl_(NULL), 614 gl_(NULL),
584 context_lost_callback_(NULL), 615 context_lost_callback_(NULL),
585 context_lost_reason_(GL_NO_ERROR), 616 context_lost_reason_(GL_NO_ERROR),
586 attributes_(attributes), 617 attributes_(attributes),
587 cached_width_(0), 618 cached_width_(0),
588 cached_height_(0), 619 cached_height_(0),
589 bound_fbo_(0) { 620 bound_fbo_(0) {
590 } 621 }
(...skipping 27 matching lines...) Expand all
618 649
619 const char* preferred_extensions = "*"; 650 const char* preferred_extensions = "*";
620 651
621 // TODO(kbr): More work will be needed in this implementation to 652 // TODO(kbr): More work will be needed in this implementation to
622 // properly support GPU switching. Like in the out-of-process 653 // properly support GPU switching. Like in the out-of-process
623 // command buffer implementation, all previously created contexts 654 // command buffer implementation, all previously created contexts
624 // will need to be lost either when the first context requesting the 655 // will need to be lost either when the first context requesting the
625 // discrete GPU is created, or the last one is destroyed. 656 // discrete GPU is created, or the last one is destroyed.
626 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; 657 gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
627 658
628 context_ = GLInProcessContext::CreateOffscreenContext( 659 context_ = GLInProcessContext::CreateContext(
660 is_offscreen_,
661 window_,
629 gfx::Size(1, 1), 662 gfx::Size(1, 1),
630 attributes_.shareResources, 663 attributes_.shareResources,
631 preferred_extensions, 664 preferred_extensions,
632 attribs, 665 attribs,
633 gpu_preference); 666 gpu_preference);
634 667
635 if (!context_) { 668 if (!context_) {
636 initialize_failed_ = true; 669 initialize_failed_ = true;
637 return false; 670 return false;
638 } 671 }
(...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after
1716 1749
1717 DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM, 1750 DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM,
1718 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, 1751 WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei,
1719 WGC3Denum, WGC3Denum, const void*) 1752 WGC3Denum, WGC3Denum, const void*)
1720 1753
1721 DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM, 1754 DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM,
1722 WGC3Denum) 1755 WGC3Denum)
1723 1756
1724 } // namespace gpu 1757 } // namespace gpu
1725 } // namespace webkit 1758 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h ('k') | webkit/support/test_webkit_platform_support.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698