| 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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...) Expand 10 before | Expand all | Expand 10 after 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 |