| 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/browser/renderer_host/compositing_iosurface_mac.h" | 5 #include "content/browser/renderer_host/compositing_iosurface_mac.h" |
| 6 | 6 |
| 7 #include <OpenGL/CGLIOSurface.h> | 7 #include <OpenGL/CGLIOSurface.h> |
| 8 #include <OpenGL/CGLRenderers.h> | 8 #include <OpenGL/CGLRenderers.h> |
| 9 #include <OpenGL/OpenGL.h> | 9 #include <OpenGL/OpenGL.h> |
| 10 | 10 |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 if (CGLGetParameter(offscreen_context_->cgl_context(), | 276 if (CGLGetParameter(offscreen_context_->cgl_context(), |
| 277 kCGLCPCurrentRendererID, | 277 kCGLCPCurrentRendererID, |
| 278 ¤t_renderer_id) == kCGLNoError) | 278 ¤t_renderer_id) == kCGLNoError) |
| 279 return current_renderer_id & kCGLRendererIDMatchingMask; | 279 return current_renderer_id & kCGLRendererIDMatchingMask; |
| 280 return -1; | 280 return -1; |
| 281 } | 281 } |
| 282 | 282 |
| 283 bool CompositingIOSurfaceMac::DrawIOSurface( | 283 bool CompositingIOSurfaceMac::DrawIOSurface( |
| 284 scoped_refptr<CompositingIOSurfaceContext> drawing_context, | 284 scoped_refptr<CompositingIOSurfaceContext> drawing_context, |
| 285 const gfx::Rect& window_rect, | 285 const gfx::Rect& window_rect, |
| 286 float window_scale_factor, | 286 float window_scale_factor) { |
| 287 bool flush_drawable) { | |
| 288 DCHECK_EQ(CGLGetCurrentContext(), drawing_context->cgl_context()); | 287 DCHECK_EQ(CGLGetCurrentContext(), drawing_context->cgl_context()); |
| 289 | 288 |
| 290 bool has_io_surface = HasIOSurface(); | 289 bool has_io_surface = HasIOSurface(); |
| 291 TRACE_EVENT1("browser", "CompositingIOSurfaceMac::DrawIOSurface", | 290 TRACE_EVENT1("browser", "CompositingIOSurfaceMac::DrawIOSurface", |
| 292 "has_io_surface", has_io_surface); | 291 "has_io_surface", has_io_surface); |
| 293 | 292 |
| 294 gfx::Rect pixel_window_rect = | 293 gfx::Rect pixel_window_rect = |
| 295 ToNearestRect(gfx::ScaleRect(window_rect, window_scale_factor)); | 294 ToNearestRect(gfx::ScaleRect(window_rect, window_scale_factor)); |
| 296 glViewport( | 295 glViewport( |
| 297 pixel_window_rect.x(), pixel_window_rect.y(), | 296 pixel_window_rect.x(), pixel_window_rect.y(), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 glUseProgram(0); CHECK_AND_SAVE_GL_ERROR(); | 350 glUseProgram(0); CHECK_AND_SAVE_GL_ERROR(); |
| 352 } else { | 351 } else { |
| 353 // Should match the clear color of RenderWidgetHostViewMac. | 352 // Should match the clear color of RenderWidgetHostViewMac. |
| 354 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); | 353 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); |
| 355 glClear(GL_COLOR_BUFFER_BIT); | 354 glClear(GL_COLOR_BUFFER_BIT); |
| 356 } | 355 } |
| 357 | 356 |
| 358 bool workaround_needed = | 357 bool workaround_needed = |
| 359 GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive( | 358 GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive( |
| 360 gpu::FORCE_GL_FINISH_AFTER_COMPOSITING); | 359 gpu::FORCE_GL_FINISH_AFTER_COMPOSITING); |
| 361 // Note that this is not necessary when not flushing the drawable in Mavericks | |
| 362 // or later if we are in one of the two following situations: | |
| 363 // - we are drawing an underlay, and we will call glFinish() when drawing | |
| 364 // the overlay. | |
| 365 // - we are using CoreAnimation, where this bug does not manifest. | |
| 366 if (workaround_needed && !flush_drawable && base::mac::IsOSMavericksOrLater()) | |
| 367 workaround_needed = false; | |
| 368 | |
| 369 if (workaround_needed) { | 360 if (workaround_needed) { |
| 370 TRACE_EVENT0("gpu", "glFinish"); | 361 TRACE_EVENT0("gpu", "glFinish"); |
| 371 glFinish(); | 362 glFinish(); |
| 372 } | 363 } |
| 373 | 364 |
| 374 bool result = true; | |
| 375 if (flush_drawable) { | |
| 376 TRACE_EVENT0("gpu", "flushBuffer"); | |
| 377 [drawing_context->nsgl_context() flushBuffer]; | |
| 378 } | |
| 379 | |
| 380 // Check if any of the drawing calls result in an error. | 365 // Check if any of the drawing calls result in an error. |
| 381 GetAndSaveGLError(); | 366 GetAndSaveGLError(); |
| 367 bool result = true; |
| 382 if (gl_error_ != GL_NO_ERROR) { | 368 if (gl_error_ != GL_NO_ERROR) { |
| 383 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_; | 369 LOG(ERROR) << "GL error in DrawIOSurface: " << gl_error_; |
| 384 result = false; | 370 result = false; |
| 385 // If there was an error, clear the screen to a light grey to avoid | 371 // If there was an error, clear the screen to a light grey to avoid |
| 386 // rendering artifacts. If we're in a really bad way, this too may | 372 // rendering artifacts. If we're in a really bad way, this too may |
| 387 // generate an error. Clear the GL error afterwards just in case. | 373 // generate an error. Clear the GL error afterwards just in case. |
| 388 glClearColor(0.8, 0.8, 0.8, 1.0); | 374 glClearColor(0.8, 0.8, 0.8, 1.0); |
| 389 glClear(GL_COLOR_BUFFER_BIT); | 375 glClear(GL_COLOR_BUFFER_BIT); |
| 390 glGetError(); | 376 glGetError(); |
| 391 } | 377 } |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 void CompositingIOSurfaceMac::EvictionMarkEvicted() { | 914 void CompositingIOSurfaceMac::EvictionMarkEvicted() { |
| 929 if (eviction_queue_iterator_ == eviction_queue_.Get().end()) | 915 if (eviction_queue_iterator_ == eviction_queue_.Get().end()) |
| 930 return; | 916 return; |
| 931 eviction_queue_.Get().erase(eviction_queue_iterator_); | 917 eviction_queue_.Get().erase(eviction_queue_iterator_); |
| 932 eviction_queue_iterator_ = eviction_queue_.Get().end(); | 918 eviction_queue_iterator_ = eviction_queue_.Get().end(); |
| 933 eviction_has_been_drawn_since_updated_ = false; | 919 eviction_has_been_drawn_since_updated_ = false; |
| 934 } | 920 } |
| 935 | 921 |
| 936 // static | 922 // static |
| 937 void CompositingIOSurfaceMac::EvictionScheduleDoEvict() { | 923 void CompositingIOSurfaceMac::EvictionScheduleDoEvict() { |
| 938 if (GetCoreAnimationStatus() == CORE_ANIMATION_DISABLED) | |
| 939 return; | |
| 940 if (eviction_scheduled_) | 924 if (eviction_scheduled_) |
| 941 return; | 925 return; |
| 942 if (eviction_queue_.Get().size() <= kMaximumUnevictedSurfaces) | 926 if (eviction_queue_.Get().size() <= kMaximumUnevictedSurfaces) |
| 943 return; | 927 return; |
| 944 | 928 |
| 945 eviction_scheduled_ = true; | 929 eviction_scheduled_ = true; |
| 946 base::MessageLoop::current()->PostTask( | 930 base::MessageLoop::current()->PostTask( |
| 947 FROM_HERE, | 931 FROM_HERE, |
| 948 base::Bind(&CompositingIOSurfaceMac::EvictionDoEvict)); | 932 base::Bind(&CompositingIOSurfaceMac::EvictionDoEvict)); |
| 949 } | 933 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 977 } | 961 } |
| 978 | 962 |
| 979 // static | 963 // static |
| 980 base::LazyInstance<CompositingIOSurfaceMac::EvictionQueue> | 964 base::LazyInstance<CompositingIOSurfaceMac::EvictionQueue> |
| 981 CompositingIOSurfaceMac::eviction_queue_; | 965 CompositingIOSurfaceMac::eviction_queue_; |
| 982 | 966 |
| 983 // static | 967 // static |
| 984 bool CompositingIOSurfaceMac::eviction_scheduled_ = false; | 968 bool CompositingIOSurfaceMac::eviction_scheduled_ = false; |
| 985 | 969 |
| 986 } // namespace content | 970 } // namespace content |
| OLD | NEW |