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