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

Unified Diff: content/renderer/pepper/pepper_plugin_instance_impl.cc

Issue 23866006: Make fullscreen pepper flash create a texture layer with software compositor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/pepper/pepper_plugin_instance_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper/pepper_plugin_instance_impl.cc
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 49daf81eb43eb74139bcd78eb44888b8ff8fce0c..06f8b7150e6629d5a640857854df3daa95f3f3ae 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/callback_helpers.h"
+#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/logging.h"
#include "base/memory/linked_ptr.h"
@@ -17,6 +18,7 @@
#include "base/time/time.h"
#include "cc/layers/texture_layer.h"
#include "content/common/content_constants_internal.h"
+#include "content/public/common/content_switches.h"
#include "content/public/common/page_zoom.h"
#include "content/public/renderer/content_renderer_client.h"
#include "content/renderer/pepper/common.h"
@@ -525,11 +527,6 @@ PepperPluginInstanceImpl::PepperPluginInstanceImpl(
PepperPluginInstanceImpl::~PepperPluginInstanceImpl() {
DCHECK(!fullscreen_container_);
- // Force-unbind any Graphics. In the case of Graphics2D, if the plugin
- // leaks the graphics 2D, it may actually get cleaned up after our
- // destruction, so we need its pointers to be up-to-date.
- BindGraphics(pp_instance(), 0);
-
// Free all the plugin objects. This will automatically clear the back-
// pointer from the NPObject so WebKit can't call into the plugin any more.
//
@@ -593,8 +590,11 @@ void PepperPluginInstanceImpl::Delete() {
fullscreen_container_->Destroy();
fullscreen_container_ = NULL;
}
- bound_graphics_3d_ = NULL;
- UpdateLayer();
+
+ // Force-unbind any Graphics. In the case of Graphics2D, if the plugin
+ // leaks the graphics 2D, it may actually get cleaned up after our
+ // destruction, so we need its pointers to be up-to-date.
+ BindGraphics(pp_instance(), 0);
container_ = NULL;
}
@@ -630,12 +630,21 @@ void PepperPluginInstanceImpl::InvalidateRect(const gfx::Rect& rect) {
else
container_->invalidateRect(rect);
}
+ if (texture_layer_) {
+ if (rect.IsEmpty()) {
+ texture_layer_->SetNeedsDisplay();
+ } else {
+ texture_layer_->SetNeedsDisplayRect(rect);
+ }
+ }
}
void PepperPluginInstanceImpl::ScrollRect(int dx,
int dy,
const gfx::Rect& rect) {
- if (fullscreen_container_) {
+ if (texture_layer_) {
+ InvalidateRect(rect);
+ } else if (fullscreen_container_) {
fullscreen_container_->ScrollRect(dx, dy, rect);
} else {
if (full_frame_ && !IsViewAccelerated()) {
@@ -1665,9 +1674,7 @@ void PepperPluginInstanceImpl::UpdateFlashFullscreenState(
return;
}
- PPB_Graphics3D_Impl* graphics_3d = bound_graphics_3d_.get();
- if (graphics_3d)
- UpdateLayer();
+ UpdateLayer();
bool old_plugin_focus = PluginHasFocus();
flash_fullscreen_ = flash_fullscreen;
@@ -1807,13 +1814,18 @@ void PepperPluginInstanceImpl::UpdateLayer() {
PlatformContext3D* context = bound_graphics_3d_->platform_context();
context->GetBackingMailbox(&mailbox);
}
- bool want_layer = !mailbox.IsZero();
+ bool want_3d_layer = !mailbox.IsZero();
+ bool want_2d_layer = bound_graphics_2d_platform_ &&
+ CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableSoftwareCompositing);
+ bool want_layer = want_3d_layer || want_2d_layer;
- if (want_layer == !!texture_layer_.get() &&
+ if ((want_layer == !!texture_layer_.get()) &&
+ (want_3d_layer == layer_is_hardware_) &&
layer_bound_to_fullscreen_ == !!fullscreen_container_)
return;
- if (texture_layer_.get()) {
+ if (texture_layer_) {
if (!layer_bound_to_fullscreen_)
container_->setWebLayer(NULL);
else if (fullscreen_container_)
@@ -1822,8 +1834,20 @@ void PepperPluginInstanceImpl::UpdateLayer() {
texture_layer_ = NULL;
}
if (want_layer) {
- DCHECK(bound_graphics_3d_.get());
- texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL);
+ bool opaque = false;
+ if (want_3d_layer) {
+ DCHECK(bound_graphics_3d_.get());
+ texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL);
+ opaque = bound_graphics_3d_->IsOpaque();
+ texture_layer_->SetTextureMailbox(
+ cc::TextureMailbox(mailbox, base::Bind(&IgnoreCallback), 0));
+ } else {
+ DCHECK(bound_graphics_2d_platform_);
+ texture_layer_ = cc::TextureLayer::CreateForMailbox(this);
+ bound_graphics_2d_platform_->AttachedToNewLayer();
+ opaque = bound_graphics_2d_platform_->IsAlwaysOpaque();
+ texture_layer_->SetFlipped(false);
+ }
web_layer_.reset(new webkit::WebLayerImpl(texture_layer_));
if (fullscreen_container_) {
fullscreen_container_->SetLayer(web_layer_.get());
@@ -1833,12 +1857,27 @@ void PepperPluginInstanceImpl::UpdateLayer() {
texture_layer_->SetContentsOpaque(true);
} else {
container_->setWebLayer(web_layer_.get());
- texture_layer_->SetContentsOpaque(bound_graphics_3d_->IsOpaque());
+ texture_layer_->SetContentsOpaque(opaque);
}
- texture_layer_->SetTextureMailbox(
- cc::TextureMailbox(mailbox, base::Bind(&IgnoreCallback), 0));
}
layer_bound_to_fullscreen_ = !!fullscreen_container_;
+ layer_is_hardware_ = want_3d_layer;
+}
+
+unsigned PepperPluginInstanceImpl::PrepareTexture() {
+ return 0;
+}
+
+WebKit::WebGraphicsContext3D* PepperPluginInstanceImpl::Context3d() {
+ return NULL;
+}
+
+bool PepperPluginInstanceImpl::PrepareTextureMailbox(
+ cc::TextureMailbox* mailbox,
+ bool use_shared_memory) {
+ if (!bound_graphics_2d_platform_)
+ return false;
+ return bound_graphics_2d_platform_->PrepareTextureMailbox(mailbox);
}
void PepperPluginInstanceImpl::AddPluginObject(PluginObject* plugin_object) {
« no previous file with comments | « content/renderer/pepper/pepper_plugin_instance_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698