Merge lp:~vanvugt/compiz/blacklist into lp:compiz/0.9.9

Proposed by Daniel van Vugt
Status: Merged
Approved by: Timo Jyrinki
Approved revision: 3525
Merged at revision: 3525
Proposed branch: lp:~vanvugt/compiz/blacklist
Merge into: lp:compiz/0.9.9
Diff against target: 441 lines (+308/-5)
10 files modified
plugins/opengl/CMakeLists.txt (+2/-0)
plugins/opengl/opengl.xml.in (+5/-0)
plugins/opengl/src/blacklist/CMakeLists.txt (+6/-0)
plugins/opengl/src/blacklist/blacklist.cpp (+67/-0)
plugins/opengl/src/blacklist/blacklist.h (+38/-0)
plugins/opengl/src/blacklist/tests/CMakeLists.txt (+9/-0)
plugins/opengl/src/blacklist/tests/test-blacklist.cpp (+152/-0)
plugins/opengl/src/paint.cpp (+6/-0)
plugins/opengl/src/privates.h (+4/-0)
plugins/opengl/src/screen.cpp (+19/-5)
To merge this branch: bzr merge lp:~vanvugt/compiz/blacklist
Reviewer Review Type Date Requested Status
Timo Jyrinki Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+139394@code.launchpad.net

Commit message

