Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/renderer/media/renderer_gpu_video_decoder_factories.h" | 5 #include "content/renderer/media/renderer_gpu_video_decoder_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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 void RendererGpuVideoDecoderFactories::AsyncDeleteTexture(uint32 texture_id) { | 153 void RendererGpuVideoDecoderFactories::AsyncDeleteTexture(uint32 texture_id) { |
| 154 DCHECK(message_loop_->BelongsToCurrentThread()); | 154 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 155 if (!context_) | 155 if (!context_) |
| 156 return; | 156 return; |
| 157 | 157 |
| 158 gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation(); | 158 gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation(); |
| 159 gles2->DeleteTextures(1, &texture_id); | 159 gles2->DeleteTextures(1, &texture_id); |
| 160 DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR)); | 160 DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR)); |
| 161 } | 161 } |
| 162 | 162 |
| 163 gpu::Mailbox RendererGpuVideoDecoderFactories::ProduceTextureToMailbox( | |
| 164 uint32 texture_id) { | |
| 165 gpu::Mailbox mailbox; | |
| 166 if (message_loop_->BelongsToCurrentThread()) { | |
| 167 AsyncProduceTextureToMailbox(texture_id, &mailbox); | |
| 168 return mailbox; | |
| 169 } | |
| 170 | |
| 171 message_loop_->PostTask(FROM_HERE, base::Bind( | |
| 172 &RendererGpuVideoDecoderFactories::AsyncProduceTextureToMailbox, | |
| 173 this, | |
| 174 texture_id, | |
| 175 &mailbox)); | |
| 176 base::WaitableEvent* objects[] = {&aborted_waiter_, &async_waiter_}; | |
| 177 base::WaitableEvent::WaitMany(objects, arraysize(objects)); | |
| 178 return mailbox; | |
| 179 } | |
| 180 | |
| 181 void RendererGpuVideoDecoderFactories::AsyncProduceTextureToMailbox( | |
| 182 uint32 texture_id, gpu::Mailbox* mailbox) { | |
| 183 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 184 if (!context_) { | |
| 185 async_waiter_.Signal(); | |
| 186 return; | |
| 187 } | |
| 188 | |
| 189 gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation(); | |
| 190 gles2->GenMailboxCHROMIUM(mailbox->name); | |
| 191 gles2->BindTexture(GL_TEXTURE_2D, texture_id); | |
| 192 gles2->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox->name); | |
|
piman
2013/04/11 22:57:58
You probably need to shallow Flush so that the com
danakj
2013/04/12 00:01:39
Should be fine to stick a sync point into the Vide
| |
| 193 } | |
| 194 | |
| 195 void RendererGpuVideoDecoderFactories::ConsumeMailboxToTexture( | |
| 196 const gpu::Mailbox& mailbox, uint32 texture_id) { | |
| 197 if (message_loop_->BelongsToCurrentThread()) { | |
| 198 AsyncConsumeMailboxToTexture(mailbox, texture_id); | |
| 199 return; | |
| 200 } | |
| 201 | |
| 202 message_loop_->PostTask(FROM_HERE, base::Bind( | |
| 203 &RendererGpuVideoDecoderFactories::AsyncConsumeMailboxToTexture, | |
| 204 this, | |
| 205 mailbox, | |
| 206 texture_id)); | |
| 207 base::WaitableEvent* objects[] = {&aborted_waiter_, &async_waiter_}; | |
| 208 base::WaitableEvent::WaitMany(objects, arraysize(objects)); | |
| 209 } | |
| 210 | |
| 211 void RendererGpuVideoDecoderFactories::AsyncConsumeMailboxToTexture( | |
| 212 const gpu::Mailbox& mailbox, uint32 texture_id) { | |
| 213 DCHECK(message_loop_->BelongsToCurrentThread()); | |
| 214 if (!context_) { | |
| 215 async_waiter_.Signal(); | |
| 216 return; | |
| 217 } | |
| 218 | |
| 219 gpu::gles2::GLES2Implementation* gles2 = context_->GetImplementation(); | |
| 220 gles2->BindTexture(GL_TEXTURE_2D, texture_id); | |
| 221 gles2->ConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | |
| 222 } | |
| 223 | |
| 163 void RendererGpuVideoDecoderFactories::ReadPixels( | 224 void RendererGpuVideoDecoderFactories::ReadPixels( |
| 164 uint32 texture_id, uint32 texture_target, const gfx::Size& size, | 225 uint32 texture_id, uint32 texture_target, const gfx::Size& size, |
| 165 const SkBitmap& pixels) { | 226 const SkBitmap& pixels) { |
| 166 // SkBitmaps use the SkPixelRef object to refcount the underlying pixels. | 227 // SkBitmaps use the SkPixelRef object to refcount the underlying pixels. |
| 167 // Multiple SkBitmaps can share a SkPixelRef instance. We use this to | 228 // Multiple SkBitmaps can share a SkPixelRef instance. We use this to |
| 168 // ensure that the underlying pixels in the SkBitmap passed in remain valid | 229 // ensure that the underlying pixels in the SkBitmap passed in remain valid |
| 169 // until the AsyncReadPixels() call completes. | 230 // until the AsyncReadPixels() call completes. |
| 170 read_pixels_bitmap_.setPixelRef(pixels.pixelRef()); | 231 read_pixels_bitmap_.setPixelRef(pixels.pixelRef()); |
| 171 | 232 |
| 172 if (!message_loop_->BelongsToCurrentThread()) { | 233 if (!message_loop_->BelongsToCurrentThread()) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 return aborted_waiter_.IsSignaled(); | 312 return aborted_waiter_.IsSignaled(); |
| 252 } | 313 } |
| 253 | 314 |
| 254 void RendererGpuVideoDecoderFactories::AsyncDestroyVideoDecodeAccelerator() { | 315 void RendererGpuVideoDecoderFactories::AsyncDestroyVideoDecodeAccelerator() { |
| 255 // OK to release because Destroy() will delete the VDA instance. | 316 // OK to release because Destroy() will delete the VDA instance. |
| 256 if (vda_) | 317 if (vda_) |
| 257 vda_.release()->Destroy(); | 318 vda_.release()->Destroy(); |
| 258 } | 319 } |
| 259 | 320 |
| 260 } // namespace content | 321 } // namespace content |
| OLD | NEW |