| 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 |