Index: content/browser/renderer_host/compositing_iosurface_context_mac.mm |
diff --git a/content/browser/renderer_host/compositing_iosurface_context_mac.mm b/content/browser/renderer_host/compositing_iosurface_context_mac.mm |
index 5f0979293b3ce92007d012a36dd041f33e37b4be..de978ee178b8b1f885f9e51d49b96333a10f229a 100644 |
--- a/content/browser/renderer_host/compositing_iosurface_context_mac.mm |
+++ b/content/browser/renderer_host/compositing_iosurface_context_mac.mm |
@@ -11,6 +11,7 @@ |
#include "base/command_line.h" |
#include "base/debug/trace_event.h" |
#include "base/logging.h" |
+#include "content/browser/renderer_host/compositing_iosurface_shader_programs_mac.h" |
#include "content/browser/gpu/gpu_data_manager_impl.h" |
#include "ui/base/ui_base_switches.h" |
#include "ui/gl/gl_switches.h" |
@@ -69,10 +70,32 @@ |
// Note that VSync is ignored because CoreAnimation will automatically |
// rate limit draws. |
+ // Prepare the shader program cache. Precompile the shader programs |
+ // needed to draw the IO Surface for non-offscreen contexts. |
+ bool prepared = false; |
+ scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache; |
+ { |
+ gfx::ScopedCGLSetCurrentContext scoped_set_current_context(cgl_context); |
+ shader_program_cache.reset(new CompositingIOSurfaceShaderPrograms()); |
+ if (window_number == kOffscreenContextWindowNumber) { |
+ prepared = true; |
+ } else { |
+ prepared = ( |
+ shader_program_cache->UseBlitProgram() && |
+ shader_program_cache->UseSolidWhiteProgram()); |
+ } |
+ glUseProgram(0u); |
+ } |
+ if (!prepared) { |
+ LOG(ERROR) << "IOSurface failed to compile/link required shader programs."; |
+ return NULL; |
+ } |
+ |
return new CompositingIOSurfaceContext( |
window_number, |
cgl_context_strong, |
- cgl_context); |
+ cgl_context, |
+ shader_program_cache.Pass()); |
} |
void CompositingIOSurfaceContext::PoisonContextAndSharegroup() { |
@@ -90,10 +113,12 @@ |
CompositingIOSurfaceContext::CompositingIOSurfaceContext( |
int window_number, |
base::ScopedTypeRef<CGLContextObj> cgl_context_strong, |
- CGLContextObj cgl_context) |
+ CGLContextObj cgl_context, |
+ scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache) |
: window_number_(window_number), |
cgl_context_strong_(cgl_context_strong), |
cgl_context_(cgl_context), |
+ shader_program_cache_(shader_program_cache.Pass()), |
poisoned_(false) { |
DCHECK(window_map()->find(window_number_) == window_map()->end()); |
window_map()->insert(std::make_pair(window_number_, this)); |
@@ -104,6 +129,10 @@ |
CompositingIOSurfaceContext::~CompositingIOSurfaceContext() { |
GpuDataManager::GetInstance()->RemoveObserver(this); |
+ { |
+ gfx::ScopedCGLSetCurrentContext scoped_set_current_context(cgl_context_); |
+ shader_program_cache_->Reset(); |
+ } |
if (!poisoned_) { |
DCHECK(window_map()->find(window_number_) != window_map()->end()); |
DCHECK(window_map()->find(window_number_)->second == this); |