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 1354 matching lines...) Loading... |
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': { | 1371 'SyncCondition': { |
1372 'type': 'GLenum', | 1372 'type': 'GLenum', |
1373 'is_complete': True, | 1373 'is_complete': True, |
1374 'valid': [ | 1374 'valid': [ |
1375 #TODO(zmo): avoid using the direct number. | 1375 'GL_SYNC_GPU_COMMANDS_COMPLETE', |
1376 '0x9117', # GL_SYNC_GPU_COMMANDS_COMPLETE | |
1377 ], | 1376 ], |
1378 'invalid': [ | 1377 'invalid': [ |
1379 '0', | 1378 '0', |
1380 ], | 1379 ], |
1381 }, | 1380 }, |
1382 'SyncFlags': { | 1381 'SyncFlags': { |
1383 'type': 'GLbitfield', | 1382 'type': 'GLbitfield', |
1384 'is_complete': True, | 1383 'is_complete': True, |
1385 'valid': [ | 1384 'valid': [ |
1386 '0', | 1385 '0', |
(...skipping 635 matching lines...) Loading... |
2022 'data_transfer_methods': ['shm'], | 2021 'data_transfer_methods': ['shm'], |
2023 'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', | 2022 'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', |
2024 'result': ['SizedResult<GLuint>'], | 2023 'result': ['SizedResult<GLuint>'], |
2025 }, | 2024 }, |
2026 'GetAttribLocation': { | 2025 'GetAttribLocation': { |
2027 'type': 'Custom', | 2026 'type': 'Custom', |
2028 'data_transfer_methods': ['shm'], | 2027 'data_transfer_methods': ['shm'], |
2029 'cmd_args': | 2028 'cmd_args': |
2030 'GLidProgram program, uint32_t name_bucket_id, GLint* location', | 2029 'GLidProgram program, uint32_t name_bucket_id, GLint* location', |
2031 'result': ['GLint'], | 2030 'result': ['GLint'], |
2032 'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLo
cation.xml | 2031 'error_return': -1, |
| 2032 }, |
| 2033 'GetFragDataLocation': { |
| 2034 'type': 'Custom', |
| 2035 'data_transfer_methods': ['shm'], |
| 2036 'cmd_args': |
| 2037 'GLidProgram program, uint32_t name_bucket_id, GLint* location', |
| 2038 'result': ['GLint'], |
| 2039 'error_return': -1, |
| 2040 'unsafe': True, |
2033 }, | 2041 }, |
2034 'GetBooleanv': { | 2042 'GetBooleanv': { |
2035 'type': 'GETn', | 2043 'type': 'GETn', |
2036 'result': ['SizedResult<GLboolean>'], | 2044 'result': ['SizedResult<GLboolean>'], |
2037 'decoder_func': 'DoGetBooleanv', | 2045 'decoder_func': 'DoGetBooleanv', |
2038 'gl_test_func': 'glGetBooleanv', | 2046 'gl_test_func': 'glGetBooleanv', |
2039 }, | 2047 }, |
2040 'GetBufferParameteriv': { | 2048 'GetBufferParameteriv': { |
2041 'type': 'GETn', | 2049 'type': 'GETn', |
2042 'result': ['SizedResult<GLint>'], | 2050 'result': ['SizedResult<GLint>'], |
(...skipping 391 matching lines...) Loading... |
2434 'unsafe': True, | 2442 'unsafe': True, |
2435 }, | 2443 }, |
2436 'ShaderBinary': { | 2444 'ShaderBinary': { |
2437 'type': 'Custom', | 2445 'type': 'Custom', |
2438 'client_test': False, | 2446 'client_test': False, |
2439 }, | 2447 }, |
2440 'ShaderSource': { | 2448 'ShaderSource': { |
2441 'type': 'PUTSTR', | 2449 'type': 'PUTSTR', |
2442 'decoder_func': 'DoShaderSource', | 2450 'decoder_func': 'DoShaderSource', |
2443 'data_transfer_methods': ['bucket'], | 2451 'data_transfer_methods': ['bucket'], |
2444 'client_test': False, | |
2445 'cmd_args': | 2452 'cmd_args': |
2446 'GLuint shader, const char** str', | 2453 'GLuint shader, const char** str', |
2447 'pepper_args': | 2454 'pepper_args': |
2448 'GLuint shader, GLsizei count, const char** str, const GLint* length', | 2455 'GLuint shader, GLsizei count, const char** str, const GLint* length', |
2449 }, | 2456 }, |
2450 'StencilMask': { | 2457 'StencilMask': { |
2451 'type': 'StateSetFrontBack', | 2458 'type': 'StateSetFrontBack', |
2452 'state': 'StencilMask', | 2459 'state': 'StencilMask', |
2453 'no_gl': True, | 2460 'no_gl': True, |
2454 'expectation': False, | 2461 'expectation': False, |
(...skipping 1378 matching lines...) Loading... |
3833 gl_arg_strings.append(arg.GetValidClientSideArg(func)) | 3840 gl_arg_strings.append(arg.GetValidClientSideArg(func)) |
3834 | 3841 |
3835 file.Write(code % { | 3842 file.Write(code % { |
3836 'name': func.name, | 3843 'name': func.name, |
3837 'invalid_index': func.GetOriginalArgs().index(invalid_arg), | 3844 'invalid_index': func.GetOriginalArgs().index(invalid_arg), |
3838 'args': ", ".join(gl_arg_strings), | 3845 'args': ", ".join(gl_arg_strings), |
3839 'gl_error': invalid[2], | 3846 'gl_error': invalid[2], |
3840 }) | 3847 }) |
3841 else: | 3848 else: |
3842 if client_test != False: | 3849 if client_test != False: |
3843 file.Write("// TODO: Implement unit test for %s\n" % func.name) | 3850 file.Write("// TODO(zmo): Implement unit test for %s\n" % func.name) |
3844 | 3851 |
3845 def WriteDestinationInitalizationValidation(self, func, file): | 3852 def WriteDestinationInitalizationValidation(self, func, file): |
3846 """Writes the client side destintion initialization validation.""" | 3853 """Writes the client side destintion initialization validation.""" |
3847 for arg in func.GetOriginalArgs(): | 3854 for arg in func.GetOriginalArgs(): |
3848 arg.WriteDestinationInitalizationValidation(file, func) | 3855 arg.WriteDestinationInitalizationValidation(file, func) |
3849 | 3856 |
3850 def WriteTraceEvent(self, func, file): | 3857 def WriteTraceEvent(self, func, file): |
3851 file.Write(' TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' % | 3858 file.Write(' TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' % |
3852 func.original_name) | 3859 func.original_name) |
3853 | 3860 |
(...skipping 2646 matching lines...) Loading... |
6500 if bucket_cmd_arg_string: | 6507 if bucket_cmd_arg_string: |
6501 bucket_cmd_arg_string += ", " | 6508 bucket_cmd_arg_string += ", " |
6502 bucket_cmd_arg_string += 'kResultBucketId' | 6509 bucket_cmd_arg_string += 'kResultBucketId' |
6503 file.Write(" helper_->%sBucket(%s);\n" % | 6510 file.Write(" helper_->%sBucket(%s);\n" % |
6504 (func.name, bucket_cmd_arg_string)) | 6511 (func.name, bucket_cmd_arg_string)) |
6505 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); | 6512 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); |
6506 file.Write(" CheckGLError();\n") | 6513 file.Write(" CheckGLError();\n") |
6507 file.Write("}\n") | 6514 file.Write("}\n") |
6508 file.Write("\n") | 6515 file.Write("\n") |
6509 | 6516 |
| 6517 def WriteGLES2ImplementationUnitTest(self, func, file): |
| 6518 """Overrriden from TypeHandler.""" |
| 6519 code = """ |
| 6520 TEST_F(GLES2ImplementationTest, %(name)s) { |
| 6521 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
| 6522 const char* kString1 = "happy"; |
| 6523 const char* kString2 = "ending"; |
| 6524 const size_t kString1Size = ::strlen(kString1) + 1; |
| 6525 const size_t kString2Size = ::strlen(kString2) + 1; |
| 6526 const size_t kHeaderSize = sizeof(GLint) * 3; |
| 6527 const size_t kSourceSize = kHeaderSize + kString1Size + kString2Size; |
| 6528 const size_t kPaddedHeaderSize = |
| 6529 transfer_buffer_->RoundToAlignment(kHeaderSize); |
| 6530 const size_t kPaddedString1Size = |
| 6531 transfer_buffer_->RoundToAlignment(kString1Size); |
| 6532 const size_t kPaddedString2Size = |
| 6533 transfer_buffer_->RoundToAlignment(kString2Size); |
| 6534 struct Cmds { |
| 6535 cmd::SetBucketSize set_bucket_size; |
| 6536 cmd::SetBucketData set_bucket_header; |
| 6537 cmd::SetToken set_token1; |
| 6538 cmd::SetBucketData set_bucket_data1; |
| 6539 cmd::SetToken set_token2; |
| 6540 cmd::SetBucketData set_bucket_data2; |
| 6541 cmd::SetToken set_token3; |
| 6542 cmds::ShaderSourceBucket shader_source_bucket; |
| 6543 cmd::SetBucketSize clear_bucket_size; |
| 6544 }; |
| 6545 |
| 6546 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); |
| 6547 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); |
| 6548 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); |
| 6549 |
| 6550 Cmds expected; |
| 6551 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
| 6552 expected.set_bucket_header.Init( |
| 6553 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
| 6554 expected.set_token1.Init(GetNextToken()); |
| 6555 expected.set_bucket_data1.Init( |
| 6556 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset); |
| 6557 expected.set_token2.Init(GetNextToken()); |
| 6558 expected.set_bucket_data2.Init( |
| 6559 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, |
| 6560 mem2.offset); |
| 6561 expected.set_token3.Init(GetNextToken()); |
| 6562 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); |
| 6563 expected.clear_bucket_size.Init(kBucketId, 0); |
| 6564 const char* kStrings[] = { kString1, kString2 }; |
| 6565 gl_->%(name)s(%(gl_args)s); |
| 6566 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 6567 } |
| 6568 """ |
| 6569 gl_args = [] |
| 6570 cmd_args = [] |
| 6571 for arg in func.GetOriginalArgs(): |
| 6572 if arg == self.__GetDataArg(func): |
| 6573 gl_args.append('kStrings') |
| 6574 elif arg == self.__GetLengthArg(func): |
| 6575 gl_args.append('NULL') |
| 6576 elif arg.name == 'count': |
| 6577 gl_args.append('2') |
| 6578 else: |
| 6579 gl_args.append(arg.GetValidClientSideArg(func)) |
| 6580 cmd_args.append(arg.GetValidClientSideArg(func)) |
| 6581 file.Write(code % { |
| 6582 'name': func.name, |
| 6583 'gl_args': ", ".join(gl_args), |
| 6584 'cmd_args': ", ".join(cmd_args), |
| 6585 }) |
| 6586 |
| 6587 if self.__GetLengthArg(func) == None: |
| 6588 return |
| 6589 code = """ |
| 6590 TEST_F(GLES2ImplementationTest, %(name)sWithLength) { |
| 6591 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
| 6592 const char* kString = "foobar******"; |
| 6593 const size_t kStringSize = 6; // We only need "foobar". |
| 6594 const size_t kHeaderSize = sizeof(GLint) * 2; |
| 6595 const size_t kSourceSize = kHeaderSize + kStringSize + 1; |
| 6596 const size_t kPaddedHeaderSize = |
| 6597 transfer_buffer_->RoundToAlignment(kHeaderSize); |
| 6598 const size_t kPaddedStringSize = |
| 6599 transfer_buffer_->RoundToAlignment(kStringSize + 1); |
| 6600 struct Cmds { |
| 6601 cmd::SetBucketSize set_bucket_size; |
| 6602 cmd::SetBucketData set_bucket_header; |
| 6603 cmd::SetToken set_token1; |
| 6604 cmd::SetBucketData set_bucket_data; |
| 6605 cmd::SetToken set_token2; |
| 6606 cmds::ShaderSourceBucket shader_source_bucket; |
| 6607 cmd::SetBucketSize clear_bucket_size; |
| 6608 }; |
| 6609 |
| 6610 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); |
| 6611 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize); |
| 6612 |
| 6613 Cmds expected; |
| 6614 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
| 6615 expected.set_bucket_header.Init( |
| 6616 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
| 6617 expected.set_token1.Init(GetNextToken()); |
| 6618 expected.set_bucket_data.Init( |
| 6619 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); |
| 6620 expected.set_token2.Init(GetNextToken()); |
| 6621 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); |
| 6622 expected.clear_bucket_size.Init(kBucketId, 0); |
| 6623 const char* kStrings[] = { kString }; |
| 6624 const GLint kLength[] = { kStringSize }; |
| 6625 gl_->%(name)s(%(gl_args)s); |
| 6626 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
| 6627 } |
| 6628 """ |
| 6629 gl_args = [] |
| 6630 for arg in func.GetOriginalArgs(): |
| 6631 if arg == self.__GetDataArg(func): |
| 6632 gl_args.append('kStrings') |
| 6633 elif arg == self.__GetLengthArg(func): |
| 6634 gl_args.append('kLength') |
| 6635 elif arg.name == 'count': |
| 6636 gl_args.append('1') |
| 6637 else: |
| 6638 gl_args.append(arg.GetValidClientSideArg(func)) |
| 6639 file.Write(code % { |
| 6640 'name': func.name, |
| 6641 'gl_args': ", ".join(gl_args), |
| 6642 'cmd_args': ", ".join(cmd_args), |
| 6643 }) |
| 6644 |
| 6645 def WriteBucketServiceUnitTest(self, func, file, *extras): |
| 6646 """Overrriden from TypeHandler.""" |
| 6647 cmd_args = [] |
| 6648 cmd_args_with_invalid_id = [] |
| 6649 for index, arg in enumerate(func.GetOriginalArgs()): |
| 6650 if (arg == self.__GetLengthArg(func) or |
| 6651 arg == self.__GetDataArg(func) or arg.name == 'count'): |
| 6652 continue |
| 6653 if index == 0: # Resource ID arg |
| 6654 cmd_args.append(arg.GetValidArg(func)) |
| 6655 cmd_args_with_invalid_id.append('kInvalidClientId') |
| 6656 else: |
| 6657 cmd_args.append(arg.GetValidArg(func)) |
| 6658 cmd_args_with_invalid_id.append(arg.GetValidArg(func)) |
| 6659 |
| 6660 test = """ |
| 6661 TEST_P(%(test_name)s, %(name)sValidArgs) { |
| 6662 const uint32 kBucketId = 123; |
| 6663 const char kSource0[] = "hello"; |
| 6664 const char* kSource[] = { kSource0 }; |
| 6665 const char kValidStrEnd = 0; |
| 6666 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
| 6667 cmds::%(name)s cmd; |
| 6668 cmd.Init(%(cmd_args)s, kBucketId); |
| 6669 decoder_->set_unsafe_es3_apis_enabled(true); |
| 6670 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" |
| 6671 if func.IsUnsafe(): |
| 6672 test += """ |
| 6673 decoder_->set_unsafe_es3_apis_enabled(false); |
| 6674 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 6675 """ |
| 6676 test += """ |
| 6677 } |
| 6678 """ |
| 6679 self.WriteValidUnitTest(func, file, test, { |
| 6680 'cmd_args': ", ".join(cmd_args), |
| 6681 }, *extras) |
| 6682 |
| 6683 test = """ |
| 6684 TEST_P(%(test_name)s, %(name)sInvalidArgs) { |
| 6685 const uint32 kBucketId = 123; |
| 6686 const char kSource0[] = "hello"; |
| 6687 const char* kSource[] = { kSource0 }; |
| 6688 const char kValidStrEnd = 0; |
| 6689 decoder_->set_unsafe_es3_apis_enabled(true); |
| 6690 cmds::%(name)s cmd; |
| 6691 // Test no bucket. |
| 6692 cmd.Init(%(cmd_args)s, kBucketId); |
| 6693 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 6694 // Test invalid client. |
| 6695 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
| 6696 cmd.Init(%(cmd_args_with_invalid_id)s, kBucketId); |
| 6697 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 6698 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 6699 } |
| 6700 """ |
| 6701 self.WriteValidUnitTest(func, file, test, { |
| 6702 'cmd_args': ", ".join(cmd_args), |
| 6703 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id), |
| 6704 }, *extras) |
| 6705 |
| 6706 test = """ |
| 6707 TEST_P(%(test_name)s, %(name)sInvalidHeader) { |
| 6708 const uint32 kBucketId = 123; |
| 6709 const char kSource0[] = "hello"; |
| 6710 const char* kSource[] = { kSource0 }; |
| 6711 const char kValidStrEnd = 0; |
| 6712 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); |
| 6713 const GLsizei kTests[] = { |
| 6714 kCount, |
| 6715 0, |
| 6716 std::numeric_limits<GLsizei>::max(), |
| 6717 -1, |
| 6718 kCount, |
| 6719 }; |
| 6720 decoder_->set_unsafe_es3_apis_enabled(true); |
| 6721 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
| 6722 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); |
| 6723 cmds::%(name)s cmd; |
| 6724 cmd.Init(%(cmd_args)s, kBucketId); |
| 6725 if (kTests[ii] == kCount) { |
| 6726 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 6727 } else { |
| 6728 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
| 6729 } |
| 6730 } |
| 6731 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 6732 } |
| 6733 """ |
| 6734 self.WriteValidUnitTest(func, file, test, { |
| 6735 'cmd_args': ", ".join(cmd_args), |
| 6736 }, *extras) |
| 6737 |
| 6738 test = """ |
| 6739 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { |
| 6740 const uint32 kBucketId = 123; |
| 6741 const char kSource0[] = "hello"; |
| 6742 const char* kSource[] = { kSource0 }; |
| 6743 const char kInvalidStrEnd = '*'; |
| 6744 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); |
| 6745 cmds::%(name)s cmd; |
| 6746 cmd.Init(%(cmd_args)s, kBucketId); |
| 6747 decoder_->set_unsafe_es3_apis_enabled(true); |
| 6748 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
| 6749 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 6750 } |
| 6751 """ |
| 6752 self.WriteValidUnitTest(func, file, test, { |
| 6753 'cmd_args': ", ".join(cmd_args), |
| 6754 }, *extras) |
| 6755 |
6510 | 6756 |
6511 class PUTXnHandler(ArrayArgTypeHandler): | 6757 class PUTXnHandler(ArrayArgTypeHandler): |
6512 """Handler for glUniform?f functions.""" | 6758 """Handler for glUniform?f functions.""" |
6513 def __init__(self): | 6759 def __init__(self): |
6514 ArrayArgTypeHandler.__init__(self) | 6760 ArrayArgTypeHandler.__init__(self) |
6515 | 6761 |
6516 def WriteHandlerImplementation(self, func, file): | 6762 def WriteHandlerImplementation(self, func, file): |
6517 """Overrriden from TypeHandler.""" | 6763 """Overrriden from TypeHandler.""" |
6518 code = """ %(type)s temp[%(count)s] = { %(values)s};""" | 6764 code = """ %(type)s temp[%(count)s] = { %(values)s};""" |
6519 if func.IsUnsafe(): | 6765 if func.IsUnsafe(): |
(...skipping 1012 matching lines...) Loading... |
7532 | 7778 |
7533 def WriteDestinationInitalizationValidation(self, file, func): | 7779 def WriteDestinationInitalizationValidation(self, file, func): |
7534 """Overridden from Argument.""" | 7780 """Overridden from Argument.""" |
7535 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) | 7781 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) |
7536 | 7782 |
7537 def GetLogArg(self): | 7783 def GetLogArg(self): |
7538 """Overridden from Argument.""" | 7784 """Overridden from Argument.""" |
7539 return "static_cast<const void*>(%s)" % self.name | 7785 return "static_cast<const void*>(%s)" % self.name |
7540 | 7786 |
7541 | 7787 |
7542 class BucketPointerArgument(Argument): | |
7543 """A class that represents an bucket argument to a function.""" | |
7544 | |
7545 def __init__(self, name, type): | |
7546 Argument.__init__(self, name, type) | |
7547 | |
7548 def AddCmdArgs(self, args): | |
7549 """Overridden from Argument.""" | |
7550 pass | |
7551 | |
7552 def WriteGetCode(self, file): | |
7553 """Overridden from Argument.""" | |
7554 file.Write( | |
7555 " %s %s = bucket->GetData(0, data_size);\n" % | |
7556 (self.type, self.name)) | |
7557 | |
7558 def WriteValidationCode(self, file, func): | |
7559 """Overridden from Argument.""" | |
7560 pass | |
7561 | |
7562 def GetImmediateVersion(self): | |
7563 """Overridden from Argument.""" | |
7564 return None | |
7565 | |
7566 def WriteDestinationInitalizationValidation(self, file, func): | |
7567 """Overridden from Argument.""" | |
7568 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) | |
7569 | |
7570 def GetLogArg(self): | |
7571 """Overridden from Argument.""" | |
7572 return "static_cast<const void*>(%s)" % self.name | |
7573 | |
7574 | |
7575 class PointerArgument(Argument): | 7788 class PointerArgument(Argument): |
7576 """A class that represents a pointer argument to a function.""" | 7789 """A class that represents a pointer argument to a function.""" |
7577 | 7790 |
7578 def __init__(self, name, type): | 7791 def __init__(self, name, type): |
7579 Argument.__init__(self, name, type) | 7792 Argument.__init__(self, name, type) |
7580 | 7793 |
7581 def IsPointer(self): | 7794 def IsPointer(self): |
7582 """Returns true if argument is a pointer.""" | 7795 """Overridden from Argument.""" |
7583 return True | 7796 return True |
7584 | 7797 |
7585 def IsPointer2D(self): | 7798 def IsPointer2D(self): |
7586 """Returns true if argument is a 2D pointer.""" | 7799 """Overridden from Argument.""" |
7587 return self.type.count('*') == 2 | 7800 return self.type.count('*') == 2 |
7588 | 7801 |
7589 def GetPointedType(self): | 7802 def GetPointedType(self): |
7590 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) | 7803 match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) |
7591 assert match | 7804 assert match |
7592 return match.groupdict()['element_type'] | 7805 return match.groupdict()['element_type'] |
7593 | 7806 |
7594 def GetValidArg(self, func): | 7807 def GetValidArg(self, func): |
7595 """Overridden from Argument.""" | 7808 """Overridden from Argument.""" |
7596 return "shared_memory_id_, shared_memory_offset_" | 7809 return "shared_memory_id_, shared_memory_offset_" |
(...skipping 57 matching lines...) Loading... |
7654 if self.IsPointer2D(): | 7867 if self.IsPointer2D(): |
7655 return InputStringArrayBucketArgument(self.name, self.type) | 7868 return InputStringArrayBucketArgument(self.name, self.type) |
7656 return InputStringBucketArgument(self.name, self.type) | 7869 return InputStringBucketArgument(self.name, self.type) |
7657 return BucketPointerArgument(self.name, self.type) | 7870 return BucketPointerArgument(self.name, self.type) |
7658 | 7871 |
7659 def WriteDestinationInitalizationValidation(self, file, func): | 7872 def WriteDestinationInitalizationValidation(self, file, func): |
7660 """Overridden from Argument.""" | 7873 """Overridden from Argument.""" |
7661 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) | 7874 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) |
7662 | 7875 |
7663 | 7876 |
| 7877 class BucketPointerArgument(PointerArgument): |
| 7878 """A class that represents an bucket argument to a function.""" |
| 7879 |
| 7880 def __init__(self, name, type): |
| 7881 Argument.__init__(self, name, type) |
| 7882 |
| 7883 def AddCmdArgs(self, args): |
| 7884 """Overridden from Argument.""" |
| 7885 pass |
| 7886 |
| 7887 def WriteGetCode(self, file): |
| 7888 """Overridden from Argument.""" |
| 7889 file.Write( |
| 7890 " %s %s = bucket->GetData(0, data_size);\n" % |
| 7891 (self.type, self.name)) |
| 7892 |
| 7893 def WriteValidationCode(self, file, func): |
| 7894 """Overridden from Argument.""" |
| 7895 pass |
| 7896 |
| 7897 def GetImmediateVersion(self): |
| 7898 """Overridden from Argument.""" |
| 7899 return None |
| 7900 |
| 7901 def WriteDestinationInitalizationValidation(self, file, func): |
| 7902 """Overridden from Argument.""" |
| 7903 self.WriteDestinationInitalizationValidatationIfNeeded(file, func) |
| 7904 |
| 7905 def GetLogArg(self): |
| 7906 """Overridden from Argument.""" |
| 7907 return "static_cast<const void*>(%s)" % self.name |
| 7908 |
| 7909 |
7664 class InputStringBucketArgument(Argument): | 7910 class InputStringBucketArgument(Argument): |
7665 """A string input argument where the string is passed in a bucket.""" | 7911 """A string input argument where the string is passed in a bucket.""" |
7666 | 7912 |
7667 def __init__(self, name, type): | 7913 def __init__(self, name, type): |
7668 Argument.__init__(self, name + "_bucket_id", "uint32_t") | 7914 Argument.__init__(self, name + "_bucket_id", "uint32_t") |
7669 | 7915 |
| 7916 def IsPointer(self): |
| 7917 """Overridden from Argument.""" |
| 7918 return True |
| 7919 |
| 7920 def IsPointer2D(self): |
| 7921 """Overridden from Argument.""" |
| 7922 return False |
| 7923 |
7670 | 7924 |
7671 class InputStringArrayBucketArgument(Argument): | 7925 class InputStringArrayBucketArgument(Argument): |
7672 """A string array input argument where the strings are passed in a bucket.""" | 7926 """A string array input argument where the strings are passed in a bucket.""" |
7673 | 7927 |
7674 def __init__(self, name, type): | 7928 def __init__(self, name, type): |
7675 Argument.__init__(self, name + "_bucket_id", "uint32_t") | 7929 Argument.__init__(self, name + "_bucket_id", "uint32_t") |
7676 self._original_name = name | 7930 self._original_name = name |
7677 | 7931 |
7678 def WriteGetCode(self, file): | 7932 def WriteGetCode(self, file): |
7679 """Overridden from Argument.""" | 7933 """Overridden from Argument.""" |
(...skipping 45 matching lines...) Loading... |
7725 'name': self.name, | 7979 'name': self.name, |
7726 'original_name': self._original_name, | 7980 'original_name': self._original_name, |
7727 }) | 7981 }) |
7728 | 7982 |
7729 def GetValidArg(self, func): | 7983 def GetValidArg(self, func): |
7730 return "kNameBucketId" | 7984 return "kNameBucketId" |
7731 | 7985 |
7732 def GetValidGLArg(self, func): | 7986 def GetValidGLArg(self, func): |
7733 return "_" | 7987 return "_" |
7734 | 7988 |
| 7989 def IsPointer(self): |
| 7990 """Overridden from Argument.""" |
| 7991 return True |
| 7992 |
| 7993 def IsPointer2D(self): |
| 7994 """Overridden from Argument.""" |
| 7995 return True |
| 7996 |
7735 | 7997 |
7736 class ResourceIdArgument(Argument): | 7998 class ResourceIdArgument(Argument): |
7737 """A class that represents a resource id argument to a function.""" | 7999 """A class that represents a resource id argument to a function.""" |
7738 | 8000 |
7739 def __init__(self, name, type): | 8001 def __init__(self, name, type): |
7740 match = re.match("(GLid\w+)", type) | 8002 match = re.match("(GLid\w+)", type) |
7741 self.resource_type = match.group(1)[4:] | 8003 self.resource_type = match.group(1)[4:] |
7742 if self.resource_type == "Sync": | 8004 if self.resource_type == "Sync": |
7743 type = type.replace(match.group(1), "GLsync") | 8005 type = type.replace(match.group(1), "GLsync") |
7744 else: | 8006 else: |
(...skipping 883 matching lines...) Loading... |
8628 file.Write("#undef GLES2_CMD_OP\n") | 8890 file.Write("#undef GLES2_CMD_OP\n") |
8629 file.Write(" kNumCommands\n") | 8891 file.Write(" kNumCommands\n") |
8630 file.Write("};\n") | 8892 file.Write("};\n") |
8631 file.Write("\n") | 8893 file.Write("\n") |
8632 file.Close() | 8894 file.Close() |
8633 self.generated_cpp_filenames.append(file.filename) | 8895 self.generated_cpp_filenames.append(file.filename) |
8634 | 8896 |
8635 def WriteFormat(self, filename): | 8897 def WriteFormat(self, filename): |
8636 """Writes the command buffer format""" | 8898 """Writes the command buffer format""" |
8637 file = CHeaderWriter(filename) | 8899 file = CHeaderWriter(filename) |
| 8900 # Forward declaration of a few enums used in constant argument |
| 8901 # to avoid including GL header files. |
| 8902 enum_defines = { |
| 8903 'GL_SYNC_GPU_COMMANDS_COMPLETE': 0x9117, |
| 8904 } |
| 8905 file.Write('\n') |
| 8906 for enum in enum_defines: |
| 8907 file.Write("#define %s 0x%x\n" % (enum, enum_defines[enum])) |
| 8908 file.Write('\n') |
8638 for func in self.functions: | 8909 for func in self.functions: |
8639 if True: | 8910 if True: |
8640 #gen_cmd = func.GetInfo('gen_cmd') | 8911 #gen_cmd = func.GetInfo('gen_cmd') |
8641 #if gen_cmd == True or gen_cmd == None: | 8912 #if gen_cmd == True or gen_cmd == None: |
8642 func.WriteStruct(file) | 8913 func.WriteStruct(file) |
8643 file.Write("\n") | 8914 file.Write("\n") |
8644 file.Close() | 8915 file.Close() |
8645 self.generated_cpp_filenames.append(file.filename) | 8916 self.generated_cpp_filenames.append(file.filename) |
8646 | 8917 |
8647 def WriteDocs(self, filename): | 8918 def WriteDocs(self, filename): |
(...skipping 1142 matching lines...) Loading... |
9790 Format(gen.generated_cpp_filenames) | 10061 Format(gen.generated_cpp_filenames) |
9791 | 10062 |
9792 if gen.errors > 0: | 10063 if gen.errors > 0: |
9793 print "%d errors" % gen.errors | 10064 print "%d errors" % gen.errors |
9794 return 1 | 10065 return 1 |
9795 return 0 | 10066 return 0 |
9796 | 10067 |
9797 | 10068 |
9798 if __name__ == '__main__': | 10069 if __name__ == '__main__': |
9799 sys.exit(main(sys.argv[1:])) | 10070 sys.exit(main(sys.argv[1:])) |
OLD | NEW |