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

Side by Side Diff: content/common/gpu/texture_image_transport_surface.cc

Issue 10052018: Drop frontbuffers with ui-use-gpu-process, synchronized with browser, decoupled from backbuffer dro… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Storing the list of thumbnail callbacks, so that we can issue them upon RWHVA destruction. Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/common/gpu/texture_image_transport_surface.h" 5 #include "content/common/gpu/texture_image_transport_surface.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 65
66 TextureImageTransportSurface::TextureImageTransportSurface( 66 TextureImageTransportSurface::TextureImageTransportSurface(
67 GpuChannelManager* manager, 67 GpuChannelManager* manager,
68 GpuCommandBufferStub* stub, 68 GpuCommandBufferStub* stub,
69 const gfx::GLSurfaceHandle& handle) 69 const gfx::GLSurfaceHandle& handle)
70 : fbo_id_(0), 70 : fbo_id_(0),
71 front_(0), 71 front_(0),
72 stub_destroyed_(false), 72 stub_destroyed_(false),
73 backbuffer_suggested_allocation_(true), 73 backbuffer_suggested_allocation_(true),
74 frontbuffer_suggested_allocation_(true), 74 frontbuffer_suggested_allocation_(true),
75 frontbuffer_is_protected_(true),
76 protection_state_id_(0),
75 handle_(handle), 77 handle_(handle),
76 parent_stub_(NULL) { 78 parent_stub_(NULL) {
77 helper_.reset(new ImageTransportHelper(this, 79 helper_.reset(new ImageTransportHelper(this,
78 manager, 80 manager,
79 stub, 81 stub,
80 gfx::kNullPluginWindow)); 82 gfx::kNullPluginWindow));
81 83
82 stub->AddDestructionObserver(this); 84 stub->AddDestructionObserver(this);
83 } 85 }
84 86
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 } 180 }
179 181
180 void TextureImageTransportSurface::SetBackbufferAllocation(bool allocation) { 182 void TextureImageTransportSurface::SetBackbufferAllocation(bool allocation) {
181 if (backbuffer_suggested_allocation_ == allocation) 183 if (backbuffer_suggested_allocation_ == allocation)
182 return; 184 return;
183 backbuffer_suggested_allocation_ = allocation; 185 backbuffer_suggested_allocation_ = allocation;
184 186
185 if (!helper_->MakeCurrent()) 187 if (!helper_->MakeCurrent())
186 return; 188 return;
187 189
188 if (backbuffer_suggested_allocation_) 190 if (backbuffer_suggested_allocation_) {
191 DCHECK(!textures_[back()].info->service_id() ||
192 !textures_[back()].sent_to_client);
189 CreateBackTexture(textures_[back()].size); 193 CreateBackTexture(textures_[back()].size);
190 else 194 } else {
191 ReleaseBackTexture(); 195 ReleaseTexture(back());
196 }
192 } 197 }
193 198
194 void TextureImageTransportSurface::SetFrontbufferAllocation(bool allocation) { 199 void TextureImageTransportSurface::SetFrontbufferAllocation(bool allocation) {
195 if (frontbuffer_suggested_allocation_ == allocation) 200 if (frontbuffer_suggested_allocation_ == allocation)
196 return; 201 return;
197 frontbuffer_suggested_allocation_ = allocation; 202 frontbuffer_suggested_allocation_ = allocation;
203 AdjustFrontBufferAllocation();
204 }
205
206 void TextureImageTransportSurface::AdjustFrontBufferAllocation() {
207 if (!helper_->MakeCurrent())
208 return;
209
210 if (!frontbuffer_suggested_allocation_ && !frontbuffer_is_protected_ &&
211 textures_[front()].info->service_id()) {
212 ReleaseTexture(front());
213 if (textures_[front()].sent_to_client) {
214 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
215 params.identifier = textures_[front()].client_id;
216 helper_->SendAcceleratedSurfaceRelease(params);
217 textures_[front()].sent_to_client = false;
218 }
219 }
198 } 220 }
199 221
200 void* TextureImageTransportSurface::GetShareHandle() { 222 void* TextureImageTransportSurface::GetShareHandle() {
201 return GetHandle(); 223 return GetHandle();
202 } 224 }
203 225
204 void* TextureImageTransportSurface::GetDisplay() { 226 void* TextureImageTransportSurface::GetDisplay() {
205 return parent_stub_ ? parent_stub_->surface()->GetDisplay() : NULL; 227 return parent_stub_ ? parent_stub_->surface()->GetDisplay() : NULL;
206 } 228 }
207 229
(...skipping 20 matching lines...) Expand all
228 CHECK_GL_ERROR(); 250 CHECK_GL_ERROR();
229 fbo_id_ = 0; 251 fbo_id_ = 0;
230 } 252 }
231 253
232 stub_destroyed_ = true; 254 stub_destroyed_ = true;
233 } 255 }
234 } 256 }
235 257
236 bool TextureImageTransportSurface::SwapBuffers() { 258 bool TextureImageTransportSurface::SwapBuffers() {
237 DCHECK(backbuffer_suggested_allocation_); 259 DCHECK(backbuffer_suggested_allocation_);
238 if (!frontbuffer_suggested_allocation_) 260 if (!frontbuffer_suggested_allocation_ || !frontbuffer_is_protected_)
239 return true; 261 return true;
240 if (!parent_stub_) { 262 if (!parent_stub_) {
241 LOG(ERROR) << "SwapBuffers failed because no parent stub."; 263 LOG(ERROR) << "SwapBuffers failed because no parent stub.";
242 return false; 264 return false;
243 } 265 }
244 266
245 glFlush(); 267 glFlush();
246 front_ = back(); 268 front_ = back();
247 previous_damage_rect_ = gfx::Rect(textures_[front_].size); 269 previous_damage_rect_ = gfx::Rect(textures_[front()].size);
248 270
249 DCHECK(textures_[front_].client_id != 0); 271 DCHECK(textures_[front()].client_id != 0);
250 272
251 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 273 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
252 params.surface_handle = textures_[front_].client_id; 274 params.surface_handle = textures_[front()].client_id;
275 params.protection_state_id = protection_state_id_;
276 params.skip_ack = false;
253 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 277 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
254 helper_->SetScheduled(false); 278 helper_->SetScheduled(false);
255 return true; 279 return true;
256 } 280 }
257 281
258 bool TextureImageTransportSurface::PostSubBuffer( 282 bool TextureImageTransportSurface::PostSubBuffer(
259 int x, int y, int width, int height) { 283 int x, int y, int width, int height) {
260 DCHECK(backbuffer_suggested_allocation_); 284 DCHECK(backbuffer_suggested_allocation_);
261 if (!frontbuffer_suggested_allocation_) 285 DCHECK(textures_[back()].info->service_id());
286 if (!frontbuffer_suggested_allocation_ || !frontbuffer_is_protected_)
262 return true; 287 return true;
263 // If we are recreating the frontbuffer with this swap, make sure we are 288 // If we are recreating the frontbuffer with this swap, make sure we are
264 // drawing a full frame. 289 // drawing a full frame.
265 DCHECK(textures_[front_].info->service_id() || 290 DCHECK(textures_[front()].info->service_id() ||
266 (!x && !y && gfx::Size(width, height) == textures_[back()].size)); 291 (!x && !y && gfx::Size(width, height) == textures_[back()].size));
267 if (!parent_stub_) { 292 if (!parent_stub_) {
268 LOG(ERROR) << "PostSubBuffer failed because no parent stub."; 293 LOG(ERROR) << "PostSubBuffer failed because no parent stub.";
269 return false; 294 return false;
270 } 295 }
271 296
272 DCHECK(textures_[back()].info);
273 int back_texture_service_id = textures_[back()].info->service_id();
274
275 DCHECK(textures_[front_].info);
276 int front_texture_service_id = textures_[front_].info->service_id();
277
278 gfx::Size expected_size = textures_[back()].size;
279 bool surfaces_same_size = textures_[front_].size == expected_size;
280
281 const gfx::Rect new_damage_rect(x, y, width, height); 297 const gfx::Rect new_damage_rect(x, y, width, height);
282 298
283 // An empty damage rect is a successful no-op. 299 // An empty damage rect is a successful no-op.
284 if (new_damage_rect.IsEmpty()) 300 if (new_damage_rect.IsEmpty())
285 return true; 301 return true;
286 302
303 int back_texture_service_id = textures_[back()].info->service_id();
304 int front_texture_service_id = textures_[front()].info->service_id();
305
306 gfx::Size expected_size = textures_[back()].size;
307 bool surfaces_same_size = textures_[front()].size == expected_size;
308
287 if (surfaces_same_size) { 309 if (surfaces_same_size) {
288 std::vector<gfx::Rect> regions_to_copy; 310 std::vector<gfx::Rect> regions_to_copy;
289 GetRegionsToCopy(previous_damage_rect_, new_damage_rect, &regions_to_copy); 311 GetRegionsToCopy(previous_damage_rect_, new_damage_rect, &regions_to_copy);
290 312
291 ScopedFrameBufferBinder fbo_binder(fbo_id_); 313 ScopedFrameBufferBinder fbo_binder(fbo_id_);
292 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 314 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
293 GL_COLOR_ATTACHMENT0, 315 GL_COLOR_ATTACHMENT0,
294 GL_TEXTURE_2D, 316 GL_TEXTURE_2D,
295 front_texture_service_id, 317 front_texture_service_id,
296 0); 318 0);
297 ScopedTextureBinder texture_binder(back_texture_service_id); 319 ScopedTextureBinder texture_binder(back_texture_service_id);
298 320
299 for (size_t i = 0; i < regions_to_copy.size(); ++i) { 321 for (size_t i = 0; i < regions_to_copy.size(); ++i) {
300 const gfx::Rect& region_to_copy = regions_to_copy[i]; 322 const gfx::Rect& region_to_copy = regions_to_copy[i];
301 if (!region_to_copy.IsEmpty()) { 323 if (!region_to_copy.IsEmpty()) {
302 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, region_to_copy.x(), 324 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, region_to_copy.x(),
303 region_to_copy.y(), region_to_copy.x(), region_to_copy.y(), 325 region_to_copy.y(), region_to_copy.x(), region_to_copy.y(),
304 region_to_copy.width(), region_to_copy.height()); 326 region_to_copy.width(), region_to_copy.height());
305 } 327 }
306 } 328 }
307 } else { 329 } else {
308 DCHECK(new_damage_rect == gfx::Rect(expected_size)); 330 DCHECK(new_damage_rect == gfx::Rect(expected_size));
309 } 331 }
310 332
311 glFlush(); 333 glFlush();
312 front_ = back(); 334 front_ = back();
335 previous_damage_rect_ = new_damage_rect;
336
337 DCHECK(textures_[front()].client_id);
313 338
314 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params; 339 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params;
315 params.surface_handle = textures_[front_].client_id; 340 params.surface_handle = textures_[front()].client_id;
316 params.x = x; 341 params.x = x;
317 params.y = y; 342 params.y = y;
318 params.width = width; 343 params.width = width;
319 params.height = height; 344 params.height = height;
345 params.protection_state_id = protection_state_id_;
320 helper_->SendAcceleratedSurfacePostSubBuffer(params); 346 helper_->SendAcceleratedSurfacePostSubBuffer(params);
321 helper_->SetScheduled(false); 347 helper_->SetScheduled(false);
322
323 previous_damage_rect_ = new_damage_rect;
324 return true; 348 return true;
325 } 349 }
326 350
327 std::string TextureImageTransportSurface::GetExtensions() { 351 std::string TextureImageTransportSurface::GetExtensions() {
328 std::string extensions = gfx::GLSurface::GetExtensions(); 352 std::string extensions = gfx::GLSurface::GetExtensions();
329 extensions += extensions.empty() ? "" : " "; 353 extensions += extensions.empty() ? "" : " ";
330 extensions += "GL_CHROMIUM_front_buffer_cached "; 354 extensions += "GL_CHROMIUM_front_buffer_cached ";
331 extensions += "GL_CHROMIUM_post_sub_buffer"; 355 extensions += "GL_CHROMIUM_post_sub_buffer";
332 return extensions; 356 return extensions;
333 } 357 }
334 358
335 gfx::Size TextureImageTransportSurface::GetSize() { 359 gfx::Size TextureImageTransportSurface::GetSize() {
336 gfx::Size size = textures_[back()].size; 360 gfx::Size size = textures_[back()].size;
337 361
338 // OSMesa expects a non-zero size. 362 // OSMesa expects a non-zero size.
339 return gfx::Size(size.width() == 0 ? 1 : size.width(), 363 return gfx::Size(size.width() == 0 ? 1 : size.width(),
340 size.height() == 0 ? 1 : size.height()); 364 size.height() == 0 ? 1 : size.height());
341 } 365 }
342 366
343 void* TextureImageTransportSurface::GetHandle() { 367 void* TextureImageTransportSurface::GetHandle() {
344 return parent_stub_ ? parent_stub_->surface()->GetHandle() : NULL; 368 return parent_stub_ ? parent_stub_->surface()->GetHandle() : NULL;
345 } 369 }
346 370
347 unsigned TextureImageTransportSurface::GetFormat() { 371 unsigned TextureImageTransportSurface::GetFormat() {
348 return parent_stub_ ? parent_stub_->surface()->GetFormat() : 0; 372 return parent_stub_ ? parent_stub_->surface()->GetFormat() : 0;
349 } 373 }
350 374
375 void TextureImageTransportSurface::OnSetFrontSurfaceIsProtected(
376 bool is_protected, uint32 protection_state_id) {
377 protection_state_id_ = protection_state_id;
378 if (frontbuffer_is_protected_ == is_protected)
379 return;
380 frontbuffer_is_protected_ = is_protected;
381 AdjustFrontBufferAllocation();
382
383 // If surface is set to protected, and we haven't actually released it yet,
384 // we can set the ui surface handle now just by sending a swap message.
385 if (is_protected && textures_[front()].info->service_id() &&
386 textures_[front()].sent_to_client) {
387 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
388 params.surface_handle = textures_[front()].client_id;
389 params.protection_state_id = protection_state_id_;
390 params.skip_ack = true;
391 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
392 }
393 }
394
351 void TextureImageTransportSurface::OnBufferPresented(uint32 sync_point) { 395 void TextureImageTransportSurface::OnBufferPresented(uint32 sync_point) {
352 if (sync_point == 0) { 396 if (sync_point == 0) {
353 BufferPresentedImpl(); 397 BufferPresentedImpl();
354 } else { 398 } else {
355 helper_->manager()->sync_point_manager()->AddSyncPointCallback( 399 helper_->manager()->sync_point_manager()->AddSyncPointCallback(
356 sync_point, 400 sync_point,
357 base::Bind(&TextureImageTransportSurface::BufferPresentedImpl, 401 base::Bind(&TextureImageTransportSurface::BufferPresentedImpl,
358 this->AsWeakPtr())); 402 this->AsWeakPtr()));
359 } 403 }
360 } 404 }
361 405
362 void TextureImageTransportSurface::BufferPresentedImpl() { 406 void TextureImageTransportSurface::BufferPresentedImpl() {
363 // We're relying on the fact that the parent context is 407 // We're relying on the fact that the parent context is
364 // finished with it's context when it inserts the sync point that 408 // finished with it's context when it inserts the sync point that
365 // triggers this callback. 409 // triggers this callback.
366 if (helper_->MakeCurrent()) { 410 if (helper_->MakeCurrent()) {
367 if (textures_[front_].size != textures_[back()].size) { 411 if (textures_[front()].size != textures_[back()].size ||
368 CreateBackTexture(textures_[front_].size); 412 !textures_[back()].info->service_id() ||
413 !textures_[back()].sent_to_client) {
414 // We may get an ACK from a stale swap just to reschedule. In that case,
415 // we may not have a backbuffer suggestion and should not recreate one.
416 if (backbuffer_suggested_allocation_)
417 CreateBackTexture(textures_[front()].size);
369 } else { 418 } else {
370 AttachBackTextureToFBO(); 419 AttachBackTextureToFBO();
371 } 420 }
372 } 421 }
373 422
374 // Even if MakeCurrent fails, schedule anyway, to trigger the lost context 423 // Even if MakeCurrent fails, schedule anyway, to trigger the lost context
375 // logic. 424 // logic.
376 helper_->SetScheduled(true); 425 helper_->SetScheduled(true);
377 } 426 }
378 427
379 void TextureImageTransportSurface::OnResizeViewACK() { 428 void TextureImageTransportSurface::OnResizeViewACK() {
380 NOTREACHED(); 429 NOTREACHED();
381 } 430 }
382 431
383 void TextureImageTransportSurface::ReleaseBackTexture() { 432 void TextureImageTransportSurface::ReleaseTexture(int id) {
384 if (!parent_stub_) 433 if (!parent_stub_)
385 return; 434 return;
386 TextureInfo* info = textures_[back()].info; 435 Texture& texture = textures_[id];
436 TextureInfo* info = texture.info;
387 DCHECK(info); 437 DCHECK(info);
388 438
389 GLuint service_id = info->service_id(); 439 GLuint service_id = info->service_id();
390 if (!service_id) 440 if (!service_id)
391 return; 441 return;
392 info->SetServiceId(0); 442 info->SetServiceId(0);
393 443
394 { 444 {
395 ScopedFrameBufferBinder fbo_binder(fbo_id_); 445 ScopedFrameBufferBinder fbo_binder(fbo_id_);
396 glDeleteTextures(1, &service_id); 446 glDeleteTextures(1, &service_id);
397 } 447 }
398 glFlush(); 448 glFlush();
399 CHECK_GL_ERROR(); 449 CHECK_GL_ERROR();
400 } 450 }
401 451
402 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) { 452 void TextureImageTransportSurface::CreateBackTexture(const gfx::Size& size) {
403 if (!parent_stub_) 453 if (!parent_stub_)
404 return; 454 return;
405 Texture& texture = textures_[back()]; 455 Texture& texture = textures_[back()];
406 TextureInfo* info = texture.info; 456 TextureInfo* info = texture.info;
407 DCHECK(info); 457 DCHECK(info);
408 458
409 GLuint service_id = info->service_id(); 459 GLuint service_id = info->service_id();
410 460
411 if (service_id && texture.size == size) 461 if (service_id && texture.size == size && texture.sent_to_client)
412 return; 462 return;
413 463
414 if (!service_id) { 464 if (!service_id) {
415 glGenTextures(1, &service_id); 465 glGenTextures(1, &service_id);
416 info->SetServiceId(service_id); 466 info->SetServiceId(service_id);
417 } 467 }
418 468
419 if (size != texture.size) { 469 if (size != texture.size) {
420 texture.size = size; 470 texture.size = size;
421 TextureManager* texture_manager = 471 TextureManager* texture_manager =
(...skipping 30 matching lines...) Expand all
452 params.width = size.width(); 502 params.width = size.width();
453 params.height = size.height(); 503 params.height = size.height();
454 params.surface_handle = texture.client_id; 504 params.surface_handle = texture.client_id;
455 helper_->SendAcceleratedSurfaceNew(params); 505 helper_->SendAcceleratedSurfaceNew(params);
456 texture.sent_to_client = true; 506 texture.sent_to_client = true;
457 } 507 }
458 508
459 void TextureImageTransportSurface::AttachBackTextureToFBO() { 509 void TextureImageTransportSurface::AttachBackTextureToFBO() {
460 if (!parent_stub_) 510 if (!parent_stub_)
461 return; 511 return;
462 DCHECK(textures_[back()].info); 512 TextureInfo* info = textures_[back()].info;
513 DCHECK(info);
463 514
464 ScopedFrameBufferBinder fbo_binder(fbo_id_); 515 ScopedFrameBufferBinder fbo_binder(fbo_id_);
465 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 516 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
466 GL_COLOR_ATTACHMENT0, 517 GL_COLOR_ATTACHMENT0,
467 GL_TEXTURE_2D, 518 GL_TEXTURE_2D,
468 textures_[back()].info->service_id(), 519 info->service_id(),
469 0); 520 0);
470 glFlush(); 521 glFlush();
471 CHECK_GL_ERROR(); 522 CHECK_GL_ERROR();
472 523
473 #ifndef NDEBUG 524 #ifndef NDEBUG
474 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 525 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
475 if (status != GL_FRAMEBUFFER_COMPLETE) { 526 if (status != GL_FRAMEBUFFER_COMPLETE) {
476 DLOG(ERROR) << "Framebuffer incomplete."; 527 DLOG(ERROR) << "Framebuffer incomplete.";
477 } 528 }
478 #endif 529 #endif
479 } 530 }
480 531
481 void TextureImageTransportSurface::ReleaseParentStub() { 532 void TextureImageTransportSurface::ReleaseParentStub() {
482 DCHECK(parent_stub_); 533 DCHECK(parent_stub_);
483 parent_stub_->RemoveDestructionObserver(this); 534 parent_stub_->RemoveDestructionObserver(this);
484 for (int i = 0; i < 2; ++i) { 535 for (int i = 0; i < 2; ++i) {
485 Texture& texture = textures_[i]; 536 Texture& texture = textures_[i];
486 texture.info = NULL; 537 texture.info = NULL;
487 if (!texture.sent_to_client) 538 if (!texture.sent_to_client)
488 continue; 539 continue;
489 GpuHostMsg_AcceleratedSurfaceRelease_Params params; 540 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
490 params.identifier = texture.client_id; 541 params.identifier = texture.client_id;
491 helper_->SendAcceleratedSurfaceRelease(params); 542 helper_->SendAcceleratedSurfaceRelease(params);
492 } 543 }
493 parent_stub_ = NULL; 544 parent_stub_ = NULL;
494 } 545 }
OLDNEW
« no previous file with comments | « content/common/gpu/texture_image_transport_surface.h ('k') | content/public/common/content_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698