| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/common/gpu/image_transport_surface_calayer_mac.h" | 5 #include "content/common/gpu/image_transport_surface_calayer_mac.h" |
| 6 | 6 |
| 7 #include <OpenGL/CGLRenderers.h> | 7 #include <OpenGL/CGLRenderers.h> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/mac/sdk_forward_declarations.h" | 10 #include "base/mac/sdk_forward_declarations.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 storageProvider_->LayerShareGroupContext())); | 48 storageProvider_->LayerShareGroupContext())); |
| 49 } | 49 } |
| 50 | 50 |
| 51 - (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat { | 51 - (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat { |
| 52 if (!storageProvider_) | 52 if (!storageProvider_) |
| 53 return NULL; | 53 return NULL; |
| 54 CGLContextObj context = NULL; | 54 CGLContextObj context = NULL; |
| 55 CGLError error = CGLCreateContext( | 55 CGLError error = CGLCreateContext( |
| 56 pixelFormat, storageProvider_->LayerShareGroupContext(), &context); | 56 pixelFormat, storageProvider_->LayerShareGroupContext(), &context); |
| 57 if (error != kCGLNoError) | 57 if (error != kCGLNoError) |
| 58 DLOG(ERROR) << "CGLCreateContext failed with CGL error: " << error; | 58 LOG(ERROR) << "CGLCreateContext failed with CGL error: " << error; |
| 59 return context; | 59 return context; |
| 60 } | 60 } |
| 61 | 61 |
| 62 - (BOOL)canDrawInCGLContext:(CGLContextObj)glContext | 62 - (BOOL)canDrawInCGLContext:(CGLContextObj)glContext |
| 63 pixelFormat:(CGLPixelFormatObj)pixelFormat | 63 pixelFormat:(CGLPixelFormatObj)pixelFormat |
| 64 forLayerTime:(CFTimeInterval)timeInterval | 64 forLayerTime:(CFTimeInterval)timeInterval |
| 65 displayTime:(const CVTimeStamp*)timeStamp { | 65 displayTime:(const CVTimeStamp*)timeStamp { |
| 66 if (!storageProvider_) | 66 if (!storageProvider_) |
| 67 return NO; | 67 return NO; |
| 68 return storageProvider_->LayerCanDraw(); | 68 return storageProvider_->LayerCanDraw(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 gfx::Size CALayerStorageProvider::GetRoundedSize(gfx::Size size) { | 114 gfx::Size CALayerStorageProvider::GetRoundedSize(gfx::Size size) { |
| 115 return size; | 115 return size; |
| 116 } | 116 } |
| 117 | 117 |
| 118 bool CALayerStorageProvider::AllocateColorBufferStorage( | 118 bool CALayerStorageProvider::AllocateColorBufferStorage( |
| 119 CGLContextObj context, GLuint texture, | 119 CGLContextObj context, GLuint texture, |
| 120 gfx::Size pixel_size, float scale_factor) { | 120 gfx::Size pixel_size, float scale_factor) { |
| 121 // Allocate an ordinary OpenGL texture to back the FBO. | 121 // Allocate an ordinary OpenGL texture to back the FBO. |
| 122 GLenum error; | 122 GLenum error; |
| 123 while ((error = glGetError()) != GL_NO_ERROR) { | 123 while ((error = glGetError()) != GL_NO_ERROR) { |
| 124 DLOG(ERROR) << "Error found (and ignored) before allocating buffer " | 124 LOG(ERROR) << "OpenGL error hit but ignored before allocating buffer " |
| 125 << "storage: " << error; | 125 << "storage: " << error; |
| 126 } | 126 } |
| 127 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, | 127 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, |
| 128 0, | 128 0, |
| 129 GL_RGBA, | 129 GL_RGBA, |
| 130 pixel_size.width(), | 130 pixel_size.width(), |
| 131 pixel_size.height(), | 131 pixel_size.height(), |
| 132 0, | 132 0, |
| 133 GL_RGBA, | 133 GL_RGBA, |
| 134 GL_UNSIGNED_BYTE, | 134 GL_UNSIGNED_BYTE, |
| 135 NULL); | 135 NULL); |
| 136 error = glGetError(); | 136 glFlush(); |
| 137 if (error != GL_NO_ERROR) { | 137 |
| 138 DLOG(ERROR) << "glTexImage failed with GL error: " << error; | 138 bool hit_error = false; |
| 139 while ((error = glGetError()) != GL_NO_ERROR) { |
| 140 LOG(ERROR) << "OpenGL error hit while trying to allocate buffer storage: " |
| 141 << error; |
| 142 hit_error = true; |
| 143 } |
| 144 if (hit_error) |
| 139 return false; | 145 return false; |
| 140 } | |
| 141 glFlush(); | |
| 142 | 146 |
| 143 // Set the parameters that will be used to allocate the CALayer to draw the | 147 // Set the parameters that will be used to allocate the CALayer to draw the |
| 144 // texture into. | 148 // texture into. |
| 145 share_group_context_.reset(CGLRetainContext(context)); | 149 share_group_context_.reset(CGLRetainContext(context)); |
| 146 fbo_texture_ = texture; | 150 fbo_texture_ = texture; |
| 147 fbo_pixel_size_ = pixel_size; | 151 fbo_pixel_size_ = pixel_size; |
| 148 fbo_scale_factor_ = scale_factor; | 152 fbo_scale_factor_ = scale_factor; |
| 149 return true; | 153 return true; |
| 150 } | 154 } |
| 151 | 155 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 glDisable(GL_TEXTURE_RECTANGLE_ARB); | 340 glDisable(GL_TEXTURE_RECTANGLE_ARB); |
| 337 | 341 |
| 338 GLint current_renderer_id = 0; | 342 GLint current_renderer_id = 0; |
| 339 if (CGLGetParameter(CGLGetCurrentContext(), | 343 if (CGLGetParameter(CGLGetCurrentContext(), |
| 340 kCGLCPCurrentRendererID, | 344 kCGLCPCurrentRendererID, |
| 341 ¤t_renderer_id) == kCGLNoError) { | 345 ¤t_renderer_id) == kCGLNoError) { |
| 342 current_renderer_id &= kCGLRendererIDMatchingMask; | 346 current_renderer_id &= kCGLRendererIDMatchingMask; |
| 343 transport_surface_->SetRendererID(current_renderer_id); | 347 transport_surface_->SetRendererID(current_renderer_id); |
| 344 } | 348 } |
| 345 | 349 |
| 350 GLenum error; |
| 351 while ((error = glGetError()) != GL_NO_ERROR) { |
| 352 LOG(ERROR) << "OpenGL error hit while drawing frame: " << error; |
| 353 } |
| 354 |
| 346 // Allow forward progress in the context now that the swap is complete. | 355 // Allow forward progress in the context now that the swap is complete. |
| 347 UnblockBrowserIfNeeded(); | 356 UnblockBrowserIfNeeded(); |
| 348 } | 357 } |
| 349 | 358 |
| 350 void CALayerStorageProvider::LayerResetStorageProvider() { | 359 void CALayerStorageProvider::LayerResetStorageProvider() { |
| 351 // If we are providing back-pressure by waiting for a draw, that draw will | 360 // If we are providing back-pressure by waiting for a draw, that draw will |
| 352 // now never come, so release the pressure now. | 361 // now never come, so release the pressure now. |
| 353 UnblockBrowserIfNeeded(); | 362 UnblockBrowserIfNeeded(); |
| 354 } | 363 } |
| 355 | 364 |
| 356 void CALayerStorageProvider::OnGpuSwitched() { | 365 void CALayerStorageProvider::OnGpuSwitched() { |
| 357 recreate_layer_after_gpu_switch_ = true; | 366 recreate_layer_after_gpu_switch_ = true; |
| 358 } | 367 } |
| 359 | 368 |
| 360 void CALayerStorageProvider::UnblockBrowserIfNeeded() { | 369 void CALayerStorageProvider::UnblockBrowserIfNeeded() { |
| 361 if (!has_pending_draw_) | 370 if (!has_pending_draw_) |
| 362 return; | 371 return; |
| 363 pending_draw_weak_factory_.InvalidateWeakPtrs(); | 372 pending_draw_weak_factory_.InvalidateWeakPtrs(); |
| 364 has_pending_draw_ = false; | 373 has_pending_draw_ = false; |
| 365 transport_surface_->SendSwapBuffers( | 374 transport_surface_->SendSwapBuffers( |
| 366 ui::SurfaceHandleFromCAContextID([context_ contextId]), | 375 ui::SurfaceHandleFromCAContextID([context_ contextId]), |
| 367 fbo_pixel_size_, | 376 fbo_pixel_size_, |
| 368 fbo_scale_factor_); | 377 fbo_scale_factor_); |
| 369 } | 378 } |
| 370 | 379 |
| 371 } // namespace content | 380 } // namespace content |
| OLD | NEW |