Chromium Code Reviews| Index: ppapi/proxy/compositor_layer_resource.cc |
| diff --git a/ppapi/proxy/compositor_layer_resource.cc b/ppapi/proxy/compositor_layer_resource.cc |
| index fb1bbe5139aa863c14d697558e12f15a9beb6b28..376227029cf24c1a0d00193011f4b183c1ccabdf 100644 |
| --- a/ppapi/proxy/compositor_layer_resource.cc |
| +++ b/ppapi/proxy/compositor_layer_resource.cc |
| @@ -45,6 +45,7 @@ float clamp(float value) { |
| } |
| void OnTextureReleased( |
| + const scoped_refptr<CompositorResource> compositor, |
| const ScopedPPResource& layer, |
| const ScopedPPResource& context, |
| uint32_t texture, |
| @@ -73,6 +74,7 @@ void OnTextureReleased( |
| } |
| void OnImageReleased( |
| + const scoped_refptr<CompositorResource> compositor, |
| const ScopedPPResource& layer, |
| const ScopedPPResource& image, |
| const scoped_refptr<TrackedCallback>& release_callback, |
| @@ -88,7 +90,7 @@ void OnImageReleased( |
| CompositorLayerResource::CompositorLayerResource( |
| Connection connection, |
| PP_Instance instance, |
| - const CompositorResource* compositor) |
| + scoped_refptr<CompositorResource> compositor) |
| : PluginResource(connection, instance), |
| compositor_(compositor), |
| source_size_(PP_MakeFloatSize(0.0f, 0.0f)) { |
| @@ -112,6 +114,8 @@ int32_t CompositorLayerResource::SetColor(float red, |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
|
piman
2014/06/18 00:55:24
no CHECK. Use DCHECK.
I don't think this DCHECK i
Peng
2014/06/18 02:35:03
If we allow an unbound compositor to have valid la
piman
2014/06/18 20:30:55
This should not happen. TextureLayer keeps a refer
|
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -122,7 +126,6 @@ int32_t CompositorLayerResource::SetColor(float red, |
| if (!size) |
| return PP_ERROR_BADARGUMENT; |
| - |
| data_.color->red = clamp(red); |
| data_.color->green = clamp(green); |
| data_.color->blue = clamp(blue); |
| @@ -177,8 +180,11 @@ int32_t CompositorLayerResource::SetTexture( |
| // in this layer may still being used by chromium compositor. So we have to |
| // use ScopedPPResource to keep this resource alive until the texture or image |
| // is released by the chromium compositor. |
| + // We also need keep the compositor alive, otherwise we will not receive |
| + // the release IPC message for the texture. |
| release_callback_ = base::Bind( |
| &OnTextureReleased, |
| + compositor_, // Keep compositor alive. |
| ScopedPPResource(pp_resource()), // Keep layer alive. |
| ScopedPPResource(context), // Keep context alive |
| texture, |
| @@ -225,8 +231,16 @@ int32_t CompositorLayerResource::SetImage( |
| data_.image->source_rect.point = PP_MakeFloatPoint(0.0f, 0.0f); |
| data_.image->source_rect.size = source_size_; |
| + // If the PP_Resource of this layer is released by the plugin, the |
| + // release_callback will be aborted immediately, but the texture or image |
| + // in this layer may still being used by chromium compositor. So we have to |
| + // use ScopedPPResource to keep this resource alive until the texture or image |
| + // is released by the chromium compositor. |
| + // We also need keep the compositor alive, otherwise we will not receive |
| + // the release IPC message for the image. |
| release_callback_ = base::Bind( |
| &OnImageReleased, |
| + compositor_, // Keep compositor alive. |
| ScopedPPResource(pp_resource()), // Keep layer alive. |
| ScopedPPResource(image_data), // Keep image_data alive. |
| release_callback); |
| @@ -238,6 +252,8 @@ int32_t CompositorLayerResource::SetClipRect(const PP_Rect* rect) { |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
|
piman
2014/06/18 00:55:24
Same here, and other below.
Peng
2014/06/18 02:35:03
Same reason.
|
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -249,6 +265,8 @@ int32_t CompositorLayerResource::SetTransform(const float matrix[16]) { |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -260,6 +278,8 @@ int32_t CompositorLayerResource::SetOpacity(float opacity) { |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -271,6 +291,8 @@ int32_t CompositorLayerResource::SetBlendMode(PP_BlendMode mode) { |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -288,6 +310,8 @@ int32_t CompositorLayerResource::SetSourceRect( |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -314,6 +338,8 @@ int32_t CompositorLayerResource::SetPremultipliedAlpha(PP_Bool premult) { |
| if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |
| @@ -351,9 +377,11 @@ bool CompositorLayerResource::SetType(LayerType type) { |
| int32_t CompositorLayerResource::CheckForSetTextureAndImage( |
| LayerType type, |
| const scoped_refptr<TrackedCallback>& release_callback) { |
| - if (!compositor_) |
| + if (!compositor_) |
| return PP_ERROR_BADRESOURCE; |
| + CHECK(compositor_->bound_to_instance()); |
| + |
| if (compositor_->IsInProgress()) |
| return PP_ERROR_INPROGRESS; |