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

Side by Side Diff: ui/gl/generate_bindings.py

Issue 11266023: Make GL calls go through subclassable class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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 | « gpu/command_buffer/service/program_manager_unittest.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """code generator for GL/GLES extension wrangler.""" 6 """code generator for GL/GLES extension wrangler."""
7 7
8 import os 8 import os
9 import collections 9 import collections
10 import re 10 import re
(...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 1138
1139 // This file is automatically generated. 1139 // This file is automatically generated.
1140 1140
1141 #ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_ 1141 #ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
1142 #define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_ 1142 #define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
1143 1143
1144 namespace gfx { 1144 namespace gfx {
1145 1145
1146 class GLContext; 1146 class GLContext;
1147 1147
1148 void InitializeGLBindings%(name)s();
1149 void InitializeGLExtensionBindings%(name)s(GLContext* context);
1150 void InitializeDebugGLBindings%(name)s();
1151 void ClearGLBindings%(name)s();
1152 """ % {'name': set_name.upper()}) 1148 """ % {'name': set_name.upper()})
1153 1149
1154 # Write typedefs for function pointer types. Always use the GL name for the 1150 # Write typedefs for function pointer types. Always use the GL name for the
1155 # typedef. 1151 # typedef.
1156 file.write('\n') 1152 file.write('\n')
1157 for func in functions: 1153 for func in functions:
1158 file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' % 1154 file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' %
1159 (func['return_type'], func['names'][0], func['arguments'])) 1155 (func['return_type'], func['names'][0], func['arguments']))
1160 1156
1161 # Write declarations for booleans indicating which extensions are available. 1157 # Write declarations for booleans indicating which extensions are available.
1162 file.write('\n') 1158 file.write('\n')
1159 file.write("struct Extensions%s {\n" % set_name.upper())
1163 for extension, ext_functions in used_extension_functions: 1160 for extension, ext_functions in used_extension_functions:
1164 file.write('GL_EXPORT extern bool g_%s;\n' % extension) 1161 file.write(' bool b_%s;\n' % extension)
1162 file.write('};\n')
1163 file.write('\n')
1165 1164
1166 # Write declarations for function pointers. Always use the GL name for the 1165 # Write Procs struct.
1167 # declaration. 1166 file.write("struct Procs%s {\n" % set_name.upper())
1167 for func in functions:
1168 file.write(' %sProc %sFn;\n' % (func['names'][0], func['names'][0]))
1169 file.write('};\n')
1168 file.write('\n') 1170 file.write('\n')
1171
1172 # Write Driver struct.
1173 file.write(
1174 """struct GL_EXPORT Driver%(name)s {
1175 void InitializeBindings();
1176 void InitializeExtensionBindings(GLContext* context);
1177 void InitializeDebugBindings();
1178 void ClearBindings();
1179 void UpdateDebugExtensionBindings();
1180
1181 Procs%(name)s fn;
1182 Procs%(name)s debug_fn;
1183 Extensions%(name)s ext;
1184 """ % {'name': set_name.upper()})
1185 file.write('};\n')
1186 file.write('\n')
1187
1188 # Write Api class.
1189 file.write(
1190 """class GL_EXPORT %(name)sApi {
1191 public:
1192 %(name)sApi();
1193 virtual ~%(name)sApi();
1194
1195 """ % {'name': set_name.upper()})
1169 for func in functions: 1196 for func in functions:
1170 file.write('GL_EXPORT extern %sProc g_%s;\n' % 1197 file.write(' virtual %s %sFn(%s) = 0;\n' %
1171 (func['names'][0], func['names'][0])) 1198 (func['return_type'], func['names'][0], func['arguments']))
1199 file.write('};\n')
1172 file.write('\n') 1200 file.write('\n')
1201
1173 file.write( '} // namespace gfx\n') 1202 file.write( '} // namespace gfx\n')
1174 1203
1175 # Write macros to invoke function pointers. Always use the GL name for the 1204 # Write macros to invoke function pointers. Always use the GL name for the
1176 # macro. 1205 # macro.
1177 file.write('\n') 1206 file.write('\n')
1178 for func in functions: 1207 for func in functions:
1179 file.write('#define %s ::gfx::g_%s\n' % 1208 file.write('#define %s ::gfx::g_current_%s_context->%sFn\n' %
1180 (func['names'][0], func['names'][0])) 1209 (func['names'][0], set_name.lower(), func['names'][0]))
1181 1210
1182 file.write('\n') 1211 file.write('\n')
1183 file.write('#endif // UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' % 1212 file.write('#endif // UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
1184 set_name.upper()) 1213 set_name.upper())
1185 1214
1186 1215
1216 def GenerateAPIHeader(file, functions, set_name, used_extension_functions):
1217 """Generates gl_binding_api_autogen_x.h"""
1218
1219 # Write file header.
1220 file.write(
1221 """// Copyright (c) 2012 The Chromium Authors. All rights reserved.
1222 // Use of this source code is governed by a BSD-style license that can be
1223 // found in the LICENSE file.
1224
1225 // This file is automatically generated.
1226
1227 #ifndef UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%(name)s_H_
1228 #define UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%(name)s_H_
1229
1230 """ % {'name': set_name.upper()})
1231
1232 # Write API declaration.
1233 for func in functions:
1234 file.write(' virtual %s %sFn(%s) OVERRIDE;\n' %
1235 (func['return_type'], func['names'][0], func['arguments']))
1236
1237 file.write('\n')
1238 file.write('#endif // UI_GFX_GL_GL_BINDINGS_API_AUTOGEN_%s_H_\n' %
1239 set_name.upper())
1240
1241
1187 def GenerateSource(file, functions, set_name, used_extension_functions): 1242 def GenerateSource(file, functions, set_name, used_extension_functions):
1188 """Generates gl_binding_autogen_x.cc""" 1243 """Generates gl_binding_autogen_x.cc"""
1189 1244
1190 # Write file header. 1245 # Write file header.
1191 file.write( 1246 file.write(
1192 """// Copyright (c) 2011 The Chromium Authors. All rights reserved. 1247 """// Copyright (c) 2011 The Chromium Authors. All rights reserved.
1193 // Use of this source code is governed by a BSD-style license that can be 1248 // Use of this source code is governed by a BSD-style license that can be
1194 // found in the LICENSE file. 1249 // found in the LICENSE file.
1195 1250
1196 // This file is automatically generated. 1251 // This file is automatically generated.
1197 1252
1198 #include <string> 1253 #include <string>
1199 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 1254 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
1200 #include "ui/gl/gl_bindings.h" 1255 #include "ui/gl/gl_bindings.h"
1201 #include "ui/gl/gl_context.h" 1256 #include "ui/gl/gl_context.h"
1202 #include "ui/gl/gl_implementation.h" 1257 #include "ui/gl/gl_implementation.h"
1258 #include "ui/gl/gl_%s_api_implementation.h"
1203 1259
1204 using gpu::gles2::GLES2Util; 1260 using gpu::gles2::GLES2Util;
1205 1261
1206 namespace gfx { 1262 namespace gfx {
1207 """) 1263 """ % set_name.lower())
1208 # Write definitions for booleans indicating which extensions are available.
1209 for extension, ext_functions in used_extension_functions:
1210 file.write('bool g_%s;\n' % extension)
1211 1264
1212 # Write definitions of function pointers. 1265 # Write definitions of function pointers.
1213 file.write('\n') 1266 file.write('\n')
1214 file.write('static bool g_debugBindingsInitialized;\n') 1267 file.write('static bool g_debugBindingsInitialized;\n')
1215 file.write('static void UpdateDebugGLExtensionBindings();\n') 1268 file.write('Driver%s g_driver_%s;\n' % (set_name.upper(), set_name.lower()))
1216 file.write('\n') 1269 file.write('\n')
1217 for func in functions:
1218 file.write('%sProc g_%s;\n' % (func['names'][0], func['names'][0]))
1219
1220 file.write('\n')
1221 for func in functions:
1222 file.write('static %sProc g_debug_%s;\n' %
1223 (func['names'][0], func['names'][0]))
1224 1270
1225 # Write function to initialize the core function pointers. The code assumes 1271 # Write function to initialize the core function pointers. The code assumes
1226 # any non-NULL pointer returned by GetGLCoreProcAddress() is valid, although 1272 # any non-NULL pointer returned by GetGLCoreProcAddress() is valid, although
1227 # it may be overwritten by an extension function pointer later. 1273 # it may be overwritten by an extension function pointer later.
1228 file.write('\n') 1274 file.write('\n')
1229 file.write('void InitializeGLBindings%s() {\n' % set_name.upper()) 1275 file.write('void Driver%s::InitializeBindings() {\n' %
1276 set_name.upper())
1230 for func in functions: 1277 for func in functions:
1231 first_name = func['names'][0] 1278 first_name = func['names'][0]
1232 for i, name in enumerate(func['names']): 1279 for i, name in enumerate(func['names']):
1233 if i: 1280 if i:
1234 file.write(' if (!g_%s)\n ' % first_name) 1281 file.write(' if (!fn.%sFn)\n ' % first_name)
1235 file.write( 1282 file.write(
1236 ' g_%s = reinterpret_cast<%sProc>(GetGLCoreProcAddress("%s"));\n' % 1283 ' fn.%sFn = reinterpret_cast<%sProc>('
1237 (first_name, first_name, name)) 1284 'GetGLCoreProcAddress("%s"));\n' %
1285 (first_name, first_name, name))
1238 file.write('}\n') 1286 file.write('}\n')
1239 file.write('\n') 1287 file.write('\n')
1240 1288
1241 # Write function to initialize the extension function pointers. This function 1289 # Write function to initialize the extension function pointers. This function
1242 # uses a current context to query which extensions are actually supported. 1290 # uses a current context to query which extensions are actually supported.
1243 file.write('void InitializeGLExtensionBindings%s(GLContext* context) {\n' % 1291 file.write("""void Driver%s::InitializeExtensionBindings(
1244 set_name.upper()) 1292 GLContext* context) {
1293 """ % set_name.upper())
1245 file.write(' DCHECK(context && context->IsCurrent(NULL));\n') 1294 file.write(' DCHECK(context && context->IsCurrent(NULL));\n')
1246 for extension, ext_functions in used_extension_functions: 1295 for extension, ext_functions in used_extension_functions:
1247 file.write(' g_%s = context->HasExtension("%s");\n' % 1296 file.write(' ext.b_%s = context->HasExtension("%s");\n' %
1248 (extension, extension)) 1297 (extension, extension))
1249 file.write(' if (g_%s) {\n' % 1298 file.write(' if (ext.b_%s) {\n' %
1250 (extension)) 1299 (extension))
1251 queried_entry_points = set() 1300 queried_entry_points = set()
1252 for entry_point_name, function_name in ext_functions: 1301 for entry_point_name, function_name in ext_functions:
1253 # Replace the pointer unconditionally unless this extension has several 1302 # Replace the pointer unconditionally unless this extension has several
1254 # alternatives for the same entry point (e.g., 1303 # alternatives for the same entry point (e.g.,
1255 # GL_ARB_blend_func_extended). 1304 # GL_ARB_blend_func_extended).
1256 if entry_point_name in queried_entry_points: 1305 if entry_point_name in queried_entry_points:
1257 file.write(' if (!g_%s)\n ' % entry_point_name) 1306 file.write(' if (!fn.%sFn)\n ' % entry_point_name)
1258 file.write( 1307 file.write(
1259 ' g_%s = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' % 1308 ' fn.%sFn = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' %
1260 (entry_point_name, entry_point_name, function_name)) 1309 (entry_point_name, entry_point_name, function_name))
1261 queried_entry_points.add(entry_point_name) 1310 queried_entry_points.add(entry_point_name)
1262 file.write(' }\n') 1311 file.write(' }\n')
1263 file.write(' if (g_debugBindingsInitialized)\n') 1312 file.write(' if (g_debugBindingsInitialized)\n')
1264 file.write(' UpdateDebugGLExtensionBindings();\n') 1313 file.write(' UpdateDebugExtensionBindings();\n')
1265 file.write('}\n') 1314 file.write('}\n')
1266 file.write('\n') 1315 file.write('\n')
1267 1316
1268 # Write logging wrappers for each function. 1317 # Write logging wrappers for each function.
1269 file.write('extern "C" {\n') 1318 file.write('extern "C" {\n')
1270 for func in functions: 1319 for func in functions:
1271 names = func['names'] 1320 names = func['names']
1272 return_type = func['return_type'] 1321 return_type = func['return_type']
1273 arguments = func['arguments'] 1322 arguments = func['arguments']
1274 file.write('\n') 1323 file.write('\n')
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 log_argument_names = log_argument_names.replace(',', ' << ", " <<') 1356 log_argument_names = log_argument_names.replace(',', ' << ", " <<')
1308 if argument_names == 'void' or argument_names == '': 1357 if argument_names == 'void' or argument_names == '':
1309 argument_names = '' 1358 argument_names = ''
1310 log_argument_names = '' 1359 log_argument_names = ''
1311 else: 1360 else:
1312 log_argument_names = " << " + log_argument_names 1361 log_argument_names = " << " + log_argument_names
1313 function_name = names[0] 1362 function_name = names[0]
1314 if return_type == 'void': 1363 if return_type == 'void':
1315 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % 1364 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
1316 (function_name, log_argument_names)) 1365 (function_name, log_argument_names))
1317 file.write(' g_debug_%s(%s);\n' % 1366 file.write(' g_driver_%s.debug_fn.%sFn(%s);\n' %
1318 (function_name, argument_names)) 1367 (set_name.lower(), function_name, argument_names))
1319 if 'logging_code' in func: 1368 if 'logging_code' in func:
1320 file.write("%s\n" % func['logging_code']) 1369 file.write("%s\n" % func['logging_code'])
1321 else: 1370 else:
1322 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' % 1371 file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
1323 (function_name, log_argument_names)) 1372 (function_name, log_argument_names))
1324 file.write(' %s result = g_debug_%s(%s);\n' % 1373 file.write(' %s result = g_driver_%s.debug_fn.%sFn(%s);\n' %
1325 (return_type, function_name, argument_names)) 1374 (return_type, set_name.lower(), function_name, argument_names))
1326 if 'logging_code' in func: 1375 if 'logging_code' in func:
1327 file.write("%s\n" % func['logging_code']) 1376 file.write("%s\n" % func['logging_code'])
1328 else: 1377 else:
1329 file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n'); 1378 file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n');
1330 file.write(' return result;\n') 1379 file.write(' return result;\n')
1331 file.write('}\n') 1380 file.write('}\n')
1332 file.write('} // extern "C"\n') 1381 file.write('} // extern "C"\n')
1333 1382
1334 # Write function to initialize the debug function pointers. 1383 # Write function to initialize the debug function pointers.
1335 file.write('\n') 1384 file.write('\n')
1336 file.write('void InitializeDebugGLBindings%s() {\n' % set_name.upper()) 1385 file.write('void Driver%s::InitializeDebugBindings() {\n' %
1386 set_name.upper())
1337 for func in functions: 1387 for func in functions:
1338 first_name = func['names'][0] 1388 first_name = func['names'][0]
1339 file.write(' if (!g_debug_%s) {\n' % first_name) 1389 file.write(' if (!debug_fn.%sFn) {\n' % first_name)
1340 file.write(' g_debug_%s = g_%s;\n' % (first_name, first_name)) 1390 file.write(' debug_fn.%sFn = fn.%sFn;\n' % (first_name, first_name))
1341 file.write(' g_%s = Debug_%s;\n' % (first_name, first_name)) 1391 file.write(' fn.%sFn = Debug_%s;\n' % (first_name, first_name))
1342 file.write(' }\n') 1392 file.write(' }\n')
1343 file.write(' g_debugBindingsInitialized = true;\n') 1393 file.write(' g_debugBindingsInitialized = true;\n')
1344 file.write('}\n') 1394 file.write('}\n')
1345 1395
1346 # Write function to update the debug function pointers to extension functions 1396 # Write function to update the debug function pointers to extension functions
1347 # after the extensions have been initialized. 1397 # after the extensions have been initialized.
1348 file.write('\n') 1398 file.write('\n')
1349 file.write('static void UpdateDebugGLExtensionBindings() {\n') 1399 file.write('void Driver%s::UpdateDebugExtensionBindings() {\n' %
1400 set_name.upper())
1350 for extension, ext_functions in used_extension_functions: 1401 for extension, ext_functions in used_extension_functions:
1351 for name, _ in ext_functions: 1402 for name, _ in ext_functions:
1352 file.write(' if (g_debug_%s != g_%s &&\n' % (name, name)) 1403 file.write(' if (debug_fn.%sFn != fn.%sFn &&\n' % (name, name))
1353 file.write(' g_%s != Debug_%s) {\n' % (name, name)) 1404 file.write(' fn.%sFn != Debug_%s) {\n' % (name, name))
1354 file.write(' g_debug_%s = g_%s;\n' % (name, name)) 1405 file.write(' debug_fn.%sFn = fn.%sFn;\n' % (name, name))
1355 file.write(' g_%s = Debug_%s;\n' % (name, name)) 1406 file.write(' fn.%sFn = Debug_%s;\n' % (name, name))
1356 file.write(' }\n') 1407 file.write(' }\n')
1357 file.write('}\n') 1408 file.write('}\n')
1358 1409
1359 # Write function to clear all function pointers. 1410 # Write function to clear all function pointers.
1360 file.write('\n') 1411 file.write('\n')
1361 file.write('void ClearGLBindings%s() {\n' % set_name.upper()) 1412 file.write("""void Driver%s::ClearBindings() {
1362 # Clear the availability of GL extensions. 1413 memset(this, 0, sizeof(*this));
1363 for extension, ext_functions in used_extension_functions: 1414 }
1364 file.write(' g_%s = false;\n' % extension) 1415 """ % set_name.upper())
1365 # Clear GL bindings. 1416
1366 file.write('\n') 1417 # Write RealGLApi functions
1367 for func in functions: 1418 for func in functions:
1368 file.write(' g_%s = NULL;\n' % func['names'][0]) 1419 names = func['names']
1369 # Clear debug GL bindings. 1420 return_type = func['return_type']
1370 file.write('\n') 1421 arguments = func['arguments']
1371 for func in functions: 1422 file.write('\n')
1372 file.write(' g_debug_%s = NULL;\n' % func['names'][0]) 1423 file.write('%s Real%sApi::%sFn(%s) {\n' %
1373 file.write(' g_debugBindingsInitialized = false;\n') 1424 (return_type, set_name.upper(), names[0], arguments))
1374 file.write('}\n') 1425 argument_names = re.sub(
1426 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
1427 argument_names = re.sub(
1428 r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
1429 if argument_names == 'void' or argument_names == '':
1430 argument_names = ''
1431 function_name = names[0]
1432 if return_type == 'void':
1433 file.write(' driver_->fn.%sFn(%s);\n' %
1434 (function_name, argument_names))
1435 else:
1436 file.write(' return driver_->fn.%sFn(%s);\n' %
1437 (function_name, argument_names))
1438 file.write('}\n')
1375 1439
1376 file.write('\n') 1440 file.write('\n')
1377 file.write('} // namespace gfx\n') 1441 file.write('} // namespace gfx\n')
1378 1442
1379 1443
1380 def GenerateMockSource(file, functions): 1444 def GenerateMockSource(file, functions):
1381 """Generates functions that invoke a mock GLInterface""" 1445 """Generates functions that invoke a mock GLInterface"""
1382 1446
1383 file.write( 1447 file.write(
1384 """// Copyright (c) 2011 The Chromium Authors. All rights reserved. 1448 """// Copyright (c) 2011 The Chromium Authors. All rights reserved.
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 1629
1566 for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS: 1630 for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS:
1567 used_extension_functions = GetUsedExtensionFunctions( 1631 used_extension_functions = GetUsedExtensionFunctions(
1568 functions, extension_headers, extensions) 1632 functions, extension_headers, extensions)
1569 1633
1570 header_file = open( 1634 header_file = open(
1571 os.path.join(dir, 'gl_bindings_autogen_%s.h' % set_name), 'wb') 1635 os.path.join(dir, 'gl_bindings_autogen_%s.h' % set_name), 'wb')
1572 GenerateHeader(header_file, functions, set_name, used_extension_functions) 1636 GenerateHeader(header_file, functions, set_name, used_extension_functions)
1573 header_file.close() 1637 header_file.close()
1574 1638
1639 header_file = open(
1640 os.path.join(dir, 'gl_bindings_api_autogen_%s.h' % set_name), 'wb')
1641 GenerateAPIHeader(
1642 header_file, functions, set_name, used_extension_functions)
1643 header_file.close()
1644
1575 source_file = open( 1645 source_file = open(
1576 os.path.join(dir, 'gl_bindings_autogen_%s.cc' % set_name), 'wb') 1646 os.path.join(dir, 'gl_bindings_autogen_%s.cc' % set_name), 'wb')
1577 GenerateSource(source_file, functions, set_name, used_extension_functions) 1647 GenerateSource(source_file, functions, set_name, used_extension_functions)
1578 source_file.close() 1648 source_file.close()
1579 1649
1580 source_file = open(os.path.join(dir, 'gl_bindings_autogen_mock.cc'), 'wb') 1650 source_file = open(os.path.join(dir, 'gl_bindings_autogen_mock.cc'), 'wb')
1581 GenerateMockSource(source_file, GL_FUNCTIONS) 1651 GenerateMockSource(source_file, GL_FUNCTIONS)
1582 source_file.close() 1652 source_file.close()
1583 return 0 1653 return 0
1584 1654
1585 1655
1586 if __name__ == '__main__': 1656 if __name__ == '__main__':
1587 sys.exit(main(sys.argv[1:])) 1657 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager_unittest.cc ('k') | ui/gl/gl.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698