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

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

Issue 367002: Added Pepper 3D render context that instantiates the GPU plugin.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #define PEPPER_APIS_ENABLED 1 5 #define PEPPER_APIS_ENABLED 1
6 6
7 #include "chrome/renderer/webplugin_delegate_pepper.h" 7 #include "chrome/renderer/webplugin_delegate_pepper.h"
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "app/gfx/blit.h" 12 #include "app/gfx/blit.h"
13 #include "base/file_util.h" 13 #include "base/file_util.h"
14 #include "base/message_loop.h" 14 #include "base/message_loop.h"
15 #include "base/process_util.h" 15 #include "base/process_util.h"
16 #include "base/scoped_ptr.h" 16 #include "base/scoped_ptr.h"
17 #include "base/stats_counters.h" 17 #include "base/stats_counters.h"
18 #include "base/string_util.h" 18 #include "base/string_util.h"
19 #include "chrome/common/render_messages.h" 19 #include "chrome/common/render_messages.h"
20 #include "chrome/renderer/render_thread.h" 20 #include "chrome/renderer/render_thread.h"
21 #include "chrome/renderer/webplugin_delegate_proxy.h"
21 #include "third_party/npapi/bindings/npapi_extensions.h" 22 #include "third_party/npapi/bindings/npapi_extensions.h"
22 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" 23 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
23 #include "webkit/glue/glue_util.h" 24 #include "webkit/glue/glue_util.h"
24 #include "webkit/glue/plugins/plugin_constants_win.h" 25 #include "webkit/glue/plugins/plugin_constants_win.h"
25 #include "webkit/glue/plugins/plugin_instance.h" 26 #include "webkit/glue/plugins/plugin_instance.h"
26 #include "webkit/glue/plugins/plugin_lib.h" 27 #include "webkit/glue/plugins/plugin_lib.h"
27 #include "webkit/glue/plugins/plugin_list.h" 28 #include "webkit/glue/plugins/plugin_list.h"
28 #include "webkit/glue/plugins/plugin_stream_url.h" 29 #include "webkit/glue/plugins/plugin_stream_url.h"
29 #include "webkit/glue/webkit_glue.h" 30 #include "webkit/glue/webkit_glue.h"
30 31
32 #if defined(ENABLE_GPU)
33 #include "webkit/glue/plugins/plugin_constants_win.h"
34 #endif
35
36 using gpu::Buffer;
31 using webkit_glue::WebPlugin; 37 using webkit_glue::WebPlugin;
32 using webkit_glue::WebPluginDelegate; 38 using webkit_glue::WebPluginDelegate;
33 using webkit_glue::WebPluginResourceClient; 39 using webkit_glue::WebPluginResourceClient;
34 using WebKit::WebCursorInfo; 40 using WebKit::WebCursorInfo;
35 using WebKit::WebKeyboardEvent; 41 using WebKit::WebKeyboardEvent;
36 using WebKit::WebInputEvent; 42 using WebKit::WebInputEvent;
37 using WebKit::WebMouseEvent; 43 using WebKit::WebMouseEvent;
38 using WebKit::WebMouseWheelEvent; 44 using WebKit::WebMouseWheelEvent;
39 45
40 namespace { 46 namespace {
41 47
42 const uint32 kBytesPerPixel = 4; // Only 8888 RGBA for now. 48 const uint32 kBytesPerPixel = 4; // Only 8888 RGBA for now.
43 49
44 } // namespace 50 } // namespace
45 51
46 // Implementation artifacts for a context 52 // Implementation artifacts for a context
47 struct Device2DImpl { 53 struct Device2DImpl {
48 TransportDIB* dib; 54 TransportDIB* dib;
49 }; 55 };
50 56
51 uint32 WebPluginDelegatePepper::next_buffer_id = 0; 57 uint32 WebPluginDelegatePepper::next_buffer_id = 0;
52 58
53 WebPluginDelegatePepper* WebPluginDelegatePepper::Create( 59 WebPluginDelegatePepper* WebPluginDelegatePepper::Create(
54 const FilePath& filename, 60 const FilePath& filename,
55 const std::string& mime_type, 61 const std::string& mime_type,
62 const base::WeakPtr<RenderView>& render_view,
56 gfx::PluginWindowHandle containing_view) { 63 gfx::PluginWindowHandle containing_view) {
57 scoped_refptr<NPAPI::PluginLib> plugin_lib = 64 scoped_refptr<NPAPI::PluginLib> plugin_lib =
58 NPAPI::PluginLib::CreatePluginLib(filename); 65 NPAPI::PluginLib::CreatePluginLib(filename);
59 if (plugin_lib.get() == NULL) 66 if (plugin_lib.get() == NULL)
60 return NULL; 67 return NULL;
61 68
62 NPError err = plugin_lib->NP_Initialize(); 69 NPError err = plugin_lib->NP_Initialize();
63 if (err != NPERR_NO_ERROR) 70 if (err != NPERR_NO_ERROR)
64 return NULL; 71 return NULL;
65 72
66 scoped_refptr<NPAPI::PluginInstance> instance = 73 scoped_refptr<NPAPI::PluginInstance> instance =
67 plugin_lib->CreateInstance(mime_type); 74 plugin_lib->CreateInstance(mime_type);
68 return new WebPluginDelegatePepper(containing_view, instance.get()); 75 return new WebPluginDelegatePepper(render_view,
76 containing_view,
77 instance.get());
69 } 78 }
70 79
71 bool WebPluginDelegatePepper::Initialize( 80 bool WebPluginDelegatePepper::Initialize(
72 const GURL& url, 81 const GURL& url,
73 const std::vector<std::string>& arg_names, 82 const std::vector<std::string>& arg_names,
74 const std::vector<std::string>& arg_values, 83 const std::vector<std::string>& arg_values,
75 WebPlugin* plugin, 84 WebPlugin* plugin,
76 bool load_manually) { 85 bool load_manually) {
77 plugin_ = plugin; 86 plugin_ = plugin;
78 87
(...skipping 12 matching lines...) Expand all
91 if (!start_result) 100 if (!start_result)
92 return false; 101 return false;
93 102
94 // For windowless plugins we should set the containing window handle 103 // For windowless plugins we should set the containing window handle
95 // as the instance window handle. This is what Safari does. Not having 104 // as the instance window handle. This is what Safari does. Not having
96 // a valid window handle causes subtle bugs with plugins which retreive 105 // a valid window handle causes subtle bugs with plugins which retreive
97 // the window handle and validate the same. The window handle can be 106 // the window handle and validate the same. The window handle can be
98 // retreived via NPN_GetValue of NPNVnetscapeWindow. 107 // retreived via NPN_GetValue of NPNVnetscapeWindow.
99 instance_->set_window_handle(parent_); 108 instance_->set_window_handle(parent_);
100 109
101 // This is a windowless plugin, so set it to have a NULL handle.
102 plugin_->SetWindow(NULL);
103
104 plugin_url_ = url.spec(); 110 plugin_url_ = url.spec();
105 111
106 return true; 112 return true;
107 } 113 }
108 114
109 void WebPluginDelegatePepper::DestroyInstance() { 115 void WebPluginDelegatePepper::DestroyInstance() {
110 if (instance_ && (instance_->npp()->ndata != NULL)) { 116 if (instance_ && (instance_->npp()->ndata != NULL)) {
111 // Shutdown all streams before destroying so that 117 // Shutdown all streams before destroying so that
112 // no streams are left "in progress". Need to do 118 // no streams are left "in progress". Need to do
113 // this before calling set_web_plugin(NULL) because the 119 // this before calling set_web_plugin(NULL) because the
(...skipping 26 matching lines...) Expand all
140 window_rect_ = window_rect; 146 window_rect_ = window_rect;
141 147
142 // TODO(brettw) figure out how to tell the plugin that the size changed and it 148 // TODO(brettw) figure out how to tell the plugin that the size changed and it
143 // needs to repaint? 149 // needs to repaint?
144 SkBitmap new_committed; 150 SkBitmap new_committed;
145 new_committed.setConfig(SkBitmap::kARGB_8888_Config, 151 new_committed.setConfig(SkBitmap::kARGB_8888_Config,
146 window_rect_.width(), window_rect.height()); 152 window_rect_.width(), window_rect.height());
147 new_committed.allocPixels(); 153 new_committed.allocPixels();
148 committed_bitmap_ = new_committed; 154 committed_bitmap_ = new_committed;
149 155
156 // Forward the new geometry to the nested plugin instance.
157 if (nested_delegate_)
158 nested_delegate_->UpdateGeometry(window_rect, clip_rect);
159
150 if (!instance()) 160 if (!instance())
151 return; 161 return;
152 162
153 // TODO(sehr): do we need all this? 163 // TODO(sehr): do we need all this?
154 window_.clipRect.top = clip_rect_.y(); 164 window_.clipRect.top = clip_rect_.y();
155 window_.clipRect.left = clip_rect_.x(); 165 window_.clipRect.left = clip_rect_.x();
156 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height(); 166 window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height();
157 window_.clipRect.right = clip_rect_.x() + clip_rect_.width(); 167 window_.clipRect.right = clip_rect_.x() + clip_rect_.width();
158 window_.height = window_rect_.height(); 168 window_.height = window_rect_.height();
159 window_.width = window_rect_.width(); 169 window_.width = window_rect_.width();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 250
241 NPError WebPluginDelegatePepper::Device2DQueryConfig( 251 NPError WebPluginDelegatePepper::Device2DQueryConfig(
242 const NPDeviceContext2DConfig* request, 252 const NPDeviceContext2DConfig* request,
243 NPDeviceContext2DConfig* obtain) { 253 NPDeviceContext2DConfig* obtain) {
244 return NPERR_GENERIC_ERROR; 254 return NPERR_GENERIC_ERROR;
245 } 255 }
246 256
247 NPError WebPluginDelegatePepper::Device2DInitializeContext( 257 NPError WebPluginDelegatePepper::Device2DInitializeContext(
248 const NPDeviceContext2DConfig* config, 258 const NPDeviceContext2DConfig* config,
249 NPDeviceContext2D* context) { 259 NPDeviceContext2D* context) {
260 // This is a windowless plugin, so set it to have a NULL handle. Defer this
261 // until we know the plugin will use the 2D device. If it uses the 3D device
262 // it will have a window handle.
263 plugin_->SetWindow(NULL);
264
250 int width = window_rect_.width(); 265 int width = window_rect_.width();
251 int height = window_rect_.height(); 266 int height = window_rect_.height();
252 uint32 buffer_size = width * height * kBytesPerPixel; 267 uint32 buffer_size = width * height * kBytesPerPixel;
253 268
254 // Initialize the impelementation information in case of failure. 269 // Initialize the impelementation information in case of failure.
255 context->reserved = NULL; 270 context->reserved = NULL;
256 271
257 // Allocate the transport DIB and the PlatformCanvas pointing to it. 272 // Allocate the transport DIB and the PlatformCanvas pointing to it.
258 scoped_ptr<OpenPaintContext> paint_context(new OpenPaintContext); 273 scoped_ptr<OpenPaintContext> paint_context(new OpenPaintContext);
259 paint_context->transport_dib.reset( 274 paint_context->transport_dib.reset(
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 400
386 NPError WebPluginDelegatePepper::Device3DQueryConfig( 401 NPError WebPluginDelegatePepper::Device3DQueryConfig(
387 const NPDeviceContext3DConfig* request, 402 const NPDeviceContext3DConfig* request,
388 NPDeviceContext3DConfig* obtain) { 403 NPDeviceContext3DConfig* obtain) {
389 return NPERR_GENERIC_ERROR; 404 return NPERR_GENERIC_ERROR;
390 } 405 }
391 406
392 NPError WebPluginDelegatePepper::Device3DInitializeContext( 407 NPError WebPluginDelegatePepper::Device3DInitializeContext(
393 const NPDeviceContext3DConfig* config, 408 const NPDeviceContext3DConfig* config,
394 NPDeviceContext3D* context) { 409 NPDeviceContext3D* context) {
410 #if defined(ENABLE_GPU)
411 // Check to see if the GPU plugin is already initialized and fail if so.
412 if (nested_delegate_)
413 return NPERR_GENERIC_ERROR;
414
415 // Create an instance of the GPU plugin that is responsible for 3D
416 // rendering.
417 nested_delegate_ = new WebPluginDelegateProxy(kGPUPluginMimeType,
418 render_view_);
419
420 // TODO(apatrick): should the GPU plugin be attached to plugin_?
421 if (nested_delegate_->Initialize(GURL(),
422 std::vector<std::string>(),
423 std::vector<std::string>(),
424 plugin_,
425 false)) {
426 // Ask the GPU plugin to create a command buffer and return a proxy.
427 command_buffer_.reset(nested_delegate_->CreateCommandBuffer());
428 if (command_buffer_.get()) {
429 // Initialize the proxy command buffer.
430 if (command_buffer_->Initialize(config->commandBufferEntries)) {
431 // Initialize the 3D context.
432 context->reserved = NULL;
433 Buffer ring_buffer = command_buffer_->GetRingBuffer();
434 context->commandBuffer = ring_buffer.ptr;
435 context->commandBufferEntries = command_buffer_->GetSize();
436 context->getOffset = command_buffer_->GetGetOffset();
437 context->putOffset = command_buffer_->GetPutOffset();
438
439 // Ensure the service knows the window size before rendering anything.
440 nested_delegate_->UpdateGeometry(window_rect_, clip_rect_);
441
442 return NPERR_NO_ERROR;
443 }
444 }
445
446 command_buffer_.reset();
447 }
448
449 nested_delegate_->PluginDestroyed();
450 nested_delegate_ = NULL;
451 #endif // ENABLE_GPU
452
395 return NPERR_GENERIC_ERROR; 453 return NPERR_GENERIC_ERROR;
396 } 454 }
397 455
398 NPError WebPluginDelegatePepper::Device3DSetStateContext( 456 NPError WebPluginDelegatePepper::Device3DSetStateContext(
399 NPDeviceContext3D* context, 457 NPDeviceContext3D* context,
400 int32 state, 458 int32 state,
401 int32 value) { 459 int32 value) {
402 return NPERR_GENERIC_ERROR; 460 return NPERR_GENERIC_ERROR;
403 } 461 }
404 462
405 NPError WebPluginDelegatePepper::Device3DGetStateContext( 463 NPError WebPluginDelegatePepper::Device3DGetStateContext(
406 NPDeviceContext3D* context, 464 NPDeviceContext3D* context,
407 int32 state, 465 int32 state,
408 int32* value) { 466 int32* value) {
409 return NPERR_GENERIC_ERROR; 467 #if defined(ENABLE_GPU)
468 if (!command_buffer_.get())
469 return NPERR_GENERIC_ERROR;
470
471 switch (state) {
472 case NPDeviceContext3DState_GetOffset:
473 context->getOffset = *value = command_buffer_->GetGetOffset();
474 break;
475 case NPDeviceContext3DState_PutOffset:
476 *value = command_buffer_->GetPutOffset();
477 break;
478 case NPDeviceContext3DState_Token:
479 *value = command_buffer_->GetToken();
480 break;
481 case NPDeviceContext3DState_ParseError:
482 *value = command_buffer_->ResetParseError();
483 break;
484 case NPDeviceContext3DState_ErrorStatus:
485 *value = command_buffer_->GetErrorStatus() ? 1 : 0;
486 break;
487 default:
488 return NPERR_GENERIC_ERROR;
489 };
490 #endif // ENABLE_GPU
491
492 return NPERR_NO_ERROR;
410 } 493 }
411 494
412 NPError WebPluginDelegatePepper::Device3DFlushContext( 495 NPError WebPluginDelegatePepper::Device3DFlushContext(
413 NPP id, 496 NPP id,
414 NPDeviceContext3D* context, 497 NPDeviceContext3D* context,
415 NPDeviceFlushContextCallbackPtr callback, 498 NPDeviceFlushContextCallbackPtr callback,
416 void* user_data) { 499 void* user_data) {
417 return NPERR_GENERIC_ERROR; 500 #if defined(ENABLE_GPU)
501 DCHECK(callback == NULL);
502 context->getOffset = command_buffer_->SyncOffsets(context->putOffset);
503 #endif // ENABLE_GPU
504 return NPERR_NO_ERROR;
418 } 505 }
419 506
420 NPError WebPluginDelegatePepper::Device3DDestroyContext( 507 NPError WebPluginDelegatePepper::Device3DDestroyContext(
421 NPDeviceContext3D* context) { 508 NPDeviceContext3D* context) {
422 return NPERR_GENERIC_ERROR; 509 #if defined(ENABLE_GPU)
510 command_buffer_.reset();
511
512 if (nested_delegate_) {
513 nested_delegate_->PluginDestroyed();
514 nested_delegate_ = NULL;
515 }
516 #endif // ENABLE_GPU
517
518 return NPERR_NO_ERROR;
423 } 519 }
424 520
425 bool WebPluginDelegatePepper::IsPluginDelegateWindow( 521 NPError WebPluginDelegatePepper::Device3DCreateBuffer(
426 gfx::NativeWindow window) { 522 NPDeviceContext3D* context,
427 return false; 523 size_t size,
524 int32* id) {
525 #if defined(ENABLE_GPU)
526 *id = command_buffer_->CreateTransferBuffer(size);
527 if (*id < 0)
528 return NPERR_GENERIC_ERROR;
529 #endif // ENABLE_GPU
530
531 return NPERR_NO_ERROR;
428 } 532 }
429 533
430 bool WebPluginDelegatePepper::GetPluginNameFromWindow( 534 NPError WebPluginDelegatePepper::Device3DDestroyBuffer(
431 gfx::NativeWindow window, std::wstring *plugin_name) { 535 NPDeviceContext3D* context,
432 return false; 536 int32 id) {
537 #if defined(ENABLE_GPU)
538 command_buffer_->DestroyTransferBuffer(id);
539 #endif // ENABLE_GPU
540 return NPERR_NO_ERROR;
433 } 541 }
434 542
435 bool WebPluginDelegatePepper::IsDummyActivationWindow( 543 NPError WebPluginDelegatePepper::Device3DMapBuffer(
436 gfx::NativeWindow window) { 544 NPDeviceContext3D* context,
437 return false; 545 int32 id,
546 NPDeviceBuffer* np_buffer) {
547 #if defined(ENABLE_GPU)
548 Buffer gpu_buffer = command_buffer_->GetTransferBuffer(id);
549 np_buffer->ptr = gpu_buffer.ptr;
550 np_buffer->size = gpu_buffer.size;
551 if (!np_buffer->ptr)
552 return NPERR_GENERIC_ERROR;
553 #endif // ENABLE_GPU
554
555 return NPERR_NO_ERROR;
438 } 556 }
439 557
440 WebPluginDelegatePepper::WebPluginDelegatePepper( 558 WebPluginDelegatePepper::WebPluginDelegatePepper(
559 const base::WeakPtr<RenderView>& render_view,
441 gfx::PluginWindowHandle containing_view, 560 gfx::PluginWindowHandle containing_view,
442 NPAPI::PluginInstance *instance) 561 NPAPI::PluginInstance *instance)
443 : plugin_(NULL), 562 : render_view_(render_view),
563 plugin_(NULL),
444 instance_(instance), 564 instance_(instance),
445 parent_(containing_view), 565 parent_(containing_view),
446 buffer_size_(0), 566 buffer_size_(0),
447 plugin_buffer_(0) { 567 plugin_buffer_(0),
568 nested_delegate_(NULL) {
448 // For now we keep a window struct, although it isn't used. 569 // For now we keep a window struct, although it isn't used.
449 memset(&window_, 0, sizeof(window_)); 570 memset(&window_, 0, sizeof(window_));
450 // All Pepper plugins are windowless and transparent. 571 // All Pepper plugins are windowless and transparent.
451 // TODO(sehr): disable resetting these NPPVs by plugins. 572 // TODO(sehr): disable resetting these NPPVs by plugins.
452 instance->set_windowless(true); 573 instance->set_windowless(true);
453 instance->set_transparent(true); 574 instance->set_transparent(true);
454 } 575 }
455 576
456 WebPluginDelegatePepper::~WebPluginDelegatePepper() { 577 WebPluginDelegatePepper::~WebPluginDelegatePepper() {
457 DestroyInstance(); 578 DestroyInstance();
458 } 579 }
459 580
460 void WebPluginDelegatePepper::PluginDestroyed() { 581 void WebPluginDelegatePepper::PluginDestroyed() {
582 if (nested_delegate_) {
583 nested_delegate_->PluginDestroyed();
584 nested_delegate_ = NULL;
585 }
461 delete this; 586 delete this;
462 } 587 }
463 588
464 void WebPluginDelegatePepper::Paint(WebKit::WebCanvas* canvas, 589 void WebPluginDelegatePepper::Paint(WebKit::WebCanvas* canvas,
465 const gfx::Rect& rect) { 590 const gfx::Rect& rect) {
466 #if defined(OS_WIN) 591 #if defined(OS_WIN)
467 // Blit from background_context to context. 592 if (nested_delegate_) {
468 if (!committed_bitmap_.isNull()) { 593 // TODO(apatrick): The GPU plugin will render to an offscreen render target.
469 gfx::Point origin(window_rect_.origin().x(), window_rect_.origin().y()); 594 // Need to copy it to the screen here.
470 canvas->drawBitmap(committed_bitmap_, 595 } else {
471 SkIntToScalar(window_rect_.origin().x()), 596 // Blit from background_context to context.
472 SkIntToScalar(window_rect_.origin().y())); 597 if (!committed_bitmap_.isNull()) {
598 gfx::Point origin(window_rect_.origin().x(), window_rect_.origin().y());
599 canvas->drawBitmap(committed_bitmap_,
600 SkIntToScalar(window_rect_.origin().x()),
601 SkIntToScalar(window_rect_.origin().y()));
602 }
473 } 603 }
474 #endif 604 #endif
475 } 605 }
476 606
477 void WebPluginDelegatePepper::Print(gfx::NativeDrawingContext context) { 607 void WebPluginDelegatePepper::Print(gfx::NativeDrawingContext context) {
478 NOTIMPLEMENTED(); 608 NOTIMPLEMENTED();
479 } 609 }
480 610
481 void WebPluginDelegatePepper::InstallMissingPlugin() { 611 void WebPluginDelegatePepper::InstallMissingPlugin() {
482 NOTIMPLEMENTED(); 612 NOTIMPLEMENTED();
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 BuildCharEvent(&event, &npevent); 726 BuildCharEvent(&event, &npevent);
597 break; 727 break;
598 case NPEventType_Minimize: 728 case NPEventType_Minimize:
599 case NPEventType_Focus: 729 case NPEventType_Focus:
600 case NPEventType_Device: 730 case NPEventType_Device:
601 // NOTIMPLEMENTED(); 731 // NOTIMPLEMENTED();
602 break; 732 break;
603 } 733 }
604 return instance()->NPP_HandleEvent(&npevent) != 0; 734 return instance()->NPP_HandleEvent(&npevent) != 0;
605 } 735 }
OLDNEW
« no previous file with comments | « chrome/renderer/webplugin_delegate_pepper.h ('k') | chrome/renderer/webplugin_delegate_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698