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 "ui/gl/gl_image_io_surface.h" | 5 #include "ui/gl/gl_image_io_surface.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/mac/bind_objc_block.h" | 10 #include "base/mac/bind_objc_block.h" |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 base::TimeTicks::Now() - start_time); | 267 base::TimeTicks::Now() - start_time); |
268 return true; | 268 return true; |
269 } | 269 } |
270 | 270 |
271 bool GLImageIOSurface::CopyTexImage(unsigned target) { | 271 bool GLImageIOSurface::CopyTexImage(unsigned target) { |
272 DCHECK(thread_checker_.CalledOnValidThread()); | 272 DCHECK(thread_checker_.CalledOnValidThread()); |
273 | 273 |
274 if (format_ != gfx::BufferFormat::YUV_420_BIPLANAR) | 274 if (format_ != gfx::BufferFormat::YUV_420_BIPLANAR) |
275 return false; | 275 return false; |
276 | 276 |
277 if (target != GL_TEXTURE_RECTANGLE_ARB) { | |
278 LOG(ERROR) << "YUV_420_BIPLANAR requires GL_TEXTURE_RECTANGLE_ARB target"; | |
279 return false; | |
280 } | |
281 | |
282 GLContext* gl_context = GLContext::GetCurrent(); | 277 GLContext* gl_context = GLContext::GetCurrent(); |
283 DCHECK(gl_context); | 278 DCHECK(gl_context); |
284 | 279 |
285 YUVToRGBConverter* yuv_to_rgb_converter = gl_context->GetYUVToRGBConverter(); | 280 YUVToRGBConverter* yuv_to_rgb_converter = gl_context->GetYUVToRGBConverter(); |
286 DCHECK(yuv_to_rgb_converter); | 281 DCHECK(yuv_to_rgb_converter); |
287 | 282 |
288 ScopedSetGLToRealGLApi scoped_set_gl_api; | 283 ScopedSetGLToRealGLApi scoped_set_gl_api; |
289 | 284 |
290 // Note that state restoration is done explicitly instead of scoped binders to | 285 // Note that state restoration is done explicitly instead of scoped binders to |
291 // avoid https://crbug.com/601729. | 286 // avoid https://crbug.com/601729. |
292 GLint rgb_texture = 0; | 287 GLint rgb_texture = 0; |
293 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &rgb_texture); | 288 GLenum target_getter = 0; |
| 289 switch (target) { |
| 290 case GL_TEXTURE_2D: |
| 291 target_getter = GL_TEXTURE_BINDING_2D; |
| 292 break; |
| 293 case GL_TEXTURE_CUBE_MAP: |
| 294 target_getter = GL_TEXTURE_BINDING_CUBE_MAP; |
| 295 break; |
| 296 case GL_TEXTURE_EXTERNAL_OES: |
| 297 target_getter = GL_TEXTURE_BINDING_EXTERNAL_OES; |
| 298 break; |
| 299 case GL_TEXTURE_RECTANGLE_ARB: |
| 300 target_getter = GL_TEXTURE_BINDING_RECTANGLE_ARB; |
| 301 break; |
| 302 default: |
| 303 NOTIMPLEMENTED() << " Target not supported."; |
| 304 return false; |
| 305 } |
| 306 glGetIntegerv(target_getter, &rgb_texture); |
294 base::ScopedClosureRunner destroy_resources_runner(base::BindBlock(^{ | 307 base::ScopedClosureRunner destroy_resources_runner(base::BindBlock(^{ |
295 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, rgb_texture); | 308 glBindTexture(target, rgb_texture); |
296 })); | 309 })); |
297 | 310 |
298 CGLContextObj cgl_context = CGLGetCurrentContext(); | 311 CGLContextObj cgl_context = CGLGetCurrentContext(); |
299 { | 312 { |
300 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->y_texture()); | 313 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->y_texture()); |
301 CGLError cgl_error = CGLTexImageIOSurface2D( | 314 CGLError cgl_error = CGLTexImageIOSurface2D( |
302 cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RED, size_.width(), | 315 cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RED, size_.width(), |
303 size_.height(), GL_RED, GL_UNSIGNED_BYTE, io_surface_, 0); | 316 size_.height(), GL_RED, GL_UNSIGNED_BYTE, io_surface_, 0); |
304 if (cgl_error != kCGLNoError) { | 317 if (cgl_error != kCGLNoError) { |
305 LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the Y plane. " | 318 LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the Y plane. " |
306 << cgl_error; | 319 << cgl_error; |
307 return false; | 320 return false; |
308 } | 321 } |
309 } | 322 } |
310 { | 323 { |
311 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->uv_texture()); | 324 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->uv_texture()); |
312 CGLError cgl_error = CGLTexImageIOSurface2D( | 325 CGLError cgl_error = CGLTexImageIOSurface2D( |
313 cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RG, size_.width() / 2, | 326 cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RG, size_.width() / 2, |
314 size_.height() / 2, GL_RG, GL_UNSIGNED_BYTE, io_surface_, 1); | 327 size_.height() / 2, GL_RG, GL_UNSIGNED_BYTE, io_surface_, 1); |
315 if (cgl_error != kCGLNoError) { | 328 if (cgl_error != kCGLNoError) { |
316 LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the UV plane. " | 329 LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the UV plane. " |
317 << cgl_error; | 330 << cgl_error; |
318 return false; | 331 return false; |
319 } | 332 } |
320 } | 333 } |
321 | 334 |
322 yuv_to_rgb_converter->CopyYUV420ToRGB( | 335 yuv_to_rgb_converter->CopyYUV420ToRGB(target, size_, rgb_texture); |
323 GL_TEXTURE_RECTANGLE_ARB, | |
324 size_, | |
325 rgb_texture); | |
326 return true; | 336 return true; |
327 } | 337 } |
328 | 338 |
329 bool GLImageIOSurface::CopyTexSubImage(unsigned target, | 339 bool GLImageIOSurface::CopyTexSubImage(unsigned target, |
330 const gfx::Point& offset, | 340 const gfx::Point& offset, |
331 const gfx::Rect& rect) { | 341 const gfx::Rect& rect) { |
332 return false; | 342 return false; |
333 } | 343 } |
334 | 344 |
335 bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, | 345 bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 } | 398 } |
389 | 399 |
390 // static | 400 // static |
391 GLImageIOSurface* GLImageIOSurface::FromGLImage(GLImage* image) { | 401 GLImageIOSurface* GLImageIOSurface::FromGLImage(GLImage* image) { |
392 if (!image || image->GetType() != Type::IOSURFACE) | 402 if (!image || image->GetType() != Type::IOSURFACE) |
393 return nullptr; | 403 return nullptr; |
394 return static_cast<GLImageIOSurface*>(image); | 404 return static_cast<GLImageIOSurface*>(image); |
395 } | 405 } |
396 | 406 |
397 } // namespace gl | 407 } // namespace gl |
OLD | NEW |