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

Side by Side Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 863253002: Update from https://crrev.com/312600 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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:]))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698