OLD | NEW |
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 GLES2 command buffers.""" | 6 """code generator for GLES2 command buffers.""" |
7 | 7 |
8 import itertools | 8 import itertools |
9 import os | 9 import os |
10 import os.path | 10 import os.path |
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 ], | 1361 ], |
1362 }, | 1362 }, |
1363 'ResetStatus': { | 1363 'ResetStatus': { |
1364 'type': 'GLenum', | 1364 'type': 'GLenum', |
1365 'valid': [ | 1365 'valid': [ |
1366 'GL_GUILTY_CONTEXT_RESET_ARB', | 1366 'GL_GUILTY_CONTEXT_RESET_ARB', |
1367 'GL_INNOCENT_CONTEXT_RESET_ARB', | 1367 'GL_INNOCENT_CONTEXT_RESET_ARB', |
1368 'GL_UNKNOWN_CONTEXT_RESET_ARB', | 1368 'GL_UNKNOWN_CONTEXT_RESET_ARB', |
1369 ], | 1369 ], |
1370 }, | 1370 }, |
| 1371 'SyncCondition': { |
| 1372 'type': 'GLenum', |
| 1373 'is_complete': True, |
| 1374 'valid': [ |
| 1375 #TODO(zmo): avoid using the direct number. |
| 1376 '0x9117', # GL_SYNC_GPU_COMMANDS_COMPLETE |
| 1377 ], |
| 1378 'invalid': [ |
| 1379 '0', |
| 1380 ], |
| 1381 }, |
| 1382 'SyncFlags': { |
| 1383 'type': 'GLbitfield', |
| 1384 'is_complete': True, |
| 1385 'valid': [ |
| 1386 '0', |
| 1387 ], |
| 1388 'invalid': [ |
| 1389 '1', |
| 1390 ], |
| 1391 }, |
1371 } | 1392 } |
1372 | 1393 |
1373 # This table specifies the different pepper interfaces that are supported for | 1394 # This table specifies the different pepper interfaces that are supported for |
1374 # GL commands. 'dev' is true if it's a dev interface. | 1395 # GL commands. 'dev' is true if it's a dev interface. |
1375 _PEPPER_INTERFACES = [ | 1396 _PEPPER_INTERFACES = [ |
1376 {'name': '', 'dev': False}, | 1397 {'name': '', 'dev': False}, |
1377 {'name': 'InstancedArrays', 'dev': False}, | 1398 {'name': 'InstancedArrays', 'dev': False}, |
1378 {'name': 'FramebufferBlit', 'dev': False}, | 1399 {'name': 'FramebufferBlit', 'dev': False}, |
1379 {'name': 'FramebufferMultisample', 'dev': False}, | 1400 {'name': 'FramebufferMultisample', 'dev': False}, |
1380 {'name': 'ChromiumEnableFeature', 'dev': False}, | 1401 {'name': 'ChromiumEnableFeature', 'dev': False}, |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1808 'gl_test_func': 'glDeleteBuffersARB', | 1829 'gl_test_func': 'glDeleteBuffersARB', |
1809 'resource_type': 'Buffer', | 1830 'resource_type': 'Buffer', |
1810 'resource_types': 'Buffers', | 1831 'resource_types': 'Buffers', |
1811 }, | 1832 }, |
1812 'DeleteFramebuffers': { | 1833 'DeleteFramebuffers': { |
1813 'type': 'DELn', | 1834 'type': 'DELn', |
1814 'gl_test_func': 'glDeleteFramebuffersEXT', | 1835 'gl_test_func': 'glDeleteFramebuffersEXT', |
1815 'resource_type': 'Framebuffer', | 1836 'resource_type': 'Framebuffer', |
1816 'resource_types': 'Framebuffers', | 1837 'resource_types': 'Framebuffers', |
1817 }, | 1838 }, |
1818 'DeleteProgram': {'type': 'Delete', 'decoder_func': 'DoDeleteProgram'}, | 1839 'DeleteProgram': { 'type': 'Delete' }, |
1819 'DeleteRenderbuffers': { | 1840 'DeleteRenderbuffers': { |
1820 'type': 'DELn', | 1841 'type': 'DELn', |
1821 'gl_test_func': 'glDeleteRenderbuffersEXT', | 1842 'gl_test_func': 'glDeleteRenderbuffersEXT', |
1822 'resource_type': 'Renderbuffer', | 1843 'resource_type': 'Renderbuffer', |
1823 'resource_types': 'Renderbuffers', | 1844 'resource_types': 'Renderbuffers', |
1824 }, | 1845 }, |
1825 'DeleteSamplers': { | 1846 'DeleteSamplers': { |
1826 'type': 'DELn', | 1847 'type': 'DELn', |
1827 'resource_type': 'Sampler', | 1848 'resource_type': 'Sampler', |
1828 'resource_types': 'Samplers', | 1849 'resource_types': 'Samplers', |
1829 'unsafe': True, | 1850 'unsafe': True, |
1830 }, | 1851 }, |
1831 'DeleteShader': {'type': 'Delete', 'decoder_func': 'DoDeleteShader'}, | 1852 'DeleteShader': { 'type': 'Delete' }, |
| 1853 'DeleteSync': { |
| 1854 'type': 'Delete', |
| 1855 'cmd_args': 'GLuint sync', |
| 1856 'resource_type': 'Sync', |
| 1857 'unsafe': True, |
| 1858 }, |
1832 'DeleteTextures': { | 1859 'DeleteTextures': { |
1833 'type': 'DELn', | 1860 'type': 'DELn', |
1834 'resource_type': 'Texture', | 1861 'resource_type': 'Texture', |
1835 'resource_types': 'Textures', | 1862 'resource_types': 'Textures', |
1836 }, | 1863 }, |
1837 'DeleteTransformFeedbacks': { | 1864 'DeleteTransformFeedbacks': { |
1838 'type': 'DELn', | 1865 'type': 'DELn', |
1839 'resource_type': 'TransformFeedback', | 1866 'resource_type': 'TransformFeedback', |
1840 'resource_types': 'TransformFeedbacks', | 1867 'resource_types': 'TransformFeedbacks', |
1841 'unsafe': True, | 1868 'unsafe': True, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1876 }, | 1903 }, |
1877 'Enable': { | 1904 'Enable': { |
1878 'decoder_func': 'DoEnable', | 1905 'decoder_func': 'DoEnable', |
1879 'impl_func': False, | 1906 'impl_func': False, |
1880 'client_test': False, | 1907 'client_test': False, |
1881 }, | 1908 }, |
1882 'EnableVertexAttribArray': { | 1909 'EnableVertexAttribArray': { |
1883 'decoder_func': 'DoEnableVertexAttribArray', | 1910 'decoder_func': 'DoEnableVertexAttribArray', |
1884 'impl_decl': False, | 1911 'impl_decl': False, |
1885 }, | 1912 }, |
| 1913 'FenceSync': { |
| 1914 'type': 'Create', |
| 1915 'client_test': False, |
| 1916 'unsafe': True, |
| 1917 }, |
1886 'Finish': { | 1918 'Finish': { |
1887 'impl_func': False, | 1919 'impl_func': False, |
1888 'client_test': False, | 1920 'client_test': False, |
1889 'decoder_func': 'DoFinish', | 1921 'decoder_func': 'DoFinish', |
1890 'defer_reads': True, | 1922 'defer_reads': True, |
1891 }, | 1923 }, |
1892 'Flush': { | 1924 'Flush': { |
1893 'impl_func': False, | 1925 'impl_func': False, |
1894 'decoder_func': 'DoFlush', | 1926 'decoder_func': 'DoFlush', |
1895 }, | 1927 }, |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2202 'unsafe': True, | 2234 'unsafe': True, |
2203 }, | 2235 }, |
2204 'IsBuffer': { | 2236 'IsBuffer': { |
2205 'type': 'Is', | 2237 'type': 'Is', |
2206 'decoder_func': 'DoIsBuffer', | 2238 'decoder_func': 'DoIsBuffer', |
2207 'expectation': False, | 2239 'expectation': False, |
2208 }, | 2240 }, |
2209 'IsEnabled': { | 2241 'IsEnabled': { |
2210 'type': 'Is', | 2242 'type': 'Is', |
2211 'decoder_func': 'DoIsEnabled', | 2243 'decoder_func': 'DoIsEnabled', |
| 2244 'client_test': False, |
2212 'impl_func': False, | 2245 'impl_func': False, |
2213 'expectation': False, | 2246 'expectation': False, |
2214 }, | 2247 }, |
2215 'IsFramebuffer': { | 2248 'IsFramebuffer': { |
2216 'type': 'Is', | 2249 'type': 'Is', |
2217 'decoder_func': 'DoIsFramebuffer', | 2250 'decoder_func': 'DoIsFramebuffer', |
2218 'expectation': False, | 2251 'expectation': False, |
2219 }, | 2252 }, |
2220 'IsProgram': { | 2253 'IsProgram': { |
2221 'type': 'Is', | 2254 'type': 'Is', |
2222 'decoder_func': 'DoIsProgram', | 2255 'decoder_func': 'DoIsProgram', |
2223 'expectation': False, | 2256 'expectation': False, |
2224 }, | 2257 }, |
2225 'IsRenderbuffer': { | 2258 'IsRenderbuffer': { |
2226 'type': 'Is', | 2259 'type': 'Is', |
2227 'decoder_func': 'DoIsRenderbuffer', | 2260 'decoder_func': 'DoIsRenderbuffer', |
2228 'expectation': False, | 2261 'expectation': False, |
2229 }, | 2262 }, |
2230 'IsShader': { | 2263 'IsShader': { |
2231 'type': 'Is', | 2264 'type': 'Is', |
2232 'decoder_func': 'DoIsShader', | 2265 'decoder_func': 'DoIsShader', |
2233 'expectation': False, | 2266 'expectation': False, |
2234 }, | 2267 }, |
2235 'IsSampler': { | 2268 'IsSampler': { |
2236 'type': 'Is', | 2269 'type': 'Is', |
2237 'id_mapping': [ 'Sampler' ], | 2270 'id_mapping': [ 'Sampler' ], |
2238 'expectation': False, | 2271 'expectation': False, |
2239 'unsafe': True, | 2272 'unsafe': True, |
2240 }, | 2273 }, |
| 2274 'IsSync': { |
| 2275 'type': 'Is', |
| 2276 'id_mapping': [ 'Sync' ], |
| 2277 'cmd_args': 'GLuint sync', |
| 2278 'expectation': False, |
| 2279 'unsafe': True, |
| 2280 }, |
2241 'IsTexture': { | 2281 'IsTexture': { |
2242 'type': 'Is', | 2282 'type': 'Is', |
2243 'decoder_func': 'DoIsTexture', | 2283 'decoder_func': 'DoIsTexture', |
2244 'expectation': False, | 2284 'expectation': False, |
2245 }, | 2285 }, |
2246 'IsTransformFeedback': { | 2286 'IsTransformFeedback': { |
2247 'type': 'Is', | 2287 'type': 'Is', |
2248 'id_mapping': [ 'TransformFeedback' ], | 2288 'id_mapping': [ 'TransformFeedback' ], |
2249 'expectation': False, | 2289 'expectation': False, |
2250 'unsafe': True, | 2290 'unsafe': True, |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2391 'gl_test_func': 'glSamplerParameteri', | 2431 'gl_test_func': 'glSamplerParameteri', |
2392 'decoder_func': 'DoSamplerParameteriv', | 2432 'decoder_func': 'DoSamplerParameteriv', |
2393 'first_element_only': True, | 2433 'first_element_only': True, |
2394 'unsafe': True, | 2434 'unsafe': True, |
2395 }, | 2435 }, |
2396 'ShaderBinary': { | 2436 'ShaderBinary': { |
2397 'type': 'Custom', | 2437 'type': 'Custom', |
2398 'client_test': False, | 2438 'client_test': False, |
2399 }, | 2439 }, |
2400 'ShaderSource': { | 2440 'ShaderSource': { |
2401 'type': 'Manual', | 2441 'type': 'PUTSTR', |
| 2442 'decoder_func': 'DoShaderSource', |
2402 'data_transfer_methods': ['bucket'], | 2443 'data_transfer_methods': ['bucket'], |
2403 'needs_size': True, | |
2404 'client_test': False, | 2444 'client_test': False, |
2405 'cmd_args': | 2445 'cmd_args': |
2406 'GLuint shader, const char* data', | 2446 'GLuint shader, const char** str', |
2407 'pepper_args': | 2447 'pepper_args': |
2408 'GLuint shader, GLsizei count, const char** str, const GLint* length', | 2448 'GLuint shader, GLsizei count, const char** str, const GLint* length', |
2409 }, | 2449 }, |
2410 'StencilMask': { | 2450 'StencilMask': { |
2411 'type': 'StateSetFrontBack', | 2451 'type': 'StateSetFrontBack', |
2412 'state': 'StencilMask', | 2452 'state': 'StencilMask', |
2413 'no_gl': True, | 2453 'no_gl': True, |
2414 'expectation': False, | 2454 'expectation': False, |
2415 }, | 2455 }, |
2416 'StencilMaskSeparate': { | 2456 'StencilMaskSeparate': { |
(...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3376 | 3416 |
3377 def WriteGetDataSizeCode(self, func, file): | 3417 def WriteGetDataSizeCode(self, func, file): |
3378 """Writes the code to set data_size used in validation""" | 3418 """Writes the code to set data_size used in validation""" |
3379 pass | 3419 pass |
3380 | 3420 |
3381 def WriteImmediateCmdSizeTest(self, func, file): | 3421 def WriteImmediateCmdSizeTest(self, func, file): |
3382 """Writes a size test for an immediate version of a command.""" | 3422 """Writes a size test for an immediate version of a command.""" |
3383 file.Write(" // TODO(gman): Compute correct size.\n") | 3423 file.Write(" // TODO(gman): Compute correct size.\n") |
3384 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n") | 3424 file.Write(" EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n") |
3385 | 3425 |
| 3426 def __WriteIdMapping(self, func, file): |
| 3427 """Writes client side / service side ID mapping.""" |
| 3428 if not func.IsUnsafe() or not func.GetInfo('id_mapping'): |
| 3429 return |
| 3430 for id_type in func.GetInfo('id_mapping'): |
| 3431 file.Write(" group_->Get%sServiceId(%s, &%s);\n" % |
| 3432 (id_type, id_type.lower(), id_type.lower())) |
| 3433 |
3386 def WriteImmediateHandlerImplementation (self, func, file): | 3434 def WriteImmediateHandlerImplementation (self, func, file): |
3387 """Writes the handler impl for the immediate version of a command.""" | 3435 """Writes the handler impl for the immediate version of a command.""" |
3388 if func.IsUnsafe() and func.GetInfo('id_mapping'): | 3436 self.__WriteIdMapping(func, file) |
3389 for id_type in func.GetInfo('id_mapping'): | |
3390 file.Write(" group_->Get%sServiceId(%s, &%s);\n" % | |
3391 (id_type, id_type.lower(), id_type.lower())) | |
3392 file.Write(" %s(%s);\n" % | 3437 file.Write(" %s(%s);\n" % |
3393 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) | 3438 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
3394 | 3439 |
3395 def WriteBucketHandlerImplementation (self, func, file): | 3440 def WriteBucketHandlerImplementation (self, func, file): |
3396 """Writes the handler impl for the bucket version of a command.""" | 3441 """Writes the handler impl for the bucket version of a command.""" |
| 3442 self.__WriteIdMapping(func, file) |
3397 file.Write(" %s(%s);\n" % | 3443 file.Write(" %s(%s);\n" % |
3398 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) | 3444 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
3399 | 3445 |
3400 def WriteServiceHandlerFunctionHeader(self, func, file): | 3446 def WriteServiceHandlerFunctionHeader(self, func, file): |
3401 """Writes function header for service implementation handlers.""" | 3447 """Writes function header for service implementation handlers.""" |
3402 file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s( | 3448 file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s( |
3403 uint32_t immediate_data_size, const void* cmd_data) { | 3449 uint32_t immediate_data_size, const void* cmd_data) { |
3404 """ % {'name': func.name}) | 3450 """ % {'name': func.name}) |
3405 if func.IsUnsafe(): | 3451 if func.IsUnsafe(): |
3406 file.Write("""if (!unsafe_es3_apis_enabled()) | 3452 file.Write("""if (!unsafe_es3_apis_enabled()) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3442 func.WriteHandlerImplementation(file) | 3488 func.WriteHandlerImplementation(file) |
3443 file.Write(" return error::kNoError;\n") | 3489 file.Write(" return error::kNoError;\n") |
3444 file.Write("}\n") | 3490 file.Write("}\n") |
3445 file.Write("\n") | 3491 file.Write("\n") |
3446 | 3492 |
3447 def WriteBucketServiceImplementation(self, func, file): | 3493 def WriteBucketServiceImplementation(self, func, file): |
3448 """Writes the service implementation for a bucket version of command.""" | 3494 """Writes the service implementation for a bucket version of command.""" |
3449 self.WriteServiceHandlerFunctionHeader(func, file) | 3495 self.WriteServiceHandlerFunctionHeader(func, file) |
3450 self.WriteHandlerExtensionCheck(func, file) | 3496 self.WriteHandlerExtensionCheck(func, file) |
3451 self.WriteHandlerDeferReadWrite(func, file); | 3497 self.WriteHandlerDeferReadWrite(func, file); |
3452 for arg in func.GetOriginalArgs(): | 3498 for arg in func.GetCmdArgs(): |
3453 if arg.IsPointer(): | |
3454 self.WriteGetDataSizeCode(func, file) | |
3455 arg.WriteGetCode(file) | 3499 arg.WriteGetCode(file) |
3456 func.WriteHandlerValidation(file) | 3500 func.WriteHandlerValidation(file) |
3457 func.WriteHandlerImplementation(file) | 3501 func.WriteHandlerImplementation(file) |
3458 file.Write(" return error::kNoError;\n") | 3502 file.Write(" return error::kNoError;\n") |
3459 file.Write("}\n") | 3503 file.Write("}\n") |
3460 file.Write("\n") | 3504 file.Write("\n") |
3461 | 3505 |
3462 def WriteHandlerExtensionCheck(self, func, file): | 3506 def WriteHandlerExtensionCheck(self, func, file): |
3463 if func.GetInfo('extension_flag'): | 3507 if func.GetInfo('extension_flag'): |
3464 file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) | 3508 file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) |
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4245 pass | 4289 pass |
4246 | 4290 |
4247 def WriteBucketServiceImplementation(self, func, file): | 4291 def WriteBucketServiceImplementation(self, func, file): |
4248 """Overrriden from TypeHandler.""" | 4292 """Overrriden from TypeHandler.""" |
4249 pass | 4293 pass |
4250 | 4294 |
4251 def WriteImmediateCmdHelper(self, func, file): | 4295 def WriteImmediateCmdHelper(self, func, file): |
4252 """Overrriden from TypeHandler.""" | 4296 """Overrriden from TypeHandler.""" |
4253 pass | 4297 pass |
4254 | 4298 |
4255 def WriteBucketCmdHelper(self, func, file): | |
4256 """Overrriden from TypeHandler.""" | |
4257 pass | |
4258 | |
4259 def WriteCmdHelper(self, func, file): | 4299 def WriteCmdHelper(self, func, file): |
4260 """Overrriden from TypeHandler.""" | 4300 """Overrriden from TypeHandler.""" |
4261 pass | 4301 pass |
4262 | 4302 |
4263 def WriteFormatTest(self, func, file): | 4303 def WriteFormatTest(self, func, file): |
4264 """Overrriden from TypeHandler.""" | 4304 """Overrriden from TypeHandler.""" |
4265 file.Write("// TODO(gman): Write test for %s\n" % func.name) | 4305 file.Write("// TODO(gman): Write test for %s\n" % func.name) |
4266 | 4306 |
4267 def WriteImmediateFormatTest(self, func, file): | 4307 def WriteImmediateFormatTest(self, func, file): |
4268 """Overrriden from TypeHandler.""" | 4308 """Overrriden from TypeHandler.""" |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4935 class CreateHandler(TypeHandler): | 4975 class CreateHandler(TypeHandler): |
4936 """Handler for glCreate___ type functions.""" | 4976 """Handler for glCreate___ type functions.""" |
4937 | 4977 |
4938 def __init__(self): | 4978 def __init__(self): |
4939 TypeHandler.__init__(self) | 4979 TypeHandler.__init__(self) |
4940 | 4980 |
4941 def InitFunction(self, func): | 4981 def InitFunction(self, func): |
4942 """Overrriden from TypeHandler.""" | 4982 """Overrriden from TypeHandler.""" |
4943 func.AddCmdArg(Argument("client_id", 'uint32_t')) | 4983 func.AddCmdArg(Argument("client_id", 'uint32_t')) |
4944 | 4984 |
| 4985 def __GetResourceType(self, func): |
| 4986 if func.return_type == "GLsync": |
| 4987 return "Sync" |
| 4988 else: |
| 4989 return func.name[6:] # Create* |
| 4990 |
4945 def WriteServiceUnitTest(self, func, file, *extras): | 4991 def WriteServiceUnitTest(self, func, file, *extras): |
4946 """Overrriden from TypeHandler.""" | 4992 """Overrriden from TypeHandler.""" |
4947 valid_test = """ | 4993 valid_test = """ |
4948 TEST_P(%(test_name)s, %(name)sValidArgs) { | 4994 TEST_P(%(test_name)s, %(name)sValidArgs) { |
4949 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)) | 4995 %(id_type_cast)sEXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)) |
4950 .WillOnce(Return(kNewServiceId)); | 4996 .WillOnce(Return(%(const_service_id)s)); |
4951 SpecializedSetup<cmds::%(name)s, 0>(true); | 4997 SpecializedSetup<cmds::%(name)s, 0>(true); |
4952 cmds::%(name)s cmd; | 4998 cmds::%(name)s cmd; |
4953 cmd.Init(%(args)s%(comma)skNewClientId); | 4999 cmd.Init(%(args)s%(comma)skNewClientId);""" |
| 5000 if func.IsUnsafe(): |
| 5001 valid_test += """ |
| 5002 decoder_->set_unsafe_es3_apis_enabled(true);""" |
| 5003 valid_test += """ |
4954 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 5004 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
4955 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 5005 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" |
4956 EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL); | 5006 if func.IsUnsafe(): |
| 5007 valid_test += """ |
| 5008 %(return_type)s service_id = 0; |
| 5009 EXPECT_TRUE(Get%(resource_type)sServiceId(kNewClientId, &service_id)); |
| 5010 EXPECT_EQ(%(const_service_id)s, service_id); |
| 5011 decoder_->set_unsafe_es3_apis_enabled(false); |
| 5012 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 5013 } |
| 5014 """ |
| 5015 else: |
| 5016 valid_test += """ |
| 5017 EXPECT_TRUE(Get%(resource_type)s(kNewClientId)); |
4957 } | 5018 } |
4958 """ | 5019 """ |
4959 comma = "" | 5020 comma = "" |
4960 if len(func.GetOriginalArgs()): | 5021 cmd_arg_count = 0 |
4961 comma =", " | 5022 for arg in func.GetOriginalArgs(): |
| 5023 if not arg.IsConstant(): |
| 5024 cmd_arg_count += 1 |
| 5025 if cmd_arg_count: |
| 5026 comma = ", " |
| 5027 if func.return_type == 'GLsync': |
| 5028 id_type_cast = ("const GLsync kNewServiceIdGLuint = reinterpret_cast" |
| 5029 "<GLsync>(kNewServiceId);\n ") |
| 5030 const_service_id = "kNewServiceIdGLuint" |
| 5031 else: |
| 5032 id_type_cast = "" |
| 5033 const_service_id = "kNewServiceId" |
4962 self.WriteValidUnitTest(func, file, valid_test, { | 5034 self.WriteValidUnitTest(func, file, valid_test, { |
4963 'comma': comma, | 5035 'comma': comma, |
4964 'resource_type': func.name[6:], | 5036 'resource_type': self.__GetResourceType(func), |
| 5037 'return_type': func.return_type, |
| 5038 'id_type_cast': id_type_cast, |
| 5039 'const_service_id': const_service_id, |
4965 }, *extras) | 5040 }, *extras) |
4966 invalid_test = """ | 5041 invalid_test = """ |
4967 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { | 5042 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
4968 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); | 5043 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); |
4969 SpecializedSetup<cmds::%(name)s, 0>(false); | 5044 SpecializedSetup<cmds::%(name)s, 0>(false); |
4970 cmds::%(name)s cmd; | 5045 cmds::%(name)s cmd; |
4971 cmd.Init(%(args)s%(comma)skNewClientId); | 5046 cmd.Init(%(args)s%(comma)skNewClientId); |
4972 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));%(gl_error_test)s | 5047 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));%(gl_error_test)s |
4973 } | 5048 } |
4974 """ | 5049 """ |
4975 self.WriteInvalidUnitTest(func, file, invalid_test, { | 5050 self.WriteInvalidUnitTest(func, file, invalid_test, { |
4976 'comma': comma, | 5051 'comma': comma, |
4977 }, *extras) | 5052 }, *extras) |
4978 | 5053 |
4979 def WriteHandlerImplementation (self, func, file): | 5054 def WriteHandlerImplementation (self, func, file): |
4980 """Overrriden from TypeHandler.""" | 5055 """Overrriden from TypeHandler.""" |
4981 file.Write(" uint32_t client_id = c.client_id;\n") | 5056 if func.IsUnsafe(): |
4982 file.Write(" if (!%sHelper(%s)) {\n" % | 5057 code = """ uint32_t client_id = c.client_id; |
4983 (func.name, func.MakeCmdArgString(""))) | 5058 %(return_type)s service_id = 0; |
4984 file.Write(" return error::kInvalidArguments;\n") | 5059 if (group_->Get%(resource_name)sServiceId(client_id, &service_id)) { |
4985 file.Write(" }\n") | 5060 return error::kInvalidArguments; |
| 5061 } |
| 5062 service_id = %(gl_func_name)s(%(gl_args)s); |
| 5063 if (service_id) { |
| 5064 group_->Add%(resource_name)sId(client_id, service_id); |
| 5065 } |
| 5066 """ |
| 5067 else: |
| 5068 code = """ uint32_t client_id = c.client_id; |
| 5069 if (Get%(resource_name)s(client_id)) { |
| 5070 return error::kInvalidArguments; |
| 5071 } |
| 5072 %(return_type)s service_id = %(gl_func_name)s(%(gl_args)s); |
| 5073 if (service_id) { |
| 5074 Create%(resource_name)s(client_id, service_id%(gl_args_with_comma)s); |
| 5075 } |
| 5076 """ |
| 5077 file.Write(code % { |
| 5078 'resource_name': self.__GetResourceType(func), |
| 5079 'return_type': func.return_type, |
| 5080 'gl_func_name': func.GetGLFunctionName(), |
| 5081 'gl_args': func.MakeOriginalArgString(""), |
| 5082 'gl_args_with_comma': func.MakeOriginalArgString("", True) }) |
4986 | 5083 |
4987 def WriteGLES2Implementation(self, func, file): | 5084 def WriteGLES2Implementation(self, func, file): |
4988 """Overrriden from TypeHandler.""" | 5085 """Overrriden from TypeHandler.""" |
4989 file.Write("%s GLES2Implementation::%s(%s) {\n" % | 5086 file.Write("%s GLES2Implementation::%s(%s) {\n" % |
4990 (func.return_type, func.original_name, | 5087 (func.return_type, func.original_name, |
4991 func.MakeTypedOriginalArgString(""))) | 5088 func.MakeTypedOriginalArgString(""))) |
4992 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") | 5089 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
4993 func.WriteDestinationInitalizationValidation(file) | 5090 func.WriteDestinationInitalizationValidation(file) |
4994 self.WriteClientGLCallLog(func, file) | 5091 self.WriteClientGLCallLog(func, file) |
4995 for arg in func.GetOriginalArgs(): | 5092 for arg in func.GetOriginalArgs(): |
4996 arg.WriteClientSideValidationCode(file, func) | 5093 arg.WriteClientSideValidationCode(file, func) |
4997 file.Write(" GLuint client_id;\n") | 5094 file.Write(" GLuint client_id;\n") |
4998 file.Write( | 5095 if func.return_type == "GLsync": |
4999 " GetIdHandler(id_namespaces::kProgramsAndShaders)->\n") | 5096 file.Write( |
| 5097 " GetIdHandler(id_namespaces::kSyncs)->\n") |
| 5098 else: |
| 5099 file.Write( |
| 5100 " GetIdHandler(id_namespaces::kProgramsAndShaders)->\n") |
5000 file.Write(" MakeIds(this, 0, 1, &client_id);\n") | 5101 file.Write(" MakeIds(this, 0, 1, &client_id);\n") |
5001 file.Write(" helper_->%s(%s);\n" % | 5102 file.Write(" helper_->%s(%s);\n" % |
5002 (func.name, func.MakeCmdArgString(""))) | 5103 (func.name, func.MakeCmdArgString(""))) |
5003 file.Write(' GPU_CLIENT_LOG("returned " << client_id);\n') | 5104 file.Write(' GPU_CLIENT_LOG("returned " << client_id);\n') |
5004 file.Write(" CheckGLError();\n") | 5105 file.Write(" CheckGLError();\n") |
5005 file.Write(" return client_id;\n") | 5106 if func.return_type == "GLsync": |
| 5107 file.Write(" return reinterpret_cast<GLsync>(client_id);\n") |
| 5108 else: |
| 5109 file.Write(" return client_id;\n") |
5006 file.Write("}\n") | 5110 file.Write("}\n") |
5007 file.Write("\n") | 5111 file.Write("\n") |
5008 | 5112 |
5009 | 5113 |
5010 class DeleteHandler(TypeHandler): | 5114 class DeleteHandler(TypeHandler): |
5011 """Handler for glDelete___ single resource type functions.""" | 5115 """Handler for glDelete___ single resource type functions.""" |
5012 | 5116 |
5013 def __init__(self): | 5117 def __init__(self): |
5014 TypeHandler.__init__(self) | 5118 TypeHandler.__init__(self) |
5015 | 5119 |
5016 def WriteServiceImplementation(self, func, file): | 5120 def WriteServiceImplementation(self, func, file): |
5017 """Overrriden from TypeHandler.""" | 5121 """Overrriden from TypeHandler.""" |
| 5122 if func.IsUnsafe(): |
| 5123 TypeHandler.WriteServiceImplementation(self, func, file) |
| 5124 # HandleDeleteShader and HandleDeleteProgram are manually written. |
5018 pass | 5125 pass |
5019 | 5126 |
5020 def WriteGLES2Implementation(self, func, file): | 5127 def WriteGLES2Implementation(self, func, file): |
5021 """Overrriden from TypeHandler.""" | 5128 """Overrriden from TypeHandler.""" |
5022 file.Write("%s GLES2Implementation::%s(%s) {\n" % | 5129 file.Write("%s GLES2Implementation::%s(%s) {\n" % |
5023 (func.return_type, func.original_name, | 5130 (func.return_type, func.original_name, |
5024 func.MakeTypedOriginalArgString(""))) | 5131 func.MakeTypedOriginalArgString(""))) |
5025 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") | 5132 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
5026 func.WriteDestinationInitalizationValidation(file) | 5133 func.WriteDestinationInitalizationValidation(file) |
5027 self.WriteClientGLCallLog(func, file) | 5134 self.WriteClientGLCallLog(func, file) |
5028 for arg in func.GetOriginalArgs(): | 5135 for arg in func.GetOriginalArgs(): |
5029 arg.WriteClientSideValidationCode(file, func) | 5136 arg.WriteClientSideValidationCode(file, func) |
5030 file.Write( | 5137 file.Write( |
5031 " GPU_CLIENT_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name) | 5138 " GPU_CLIENT_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name) |
5032 file.Write(" %sHelper(%s);\n" % | 5139 file.Write(" %sHelper(%s);\n" % |
5033 (func.original_name, func.GetOriginalArgs()[-1].name)) | 5140 (func.original_name, func.GetOriginalArgs()[-1].name)) |
5034 file.Write(" CheckGLError();\n") | 5141 file.Write(" CheckGLError();\n") |
5035 file.Write("}\n") | 5142 file.Write("}\n") |
5036 file.Write("\n") | 5143 file.Write("\n") |
5037 | 5144 |
| 5145 def WriteHandlerImplementation (self, func, file): |
| 5146 """Overrriden from TypeHandler.""" |
| 5147 assert len(func.GetOriginalArgs()) == 1 |
| 5148 arg = func.GetOriginalArgs()[0] |
| 5149 if func.IsUnsafe(): |
| 5150 file.Write(""" %(arg_type)s service_id = 0; |
| 5151 if (group_->Get%(resource_type)sServiceId(%(arg_name)s, &service_id)) { |
| 5152 glDelete%(resource_type)s(service_id); |
| 5153 group_->Remove%(resource_type)sId(%(arg_name)s); |
| 5154 } else { |
| 5155 LOCAL_SET_GL_ERROR( |
| 5156 GL_INVALID_VALUE, "gl%(func_name)s", "unknown %(arg_name)s"); |
| 5157 } |
| 5158 """ % { 'resource_type': func.GetInfo('resource_type'), |
| 5159 'arg_name': arg.name, |
| 5160 'arg_type': arg.type, |
| 5161 'func_name': func.original_name }) |
| 5162 else: |
| 5163 file.Write(" %sHelper(%s);\n" % (func.original_name, arg.name)) |
5038 | 5164 |
5039 class DELnHandler(TypeHandler): | 5165 class DELnHandler(TypeHandler): |
5040 """Handler for glDelete___ type functions.""" | 5166 """Handler for glDelete___ type functions.""" |
5041 | 5167 |
5042 def __init__(self): | 5168 def __init__(self): |
5043 TypeHandler.__init__(self) | 5169 TypeHandler.__init__(self) |
5044 | 5170 |
5045 def WriteGetDataSizeCode(self, func, file): | 5171 def WriteGetDataSizeCode(self, func, file): |
5046 """Overrriden from TypeHandler.""" | 5172 """Overrriden from TypeHandler.""" |
5047 code = """ uint32_t data_size; | 5173 code = """ uint32_t data_size; |
(...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6220 continue | 6346 continue |
6221 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % | 6347 file.Write(" EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" % |
6222 (arg.type, value + 1, arg.name)) | 6348 (arg.type, value + 1, arg.name)) |
6223 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") | 6349 file.Write(" CheckBytesWrittenMatchesExpectedSize(\n") |
6224 file.Write(" next_cmd, sizeof(cmd) +\n") | 6350 file.Write(" next_cmd, sizeof(cmd) +\n") |
6225 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n") | 6351 file.Write(" RoundSizeToMultipleOfEntries(sizeof(data)));\n") |
6226 file.Write(" // TODO(gman): Check that data was inserted;\n") | 6352 file.Write(" // TODO(gman): Check that data was inserted;\n") |
6227 file.Write("}\n") | 6353 file.Write("}\n") |
6228 file.Write("\n") | 6354 file.Write("\n") |
6229 | 6355 |
| 6356 class PUTSTRHandler(ArrayArgTypeHandler): |
| 6357 """Handler for functions that pass a string array.""" |
| 6358 |
| 6359 def __init__(self): |
| 6360 ArrayArgTypeHandler.__init__(self) |
| 6361 |
| 6362 def __GetDataArg(self, func): |
| 6363 """Return the argument that points to the 2D char arrays""" |
| 6364 for arg in func.GetOriginalArgs(): |
| 6365 if arg.IsPointer2D(): |
| 6366 return arg |
| 6367 return None |
| 6368 |
| 6369 def __GetLengthArg(self, func): |
| 6370 """Return the argument that holds length for each char array""" |
| 6371 for arg in func.GetOriginalArgs(): |
| 6372 if arg.IsPointer() and not arg.IsPointer2D(): |
| 6373 return arg |
| 6374 return None |
| 6375 |
| 6376 def WriteGLES2Implementation(self, func, file): |
| 6377 """Overrriden from TypeHandler.""" |
| 6378 file.Write("%s GLES2Implementation::%s(%s) {\n" % |
| 6379 (func.return_type, func.original_name, |
| 6380 func.MakeTypedOriginalArgString(""))) |
| 6381 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
| 6382 func.WriteDestinationInitalizationValidation(file) |
| 6383 self.WriteClientGLCallLog(func, file) |
| 6384 data_arg = self.__GetDataArg(func) |
| 6385 length_arg = self.__GetLengthArg(func) |
| 6386 log_code_block = """ GPU_CLIENT_LOG_CODE_BLOCK({ |
| 6387 for (GLsizei ii = 0; ii < count; ++ii) { |
| 6388 if (%(data)s[ii]) {""" |
| 6389 if length_arg == None: |
| 6390 log_code_block += """ |
| 6391 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << %(data)s[ii] << "\\n---");""" |
| 6392 else: |
| 6393 log_code_block += """ |
| 6394 if (%(length)s && %(length)s[ii] >= 0) { |
| 6395 const std::string my_str(%(data)s[ii], %(length)s[ii]); |
| 6396 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << my_str << "\\n---"); |
| 6397 } else { |
| 6398 GPU_CLIENT_LOG(" " << ii << ": ---\\n" << %(data)s[ii] << "\\n---"); |
| 6399 }""" |
| 6400 log_code_block += """ |
| 6401 } else { |
| 6402 GPU_CLIENT_LOG(" " << ii << ": NULL"); |
| 6403 } |
| 6404 } |
| 6405 }); |
| 6406 """ |
| 6407 file.Write(log_code_block % { |
| 6408 'data': data_arg.name, |
| 6409 'length': length_arg.name if not length_arg == None else '' |
| 6410 }) |
| 6411 for arg in func.GetOriginalArgs(): |
| 6412 arg.WriteClientSideValidationCode(file, func) |
| 6413 size_code_block = """ // Compute the total size. |
| 6414 base::CheckedNumeric<size_t> total_size = count; |
| 6415 total_size += 1; |
| 6416 total_size *= sizeof(GLint); |
| 6417 if (!total_size.IsValid()) { |
| 6418 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
| 6419 return; |
| 6420 } |
| 6421 size_t header_size = total_size.ValueOrDefault(0); |
| 6422 std::vector<GLint> header(count + 1); |
| 6423 header[0] = static_cast<GLint>(count); |
| 6424 for (GLsizei ii = 0; ii < count; ++ii) { |
| 6425 GLint len = 0; |
| 6426 if (%(data)s[ii]) {""" |
| 6427 if length_arg == None: |
| 6428 size_code_block += """ |
| 6429 len = base::static_cast<GLint>(strlen(%(data)s[ii]));""" |
| 6430 else: |
| 6431 size_code_block += """ |
| 6432 len = (%(length)s && %(length)s[ii] >= 0) ? |
| 6433 %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" |
| 6434 size_code_block += """ |
| 6435 } |
| 6436 total_size += len; |
| 6437 total_size += 1; // NULL at the end of each char array. |
| 6438 if (!total_size.IsValid()) { |
| 6439 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
| 6440 return; |
| 6441 } |
| 6442 header[ii + 1] = len; |
| 6443 } |
| 6444 """ |
| 6445 file.Write(size_code_block % { |
| 6446 'data': data_arg.name, |
| 6447 'length': length_arg.name if not length_arg == None else '' |
| 6448 }) |
| 6449 data_code_block = """ // Pack data into a bucket on the service. |
| 6450 helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
| 6451 size_t offset = 0; |
| 6452 for (GLsizei ii = 0; ii <= count; ++ii) { |
| 6453 const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : |
| 6454 %(data)s[ii - 1]; |
| 6455 base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : |
| 6456 static_cast<size_t>(header[ii]); |
| 6457 if (ii > 0) { |
| 6458 checked_size += 1; // NULL in the end. |
| 6459 } |
| 6460 if (!checked_size.IsValid()) { |
| 6461 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
| 6462 return; |
| 6463 } |
| 6464 size_t size = checked_size.ValueOrDefault(0); |
| 6465 while (size) { |
| 6466 ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
| 6467 if (!buffer.valid() || buffer.size() == 0) { |
| 6468 SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large"); |
| 6469 return; |
| 6470 } |
| 6471 size_t copy_size = buffer.size(); |
| 6472 if (ii > 0 && buffer.size() == size) |
| 6473 --copy_size; |
| 6474 if (copy_size) |
| 6475 memcpy(buffer.address(), src, copy_size); |
| 6476 if (copy_size < buffer.size()) { |
| 6477 // Append NULL in the end. |
| 6478 DCHECK(copy_size + 1 == buffer.size()); |
| 6479 char* str = reinterpret_cast<char*>(buffer.address()); |
| 6480 str[copy_size] = 0; |
| 6481 } |
| 6482 helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |
| 6483 buffer.shm_id(), buffer.offset()); |
| 6484 offset += buffer.size(); |
| 6485 src += buffer.size(); |
| 6486 size -= buffer.size(); |
| 6487 } |
| 6488 } |
| 6489 DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
| 6490 """ |
| 6491 file.Write(data_code_block % { |
| 6492 'data': data_arg.name, |
| 6493 'length': length_arg.name if not length_arg == None else '' |
| 6494 }) |
| 6495 bucket_cmd_arg_string = "" |
| 6496 for arg in func.GetCmdArgs()[0:-2]: |
| 6497 if bucket_cmd_arg_string: |
| 6498 bucket_cmd_arg_string += ", " |
| 6499 bucket_cmd_arg_string += arg.name |
| 6500 if bucket_cmd_arg_string: |
| 6501 bucket_cmd_arg_string += ", " |
| 6502 bucket_cmd_arg_string += 'kResultBucketId' |
| 6503 file.Write(" helper_->%sBucket(%s);\n" % |
| 6504 (func.name, bucket_cmd_arg_string)) |
| 6505 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); |
| 6506 file.Write(" CheckGLError();\n") |
| 6507 file.Write("}\n") |
| 6508 file.Write("\n") |
| 6509 |
6230 | 6510 |
6231 class PUTXnHandler(ArrayArgTypeHandler): | 6511 class PUTXnHandler(ArrayArgTypeHandler): |
6232 """Handler for glUniform?f functions.""" | 6512 """Handler for glUniform?f functions.""" |
6233 def __init__(self): | 6513 def __init__(self): |
6234 ArrayArgTypeHandler.__init__(self) | 6514 ArrayArgTypeHandler.__init__(self) |
6235 | 6515 |
6236 def WriteHandlerImplementation(self, func, file): | 6516 def WriteHandlerImplementation(self, func, file): |
6237 """Overrriden from TypeHandler.""" | 6517 """Overrriden from TypeHandler.""" |
6238 code = """ %(type)s temp[%(count)s] = { %(values)s};""" | 6518 code = """ %(type)s temp[%(count)s] = { %(values)s};""" |
6239 if func.IsUnsafe(): | 6519 if func.IsUnsafe(): |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6554 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); | 6834 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); |
6555 if (!result_dst) { | 6835 if (!result_dst) { |
6556 return error::kOutOfBounds; | 6836 return error::kOutOfBounds; |
6557 } | 6837 } |
6558 """ | 6838 """ |
6559 file.Write(code % {'func_name': func.name}) | 6839 file.Write(code % {'func_name': func.name}) |
6560 func.WriteHandlerValidation(file) | 6840 func.WriteHandlerValidation(file) |
6561 if func.IsUnsafe(): | 6841 if func.IsUnsafe(): |
6562 assert func.GetInfo('id_mapping') | 6842 assert func.GetInfo('id_mapping') |
6563 assert len(func.GetInfo('id_mapping')) == 1 | 6843 assert len(func.GetInfo('id_mapping')) == 1 |
| 6844 assert len(args) == 1 |
6564 id_type = func.GetInfo('id_mapping')[0] | 6845 id_type = func.GetInfo('id_mapping')[0] |
6565 file.Write(" *result_dst = group_->Get%sServiceId(%s, &%s);\n" % | 6846 file.Write(" %s service_%s = 0;\n" % (args[0].type, id_type.lower())) |
| 6847 file.Write(" *result_dst = group_->Get%sServiceId(%s, &service_%s);\n" % |
6566 (id_type, id_type.lower(), id_type.lower())) | 6848 (id_type, id_type.lower(), id_type.lower())) |
6567 else: | 6849 else: |
6568 file.Write(" *result_dst = %s(%s);\n" % | 6850 file.Write(" *result_dst = %s(%s);\n" % |
6569 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) | 6851 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
6570 file.Write(" return error::kNoError;\n") | 6852 file.Write(" return error::kNoError;\n") |
6571 file.Write("}\n") | 6853 file.Write("}\n") |
6572 file.Write("\n") | 6854 file.Write("\n") |
6573 | 6855 |
6574 def WriteGLES2Implementation(self, func, file): | 6856 def WriteGLES2Implementation(self, func, file): |
6575 """Overrriden from TypeHandler.""" | 6857 """Overrriden from TypeHandler.""" |
6576 impl_func = func.GetInfo('impl_func') | 6858 impl_func = func.GetInfo('impl_func') |
6577 if impl_func == None or impl_func == True: | 6859 if impl_func == None or impl_func == True: |
6578 error_value = func.GetInfo("error_value") or "GL_FALSE" | 6860 error_value = func.GetInfo("error_value") or "GL_FALSE" |
6579 file.Write("%s GLES2Implementation::%s(%s) {\n" % | 6861 file.Write("%s GLES2Implementation::%s(%s) {\n" % |
6580 (func.return_type, func.original_name, | 6862 (func.return_type, func.original_name, |
6581 func.MakeTypedOriginalArgString(""))) | 6863 func.MakeTypedOriginalArgString(""))) |
6582 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") | 6864 file.Write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
6583 self.WriteTraceEvent(func, file) | 6865 self.WriteTraceEvent(func, file) |
6584 func.WriteDestinationInitalizationValidation(file) | 6866 func.WriteDestinationInitalizationValidation(file) |
6585 self.WriteClientGLCallLog(func, file) | 6867 self.WriteClientGLCallLog(func, file) |
6586 file.Write(" typedef cmds::%s::Result Result;\n" % func.name) | 6868 file.Write(" typedef cmds::%s::Result Result;\n" % func.name) |
6587 file.Write(" Result* result = GetResultAs<Result*>();\n") | 6869 file.Write(" Result* result = GetResultAs<Result*>();\n") |
6588 file.Write(" if (!result) {\n") | 6870 file.Write(" if (!result) {\n") |
6589 file.Write(" return %s;\n" % error_value) | 6871 file.Write(" return %s;\n" % error_value) |
6590 file.Write(" }\n") | 6872 file.Write(" }\n") |
6591 file.Write(" *result = 0;\n") | 6873 file.Write(" *result = 0;\n") |
6592 arg_string = func.MakeOriginalArgString("") | 6874 assert len(func.GetOriginalArgs()) == 1 |
6593 comma = "" | 6875 id_arg = func.GetOriginalArgs()[0] |
6594 if len(arg_string) > 0: | 6876 if id_arg.type == 'GLsync': |
6595 comma = ", " | 6877 arg_string = "ToGLuint(%s)" % func.MakeOriginalArgString("") |
| 6878 else: |
| 6879 arg_string = func.MakeOriginalArgString("") |
6596 file.Write( | 6880 file.Write( |
6597 " helper_->%s(%s%sGetResultShmId(), GetResultShmOffset());\n" % | 6881 " helper_->%s(%s, GetResultShmId(), GetResultShmOffset());\n" % |
6598 (func.name, arg_string, comma)) | 6882 (func.name, arg_string)) |
6599 file.Write(" WaitForCmd();\n") | 6883 file.Write(" WaitForCmd();\n") |
6600 file.Write(" %s result_value = *result" % func.return_type) | 6884 file.Write(" %s result_value = *result" % func.return_type) |
6601 if func.return_type == "GLboolean": | 6885 if func.return_type == "GLboolean": |
6602 file.Write(" != 0") | 6886 file.Write(" != 0") |
6603 file.Write(';\n GPU_CLIENT_LOG("returned " << result_value);\n') | 6887 file.Write(';\n GPU_CLIENT_LOG("returned " << result_value);\n') |
6604 file.Write(" CheckGLError();\n") | 6888 file.Write(" CheckGLError();\n") |
6605 file.Write(" return result_value;\n") | 6889 file.Write(" return result_value;\n") |
6606 file.Write("}\n") | 6890 file.Write("}\n") |
6607 file.Write("\n") | 6891 file.Write("\n") |
6608 | 6892 |
6609 def WriteGLES2ImplementationUnitTest(self, func, file): | 6893 def WriteGLES2ImplementationUnitTest(self, func, file): |
6610 """Overrriden from TypeHandler.""" | 6894 """Overrriden from TypeHandler.""" |
6611 client_test = func.GetInfo('client_test') | 6895 client_test = func.GetInfo('client_test') |
6612 if client_test == None or client_test == True: | 6896 if client_test == None or client_test == True: |
6613 code = """ | 6897 code = """ |
6614 TEST_F(GLES2ImplementationTest, %(name)s) { | 6898 TEST_F(GLES2ImplementationTest, %(name)s) { |
6615 struct Cmds { | 6899 struct Cmds { |
6616 cmds::%(name)s cmd; | 6900 cmds::%(name)s cmd; |
6617 }; | 6901 }; |
6618 | 6902 |
6619 Cmds expected; | 6903 Cmds expected; |
6620 ExpectedMemoryInfo result1 = | 6904 ExpectedMemoryInfo result1 = |
6621 GetExpectedResultMemory(sizeof(cmds::%(name)s::Result)); | 6905 GetExpectedResultMemory(sizeof(cmds::%(name)s::Result)); |
6622 expected.cmd.Init(1, result1.id, result1.offset); | 6906 expected.cmd.Init(%(cmd_id_value)s, result1.id, result1.offset); |
6623 | 6907 |
6624 EXPECT_CALL(*command_buffer(), OnFlush()) | 6908 EXPECT_CALL(*command_buffer(), OnFlush()) |
6625 .WillOnce(SetMemory(result1.ptr, uint32_t(1))) | 6909 .WillOnce(SetMemory(result1.ptr, uint32_t(GL_TRUE))) |
6626 .RetiresOnSaturation(); | 6910 .RetiresOnSaturation(); |
6627 | 6911 |
6628 GLboolean result = gl_->%(name)s(1); | 6912 GLboolean result = gl_->%(name)s(%(gl_id_value)s); |
6629 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 6913 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
6630 EXPECT_TRUE(result); | 6914 EXPECT_TRUE(result); |
6631 } | 6915 } |
6632 """ | 6916 """ |
| 6917 args = func.GetOriginalArgs() |
| 6918 assert len(args) == 1 |
6633 file.Write(code % { | 6919 file.Write(code % { |
6634 'name': func.name, | 6920 'name': func.name, |
6635 }) | 6921 'cmd_id_value': args[0].GetValidClientSideCmdArg(func), |
| 6922 'gl_id_value': args[0].GetValidClientSideArg(func) }) |
6636 | 6923 |
6637 | 6924 |
6638 class STRnHandler(TypeHandler): | 6925 class STRnHandler(TypeHandler): |
6639 """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and | 6926 """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and |
6640 GetTranslatedShaderSourceANGLE.""" | 6927 GetTranslatedShaderSourceANGLE.""" |
6641 | 6928 |
6642 def __init__(self): | 6929 def __init__(self): |
6643 TypeHandler.__init__(self) | 6930 TypeHandler.__init__(self) |
6644 | 6931 |
6645 def InitFunction(self, func): | 6932 def InitFunction(self, func): |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6816 | 7103 |
6817 if type in self.cmd_type_map_: | 7104 if type in self.cmd_type_map_: |
6818 self.cmd_type = self.cmd_type_map_[type] | 7105 self.cmd_type = self.cmd_type_map_[type] |
6819 else: | 7106 else: |
6820 self.cmd_type = 'uint32_t' | 7107 self.cmd_type = 'uint32_t' |
6821 | 7108 |
6822 def IsPointer(self): | 7109 def IsPointer(self): |
6823 """Returns true if argument is a pointer.""" | 7110 """Returns true if argument is a pointer.""" |
6824 return False | 7111 return False |
6825 | 7112 |
| 7113 def IsPointer2D(self): |
| 7114 """Returns true if argument is a 2D pointer.""" |
| 7115 return False |
| 7116 |
6826 def IsConstant(self): | 7117 def IsConstant(self): |
6827 """Returns true if the argument has only one valid value.""" | 7118 """Returns true if the argument has only one valid value.""" |
6828 return False | 7119 return False |
6829 | 7120 |
6830 def AddCmdArgs(self, args): | 7121 def AddCmdArgs(self, args): |
6831 """Adds command arguments for this argument to the given list.""" | 7122 """Adds command arguments for this argument to the given list.""" |
6832 if not self.IsConstant(): | 7123 if not self.IsConstant(): |
6833 return args.append(self) | 7124 return args.append(self) |
6834 | 7125 |
6835 def AddInitArgs(self, args): | 7126 def AddInitArgs(self, args): |
(...skipping 10 matching lines...) Expand all Loading... |
6846 index = func.GetOriginalArgs().index(self) | 7137 index = func.GetOriginalArgs().index(self) |
6847 return str(index + 1) | 7138 return str(index + 1) |
6848 | 7139 |
6849 def GetValidClientSideArg(self, func): | 7140 def GetValidClientSideArg(self, func): |
6850 """Gets a valid value for this argument.""" | 7141 """Gets a valid value for this argument.""" |
6851 valid_arg = func.GetValidArg(self) | 7142 valid_arg = func.GetValidArg(self) |
6852 if valid_arg != None: | 7143 if valid_arg != None: |
6853 return valid_arg | 7144 return valid_arg |
6854 | 7145 |
6855 index = func.GetOriginalArgs().index(self) | 7146 index = func.GetOriginalArgs().index(self) |
| 7147 if self.type == 'GLsync': |
| 7148 return ("reinterpret_cast<GLsync>(%d)" % (index + 1)) |
6856 return str(index + 1) | 7149 return str(index + 1) |
6857 | 7150 |
6858 def GetValidClientSideCmdArg(self, func): | 7151 def GetValidClientSideCmdArg(self, func): |
6859 """Gets a valid value for this argument.""" | 7152 """Gets a valid value for this argument.""" |
6860 valid_arg = func.GetValidArg(self) | 7153 valid_arg = func.GetValidArg(self) |
6861 if valid_arg != None: | 7154 if valid_arg != None: |
6862 return valid_arg | 7155 return valid_arg |
6863 try: | 7156 try: |
6864 index = func.GetOriginalArgs().index(self) | 7157 index = func.GetOriginalArgs().index(self) |
6865 return str(index + 1) | 7158 return str(index + 1) |
6866 except ValueError: | 7159 except ValueError: |
6867 pass | 7160 pass |
6868 index = func.GetCmdArgs().index(self) | 7161 index = func.GetCmdArgs().index(self) |
6869 return str(index + 1) | 7162 return str(index + 1) |
6870 | 7163 |
6871 def GetValidGLArg(self, func): | 7164 def GetValidGLArg(self, func): |
6872 """Gets a valid GL value for this argument.""" | 7165 """Gets a valid GL value for this argument.""" |
6873 return self.GetValidArg(func) | 7166 value = self.GetValidArg(func) |
| 7167 if self.type == 'GLsync': |
| 7168 return ("reinterpret_cast<GLsync>(%s)" % value) |
| 7169 return value |
6874 | 7170 |
6875 def GetValidNonCachedClientSideArg(self, func): | 7171 def GetValidNonCachedClientSideArg(self, func): |
6876 """Returns a valid value for this argument in a GL call. | 7172 """Returns a valid value for this argument in a GL call. |
6877 Using the value will produce a command buffer service invocation. | 7173 Using the value will produce a command buffer service invocation. |
6878 Returns None if there is no such value.""" | 7174 Returns None if there is no such value.""" |
6879 return '123' | 7175 return '123' |
6880 | 7176 |
6881 def GetValidNonCachedClientSideCmdArg(self, func): | 7177 def GetValidNonCachedClientSideCmdArg(self, func): |
6882 """Returns a valid value for this argument in a command buffer command. | 7178 """Returns a valid value for this argument in a command buffer command. |
6883 Calling the GL function with the value returned by | 7179 Calling the GL function with the value returned by |
(...skipping 12 matching lines...) Expand all Loading... |
6896 def GetLogArg(self): | 7192 def GetLogArg(self): |
6897 """Get argument appropriate for LOG macro.""" | 7193 """Get argument appropriate for LOG macro.""" |
6898 if self.type == 'GLboolean': | 7194 if self.type == 'GLboolean': |
6899 return 'GLES2Util::GetStringBool(%s)' % self.name | 7195 return 'GLES2Util::GetStringBool(%s)' % self.name |
6900 if self.type == 'GLenum': | 7196 if self.type == 'GLenum': |
6901 return 'GLES2Util::GetStringEnum(%s)' % self.name | 7197 return 'GLES2Util::GetStringEnum(%s)' % self.name |
6902 return self.name | 7198 return self.name |
6903 | 7199 |
6904 def WriteGetCode(self, file): | 7200 def WriteGetCode(self, file): |
6905 """Writes the code to get an argument from a command structure.""" | 7201 """Writes the code to get an argument from a command structure.""" |
| 7202 if self.type == 'GLsync': |
| 7203 my_type = 'GLuint' |
| 7204 else: |
| 7205 my_type = self.type |
6906 file.Write(" %s %s = static_cast<%s>(c.%s);\n" % | 7206 file.Write(" %s %s = static_cast<%s>(c.%s);\n" % |
6907 (self.type, self.name, self.type, self.name)) | 7207 (my_type, self.name, my_type, self.name)) |
6908 | 7208 |
6909 def WriteValidationCode(self, file, func): | 7209 def WriteValidationCode(self, file, func): |
6910 """Writes the validation code for an argument.""" | 7210 """Writes the validation code for an argument.""" |
6911 pass | 7211 pass |
6912 | 7212 |
6913 def WriteClientSideValidationCode(self, file, func): | 7213 def WriteClientSideValidationCode(self, file, func): |
6914 """Writes the validation code for an argument.""" | 7214 """Writes the validation code for an argument.""" |
6915 pass | 7215 pass |
6916 | 7216 |
6917 def WriteDestinationInitalizationValidation(self, file, func): | 7217 def WriteDestinationInitalizationValidation(self, file, func): |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7031 def GetInvalidArg(self, index): | 7331 def GetInvalidArg(self, index): |
7032 """overridden from SizeArgument.""" | 7332 """overridden from SizeArgument.""" |
7033 return ("-1", "kOutOfBounds", "GL_NO_ERROR") | 7333 return ("-1", "kOutOfBounds", "GL_NO_ERROR") |
7034 | 7334 |
7035 def WriteValidationCode(self, file, func): | 7335 def WriteValidationCode(self, file, func): |
7036 """overridden from SizeArgument.""" | 7336 """overridden from SizeArgument.""" |
7037 pass | 7337 pass |
7038 | 7338 |
7039 | 7339 |
7040 class EnumBaseArgument(Argument): | 7340 class EnumBaseArgument(Argument): |
7041 """Base class for EnumArgument, IntArgument and ValidatedBoolArgument""" | 7341 """Base class for EnumArgument, IntArgument, BitfieldArgument, and |
| 7342 ValidatedBoolArgument.""" |
7042 | 7343 |
7043 def __init__(self, name, gl_type, type, gl_error): | 7344 def __init__(self, name, gl_type, type, gl_error): |
7044 Argument.__init__(self, name, gl_type) | 7345 Argument.__init__(self, name, gl_type) |
7045 | 7346 |
7046 self.local_type = type | 7347 self.local_type = type |
7047 self.gl_error = gl_error | 7348 self.gl_error = gl_error |
7048 name = type[len(gl_type):] | 7349 name = type[len(gl_type):] |
7049 self.type_name = name | 7350 self.type_name = name |
7050 self.named_type = NamedType(_NAMED_TYPE_INFO[name]) | 7351 self.named_type = NamedType(_NAMED_TYPE_INFO[name]) |
7051 | 7352 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7147 def __init__(self, name, type): | 7448 def __init__(self, name, type): |
7148 EnumBaseArgument.__init__(self, name, "GLenum", type, "GL_INVALID_ENUM") | 7449 EnumBaseArgument.__init__(self, name, "GLenum", type, "GL_INVALID_ENUM") |
7149 | 7450 |
7150 def GetLogArg(self): | 7451 def GetLogArg(self): |
7151 """Overridden from Argument.""" | 7452 """Overridden from Argument.""" |
7152 return ("GLES2Util::GetString%s(%s)" % | 7453 return ("GLES2Util::GetString%s(%s)" % |
7153 (self.type_name, self.name)) | 7454 (self.type_name, self.name)) |
7154 | 7455 |
7155 | 7456 |
7156 class IntArgument(EnumBaseArgument): | 7457 class IntArgument(EnumBaseArgument): |
7157 """A class for a GLint argument that can only except specific values. | 7458 """A class for a GLint argument that can only accept specific values. |
7158 | 7459 |
7159 For example glTexImage2D takes a GLint for its internalformat | 7460 For example glTexImage2D takes a GLint for its internalformat |
7160 argument instead of a GLenum. | 7461 argument instead of a GLenum. |
7161 """ | 7462 """ |
7162 | 7463 |
7163 def __init__(self, name, type): | 7464 def __init__(self, name, type): |
7164 EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE") | 7465 EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE") |
7165 | 7466 |
7166 | 7467 |
7167 class ValidatedBoolArgument(EnumBaseArgument): | 7468 class ValidatedBoolArgument(EnumBaseArgument): |
7168 """A class for a GLboolean argument that can only except specific values. | 7469 """A class for a GLboolean argument that can only accept specific values. |
7169 | 7470 |
7170 For example glUniformMatrix takes a GLboolean for it's transpose but it | 7471 For example glUniformMatrix takes a GLboolean for it's transpose but it |
7171 must be false. | 7472 must be false. |
7172 """ | 7473 """ |
7173 | 7474 |
7174 def __init__(self, name, type): | 7475 def __init__(self, name, type): |
7175 EnumBaseArgument.__init__(self, name, "GLboolean", type, "GL_INVALID_VALUE") | 7476 EnumBaseArgument.__init__(self, name, "GLboolean", type, "GL_INVALID_VALUE") |
7176 | 7477 |
7177 def GetLogArg(self): | 7478 def GetLogArg(self): |
7178 """Overridden from Argument.""" | 7479 """Overridden from Argument.""" |
7179 return 'GLES2Util::GetStringBool(%s)' % self.name | 7480 return 'GLES2Util::GetStringBool(%s)' % self.name |
7180 | 7481 |
7181 | 7482 |
| 7483 class BitFieldArgument(EnumBaseArgument): |
| 7484 """A class for a GLbitfield argument that can only accept specific values. |
| 7485 |
| 7486 For example glFenceSync takes a GLbitfield for its flags argument bit it |
| 7487 must be 0. |
| 7488 """ |
| 7489 |
| 7490 def __init__(self, name, type): |
| 7491 EnumBaseArgument.__init__(self, name, "GLbitfield", type, |
| 7492 "GL_INVALID_VALUE") |
| 7493 |
| 7494 |
7182 class ImmediatePointerArgument(Argument): | 7495 class ImmediatePointerArgument(Argument): |
7183 """A class that represents an immediate argument to a function. | 7496 """A class that represents an immediate argument to a function. |
7184 | 7497 |
7185 An immediate argument is one where the data follows the command. | 7498 An immediate argument is one where the data follows the command. |
7186 """ | 7499 """ |
7187 | 7500 |
7188 def __init__(self, name, type): | 7501 def __init__(self, name, type): |
7189 Argument.__init__(self, name, type) | 7502 Argument.__init__(self, name, type) |
7190 | 7503 |
7191 def IsPointer(self): | 7504 def IsPointer(self): |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7262 class PointerArgument(Argument): | 7575 class PointerArgument(Argument): |
7263 """A class that represents a pointer argument to a function.""" | 7576 """A class that represents a pointer argument to a function.""" |
7264 | 7577 |
7265 def __init__(self, name, type): | 7578 def __init__(self, name, type): |
7266 Argument.__init__(self, name, type) | 7579 Argument.__init__(self, name, type) |
7267 | 7580 |
7268 def IsPointer(self): | 7581 def IsPointer(self): |
7269 """Returns true if argument is a pointer.""" | 7582 """Returns true if argument is a pointer.""" |
7270 return True | 7583 return True |
7271 | 7584 |
| 7585 def IsPointer2D(self): |
| 7586 """Returns true if argument is a 2D pointer.""" |
| 7587 return self.type.count('*') == 2 |
| 7588 |
7272 def GetPointedType(self): | 7589 def GetPointedType(self): |
7273 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) | 7590 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) |
7274 assert match | 7591 assert match |
7275 return match.groupdict()['element_type'] | 7592 return match.groupdict()['element_type'] |
7276 | 7593 |
7277 def GetValidArg(self, func): | 7594 def GetValidArg(self, func): |
7278 """Overridden from Argument.""" | 7595 """Overridden from Argument.""" |
7279 return "shared_memory_id_, shared_memory_offset_" | 7596 return "shared_memory_id_, shared_memory_offset_" |
7280 | 7597 |
7281 def GetValidGLArg(self, func): | 7598 def GetValidGLArg(self, func): |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7326 file.Write(" if (%s == NULL) {\n" % self.name) | 7643 file.Write(" if (%s == NULL) {\n" % self.name) |
7327 file.Write(" return error::kOutOfBounds;\n") | 7644 file.Write(" return error::kOutOfBounds;\n") |
7328 file.Write(" }\n") | 7645 file.Write(" }\n") |
7329 | 7646 |
7330 def GetImmediateVersion(self): | 7647 def GetImmediateVersion(self): |
7331 """Overridden from Argument.""" | 7648 """Overridden from Argument.""" |
7332 return ImmediatePointerArgument(self.name, self.type) | 7649 return ImmediatePointerArgument(self.name, self.type) |
7333 | 7650 |
7334 def GetBucketVersion(self): | 7651 def GetBucketVersion(self): |
7335 """Overridden from Argument.""" | 7652 """Overridden from Argument.""" |
7336 if self.type == "const char*": | 7653 if self.type.find('char') >= 0: |
| 7654 if self.IsPointer2D(): |
| 7655 return InputStringArrayBucketArgument(self.name, self.type) |
7337 return InputStringBucketArgument(self.name, self.type) | 7656 return InputStringBucketArgument(self.name, self.type) |
7338 return BucketPointerArgument(self.name, self.type) | 7657 return BucketPointerArgument(self.name, self.type) |
7339 | 7658 |
7340 def WriteDestinationInitalizationValidation(self, file, func): | 7659 def WriteDestinationInitalizationValidation(self, file, func): |
7341 """Overridden from Argument.""" | 7660 """Overridden from Argument.""" |
7342 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) | 7661 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) |
7343 | 7662 |
7344 | 7663 |
7345 class InputStringBucketArgument(Argument): | 7664 class InputStringBucketArgument(Argument): |
7346 """An string input argument where the string is passed in a bucket.""" | 7665 """A string input argument where the string is passed in a bucket.""" |
7347 | 7666 |
7348 def __init__(self, name, type): | 7667 def __init__(self, name, type): |
7349 Argument.__init__(self, name + "_bucket_id", "uint32_t") | 7668 Argument.__init__(self, name + "_bucket_id", "uint32_t") |
7350 | 7669 |
| 7670 |
| 7671 class InputStringArrayBucketArgument(Argument): |
| 7672 """A string array input argument where the strings are passed in a bucket.""" |
| 7673 |
| 7674 def __init__(self, name, type): |
| 7675 Argument.__init__(self, name + "_bucket_id", "uint32_t") |
| 7676 self._original_name = name |
| 7677 |
7351 def WriteGetCode(self, file): | 7678 def WriteGetCode(self, file): |
7352 """Overridden from Argument.""" | 7679 """Overridden from Argument.""" |
7353 code = """ | 7680 code = """ |
7354 Bucket* %(name)s_bucket = GetBucket(c.%(name)s); | 7681 const size_t kMinBucketSize = sizeof(GLint); |
7355 if (!%(name)s_bucket) { | 7682 // Each string has at least |length| in the header and a NUL character. |
| 7683 const size_t kMinStringSize = sizeof(GLint) + 1; |
| 7684 Bucket* bucket = GetBucket(c.%(name)s); |
| 7685 if (!bucket) { |
7356 return error::kInvalidArguments; | 7686 return error::kInvalidArguments; |
7357 } | 7687 } |
7358 std::string %(name)s_str; | 7688 const size_t bucket_size = bucket->size(); |
7359 if (!%(name)s_bucket->GetAsString(&%(name)s_str)) { | 7689 if (bucket_size < kMinBucketSize) { |
7360 return error::kInvalidArguments; | 7690 return error::kInvalidArguments; |
7361 } | 7691 } |
7362 const char* %(name)s = %(name)s_str.c_str(); | 7692 const char* bucket_data = bucket->GetDataAs<const char*>(0, bucket_size); |
| 7693 const GLint* header = reinterpret_cast<const GLint*>(bucket_data); |
| 7694 GLsizei count = static_cast<GLsizei>(header[0]); |
| 7695 if (count < 0) { |
| 7696 return error::kInvalidArguments; |
| 7697 } |
| 7698 const size_t max_count = (bucket_size - kMinBucketSize) / kMinStringSize; |
| 7699 if (max_count < static_cast<size_t>(count)) { |
| 7700 return error::kInvalidArguments; |
| 7701 } |
| 7702 const GLint* length = header + 1; |
| 7703 scoped_ptr<const char*[]> strs; |
| 7704 if (count > 0) |
| 7705 strs.reset(new const char*[count]); |
| 7706 const char** %(original_name)s = strs.get(); |
| 7707 base::CheckedNumeric<size_t> total_size = sizeof(GLint); |
| 7708 total_size *= count + 1; // Header size. |
| 7709 if (!total_size.IsValid()) |
| 7710 return error::kInvalidArguments; |
| 7711 for (GLsizei ii = 0; ii < count; ++ii) { |
| 7712 %(original_name)s[ii] = bucket_data + total_size.ValueOrDefault(0); |
| 7713 total_size += length[ii]; |
| 7714 total_size += 1; // NUL char at the end of each char array. |
| 7715 if (!total_size.IsValid() || total_size.ValueOrDefault(0) > bucket_size || |
| 7716 %(original_name)s[ii][length[ii]] != 0) { |
| 7717 return error::kInvalidArguments; |
| 7718 } |
| 7719 } |
| 7720 if (total_size.ValueOrDefault(0) != bucket_size) { |
| 7721 return error::kInvalidArguments; |
| 7722 } |
7363 """ | 7723 """ |
7364 file.Write(code % { | 7724 file.Write(code % { |
7365 'name': self.name, | 7725 'name': self.name, |
| 7726 'original_name': self._original_name, |
7366 }) | 7727 }) |
7367 | 7728 |
7368 def GetValidArg(self, func): | 7729 def GetValidArg(self, func): |
7369 return "kNameBucketId" | 7730 return "kNameBucketId" |
7370 | 7731 |
7371 def GetValidGLArg(self, func): | 7732 def GetValidGLArg(self, func): |
7372 return "_" | 7733 return "_" |
7373 | 7734 |
7374 | 7735 |
7375 class ResourceIdArgument(Argument): | 7736 class ResourceIdArgument(Argument): |
7376 """A class that represents a resource id argument to a function.""" | 7737 """A class that represents a resource id argument to a function.""" |
7377 | 7738 |
7378 def __init__(self, name, type): | 7739 def __init__(self, name, type): |
7379 match = re.match("(GLid\w+)", type) | 7740 match = re.match("(GLid\w+)", type) |
7380 self.resource_type = match.group(1)[4:] | 7741 self.resource_type = match.group(1)[4:] |
7381 type = type.replace(match.group(1), "GLuint") | 7742 if self.resource_type == "Sync": |
| 7743 type = type.replace(match.group(1), "GLsync") |
| 7744 else: |
| 7745 type = type.replace(match.group(1), "GLuint") |
7382 Argument.__init__(self, name, type) | 7746 Argument.__init__(self, name, type) |
7383 | 7747 |
7384 def WriteGetCode(self, file): | 7748 def WriteGetCode(self, file): |
7385 """Overridden from Argument.""" | 7749 """Overridden from Argument.""" |
7386 file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name)) | 7750 if self.type == "GLsync": |
| 7751 my_type = "GLuint" |
| 7752 else: |
| 7753 my_type = self.type |
| 7754 file.Write(" %s %s = c.%s;\n" % (my_type, self.name, self.name)) |
7387 | 7755 |
7388 def GetValidArg(self, func): | 7756 def GetValidArg(self, func): |
7389 return "client_%s_id_" % self.resource_type.lower() | 7757 return "client_%s_id_" % self.resource_type.lower() |
7390 | 7758 |
7391 def GetValidGLArg(self, func): | 7759 def GetValidGLArg(self, func): |
| 7760 if self.resource_type == "Sync": |
| 7761 return "reinterpret_cast<GLsync>(kService%sId)" % self.resource_type |
7392 return "kService%sId" % self.resource_type | 7762 return "kService%sId" % self.resource_type |
7393 | 7763 |
7394 | 7764 |
7395 class ResourceIdBindArgument(Argument): | 7765 class ResourceIdBindArgument(Argument): |
7396 """Represents a resource id argument to a bind function.""" | 7766 """Represents a resource id argument to a bind function.""" |
7397 | 7767 |
7398 def __init__(self, name, type): | 7768 def __init__(self, name, type): |
7399 match = re.match("(GLidBind\w+)", type) | 7769 match = re.match("(GLidBind\w+)", type) |
7400 self.resource_type = match.group(1)[8:] | 7770 self.resource_type = match.group(1)[8:] |
7401 type = type.replace(match.group(1), "GLuint") | 7771 type = type.replace(match.group(1), "GLuint") |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7455 'DELn': DELnHandler(), | 7825 'DELn': DELnHandler(), |
7456 'GENn': GENnHandler(), | 7826 'GENn': GENnHandler(), |
7457 'GETn': GETnHandler(), | 7827 'GETn': GETnHandler(), |
7458 'GLchar': GLcharHandler(), | 7828 'GLchar': GLcharHandler(), |
7459 'GLcharN': GLcharNHandler(), | 7829 'GLcharN': GLcharNHandler(), |
7460 'HandWritten': HandWrittenHandler(), | 7830 'HandWritten': HandWrittenHandler(), |
7461 'Is': IsHandler(), | 7831 'Is': IsHandler(), |
7462 'Manual': ManualHandler(), | 7832 'Manual': ManualHandler(), |
7463 'PUT': PUTHandler(), | 7833 'PUT': PUTHandler(), |
7464 'PUTn': PUTnHandler(), | 7834 'PUTn': PUTnHandler(), |
| 7835 'PUTSTR': PUTSTRHandler(), |
7465 'PUTXn': PUTXnHandler(), | 7836 'PUTXn': PUTXnHandler(), |
7466 'StateSet': StateSetHandler(), | 7837 'StateSet': StateSetHandler(), |
7467 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), | 7838 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), |
7468 'StateSetFrontBack': StateSetFrontBackHandler(), | 7839 'StateSetFrontBack': StateSetFrontBackHandler(), |
7469 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), | 7840 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), |
7470 'StateSetNamedParameter': StateSetNamedParameter(), | 7841 'StateSetNamedParameter': StateSetNamedParameter(), |
7471 'STRn': STRnHandler(), | 7842 'STRn': STRnHandler(), |
7472 'Todo': TodoHandler(), | 7843 'Todo': TodoHandler(), |
7473 } | 7844 } |
7474 | 7845 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7646 | 8017 |
7647 def GetLastOriginalPointerArg(self): | 8018 def GetLastOriginalPointerArg(self): |
7648 return self.last_original_pointer_arg | 8019 return self.last_original_pointer_arg |
7649 | 8020 |
7650 def GetResourceIdArg(self): | 8021 def GetResourceIdArg(self): |
7651 for arg in self.original_args: | 8022 for arg in self.original_args: |
7652 if hasattr(arg, 'resource_type'): | 8023 if hasattr(arg, 'resource_type'): |
7653 return arg | 8024 return arg |
7654 return None | 8025 return None |
7655 | 8026 |
7656 def __MaybePrependComma(self, arg_string, add_comma): | 8027 def _MaybePrependComma(self, arg_string, add_comma): |
7657 """Adds a comma if arg_string is not empty and add_comma is true.""" | 8028 """Adds a comma if arg_string is not empty and add_comma is true.""" |
7658 comma = "" | 8029 comma = "" |
7659 if add_comma and len(arg_string): | 8030 if add_comma and len(arg_string): |
7660 comma = ", " | 8031 comma = ", " |
7661 return "%s%s" % (comma, arg_string) | 8032 return "%s%s" % (comma, arg_string) |
7662 | 8033 |
7663 def MakeTypedOriginalArgString(self, prefix, add_comma = False): | 8034 def MakeTypedOriginalArgString(self, prefix, add_comma = False): |
7664 """Gets a list of arguments as they are in GL.""" | 8035 """Gets a list of arguments as they are in GL.""" |
7665 args = self.GetOriginalArgs() | 8036 args = self.GetOriginalArgs() |
7666 arg_string = ", ".join( | 8037 arg_string = ", ".join( |
7667 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) | 8038 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) |
7668 return self.__MaybePrependComma(arg_string, add_comma) | 8039 return self._MaybePrependComma(arg_string, add_comma) |
7669 | 8040 |
7670 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): | 8041 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): |
7671 """Gets the list of arguments as they are in GL.""" | 8042 """Gets the list of arguments as they are in GL.""" |
7672 args = self.GetOriginalArgs() | 8043 args = self.GetOriginalArgs() |
7673 arg_string = separator.join( | 8044 arg_string = separator.join( |
7674 ["%s%s" % (prefix, arg.name) for arg in args]) | 8045 ["%s%s" % (prefix, arg.name) for arg in args]) |
7675 return self.__MaybePrependComma(arg_string, add_comma) | 8046 return self._MaybePrependComma(arg_string, add_comma) |
7676 | 8047 |
7677 def MakeTypedHelperArgString(self, prefix, add_comma = False): | 8048 def MakeTypedHelperArgString(self, prefix, add_comma = False): |
7678 """Gets a list of typed GL arguments after removing unneeded arguments.""" | 8049 """Gets a list of typed GL arguments after removing unneeded arguments.""" |
7679 args = self.GetOriginalArgs() | 8050 args = self.GetOriginalArgs() |
7680 arg_string = ", ".join( | 8051 arg_string = ", ".join( |
7681 ["%s %s%s" % ( | 8052 ["%s %s%s" % ( |
7682 arg.type, | 8053 arg.type, |
7683 prefix, | 8054 prefix, |
7684 arg.name, | 8055 arg.name, |
7685 ) for arg in args if not arg.IsConstant()]) | 8056 ) for arg in args if not arg.IsConstant()]) |
7686 return self.__MaybePrependComma(arg_string, add_comma) | 8057 return self._MaybePrependComma(arg_string, add_comma) |
7687 | 8058 |
7688 def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "): | 8059 def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "): |
7689 """Gets a list of GL arguments after removing unneeded arguments.""" | 8060 """Gets a list of GL arguments after removing unneeded arguments.""" |
7690 args = self.GetOriginalArgs() | 8061 args = self.GetOriginalArgs() |
7691 arg_string = separator.join( | 8062 arg_string = separator.join( |
7692 ["%s%s" % (prefix, arg.name) | 8063 ["%s%s" % (prefix, arg.name) |
7693 for arg in args if not arg.IsConstant()]) | 8064 for arg in args if not arg.IsConstant()]) |
7694 return self.__MaybePrependComma(arg_string, add_comma) | 8065 return self._MaybePrependComma(arg_string, add_comma) |
7695 | 8066 |
7696 def MakeTypedPepperArgString(self, prefix): | 8067 def MakeTypedPepperArgString(self, prefix): |
7697 """Gets a list of arguments as they need to be for Pepper.""" | 8068 """Gets a list of arguments as they need to be for Pepper.""" |
7698 if self.GetInfo("pepper_args"): | 8069 if self.GetInfo("pepper_args"): |
7699 return self.GetInfo("pepper_args") | 8070 return self.GetInfo("pepper_args") |
7700 else: | 8071 else: |
7701 return self.MakeTypedOriginalArgString(prefix, False) | 8072 return self.MakeTypedOriginalArgString(prefix, False) |
7702 | 8073 |
7703 def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False): | 8074 def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False): |
7704 """Converts a C type name to the corresponding Pepper IDL type.""" | 8075 """Converts a C type name to the corresponding Pepper IDL type.""" |
(...skipping 28 matching lines...) Expand all Loading... |
7733 def GetPepperName(self): | 8104 def GetPepperName(self): |
7734 if self.GetInfo("pepper_name"): | 8105 if self.GetInfo("pepper_name"): |
7735 return self.GetInfo("pepper_name") | 8106 return self.GetInfo("pepper_name") |
7736 return self.name | 8107 return self.name |
7737 | 8108 |
7738 def MakeTypedCmdArgString(self, prefix, add_comma = False): | 8109 def MakeTypedCmdArgString(self, prefix, add_comma = False): |
7739 """Gets a typed list of arguments as they need to be for command buffers.""" | 8110 """Gets a typed list of arguments as they need to be for command buffers.""" |
7740 args = self.GetCmdArgs() | 8111 args = self.GetCmdArgs() |
7741 arg_string = ", ".join( | 8112 arg_string = ", ".join( |
7742 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) | 8113 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) |
7743 return self.__MaybePrependComma(arg_string, add_comma) | 8114 return self._MaybePrependComma(arg_string, add_comma) |
7744 | 8115 |
7745 def MakeCmdArgString(self, prefix, add_comma = False): | 8116 def MakeCmdArgString(self, prefix, add_comma = False): |
7746 """Gets the list of arguments as they need to be for command buffers.""" | 8117 """Gets the list of arguments as they need to be for command buffers.""" |
7747 args = self.GetCmdArgs() | 8118 args = self.GetCmdArgs() |
7748 arg_string = ", ".join( | 8119 arg_string = ", ".join( |
7749 ["%s%s" % (prefix, arg.name) for arg in args]) | 8120 ["%s%s" % (prefix, arg.name) for arg in args]) |
7750 return self.__MaybePrependComma(arg_string, add_comma) | 8121 return self._MaybePrependComma(arg_string, add_comma) |
7751 | 8122 |
7752 def MakeTypedInitString(self, prefix, add_comma = False): | 8123 def MakeTypedInitString(self, prefix, add_comma = False): |
7753 """Gets a typed list of arguments as they need to be for cmd Init/Set.""" | 8124 """Gets a typed list of arguments as they need to be for cmd Init/Set.""" |
7754 args = self.GetInitArgs() | 8125 args = self.GetInitArgs() |
7755 arg_string = ", ".join( | 8126 arg_string = ", ".join( |
7756 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) | 8127 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) |
7757 return self.__MaybePrependComma(arg_string, add_comma) | 8128 return self._MaybePrependComma(arg_string, add_comma) |
7758 | 8129 |
7759 def MakeInitString(self, prefix, add_comma = False): | 8130 def MakeInitString(self, prefix, add_comma = False): |
7760 """Gets the list of arguments as they need to be for cmd Init/Set.""" | 8131 """Gets the list of arguments as they need to be for cmd Init/Set.""" |
7761 args = self.GetInitArgs() | 8132 args = self.GetInitArgs() |
7762 arg_string = ", ".join( | 8133 arg_string = ", ".join( |
7763 ["%s%s" % (prefix, arg.name) for arg in args]) | 8134 ["%s%s" % (prefix, arg.name) for arg in args]) |
7764 return self.__MaybePrependComma(arg_string, add_comma) | 8135 return self._MaybePrependComma(arg_string, add_comma) |
7765 | 8136 |
7766 def MakeLogArgString(self): | 8137 def MakeLogArgString(self): |
7767 """Makes a string of the arguments for the LOG macros""" | 8138 """Makes a string of the arguments for the LOG macros""" |
7768 args = self.GetOriginalArgs() | 8139 args = self.GetOriginalArgs() |
7769 return ' << ", " << '.join([arg.GetLogArg() for arg in args]) | 8140 return ' << ", " << '.join([arg.GetLogArg() for arg in args]) |
7770 | 8141 |
7771 def WriteCommandDescription(self, file): | 8142 def WriteCommandDescription(self, file): |
7772 """Writes a description of the command.""" | 8143 """Writes a description of the command.""" |
7773 file.Write("//! Command that corresponds to gl%s.\n" % self.original_name) | 8144 file.Write("//! Command that corresponds to gl%s.\n" % self.original_name) |
7774 | 8145 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8062 | 8433 |
8063 def WriteServiceImplementation(self, file): | 8434 def WriteServiceImplementation(self, file): |
8064 """Overridden from Function""" | 8435 """Overridden from Function""" |
8065 self.type_handler.WriteBucketServiceImplementation(self, file) | 8436 self.type_handler.WriteBucketServiceImplementation(self, file) |
8066 | 8437 |
8067 def WriteHandlerImplementation(self, file): | 8438 def WriteHandlerImplementation(self, file): |
8068 """Overridden from Function""" | 8439 """Overridden from Function""" |
8069 self.type_handler.WriteBucketHandlerImplementation(self, file) | 8440 self.type_handler.WriteBucketHandlerImplementation(self, file) |
8070 | 8441 |
8071 def WriteServiceUnitTest(self, file, *extras): | 8442 def WriteServiceUnitTest(self, file, *extras): |
8072 """Writes the service implementation for a command.""" | 8443 """Overridden from Function""" |
8073 self.type_handler.WriteBucketServiceUnitTest(self, file, *extras) | 8444 self.type_handler.WriteBucketServiceUnitTest(self, file, *extras) |
8074 | 8445 |
| 8446 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): |
| 8447 """Overridden from Function""" |
| 8448 args = self.GetOriginalArgs() |
| 8449 arg_string = separator.join( |
| 8450 ["%s%s" % (prefix, arg.name[0:-10] if arg.name.endswith("_bucket_id") |
| 8451 else arg.name) for arg in args]) |
| 8452 return super(BucketFunction, self)._MaybePrependComma(arg_string, add_comma) |
| 8453 |
8075 | 8454 |
8076 def CreateArg(arg_string): | 8455 def CreateArg(arg_string): |
8077 """Creates an Argument.""" | 8456 """Creates an Argument.""" |
8078 arg_parts = arg_string.split() | 8457 arg_parts = arg_string.split() |
8079 if len(arg_parts) == 1 and arg_parts[0] == 'void': | 8458 if len(arg_parts) == 1 and arg_parts[0] == 'void': |
8080 return None | 8459 return None |
8081 # Is this a pointer argument? | 8460 # Is this a pointer argument? |
8082 elif arg_string.find('*') >= 0: | 8461 elif arg_string.find('*') >= 0: |
8083 return PointerArgument( | 8462 return PointerArgument( |
8084 arg_parts[-1], | 8463 arg_parts[-1], |
8085 " ".join(arg_parts[0:-1])) | 8464 " ".join(arg_parts[0:-1])) |
8086 # Is this a resource argument? Must come after pointer check. | 8465 # Is this a resource argument? Must come after pointer check. |
8087 elif arg_parts[0].startswith('GLidBind'): | 8466 elif arg_parts[0].startswith('GLidBind'): |
8088 return ResourceIdBindArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8467 return ResourceIdBindArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8089 elif arg_parts[0].startswith('GLidZero'): | 8468 elif arg_parts[0].startswith('GLidZero'): |
8090 return ResourceIdZeroArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8469 return ResourceIdZeroArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8091 elif arg_parts[0].startswith('GLid'): | 8470 elif arg_parts[0].startswith('GLid'): |
8092 return ResourceIdArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8471 return ResourceIdArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8093 elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6: | 8472 elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6: |
8094 return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8473 return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
| 8474 elif arg_parts[0].startswith('GLbitfield') and len(arg_parts[0]) > 10: |
| 8475 return BitFieldArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8095 elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9: | 8476 elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9: |
8096 return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8477 return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8097 elif arg_parts[0].startswith('GLboolean'): | 8478 elif arg_parts[0].startswith('GLboolean'): |
8098 return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8479 return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8099 elif arg_parts[0].startswith('GLintUniformLocation'): | 8480 elif arg_parts[0].startswith('GLintUniformLocation'): |
8100 return UniformLocationArgument(arg_parts[-1]) | 8481 return UniformLocationArgument(arg_parts[-1]) |
8101 elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and | 8482 elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and |
8102 not arg_parts[0].startswith('GLintptr')): | 8483 not arg_parts[0].startswith('GLintptr')): |
8103 return IntArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) | 8484 return IntArgument(arg_parts[-1], " ".join(arg_parts[0:-1])) |
8104 elif (arg_parts[0].startswith('GLsizeiNotNegative') or | 8485 elif (arg_parts[0].startswith('GLsizeiNotNegative') or |
(...skipping 1304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9409 Format(gen.generated_cpp_filenames) | 9790 Format(gen.generated_cpp_filenames) |
9410 | 9791 |
9411 if gen.errors > 0: | 9792 if gen.errors > 0: |
9412 print "%d errors" % gen.errors | 9793 print "%d errors" % gen.errors |
9413 return 1 | 9794 return 1 |
9414 return 0 | 9795 return 0 |
9415 | 9796 |
9416 | 9797 |
9417 if __name__ == '__main__': | 9798 if __name__ == '__main__': |
9418 sys.exit(main(sys.argv[1:])) | 9799 sys.exit(main(sys.argv[1:])) |
OLD | NEW |