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 4956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4967 """ % {'name': func.name}) | 4967 """ % {'name': func.name}) |
4968 if func.IsUnsafe(): | 4968 if func.IsUnsafe(): |
4969 f.write("""if (!unsafe_es3_apis_enabled()) | 4969 f.write("""if (!unsafe_es3_apis_enabled()) |
4970 return error::kUnknownCommand; | 4970 return error::kUnknownCommand; |
4971 """) | 4971 """) |
4972 f.write("""const gles2::cmds::%(name)s& c = | 4972 f.write("""const gles2::cmds::%(name)s& c = |
4973 *static_cast<const gles2::cmds::%(name)s*>(cmd_data); | 4973 *static_cast<const gles2::cmds::%(name)s*>(cmd_data); |
4974 (void)c; | 4974 (void)c; |
4975 """ % {'name': func.name}) | 4975 """ % {'name': func.name}) |
4976 | 4976 |
4977 def WriteServiceImplementation(self, func, f): | 4977 def WriteServiceHandlerArgGetCode(self, func, f): |
4978 """Writes the service implementation for a command.""" | 4978 """Writes the argument unpack code for service handlers.""" |
4979 self.WriteServiceHandlerFunctionHeader(func, f) | |
4980 self.WriteHandlerExtensionCheck(func, f) | |
4981 self.WriteHandlerDeferReadWrite(func, f); | |
4982 if len(func.GetOriginalArgs()) > 0: | 4979 if len(func.GetOriginalArgs()) > 0: |
4983 last_arg = func.GetLastOriginalArg() | 4980 last_arg = func.GetLastOriginalArg() |
4984 all_but_last_arg = func.GetOriginalArgs()[:-1] | 4981 all_but_last_arg = func.GetOriginalArgs()[:-1] |
4985 for arg in all_but_last_arg: | 4982 for arg in all_but_last_arg: |
4986 arg.WriteGetCode(f) | 4983 arg.WriteGetCode(f) |
4987 self.WriteGetDataSizeCode(func, f) | 4984 self.WriteGetDataSizeCode(func, f) |
4988 last_arg.WriteGetCode(f) | 4985 last_arg.WriteGetCode(f) |
| 4986 |
| 4987 def WriteImmediateServiceHandlerArgGetCode(self, func, f): |
| 4988 """Writes the argument unpack code for immediate service handlers.""" |
| 4989 for arg in func.GetOriginalArgs(): |
| 4990 if arg.IsPointer(): |
| 4991 self.WriteGetDataSizeCode(func, f) |
| 4992 arg.WriteGetCode(f) |
| 4993 |
| 4994 def WriteBucketServiceHandlerArgGetCode(self, func, f): |
| 4995 """Writes the argument unpack code for bucket service handlers.""" |
| 4996 for arg in func.GetCmdArgs(): |
| 4997 arg.WriteGetCode(f) |
| 4998 |
| 4999 def WriteServiceImplementation(self, func, f): |
| 5000 """Writes the service implementation for a command.""" |
| 5001 self.WriteServiceHandlerFunctionHeader(func, f) |
| 5002 self.WriteHandlerExtensionCheck(func, f) |
| 5003 self.WriteHandlerDeferReadWrite(func, f); |
| 5004 self.WriteServiceHandlerArgGetCode(func, f) |
4989 func.WriteHandlerValidation(f) | 5005 func.WriteHandlerValidation(f) |
4990 func.WriteHandlerImplementation(f) | 5006 func.WriteHandlerImplementation(f) |
4991 f.write(" return error::kNoError;\n") | 5007 f.write(" return error::kNoError;\n") |
4992 f.write("}\n") | 5008 f.write("}\n") |
4993 f.write("\n") | 5009 f.write("\n") |
4994 | 5010 |
4995 def WriteImmediateServiceImplementation(self, func, f): | 5011 def WriteImmediateServiceImplementation(self, func, f): |
4996 """Writes the service implementation for an immediate version of command.""" | 5012 """Writes the service implementation for an immediate version of command.""" |
4997 self.WriteServiceHandlerFunctionHeader(func, f) | 5013 self.WriteServiceHandlerFunctionHeader(func, f) |
4998 self.WriteHandlerExtensionCheck(func, f) | 5014 self.WriteHandlerExtensionCheck(func, f) |
4999 self.WriteHandlerDeferReadWrite(func, f); | 5015 self.WriteHandlerDeferReadWrite(func, f); |
5000 for arg in func.GetOriginalArgs(): | 5016 self.WriteImmediateServiceHandlerArgGetCode(func, f) |
5001 if arg.IsPointer(): | |
5002 self.WriteGetDataSizeCode(func, f) | |
5003 arg.WriteGetCode(f) | |
5004 func.WriteHandlerValidation(f) | 5017 func.WriteHandlerValidation(f) |
5005 func.WriteHandlerImplementation(f) | 5018 func.WriteHandlerImplementation(f) |
5006 f.write(" return error::kNoError;\n") | 5019 f.write(" return error::kNoError;\n") |
5007 f.write("}\n") | 5020 f.write("}\n") |
5008 f.write("\n") | 5021 f.write("\n") |
5009 | 5022 |
5010 def WriteBucketServiceImplementation(self, func, f): | 5023 def WriteBucketServiceImplementation(self, func, f): |
5011 """Writes the service implementation for a bucket version of command.""" | 5024 """Writes the service implementation for a bucket version of command.""" |
5012 self.WriteServiceHandlerFunctionHeader(func, f) | 5025 self.WriteServiceHandlerFunctionHeader(func, f) |
5013 self.WriteHandlerExtensionCheck(func, f) | 5026 self.WriteHandlerExtensionCheck(func, f) |
5014 self.WriteHandlerDeferReadWrite(func, f); | 5027 self.WriteHandlerDeferReadWrite(func, f); |
5015 for arg in func.GetCmdArgs(): | 5028 self.WriteBucketServiceHandlerArgGetCode(func, f) |
5016 arg.WriteGetCode(f) | |
5017 func.WriteHandlerValidation(f) | 5029 func.WriteHandlerValidation(f) |
5018 func.WriteHandlerImplementation(f) | 5030 func.WriteHandlerImplementation(f) |
5019 f.write(" return error::kNoError;\n") | 5031 f.write(" return error::kNoError;\n") |
5020 f.write("}\n") | 5032 f.write("}\n") |
5021 f.write("\n") | 5033 f.write("\n") |
5022 | 5034 |
| 5035 def WritePassthroughServiceFunctionHeader(self, func, f): |
| 5036 """Writes function header for service passthrough handlers.""" |
| 5037 f.write("""error::Error GLES2DecoderPassthroughImpl::Handle%(name)s( |
| 5038 uint32_t immediate_data_size, const void* cmd_data) { |
| 5039 """ % {'name': func.name}) |
| 5040 f.write("""const gles2::cmds::%(name)s& c = |
| 5041 *static_cast<const gles2::cmds::%(name)s*>(cmd_data); |
| 5042 (void)c; |
| 5043 """ % {'name': func.name}) |
| 5044 |
| 5045 def WritePassthroughServiceFunctionDoerCall(self, func, f): |
| 5046 """Writes the function call to the passthrough service doer.""" |
| 5047 f.write(""" error::Error error = Do%(name)s(%(args)s); |
| 5048 if (error != error::kNoError) { |
| 5049 return error; |
| 5050 }""" % {'name': func.original_name, |
| 5051 'args': func.MakePassthroughServiceDoerArgString("")}) |
| 5052 |
| 5053 def WritePassthroughServiceImplementation(self, func, f): |
| 5054 """Writes the service implementation for a command.""" |
| 5055 self.WritePassthroughServiceFunctionHeader(func, f) |
| 5056 self.WriteServiceHandlerArgGetCode(func, f) |
| 5057 self.WritePassthroughServiceFunctionDoerCall(func, f) |
| 5058 f.write(" return error::kNoError;\n") |
| 5059 f.write("}\n") |
| 5060 f.write("\n") |
| 5061 |
| 5062 def WritePassthroughImmediateServiceImplementation(self, func, f): |
| 5063 """Writes the service implementation for a command.""" |
| 5064 self.WritePassthroughServiceFunctionHeader(func, f) |
| 5065 self.WriteImmediateServiceHandlerArgGetCode(func, f) |
| 5066 self.WritePassthroughServiceFunctionDoerCall(func, f) |
| 5067 f.write(" return error::kNoError;\n") |
| 5068 f.write("}\n") |
| 5069 f.write("\n") |
| 5070 |
| 5071 def WritePassthroughBucketServiceImplementation(self, func, f): |
| 5072 """Writes the service implementation for a command.""" |
| 5073 self.WritePassthroughServiceFunctionHeader(func, f) |
| 5074 self.WriteBucketServiceHandlerArgGetCode(func, f) |
| 5075 self.WritePassthroughServiceFunctionDoerCall(func, f) |
| 5076 f.write(" return error::kNoError;\n") |
| 5077 f.write("}\n") |
| 5078 f.write("\n") |
| 5079 |
5023 def WriteHandlerExtensionCheck(self, func, f): | 5080 def WriteHandlerExtensionCheck(self, func, f): |
5024 if func.GetInfo('extension_flag'): | 5081 if func.GetInfo('extension_flag'): |
5025 f.write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) | 5082 f.write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) |
5026 f.write(" return error::kUnknownCommand;") | 5083 f.write(" return error::kUnknownCommand;") |
5027 f.write(" }\n\n") | 5084 f.write(" }\n\n") |
5028 | 5085 |
5029 def WriteHandlerDeferReadWrite(self, func, f): | 5086 def WriteHandlerDeferReadWrite(self, func, f): |
5030 """Writes the code to handle deferring reads or writes.""" | 5087 """Writes the code to handle deferring reads or writes.""" |
5031 defer_draws = func.GetInfo('defer_draws') | 5088 defer_draws = func.GetInfo('defer_draws') |
5032 defer_reads = func.GetInfo('defer_reads') | 5089 defer_reads = func.GetInfo('defer_reads') |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5649 pass | 5706 pass |
5650 | 5707 |
5651 def WriteImmediateServiceImplementation(self, func, f): | 5708 def WriteImmediateServiceImplementation(self, func, f): |
5652 """Overrriden from TypeHandler.""" | 5709 """Overrriden from TypeHandler.""" |
5653 pass | 5710 pass |
5654 | 5711 |
5655 def WriteBucketServiceImplementation(self, func, f): | 5712 def WriteBucketServiceImplementation(self, func, f): |
5656 """Overrriden from TypeHandler.""" | 5713 """Overrriden from TypeHandler.""" |
5657 pass | 5714 pass |
5658 | 5715 |
| 5716 def WritePassthroughServiceImplementation(self, func, f): |
| 5717 """Overrriden from TypeHandler.""" |
| 5718 pass |
| 5719 |
| 5720 def WritePassthroughImmediateServiceImplementation(self, func, f): |
| 5721 """Overrriden from TypeHandler.""" |
| 5722 pass |
| 5723 |
| 5724 def WritePassthroughBucketServiceImplementation(self, func, f): |
| 5725 """Overrriden from TypeHandler.""" |
| 5726 pass |
| 5727 |
5659 def WriteServiceUnitTest(self, func, f, *extras): | 5728 def WriteServiceUnitTest(self, func, f, *extras): |
5660 """Overrriden from TypeHandler.""" | 5729 """Overrriden from TypeHandler.""" |
5661 pass | 5730 pass |
5662 | 5731 |
5663 def WriteImmediateServiceUnitTest(self, func, f, *extras): | 5732 def WriteImmediateServiceUnitTest(self, func, f, *extras): |
5664 """Overrriden from TypeHandler.""" | 5733 """Overrriden from TypeHandler.""" |
5665 pass | 5734 pass |
5666 | 5735 |
5667 def WriteImmediateCmdGetTotalSize(self, func, f): | 5736 def WriteImmediateCmdGetTotalSize(self, func, f): |
5668 """Overrriden from TypeHandler.""" | 5737 """Overrriden from TypeHandler.""" |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5891 def WriteImmediateServiceUnitTest(self, func, f, *extras): | 5960 def WriteImmediateServiceUnitTest(self, func, f, *extras): |
5892 """Overrriden from TypeHandler.""" | 5961 """Overrriden from TypeHandler.""" |
5893 pass | 5962 pass |
5894 | 5963 |
5895 def WriteBucketServiceImplementation(self, func, f): | 5964 def WriteBucketServiceImplementation(self, func, f): |
5896 """Overrriden from TypeHandler.""" | 5965 """Overrriden from TypeHandler.""" |
5897 if ((not func.name == 'CompressedTexSubImage2DBucket') and | 5966 if ((not func.name == 'CompressedTexSubImage2DBucket') and |
5898 (not func.name == 'CompressedTexSubImage3DBucket')): | 5967 (not func.name == 'CompressedTexSubImage3DBucket')): |
5899 TypeHandler.WriteBucketServiceImplemenation(self, func, f) | 5968 TypeHandler.WriteBucketServiceImplemenation(self, func, f) |
5900 | 5969 |
| 5970 def WritePassthroughBucketServiceImplementation(self, func, f): |
| 5971 """Overrriden from TypeHandler.""" |
| 5972 if ((not func.name == 'CompressedTexSubImage2DBucket') and |
| 5973 (not func.name == 'CompressedTexSubImage3DBucket')): |
| 5974 TypeHandler.WritePassthroughBucketServiceImplementation(self, func, f) |
5901 | 5975 |
5902 class BindHandler(TypeHandler): | 5976 class BindHandler(TypeHandler): |
5903 """Handler for glBind___ type functions.""" | 5977 """Handler for glBind___ type functions.""" |
5904 | 5978 |
5905 def WriteServiceUnitTest(self, func, f, *extras): | 5979 def WriteServiceUnitTest(self, func, f, *extras): |
5906 """Overrriden from TypeHandler.""" | 5980 """Overrriden from TypeHandler.""" |
5907 | 5981 |
5908 if len(func.GetOriginalArgs()) == 1: | 5982 if len(func.GetOriginalArgs()) == 1: |
5909 valid_test = """ | 5983 valid_test = """ |
5910 TEST_P(%(test_name)s, %(name)sValidArgs) { | 5984 TEST_P(%(test_name)s, %(name)sValidArgs) { |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6488 (func.name, func.MakeCmdArgString(""))) | 6562 (func.name, func.MakeCmdArgString(""))) |
6489 f.write(' GPU_CLIENT_LOG("returned " << client_id);\n') | 6563 f.write(' GPU_CLIENT_LOG("returned " << client_id);\n') |
6490 f.write(" CheckGLError();\n") | 6564 f.write(" CheckGLError();\n") |
6491 if func.return_type == "GLsync": | 6565 if func.return_type == "GLsync": |
6492 f.write(" return reinterpret_cast<GLsync>(client_id);\n") | 6566 f.write(" return reinterpret_cast<GLsync>(client_id);\n") |
6493 else: | 6567 else: |
6494 f.write(" return client_id;\n") | 6568 f.write(" return client_id;\n") |
6495 f.write("}\n") | 6569 f.write("}\n") |
6496 f.write("\n") | 6570 f.write("\n") |
6497 | 6571 |
| 6572 def WritePassthroughServiceImplementation(self, func, f): |
| 6573 """Overrriden from TypeHandler.""" |
| 6574 pass |
6498 | 6575 |
6499 class DeleteHandler(TypeHandler): | 6576 class DeleteHandler(TypeHandler): |
6500 """Handler for glDelete___ single resource type functions.""" | 6577 """Handler for glDelete___ single resource type functions.""" |
6501 | 6578 |
6502 def WriteServiceImplementation(self, func, f): | 6579 def WriteServiceImplementation(self, func, f): |
6503 """Overrriden from TypeHandler.""" | 6580 """Overrriden from TypeHandler.""" |
6504 if func.IsUnsafe(): | 6581 if func.IsUnsafe(): |
6505 TypeHandler.WriteServiceImplementation(self, func, f) | 6582 TypeHandler.WriteServiceImplementation(self, func, f) |
6506 # HandleDeleteShader and HandleDeleteProgram are manually written. | 6583 # HandleDeleteShader and HandleDeleteProgram are manually written. |
6507 pass | 6584 pass |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6784 f.write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n") | 6861 f.write(" RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n") |
6785 f.write(" EXPECT_EQ(0, memcmp(ids, ImmediateDataAddress(&cmd),\n") | 6862 f.write(" EXPECT_EQ(0, memcmp(ids, ImmediateDataAddress(&cmd),\n") |
6786 f.write(" sizeof(ids)));\n") | 6863 f.write(" sizeof(ids)));\n") |
6787 f.write("}\n") | 6864 f.write("}\n") |
6788 f.write("\n") | 6865 f.write("\n") |
6789 | 6866 |
6790 | 6867 |
6791 class GETnHandler(TypeHandler): | 6868 class GETnHandler(TypeHandler): |
6792 """Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions.""" | 6869 """Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions.""" |
6793 | 6870 |
| 6871 def InitFunction(self, func): |
| 6872 """Overrriden from TypeHandler.""" |
| 6873 TypeHandler.InitFunction(self, func) |
| 6874 |
| 6875 if func.name == 'GetSynciv': |
| 6876 return |
| 6877 |
| 6878 arg_insert_point = len(func.passthrough_service_doer_args) - 1; |
| 6879 func.passthrough_service_doer_args.insert( |
| 6880 arg_insert_point, Argument('length', 'GLsizei*')) |
| 6881 func.passthrough_service_doer_args.insert( |
| 6882 arg_insert_point, Argument('bufsize', 'GLsizei')) |
| 6883 |
6794 def NeedsDataTransferFunction(self, func): | 6884 def NeedsDataTransferFunction(self, func): |
6795 """Overriden from TypeHandler.""" | 6885 """Overriden from TypeHandler.""" |
6796 return False | 6886 return False |
6797 | 6887 |
6798 def WriteServiceImplementation(self, func, f): | 6888 def WriteServiceImplementation(self, func, f): |
6799 """Overrriden from TypeHandler.""" | 6889 """Overrriden from TypeHandler.""" |
6800 self.WriteServiceHandlerFunctionHeader(func, f) | 6890 self.WriteServiceHandlerFunctionHeader(func, f) |
6801 last_arg = func.GetLastOriginalArg() | 6891 last_arg = func.GetLastOriginalArg() |
6802 # All except shm_id and shm_offset. | 6892 # All except shm_id and shm_offset. |
6803 all_but_last_args = func.GetCmdArgs()[:-2] | 6893 all_but_last_args = func.GetCmdArgs()[:-2] |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6837 code = """ GLenum error = LOCAL_PEEK_GL_ERROR("%(func_name)s"); | 6927 code = """ GLenum error = LOCAL_PEEK_GL_ERROR("%(func_name)s"); |
6838 if (error == GL_NO_ERROR) { | 6928 if (error == GL_NO_ERROR) { |
6839 result->SetNumResults(num_values); | 6929 result->SetNumResults(num_values); |
6840 } | 6930 } |
6841 return error::kNoError; | 6931 return error::kNoError; |
6842 } | 6932 } |
6843 | 6933 |
6844 """ | 6934 """ |
6845 f.write(code % {'func_name': func.name}) | 6935 f.write(code % {'func_name': func.name}) |
6846 | 6936 |
| 6937 def WritePassthroughServiceImplementation(self, func, f): |
| 6938 """Overrriden from TypeHandler.""" |
| 6939 self.WritePassthroughServiceFunctionHeader(func, f) |
| 6940 last_arg = func.GetLastOriginalArg() |
| 6941 # All except shm_id and shm_offset. |
| 6942 all_but_last_args = func.GetCmdArgs()[:-2] |
| 6943 for arg in all_but_last_args: |
| 6944 arg.WriteGetCode(f) |
| 6945 |
| 6946 code = """ unsigned int buffer_size = 0; |
| 6947 typedef cmds::%(func_name)s::Result Result; |
| 6948 Result* result = GetSharedMemoryAndSizeAs<Result*>( |
| 6949 c.%(last_arg_name)s_shm_id, c.%(last_arg_name)s_shm_offset, |
| 6950 &buffer_size); |
| 6951 %(last_arg_type)s %(last_arg_name)s = result ? result->GetData() : NULL; |
| 6952 if (%(last_arg_name)s == NULL) { |
| 6953 return error::kOutOfBounds; |
| 6954 } |
| 6955 GLsizei bufsize = Result::ComputeMaxResults(buffer_size); |
| 6956 GLsizei written_values = 0; |
| 6957 GLsizei* length = &written_values; |
| 6958 """ |
| 6959 f.write(code % { |
| 6960 'last_arg_type': last_arg.type, |
| 6961 'last_arg_name': last_arg.name, |
| 6962 'func_name': func.name, |
| 6963 }) |
| 6964 |
| 6965 self.WritePassthroughServiceFunctionDoerCall(func, f) |
| 6966 |
| 6967 code = """ if (written_values > bufsize) { |
| 6968 return error::kOutOfBounds; |
| 6969 } |
| 6970 result->SetNumResults(written_values); |
| 6971 return error::kNoError; |
| 6972 } |
| 6973 |
| 6974 """ |
| 6975 f.write(code % {'func_name': func.name}) |
| 6976 |
6847 def WriteGLES2Implementation(self, func, f): | 6977 def WriteGLES2Implementation(self, func, f): |
6848 """Overrriden from TypeHandler.""" | 6978 """Overrriden from TypeHandler.""" |
6849 impl_decl = func.GetInfo('impl_decl') | 6979 impl_decl = func.GetInfo('impl_decl') |
6850 if impl_decl == None or impl_decl == True: | 6980 if impl_decl == None or impl_decl == True: |
6851 f.write("%s GLES2Implementation::%s(%s) {\n" % | 6981 f.write("%s GLES2Implementation::%s(%s) {\n" % |
6852 (func.return_type, func.original_name, | 6982 (func.return_type, func.original_name, |
6853 func.MakeTypedOriginalArgString(""))) | 6983 func.MakeTypedOriginalArgString(""))) |
6854 f.write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") | 6984 f.write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
6855 func.WriteDestinationInitalizationValidation(f) | 6985 func.WriteDestinationInitalizationValidation(f) |
6856 self.WriteClientGLCallLog(func, f) | 6986 self.WriteClientGLCallLog(func, f) |
(...skipping 1416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8273 | 8403 |
8274 class IsHandler(TypeHandler): | 8404 class IsHandler(TypeHandler): |
8275 """Handler for glIs____ type and glGetError functions.""" | 8405 """Handler for glIs____ type and glGetError functions.""" |
8276 | 8406 |
8277 def InitFunction(self, func): | 8407 def InitFunction(self, func): |
8278 """Overrriden from TypeHandler.""" | 8408 """Overrriden from TypeHandler.""" |
8279 func.AddCmdArg(Argument("result_shm_id", 'uint32_t')) | 8409 func.AddCmdArg(Argument("result_shm_id", 'uint32_t')) |
8280 func.AddCmdArg(Argument("result_shm_offset", 'uint32_t')) | 8410 func.AddCmdArg(Argument("result_shm_offset", 'uint32_t')) |
8281 if func.GetInfo('result') == None: | 8411 if func.GetInfo('result') == None: |
8282 func.AddInfo('result', ['uint32_t']) | 8412 func.AddInfo('result', ['uint32_t']) |
| 8413 func.passthrough_service_doer_args.append(Argument('result', 'uint32_t*')) |
8283 | 8414 |
8284 def WriteServiceUnitTest(self, func, f, *extras): | 8415 def WriteServiceUnitTest(self, func, f, *extras): |
8285 """Overrriden from TypeHandler.""" | 8416 """Overrriden from TypeHandler.""" |
8286 valid_test = """ | 8417 valid_test = """ |
8287 TEST_P(%(test_name)s, %(name)sValidArgs) { | 8418 TEST_P(%(test_name)s, %(name)sValidArgs) { |
8288 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); | 8419 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); |
8289 SpecializedSetup<cmds::%(name)s, 0>(true); | 8420 SpecializedSetup<cmds::%(name)s, 0>(true); |
8290 cmds::%(name)s cmd; | 8421 cmds::%(name)s cmd; |
8291 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);""" | 8422 cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);""" |
8292 if func.IsUnsafe(): | 8423 if func.IsUnsafe(): |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8361 } | 8492 } |
8362 """ | 8493 """ |
8363 f.write(code % {'func_name': func.name}) | 8494 f.write(code % {'func_name': func.name}) |
8364 func.WriteHandlerValidation(f) | 8495 func.WriteHandlerValidation(f) |
8365 f.write(" *result_dst = %s(%s);\n" % | 8496 f.write(" *result_dst = %s(%s);\n" % |
8366 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) | 8497 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
8367 f.write(" return error::kNoError;\n") | 8498 f.write(" return error::kNoError;\n") |
8368 f.write("}\n") | 8499 f.write("}\n") |
8369 f.write("\n") | 8500 f.write("\n") |
8370 | 8501 |
| 8502 def WritePassthroughServiceImplementation(self, func, f): |
| 8503 """Overrriden from TypeHandler.""" |
| 8504 self.WritePassthroughServiceFunctionHeader(func, f) |
| 8505 self.WriteServiceHandlerArgGetCode(func, f) |
| 8506 |
| 8507 code = """ typedef cmds::%(func_name)s::Result Result; |
| 8508 Result* result = GetSharedMemoryAs<Result*>( |
| 8509 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 8510 if (!result) { |
| 8511 return error::kOutOfBounds; |
| 8512 } |
| 8513 """ |
| 8514 f.write(code % {'func_name': func.name}) |
| 8515 self.WritePassthroughServiceFunctionDoerCall(func, f) |
| 8516 f.write(" return error::kNoError;\n") |
| 8517 f.write("}\n") |
| 8518 f.write("\n") |
| 8519 |
8371 def WriteGLES2Implementation(self, func, f): | 8520 def WriteGLES2Implementation(self, func, f): |
8372 """Overrriden from TypeHandler.""" | 8521 """Overrriden from TypeHandler.""" |
8373 impl_func = func.GetInfo('impl_func') | 8522 impl_func = func.GetInfo('impl_func') |
8374 if impl_func == None or impl_func == True: | 8523 if impl_func == None or impl_func == True: |
8375 error_value = func.GetInfo("error_value") or "GL_FALSE" | 8524 error_value = func.GetInfo("error_value") or "GL_FALSE" |
8376 f.write("%s GLES2Implementation::%s(%s) {\n" % | 8525 f.write("%s GLES2Implementation::%s(%s) {\n" % |
8377 (func.return_type, func.original_name, | 8526 (func.return_type, func.original_name, |
8378 func.MakeTypedOriginalArgString(""))) | 8527 func.MakeTypedOriginalArgString(""))) |
8379 f.write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") | 8528 f.write(" GPU_CLIENT_SINGLE_THREAD_CHECK();\n") |
8380 self.WriteTraceEvent(func, f) | 8529 self.WriteTraceEvent(func, f) |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8550 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8699 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8551 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 8700 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
8552 } | 8701 } |
8553 """ | 8702 """ |
8554 self.WriteValidUnitTest(func, f, invalid_test, *extras) | 8703 self.WriteValidUnitTest(func, f, invalid_test, *extras) |
8555 | 8704 |
8556 def WriteServiceImplementation(self, func, f): | 8705 def WriteServiceImplementation(self, func, f): |
8557 """Overrriden from TypeHandler.""" | 8706 """Overrriden from TypeHandler.""" |
8558 pass | 8707 pass |
8559 | 8708 |
| 8709 def WritePassthroughServiceImplementation(self, func, f): |
| 8710 """Overrriden from TypeHandler.""" |
| 8711 pass |
| 8712 |
8560 class NamedType(object): | 8713 class NamedType(object): |
8561 """A class that represents a type of an argument in a client function. | 8714 """A class that represents a type of an argument in a client function. |
8562 | 8715 |
8563 A type of an argument that is to be passed through in the command buffer | 8716 A type of an argument that is to be passed through in the command buffer |
8564 command. Currently used only for the arguments that are specificly named in | 8717 command. Currently used only for the arguments that are specificly named in |
8565 the 'cmd_buffer_functions.txt' f, mostly enums. | 8718 the 'cmd_buffer_functions.txt' f, mostly enums. |
8566 """ | 8719 """ |
8567 | 8720 |
8568 def __init__(self, info): | 8721 def __init__(self, info): |
8569 assert not 'is_complete' in info or info['is_complete'] == True | 8722 assert not 'is_complete' in info or info['is_complete'] == True |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9385 self.name = name | 9538 self.name = name |
9386 self.original_name = info['original_name'] | 9539 self.original_name = info['original_name'] |
9387 | 9540 |
9388 self.original_args = self.ParseArgs(info['original_args']) | 9541 self.original_args = self.ParseArgs(info['original_args']) |
9389 | 9542 |
9390 if 'cmd_args' in info: | 9543 if 'cmd_args' in info: |
9391 self.args_for_cmds = self.ParseArgs(info['cmd_args']) | 9544 self.args_for_cmds = self.ParseArgs(info['cmd_args']) |
9392 else: | 9545 else: |
9393 self.args_for_cmds = self.original_args[:] | 9546 self.args_for_cmds = self.original_args[:] |
9394 | 9547 |
| 9548 self.passthrough_service_doer_args = self.original_args[:] |
| 9549 |
9395 self.return_type = info['return_type'] | 9550 self.return_type = info['return_type'] |
9396 if self.return_type != 'void': | 9551 if self.return_type != 'void': |
9397 self.return_arg = CreateArg(info['return_type'] + " result") | 9552 self.return_arg = CreateArg(info['return_type'] + " result") |
9398 else: | 9553 else: |
9399 self.return_arg = None | 9554 self.return_arg = None |
9400 | 9555 |
9401 self.num_pointer_args = sum( | 9556 self.num_pointer_args = sum( |
9402 [1 for arg in self.args_for_cmds if arg.IsPointer()]) | 9557 [1 for arg in self.args_for_cmds if arg.IsPointer()]) |
9403 if self.num_pointer_args > 0: | 9558 if self.num_pointer_args > 0: |
9404 for arg in reversed(self.original_args): | 9559 for arg in reversed(self.original_args): |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9542 return [arg for arg in self.args_for_cmds if arg.IsConstant()] | 9697 return [arg for arg in self.args_for_cmds if arg.IsConstant()] |
9543 | 9698 |
9544 def GetInitArgs(self): | 9699 def GetInitArgs(self): |
9545 """Gets the init args for this function.""" | 9700 """Gets the init args for this function.""" |
9546 return self.init_args | 9701 return self.init_args |
9547 | 9702 |
9548 def GetOriginalArgs(self): | 9703 def GetOriginalArgs(self): |
9549 """Gets the original arguments to this function.""" | 9704 """Gets the original arguments to this function.""" |
9550 return self.original_args | 9705 return self.original_args |
9551 | 9706 |
| 9707 def GetPassthroughServiceDoerArgs(self): |
| 9708 """Gets the original arguments to this function.""" |
| 9709 return self.passthrough_service_doer_args |
| 9710 |
9552 def GetLastOriginalArg(self): | 9711 def GetLastOriginalArg(self): |
9553 """Gets the last original argument to this function.""" | 9712 """Gets the last original argument to this function.""" |
9554 return self.original_args[len(self.original_args) - 1] | 9713 return self.original_args[len(self.original_args) - 1] |
9555 | 9714 |
9556 def GetLastOriginalPointerArg(self): | 9715 def GetLastOriginalPointerArg(self): |
9557 return self.last_original_pointer_arg | 9716 return self.last_original_pointer_arg |
9558 | 9717 |
9559 def GetResourceIdArg(self): | 9718 def GetResourceIdArg(self): |
9560 for arg in self.original_args: | 9719 for arg in self.original_args: |
9561 if hasattr(arg, 'resource_type'): | 9720 if hasattr(arg, 'resource_type'): |
(...skipping 14 matching lines...) Expand all Loading... |
9576 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) | 9735 ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args]) |
9577 return self._MaybePrependComma(arg_string, add_comma) | 9736 return self._MaybePrependComma(arg_string, add_comma) |
9578 | 9737 |
9579 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): | 9738 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): |
9580 """Gets the list of arguments as they are in GL.""" | 9739 """Gets the list of arguments as they are in GL.""" |
9581 args = self.GetOriginalArgs() | 9740 args = self.GetOriginalArgs() |
9582 arg_string = separator.join( | 9741 arg_string = separator.join( |
9583 ["%s%s" % (prefix, arg.name) for arg in args]) | 9742 ["%s%s" % (prefix, arg.name) for arg in args]) |
9584 return self._MaybePrependComma(arg_string, add_comma) | 9743 return self._MaybePrependComma(arg_string, add_comma) |
9585 | 9744 |
| 9745 def MakePassthroughServiceDoerArgString(self, prefix, add_comma = False, |
| 9746 separator = ", "): |
| 9747 """Gets the list of arguments as they are in used by the passthrough |
| 9748 service doer function.""" |
| 9749 args = self.GetPassthroughServiceDoerArgs() |
| 9750 arg_string = separator.join( |
| 9751 ["%s%s" % (prefix, arg.name) for arg in args]) |
| 9752 return self._MaybePrependComma(arg_string, add_comma) |
| 9753 |
9586 def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "): | 9754 def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "): |
9587 """Gets a list of GL arguments after removing unneeded arguments.""" | 9755 """Gets a list of GL arguments after removing unneeded arguments.""" |
9588 args = self.GetOriginalArgs() | 9756 args = self.GetOriginalArgs() |
9589 arg_string = separator.join( | 9757 arg_string = separator.join( |
9590 ["%s%s" % (prefix, arg.name) | 9758 ["%s%s" % (prefix, arg.name) |
9591 for arg in args if not arg.IsConstant()]) | 9759 for arg in args if not arg.IsConstant()]) |
9592 return self._MaybePrependComma(arg_string, add_comma) | 9760 return self._MaybePrependComma(arg_string, add_comma) |
9593 | 9761 |
9594 def MakeTypedPepperArgString(self, prefix): | 9762 def MakeTypedPepperArgString(self, prefix): |
9595 """Gets a list of arguments as they need to be for Pepper.""" | 9763 """Gets a list of arguments as they need to be for Pepper.""" |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9749 self.type_handler.WriteDocs(self, f) | 9917 self.type_handler.WriteDocs(self, f) |
9750 | 9918 |
9751 def WriteCmdHelper(self, f): | 9919 def WriteCmdHelper(self, f): |
9752 """Writes the cmd's helper.""" | 9920 """Writes the cmd's helper.""" |
9753 self.type_handler.WriteCmdHelper(self, f) | 9921 self.type_handler.WriteCmdHelper(self, f) |
9754 | 9922 |
9755 def WriteServiceImplementation(self, f): | 9923 def WriteServiceImplementation(self, f): |
9756 """Writes the service implementation for a command.""" | 9924 """Writes the service implementation for a command.""" |
9757 self.type_handler.WriteServiceImplementation(self, f) | 9925 self.type_handler.WriteServiceImplementation(self, f) |
9758 | 9926 |
| 9927 def WritePassthroughServiceImplementation(self, f): |
| 9928 """Writes the service implementation for a command.""" |
| 9929 self.type_handler.WritePassthroughServiceImplementation(self, f) |
| 9930 |
9759 def WriteServiceUnitTest(self, f, *extras): | 9931 def WriteServiceUnitTest(self, f, *extras): |
9760 """Writes the service implementation for a command.""" | 9932 """Writes the service implementation for a command.""" |
9761 self.type_handler.WriteServiceUnitTest(self, f, *extras) | 9933 self.type_handler.WriteServiceUnitTest(self, f, *extras) |
9762 | 9934 |
9763 def WriteGLES2CLibImplementation(self, f): | 9935 def WriteGLES2CLibImplementation(self, f): |
9764 """Writes the GLES2 C Lib Implemention.""" | 9936 """Writes the GLES2 C Lib Implemention.""" |
9765 self.type_handler.WriteGLES2CLibImplementation(self, f) | 9937 self.type_handler.WriteGLES2CLibImplementation(self, f) |
9766 | 9938 |
9767 def WriteGLES2InterfaceHeader(self, f): | 9939 def WriteGLES2InterfaceHeader(self, f): |
9768 """Writes the GLES2 Interface declaration.""" | 9940 """Writes the GLES2 Interface declaration.""" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9865 | 10037 |
9866 Function.InitFunction(self) | 10038 Function.InitFunction(self) |
9867 | 10039 |
9868 def IsImmediate(self): | 10040 def IsImmediate(self): |
9869 return True | 10041 return True |
9870 | 10042 |
9871 def WriteServiceImplementation(self, f): | 10043 def WriteServiceImplementation(self, f): |
9872 """Overridden from Function""" | 10044 """Overridden from Function""" |
9873 self.type_handler.WriteImmediateServiceImplementation(self, f) | 10045 self.type_handler.WriteImmediateServiceImplementation(self, f) |
9874 | 10046 |
| 10047 def WritePassthroughServiceImplementation(self, f): |
| 10048 """Overridden from Function""" |
| 10049 self.type_handler.WritePassthroughImmediateServiceImplementation(self, f) |
| 10050 |
9875 def WriteHandlerImplementation(self, f): | 10051 def WriteHandlerImplementation(self, f): |
9876 """Overridden from Function""" | 10052 """Overridden from Function""" |
9877 self.type_handler.WriteImmediateHandlerImplementation(self, f) | 10053 self.type_handler.WriteImmediateHandlerImplementation(self, f) |
9878 | 10054 |
9879 def WriteServiceUnitTest(self, f, *extras): | 10055 def WriteServiceUnitTest(self, f, *extras): |
9880 """Writes the service implementation for a command.""" | 10056 """Writes the service implementation for a command.""" |
9881 self.type_handler.WriteImmediateServiceUnitTest(self, f, *extras) | 10057 self.type_handler.WriteImmediateServiceUnitTest(self, f, *extras) |
9882 | 10058 |
9883 def WriteValidationCode(self, f): | 10059 def WriteValidationCode(self, f): |
9884 """Overridden from Function""" | 10060 """Overridden from Function""" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9940 new_args_for_cmds.append(new_arg) | 10116 new_args_for_cmds.append(new_arg) |
9941 | 10117 |
9942 self.args_for_cmds = new_args_for_cmds | 10118 self.args_for_cmds = new_args_for_cmds |
9943 | 10119 |
9944 Function.InitFunction(self) | 10120 Function.InitFunction(self) |
9945 | 10121 |
9946 def WriteServiceImplementation(self, f): | 10122 def WriteServiceImplementation(self, f): |
9947 """Overridden from Function""" | 10123 """Overridden from Function""" |
9948 self.type_handler.WriteBucketServiceImplementation(self, f) | 10124 self.type_handler.WriteBucketServiceImplementation(self, f) |
9949 | 10125 |
| 10126 def WritePassthroughServiceImplementation(self, f): |
| 10127 """Overridden from Function""" |
| 10128 self.type_handler.WritePassthroughBucketServiceImplementation(self, f) |
| 10129 |
9950 def WriteHandlerImplementation(self, f): | 10130 def WriteHandlerImplementation(self, f): |
9951 """Overridden from Function""" | 10131 """Overridden from Function""" |
9952 self.type_handler.WriteBucketHandlerImplementation(self, f) | 10132 self.type_handler.WriteBucketHandlerImplementation(self, f) |
9953 | 10133 |
9954 def WriteServiceUnitTest(self, f, *extras): | 10134 def WriteServiceUnitTest(self, f, *extras): |
9955 """Overridden from Function""" | 10135 """Overridden from Function""" |
9956 self.type_handler.WriteBucketServiceUnitTest(self, f, *extras) | 10136 self.type_handler.WriteBucketServiceUnitTest(self, f, *extras) |
9957 | 10137 |
9958 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): | 10138 def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "): |
9959 """Overridden from Function""" | 10139 """Overridden from Function""" |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10571 return false; | 10751 return false; |
10572 """ % capability) | 10752 """ % capability) |
10573 f.write(""" default: | 10753 f.write(""" default: |
10574 NOTREACHED(); | 10754 NOTREACHED(); |
10575 return false; | 10755 return false; |
10576 } | 10756 } |
10577 } | 10757 } |
10578 """) | 10758 """) |
10579 self.generated_cpp_filenames.append(filename) | 10759 self.generated_cpp_filenames.append(filename) |
10580 | 10760 |
| 10761 def WritePassthroughServiceImplementation(self, filename): |
| 10762 """Writes the passthrough service decorder implementation.""" |
| 10763 with CWriter(filename) as f: |
| 10764 header = """ |
| 10765 #include \"gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h\" |
| 10766 |
| 10767 namespace gpu { |
| 10768 namespace gles2 { |
| 10769 |
| 10770 """; |
| 10771 f.write(header); |
| 10772 |
| 10773 for func in self.functions: |
| 10774 func.WritePassthroughServiceImplementation(f) |
| 10775 |
| 10776 footer = """ |
| 10777 } // namespace gles2 |
| 10778 } // namespace gpu |
| 10779 |
| 10780 """; |
| 10781 f.write(footer); |
| 10782 self.generated_cpp_filenames.append(filename) |
| 10783 |
10581 def WriteServiceUnitTests(self, filename_pattern): | 10784 def WriteServiceUnitTests(self, filename_pattern): |
10582 """Writes the service decorder unit tests.""" | 10785 """Writes the service decorder unit tests.""" |
10583 num_tests = len(self.functions) | 10786 num_tests = len(self.functions) |
10584 FUNCTIONS_PER_FILE = 98 # hard code this so it doesn't change. | 10787 FUNCTIONS_PER_FILE = 98 # hard code this so it doesn't change. |
10585 count = 0 | 10788 count = 0 |
10586 for test_num in range(0, num_tests, FUNCTIONS_PER_FILE): | 10789 for test_num in range(0, num_tests, FUNCTIONS_PER_FILE): |
10587 count += 1 | 10790 count += 1 |
10588 filename = filename_pattern % count | 10791 filename = filename_pattern % count |
10589 comment = "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" \ | 10792 comment = "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" \ |
10590 % count | 10793 % count |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11286 gen.WriteGLES2TraceImplementationHeader( | 11489 gen.WriteGLES2TraceImplementationHeader( |
11287 "gpu/command_buffer/client/gles2_trace_implementation_autogen.h") | 11490 "gpu/command_buffer/client/gles2_trace_implementation_autogen.h") |
11288 gen.WriteGLES2TraceImplementation( | 11491 gen.WriteGLES2TraceImplementation( |
11289 "gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h") | 11492 "gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h") |
11290 gen.WriteGLES2CLibImplementation( | 11493 gen.WriteGLES2CLibImplementation( |
11291 "gpu/command_buffer/client/gles2_c_lib_autogen.h") | 11494 "gpu/command_buffer/client/gles2_c_lib_autogen.h") |
11292 gen.WriteCmdHelperHeader( | 11495 gen.WriteCmdHelperHeader( |
11293 "gpu/command_buffer/client/gles2_cmd_helper_autogen.h") | 11496 "gpu/command_buffer/client/gles2_cmd_helper_autogen.h") |
11294 gen.WriteServiceImplementation( | 11497 gen.WriteServiceImplementation( |
11295 "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h") | 11498 "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h") |
| 11499 gen.WritePassthroughServiceImplementation( |
| 11500 "gpu/command_buffer/service/" + |
| 11501 "gles2_cmd_decoder_passthrough_handlers_autogen.cc") |
11296 gen.WriteServiceContextStateHeader( | 11502 gen.WriteServiceContextStateHeader( |
11297 "gpu/command_buffer/service/context_state_autogen.h") | 11503 "gpu/command_buffer/service/context_state_autogen.h") |
11298 gen.WriteServiceContextStateImpl( | 11504 gen.WriteServiceContextStateImpl( |
11299 "gpu/command_buffer/service/context_state_impl_autogen.h") | 11505 "gpu/command_buffer/service/context_state_impl_autogen.h") |
11300 gen.WriteClientContextStateHeader( | 11506 gen.WriteClientContextStateHeader( |
11301 "gpu/command_buffer/client/client_context_state_autogen.h") | 11507 "gpu/command_buffer/client/client_context_state_autogen.h") |
11302 gen.WriteClientContextStateImpl( | 11508 gen.WriteClientContextStateImpl( |
11303 "gpu/command_buffer/client/client_context_state_impl_autogen.h") | 11509 "gpu/command_buffer/client/client_context_state_impl_autogen.h") |
11304 gen.WriteServiceUnitTests( | 11510 gen.WriteServiceUnitTests( |
11305 "gpu/command_buffer/service/gles2_cmd_decoder_unittest_%d_autogen.h") | 11511 "gpu/command_buffer/service/gles2_cmd_decoder_unittest_%d_autogen.h") |
(...skipping 15 matching lines...) Expand all Loading... |
11321 Format(gen.generated_cpp_filenames) | 11527 Format(gen.generated_cpp_filenames) |
11322 | 11528 |
11323 if gen.errors > 0: | 11529 if gen.errors > 0: |
11324 print "%d errors" % gen.errors | 11530 print "%d errors" % gen.errors |
11325 return 1 | 11531 return 1 |
11326 return 0 | 11532 return 0 |
11327 | 11533 |
11328 | 11534 |
11329 if __name__ == '__main__': | 11535 if __name__ == '__main__': |
11330 sys.exit(main(sys.argv[1:])) | 11536 sys.exit(main(sys.argv[1:])) |
OLD | NEW |