Index: ui/gfx/compositor/compositor_gl.cc |
diff --git a/ui/gfx/compositor/compositor_gl.cc b/ui/gfx/compositor/compositor_gl.cc |
deleted file mode 100644 |
index 1c54ae22e1f943dd80ff71a081144e2c497e5474..0000000000000000000000000000000000000000 |
--- a/ui/gfx/compositor/compositor_gl.cc |
+++ /dev/null |
@@ -1,655 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ui/gfx/compositor/compositor_gl.h" |
- |
-#include "base/basictypes.h" |
-#include "base/command_line.h" |
-#include "base/compiler_specific.h" |
-#include "base/debug/trace_event.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/memory/singleton.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "third_party/skia/include/core/SkBitmap.h" |
-#include "third_party/skia/include/core/SkDevice.h" |
-#include "third_party/skia/include/core/SkMatrix.h" |
-#include "third_party/skia/include/core/SkPoint.h" |
-#include "third_party/skia/include/core/SkRect.h" |
-#include "third_party/skia/include/core/SkScalar.h" |
-#include "ui/gfx/compositor/compositor_switches.h" |
-#include "ui/gfx/rect.h" |
-#include "ui/gfx/transform.h" |
-#include "ui/gfx/gl/gl_bindings.h" |
-#include "ui/gfx/gl/gl_context.h" |
-#include "ui/gfx/gl/gl_implementation.h" |
-#include "ui/gfx/gl/gl_surface.h" |
- |
-// Wraps a simple GL program for drawing textures to the screen. |
-// Need the declaration before the subclasses in the anonymous namespace below. |
-class ui::TextureProgramGL { |
- public: |
- TextureProgramGL(); |
- virtual ~TextureProgramGL() {} |
- |
- // Returns false if it was unable to initialize properly. |
- // |
- // Host GL context must be current when this is called. |
- virtual bool Initialize() = 0; |
- |
- // Make the program active in the current GL context. |
- void Use() const { glUseProgram(program_); } |
- |
- // Location of vertex position attribute in vertex shader. |
- GLuint a_pos_loc() const { return a_pos_loc_; } |
- |
- // Location of texture co-ordinate attribute in vertex shader. |
- GLuint a_tex_loc() const { return a_tex_loc_; } |
- |
- // Location of the alpha multiplier uniform in the vertex shader. |
- GLuint u_alpha_loc() const { return u_alpha_loc_; } |
- |
- // Location of transformation matrix uniform in vertex shader. |
- GLuint u_mat_loc() const { return u_mat_loc_; } |
- |
- // Location of texture unit uniform that we texture map from |
- // in the fragment shader. |
- GLuint u_tex_loc() const { return u_tex_loc_; } |
- |
- protected: |
- // Only the fragment shaders differ. This handles the initialization |
- // of all the other fields. |
- bool InitializeCommon(); |
- |
- GLuint frag_shader_; |
- |
- private: |
- GLuint program_; |
- GLuint vertex_shader_; |
- |
- GLuint a_pos_loc_; |
- GLuint a_tex_loc_; |
- GLuint u_alpha_loc_; |
- GLuint u_tex_loc_; |
- GLuint u_mat_loc_; |
-}; |
- |
-namespace { |
- |
-class TextureProgramNoSwizzleGL : public ui::TextureProgramGL { |
- public: |
- TextureProgramNoSwizzleGL() {} |
- virtual bool Initialize(); |
- private: |
- DISALLOW_COPY_AND_ASSIGN(TextureProgramNoSwizzleGL); |
-}; |
- |
-class TextureProgramSwizzleGL : public ui::TextureProgramGL { |
- public: |
- TextureProgramSwizzleGL() {} |
- virtual bool Initialize(); |
- private: |
- DISALLOW_COPY_AND_ASSIGN(TextureProgramSwizzleGL); |
-}; |
- |
-GLuint CompileShader(GLenum type, const GLchar* source) { |
- GLuint shader = glCreateShader(type); |
- if (!shader) |
- return 0; |
- |
- glShaderSource(shader, 1, &source, 0); |
- glCompileShader(shader); |
- |
- GLint compiled; |
- glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); |
- if (!compiled) { |
- GLint info_len = 0; |
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len); |
- |
- if (info_len > 0) { |
- scoped_array<char> info_log(new char[info_len]); |
- glGetShaderInfoLog(shader, info_len, NULL, info_log.get()); |
- LOG(ERROR) << "Compile error: " << info_log.get(); |
- return 0; |
- } |
- } |
- return shader; |
-} |
- |
-bool TextureProgramNoSwizzleGL::Initialize() { |
- const bool debug_overdraw = CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableCompositorOverdrawDebugging); |
- |
- if (debug_overdraw) { |
- const GLchar* frag_shader_source = |
- "#ifdef GL_ES\n" |
- "precision mediump float;\n" |
- "#endif\n" |
- "uniform sampler2D u_tex;" |
- "varying vec2 v_texCoord;" |
- "void main()" |
- "{" |
- " gl_FragColor = texture2D(u_tex, v_texCoord);" |
- " gl_FragColor.a = 1.0;" |
- " gl_FragColor = gl_FragColor * 0.25;" |
- " gl_FragColor = gl_FragColor + vec4(0.75, 0.75, 0.75, 0.75);" |
- " gl_FragColor = gl_FragColor * 0.3333333;" |
- "}"; |
- frag_shader_ = CompileShader(GL_FRAGMENT_SHADER, frag_shader_source); |
- } else { |
- const GLchar* frag_shader_source = |
- "#ifdef GL_ES\n" |
- "precision mediump float;\n" |
- "#endif\n" |
- "uniform float u_alpha;" |
- "uniform sampler2D u_tex;" |
- "varying vec2 v_texCoord;" |
- "void main()" |
- "{" |
- " gl_FragColor = texture2D(u_tex, v_texCoord);" |
- " if (u_alpha > 0.0)" |
- " gl_FragColor.a = u_alpha;" |
- " else" |
- " gl_FragColor.a = gl_FragColor.a * -u_alpha;" |
- "}"; |
- frag_shader_ = CompileShader(GL_FRAGMENT_SHADER, frag_shader_source); |
- } |
- |
- if (!frag_shader_) |
- return false; |
- |
- return InitializeCommon(); |
-} |
- |
-bool TextureProgramSwizzleGL::Initialize() { |
- const bool debug_overdraw = CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableCompositorOverdrawDebugging); |
- |
- if (debug_overdraw) { |
- const GLchar* frag_shader_source = |
- "#ifdef GL_ES\n" |
- "precision mediump float;\n" |
- "#endif\n" |
- "uniform sampler2D u_tex;" |
- "varying vec2 v_texCoord;" |
- "void main()" |
- "{" |
- " gl_FragColor = texture2D(u_tex, v_texCoord).zyxw;" |
- " gl_FragColor.a = 1.0;" |
- " gl_FragColor = gl_FragColor * 0.25;" |
- " gl_FragColor = gl_FragColor + vec4(0.75, 0.75, 0.75, 0.75);" |
- " gl_FragColor = gl_FragColor * 0.3333333;" |
- "}"; |
- frag_shader_ = CompileShader(GL_FRAGMENT_SHADER, frag_shader_source); |
- } else { |
- const GLchar* frag_shader_source = |
- "#ifdef GL_ES\n" |
- "precision mediump float;\n" |
- "#endif\n" |
- "uniform float u_alpha;" |
- "uniform sampler2D u_tex;" |
- "varying vec2 v_texCoord;" |
- "void main()" |
- "{" |
- " gl_FragColor = texture2D(u_tex, v_texCoord).zyxw;" |
- " if (u_alpha > 0.0)" |
- " gl_FragColor.a = u_alpha;" |
- " else" |
- " gl_FragColor.a = gl_FragColor.a * -u_alpha;" |
- "}"; |
- frag_shader_ = CompileShader(GL_FRAGMENT_SHADER, frag_shader_source); |
- } |
- |
- if (!frag_shader_) |
- return false; |
- |
- return InitializeCommon(); |
-} |
- |
-} // namespace |
- |
-namespace ui { |
- |
-TextureProgramGL::TextureProgramGL() |
- : program_(0), |
- a_pos_loc_(0), |
- a_tex_loc_(0), |
- u_alpha_loc_(0), |
- u_tex_loc_(0), |
- u_mat_loc_(0) { |
-} |
- |
-bool TextureProgramGL::InitializeCommon() { |
- const GLchar* vertex_shader_source = |
- "attribute vec4 a_position;" |
- "attribute vec2 a_texCoord;" |
- "uniform mat4 u_matViewProjection;" |
- "varying vec2 v_texCoord;" |
- "void main()" |
- "{" |
- " gl_Position = u_matViewProjection * a_position;" |
- " v_texCoord = a_texCoord;" |
- "}"; |
- |
- vertex_shader_ = CompileShader(GL_VERTEX_SHADER, vertex_shader_source); |
- if (!vertex_shader_) |
- return false; |
- |
- program_ = glCreateProgram(); |
- glAttachShader(program_, vertex_shader_); |
- glAttachShader(program_, frag_shader_); |
- glLinkProgram(program_); |
- |
- if (glGetError() != GL_NO_ERROR) |
- return false; |
- |
- // Store locations of program inputs. |
- a_pos_loc_ = glGetAttribLocation(program_, "a_position"); |
- a_tex_loc_ = glGetAttribLocation(program_, "a_texCoord"); |
- u_alpha_loc_ = glGetUniformLocation(program_, "u_alpha"); |
- u_tex_loc_ = glGetUniformLocation(program_, "u_tex"); |
- u_mat_loc_ = glGetUniformLocation(program_, "u_matViewProjection"); |
- |
- return true; |
-} |
- |
-SharedResourcesGL::SharedResourcesGL() : initialized_(false) { |
-} |
- |
- |
-SharedResourcesGL::~SharedResourcesGL() { |
-} |
- |
-// static |
-SharedResourcesGL* SharedResourcesGL::GetInstance() { |
- // We use LeakySingletonTraits so that we don't race with |
- // the tear down of the gl_bindings. |
- SharedResourcesGL* instance = Singleton<SharedResourcesGL, |
- LeakySingletonTraits<SharedResourcesGL> >::get(); |
- if (instance->Initialize()) { |
- return instance; |
- } else { |
- instance->Destroy(); |
- return NULL; |
- } |
-} |
- |
-bool SharedResourcesGL::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(), |
- gfx::PreferIntegratedGpu); |
- 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 SharedResourcesGL::Destroy() { |
- program_swizzle_.reset(); |
- program_no_swizzle_.reset(); |
- |
- context_ = NULL; |
- surface_ = NULL; |
- |
- initialized_ = false; |
-} |
- |
-gfx::ScopedMakeCurrent* SharedResourcesGL::GetScopedMakeCurrent() { |
- DCHECK(initialized_); |
- if (initialized_) |
- return new gfx::ScopedMakeCurrent(context_.get(), surface_.get()); |
- else |
- return NULL; |
-} |
- |
-scoped_refptr<gfx::GLContext> SharedResourcesGL::CreateContext( |
- gfx::GLSurface* surface) { |
- if (initialized_) |
- return gfx::GLContext::CreateGLContext( |
- context_->share_group(), |
- surface, |
- gfx::PreferIntegratedGpu); |
- else |
- return NULL; |
-} |
- |
-void* SharedResourcesGL::GetDisplay() { |
- return surface_->GetDisplay(); |
-} |
- |
-TextureGL::TextureGL() : texture_id_(0) { |
-} |
- |
-TextureGL::TextureGL(const gfx::Size& size) : texture_id_(0), size_(size) { |
-} |
- |
-TextureGL::~TextureGL() { |
- if (texture_id_) { |
- SharedResourcesGL* instance = SharedResourcesGL::GetInstance(); |
- DCHECK(instance); |
- scoped_ptr<gfx::ScopedMakeCurrent> bind(instance->GetScopedMakeCurrent()); |
- glDeleteTextures(1, &texture_id_); |
- } |
-} |
- |
-void TextureGL::SetCanvas(const SkCanvas& canvas, |
- const gfx::Point& origin, |
- const gfx::Size& overall_size) { |
- TRACE_EVENT0("ui", "TextureGL::SetCanvas"); |
- const SkBitmap& bitmap = canvas.getDevice()->accessBitmap(false); |
- // Verify bitmap pixels are contiguous. |
- DCHECK_EQ(bitmap.rowBytes(), |
- SkBitmap::ComputeRowBytes(bitmap.config(), bitmap.width())); |
- SkAutoLockPixels lock(bitmap); |
- void* pixels = bitmap.getPixels(); |
- |
- if (!texture_id_) { |
- // Texture needs to be created. We assume the first call is for |
- // a full-sized canvas. |
- size_ = overall_size; |
- |
- glGenTextures(1, &texture_id_); |
- glBindTexture(GL_TEXTURE_2D, texture_id_); |
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, |
- size_.width(), size_.height(), 0, |
- GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
- |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
- } else if (size_ != overall_size) { // Size has changed. |
- size_ = overall_size; |
- glBindTexture(GL_TEXTURE_2D, texture_id_); |
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, |
- size_.width(), size_.height(), 0, |
- GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
- } else { |
- glBindTexture(GL_TEXTURE_2D, texture_id_); |
- } |
- glTexSubImage2D(GL_TEXTURE_2D, 0, origin.x(), origin.y(), |
- bitmap.width(), bitmap.height(), |
- GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
-} |
- |
-void TextureGL::Draw(const ui::TextureDrawParams& params, |
- const gfx::Rect& clip_bounds_in_texture) { |
- TRACE_EVENT0("ui", "TextureGL::Draw"); |
- SharedResourcesGL* instance = SharedResourcesGL::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_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); |
- else |
- glDisable(GL_BLEND); |
- |
- program.Use(); |
- |
- glActiveTexture(GL_TEXTURE0); |
- glUniform1i(program.u_tex_loc(), 0); |
- glBindTexture(GL_TEXTURE_2D, texture_id_); |
- |
- ui::Transform t; |
- t.ConcatTranslate(1, 1); |
- t.ConcatScale(size_.width()/2.0f, size_.height()/2.0f); |
- t.ConcatTranslate(0, -size_.height()); |
- t.ConcatScale(1, -1); |
- |
- t.ConcatTransform(params.transform); // Add view transform. |
- |
- t.ConcatTranslate(0, -params.compositor_size.height()); |
- t.ConcatScale(1, -1); |
- 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); |
- |
- SkPoint texture_points[4]; |
- texture_points[0] = SkPoint::Make(clip_bounds.x(), |
- clip_bounds.y() + clip_bounds.height()); |
- texture_points[1] = SkPoint::Make(clip_bounds.x() + clip_bounds.width(), |
- clip_bounds.y() + clip_bounds.height()); |
- texture_points[2] = SkPoint::Make(clip_bounds.x() + clip_bounds.width(), |
- clip_bounds.y()); |
- texture_points[3] = SkPoint::Make(clip_bounds.x(), clip_bounds.y()); |
- |
- ui::Transform texture_rect_transform; |
- texture_rect_transform.ConcatScale(1.0f / size_.width(), |
- 1.0f / size_.height()); |
- if (params.vertically_flipped) { |
- ui::Transform vertical_flip; |
- vertical_flip.SetScaleY(-1.0); |
- vertical_flip.SetTranslateY(1.0); |
- texture_rect_transform.ConcatTransform(vertical_flip); |
- } |
- SkMatrix texture_transform_matrix = texture_rect_transform.matrix(); |
- texture_transform_matrix.mapPoints(texture_points, 4); |
- |
- SkRect clip_rect = SkRect::MakeXYWH( |
- clip_bounds.x(), |
- clip_bounds.y(), |
- clip_bounds.width(), |
- clip_bounds.height()); |
- |
- ui::Transform clip_rect_transform; |
- clip_rect_transform.ConcatScale(2.0f / size_.width(), |
- 2.0f / size_.height()); |
- clip_rect_transform.ConcatScale(1, -1); |
- clip_rect_transform.ConcatTranslate(-1.0f, 1.0f); |
- SkMatrix clip_transform_matrix = clip_rect_transform.matrix(); |
- clip_transform_matrix.mapRect(&clip_rect); |
- |
- GLfloat clip_vertices[] = { clip_rect.left(), clip_rect.top(), +0., |
- clip_rect.right(), clip_rect.top(), +0., |
- clip_rect.right(), clip_rect.bottom(), +0., |
- clip_rect.left(), clip_rect.bottom(), +0.}; |
- |
- GLfloat texture_vertices[] = { texture_points[0].x(), texture_points[0].y(), |
- texture_points[1].x(), texture_points[1].y(), |
- texture_points[2].x(), texture_points[2].y(), |
- texture_points[3].x(), texture_points[3].y()}; |
- |
- glVertexAttribPointer(program.a_pos_loc(), 3, GL_FLOAT, |
- GL_FALSE, 3 * sizeof(GLfloat), clip_vertices); |
- glVertexAttribPointer(program.a_tex_loc(), 2, GL_FLOAT, |
- GL_FALSE, 2 * sizeof(GLfloat), texture_vertices); |
- glEnableVertexAttribArray(program.a_pos_loc()); |
- glEnableVertexAttribArray(program.a_tex_loc()); |
- |
- glUniformMatrix4fv(program.u_mat_loc(), 1, GL_FALSE, m); |
- |
- // negative means multiply, positive means clobber. |
- float alpha = params.has_valid_alpha_channel |
- ? -params.opacity |
- : params.opacity; |
- |
- glUniform1fv(program.u_alpha_loc(), 1, &alpha); |
- |
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
-} |
- |
-CompositorGL::CompositorGL(CompositorDelegate* delegate, |
- gfx::AcceleratedWidget widget, |
- const gfx::Size& size) |
- : Compositor(delegate, size), |
- started_(false) { |
- gl_surface_ = gfx::GLSurface::CreateViewGLSurface(false, widget); |
- gl_context_ = SharedResourcesGL::GetInstance()-> |
- CreateContext(gl_surface_.get()); |
- gl_context_->MakeCurrent(gl_surface_.get()); |
- |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- |
- if (!command_line->HasSwitch(switches::kDisableUIVsync)) |
- gl_context_->SetSwapInterval(1); |
- |
- glColorMask(true, true, true, true); |
- |
- const bool debug_overdraw = command_line->HasSwitch( |
- switches::kEnableCompositorOverdrawDebugging); |
- |
- if (debug_overdraw) |
- glBlendFunc(GL_ONE, GL_ONE); |
- else |
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
-} |
- |
-CompositorGL::~CompositorGL() { |
- gl_context_ = NULL; |
-} |
- |
-bool CompositorGL::ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds) { |
- MakeCurrent(); |
- |
- if (bounds.right() > size().width() || bounds.bottom() > size().height()) |
- return false; |
- |
- bitmap->setConfig(SkBitmap::kARGB_8888_Config, |
- bounds.width(), |
- bounds.height()); |
- bitmap->allocPixels(); |
- SkAutoLockPixels lock(*bitmap); |
- unsigned char* pixels = static_cast<unsigned char*>(bitmap->getPixels()); |
- |
- // Check that it's a tight pixel packing |
- DCHECK_EQ(bitmap->rowBytes(), |
- SkBitmap::ComputeRowBytes(bitmap->config(), bitmap->width())); |
- |
- GLint current_alignment = 0; |
- glGetIntegerv(GL_PACK_ALIGNMENT, ¤t_alignment); |
- glPixelStorei(GL_PACK_ALIGNMENT, 4); |
- |
- // Flip vertically to convert to OpenGL coordinates. |
- glReadPixels(bounds.x(), |
- size().height() - bounds.y() - bounds.height(), |
- bounds.width(), |
- bounds.height(), |
- GL_RGBA, |
- GL_UNSIGNED_BYTE, |
- pixels); |
- glPixelStorei(GL_PACK_ALIGNMENT, current_alignment); |
- |
- SwizzleRGBAToBGRAAndFlip(pixels, bounds.size()); |
- return true; |
-} |
- |
-void CompositorGL::MakeCurrent() { |
- gl_context_->MakeCurrent(gl_surface_.get()); |
-} |
- |
-void CompositorGL::OnWidgetSizeChanged() { |
-} |
- |
-Texture* CompositorGL::CreateTexture() { |
- Texture* texture = new TextureGL(); |
- return texture; |
-} |
- |
-void CompositorGL::OnNotifyStart(bool clear) { |
- TRACE_EVENT0("ui", "CompositorGL::OnNotifyStart"); |
- started_ = true; |
- gl_context_->MakeCurrent(gl_surface_.get()); |
- glViewport(0, 0, size().width(), size().height()); |
- glColorMask(true, true, true, true); |
- |
- if (clear) { |
- glClearColor(0, 0, 0, 0); |
- glClear(GL_COLOR_BUFFER_BIT); |
- } |
-#if !defined(NDEBUG) |
- else { |
- // In debug mode, when we're not forcing a clear, clear to 'psychedelic' |
- // purple to make it easy to spot un-rendered regions. |
- glClearColor(223.0 / 255, 0, 1, 1); |
- glClear(GL_COLOR_BUFFER_BIT); |
- } |
-#endif |
-} |
- |
-void CompositorGL::OnNotifyEnd() { |
- TRACE_EVENT0("ui", "CompositorGL::OnNotifyEnd"); |
- DCHECK(started_); |
- gl_surface_->SwapBuffers(); |
- started_ = false; |
-} |
- |
-void CompositorGL::Blur(const gfx::Rect& bounds) { |
- NOTIMPLEMENTED(); |
-} |
- |
-// static |
-Compositor* Compositor::Create(CompositorDelegate* owner, |
- gfx::AcceleratedWidget widget, |
- const gfx::Size& size) { |
- if (SharedResourcesGL::GetInstance() == NULL) |
- return NULL; |
- else |
- return new CompositorGL(owner, widget, size); |
-} |
- |
-} // namespace ui |