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

Side by Side Diff: ppapi/proxy/compositor_layer_resource.cc

Issue 324983005: [PPAPI] Add browser tests for compositor API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@compositor_api_impl_new
Patch Set: Remove change in base folder. 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ppapi/proxy/compositor_layer_resource.h" 5 #include "ppapi/proxy/compositor_layer_resource.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "gpu/command_buffer/client/gles2_implementation.h" 8 #include "gpu/command_buffer/client/gles2_implementation.h"
9 #include "gpu/command_buffer/common/mailbox.h" 9 #include "gpu/command_buffer/common/mailbox.h"
10 #include "ppapi/proxy/compositor_resource.h" 10 #include "ppapi/proxy/compositor_resource.h"
(...skipping 10 matching lines...) Expand all
21 namespace ppapi { 21 namespace ppapi {
22 namespace proxy { 22 namespace proxy {
23 23
24 namespace { 24 namespace {
25 25
26 float clamp(float value) { 26 float clamp(float value) {
27 return std::min(std::max(value, 0.0f), 1.0f); 27 return std::min(std::max(value, 0.0f), 1.0f);
28 } 28 }
29 29
30 void OnTextureReleased( 30 void OnTextureReleased(
31 const scoped_refptr<CompositorResource> compositor,
31 const ScopedPPResource& layer, 32 const ScopedPPResource& layer,
32 const ScopedPPResource& context, 33 const ScopedPPResource& context,
33 uint32_t texture, 34 uint32_t texture,
34 const scoped_refptr<TrackedCallback>& release_callback, 35 const scoped_refptr<TrackedCallback>& release_callback,
35 uint32_t sync_point, 36 uint32_t sync_point,
36 bool is_lost) { 37 bool is_lost) {
37 if (!TrackedCallback::IsPending(release_callback)) 38 if (!TrackedCallback::IsPending(release_callback))
38 return; 39 return;
39 40
40 do { 41 do {
41 if (!sync_point) 42 if (!sync_point)
42 break; 43 break;
43 44
44 EnterResourceNoLock<PPB_Graphics3D_API> enter(context.get(), true); 45 EnterResourceNoLock<PPB_Graphics3D_API> enter(context.get(), true);
45 if (enter.failed()) 46 if (enter.failed())
46 break; 47 break;
47 48
48 PPB_Graphics3D_Shared* graphics = 49 PPB_Graphics3D_Shared* graphics =
49 static_cast<PPB_Graphics3D_Shared*>(enter.object()); 50 static_cast<PPB_Graphics3D_Shared*>(enter.object());
50 51
51 GLES2Implementation* gl = graphics->gles2_impl(); 52 GLES2Implementation* gl = graphics->gles2_impl();
52 gl->WaitSyncPointCHROMIUM(sync_point); 53 gl->WaitSyncPointCHROMIUM(sync_point);
53 } while (false); 54 } while (false);
54 55
55 release_callback->Run(is_lost ? PP_ERROR_FAILED : PP_OK); 56 release_callback->Run(is_lost ? PP_ERROR_FAILED : PP_OK);
56 } 57 }
57 58
58 void OnImageReleased( 59 void OnImageReleased(
60 const scoped_refptr<CompositorResource> compositor,
59 const ScopedPPResource& layer, 61 const ScopedPPResource& layer,
60 const ScopedPPResource& image, 62 const ScopedPPResource& image,
61 const scoped_refptr<TrackedCallback>& release_callback, 63 const scoped_refptr<TrackedCallback>& release_callback,
62 uint32_t sync_point, 64 uint32_t sync_point,
63 bool is_lost) { 65 bool is_lost) {
64 if (!TrackedCallback::IsPending(release_callback)) 66 if (!TrackedCallback::IsPending(release_callback))
65 return; 67 return;
66 release_callback->Run(PP_OK); 68 release_callback->Run(PP_OK);
67 } 69 }
68 70
69 } // namespace 71 } // namespace
70 72
71 CompositorLayerResource::CompositorLayerResource( 73 CompositorLayerResource::CompositorLayerResource(
72 Connection connection, 74 Connection connection,
73 PP_Instance instance, 75 PP_Instance instance,
74 const CompositorResource* compositor) 76 scoped_refptr<CompositorResource> compositor)
75 : PluginResource(connection, instance), 77 : PluginResource(connection, instance),
76 compositor_(compositor), 78 compositor_(compositor),
77 source_size_(PP_MakeFloatSize(0.0f, 0.0f)) { 79 source_size_(PP_MakeFloatSize(0.0f, 0.0f)) {
78 } 80 }
79 81
80 CompositorLayerResource::~CompositorLayerResource() { 82 CompositorLayerResource::~CompositorLayerResource() {
81 DCHECK(!compositor_); 83 DCHECK(!compositor_);
82 DCHECK(release_callback_.is_null()); 84 DCHECK(release_callback_.is_null());
83 } 85 }
84 86
(...skipping 13 matching lines...) Expand all
98 if (compositor_->IsInProgress()) 100 if (compositor_->IsInProgress())
99 return PP_ERROR_INPROGRESS; 101 return PP_ERROR_INPROGRESS;
100 102
101 if (!SetType(TYPE_COLOR)) 103 if (!SetType(TYPE_COLOR))
102 return PP_ERROR_BADARGUMENT; 104 return PP_ERROR_BADARGUMENT;
103 DCHECK(data_.color); 105 DCHECK(data_.color);
104 106
105 if (!size) 107 if (!size)
106 return PP_ERROR_BADARGUMENT; 108 return PP_ERROR_BADARGUMENT;
107 109
108
109 data_.color->red = clamp(red); 110 data_.color->red = clamp(red);
110 data_.color->green = clamp(green); 111 data_.color->green = clamp(green);
111 data_.color->blue = clamp(blue); 112 data_.color->blue = clamp(blue);
112 data_.color->alpha = clamp(alpha); 113 data_.color->alpha = clamp(alpha);
113 data_.common.size = *size; 114 data_.common.size = *size;
114 115
115 return PP_OK; 116 return PP_OK;
116 } 117 }
117 118
118 int32_t CompositorLayerResource::SetTexture( 119 int32_t CompositorLayerResource::SetTexture(
(...skipping 12 matching lines...) Expand all
131 132
132 if (!size || size->width <= 0 || size->height <= 0) 133 if (!size || size->width <= 0 || size->height <= 0)
133 return PP_ERROR_BADARGUMENT; 134 return PP_ERROR_BADARGUMENT;
134 135
135 PPB_Graphics3D_Shared* graphics = 136 PPB_Graphics3D_Shared* graphics =
136 static_cast<PPB_Graphics3D_Shared*>(enter.object()); 137 static_cast<PPB_Graphics3D_Shared*>(enter.object());
137 138
138 GLES2Implementation* gl = graphics->gles2_impl(); 139 GLES2Implementation* gl = graphics->gles2_impl();
139 140
140 // Generate a Mailbox for the texture. 141 // Generate a Mailbox for the texture.
141 gl->GenMailboxCHROMIUM( 142 // gl->GenMailboxCHROMIUM(
142 reinterpret_cast<GLbyte*>(data_.texture->mailbox.name)); 143 // reinterpret_cast<GLbyte*>(data_.texture->mailbox.name));
144 //
145 // TODO(penghuang): Use gl->GenMailboxCHROMIUM() when the bug in
146 // nacl_secure_random() is fixed.
piman 2014/06/19 20:44:04 I thought that was getting fixed. Let's remove thi
Peng 2014/06/19 22:33:41 Done.
147 static bool flag = false;
148 if (!flag) {
149 srand(time(NULL));
150 flag = true;
151 }
152 uint8_t value = 1;
153 for (size_t i = 1; i < arraysize(data_.texture->mailbox.name); ++i) {
154 data_.texture->mailbox.name[i] = static_cast<uint8_t>(rand());
155 value ^= data_.texture->mailbox.name[i];
156 }
157 data_.texture->mailbox.name[0] = value;
143 gl->ProduceTextureDirectCHROMIUM( 158 gl->ProduceTextureDirectCHROMIUM(
144 texture, GL_TEXTURE_2D, 159 texture, GL_TEXTURE_2D,
145 reinterpret_cast<const GLbyte*>(data_.texture->mailbox.name)); 160 reinterpret_cast<const GLbyte*>(data_.texture->mailbox.name));
146 161
147 // Set the source size to (1, 1). It will be used to verify the source_rect 162 // Set the source size to (1, 1). It will be used to verify the source_rect
148 // passed to SetSourceRect(). 163 // passed to SetSourceRect().
149 source_size_ = PP_MakeFloatSize(1.0f, 1.0f); 164 source_size_ = PP_MakeFloatSize(1.0f, 1.0f);
150 165
151 data_.common.size = *size; 166 data_.common.size = *size;
152 data_.common.resource_id = compositor_->GenerateResourceId(); 167 data_.common.resource_id = compositor_->GenerateResourceId();
153 data_.texture->sync_point = gl->InsertSyncPointCHROMIUM(); 168 data_.texture->sync_point = gl->InsertSyncPointCHROMIUM();
154 data_.texture->source_rect.point = PP_MakeFloatPoint(0.0f, 0.0f); 169 data_.texture->source_rect.point = PP_MakeFloatPoint(0.0f, 0.0f);
155 data_.texture->source_rect.size = source_size_; 170 data_.texture->source_rect.size = source_size_;
156 171
157 // If the PP_Resource of this layer is released by the plugin, the 172 // If the PP_Resource of this layer is released by the plugin, the
158 // release_callback will be aborted immediately, but the texture or image 173 // release_callback will be aborted immediately, but the texture or image
159 // in this layer may still being used by chromium compositor. So we have to 174 // in this layer may still being used by chromium compositor. So we have to
160 // use ScopedPPResource to keep this resource alive until the texture or image 175 // use ScopedPPResource to keep this resource alive until the texture or image
161 // is released by the chromium compositor. 176 // is released by the chromium compositor. And we need keep the compositor
177 // alive, otherwise we will not receive the release IPC message for the
178 // texture.
piman 2014/06/19 20:44:04 maybe you should let the plugin do that.
Peng 2014/06/19 22:33:41 Done.
162 release_callback_ = base::Bind( 179 release_callback_ = base::Bind(
163 &OnTextureReleased, 180 &OnTextureReleased,
181 compositor_, // Keep compositor alive.
164 ScopedPPResource(pp_resource()), // Keep layer alive. 182 ScopedPPResource(pp_resource()), // Keep layer alive.
165 ScopedPPResource(context), // Keep context alive 183 ScopedPPResource(context), // Keep context alive
166 texture, 184 texture,
167 release_callback); 185 release_callback);
168 186
169 return PP_OK_COMPLETIONPENDING; 187 return PP_OK_COMPLETIONPENDING;
170 } 188 }
171 189
172 int32_t CompositorLayerResource::SetImage( 190 int32_t CompositorLayerResource::SetImage(
173 PP_Resource image_data, 191 PP_Resource image_data,
(...skipping 26 matching lines...) Expand all
200 // Set the source size to image's size. It will be used to verify 218 // Set the source size to image's size. It will be used to verify
201 // the source_rect passed to SetSourceRect(). 219 // the source_rect passed to SetSourceRect().
202 source_size_ = PP_MakeFloatSize(desc.size.width, desc.size.height); 220 source_size_ = PP_MakeFloatSize(desc.size.width, desc.size.height);
203 221
204 data_.common.size = size ? *size : desc.size; 222 data_.common.size = size ? *size : desc.size;
205 data_.common.resource_id = compositor_->GenerateResourceId(); 223 data_.common.resource_id = compositor_->GenerateResourceId();
206 data_.image->resource = enter.resource()->host_resource().host_resource(); 224 data_.image->resource = enter.resource()->host_resource().host_resource();
207 data_.image->source_rect.point = PP_MakeFloatPoint(0.0f, 0.0f); 225 data_.image->source_rect.point = PP_MakeFloatPoint(0.0f, 0.0f);
208 data_.image->source_rect.size = source_size_; 226 data_.image->source_rect.size = source_size_;
209 227
228 // If the PP_Resource of this layer is released by the plugin, the
229 // release_callback will be aborted immediately, but the texture or image
230 // in this layer may still being used by chromium compositor. So we have to
231 // use ScopedPPResource to keep this resource alive until the texture or image
232 // is released by the chromium compositor. And we need keep the compositor
233 // alive, otherwise we will not receive the release IPC message for the image.
210 release_callback_ = base::Bind( 234 release_callback_ = base::Bind(
211 &OnImageReleased, 235 &OnImageReleased,
236 compositor_, // Keep compositor alive.
212 ScopedPPResource(pp_resource()), // Keep layer alive. 237 ScopedPPResource(pp_resource()), // Keep layer alive.
213 ScopedPPResource(image_data), // Keep image_data alive. 238 ScopedPPResource(image_data), // Keep image_data alive.
214 release_callback); 239 release_callback);
215 240
216 return PP_OK_COMPLETIONPENDING; 241 return PP_OK_COMPLETIONPENDING;
217 } 242 }
218 243
219 int32_t CompositorLayerResource::SetClipRect(const PP_Rect* rect) { 244 int32_t CompositorLayerResource::SetClipRect(const PP_Rect* rect) {
220 if (!compositor_) 245 if (!compositor_)
221 return PP_ERROR_BADRESOURCE; 246 return PP_ERROR_BADRESOURCE;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 } 351 }
327 352
328 // Should not be reached. 353 // Should not be reached.
329 DCHECK(false); 354 DCHECK(false);
330 return false; 355 return false;
331 } 356 }
332 357
333 int32_t CompositorLayerResource::CheckForSetTextureAndImage( 358 int32_t CompositorLayerResource::CheckForSetTextureAndImage(
334 LayerType type, 359 LayerType type,
335 const scoped_refptr<TrackedCallback>& release_callback) { 360 const scoped_refptr<TrackedCallback>& release_callback) {
336 if (!compositor_) 361 if (!compositor_)
337 return PP_ERROR_BADRESOURCE; 362 return PP_ERROR_BADRESOURCE;
338 363
339 if (compositor_->IsInProgress()) 364 if (compositor_->IsInProgress())
340 return PP_ERROR_INPROGRESS; 365 return PP_ERROR_INPROGRESS;
341 366
342 if (!SetType(type)) 367 if (!SetType(type))
343 return PP_ERROR_BADARGUMENT; 368 return PP_ERROR_BADARGUMENT;
344 369
345 // The layer's image has been set and it is not committed. 370 // The layer's image has been set and it is not committed.
346 if (!release_callback_.is_null()) 371 if (!release_callback_.is_null())
347 return PP_ERROR_INPROGRESS; 372 return PP_ERROR_INPROGRESS;
348 373
349 // Do not allow using a block callback as a release callback. 374 // Do not allow using a block callback as a release callback.
350 if (release_callback->is_blocking()) 375 if (release_callback->is_blocking())
351 return PP_ERROR_BADARGUMENT; 376 return PP_ERROR_BADARGUMENT;
352 377
353 return PP_OK; 378 return PP_OK;
354 } 379 }
355 380
356 } // namespace proxy 381 } // namespace proxy
357 } // namespace ppapi 382 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698