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

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

Issue 331123003: Revert 277208 "[PPAPI] Compositor API implementation." (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/pepper/pepper_compositor_host.cc
diff --git a/content/renderer/pepper/pepper_compositor_host.cc b/content/renderer/pepper/pepper_compositor_host.cc
deleted file mode 100644
index 47c0fccfe6cb06198183de4377c305c91e2c0e9c..0000000000000000000000000000000000000000
--- a/content/renderer/pepper/pepper_compositor_host.cc
+++ /dev/null
@@ -1,372 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_compositor_host.h"
-
-#include "base/logging.h"
-#include "base/memory/shared_memory.h"
-#include "cc/layers/layer.h"
-#include "cc/layers/solid_color_layer.h"
-#include "cc/layers/texture_layer.h"
-#include "cc/resources/texture_mailbox.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/gfx_conversion.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_image_data_api.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "ui/gfx/transform.h"
-
-using ppapi::host::HostMessageContext;
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_ImageData_API;
-
-namespace content {
-
-namespace {
-
-int32_t VerifyCommittedLayer(
- const ppapi::CompositorLayerData* old_layer,
- const ppapi::CompositorLayerData* new_layer,
- scoped_ptr<base::SharedMemory>* image_shm) {
- if (!new_layer->is_valid())
- return PP_ERROR_BADARGUMENT;
-
- if (new_layer->color) {
- // Make sure the old layer is a color layer too.
- if (old_layer && !old_layer->color)
- return PP_ERROR_BADARGUMENT;
- return PP_OK;
- }
-
- if (new_layer->texture) {
- if (old_layer) {
- // Make sure the old layer is a texture layer too.
- if (!new_layer->texture)
- return PP_ERROR_BADARGUMENT;
- // The mailbox should be same, if the resource_id is not changed.
- if (new_layer->common.resource_id == old_layer->common.resource_id) {
- if (new_layer->texture->mailbox != old_layer->texture->mailbox)
- return PP_ERROR_BADARGUMENT;
- return PP_OK;
- }
- }
- if (!new_layer->texture->mailbox.Verify())
- return PP_ERROR_BADARGUMENT;
- return PP_OK;
- }
-
- if (new_layer->image) {
- if (old_layer) {
- // Make sure the old layer is an image layer too.
- if (!new_layer->image)
- return PP_ERROR_BADARGUMENT;
- // The image data resource should be same, if the resource_id is not
- // changed.
- if (new_layer->common.resource_id == old_layer->common.resource_id) {
- if (new_layer->image->resource != old_layer->image->resource)
- return PP_ERROR_BADARGUMENT;
- return PP_OK;
- }
- }
- EnterResourceNoLock<PPB_ImageData_API> enter(new_layer->image->resource,
- true);
- if (enter.failed())
- return PP_ERROR_BADRESOURCE;
-
- // TODO(penghuang): support all kinds of image.
- PP_ImageDataDesc desc;
- if (enter.object()->Describe(&desc) != PP_TRUE ||
- desc.stride != desc.size.width * 4 ||
- desc.format != PP_IMAGEDATAFORMAT_RGBA_PREMUL) {
- return PP_ERROR_BADARGUMENT;
- }
-
- int handle;
- uint32_t byte_count;
- if (enter.object()->GetSharedMemory(&handle, &byte_count) != PP_OK)
- return PP_ERROR_FAILED;
-
-#if defined(OS_WIN)
- base::SharedMemoryHandle shm_handle;
- if (!::DuplicateHandle(::GetCurrentProcess(),
- reinterpret_cast<base::SharedMemoryHandle>(handle),
- ::GetCurrentProcess(),
- &shm_handle,
- 0,
- FALSE,
- DUPLICATE_SAME_ACCESS)) {
- return PP_ERROR_FAILED;
- }
-#else
- base::SharedMemoryHandle shm_handle(dup(handle), false);
-#endif
- image_shm->reset(new base::SharedMemory(shm_handle, true));
- if (!(*image_shm)->Map(desc.stride * desc.size.height)) {
- image_shm->reset();
- return PP_ERROR_NOMEMORY;
- }
- return PP_OK;
- }
-
- return PP_ERROR_BADARGUMENT;
-}
-
-} // namespace
-
-PepperCompositorHost::LayerData::LayerData(
- const scoped_refptr<cc::Layer>& cc,
- const ppapi::CompositorLayerData& pp) : cc_layer(cc), pp_layer(pp) {}
-
-PepperCompositorHost::LayerData::~LayerData() {}
-
-PepperCompositorHost::PepperCompositorHost(
- RendererPpapiHost* host,
- PP_Instance instance,
- PP_Resource resource)
- : ResourceHost(host->GetPpapiHost(), instance, resource),
- bound_instance_(NULL),
- weak_factory_(this) {
- layer_ = cc::Layer::Create();
- // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is
- // transformed. Possibly better could be to explicitly clip the child layers
- // (by modifying their bounds).
- layer_->SetMasksToBounds(true);
- layer_->SetIsDrawable(true);
-}
-
-PepperCompositorHost::~PepperCompositorHost() {
- // Unbind from the instance when destroyed if we're still bound.
- if (bound_instance_)
- bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0);
-}
-
-bool PepperCompositorHost::BindToInstance(
- PepperPluginInstanceImpl* new_instance) {
- if (new_instance && new_instance->pp_instance() != pp_instance())
- return false; // Can't bind other instance's contexts.
- if (bound_instance_ == new_instance)
- return true; // Rebinding the same device, nothing to do.
- if (bound_instance_ && new_instance)
- return false; // Can't change a bound device.
- bound_instance_ = new_instance;
- return true;
-}
-
-void PepperCompositorHost::ViewInitiatedPaint() {
- if (!commit_layers_reply_context_.is_valid())
- return;
- host()->SendReply(commit_layers_reply_context_,
- PpapiPluginMsg_Compositor_CommitLayersReply());
- commit_layers_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperCompositorHost::ViewFlushedPaint() {}
-
-void PepperCompositorHost::UpdateLayer(
- const scoped_refptr<cc::Layer>& layer,
- const ppapi::CompositorLayerData* old_layer,
- const ppapi::CompositorLayerData* new_layer,
- scoped_ptr<base::SharedMemory> image_shm) {
- // Always update properties on cc::Layer, because cc::Layer
- // will ignore any setting with unchanged value.
- layer->SetIsDrawable(true);
- layer->SetBlendMode(SkXfermode::kSrcOver_Mode);
- layer->SetOpacity(new_layer->common.opacity);
- layer->SetBounds(PP_ToGfxSize(new_layer->common.size));
- layer->SetTransformOrigin(gfx::Point3F(new_layer->common.size.width / 2,
- new_layer->common.size.height / 2,
- 0.0f));
-
- gfx::Transform transform(gfx::Transform::kSkipInitialization);
- transform.matrix().setColMajorf(new_layer->common.transform.matrix);
- layer->SetTransform(transform);
-
- // Consider a (0,0,0,0) rect as no clip rect.
- if (new_layer->common.clip_rect.point.x != 0 ||
- new_layer->common.clip_rect.point.y != 0 ||
- new_layer->common.clip_rect.size.width != 0 ||
- new_layer->common.clip_rect.size.height != 0) {
- scoped_refptr<cc::Layer> clip_parent = layer->parent();
- if (clip_parent == layer_) {
- // Create a clip parent layer, if it does not exist.
- clip_parent = cc::Layer::Create();
- clip_parent->SetMasksToBounds(true);
- clip_parent->SetIsDrawable(true);
- layer_->ReplaceChild(layer, clip_parent);
- clip_parent->AddChild(layer);
- }
- gfx::Point position = PP_ToGfxPoint(new_layer->common.clip_rect.point);
- clip_parent->SetPosition(position);
- clip_parent->SetBounds(PP_ToGfxSize(new_layer->common.clip_rect.size));
- layer->SetPosition(gfx::Point(-position.x(), -position.y()));
- } else if (layer->parent() != layer_) {
- // Remove the clip parent layer.
- layer_->ReplaceChild(layer->parent(), layer);
- layer->SetPosition(gfx::Point());
- }
-
- if (new_layer->color) {
- layer->SetBackgroundColor(SkColorSetARGBMacro(
- new_layer->color->alpha * 255,
- new_layer->color->red * 255,
- new_layer->color->green * 255,
- new_layer->color->blue * 255));
- return;
- }
-
- if (new_layer->texture) {
- scoped_refptr<cc::TextureLayer> texture_layer(
- static_cast<cc::TextureLayer*>(layer.get()));
- if (!old_layer ||
- new_layer->common.resource_id != old_layer->common.resource_id) {
- cc::TextureMailbox mailbox(new_layer->texture->mailbox,
- GL_TEXTURE_2D,
- new_layer->texture->sync_point);
- texture_layer->SetTextureMailbox(mailbox,
- cc::SingleReleaseCallback::Create(
- base::Bind(&PepperCompositorHost::ResourceReleased,
- weak_factory_.GetWeakPtr(),
- new_layer->common.resource_id)));;
- }
- texture_layer->SetPremultipliedAlpha(new_layer->texture->premult_alpha);
- gfx::RectF rect = PP_ToGfxRectF(new_layer->texture->source_rect);
- texture_layer->SetUV(rect.origin(), rect.bottom_right());
- return;
- }
-
- if (new_layer->image) {
- if (!old_layer ||
- new_layer->common.resource_id != old_layer->common.resource_id) {
- scoped_refptr<cc::TextureLayer> image_layer(
- static_cast<cc::TextureLayer*>(layer.get()));
- EnterResourceNoLock<PPB_ImageData_API> enter(new_layer->image->resource,
- true);
- DCHECK(enter.succeeded());
-
- // TODO(penghuang): support all kinds of image.
- PP_ImageDataDesc desc;
- PP_Bool rv = enter.object()->Describe(&desc);
- DCHECK_EQ(rv, PP_TRUE);
- DCHECK_EQ(desc.stride, desc.size.width * 4);
- DCHECK_EQ(desc.format, PP_IMAGEDATAFORMAT_RGBA_PREMUL);
-
- cc::TextureMailbox mailbox(image_shm.get(),
- PP_ToGfxSize(desc.size));
- image_layer->SetTextureMailbox(mailbox,
- cc::SingleReleaseCallback::Create(
- base::Bind(&PepperCompositorHost::ImageReleased,
- weak_factory_.GetWeakPtr(),
- new_layer->common.resource_id,
- base::Passed(&image_shm))));
-
- // ImageData is always premultiplied alpha.
- image_layer->SetPremultipliedAlpha(true);
- }
- return;
- }
- // Should not be reached.
- NOTREACHED();
-}
-
-void PepperCompositorHost::ResourceReleased(int32_t id,
- uint32_t sync_point,
- bool is_lost) {
- host()->SendUnsolicitedReply(
- pp_resource(),
- PpapiPluginMsg_Compositor_ReleaseResource(id, sync_point, is_lost));
-}
-
-void PepperCompositorHost::ImageReleased(
- int32_t id,
- const scoped_ptr<base::SharedMemory>& shared_memory,
- uint32_t sync_point,
- bool is_lost) {
- ResourceReleased(id, sync_point, is_lost);
-}
-
-int32_t PepperCompositorHost::OnResourceMessageReceived(
- const IPC::Message& msg,
- HostMessageContext* context) {
- PPAPI_BEGIN_MESSAGE_MAP(PepperCompositorHost, msg)
- PPAPI_DISPATCH_HOST_RESOURCE_CALL(
- PpapiHostMsg_Compositor_CommitLayers, OnHostMsgCommitLayers)
- PPAPI_END_MESSAGE_MAP()
- return ppapi::host::ResourceHost::OnResourceMessageReceived(msg, context);
-}
-
-bool PepperCompositorHost::IsCompositorHost() {
- return true;
-}
-
-int32_t PepperCompositorHost::OnHostMsgCommitLayers(
- HostMessageContext* context,
- const std::vector<ppapi::CompositorLayerData>& layers,
- bool reset) {
- // Do not support CommitLayers() on an unbounded compositor.
- if (!bound_instance_)
- return PP_ERROR_FAILED;
-
- if (commit_layers_reply_context_.is_valid())
- return PP_ERROR_INPROGRESS;
-
- commit_layers_reply_context_ = context->MakeReplyMessageContext();
-
- scoped_ptr<scoped_ptr<base::SharedMemory>[]> image_shms;
- if (layers.size() > 0) {
- image_shms.reset(new scoped_ptr<base::SharedMemory>[layers.size()]);
- if (!image_shms)
- return PP_ERROR_NOMEMORY;
- // Verfiy the layers first, if an error happens, we will return the error to
- // plugin and keep current layers set by the previous CommitLayers()
- // unchanged.
- for (size_t i = 0; i < layers.size(); ++i) {
- const ppapi::CompositorLayerData* old_layer = NULL;
- if (!reset && i < layers_.size())
- old_layer = &layers_[i].pp_layer;
- int32_t rv = VerifyCommittedLayer(old_layer, &layers[i], &image_shms[i]);
- if (rv != PP_OK)
- return rv;
- }
- }
-
- // ResetLayers() has been called, we need rebuild layer stack.
- if (reset) {
- layer_->RemoveAllChildren();
- layers_.clear();
- }
-
- for (size_t i = 0; i < layers.size(); ++i) {
- const ppapi::CompositorLayerData* pp_layer = &layers[i];
- LayerData* data = i >= layers_.size() ? NULL : &layers_[i];
- DCHECK(!data || data->cc_layer);
- scoped_refptr<cc::Layer> cc_layer = data ? data->cc_layer : NULL;
- ppapi::CompositorLayerData* old_layer = data ? &data->pp_layer : NULL;
-
- if (!cc_layer) {
- if (pp_layer->color)
- cc_layer = cc::SolidColorLayer::Create();
- else if (pp_layer->texture || pp_layer->image)
- cc_layer = cc::TextureLayer::CreateForMailbox(NULL);
- layer_->AddChild(cc_layer);
- }
-
- UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass());
-
- if (old_layer)
- *old_layer = *pp_layer;
- else
- layers_.push_back(LayerData(cc_layer, *pp_layer));
- }
-
- return PP_OK_COMPLETIONPENDING;
-}
-
-} // namespace content
« no previous file with comments | « content/renderer/pepper/pepper_compositor_host.h ('k') | content/renderer/pepper/pepper_plugin_instance_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698