Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1598)

Unified Diff: ui/gfx/compositor/compositor_gl.cc

Issue 7552039: Vend common GL context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address reviewer comments. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/compositor/compositor_gl.h ('k') | ui/gfx/compositor/compositor_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/compositor/compositor_gl.cc
diff --git a/ui/gfx/compositor/compositor_gl.cc b/ui/gfx/compositor/compositor_gl.cc
index 6d7bd29bb010c257ba425b2032ef983e935ea520..c9e6dfa2b41122513ca88e7c2272c661f9aa095c 100644
--- a/ui/gfx/compositor/compositor_gl.cc
+++ b/ui/gfx/compositor/compositor_gl.cc
@@ -84,35 +84,6 @@ class TextureProgramSwizzleGL : public ui::TextureProgramGL {
DISALLOW_COPY_AND_ASSIGN(TextureProgramSwizzleGL);
};
-// We share between compositor contexts so that we don't have to compile
-// shaders if they have already been compiled in another context.
-class SharedResources {
- public:
- static SharedResources* GetInstance();
-
- // Creates a context with shaders active.
- scoped_refptr<gfx::GLContext> CreateContext(gfx::GLSurface* surface);
- void ContextDestroyed();
-
- ui::TextureProgramGL* program_no_swizzle() {
- return program_no_swizzle_.get();
- }
-
- ui::TextureProgramGL* program_swizzle() { return program_swizzle_.get(); }
-
- private:
- friend struct DefaultSingletonTraits<SharedResources>;
-
- SharedResources();
- virtual ~SharedResources();
-
- scoped_refptr<gfx::GLShareGroup> share_group_;
- scoped_ptr<ui::TextureProgramGL> program_swizzle_;
- scoped_ptr<ui::TextureProgramGL> program_no_swizzle_;
-
- DISALLOW_COPY_AND_ASSIGN(SharedResources);
-};
-
GLuint CompileShader(GLenum type, const GLchar* source) {
GLuint shader = glCreateShader(type);
if (!shader)
@@ -175,61 +146,6 @@ bool TextureProgramSwizzleGL::Initialize() {
return InitializeCommon();
}
-SharedResources::SharedResources() {
-}
-
-SharedResources::~SharedResources() {
-}
-
-// static
-SharedResources* SharedResources::GetInstance() {
- return Singleton<SharedResources>::get();
-}
-
-scoped_refptr<gfx::GLContext> SharedResources::CreateContext(
- gfx::GLSurface* surface) {
- if (share_group_.get()) {
- return gfx::GLContext::CreateGLContext(share_group_.get(), surface);
- } else {
- scoped_refptr<gfx::GLContext> context(
- gfx::GLContext::CreateGLContext(NULL, surface));
- context->MakeCurrent(surface);
-
- if (!program_no_swizzle_.get()) {
- scoped_ptr<ui::TextureProgramGL> temp_program(
- new TextureProgramNoSwizzleGL());
- if (!temp_program->Initialize()) {
- LOG(ERROR) << "Unable to initialize shaders (context = "
- << static_cast<void*>(context.get()) << ")";
- return NULL;
- }
- program_no_swizzle_.swap(temp_program);
- }
-
- if (!program_swizzle_.get()) {
- scoped_ptr<ui::TextureProgramGL> temp_program(
- new TextureProgramSwizzleGL());
- if (!temp_program->Initialize()) {
- LOG(ERROR) << "Unable to initialize shaders (context = "
- << static_cast<void*>(context.get()) << ")";
- return NULL;
- }
- program_swizzle_.swap(temp_program);
- }
-
- share_group_ = context->share_group();
- return context;
- }
-}
-
-void SharedResources::ContextDestroyed() {
- if (share_group_.get() && share_group_->GetHandle() == NULL) {
- share_group_ = NULL;
- program_no_swizzle_.reset();
- program_swizzle_.reset();
- }
-}
-
} // namespace
namespace ui {
@@ -275,20 +191,117 @@ bool TextureProgramGL::InitializeCommon() {
return true;
}
-TextureGL::TextureGL(CompositorGL* compositor) : texture_id_(0),
- compositor_(compositor) {
+SharedResources::SharedResources() : initialized_(false) {
+}
+
+
+SharedResources::~SharedResources() {
+}
+
+// static
+SharedResources* SharedResources::GetInstance() {
+ // We use LeakySingletonTraits so that we don't race with
+ // the tear down of the gl_bindings.
+ SharedResources* instance = Singleton<SharedResources,
+ LeakySingletonTraits<SharedResources> >::get();
+ if (instance->Initialize()) {
+ return instance;
+ } else {
+ instance->Destroy();
+ return NULL;
+ }
+}
+
+bool SharedResources::Initialize() {
+ if (initialized_)
+ return true;
+
+ {
+ // The following line of code exists soley to disable IO restrictions
+ // on this thread long enough to perform the GL bindings.
+ // TODO(wjmaclean) Remove this when GL initialisation cleaned up.
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
+ if (!gfx::GLSurface::InitializeOneOff() ||
+ gfx::GetGLImplementation() == gfx::kGLImplementationNone) {
+ LOG(ERROR) << "Could not load the GL bindings";
+ return false;
+ }
+ }
+
+ surface_ = gfx::GLSurface::CreateOffscreenGLSurface(false, gfx::Size(1, 1));
+ if (!surface_.get()) {
+ LOG(ERROR) << "Unable to create offscreen GL surface.";
+ return false;
+ }
+
+ context_ = gfx::GLContext::CreateGLContext(NULL, surface_.get());
+ if (!context_.get()) {
+ LOG(ERROR) << "Unable to create GL context.";
+ return false;
+ }
+
+ program_no_swizzle_.reset();
+ program_swizzle_.reset();
+
+ context_->MakeCurrent(surface_.get());
+
+ scoped_ptr<ui::TextureProgramGL> temp_program_no_swizzle(
+ new TextureProgramNoSwizzleGL());
+ if (!temp_program_no_swizzle->Initialize()) {
+ LOG(ERROR) << "Unable to initialize shader.";
+ return false;
+ }
+
+ scoped_ptr<ui::TextureProgramGL> temp_program_swizzle(
+ new TextureProgramSwizzleGL());
+ if (!temp_program_swizzle->Initialize()) {
+ LOG(ERROR) << "Unable to initialize shader.";
+ return false;
+ }
+
+ program_no_swizzle_.swap(temp_program_no_swizzle);
+ program_swizzle_.swap(temp_program_swizzle);
+
+ initialized_ = true;
+ return true;
+}
+
+void SharedResources::Destroy() {
+ program_swizzle_.reset();
+ program_no_swizzle_.reset();
+
+ context_ = NULL;
+ surface_ = NULL;
+
+ initialized_ = false;
+}
+
+bool SharedResources::MakeSharedContextCurrent() {
+ if (!initialized_)
+ return false;
+ else
+ return context_->MakeCurrent(surface_.get());
+}
+
+scoped_refptr<gfx::GLContext> SharedResources::CreateContext(
+ gfx::GLSurface* surface) {
+ if (initialized_)
+ return gfx::GLContext::CreateGLContext(context_->share_group(), surface);
+ else
+ return NULL;
+}
+
+TextureGL::TextureGL() : texture_id_(0) {
}
-TextureGL::TextureGL(CompositorGL* compositor,
- const gfx::Size& size)
- : texture_id_(0),
- size_(size),
- compositor_(compositor) {
+TextureGL::TextureGL(const gfx::Size& size) : texture_id_(0), size_(size) {
}
TextureGL::~TextureGL() {
if (texture_id_) {
- compositor_->MakeCurrent();
+ SharedResources* instance = SharedResources::GetInstance();
+ DCHECK(instance);
+ instance->MakeSharedContextCurrent();
glDeleteTextures(1, &texture_id_);
}
}
@@ -333,21 +346,27 @@ void TextureGL::SetCanvas(const SkCanvas& canvas,
}
void TextureGL::Draw(const ui::TextureDrawParams& params) {
- DCHECK(compositor_->program_swizzle());
Draw(params, gfx::Rect(0, 0, size_.width(), size_.height()));
}
void TextureGL::Draw(const ui::TextureDrawParams& params,
const gfx::Rect& clip_bounds_in_texture) {
- DCHECK(compositor_->program_swizzle());
- DrawInternal(*compositor_->program_swizzle(), params, clip_bounds_in_texture);
+ SharedResources* instance = SharedResources::GetInstance();
+ DCHECK(instance);
+ DrawInternal(*instance->program_swizzle(),
+ params,
+ clip_bounds_in_texture);
}
+
void TextureGL::DrawInternal(const ui::TextureProgramGL& program,
const ui::TextureDrawParams& params,
const gfx::Rect& clip_bounds_in_texture) {
- // clip clip_bounds_in_layer to size of texture
- gfx::Rect clip_bounds = clip_bounds_in_texture.Intersect(
- gfx::Rect(gfx::Point(0, 0), size_));
+ // Clip clip_bounds_in_texture to size of texture.
+ gfx::Rect clip_bounds = clip_bounds_in_texture.Intersect(
+ gfx::Rect(gfx::Point(0, 0), size_));
+
+ // Verify that compositor_size has been set.
+ DCHECK(params.compositor_size != gfx::Size(0,0));
if (params.blend)
glEnable(GL_BLEND);
@@ -360,8 +379,6 @@ void TextureGL::DrawInternal(const ui::TextureProgramGL& program,
glUniform1i(program.u_tex_loc(), 0);
glBindTexture(GL_TEXTURE_2D, texture_id_);
- gfx::Size window_size = compositor_->GetSize();
-
ui::Transform t;
t.ConcatTranslate(1, 1);
t.ConcatScale(size_.width()/2.0f, size_.height()/2.0f);
@@ -370,15 +387,16 @@ void TextureGL::DrawInternal(const ui::TextureProgramGL& program,
t.ConcatTransform(params.transform); // Add view transform.
- t.ConcatTranslate(0, -window_size.height());
+ t.ConcatTranslate(0, -params.compositor_size.height());
t.ConcatScale(1, -1);
- t.ConcatTranslate(-window_size.width() / 2.0f, -window_size.height() / 2.0f);
- t.ConcatScale(2.0f / window_size.width(), 2.0f / window_size.height());
+ t.ConcatTranslate(-params.compositor_size.width() / 2.0f,
+ -params.compositor_size.height() / 2.0f);
+ t.ConcatScale(2.0f / params.compositor_size.width(),
+ 2.0f / params.compositor_size.height());
GLfloat m[16];
t.matrix().asColMajorf(m);
- // TODO(pkotwicz) window_size != size_, fix this
SkRect texture_rect = SkRect::MakeXYWH(
clip_bounds.x(),
clip_bounds.y(),
@@ -429,7 +447,7 @@ void TextureGL::DrawInternal(const ui::TextureProgramGL& program,
CompositorGL::CompositorGL(gfx::AcceleratedWidget widget,
const gfx::Size& size)
- : size_(size),
+ : Compositor(size),
started_(false) {
gl_surface_ = gfx::GLSurface::CreateViewGLSurface(false, widget);
gl_context_ = SharedResources::GetInstance()->
@@ -441,34 +459,24 @@ CompositorGL::CompositorGL(gfx::AcceleratedWidget widget,
CompositorGL::~CompositorGL() {
gl_context_ = NULL;
- SharedResources::GetInstance()->ContextDestroyed();
}
void CompositorGL::MakeCurrent() {
gl_context_->MakeCurrent(gl_surface_.get());
}
-gfx::Size CompositorGL::GetSize() {
- return size_;
-}
-
-TextureProgramGL* CompositorGL::program_no_swizzle() {
- return SharedResources::GetInstance()->program_no_swizzle();
-}
-
-TextureProgramGL* CompositorGL::program_swizzle() {
- return SharedResources::GetInstance()->program_swizzle();
+void CompositorGL::OnWidgetSizeChanged() {
}
Texture* CompositorGL::CreateTexture() {
- Texture* texture = new TextureGL(this);
+ Texture* texture = new TextureGL();
return texture;
}
void CompositorGL::NotifyStart() {
started_ = true;
gl_context_->MakeCurrent(gl_surface_.get());
- glViewport(0, 0, size_.width(), size_.height());
+ glViewport(0, 0, size().width(), size().height());
glColorMask(true, true, true, true);
#if defined(DEBUG)
@@ -494,21 +502,13 @@ void CompositorGL::SchedulePaint() {
NOTIMPLEMENTED();
}
-void CompositorGL::OnWidgetSizeChanged(const gfx::Size& size) {
- size_ = size;
-}
-
// static
Compositor* Compositor::Create(gfx::AcceleratedWidget widget,
const gfx::Size& size) {
- // The following line of code exists soley to disable IO restrictions
- // on this thread long enough to perform the GL bindings.
- // TODO(wjmaclean) Remove this when GL initialisation cleaned up.
- base::ThreadRestrictions::ScopedAllowIO allow_io;
- if (gfx::GLSurface::InitializeOneOff() &&
- gfx::GetGLImplementation() != gfx::kGLImplementationNone)
+ if (SharedResources::GetInstance() == NULL)
+ return NULL;
+ else
return new CompositorGL(widget, size);
- return NULL;
}
} // namespace ui
« no previous file with comments | « ui/gfx/compositor/compositor_gl.h ('k') | ui/gfx/compositor/compositor_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698