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

Side by Side Diff: ui/gl/gl_image_glx.cc

Issue 10543125: gpu: Add support for GLX_EXT_texture_from_pixmap extension. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add kGLImplementationMockGL case to gl_image_android.cc. Created 8 years, 2 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/gl/gl_image_glx.h ('k') | ui/gl/gl_image_linux.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 extern "C" {
6 #include <X11/extensions/Xcomposite.h>
7 }
8
9 #include "ui/gl/gl_image_glx.h"
10
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop.h"
15 #include "ui/gl/gl_surface_glx.h"
16
17 namespace gfx {
18
19 namespace {
20
21 // scoped_ptr functor for XFree(). Use as follows:
22 // scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> foo(...);
23 // where "XVisualInfo" is any X type that is freed with XFree.
24 class ScopedPtrXFree {
25 public:
26 void operator()(void* x) const {
27 ::XFree(x);
28 }
29 };
30
31 int BindToTextureFormat(int depth) {
32 if (depth == 32)
33 return GLX_BIND_TO_TEXTURE_RGBA_EXT;
34
35 return GLX_BIND_TO_TEXTURE_RGB_EXT;
36 }
37
38 int TextureFormat(int depth) {
39 if (depth == 32)
40 return GLX_TEXTURE_FORMAT_RGBA_EXT;
41
42 return GLX_TEXTURE_FORMAT_RGB_EXT;
43 }
44
45 } // namespace anonymous
46
47 GLImageGLX::GLImageGLX(gfx::PluginWindowHandle window)
48 : display_(base::MessagePumpForUI::GetDefaultXDisplay()),
49 window_(window),
50 pixmap_(0),
51 glx_pixmap_(0) {
52 }
53
54 bool GLImageGLX::Initialize() {
55 if (!GLSurfaceGLX::IsTextureFromPixmapSupported()) {
56 LOG(ERROR) << "GLX_EXT_texture_from_pixmap not supported.";
57 return false;
58 }
59
60 XWindowAttributes attributes;
61 if (!XGetWindowAttributes(display_, window_, &attributes)) {
62 LOG(ERROR) << "XGetWindowAttributes failed for window " << window_ << ".";
63 return false;
64 }
65
66 XVisualInfo templ;
67 templ.visualid = XVisualIDFromVisual(attributes.visual);
68 int num_visinfo = 0;
69 scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visinfo(
70 XGetVisualInfo(display_,
71 VisualIDMask,
72 &templ,
73 &num_visinfo));
74 if (!visinfo.get()) {
75 LOG(ERROR) << "XGetVisualInfo failed for visual id " <<
76 templ.visualid << ".";
77 return false;
78 }
79 if (!num_visinfo) {
80 LOG(ERROR) << "XGetVisualInfo returned 0 elements.";
81 return false;
82 }
83
84 int config_attribs[] = {
85 GLX_VISUAL_ID, visinfo->visualid,
86 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
87 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_EXT,
88 BindToTextureFormat(visinfo->depth), GL_TRUE,
89 0
90 };
91 int num_elements = 0;
92 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> config(
93 glXChooseFBConfig(display_,
94 DefaultScreen(display_),
95 config_attribs,
96 &num_elements));
97 if (!config.get()) {
98 LOG(ERROR) << "glXChooseFBConfig failed.";
99 return false;
100 }
101 if (!num_elements) {
102 LOG(ERROR) << "glXChooseFBConfig returned 0 elements.";
103 return false;
104 }
105
106 // Create backing pixmap reference.
107 pixmap_ = XCompositeNameWindowPixmap(display_, window_);
108
109 XID root = 0;
110 int x = 0;
111 int y = 0;
112 unsigned int width = 0;
113 unsigned int height = 0;
114 unsigned int bw = 0;
115 unsigned int depth = 0;
116 if (!XGetGeometry(
117 display_, pixmap_, &root, &x, &y, &width, &height, &bw, &depth)) {
118 LOG(ERROR) << "XGetGeometry failed for pixmap " << pixmap_ << ".";
119 return false;
120 }
121
122 int pixmap_attribs[] = {
123 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
124 GLX_TEXTURE_FORMAT_EXT, TextureFormat(visinfo->depth),
125 0
126 };
127 glx_pixmap_ = glXCreatePixmap(
128 display_,
129 *config.get(),
130 pixmap_,
131 pixmap_attribs);
132 if (!glx_pixmap_) {
133 LOG(ERROR) << "glXCreatePixmap failed.";
134 return false;
135 }
136
137 size_ = gfx::Size(width, height);
138 return true;
139 }
140
141 void GLImageGLX::Destroy() {
142 if (glx_pixmap_) {
143 glXDestroyGLXPixmap(display_, glx_pixmap_);
144 glx_pixmap_ = 0;
145 }
146 if (pixmap_) {
147 XFreePixmap(display_, pixmap_);
148 pixmap_ = 0;
149 }
150 }
151
152 gfx::Size GLImageGLX::GetSize() {
153 return size_;
154 }
155
156 bool GLImageGLX::BindTexImage() {
157 if (!glx_pixmap_)
158 return false;
159
160 glXBindTexImageEXT(display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, 0);
161 return true;
162 }
163
164 void GLImageGLX::ReleaseTexImage() {
165 if (!glx_pixmap_)
166 return;
167
168 glXReleaseTexImageEXT(display_, glx_pixmap_, GLX_FRONT_LEFT_EXT);
169 }
170
171 GLImageGLX::~GLImageGLX() {
172 Destroy();
173 }
174
175 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gl/gl_image_glx.h ('k') | ui/gl/gl_image_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698