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

Side by Side Diff: content/renderer/gpu/renderer_gl_context.cc

Issue 7205012: RendererGLContext supports reparenting a GL context. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/renderer/gpu/renderer_gl_context.h" 5 #include "content/renderer/gpu/renderer_gl_context.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 } 154 }
155 155
156 RendererGLContext* RendererGLContext::CreateViewContext( 156 RendererGLContext* RendererGLContext::CreateViewContext(
157 GpuChannelHost* channel, 157 GpuChannelHost* channel,
158 gfx::PluginWindowHandle render_surface, 158 gfx::PluginWindowHandle render_surface,
159 int render_view_id, 159 int render_view_id,
160 const char* allowed_extensions, 160 const char* allowed_extensions,
161 const int32* attrib_list, 161 const int32* attrib_list,
162 const GURL& active_url) { 162 const GURL& active_url) {
163 #if defined(ENABLE_GPU) 163 #if defined(ENABLE_GPU)
164 scoped_ptr<RendererGLContext> context(new RendererGLContext(channel, NULL)); 164 scoped_ptr<RendererGLContext> context(new RendererGLContext(channel));
165 if (!context->Initialize( 165 if (!context->Initialize(
166 true, 166 true,
167 render_surface, 167 render_surface,
168 render_view_id, 168 render_view_id,
169 gfx::Size(), 169 gfx::Size(),
170 allowed_extensions, 170 allowed_extensions,
171 attrib_list, 171 attrib_list,
172 active_url)) 172 active_url))
173 return NULL; 173 return NULL;
174 174
175 return context.release(); 175 return context.release();
176 #else 176 #else
177 return NULL; 177 return NULL;
178 #endif 178 #endif
179 } 179 }
180 180
181 #if defined(OS_MACOSX) 181 #if defined(OS_MACOSX)
182 void RendererGLContext::ResizeOnscreen(const gfx::Size& size) { 182 void RendererGLContext::ResizeOnscreen(const gfx::Size& size) {
183 DCHECK(size.width() > 0 && size.height() > 0); 183 DCHECK(size.width() > 0 && size.height() > 0);
184 size_ = size; 184 size_ = size;
185 command_buffer_->SetWindowSize(size); 185 command_buffer_->SetWindowSize(size);
186 } 186 }
187 #endif 187 #endif
188 188
189 RendererGLContext* RendererGLContext::CreateOffscreenContext( 189 RendererGLContext* RendererGLContext::CreateOffscreenContext(
190 GpuChannelHost* channel, 190 GpuChannelHost* channel,
191 RendererGLContext* parent,
192 const gfx::Size& size, 191 const gfx::Size& size,
193 const char* allowed_extensions, 192 const char* allowed_extensions,
194 const int32* attrib_list, 193 const int32* attrib_list,
195 const GURL& active_url) { 194 const GURL& active_url) {
196 #if defined(ENABLE_GPU) 195 #if defined(ENABLE_GPU)
197 scoped_ptr<RendererGLContext> context(new RendererGLContext(channel, parent)); 196 scoped_ptr<RendererGLContext> context(new RendererGLContext(channel));
198 if (!context->Initialize( 197 if (!context->Initialize(
199 false, 198 false,
200 gfx::kNullPluginWindow, 199 gfx::kNullPluginWindow,
201 0, 200 0,
202 size, 201 size,
203 allowed_extensions, 202 allowed_extensions,
204 attrib_list, 203 attrib_list,
205 active_url)) 204 active_url))
206 return NULL; 205 return NULL;
207 206
208 return context.release(); 207 return context.release();
209 #else 208 #else
210 return NULL; 209 return NULL;
211 #endif 210 #endif
212 } 211 }
213 212
213 bool RendererGLContext::SetParent(RendererGLContext* new_parent) {
214 // Allocate a texture ID with respect to the parent and change the parent.
215 uint32 new_parent_texture_id = 0;
216 if (new_parent) {
217 TRACE_EVENT0("gpu", "RendererGLContext::SetParent::flushParent");
218 // Flush any remaining commands in the parent context to make sure the
219 // texture id accounting stays consistent.
220 int32 token = new_parent->gles2_helper_->InsertToken();
221 new_parent->gles2_helper_->WaitForToken(token);
222 new_parent_texture_id = new_parent->gles2_implementation_->MakeTextureId();
223
224 if (!command_buffer_->SetParent(new_parent->command_buffer_,
225 new_parent_texture_id)) {
piman 2011/06/22 00:10:59 Drive-by: since this happens out-of-band (with a m
apatrick_chromium 2011/06/22 00:21:03 It should be alright at the moment because SetPare
226 new_parent->gles2_implementation_->FreeTextureId(parent_texture_id_);
227 return false;
228 }
229 } else {
230 if (!command_buffer_->SetParent(NULL, 0))
231 return false;
232 }
233
234 // Free the previous parent's texture ID.
235 if (parent_.get() && parent_texture_id_ != 0)
236 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_);
237
238 if (new_parent) {
239 parent_ = new_parent->AsWeakPtr();
240 parent_texture_id_ = new_parent_texture_id;
241 } else {
242 parent_.reset();
243 parent_texture_id_ = 0;
244 }
245
246 return true;
247 }
248
214 void RendererGLContext::ResizeOffscreen(const gfx::Size& size) { 249 void RendererGLContext::ResizeOffscreen(const gfx::Size& size) {
215 DCHECK(size.width() > 0 && size.height() > 0); 250 DCHECK(size.width() > 0 && size.height() > 0);
216 if (size_ != size) { 251 if (size_ != size) {
217 command_buffer_->ResizeOffscreenFrameBuffer(size); 252 command_buffer_->ResizeOffscreenFrameBuffer(size);
218 size_ = size; 253 size_ = size;
219 } 254 }
220 } 255 }
221 256
222 uint32 RendererGLContext::GetParentTextureId() { 257 uint32 RendererGLContext::GetParentTextureId() {
223 return parent_texture_id_; 258 return parent_texture_id_;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 // TODO(gman): Remove This 370 // TODO(gman): Remove This
336 void RendererGLContext::DisableShaderTranslation() { 371 void RendererGLContext::DisableShaderTranslation() {
337 gles2_implementation_->CommandBufferEnableCHROMIUM( 372 gles2_implementation_->CommandBufferEnableCHROMIUM(
338 PEPPER3D_SKIP_GLSL_TRANSLATION); 373 PEPPER3D_SKIP_GLSL_TRANSLATION);
339 } 374 }
340 375
341 gpu::gles2::GLES2Implementation* RendererGLContext::GetImplementation() { 376 gpu::gles2::GLES2Implementation* RendererGLContext::GetImplementation() {
342 return gles2_implementation_; 377 return gles2_implementation_;
343 } 378 }
344 379
345 RendererGLContext::RendererGLContext(GpuChannelHost* channel, 380 RendererGLContext::RendererGLContext(GpuChannelHost* channel)
346 RendererGLContext* parent)
347 : channel_(channel), 381 : channel_(channel),
348 parent_(parent ? 382 parent_(base::WeakPtr<RendererGLContext>()),
349 parent->AsWeakPtr() : base::WeakPtr<RendererGLContext>()),
350 parent_texture_id_(0), 383 parent_texture_id_(0),
351 child_to_parent_latch_(kInvalidLatchId), 384 child_to_parent_latch_(kInvalidLatchId),
352 parent_to_child_latch_(kInvalidLatchId), 385 parent_to_child_latch_(kInvalidLatchId),
353 latch_transfer_buffer_id_(-1), 386 latch_transfer_buffer_id_(-1),
354 command_buffer_(NULL), 387 command_buffer_(NULL),
355 gles2_helper_(NULL), 388 gles2_helper_(NULL),
356 transfer_buffer_id_(-1), 389 transfer_buffer_id_(-1),
357 gles2_implementation_(NULL), 390 gles2_implementation_(NULL),
358 last_error_(SUCCESS), 391 last_error_(SUCCESS),
359 frame_number_(0) { 392 frame_number_(0) {
(...skipping 10 matching lines...) Expand all
370 DCHECK(size.width() >= 0 && size.height() >= 0); 403 DCHECK(size.width() >= 0 && size.height() >= 0);
371 TRACE_EVENT2("gpu", "RendererGLContext::Initialize", 404 TRACE_EVENT2("gpu", "RendererGLContext::Initialize",
372 "on_screen", onscreen, "num_pixels", size.GetArea()); 405 "on_screen", onscreen, "num_pixels", size.GetArea());
373 406
374 if (channel_->state() != GpuChannelHost::kConnected) 407 if (channel_->state() != GpuChannelHost::kConnected)
375 return false; 408 return false;
376 409
377 // Ensure the gles2 library is initialized first in a thread safe way. 410 // Ensure the gles2 library is initialized first in a thread safe way.
378 g_gles2_initializer.Get(); 411 g_gles2_initializer.Get();
379 412
380 // Allocate a frame buffer ID with respect to the parent.
381 if (parent_.get()) {
382 TRACE_EVENT0("gpu", "RendererGLContext::Initialize::flushParent");
383 // Flush any remaining commands in the parent context to make sure the
384 // texture id accounting stays consistent.
385 int32 token = parent_->gles2_helper_->InsertToken();
386 parent_->gles2_helper_->WaitForToken(token);
387 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId();
388 }
389
390 std::vector<int32> attribs; 413 std::vector<int32> attribs;
391 while (attrib_list) { 414 while (attrib_list) {
392 int32 attrib = *attrib_list++; 415 int32 attrib = *attrib_list++;
393 switch (attrib) { 416 switch (attrib) {
394 // Known attributes 417 // Known attributes
395 case ALPHA_SIZE: 418 case ALPHA_SIZE:
396 case BLUE_SIZE: 419 case BLUE_SIZE:
397 case GREEN_SIZE: 420 case GREEN_SIZE:
398 case RED_SIZE: 421 case RED_SIZE:
399 case DEPTH_SIZE: 422 case DEPTH_SIZE:
(...skipping 24 matching lines...) Expand all
424 TRACE_EVENT0("gpu", 447 TRACE_EVENT0("gpu",
425 "RendererGLContext::Initialize::CreateViewCommandBuffer"); 448 "RendererGLContext::Initialize::CreateViewCommandBuffer");
426 command_buffer_ = channel_->CreateViewCommandBuffer( 449 command_buffer_ = channel_->CreateViewCommandBuffer(
427 render_surface, 450 render_surface,
428 render_view_id, 451 render_view_id,
429 allowed_extensions, 452 allowed_extensions,
430 attribs, 453 attribs,
431 active_url); 454 active_url);
432 } 455 }
433 } else { 456 } else {
434 CommandBufferProxy* parent_command_buffer =
435 parent_.get() ? parent_->command_buffer_ : NULL;
436 command_buffer_ = channel_->CreateOffscreenCommandBuffer( 457 command_buffer_ = channel_->CreateOffscreenCommandBuffer(
437 parent_command_buffer,
438 size, 458 size,
439 allowed_extensions, 459 allowed_extensions,
440 attribs, 460 attribs,
441 parent_texture_id_,
442 active_url); 461 active_url);
443 } 462 }
444 if (!command_buffer_) { 463 if (!command_buffer_) {
445 Destroy(); 464 Destroy();
446 return false; 465 return false;
447 } 466 }
448 467
449 { 468 {
450 TRACE_EVENT0("gpu", 469 TRACE_EVENT0("gpu",
451 "RendererGLContext::Initialize::InitializeCommandBuffer"); 470 "RendererGLContext::Initialize::InitializeCommandBuffer");
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 latch_transfer_buffer_id_ = command_buffer_->RegisterTransferBuffer( 513 latch_transfer_buffer_id_ = command_buffer_->RegisterTransferBuffer(
495 latch_shm->shared_memory(), LatchAllocator::size(), 514 latch_shm->shared_memory(), LatchAllocator::size(),
496 gpu::kLatchSharedMemoryId); 515 gpu::kLatchSharedMemoryId);
497 if (latch_transfer_buffer_id_ != gpu::kLatchSharedMemoryId) { 516 if (latch_transfer_buffer_id_ != gpu::kLatchSharedMemoryId) {
498 Destroy(); 517 Destroy();
499 return false; 518 return false;
500 } 519 }
501 520
502 // If this is a child context, setup latches for synchronization between child 521 // If this is a child context, setup latches for synchronization between child
503 // and parent. 522 // and parent.
504 if (parent_.get()) { 523 if (!CreateLatch(&child_to_parent_latch_) ||
505 if (!CreateLatch(&child_to_parent_latch_) || 524 !CreateLatch(&parent_to_child_latch_)) {
506 !CreateLatch(&parent_to_child_latch_)) { 525 Destroy();
507 Destroy(); 526 return false;
508 return false;
509 }
510 } 527 }
511 528
512 // Create the object exposing the OpenGL API. 529 // Create the object exposing the OpenGL API.
513 gles2_implementation_ = new gpu::gles2::GLES2Implementation( 530 gles2_implementation_ = new gpu::gles2::GLES2Implementation(
514 gles2_helper_, 531 gles2_helper_,
515 transfer_buffer.size, 532 transfer_buffer.size,
516 transfer_buffer.ptr, 533 transfer_buffer.ptr,
517 transfer_buffer_id_, 534 transfer_buffer_id_,
518 false); 535 false);
519 536
520 size_ = size; 537 size_ = size;
521 538
522 return true; 539 return true;
523 } 540 }
524 541
525 void RendererGLContext::Destroy() { 542 void RendererGLContext::Destroy() {
526 if (parent_.get() && parent_texture_id_ != 0) { 543 SetParent(NULL);
527 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_);
528 parent_texture_id_ = 0;
529 }
530 544
531 delete gles2_implementation_; 545 delete gles2_implementation_;
532 gles2_implementation_ = NULL; 546 gles2_implementation_ = NULL;
533 547
534 if (child_to_parent_latch_ != kInvalidLatchId) { 548 if (child_to_parent_latch_ != kInvalidLatchId) {
535 DestroyLatch(child_to_parent_latch_); 549 DestroyLatch(child_to_parent_latch_);
536 child_to_parent_latch_ = kInvalidLatchId; 550 child_to_parent_latch_ = kInvalidLatchId;
537 } 551 }
538 if (parent_to_child_latch_ != kInvalidLatchId) { 552 if (parent_to_child_latch_ != kInvalidLatchId) {
539 DestroyLatch(parent_to_child_latch_); 553 DestroyLatch(parent_to_child_latch_);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 return false; 600 return false;
587 } 601 }
588 602
589 bool RendererGLContext::GetChildToParentLatch(uint32* child_to_parent_latch) { 603 bool RendererGLContext::GetChildToParentLatch(uint32* child_to_parent_latch) {
590 if (parent_.get()) { 604 if (parent_.get()) {
591 *child_to_parent_latch = child_to_parent_latch_; 605 *child_to_parent_latch = child_to_parent_latch_;
592 return true; 606 return true;
593 } 607 }
594 return false; 608 return false;
595 } 609 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698