OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/media/renderer_gpu_video_accelerator_factories.h" | 5 #include "content/renderer/media/renderer_gpu_video_accelerator_factories.h" |
6 | 6 |
7 #include <GLES2/gl2.h> | 7 #include <GLES2/gl2.h> |
8 #include <GLES2/gl2ext.h> | 8 #include <GLES2/gl2ext.h> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 message_loop_async_waiter_.Signal(); | 295 message_loop_async_waiter_.Signal(); |
296 return; | 296 return; |
297 } | 297 } |
298 | 298 |
299 gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); | 299 gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); |
300 gles2->WaitSyncPointCHROMIUM(sync_point); | 300 gles2->WaitSyncPointCHROMIUM(sync_point); |
301 message_loop_async_waiter_.Signal(); | 301 message_loop_async_waiter_.Signal(); |
302 } | 302 } |
303 | 303 |
304 void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id, | 304 void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id, |
305 uint32 texture_target, | |
306 const gfx::Size& size, | 305 const gfx::Size& size, |
307 const SkBitmap& pixels) { | 306 const SkBitmap& pixels) { |
308 // SkBitmaps use the SkPixelRef object to refcount the underlying pixels. | 307 // SkBitmaps use the SkPixelRef object to refcount the underlying pixels. |
309 // Multiple SkBitmaps can share a SkPixelRef instance. We use this to | 308 // Multiple SkBitmaps can share a SkPixelRef instance. We use this to |
310 // ensure that the underlying pixels in the SkBitmap passed in remain valid | 309 // ensure that the underlying pixels in the SkBitmap passed in remain valid |
311 // until the AsyncReadPixels() call completes. | 310 // until the AsyncReadPixels() call completes. |
312 read_pixels_bitmap_.setPixelRef(pixels.pixelRef()); | 311 read_pixels_bitmap_.setPixelRef(pixels.pixelRef()); |
313 | 312 |
314 if (!message_loop_->BelongsToCurrentThread()) { | 313 if (!message_loop_->BelongsToCurrentThread()) { |
315 message_loop_->PostTask( | 314 message_loop_->PostTask( |
316 FROM_HERE, | 315 FROM_HERE, |
317 base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncReadPixels, | 316 base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncReadPixels, |
318 this, | 317 this, |
319 texture_id, | 318 texture_id, |
320 texture_target, | |
321 size)); | 319 size)); |
322 base::WaitableEvent* objects[] = {&aborted_waiter_, | 320 base::WaitableEvent* objects[] = {&aborted_waiter_, |
323 &message_loop_async_waiter_}; | 321 &message_loop_async_waiter_}; |
324 if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) | 322 if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) |
325 return; | 323 return; |
326 } else { | 324 } else { |
327 AsyncReadPixels(texture_id, texture_target, size); | 325 AsyncReadPixels(texture_id, size); |
328 message_loop_async_waiter_.Reset(); | 326 message_loop_async_waiter_.Reset(); |
329 } | 327 } |
330 read_pixels_bitmap_.setPixelRef(NULL); | 328 read_pixels_bitmap_.setPixelRef(NULL); |
331 } | 329 } |
332 | 330 |
333 void RendererGpuVideoAcceleratorFactories::AsyncReadPixels( | 331 void RendererGpuVideoAcceleratorFactories::AsyncReadPixels( |
334 uint32 texture_id, | 332 uint32 texture_id, |
335 uint32 texture_target, | |
336 const gfx::Size& size) { | 333 const gfx::Size& size) { |
337 DCHECK(message_loop_->BelongsToCurrentThread()); | 334 DCHECK(message_loop_->BelongsToCurrentThread()); |
338 WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); | 335 WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
339 if (!context) { | 336 if (!context) { |
340 message_loop_async_waiter_.Signal(); | 337 message_loop_async_waiter_.Signal(); |
341 return; | 338 return; |
342 } | 339 } |
343 | 340 |
344 gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); | 341 gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); |
345 | 342 |
346 GLuint tmp_texture; | 343 GLuint tmp_texture; |
347 gles2->GenTextures(1, &tmp_texture); | 344 gles2->GenTextures(1, &tmp_texture); |
348 gles2->BindTexture(texture_target, tmp_texture); | 345 gles2->BindTexture(GL_TEXTURE_2D, tmp_texture); |
349 gles2->TexParameteri(texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 346 gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
350 gles2->TexParameteri(texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 347 gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
351 gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 348 gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
352 gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 349 gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
353 context->copyTextureCHROMIUM( | 350 context->copyTextureCHROMIUM( |
354 texture_target, texture_id, tmp_texture, 0, GL_RGBA, GL_UNSIGNED_BYTE); | 351 GL_TEXTURE_2D, texture_id, tmp_texture, 0, GL_RGBA, GL_UNSIGNED_BYTE); |
355 | 352 |
356 GLuint fb; | 353 GLuint fb; |
357 gles2->GenFramebuffers(1, &fb); | 354 gles2->GenFramebuffers(1, &fb); |
358 gles2->BindFramebuffer(GL_FRAMEBUFFER, fb); | 355 gles2->BindFramebuffer(GL_FRAMEBUFFER, fb); |
359 gles2->FramebufferTexture2D( | 356 gles2->FramebufferTexture2D( |
360 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture_target, tmp_texture, 0); | 357 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_texture, 0); |
361 gles2->PixelStorei(GL_PACK_ALIGNMENT, 4); | 358 gles2->PixelStorei(GL_PACK_ALIGNMENT, 4); |
362 gles2->ReadPixels(0, | 359 gles2->ReadPixels(0, |
363 0, | 360 0, |
364 size.width(), | 361 size.width(), |
365 size.height(), | 362 size.height(), |
366 GL_BGRA_EXT, | 363 GL_BGRA_EXT, |
367 GL_UNSIGNED_BYTE, | 364 GL_UNSIGNED_BYTE, |
368 read_pixels_bitmap_.pixelRef()->pixels()); | 365 read_pixels_bitmap_.pixelRef()->pixels()); |
369 gles2->DeleteFramebuffers(1, &fb); | 366 gles2->DeleteFramebuffers(1, &fb); |
370 gles2->DeleteTextures(1, &tmp_texture); | 367 gles2->DeleteTextures(1, &tmp_texture); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 } | 404 } |
408 | 405 |
409 void | 406 void |
410 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoEncodeAccelerator() { | 407 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoEncodeAccelerator() { |
411 // OK to release because Destroy() will delete the VDA instance. | 408 // OK to release because Destroy() will delete the VDA instance. |
412 if (vea_) | 409 if (vea_) |
413 vea_.release()->Destroy(); | 410 vea_.release()->Destroy(); |
414 } | 411 } |
415 | 412 |
416 } // namespace content | 413 } // namespace content |
OLD | NEW |