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

Side by Side Diff: chrome/renderer/ggl/ggl.cc

Issue 3531008: Integrated Pepper3D v2 with the accelerated compositor.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include "base/ref_counted.h" 7 #include "base/ref_counted.h"
8 #include "base/singleton.h" 8 #include "base/singleton.h"
9 #include "base/thread_local.h"
10 #include "base/weak_ptr.h" 9 #include "base/weak_ptr.h"
11 #include "chrome/renderer/command_buffer_proxy.h" 10 #include "chrome/renderer/command_buffer_proxy.h"
12 #include "chrome/renderer/ggl/ggl.h" 11 #include "chrome/renderer/ggl/ggl.h"
13 #include "chrome/renderer/gpu_channel_host.h" 12 #include "chrome/renderer/gpu_channel_host.h"
14 #include "chrome/renderer/gpu_video_service_host.h" 13 #include "chrome/renderer/gpu_video_service_host.h"
15 #include "chrome/renderer/media/gles2_video_decode_context.h" 14 #include "chrome/renderer/media/gles2_video_decode_context.h"
16 #include "chrome/renderer/render_widget.h" 15 #include "chrome/renderer/render_widget.h"
17 #include "ipc/ipc_channel_handle.h" 16 #include "ipc/ipc_channel_handle.h"
18 17
19 #if defined(ENABLE_GPU) 18 #if defined(ENABLE_GPU)
20 #include "gpu/command_buffer/client/gles2_cmd_helper.h" 19 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
21 #include "gpu/command_buffer/client/gles2_implementation.h" 20 #include "gpu/command_buffer/client/gles2_implementation.h"
22 #include "gpu/command_buffer/client/gles2_lib.h" 21 #include "gpu/command_buffer/client/gles2_lib.h"
23 #include "gpu/command_buffer/common/constants.h" 22 #include "gpu/command_buffer/common/constants.h"
24 #include "gpu/GLES2/gles2_command_buffer.h" 23 #include "gpu/GLES2/gles2_command_buffer.h"
25 #endif // ENABLE_GPU 24 #endif // ENABLE_GPU
26 25
27 namespace ggl { 26 namespace ggl {
28 27
29 #if defined(ENABLE_GPU) 28 #if defined(ENABLE_GPU)
30 29
31 namespace { 30 namespace {
32 31
33 const int32 kCommandBufferSize = 1024 * 1024; 32 const int32 kCommandBufferSize = 1024 * 1024;
34 // TODO(kbr): make the transfer buffer size configurable via context 33 // TODO(kbr): make the transfer buffer size configurable via context
35 // creation attributes. 34 // creation attributes.
36 const int32 kTransferBufferSize = 1024 * 1024; 35 const int32 kTransferBufferSize = 1024 * 1024;
37 36
38 base::ThreadLocalPointer<Context> g_current_context;
39
40 // Singleton used to initialize and terminate the gles2 library. 37 // Singleton used to initialize and terminate the gles2 library.
41 class GLES2Initializer { 38 class GLES2Initializer {
42 public: 39 public:
43 GLES2Initializer() { 40 GLES2Initializer() {
44 gles2::Initialize(); 41 gles2::Initialize();
45 } 42 }
46 43
47 ~GLES2Initializer() { 44 ~GLES2Initializer() {
48 gles2::Terminate(); 45 gles2::Terminate();
49 } 46 }
(...skipping 20 matching lines...) Expand all
70 #if defined(OS_MACOSX) 67 #if defined(OS_MACOSX)
71 // Asynchronously resizes an onscreen frame buffer. 68 // Asynchronously resizes an onscreen frame buffer.
72 void ResizeOnscreen(const gfx::Size& size); 69 void ResizeOnscreen(const gfx::Size& size);
73 #endif 70 #endif
74 71
75 // Asynchronously resizes an offscreen frame buffer. 72 // Asynchronously resizes an offscreen frame buffer.
76 void ResizeOffscreen(const gfx::Size& size); 73 void ResizeOffscreen(const gfx::Size& size);
77 74
78 // Provides a callback that will be invoked when SwapBuffers has completed 75 // Provides a callback that will be invoked when SwapBuffers has completed
79 // service side. 76 // service side.
80 void SetSwapBuffersCallback(Callback1<Context*>::Type* callback) { 77 void SetSwapBuffersCallback(Callback0::Type* callback) {
81 swap_buffers_callback_.reset(callback); 78 swap_buffers_callback_.reset(callback);
82 } 79 }
83 80
84 // For an offscreen frame buffer context, return the frame buffer ID with 81 // For an offscreen frame buffer context, return the frame buffer ID with
85 // respect to the parent. 82 // respect to the parent.
86 uint32 parent_texture_id() const { 83 uint32 parent_texture_id() const {
87 return parent_texture_id_; 84 return parent_texture_id_;
88 } 85 }
89 86
90 uint32 CreateParentTexture(const gfx::Size& size) const; 87 uint32 CreateParentTexture(const gfx::Size& size) const;
(...skipping 19 matching lines...) Expand all
110 107
111 // Get the current error code. Clears context's error code afterwards. 108 // Get the current error code. Clears context's error code afterwards.
112 Error GetError(); 109 Error GetError();
113 110
114 // Replace the current error code with this. 111 // Replace the current error code with this.
115 void SetError(Error error); 112 void SetError(Error error);
116 113
117 // TODO(gman): Remove this. 114 // TODO(gman): Remove this.
118 void DisableShaderTranslation(); 115 void DisableShaderTranslation();
119 116
117 gpu::gles2::GLES2Implementation* gles2_implementation() const {
118 return gles2_implementation_;
119 }
120 private: 120 private:
121 void OnSwapBuffers(); 121 void OnSwapBuffers();
122 122
123 scoped_refptr<GpuChannelHost> channel_; 123 scoped_refptr<GpuChannelHost> channel_;
124 base::WeakPtr<Context> parent_; 124 base::WeakPtr<Context> parent_;
125 scoped_ptr<Callback1<Context*>::Type> swap_buffers_callback_; 125 scoped_ptr<Callback0::Type> swap_buffers_callback_;
126 uint32 parent_texture_id_; 126 uint32 parent_texture_id_;
127 CommandBufferProxy* command_buffer_; 127 CommandBufferProxy* command_buffer_;
128 gpu::gles2::GLES2CmdHelper* gles2_helper_; 128 gpu::gles2::GLES2CmdHelper* gles2_helper_;
129 int32 transfer_buffer_id_; 129 int32 transfer_buffer_id_;
130 gpu::gles2::GLES2Implementation* gles2_implementation_; 130 gpu::gles2::GLES2Implementation* gles2_implementation_;
131 gfx::Size size_;
132
131 Error last_error_; 133 Error last_error_;
132 134
133 DISALLOW_COPY_AND_ASSIGN(Context); 135 DISALLOW_COPY_AND_ASSIGN(Context);
134 }; 136 };
135 137
136 Context::Context(GpuChannelHost* channel, Context* parent) 138 Context::Context(GpuChannelHost* channel, Context* parent)
137 : channel_(channel), 139 : channel_(channel),
138 parent_(parent ? parent->AsWeakPtr() : base::WeakPtr<Context>()), 140 parent_(parent ? parent->AsWeakPtr() : base::WeakPtr<Context>()),
139 parent_texture_id_(0), 141 parent_texture_id_(0),
140 command_buffer_(NULL), 142 command_buffer_(NULL),
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 } 257 }
256 258
257 // Create the object exposing the OpenGL API. 259 // Create the object exposing the OpenGL API.
258 gles2_implementation_ = new gpu::gles2::GLES2Implementation( 260 gles2_implementation_ = new gpu::gles2::GLES2Implementation(
259 gles2_helper_, 261 gles2_helper_,
260 transfer_buffer.size, 262 transfer_buffer.size,
261 transfer_buffer.ptr, 263 transfer_buffer.ptr,
262 transfer_buffer_id_, 264 transfer_buffer_id_,
263 false); 265 false);
264 266
267 size_ = size;
268
265 return true; 269 return true;
266 } 270 }
267 271
268 #if defined(OS_MACOSX) 272 #if defined(OS_MACOSX)
269 void Context::ResizeOnscreen(const gfx::Size& size) { 273 void Context::ResizeOnscreen(const gfx::Size& size) {
270 DCHECK(size.width() > 0 && size.height() > 0); 274 DCHECK(size.width() > 0 && size.height() > 0);
275 size_ = size;
271 command_buffer_->SetWindowSize(size); 276 command_buffer_->SetWindowSize(size);
272 } 277 }
273 #endif 278 #endif
274 279
275 void Context::ResizeOffscreen(const gfx::Size& size) { 280 void Context::ResizeOffscreen(const gfx::Size& size) {
276 DCHECK(size.width() > 0 && size.height() > 0); 281 DCHECK(size.width() > 0 && size.height() > 0);
277 command_buffer_->ResizeOffscreenFrameBuffer(size); 282 if (size_ != size) {
283 command_buffer_->ResizeOffscreenFrameBuffer(size);
284 size_ = size;
285 }
278 } 286 }
279 287
280 uint32 Context::CreateParentTexture(const gfx::Size& size) const { 288 uint32 Context::CreateParentTexture(const gfx::Size& size) const {
281 // Allocate a texture ID with respect to the parent. 289 // Allocate a texture ID with respect to the parent.
282 if (parent_.get()) { 290 if (parent_.get()) {
283 if (!MakeCurrent(parent_.get())) 291 if (!MakeCurrent(parent_.get()))
284 return 0; 292 return 0;
285 uint32 texture_id = parent_->gles2_implementation_->MakeTextureId(); 293 uint32 texture_id = parent_->gles2_implementation_->MakeTextureId();
286 parent_->gles2_implementation_->BindTexture(GL_TEXTURE_2D, texture_id); 294 parent_->gles2_implementation_->BindTexture(GL_TEXTURE_2D, texture_id);
287 parent_->gles2_implementation_->TexParameteri( 295 parent_->gles2_implementation_->TexParameteri(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 344
337 if (channel_ && command_buffer_) { 345 if (channel_ && command_buffer_) {
338 channel_->DestroyCommandBuffer(command_buffer_); 346 channel_->DestroyCommandBuffer(command_buffer_);
339 command_buffer_ = NULL; 347 command_buffer_ = NULL;
340 } 348 }
341 349
342 channel_ = NULL; 350 channel_ = NULL;
343 } 351 }
344 352
345 bool Context::MakeCurrent(Context* context) { 353 bool Context::MakeCurrent(Context* context) {
346 g_current_context.Set(context);
347 if (context) { 354 if (context) {
348 gles2::SetGLContext(context->gles2_implementation_); 355 gles2::SetGLContext(context->gles2_implementation_);
349 356
350 // Don't request latest error status from service. Just use the locally 357 // Don't request latest error status from service. Just use the locally
351 // cached information from the last flush. 358 // cached information from the last flush.
352 // TODO(apatrick): I'm not sure if this should actually change the 359 // TODO(apatrick): I'm not sure if this should actually change the
353 // current context if it fails. For now it gets changed even if it fails 360 // current context if it fails. For now it gets changed even if it fails
354 // because making GL calls with a NULL context crashes. 361 // because making GL calls with a NULL context crashes.
355 if (context->command_buffer_->GetLastState().error != gpu::error::kNoError) 362 if (context->command_buffer_->GetLastState().error != gpu::error::kNoError)
356 return false; 363 return false;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 last_error_ = error; 405 last_error_ = error;
399 } 406 }
400 407
401 // TODO(gman): Remove This 408 // TODO(gman): Remove This
402 void Context::DisableShaderTranslation() { 409 void Context::DisableShaderTranslation() {
403 gles2_implementation_->CommandBufferEnable(PEPPER3D_SKIP_GLSL_TRANSLATION); 410 gles2_implementation_->CommandBufferEnable(PEPPER3D_SKIP_GLSL_TRANSLATION);
404 } 411 }
405 412
406 void Context::OnSwapBuffers() { 413 void Context::OnSwapBuffers() {
407 if (swap_buffers_callback_.get()) 414 if (swap_buffers_callback_.get())
408 swap_buffers_callback_->Run(this); 415 swap_buffers_callback_->Run();
409 } 416 }
410 417
411 #endif // ENABLE_GPU 418 #endif // ENABLE_GPU
412 419
413 Context* CreateViewContext(GpuChannelHost* channel, 420 Context* CreateViewContext(GpuChannelHost* channel,
414 gfx::NativeViewId view, 421 gfx::NativeViewId view,
415 int render_view_id, 422 int render_view_id,
416 const char* allowed_extensions, 423 const char* allowed_extensions,
417 const int32* attrib_list) { 424 const int32* attrib_list) {
418 #if defined(ENABLE_GPU) 425 #if defined(ENABLE_GPU)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 #endif 480 #endif
474 } 481 }
475 482
476 void DeleteParentTexture(Context* context, uint32 texture) { 483 void DeleteParentTexture(Context* context, uint32 texture) {
477 #if defined(ENABLE_GPU) 484 #if defined(ENABLE_GPU)
478 context->DeleteParentTexture(texture); 485 context->DeleteParentTexture(texture);
479 #endif 486 #endif
480 } 487 }
481 488
482 void SetSwapBuffersCallback(Context* context, 489 void SetSwapBuffersCallback(Context* context,
483 Callback1<Context*>::Type* callback) { 490 Callback0::Type* callback) {
484 #if defined(ENABLE_GPU) 491 #if defined(ENABLE_GPU)
485 context->SetSwapBuffersCallback(callback); 492 context->SetSwapBuffersCallback(callback);
486 #endif 493 #endif
487 } 494 }
488 495
489 bool MakeCurrent(Context* context) { 496 bool MakeCurrent(Context* context) {
490 #if defined(ENABLE_GPU) 497 #if defined(ENABLE_GPU)
491 return Context::MakeCurrent(context); 498 return Context::MakeCurrent(context);
492 #else 499 #else
493 return false; 500 return false;
494 #endif 501 #endif
495 } 502 }
496 503
497 Context* GetCurrentContext() {
498 #if defined(ENABLE_GPU)
499 return g_current_context.Get();
500 #else
501 return NULL;
502 #endif
503 }
504
505 bool SwapBuffers(Context* context) { 504 bool SwapBuffers(Context* context) {
506 #if defined(ENABLE_GPU) 505 #if defined(ENABLE_GPU)
507 if (!context) 506 if (!context)
508 return false; 507 return false;
509 508
510 return context->SwapBuffers(); 509 return context->SwapBuffers();
511 #else 510 #else
512 return false; 511 return false;
513 #endif 512 #endif
514 } 513 }
515 514
516 bool DestroyContext(Context* context) { 515 bool DestroyContext(Context* context) {
517 #if defined(ENABLE_GPU) 516 #if defined(ENABLE_GPU)
518 if (!context) 517 if (!context)
519 return false; 518 return false;
520 519
521 if (context == GetCurrentContext())
522 MakeCurrent(NULL);
523
524 delete context; 520 delete context;
525 return true; 521 return true;
526 #else 522 #else
527 return false; 523 return false;
528 #endif 524 #endif
529 } 525 }
530 526
531 media::VideoDecodeEngine* CreateVideoDecodeEngine(Context* context) { 527 media::VideoDecodeEngine* CreateVideoDecodeEngine(Context* context) {
532 return context->CreateVideoDecodeEngine(); 528 return context->CreateVideoDecodeEngine();
533 } 529 }
534 530
535 media::VideoDecodeContext* CreateVideoDecodeContext( 531 media::VideoDecodeContext* CreateVideoDecodeContext(
536 Context* context, MessageLoop* message_loop, bool hardware_decoder) { 532 Context* context, MessageLoop* message_loop, bool hardware_decoder) {
537 return context->CreateVideoDecodeContext(message_loop, hardware_decoder); 533 return context->CreateVideoDecodeContext(message_loop, hardware_decoder);
538 } 534 }
539 535
540 Error GetError() { 536 Error GetError(Context* context) {
541 #if defined(ENABLE_GPU) 537 #if defined(ENABLE_GPU)
542 Context* context = GetCurrentContext();
543 if (!context)
544 return BAD_CONTEXT;
545
546 return context->GetError(); 538 return context->GetError();
547 #else 539 #else
548 return NOT_INITIALIZED; 540 return NOT_INITIALIZED;
549 #endif 541 #endif
550 } 542 }
551 543
552 // TODO(gman): Remove This 544 // TODO(gman): Remove This
553 void DisableShaderTranslation(Context* context) { 545 void DisableShaderTranslation(Context* context) {
554 #if defined(ENABLE_GPU) 546 #if defined(ENABLE_GPU)
555 if (context) { 547 if (context) {
556 context->DisableShaderTranslation(); 548 context->DisableShaderTranslation();
557 } 549 }
558 #endif 550 #endif
559 } 551 }
552
553 gpu::gles2::GLES2Implementation* GetImplementation(Context* context) {
554 if (!context)
555 return NULL;
556
557 return context->gles2_implementation();
558 }
559
560 } // namespace ggl 560 } // namespace ggl
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698