Add a feature for blacklisting certain graphics drivers from being able to
unredirect fullscreen windows. Right now the only known broken drivers are
nouveau and intel on precise (Mesa 8.0). But the blacklist is a regex that
can be adjusted at any time.
(LP: #1089246)

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Timo Jyrinki (timo-jyrinki) wrote :

Looks, builds and functions fine. My quantal Intel wasn't blacklisted, but I was able to blacklist it by modifying the default regexp.

review: Approve
Revision history for this message
Michael Terry (mterry) wrote :

Will it always be obvious what "blacklisted" means? Right now it seems it is specific to one feature. We might get a second feature in the future that needs a separate blacklist list. Just saying that maybe the function name should be something like blacklisted_for_unredirect(). But I don't feel strongly about it.

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Michael makes a good point and I did think about that. However it's possible and even likely to never be a problem for the lifetime of the Compiz code.

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Although, the "blacklisted" function is generic. It is specific to OpenGL drivers but the same function could be applied to other features; not just "unredirected fullscreen windows". So a generic name is appropriate.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'plugins/opengl/CMakeLists.txt'
--- plugins/opengl/CMakeLists.txt 2012-11-08 09:18:59 +0000
+++ plugins/opengl/CMakeLists.txt 2012-12-12 07:55:25 +0000
@@ -5,11 +5,13 @@
5set (INTERNAL_LIBRARIES5set (INTERNAL_LIBRARIES
6 compiz_opengl_double_buffer6 compiz_opengl_double_buffer
7 compiz_opengl_fsregion7 compiz_opengl_fsregion
8 compiz_opengl_blacklist
8 compiz_opengl_glx_tfp_bind9 compiz_opengl_glx_tfp_bind
9)10)
1011
11add_subdirectory (src/doublebuffer)12add_subdirectory (src/doublebuffer)
12add_subdirectory (src/fsregion)13add_subdirectory (src/fsregion)
14add_subdirectory (src/blacklist)
13add_subdirectory (src/glxtfpbind)15add_subdirectory (src/glxtfpbind)
1416
15include_directories (src/glxtfpbind/include)17include_directories (src/glxtfpbind/include)
1618
=== modified file 'plugins/opengl/opengl.xml.in'
--- plugins/opengl/opengl.xml.in 2012-10-15 10:31:51 +0000
+++ plugins/opengl/opengl.xml.in 2012-12-12 07:55:25 +0000
@@ -59,6 +59,11 @@
59 <_long>Use glXSwapBuffers to display every frame. This eliminates visible tearing with most drivers and dramatically improves visual smoothness. Automatically enabled when framebuffer_object is on.</_long>59 <_long>Use glXSwapBuffers to display every frame. This eliminates visible tearing with most drivers and dramatically improves visual smoothness. Automatically enabled when framebuffer_object is on.</_long>
60 <default>true</default>60 <default>true</default>
61 </option>61 </option>
62 <option name="unredirect_driver_blacklist" type="string">
63 <_short>Unredirect Driver Blacklist</_short>
64 <_long>If non-empty, specifies a POSIX (extended) regular expression to match against the OpenGL driver strings (newline separated): "GL_VENDOR\nGL_RENDERER\nGL_VERSION". If the regular expression matches a substring of that concatenation then no windows will ever be unredirected while using that particular graphics driver.</_long>
65 <default>(nouveau|Intel).*Mesa 8\\.0</default>
66 </option>
62 </options>67 </options>
63 </plugin>68 </plugin>
64</compiz>69</compiz>
6570
=== added directory 'plugins/opengl/src/blacklist'
=== added file 'plugins/opengl/src/blacklist/CMakeLists.txt'
--- plugins/opengl/src/blacklist/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ plugins/opengl/src/blacklist/CMakeLists.txt 2012-12-12 07:55:25 +0000
@@ -0,0 +1,6 @@
1if (COMPIZ_BUILD_TESTING)
2add_subdirectory (tests)
3endif ()
4
5add_library (compiz_opengl_blacklist STATIC blacklist.cpp)
6
07
=== added file 'plugins/opengl/src/blacklist/blacklist.cpp'
--- plugins/opengl/src/blacklist/blacklist.cpp 1970-01-01 00:00:00 +0000
+++ plugins/opengl/src/blacklist/blacklist.cpp 2012-12-12 07:55:25 +0000
@@ -0,0 +1,67 @@
1/*
2 * Compiz opengl plugin, Blacklist feature
3 *
4 * Copyright (c) 2012 Canonical Ltd.
5 * Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25
26#include "blacklist.h"
27#include <cstdio>
28#include <regex.h>
29
30namespace compiz {
31namespace opengl {
32
33bool blacklisted (const char *blacklistRegex, const char *glVendor,
34 const char *glRenderer, const char *glVersion)
35{
36 bool matches = false;
37
38 if (blacklistRegex && blacklistRegex[0])
39 {
40 regex_t re;
41
42 // Ensure the regex contains something other than spaces, or ignore.
43 const char *p = blacklistRegex;
44 while (*p == ' ')
45 p++;
46
47 if (*p && !regcomp (&re, blacklistRegex, REG_EXTENDED))
48 {
49 char driver[1024];
50
51 snprintf (driver, sizeof driver, "%s\n%s\n%s",
52 glVendor ? glVendor : "",
53 glRenderer ? glRenderer : "",
54 glVersion ? glVersion : "");
55
56 if (!regexec (&re, driver, 0, NULL, 0))
57 matches = true;
58
59 regfree (&re);
60 }
61 }
62
63 return matches;
64}
65
66} // namespace opengl
67} // namespace compiz
068
=== added file 'plugins/opengl/src/blacklist/blacklist.h'
--- plugins/opengl/src/blacklist/blacklist.h 1970-01-01 00:00:00 +0000
+++ plugins/opengl/src/blacklist/blacklist.h 2012-12-12 07:55:25 +0000
@@ -0,0 +1,38 @@
1/*
2 * Compiz opengl plugin, Blacklist function
3 *
4 * Copyright (c) 2012 Canonical Ltd.
5 * Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25
26#ifndef __COMPIZ_OPENGL_BLACKLIST_H
27#define __COMPIZ_OPENGL_BLACKLIST_H
28
29namespace compiz {
30namespace opengl {
31
32bool blacklisted (const char *blacklistRegex, const char *glVendor,
33 const char *glRenderer, const char *glVersion);
34
35} // namespace opengl
36} // namespace compiz
37
38#endif
039
=== added directory 'plugins/opengl/src/blacklist/tests'
=== added file 'plugins/opengl/src/blacklist/tests/CMakeLists.txt'
--- plugins/opengl/src/blacklist/tests/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ plugins/opengl/src/blacklist/tests/CMakeLists.txt 2012-12-12 07:55:25 +0000
@@ -0,0 +1,9 @@
1include_directories (${GTEST_INCLUDE_DIRS} ..)
2set (exe "compiz_opengl_test_blacklist")
3add_executable (${exe} test-blacklist.cpp)
4target_link_libraries (${exe}
5 compiz_opengl_blacklist
6 ${GTEST_BOTH_LIBRARIES}
7)
8compiz_discover_tests(${exe} COVERAGE compiz_opengl_blacklist)
9
010
=== added file 'plugins/opengl/src/blacklist/tests/test-blacklist.cpp'
--- plugins/opengl/src/blacklist/tests/test-blacklist.cpp 1970-01-01 00:00:00 +0000
+++ plugins/opengl/src/blacklist/tests/test-blacklist.cpp 2012-12-12 07:55:25 +0000
@@ -0,0 +1,152 @@
1/*
2 * Compiz opengl plugin, Backlist feature
3 *
4 * Copyright (c) 2012 Canonical Ltd.
5 * Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25
26#include "gtest/gtest.h"
27#include "blacklist.h"
28
29using namespace compiz::opengl;
30
31static const char *recommendedRegex = "(nouveau|Intel).*Mesa 8\\.0";
32
33TEST (DriverBlacklist, QuantalIntelIsGood)
34{
35 EXPECT_FALSE (blacklisted (recommendedRegex,
36 "Intel Open Source Technology Center",
37 "Mesa DRI Intel(R) Sandybridge Desktop",
38 "3.0 Mesa 9.0"));
39}
40
41TEST (DriverBlacklist, PreciseIntelIsBad)
42{
43 EXPECT_TRUE (blacklisted (recommendedRegex,
44 "Tungsten Graphics, Inc",
45 "Mesa DRI Intel(R) Sandybridge Desktop",
46 "3.0 Mesa 8.0.2"));
47}
48
49TEST (DriverBlacklist, QuantalNouveauIsGood)
50{
51 EXPECT_FALSE (blacklisted (recommendedRegex,
52 "nouveau",
53 "Gallium 0.4 on NV86",
54 "3.0 Mesa 9.0-devel"));
55}
56
57TEST (DriverBlacklist, PreciseNouveauIsBad)
58{
59 EXPECT_TRUE (blacklisted (recommendedRegex,
60 "nouveau",
61 "Gallium 0.4 on NVA8",
62 "2.1 Mesa 8.0.2"));
63}
64
65TEST (DriverBlacklist, FglrxIsGood)
66{
67 EXPECT_FALSE (blacklisted (recommendedRegex,
68 "Advanced Micro Devices, Inc.",
69 "ATI Radeon HD 5450",
70 "4.2.11627 Compatibility Profile Context"));
71}
72
73TEST (DriverBlacklist, NvidiaIsGood)
74{
75 EXPECT_FALSE (blacklisted (recommendedRegex,
76 "NVIDIA Corporation",
77 "Quadro 1000M/PCIe/SSE2",
78 "4.2.0 NVIDIA 304.48"));
79}
80
81TEST (DriverBlacklist, RadeonIsGood1)
82{
83 EXPECT_FALSE (blacklisted (recommendedRegex,
84 "X.Org R300 Project",
85 "Gallium 0.4 on ATI RV350",
86 "2.1 Mesa 8.0.2"));
87}
88
89TEST (DriverBlacklist, RadeonIsGood2)
90{
91 EXPECT_FALSE (blacklisted (recommendedRegex,
92 "X.Org",
93 "Gallium 0.4 on AMD CEDAR",
94 "2.1 Mesa 8.0.3"));
95}
96
97TEST (DriverBlacklist, RadeonIsGood3)
98{
99 EXPECT_FALSE (blacklisted (recommendedRegex,
100 "X.Org",
101 "Gallium 0.4 on AMD RS880",
102 "2.1 Mesa 8.0.2"));
103}
104
105TEST (DriverBlacklist, LLVMpipeIsGood)
106{
107 EXPECT_FALSE (blacklisted (recommendedRegex,
108 "VMware, Inc.",
109 "Gallium 0.4 on llvmpipe (LLVM 0x300)",
110 "2.1 Mesa 8.0.4"));
111}
112
113TEST (DriverBlacklist, UnknownIsGood)
114{
115 EXPECT_FALSE (blacklisted (recommendedRegex,
116 "Acme",
117 "Graphics Driver",
118 "4.2 8.0 9.0 123.456"));
119}
120
121TEST (DriverBlacklist, NoBlacklist)
122{
123 EXPECT_FALSE (blacklisted ("",
124 "Tungsten Graphics, Inc",
125 "Mesa DRI Intel(R) Sandybridge Desktop",
126 "3.0 Mesa 8.0.2"));
127 EXPECT_FALSE (blacklisted ("", "foo", "bar", "blah"));
128 EXPECT_FALSE (blacklisted ("", "", "", ""));
129}
130
131TEST (DriverBlacklist, LineContinuation)
132{
133 EXPECT_FALSE (blacklisted ("alpha", "beta", "gamma", "delta"));
134 EXPECT_FALSE (blacklisted ("betagam", "beta", "gamma", "delta"));
135 EXPECT_TRUE (blacklisted ("gamma", "beta", "gamma", "delta"));
136 EXPECT_TRUE (blacklisted ("del", "beta", "gamma", "delta"));
137 EXPECT_TRUE (blacklisted ("(mag|gam)", "beta", "gamma", "delta"));
138 EXPECT_TRUE (blacklisted ("beta.*delt", "beta", "gamma", "delta"));
139 EXPECT_FALSE (blacklisted ("beta.*felt", "beta", "gamma", "delta"));
140
141 EXPECT_TRUE (blacklisted ("beta\ngamma\ndelta", "beta", "gamma", "delta"));
142}
143
144TEST (DriverBlacklist, StraySpaces)
145{
146 EXPECT_FALSE (blacklisted (" ", "Hello world", "and", "goodbye"));
147 EXPECT_FALSE (blacklisted (" ", " ", " ", " "));
148 EXPECT_FALSE (blacklisted (" ",
149 "Tungsten Graphics, Inc",
150 "Mesa DRI Intel(R) Sandybridge Desktop",
151 "3.0 Mesa 8.0.2"));
152}
0153
=== modified file 'plugins/opengl/src/paint.cpp'
--- plugins/opengl/src/paint.cpp 2012-12-12 04:29:49 +0000
+++ plugins/opengl/src/paint.cpp 2012-12-12 07:55:25 +0000
@@ -261,6 +261,11 @@
261 const CompMatch &unredirectable = CompositeScreen::get (screen)->261 const CompMatch &unredirectable = CompositeScreen::get (screen)->
262 getOption ("unredirect_match")->value ().match ();262 getOption ("unredirect_match")->value ().match ();
263263
264 const CompString &blacklist =
265 getOption ("unredirect_driver_blacklist")->value ().s ();
266
267 bool blacklisted = driverIsBlacklisted (blacklist.c_str ());
268
264 if (mask & PAINT_SCREEN_TRANSFORMED_MASK)269 if (mask & PAINT_SCREEN_TRANSFORMED_MASK)
265 {270 {
266 windowMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK;271 windowMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK;
@@ -354,6 +359,7 @@
354 * beneath them and so neither should be unredirected in that case.359 * beneath them and so neither should be unredirected in that case.
355 */360 */
356 if (unredirectFS &&361 if (unredirectFS &&
362 !blacklisted &&
357 unredirectable.evaluate (w) &&363 unredirectable.evaluate (w) &&
358 !(mask & PAINT_SCREEN_TRANSFORMED_MASK) &&364 !(mask & PAINT_SCREEN_TRANSFORMED_MASK) &&
359 !(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) &&365 !(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) &&
360366
=== modified file 'plugins/opengl/src/privates.h'
--- plugins/opengl/src/privates.h 2012-12-07 08:09:56 +0000
+++ plugins/opengl/src/privates.h 2012-12-12 07:55:25 +0000
@@ -161,6 +161,8 @@
161161
162 void updateView ();162 void updateView ();
163163
164 bool driverIsBlacklisted (const char *regex) const;
165
164 public:166 public:
165167
166 GLScreen *gScreen;168 GLScreen *gScreen;
@@ -219,6 +221,8 @@
219221
220 Pixmap rootPixmapCopy;222 Pixmap rootPixmapCopy;
221 CompSize rootPixmapSize;223 CompSize rootPixmapSize;
224
225 const char *glVendor, *glRenderer, *glVersion;
222};226};
223227
224class PrivateGLWindow :228class PrivateGLWindow :
225229
=== modified file 'plugins/opengl/src/screen.cpp'
--- plugins/opengl/src/screen.cpp 2012-12-10 03:28:47 +0000
+++ plugins/opengl/src/screen.cpp 2012-12-12 07:55:25 +0000
@@ -36,6 +36,7 @@
36#include <boost/make_shared.hpp>36#include <boost/make_shared.hpp>
3737
38#include "privates.h"38#include "privates.h"
39#include "blacklist/blacklist.h"
3940
40#include <dlfcn.h>41#include <dlfcn.h>
41#include <math.h>42#include <math.h>
@@ -600,8 +601,6 @@
600 GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };601 GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };
601 GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f };602 GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f };
602 GLfloat light0Position[] = { -0.5f, 0.5f, -9.0f, 1.0f };603 GLfloat light0Position[] = { -0.5f, 0.5f, -9.0f, 1.0f };
603 const char *glRenderer;
604 const char *glVendor;
605 CompOption::Vector o (0);604 CompOption::Vector o (0);
606605
607 priv->ctx = glXCreateContext (dpy, visinfo, NULL, True);606 priv->ctx = glXCreateContext (dpy, visinfo, NULL, True);
@@ -640,8 +639,14 @@
640 return false;639 return false;
641 }640 }
642641
643 glRenderer = (const char *) glGetString (GL_RENDERER);642 const char *glVendor = (const char *) glGetString (GL_VENDOR);
644 glVendor = (const char *) glGetString (GL_VENDOR);643 const char *glRenderer = (const char *) glGetString (GL_RENDERER);
644 const char *glVersion = (const char *) glGetString (GL_VERSION);
645
646 priv->glVendor = glVendor;
647 priv->glRenderer = glRenderer;
648 priv->glVersion = glVersion;
649
645 if (glRenderer != NULL &&650 if (glRenderer != NULL &&
646 (strcmp (glRenderer, "Software Rasterizer") == 0 ||651 (strcmp (glRenderer, "Software Rasterizer") == 0 ||
647 strcmp (glRenderer, "Mesa X11") == 0))652 strcmp (glRenderer, "Mesa X11") == 0))
@@ -1240,7 +1245,10 @@
1240 shaderCache (),1245 shaderCache (),
1241 autoProgram (new GLScreenAutoProgram(gs)),1246 autoProgram (new GLScreenAutoProgram(gs)),
1242 rootPixmapCopy (None),1247 rootPixmapCopy (None),
1243 rootPixmapSize ()1248 rootPixmapSize (),
1249 glVendor (NULL),
1250 glRenderer (NULL),
1251 glVersion (NULL)
1244{1252{
1245 ScreenInterface::setHandler (screen);1253 ScreenInterface::setHandler (screen);
1246}1254}
@@ -2144,6 +2152,12 @@
2144 CompositeScreen::get (screen)->damageScreen ();2152 CompositeScreen::get (screen)->damageScreen ();
2145}2153}
21462154
2155bool
2156PrivateGLScreen::driverIsBlacklisted (const char *regex) const
2157{
2158 return blacklisted (regex, glVendor, glRenderer, glVersion);
2159}
2160
2147GLTexture::BindPixmapHandle2161GLTexture::BindPixmapHandle
2148GLScreen::registerBindPixmap (GLTexture::BindPixmapProc proc)2162GLScreen::registerBindPixmap (GLTexture::BindPixmapProc proc)
2149{2163{

Subscribers

People subscribed via source and target branches