| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/accelerated_surface_container_linux.h" | 5 #include "content/browser/renderer_host/accelerated_surface_container_linux.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 #include <X11/extensions/Xcomposite.h> | 8 #include <X11/extensions/Xcomposite.h> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 DCHECK(instance); | 162 DCHECK(instance); |
| 163 instance->MakeSharedContextCurrent(); | 163 instance->MakeSharedContextCurrent(); |
| 164 | 164 |
| 165 if (!AcceleratedSurfaceContainerLinuxGLX::InitializeOneOff()) | 165 if (!AcceleratedSurfaceContainerLinuxGLX::InitializeOneOff()) |
| 166 return false; | 166 return false; |
| 167 | 167 |
| 168 // Create pixmap from window. | 168 // Create pixmap from window. |
| 169 // We receive a window here rather than a pixmap directly because drivers | 169 // We receive a window here rather than a pixmap directly because drivers |
| 170 // require (or required) that the pixmap used to create the GL texture be | 170 // require (or required) that the pixmap used to create the GL texture be |
| 171 // created in the same process as the texture. | 171 // created in the same process as the texture. |
| 172 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); | 172 Display* dpy = static_cast<Display*>(instance->GetDisplay()); |
| 173 pixmap_ = XCompositeNameWindowPixmap(dpy, *surface_id); | 173 pixmap_ = XCompositeNameWindowPixmap(dpy, *surface_id); |
| 174 | 174 |
| 175 // Wrap the pixmap in a GLXPixmap | 175 // Wrap the pixmap in a GLXPixmap |
| 176 const int pixmapAttribs[] = { | 176 const int pixmapAttribs[] = { |
| 177 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, | 177 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, |
| 178 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, | 178 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, |
| 179 0 | 179 0 |
| 180 }; | 180 }; |
| 181 | 181 |
| 182 glx_pixmap_ = glXCreatePixmap( | 182 glx_pixmap_ = glXCreatePixmap( |
| 183 dpy, fbconfig_.Get(), pixmap_, pixmapAttribs); | 183 dpy, fbconfig_.Get(), pixmap_, pixmapAttribs); |
| 184 | 184 |
| 185 // Create texture. | 185 // Create texture. |
| 186 glGenTextures(1, &texture_id_); | 186 glGenTextures(1, &texture_id_); |
| 187 glBindTexture(GL_TEXTURE_2D, texture_id_); | 187 glBindTexture(GL_TEXTURE_2D, texture_id_); |
| 188 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 188 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 189 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 189 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| 190 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 190 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 191 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 191 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 192 | 192 |
| 193 return true; | 193 return true; |
| 194 } | 194 } |
| 195 | 195 |
| 196 AcceleratedSurfaceContainerLinuxGLX::~AcceleratedSurfaceContainerLinuxGLX() { | 196 AcceleratedSurfaceContainerLinuxGLX::~AcceleratedSurfaceContainerLinuxGLX() { |
| 197 ui::SharedResources* instance = ui::SharedResources::GetInstance(); | 197 ui::SharedResources* instance = ui::SharedResources::GetInstance(); |
| 198 DCHECK(instance); | 198 DCHECK(instance); |
| 199 instance->MakeSharedContextCurrent(); | 199 instance->MakeSharedContextCurrent(); |
| 200 | 200 |
| 201 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); | 201 Display* dpy = static_cast<Display*>(instance->GetDisplay()); |
| 202 if (glx_pixmap_) | 202 if (glx_pixmap_) |
| 203 glXDestroyGLXPixmap(dpy, glx_pixmap_); | 203 glXDestroyGLXPixmap(dpy, glx_pixmap_); |
| 204 if (pixmap_) | 204 if (pixmap_) |
| 205 XFreePixmap(dpy, pixmap_); | 205 XFreePixmap(dpy, pixmap_); |
| 206 } | 206 } |
| 207 | 207 |
| 208 void AcceleratedSurfaceContainerLinuxGLX::Draw( | 208 void AcceleratedSurfaceContainerLinuxGLX::Draw( |
| 209 const ui::TextureDrawParams& params, | 209 const ui::TextureDrawParams& params, |
| 210 const gfx::Rect& clip_bounds_in_texture) { | 210 const gfx::Rect& clip_bounds_in_texture) { |
| 211 ui::SharedResources* instance = ui::SharedResources::GetInstance(); | 211 ui::SharedResources* instance = ui::SharedResources::GetInstance(); |
| 212 DCHECK(instance); | 212 DCHECK(instance); |
| 213 | 213 |
| 214 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); | 214 Display* dpy = static_cast<Display*>(instance->GetDisplay()); |
| 215 | 215 |
| 216 glBindTexture(GL_TEXTURE_2D, texture_id_); | 216 glBindTexture(GL_TEXTURE_2D, texture_id_); |
| 217 glXBindTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); | 217 glXBindTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); |
| 218 DrawInternal(*instance->program_no_swizzle(), | 218 DrawInternal(*instance->program_no_swizzle(), |
| 219 params, | 219 params, |
| 220 clip_bounds_in_texture); | 220 clip_bounds_in_texture); |
| 221 glXReleaseTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT); | 221 glXReleaseTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT); |
| 222 } | 222 } |
| 223 | 223 |
| 224 // static | 224 // static |
| 225 bool AcceleratedSurfaceContainerLinuxGLX::InitializeOneOff() | 225 bool AcceleratedSurfaceContainerLinuxGLX::InitializeOneOff() |
| 226 { | 226 { |
| 227 static bool initialized = false; | 227 static bool initialized = false; |
| 228 if (initialized) | 228 if (initialized) |
| 229 return true; | 229 return true; |
| 230 | 230 |
| 231 Display* dpy = gfx::GLSurfaceGLX::GetDisplay(); | 231 ui::SharedResources* instance = ui::SharedResources::GetInstance(); |
| 232 DCHECK(instance); |
| 233 |
| 234 Display* dpy = static_cast<Display*>(instance->GetDisplay()); |
| 232 int event_base, error_base; | 235 int event_base, error_base; |
| 233 if (XCompositeQueryExtension(dpy, &event_base, &error_base)) { | 236 if (XCompositeQueryExtension(dpy, &event_base, &error_base)) { |
| 234 int major = 0, minor = 2; | 237 int major = 0, minor = 2; |
| 235 XCompositeQueryVersion(dpy, &major, &minor); | 238 XCompositeQueryVersion(dpy, &major, &minor); |
| 236 if (major == 0 && minor < 2) { | 239 if (major == 0 && minor < 2) { |
| 237 LOG(ERROR) << "Pixmap from window not supported."; | 240 LOG(ERROR) << "Pixmap from window not supported."; |
| 238 return false; | 241 return false; |
| 239 } | 242 } |
| 240 } | 243 } |
| 241 | 244 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 } | 388 } |
| 386 } | 389 } |
| 387 | 390 |
| 388 void AcceleratedSurfaceContainerLinux::SetCanvas( | 391 void AcceleratedSurfaceContainerLinux::SetCanvas( |
| 389 const SkCanvas& canvas, | 392 const SkCanvas& canvas, |
| 390 const gfx::Point& origin, | 393 const gfx::Point& origin, |
| 391 const gfx::Size& overall_size) { | 394 const gfx::Size& overall_size) { |
| 392 NOTREACHED(); | 395 NOTREACHED(); |
| 393 } | 396 } |
| 394 | 397 |
| OLD | NEW |