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 2182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2193 # array is used and we end up calling the single value | 2193 # array is used and we end up calling the single value |
2194 # corresponding function. eg. TexParameteriv -> TexParameteri | 2194 # corresponding function. eg. TexParameteriv -> TexParameteri |
2195 # extension: Function is an extension to GL and should not be exposed to | 2195 # extension: Function is an extension to GL and should not be exposed to |
2196 # pepper unless pepper_interface is defined. | 2196 # pepper unless pepper_interface is defined. |
2197 # extension_flag: Function is an extension and should be enabled only when | 2197 # extension_flag: Function is an extension and should be enabled only when |
2198 # the corresponding feature info flag is enabled. Implies | 2198 # the corresponding feature info flag is enabled. Implies |
2199 # 'extension': True. | 2199 # 'extension': True. |
2200 # not_shared: For GENn types, True if objects can't be shared between contexts | 2200 # not_shared: For GENn types, True if objects can't be shared between contexts |
2201 # unsafe: True = no validation is implemented on the service side and the | 2201 # unsafe: True = no validation is implemented on the service side and the |
2202 # command is only available with --enable-unsafe-es3-apis. | 2202 # command is only available with --enable-unsafe-es3-apis. |
| 2203 # use_helper: True = use explicit helper or decoder functions rather than the |
| 2204 # defaults created when unsafe is True. |
2203 # id_mapping: A list of resource type names whose client side IDs need to be | 2205 # id_mapping: A list of resource type names whose client side IDs need to be |
2204 # mapped to service side IDs. This is only used for unsafe APIs. | 2206 # mapped to service side IDs. This is only used for unsafe APIs. |
2205 | 2207 |
2206 _FUNCTION_INFO = { | 2208 _FUNCTION_INFO = { |
2207 'ActiveTexture': { | 2209 'ActiveTexture': { |
2208 'decoder_func': 'DoActiveTexture', | 2210 'decoder_func': 'DoActiveTexture', |
2209 'unit_test': False, | 2211 'unit_test': False, |
2210 'impl_func': False, | 2212 'impl_func': False, |
2211 'client_test': False, | 2213 'client_test': False, |
2212 }, | 2214 }, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2252 'trace_level': 1, | 2254 'trace_level': 1, |
2253 }, | 2255 }, |
2254 'BindRenderbuffer': { | 2256 'BindRenderbuffer': { |
2255 'type': 'Bind', | 2257 'type': 'Bind', |
2256 'decoder_func': 'DoBindRenderbuffer', | 2258 'decoder_func': 'DoBindRenderbuffer', |
2257 'gl_test_func': 'glBindRenderbufferEXT', | 2259 'gl_test_func': 'glBindRenderbufferEXT', |
2258 'gen_func': 'GenRenderbuffersEXT', | 2260 'gen_func': 'GenRenderbuffersEXT', |
2259 }, | 2261 }, |
2260 'BindSampler': { | 2262 'BindSampler': { |
2261 'type': 'Bind', | 2263 'type': 'Bind', |
2262 'id_mapping': [ 'Sampler' ], | 2264 'decoder_func': 'DoBindSampler', |
2263 'unsafe': True, | 2265 'unsafe': True, |
| 2266 'use_helper': True, |
2264 }, | 2267 }, |
2265 'BindTexture': { | 2268 'BindTexture': { |
2266 'type': 'Bind', | 2269 'type': 'Bind', |
2267 'decoder_func': 'DoBindTexture', | 2270 'decoder_func': 'DoBindTexture', |
2268 'gen_func': 'GenTextures', | 2271 'gen_func': 'GenTextures', |
2269 # TODO: remove this once client side caching works. | 2272 # TODO: remove this once client side caching works. |
2270 'client_test': False, | 2273 'client_test': False, |
2271 'trace_level': 2, | 2274 'trace_level': 2, |
2272 }, | 2275 }, |
2273 'BindTransformFeedback': { | 2276 'BindTransformFeedback': { |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2637 'gl_test_func': 'glDeleteRenderbuffersEXT', | 2640 'gl_test_func': 'glDeleteRenderbuffersEXT', |
2638 'resource_type': 'Renderbuffer', | 2641 'resource_type': 'Renderbuffer', |
2639 'resource_types': 'Renderbuffers', | 2642 'resource_types': 'Renderbuffers', |
2640 'trace_level': 2, | 2643 'trace_level': 2, |
2641 }, | 2644 }, |
2642 'DeleteSamplers': { | 2645 'DeleteSamplers': { |
2643 'type': 'DELn', | 2646 'type': 'DELn', |
2644 'resource_type': 'Sampler', | 2647 'resource_type': 'Sampler', |
2645 'resource_types': 'Samplers', | 2648 'resource_types': 'Samplers', |
2646 'unsafe': True, | 2649 'unsafe': True, |
| 2650 'use_helper': True |
2647 }, | 2651 }, |
2648 'DeleteShader': { 'type': 'Delete' }, | 2652 'DeleteShader': { 'type': 'Delete' }, |
2649 'DeleteSync': { | 2653 'DeleteSync': { |
2650 'type': 'Delete', | 2654 'type': 'Delete', |
2651 'cmd_args': 'GLuint sync', | 2655 'cmd_args': 'GLuint sync', |
2652 'resource_type': 'Sync', | 2656 'resource_type': 'Sync', |
2653 'unsafe': True, | 2657 'unsafe': True, |
2654 }, | 2658 }, |
2655 'DeleteTextures': { | 2659 'DeleteTextures': { |
2656 'type': 'DELn', | 2660 'type': 'DELn', |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2781 'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT', | 2785 'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT', |
2782 'resource_type': 'Renderbuffer', | 2786 'resource_type': 'Renderbuffer', |
2783 'resource_types': 'Renderbuffers', | 2787 'resource_types': 'Renderbuffers', |
2784 }, | 2788 }, |
2785 'GenSamplers': { | 2789 'GenSamplers': { |
2786 'type': 'GENn', | 2790 'type': 'GENn', |
2787 'gl_test_func': 'glGenSamplers', | 2791 'gl_test_func': 'glGenSamplers', |
2788 'resource_type': 'Sampler', | 2792 'resource_type': 'Sampler', |
2789 'resource_types': 'Samplers', | 2793 'resource_types': 'Samplers', |
2790 'unsafe': True, | 2794 'unsafe': True, |
| 2795 'use_helper': True, |
2791 }, | 2796 }, |
2792 'GenTextures': { | 2797 'GenTextures': { |
2793 'type': 'GENn', | 2798 'type': 'GENn', |
2794 'gl_test_func': 'glGenTextures', | 2799 'gl_test_func': 'glGenTextures', |
2795 'resource_type': 'Texture', | 2800 'resource_type': 'Texture', |
2796 'resource_types': 'Textures', | 2801 'resource_types': 'Textures', |
2797 }, | 2802 }, |
2798 'GenTransformFeedbacks': { | 2803 'GenTransformFeedbacks': { |
2799 'type': 'GENn', | 2804 'type': 'GENn', |
2800 'gl_test_func': 'glGenTransformFeedbacks', | 2805 'gl_test_func': 'glGenTransformFeedbacks', |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2998 'expectation': False, | 3003 'expectation': False, |
2999 }, | 3004 }, |
3000 'GetRenderbufferParameteriv': { | 3005 'GetRenderbufferParameteriv': { |
3001 'type': 'GETn', | 3006 'type': 'GETn', |
3002 'decoder_func': 'DoGetRenderbufferParameteriv', | 3007 'decoder_func': 'DoGetRenderbufferParameteriv', |
3003 'gl_test_func': 'glGetRenderbufferParameterivEXT', | 3008 'gl_test_func': 'glGetRenderbufferParameterivEXT', |
3004 'result': ['SizedResult<GLint>'], | 3009 'result': ['SizedResult<GLint>'], |
3005 }, | 3010 }, |
3006 'GetSamplerParameterfv': { | 3011 'GetSamplerParameterfv': { |
3007 'type': 'GETn', | 3012 'type': 'GETn', |
| 3013 'decoder_func': 'DoGetSamplerParameterfv', |
3008 'result': ['SizedResult<GLfloat>'], | 3014 'result': ['SizedResult<GLfloat>'], |
3009 'id_mapping': [ 'Sampler' ], | |
3010 'unsafe': True, | 3015 'unsafe': True, |
| 3016 'use_helper': True, |
3011 }, | 3017 }, |
3012 'GetSamplerParameteriv': { | 3018 'GetSamplerParameteriv': { |
3013 'type': 'GETn', | 3019 'type': 'GETn', |
| 3020 'decoder_func': 'DoGetSamplerParameteriv', |
3014 'result': ['SizedResult<GLint>'], | 3021 'result': ['SizedResult<GLint>'], |
3015 'id_mapping': [ 'Sampler' ], | |
3016 'unsafe': True, | 3022 'unsafe': True, |
| 3023 'use_helper': True, |
3017 }, | 3024 }, |
3018 'GetShaderiv': { | 3025 'GetShaderiv': { |
3019 'type': 'GETn', | 3026 'type': 'GETn', |
3020 'decoder_func': 'DoGetShaderiv', | 3027 'decoder_func': 'DoGetShaderiv', |
3021 'result': ['SizedResult<GLint>'], | 3028 'result': ['SizedResult<GLint>'], |
3022 }, | 3029 }, |
3023 'GetShaderInfoLog': { | 3030 'GetShaderInfoLog': { |
3024 'type': 'STRn', | 3031 'type': 'STRn', |
3025 'get_len_func': 'glGetShaderiv', | 3032 'get_len_func': 'glGetShaderiv', |
3026 'get_len_enum': 'GL_INFO_LOG_LENGTH', | 3033 'get_len_enum': 'GL_INFO_LOG_LENGTH', |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3243 'decoder_func': 'DoIsRenderbuffer', | 3250 'decoder_func': 'DoIsRenderbuffer', |
3244 'expectation': False, | 3251 'expectation': False, |
3245 }, | 3252 }, |
3246 'IsShader': { | 3253 'IsShader': { |
3247 'type': 'Is', | 3254 'type': 'Is', |
3248 'decoder_func': 'DoIsShader', | 3255 'decoder_func': 'DoIsShader', |
3249 'expectation': False, | 3256 'expectation': False, |
3250 }, | 3257 }, |
3251 'IsSampler': { | 3258 'IsSampler': { |
3252 'type': 'Is', | 3259 'type': 'Is', |
3253 'id_mapping': [ 'Sampler' ], | 3260 'decoder_func': 'DoIsSampler', |
3254 'expectation': False, | 3261 'expectation': False, |
3255 'unsafe': True, | 3262 'unsafe': True, |
| 3263 'use_helper': True, |
3256 }, | 3264 }, |
3257 'IsSync': { | 3265 'IsSync': { |
3258 'type': 'Is', | 3266 'type': 'Is', |
3259 'id_mapping': [ 'Sync' ], | 3267 'id_mapping': [ 'Sync' ], |
3260 'cmd_args': 'GLuint sync', | 3268 'cmd_args': 'GLuint sync', |
3261 'expectation': False, | 3269 'expectation': False, |
3262 'unsafe': True, | 3270 'unsafe': True, |
3263 }, | 3271 }, |
3264 'IsTexture': { | 3272 'IsTexture': { |
3265 'type': 'Is', | 3273 'type': 'Is', |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3403 'decoder_func': 'DoReleaseShaderCompiler', | 3411 'decoder_func': 'DoReleaseShaderCompiler', |
3404 'unit_test': False, | 3412 'unit_test': False, |
3405 }, | 3413 }, |
3406 'ResumeTransformFeedback': { | 3414 'ResumeTransformFeedback': { |
3407 'unsafe': True, | 3415 'unsafe': True, |
3408 }, | 3416 }, |
3409 'SamplerParameterf': { | 3417 'SamplerParameterf': { |
3410 'valid_args': { | 3418 'valid_args': { |
3411 '2': 'GL_NEAREST' | 3419 '2': 'GL_NEAREST' |
3412 }, | 3420 }, |
3413 'id_mapping': [ 'Sampler' ], | 3421 'decoder_func': 'DoSamplerParameterf', |
3414 'unsafe': True, | 3422 'unsafe': True, |
| 3423 'use_helper': True, |
3415 }, | 3424 }, |
3416 'SamplerParameterfv': { | 3425 'SamplerParameterfv': { |
3417 'type': 'PUT', | 3426 'type': 'PUT', |
3418 'data_value': 'GL_NEAREST', | 3427 'data_value': 'GL_NEAREST', |
3419 'count': 1, | 3428 'count': 1, |
3420 'gl_test_func': 'glSamplerParameterf', | 3429 'gl_test_func': 'glSamplerParameterf', |
3421 'decoder_func': 'DoSamplerParameterfv', | 3430 'decoder_func': 'DoSamplerParameterfv', |
3422 'first_element_only': True, | 3431 'first_element_only': True, |
3423 'id_mapping': [ 'Sampler' ], | |
3424 'unsafe': True, | 3432 'unsafe': True, |
| 3433 'use_helper': True, |
3425 }, | 3434 }, |
3426 'SamplerParameteri': { | 3435 'SamplerParameteri': { |
3427 'valid_args': { | 3436 'valid_args': { |
3428 '2': 'GL_NEAREST' | 3437 '2': 'GL_NEAREST' |
3429 }, | 3438 }, |
3430 'id_mapping': [ 'Sampler' ], | 3439 'decoder_func': 'DoSamplerParameteri', |
3431 'unsafe': True, | 3440 'unsafe': True, |
| 3441 'use_helper': True, |
3432 }, | 3442 }, |
3433 'SamplerParameteriv': { | 3443 'SamplerParameteriv': { |
3434 'type': 'PUT', | 3444 'type': 'PUT', |
3435 'data_value': 'GL_NEAREST', | 3445 'data_value': 'GL_NEAREST', |
3436 'count': 1, | 3446 'count': 1, |
3437 'gl_test_func': 'glSamplerParameteri', | 3447 'gl_test_func': 'glSamplerParameteri', |
3438 'decoder_func': 'DoSamplerParameteriv', | 3448 'decoder_func': 'DoSamplerParameteriv', |
3439 'first_element_only': True, | 3449 'first_element_only': True, |
3440 'unsafe': True, | 3450 'unsafe': True, |
| 3451 'use_helper': True, |
3441 }, | 3452 }, |
3442 'ShaderBinary': { | 3453 'ShaderBinary': { |
3443 'type': 'Custom', | 3454 'type': 'Custom', |
3444 'client_test': False, | 3455 'client_test': False, |
3445 }, | 3456 }, |
3446 'ShaderSource': { | 3457 'ShaderSource': { |
3447 'type': 'PUTSTR', | 3458 'type': 'PUTSTR', |
3448 'decoder_func': 'DoShaderSource', | 3459 'decoder_func': 'DoShaderSource', |
3449 'expectation': False, | 3460 'expectation': False, |
3450 'data_transfer_methods': ['bucket'], | 3461 'data_transfer_methods': ['bucket'], |
(...skipping 2467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5918 | 5929 |
5919 def WriteHandlerImplementation (self, func, f): | 5930 def WriteHandlerImplementation (self, func, f): |
5920 """Overrriden from TypeHandler.""" | 5931 """Overrriden from TypeHandler.""" |
5921 f.write(" if (!%sHelper(n, %s)) {\n" | 5932 f.write(" if (!%sHelper(n, %s)) {\n" |
5922 " return error::kInvalidArguments;\n" | 5933 " return error::kInvalidArguments;\n" |
5923 " }\n" % | 5934 " }\n" % |
5924 (func.name, func.GetLastOriginalArg().name)) | 5935 (func.name, func.GetLastOriginalArg().name)) |
5925 | 5936 |
5926 def WriteImmediateHandlerImplementation(self, func, f): | 5937 def WriteImmediateHandlerImplementation(self, func, f): |
5927 """Overrriden from TypeHandler.""" | 5938 """Overrriden from TypeHandler.""" |
5928 if func.IsUnsafe(): | 5939 if func.IsUnsafe() and not func.UseHelper(): |
5929 f.write(""" for (GLsizei ii = 0; ii < n; ++ii) { | 5940 f.write(""" for (GLsizei ii = 0; ii < n; ++ii) { |
5930 if (group_->Get%(resource_name)sServiceId(%(last_arg_name)s[ii], NULL)) { | 5941 if (group_->Get%(resource_name)sServiceId(%(last_arg_name)s[ii], NULL)) { |
5931 return error::kInvalidArguments; | 5942 return error::kInvalidArguments; |
5932 } | 5943 } |
5933 } | 5944 } |
5934 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); | 5945 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
5935 gl%(func_name)s(n, service_ids.get()); | 5946 gl%(func_name)s(n, service_ids.get()); |
5936 for (GLsizei ii = 0; ii < n; ++ii) { | 5947 for (GLsizei ii = 0; ii < n; ++ii) { |
5937 group_->Add%(resource_name)sId(%(last_arg_name)s[ii], service_ids[ii]); | 5948 group_->Add%(resource_name)sId(%(last_arg_name)s[ii], service_ids[ii]); |
5938 } | 5949 } |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6023 valid_test = """ | 6034 valid_test = """ |
6024 TEST_P(%(test_name)s, %(name)sValidArgs) { | 6035 TEST_P(%(test_name)s, %(name)sValidArgs) { |
6025 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _)) | 6036 EXPECT_CALL(*gl_, %(gl_func_name)s(1, _)) |
6026 .WillOnce(SetArgumentPointee<1>(kNewServiceId)); | 6037 .WillOnce(SetArgumentPointee<1>(kNewServiceId)); |
6027 GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; | 6038 GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; |
6028 SpecializedSetup<cmds::%(name)s, 0>(true); | 6039 SpecializedSetup<cmds::%(name)s, 0>(true); |
6029 cmds::%(name)s cmd; | 6040 cmds::%(name)s cmd; |
6030 cmd.Init(%(args)s); | 6041 cmd.Init(%(args)s); |
6031 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 6042 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
6032 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" | 6043 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" |
6033 if func.IsUnsafe(): | 6044 if func.IsUnsafe() and not func.UseHelper(): |
6034 valid_test += """ | 6045 valid_test += """ |
6035 GLuint service_id; | 6046 GLuint service_id; |
6036 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id)); | 6047 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id)); |
6037 EXPECT_EQ(kNewServiceId, service_id) | 6048 EXPECT_EQ(kNewServiceId, service_id) |
6038 } | 6049 } |
6039 """ | 6050 """ |
6040 else: | 6051 else: |
6041 valid_test += """ | 6052 valid_test += """ |
6042 EXPECT_TRUE(Get%(resource_name)s(kNewClientId, &service_id) != NULL); | 6053 EXPECT_TRUE(Get%(resource_name)s(kNewClientId, &service_id) != NULL); |
6043 } | 6054 } |
(...skipping 25 matching lines...) Expand all Loading... |
6069 GLuint temp = kNewClientId; | 6080 GLuint temp = kNewClientId; |
6070 SpecializedSetup<cmds::%(name)s, 0>(true);""" | 6081 SpecializedSetup<cmds::%(name)s, 0>(true);""" |
6071 if func.IsUnsafe(): | 6082 if func.IsUnsafe(): |
6072 valid_test += """ | 6083 valid_test += """ |
6073 decoder_->set_unsafe_es3_apis_enabled(true);""" | 6084 decoder_->set_unsafe_es3_apis_enabled(true);""" |
6074 valid_test += """ | 6085 valid_test += """ |
6075 cmd->Init(1, &temp); | 6086 cmd->Init(1, &temp); |
6076 EXPECT_EQ(error::kNoError, | 6087 EXPECT_EQ(error::kNoError, |
6077 ExecuteImmediateCmd(*cmd, sizeof(temp))); | 6088 ExecuteImmediateCmd(*cmd, sizeof(temp))); |
6078 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" | 6089 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" |
6079 if func.IsUnsafe(): | 6090 if func.IsUnsafe() and not func.UseHelper(): |
6080 valid_test += """ | 6091 valid_test += """ |
6081 GLuint service_id; | 6092 GLuint service_id; |
6082 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id)); | 6093 EXPECT_TRUE(Get%(resource_name)sServiceId(kNewClientId, &service_id)); |
6083 EXPECT_EQ(kNewServiceId, service_id); | 6094 EXPECT_EQ(kNewServiceId, service_id); |
6084 decoder_->set_unsafe_es3_apis_enabled(false); | 6095 decoder_->set_unsafe_es3_apis_enabled(false); |
6085 EXPECT_EQ(error::kUnknownCommand, | 6096 EXPECT_EQ(error::kUnknownCommand, |
6086 ExecuteImmediateCmd(*cmd, sizeof(temp))); | 6097 ExecuteImmediateCmd(*cmd, sizeof(temp))); |
6087 } | 6098 } |
6088 """ | 6099 """ |
6089 else: | 6100 else: |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6371 f.write(" %sHelper(%s);\n" % | 6382 f.write(" %sHelper(%s);\n" % |
6372 (func.original_name, func.GetOriginalArgs()[-1].name)) | 6383 (func.original_name, func.GetOriginalArgs()[-1].name)) |
6373 f.write(" CheckGLError();\n") | 6384 f.write(" CheckGLError();\n") |
6374 f.write("}\n") | 6385 f.write("}\n") |
6375 f.write("\n") | 6386 f.write("\n") |
6376 | 6387 |
6377 def WriteHandlerImplementation (self, func, f): | 6388 def WriteHandlerImplementation (self, func, f): |
6378 """Overrriden from TypeHandler.""" | 6389 """Overrriden from TypeHandler.""" |
6379 assert len(func.GetOriginalArgs()) == 1 | 6390 assert len(func.GetOriginalArgs()) == 1 |
6380 arg = func.GetOriginalArgs()[0] | 6391 arg = func.GetOriginalArgs()[0] |
6381 if func.IsUnsafe(): | 6392 if func.IsUnsafe() and not func.UseHelper(): |
6382 f.write(""" %(arg_type)s service_id = 0; | 6393 f.write(""" %(arg_type)s service_id = 0; |
6383 if (group_->Get%(resource_type)sServiceId(%(arg_name)s, &service_id)) { | 6394 if (group_->Get%(resource_type)sServiceId(%(arg_name)s, &service_id)) { |
6384 glDelete%(resource_type)s(service_id); | 6395 glDelete%(resource_type)s(service_id); |
6385 group_->Remove%(resource_type)sId(%(arg_name)s); | 6396 group_->Remove%(resource_type)sId(%(arg_name)s); |
6386 } else { | 6397 } else { |
6387 LOCAL_SET_GL_ERROR( | 6398 LOCAL_SET_GL_ERROR( |
6388 GL_INVALID_VALUE, "gl%(func_name)s", "unknown %(arg_name)s"); | 6399 GL_INVALID_VALUE, "gl%(func_name)s", "unknown %(arg_name)s"); |
6389 } | 6400 } |
6390 """ % { 'resource_type': func.GetInfo('resource_type'), | 6401 """ % { 'resource_type': func.GetInfo('resource_type'), |
6391 'arg_name': arg.name, | 6402 'arg_name': arg.name, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6472 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); | 6483 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); |
6473 SpecializedSetup<cmds::%(name)s, 0>(true); | 6484 SpecializedSetup<cmds::%(name)s, 0>(true); |
6474 cmd.Init(1, &client_%(resource_name)s_id_);""" | 6485 cmd.Init(1, &client_%(resource_name)s_id_);""" |
6475 if func.IsUnsafe(): | 6486 if func.IsUnsafe(): |
6476 valid_test += """ | 6487 valid_test += """ |
6477 decoder_->set_unsafe_es3_apis_enabled(true);""" | 6488 decoder_->set_unsafe_es3_apis_enabled(true);""" |
6478 valid_test += """ | 6489 valid_test += """ |
6479 EXPECT_EQ(error::kNoError, | 6490 EXPECT_EQ(error::kNoError, |
6480 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_))); | 6491 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_))); |
6481 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" | 6492 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" |
6482 if func.IsUnsafe(): | 6493 if func.IsUnsafe() and not func.UseHelper(): |
6483 valid_test += """ | 6494 valid_test += """ |
6484 EXPECT_FALSE(Get%(upper_resource_name)sServiceId( | 6495 EXPECT_FALSE(Get%(upper_resource_name)sServiceId( |
6485 client_%(resource_name)s_id_, NULL)); | 6496 client_%(resource_name)s_id_, NULL)); |
6486 decoder_->set_unsafe_es3_apis_enabled(false); | 6497 decoder_->set_unsafe_es3_apis_enabled(false); |
6487 EXPECT_EQ(error::kUnknownCommand, | 6498 EXPECT_EQ(error::kUnknownCommand, |
6488 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_))); | 6499 ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_))); |
6489 } | 6500 } |
6490 """ | 6501 """ |
6491 else: | 6502 else: |
6492 valid_test += """ | 6503 valid_test += """ |
(...skipping 29 matching lines...) Expand all Loading... |
6522 """ | 6533 """ |
6523 self.WriteValidUnitTest(func, f, invalid_test, *extras) | 6534 self.WriteValidUnitTest(func, f, invalid_test, *extras) |
6524 | 6535 |
6525 def WriteHandlerImplementation (self, func, f): | 6536 def WriteHandlerImplementation (self, func, f): |
6526 """Overrriden from TypeHandler.""" | 6537 """Overrriden from TypeHandler.""" |
6527 f.write(" %sHelper(n, %s);\n" % | 6538 f.write(" %sHelper(n, %s);\n" % |
6528 (func.name, func.GetLastOriginalArg().name)) | 6539 (func.name, func.GetLastOriginalArg().name)) |
6529 | 6540 |
6530 def WriteImmediateHandlerImplementation (self, func, f): | 6541 def WriteImmediateHandlerImplementation (self, func, f): |
6531 """Overrriden from TypeHandler.""" | 6542 """Overrriden from TypeHandler.""" |
6532 if func.IsUnsafe(): | 6543 if func.IsUnsafe() and not func.UseHelper(): |
6533 f.write(""" for (GLsizei ii = 0; ii < n; ++ii) { | 6544 f.write(""" for (GLsizei ii = 0; ii < n; ++ii) { |
6534 GLuint service_id = 0; | 6545 GLuint service_id = 0; |
6535 if (group_->Get%(resource_type)sServiceId( | 6546 if (group_->Get%(resource_type)sServiceId( |
6536 %(last_arg_name)s[ii], &service_id)) { | 6547 %(last_arg_name)s[ii], &service_id)) { |
6537 glDelete%(resource_type)ss(1, &service_id); | 6548 glDelete%(resource_type)ss(1, &service_id); |
6538 group_->Remove%(resource_type)sId(%(last_arg_name)s[ii]); | 6549 group_->Remove%(resource_type)sId(%(last_arg_name)s[ii]); |
6539 } | 6550 } |
6540 } | 6551 } |
6541 """ % { 'resource_type': func.GetInfo('resource_type'), | 6552 """ % { 'resource_type': func.GetInfo('resource_type'), |
6542 'last_arg_name': func.GetLastOriginalArg().name }) | 6553 'last_arg_name': func.GetLastOriginalArg().name }) |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6982 """ | 6993 """ |
6983 self.WriteInvalidUnitTest(func, f, invalid_test, extra, *extras) | 6994 self.WriteInvalidUnitTest(func, f, invalid_test, extra, *extras) |
6984 | 6995 |
6985 def WriteImmediateServiceUnitTest(self, func, f, *extras): | 6996 def WriteImmediateServiceUnitTest(self, func, f, *extras): |
6986 """Writes the service unit test for a command.""" | 6997 """Writes the service unit test for a command.""" |
6987 valid_test = """ | 6998 valid_test = """ |
6988 TEST_P(%(test_name)s, %(name)sValidArgs) { | 6999 TEST_P(%(test_name)s, %(name)sValidArgs) { |
6989 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); | 7000 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); |
6990 SpecializedSetup<cmds::%(name)s, 0>(true); | 7001 SpecializedSetup<cmds::%(name)s, 0>(true); |
6991 %(data_type)s temp[%(data_count)s] = { %(data_value)s, }; | 7002 %(data_type)s temp[%(data_count)s] = { %(data_value)s, }; |
6992 cmd.Init(%(gl_args)s, &temp[0]); | 7003 cmd.Init(%(gl_client_args)s, &temp[0]); |
6993 EXPECT_CALL( | 7004 EXPECT_CALL( |
6994 *gl_, | 7005 *gl_, |
6995 %(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast< | 7006 %(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast< |
6996 %(data_type)s*>(ImmediateDataAddress(&cmd))));""" | 7007 %(data_type)s*>(ImmediateDataAddress(&cmd))));""" |
6997 if func.IsUnsafe(): | 7008 if func.IsUnsafe(): |
6998 valid_test += """ | 7009 valid_test += """ |
6999 decoder_->set_unsafe_es3_apis_enabled(true);""" | 7010 decoder_->set_unsafe_es3_apis_enabled(true);""" |
7000 valid_test += """ | 7011 valid_test += """ |
7001 EXPECT_EQ(error::kNoError, | 7012 EXPECT_EQ(error::kNoError, |
7002 ExecuteImmediateCmd(cmd, sizeof(temp))); | 7013 ExecuteImmediateCmd(cmd, sizeof(temp))); |
7003 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" | 7014 EXPECT_EQ(GL_NO_ERROR, GetGLError());""" |
7004 if func.IsUnsafe(): | 7015 if func.IsUnsafe(): |
7005 valid_test += """ | 7016 valid_test += """ |
7006 decoder_->set_unsafe_es3_apis_enabled(false); | 7017 decoder_->set_unsafe_es3_apis_enabled(false); |
7007 EXPECT_EQ(error::kUnknownCommand, | 7018 EXPECT_EQ(error::kUnknownCommand, |
7008 ExecuteImmediateCmd(cmd, sizeof(temp)));""" | 7019 ExecuteImmediateCmd(cmd, sizeof(temp)));""" |
7009 valid_test += """ | 7020 valid_test += """ |
7010 } | 7021 } |
7011 """ | 7022 """ |
| 7023 gl_client_arg_strings = [ |
| 7024 arg.GetValidArg(func) for arg in func.GetOriginalArgs()[0:-1] |
| 7025 ] |
7012 gl_arg_strings = [ | 7026 gl_arg_strings = [ |
7013 arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()[0:-1] | 7027 arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()[0:-1] |
7014 ] | 7028 ] |
7015 gl_any_strings = ["_"] * len(gl_arg_strings) | 7029 gl_any_strings = ["_"] * len(gl_arg_strings) |
7016 | 7030 |
7017 extra = { | 7031 extra = { |
7018 'data_ref': ("*" if func.GetInfo('first_element_only') else ""), | 7032 'data_ref': ("*" if func.GetInfo('first_element_only') else ""), |
7019 'data_type': self.GetArrayType(func), | 7033 'data_type': self.GetArrayType(func), |
7020 'data_count': self.GetArrayCount(func), | 7034 'data_count': self.GetArrayCount(func), |
7021 'data_value': func.GetInfo('data_value') or '0', | 7035 'data_value': func.GetInfo('data_value') or '0', |
| 7036 'gl_client_args': ", ".join(gl_client_arg_strings), |
7022 'gl_args': ", ".join(gl_arg_strings), | 7037 'gl_args': ", ".join(gl_arg_strings), |
7023 'gl_any_args': ", ".join(gl_any_strings), | 7038 'gl_any_args': ", ".join(gl_any_strings), |
7024 } | 7039 } |
7025 self.WriteValidUnitTest(func, f, valid_test, extra, *extras) | 7040 self.WriteValidUnitTest(func, f, valid_test, extra, *extras) |
7026 | 7041 |
7027 invalid_test = """ | 7042 invalid_test = """ |
7028 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { | 7043 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { |
7029 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();""" | 7044 cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();""" |
7030 if func.IsUnsafe(): | 7045 if func.IsUnsafe(): |
7031 invalid_test += """ | 7046 invalid_test += """ |
(...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8236 | 8251 |
8237 code = """ typedef cmds::%(func_name)s::Result Result; | 8252 code = """ typedef cmds::%(func_name)s::Result Result; |
8238 Result* result_dst = GetSharedMemoryAs<Result*>( | 8253 Result* result_dst = GetSharedMemoryAs<Result*>( |
8239 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); | 8254 c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); |
8240 if (!result_dst) { | 8255 if (!result_dst) { |
8241 return error::kOutOfBounds; | 8256 return error::kOutOfBounds; |
8242 } | 8257 } |
8243 """ | 8258 """ |
8244 f.write(code % {'func_name': func.name}) | 8259 f.write(code % {'func_name': func.name}) |
8245 func.WriteHandlerValidation(f) | 8260 func.WriteHandlerValidation(f) |
8246 if func.IsUnsafe(): | 8261 if func.IsUnsafe() and not func.UseHelper(): |
8247 assert func.GetInfo('id_mapping') | 8262 assert func.GetInfo('id_mapping') |
8248 assert len(func.GetInfo('id_mapping')) == 1 | 8263 assert len(func.GetInfo('id_mapping')) == 1 |
8249 assert len(args) == 1 | 8264 assert len(args) == 1 |
8250 id_type = func.GetInfo('id_mapping')[0] | 8265 id_type = func.GetInfo('id_mapping')[0] |
8251 f.write(" %s service_%s = 0;\n" % (args[0].type, id_type.lower())) | 8266 f.write(" %s service_%s = 0;\n" % (args[0].type, id_type.lower())) |
8252 f.write(" *result_dst = group_->Get%sServiceId(%s, &service_%s);\n" % | 8267 f.write(" *result_dst = group_->Get%sServiceId(%s, &service_%s);\n" % |
8253 (id_type, id_type.lower(), id_type.lower())) | 8268 (id_type, id_type.lower(), id_type.lower())) |
8254 else: | 8269 else: |
8255 f.write(" *result_dst = %s(%s);\n" % | 8270 f.write(" *result_dst = %s(%s);\n" % |
8256 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) | 8271 (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) |
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9300 self.type_handler.InitFunction(self) | 9315 self.type_handler.InitFunction(self) |
9301 | 9316 |
9302 def IsImmediate(self): | 9317 def IsImmediate(self): |
9303 """Returns whether the function is immediate data function or not.""" | 9318 """Returns whether the function is immediate data function or not.""" |
9304 return False | 9319 return False |
9305 | 9320 |
9306 def IsUnsafe(self): | 9321 def IsUnsafe(self): |
9307 """Returns whether the function has service side validation or not.""" | 9322 """Returns whether the function has service side validation or not.""" |
9308 return self.GetInfo('unsafe', False) | 9323 return self.GetInfo('unsafe', False) |
9309 | 9324 |
| 9325 def UseHelper(self): |
| 9326 """Returns whether the function uses explicit helper functions.""" |
| 9327 return self.GetInfo('use_helper', False) |
| 9328 |
9310 def GetInfo(self, name, default = None): | 9329 def GetInfo(self, name, default = None): |
9311 """Returns a value from the function info for this function.""" | 9330 """Returns a value from the function info for this function.""" |
9312 if name in self.info: | 9331 if name in self.info: |
9313 return self.info[name] | 9332 return self.info[name] |
9314 return default | 9333 return default |
9315 | 9334 |
9316 def GetValidArg(self, arg): | 9335 def GetValidArg(self, arg): |
9317 """Gets a valid argument value for the parameter arg from the function info | 9336 """Gets a valid argument value for the parameter arg from the function info |
9318 if one exists.""" | 9337 if one exists.""" |
9319 try: | 9338 try: |
(...skipping 1909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11229 Format(gen.generated_cpp_filenames) | 11248 Format(gen.generated_cpp_filenames) |
11230 | 11249 |
11231 if gen.errors > 0: | 11250 if gen.errors > 0: |
11232 print "%d errors" % gen.errors | 11251 print "%d errors" % gen.errors |
11233 return 1 | 11252 return 1 |
11234 return 0 | 11253 return 0 |
11235 | 11254 |
11236 | 11255 |
11237 if __name__ == '__main__': | 11256 if __name__ == '__main__': |
11238 sys.exit(main(sys.argv[1:])) | 11257 sys.exit(main(sys.argv[1:])) |
OLD | NEW |