| Index: content/renderer/media/renderer_gpu_video_decoder_factories.cc
|
| diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.cc b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
|
| index 1f0e85a754badb76c2f739d0ec3b049ed7ca7af3..fb46a6c5ddbaf71098c1f68ce41e95561caaec9e 100644
|
| --- a/content/renderer/media/renderer_gpu_video_decoder_factories.cc
|
| +++ b/content/renderer/media/renderer_gpu_video_decoder_factories.cc
|
| @@ -98,6 +98,7 @@ void RendererGpuVideoDecoderFactories::AsyncCreateVideoDecodeAccelerator(
|
| bool RendererGpuVideoDecoderFactories::CreateTextures(
|
| int32 count, const gfx::Size& size,
|
| std::vector<uint32>* texture_ids,
|
| + std::vector<gpu::Mailbox>* texture_mailboxes,
|
| uint32 texture_target) {
|
| DCHECK(!message_loop_->BelongsToCurrentThread());
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| @@ -108,6 +109,7 @@ bool RendererGpuVideoDecoderFactories::CreateTextures(
|
| if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0)
|
| return false;
|
| texture_ids->swap(created_textures_);
|
| + texture_mailboxes->swap(created_texture_mailboxes_);
|
| return true;
|
| }
|
|
|
| @@ -122,6 +124,7 @@ void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
|
| }
|
| gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation();
|
| created_textures_.resize(count);
|
| + created_texture_mailboxes_.resize(count);
|
| gles2->GenTextures(count, &created_textures_[0]);
|
| for (int i = 0; i < count; ++i) {
|
| gles2->ActiveTexture(GL_TEXTURE0);
|
| @@ -135,6 +138,7 @@ void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
|
| gles2->TexImage2D(texture_target, 0, GL_RGBA, size.width(), size.height(),
|
| 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
| }
|
| + gles2->GenMailboxCHROMIUM(created_texture_mailboxes_[i].name);
|
| }
|
| // We need a glFlush here to guarantee the decoder (in the GPU process) can
|
| // use the texture ids we return here. Since textures are expected to be
|
| @@ -160,6 +164,89 @@ void RendererGpuVideoDecoderFactories::AsyncDeleteTexture(uint32 texture_id) {
|
| DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
|
| }
|
|
|
| +uint32 RendererGpuVideoDecoderFactories::ProduceTextureToMailbox(
|
| + const gpu::Mailbox& mailbox,
|
| + uint32 texture_id,
|
| + uint32 texture_target) {
|
| + uint32 sync_point = 0;
|
| + if (message_loop_->BelongsToCurrentThread()) {
|
| + AsyncProduceTextureToMailbox(
|
| + mailbox, texture_id, texture_target, &sync_point);
|
| + return sync_point;
|
| + }
|
| +
|
| + message_loop_->PostTask(FROM_HERE, base::Bind(
|
| + &RendererGpuVideoDecoderFactories::AsyncProduceTextureToMailbox,
|
| + this,
|
| + mailbox,
|
| + texture_id,
|
| + texture_target,
|
| + &sync_point));
|
| + base::WaitableEvent* objects[] = {&aborted_waiter_, &async_waiter_};
|
| + base::WaitableEvent::WaitMany(objects, arraysize(objects));
|
| + return sync_point;
|
| +}
|
| +
|
| +void RendererGpuVideoDecoderFactories::AsyncProduceTextureToMailbox(
|
| + const gpu::Mailbox& mailbox,
|
| + uint32 texture_id,
|
| + uint32 texture_target,
|
| + uint32* sync_point) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| +
|
| + *sync_point = 0;
|
| + if (!context_) {
|
| + async_waiter_.Signal();
|
| + return;
|
| + }
|
| +
|
| + gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation();
|
| + gles2->BindTexture(texture_target, texture_id);
|
| + gles2->ProduceTextureCHROMIUM(texture_target, mailbox.name);
|
| + *sync_point = gles2->InsertSyncPointCHROMIUM();
|
| + async_waiter_.Signal();
|
| +}
|
| +
|
| +void RendererGpuVideoDecoderFactories::ConsumeMailboxToTexture(
|
| + const gpu::Mailbox& mailbox,
|
| + uint32 texture_id,
|
| + uint32 texture_target,
|
| + uint32 sync_point) {
|
| + if (message_loop_->BelongsToCurrentThread()) {
|
| + AsyncConsumeMailboxToTexture(
|
| + mailbox, texture_id, texture_target, sync_point);
|
| + return;
|
| + }
|
| +
|
| + message_loop_->PostTask(FROM_HERE, base::Bind(
|
| + &RendererGpuVideoDecoderFactories::AsyncConsumeMailboxToTexture,
|
| + this,
|
| + mailbox,
|
| + texture_id,
|
| + texture_target,
|
| + sync_point));
|
| + base::WaitableEvent* objects[] = {&aborted_waiter_, &async_waiter_};
|
| + base::WaitableEvent::WaitMany(objects, arraysize(objects));
|
| +}
|
| +
|
| +void RendererGpuVideoDecoderFactories::AsyncConsumeMailboxToTexture(
|
| + const gpu::Mailbox& mailbox,
|
| + uint32 texture_id,
|
| + uint32 texture_target,
|
| + uint32 sync_point) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| + if (!context_) {
|
| + async_waiter_.Signal();
|
| + return;
|
| + }
|
| +
|
| + gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation();
|
| + gles2->WaitSyncPointCHROMIUM(sync_point);
|
| + gles2->BindTexture(texture_target, texture_id);
|
| + gles2->ConsumeTextureCHROMIUM(texture_target, mailbox.name);
|
| + async_waiter_.Signal();
|
| +}
|
| +
|
| void RendererGpuVideoDecoderFactories::ReadPixels(
|
| uint32 texture_id, uint32 texture_target, const gfx::Size& size,
|
| const SkBitmap& pixels) {
|
|
|