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 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 'BufferParameter': { | 932 'BufferParameter': { |
933 'type': 'GLenum', | 933 'type': 'GLenum', |
934 'valid': [ | 934 'valid': [ |
935 'GL_BUFFER_SIZE', | 935 'GL_BUFFER_SIZE', |
936 'GL_BUFFER_USAGE', | 936 'GL_BUFFER_USAGE', |
937 ], | 937 ], |
938 'invalid': [ | 938 'invalid': [ |
939 'GL_PIXEL_PACK_BUFFER', | 939 'GL_PIXEL_PACK_BUFFER', |
940 ], | 940 ], |
941 }, | 941 }, |
| 942 'BufferMode': { |
| 943 'type': 'GLenum', |
| 944 'valid': [ |
| 945 'GL_INTERLEAVED_ATTRIBS', |
| 946 'GL_SEPARATE_ATTRIBS', |
| 947 ], |
| 948 'invalid': [ |
| 949 'GL_PIXEL_PACK_BUFFER', |
| 950 ], |
| 951 }, |
942 'FrameBufferParameter': { | 952 'FrameBufferParameter': { |
943 'type': 'GLenum', | 953 'type': 'GLenum', |
944 'valid': [ | 954 'valid': [ |
945 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', | 955 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE', |
946 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', | 956 'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME', |
947 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', | 957 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL', |
948 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', | 958 'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE', |
949 ], | 959 ], |
950 }, | 960 }, |
951 'MatrixMode': { | 961 'MatrixMode': { |
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1705 }, | 1715 }, |
1706 'CopyTexImage2D': { | 1716 'CopyTexImage2D': { |
1707 'decoder_func': 'DoCopyTexImage2D', | 1717 'decoder_func': 'DoCopyTexImage2D', |
1708 'unit_test': False, | 1718 'unit_test': False, |
1709 'defer_reads': True, | 1719 'defer_reads': True, |
1710 }, | 1720 }, |
1711 'CopyTexSubImage2D': { | 1721 'CopyTexSubImage2D': { |
1712 'decoder_func': 'DoCopyTexSubImage2D', | 1722 'decoder_func': 'DoCopyTexSubImage2D', |
1713 'defer_reads': True, | 1723 'defer_reads': True, |
1714 }, | 1724 }, |
| 1725 'CopyTexSubImage3D': { |
| 1726 'defer_reads': True, |
| 1727 'unsafe': True, |
| 1728 }, |
1715 'CreateImageCHROMIUM': { | 1729 'CreateImageCHROMIUM': { |
1716 'type': 'Manual', | 1730 'type': 'Manual', |
1717 'cmd_args': | 1731 'cmd_args': |
1718 'ClientBuffer buffer, GLsizei width, GLsizei height, ' | 1732 'ClientBuffer buffer, GLsizei width, GLsizei height, ' |
1719 'GLenum internalformat', | 1733 'GLenum internalformat', |
1720 'result': ['GLuint'], | 1734 'result': ['GLuint'], |
1721 'client_test': False, | 1735 'client_test': False, |
1722 'gen_cmd': False, | 1736 'gen_cmd': False, |
1723 'expectation': False, | 1737 'expectation': False, |
1724 'extension': True, | 1738 'extension': True, |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2441 'first_element_only': True, | 2455 'first_element_only': True, |
2442 'unsafe': True, | 2456 'unsafe': True, |
2443 }, | 2457 }, |
2444 'ShaderBinary': { | 2458 'ShaderBinary': { |
2445 'type': 'Custom', | 2459 'type': 'Custom', |
2446 'client_test': False, | 2460 'client_test': False, |
2447 }, | 2461 }, |
2448 'ShaderSource': { | 2462 'ShaderSource': { |
2449 'type': 'PUTSTR', | 2463 'type': 'PUTSTR', |
2450 'decoder_func': 'DoShaderSource', | 2464 'decoder_func': 'DoShaderSource', |
| 2465 'expectation': False, |
2451 'data_transfer_methods': ['bucket'], | 2466 'data_transfer_methods': ['bucket'], |
2452 'cmd_args': | 2467 'cmd_args': |
2453 'GLuint shader, const char** str', | 2468 'GLuint shader, const char** str', |
2454 'pepper_args': | 2469 'pepper_args': |
2455 'GLuint shader, GLsizei count, const char** str, const GLint* length', | 2470 'GLuint shader, GLsizei count, const char** str, const GLint* length', |
2456 }, | 2471 }, |
2457 'StencilMask': { | 2472 'StencilMask': { |
2458 'type': 'StateSetFrontBack', | 2473 'type': 'StateSetFrontBack', |
2459 'state': 'StencilMask', | 2474 'state': 'StencilMask', |
2460 'no_gl': True, | 2475 'no_gl': True, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2538 'type': 'Manual', | 2553 'type': 'Manual', |
2539 'data_transfer_methods': ['shm'], | 2554 'data_transfer_methods': ['shm'], |
2540 'client_test': False, | 2555 'client_test': False, |
2541 'cmd_args': 'GLenumTextureTarget target, GLint level, ' | 2556 'cmd_args': 'GLenumTextureTarget target, GLint level, ' |
2542 'GLint xoffset, GLint yoffset, GLint zoffset, ' | 2557 'GLint xoffset, GLint yoffset, GLint zoffset, ' |
2543 'GLsizei width, GLsizei height, GLsizei depth, ' | 2558 'GLsizei width, GLsizei height, GLsizei depth, ' |
2544 'GLenumTextureFormat format, GLenumPixelType type, ' | 2559 'GLenumTextureFormat format, GLenumPixelType type, ' |
2545 'const void* pixels, GLboolean internal', | 2560 'const void* pixels, GLboolean internal', |
2546 'unsafe': True, | 2561 'unsafe': True, |
2547 }, | 2562 }, |
| 2563 'TransformFeedbackVaryings': { |
| 2564 'type': 'PUTSTR', |
| 2565 'data_transfer_methods': ['bucket'], |
| 2566 'decoder_func': 'DoTransformFeedbackVaryings', |
| 2567 'cmd_args': |
| 2568 'GLuint program, const char** varyings, GLenum buffermode', |
| 2569 'unsafe': True, |
| 2570 }, |
2548 'Uniform1f': {'type': 'PUTXn', 'count': 1}, | 2571 'Uniform1f': {'type': 'PUTXn', 'count': 1}, |
2549 'Uniform1fv': { | 2572 'Uniform1fv': { |
2550 'type': 'PUTn', | 2573 'type': 'PUTn', |
2551 'count': 1, | 2574 'count': 1, |
2552 'decoder_func': 'DoUniform1fv', | 2575 'decoder_func': 'DoUniform1fv', |
2553 }, | 2576 }, |
2554 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, | 2577 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, |
2555 'Uniform1iv': { | 2578 'Uniform1iv': { |
2556 'type': 'PUTn', | 2579 'type': 'PUTn', |
2557 'count': 1, | 2580 'count': 1, |
(...skipping 3857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6415 'data': data_arg.name, | 6438 'data': data_arg.name, |
6416 'length': length_arg.name if not length_arg == None else '' | 6439 'length': length_arg.name if not length_arg == None else '' |
6417 }) | 6440 }) |
6418 for arg in func.GetOriginalArgs(): | 6441 for arg in func.GetOriginalArgs(): |
6419 arg.WriteClientSideValidationCode(file, func) | 6442 arg.WriteClientSideValidationCode(file, func) |
6420 size_code_block = """ // Compute the total size. | 6443 size_code_block = """ // Compute the total size. |
6421 base::CheckedNumeric<size_t> total_size = count; | 6444 base::CheckedNumeric<size_t> total_size = count; |
6422 total_size += 1; | 6445 total_size += 1; |
6423 total_size *= sizeof(GLint); | 6446 total_size *= sizeof(GLint); |
6424 if (!total_size.IsValid()) { | 6447 if (!total_size.IsValid()) { |
6425 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6448 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6426 return; | 6449 return; |
6427 } | 6450 } |
6428 size_t header_size = total_size.ValueOrDefault(0); | 6451 size_t header_size = total_size.ValueOrDefault(0); |
6429 std::vector<GLint> header(count + 1); | 6452 std::vector<GLint> header(count + 1); |
6430 header[0] = static_cast<GLint>(count); | 6453 header[0] = static_cast<GLint>(count); |
6431 for (GLsizei ii = 0; ii < count; ++ii) { | 6454 for (GLsizei ii = 0; ii < count; ++ii) { |
6432 GLint len = 0; | 6455 GLint len = 0; |
6433 if (%(data)s[ii]) {""" | 6456 if (%(data)s[ii]) {""" |
6434 if length_arg == None: | 6457 if length_arg == None: |
6435 size_code_block += """ | 6458 size_code_block += """ |
6436 len = base::static_cast<GLint>(strlen(%(data)s[ii]));""" | 6459 len = static_cast<GLint>(strlen(%(data)s[ii]));""" |
6437 else: | 6460 else: |
6438 size_code_block += """ | 6461 size_code_block += """ |
6439 len = (%(length)s && %(length)s[ii] >= 0) ? | 6462 len = (%(length)s && %(length)s[ii] >= 0) ? |
6440 %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" | 6463 %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" |
6441 size_code_block += """ | 6464 size_code_block += """ |
6442 } | 6465 } |
6443 total_size += len; | 6466 total_size += len; |
6444 total_size += 1; // NULL at the end of each char array. | 6467 total_size += 1; // NULL at the end of each char array. |
6445 if (!total_size.IsValid()) { | 6468 if (!total_size.IsValid()) { |
6446 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6469 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6447 return; | 6470 return; |
6448 } | 6471 } |
6449 header[ii + 1] = len; | 6472 header[ii + 1] = len; |
6450 } | 6473 } |
6451 """ | 6474 """ |
6452 file.Write(size_code_block % { | 6475 file.Write(size_code_block % { |
6453 'data': data_arg.name, | 6476 'data': data_arg.name, |
6454 'length': length_arg.name if not length_arg == None else '' | 6477 'length': length_arg.name if not length_arg == None else '', |
| 6478 'func_name': func.name, |
6455 }) | 6479 }) |
6456 data_code_block = """ // Pack data into a bucket on the service. | 6480 data_code_block = """ // Pack data into a bucket on the service. |
6457 helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); | 6481 helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
6458 size_t offset = 0; | 6482 size_t offset = 0; |
6459 for (GLsizei ii = 0; ii <= count; ++ii) { | 6483 for (GLsizei ii = 0; ii <= count; ++ii) { |
6460 const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : | 6484 const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : |
6461 %(data)s[ii - 1]; | 6485 %(data)s[ii - 1]; |
6462 base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : | 6486 base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : |
6463 static_cast<size_t>(header[ii]); | 6487 static_cast<size_t>(header[ii]); |
6464 if (ii > 0) { | 6488 if (ii > 0) { |
6465 checked_size += 1; // NULL in the end. | 6489 checked_size += 1; // NULL in the end. |
6466 } | 6490 } |
6467 if (!checked_size.IsValid()) { | 6491 if (!checked_size.IsValid()) { |
6468 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6492 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6469 return; | 6493 return; |
6470 } | 6494 } |
6471 size_t size = checked_size.ValueOrDefault(0); | 6495 size_t size = checked_size.ValueOrDefault(0); |
6472 while (size) { | 6496 while (size) { |
6473 ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); | 6497 ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
6474 if (!buffer.valid() || buffer.size() == 0) { | 6498 if (!buffer.valid() || buffer.size() == 0) { |
6475 SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large"); | 6499 SetGLError(GL_OUT_OF_MEMORY, "gl%(func_name)s", "too large"); |
6476 return; | 6500 return; |
6477 } | 6501 } |
6478 size_t copy_size = buffer.size(); | 6502 size_t copy_size = buffer.size(); |
6479 if (ii > 0 && buffer.size() == size) | 6503 if (ii > 0 && buffer.size() == size) |
6480 --copy_size; | 6504 --copy_size; |
6481 if (copy_size) | 6505 if (copy_size) |
6482 memcpy(buffer.address(), src, copy_size); | 6506 memcpy(buffer.address(), src, copy_size); |
6483 if (copy_size < buffer.size()) { | 6507 if (copy_size < buffer.size()) { |
6484 // Append NULL in the end. | 6508 // Append NULL in the end. |
6485 DCHECK(copy_size + 1 == buffer.size()); | 6509 DCHECK(copy_size + 1 == buffer.size()); |
6486 char* str = reinterpret_cast<char*>(buffer.address()); | 6510 char* str = reinterpret_cast<char*>(buffer.address()); |
6487 str[copy_size] = 0; | 6511 str[copy_size] = 0; |
6488 } | 6512 } |
6489 helper_->SetBucketData(kResultBucketId, offset, buffer.size(), | 6513 helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |
6490 buffer.shm_id(), buffer.offset()); | 6514 buffer.shm_id(), buffer.offset()); |
6491 offset += buffer.size(); | 6515 offset += buffer.size(); |
6492 src += buffer.size(); | 6516 src += buffer.size(); |
6493 size -= buffer.size(); | 6517 size -= buffer.size(); |
6494 } | 6518 } |
6495 } | 6519 } |
6496 DCHECK_EQ(total_size.ValueOrDefault(0), offset); | 6520 DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
6497 """ | 6521 """ |
6498 file.Write(data_code_block % { | 6522 file.Write(data_code_block % { |
6499 'data': data_arg.name, | 6523 'data': data_arg.name, |
6500 'length': length_arg.name if not length_arg == None else '' | 6524 'length': length_arg.name if not length_arg == None else '', |
| 6525 'func_name': func.name, |
6501 }) | 6526 }) |
6502 bucket_cmd_arg_string = "" | 6527 bucket_args = [] |
6503 for arg in func.GetCmdArgs()[0:-2]: | 6528 for arg in func.GetOriginalArgs(): |
6504 if bucket_cmd_arg_string: | 6529 if arg.name == 'count' or arg == self.__GetLengthArg(func): |
6505 bucket_cmd_arg_string += ", " | 6530 continue |
6506 bucket_cmd_arg_string += arg.name | 6531 if arg == self.__GetDataArg(func): |
6507 if bucket_cmd_arg_string: | 6532 bucket_args.append('kResultBucketId') |
6508 bucket_cmd_arg_string += ", " | 6533 else: |
6509 bucket_cmd_arg_string += 'kResultBucketId' | 6534 bucket_args.append(arg.name) |
6510 file.Write(" helper_->%sBucket(%s);\n" % | 6535 file.Write(" helper_->%sBucket(%s);\n" % |
6511 (func.name, bucket_cmd_arg_string)) | 6536 (func.name, ", ".join(bucket_args))) |
6512 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); | 6537 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); |
6513 file.Write(" CheckGLError();\n") | 6538 file.Write(" CheckGLError();\n") |
6514 file.Write("}\n") | 6539 file.Write("}\n") |
6515 file.Write("\n") | 6540 file.Write("\n") |
6516 | 6541 |
6517 def WriteGLES2ImplementationUnitTest(self, func, file): | 6542 def WriteGLES2ImplementationUnitTest(self, func, file): |
6518 """Overrriden from TypeHandler.""" | 6543 """Overrriden from TypeHandler.""" |
6519 code = """ | 6544 code = """ |
6520 TEST_F(GLES2ImplementationTest, %(name)s) { | 6545 TEST_F(GLES2ImplementationTest, %(name)s) { |
6521 const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 6546 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
(...skipping 10 matching lines...) Expand all Loading... |
6532 const size_t kPaddedString2Size = | 6557 const size_t kPaddedString2Size = |
6533 transfer_buffer_->RoundToAlignment(kString2Size); | 6558 transfer_buffer_->RoundToAlignment(kString2Size); |
6534 struct Cmds { | 6559 struct Cmds { |
6535 cmd::SetBucketSize set_bucket_size; | 6560 cmd::SetBucketSize set_bucket_size; |
6536 cmd::SetBucketData set_bucket_header; | 6561 cmd::SetBucketData set_bucket_header; |
6537 cmd::SetToken set_token1; | 6562 cmd::SetToken set_token1; |
6538 cmd::SetBucketData set_bucket_data1; | 6563 cmd::SetBucketData set_bucket_data1; |
6539 cmd::SetToken set_token2; | 6564 cmd::SetToken set_token2; |
6540 cmd::SetBucketData set_bucket_data2; | 6565 cmd::SetBucketData set_bucket_data2; |
6541 cmd::SetToken set_token3; | 6566 cmd::SetToken set_token3; |
6542 cmds::ShaderSourceBucket shader_source_bucket; | 6567 cmds::%(name)sBucket cmd_bucket; |
6543 cmd::SetBucketSize clear_bucket_size; | 6568 cmd::SetBucketSize clear_bucket_size; |
6544 }; | 6569 }; |
6545 | 6570 |
6546 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); | 6571 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); |
6547 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); | 6572 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); |
6548 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); | 6573 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); |
6549 | 6574 |
6550 Cmds expected; | 6575 Cmds expected; |
6551 expected.set_bucket_size.Init(kBucketId, kSourceSize); | 6576 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
6552 expected.set_bucket_header.Init( | 6577 expected.set_bucket_header.Init( |
6553 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); | 6578 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
6554 expected.set_token1.Init(GetNextToken()); | 6579 expected.set_token1.Init(GetNextToken()); |
6555 expected.set_bucket_data1.Init( | 6580 expected.set_bucket_data1.Init( |
6556 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset); | 6581 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset); |
6557 expected.set_token2.Init(GetNextToken()); | 6582 expected.set_token2.Init(GetNextToken()); |
6558 expected.set_bucket_data2.Init( | 6583 expected.set_bucket_data2.Init( |
6559 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, | 6584 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, |
6560 mem2.offset); | 6585 mem2.offset); |
6561 expected.set_token3.Init(GetNextToken()); | 6586 expected.set_token3.Init(GetNextToken()); |
6562 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); | 6587 expected.cmd_bucket.Init(%(bucket_args)s); |
6563 expected.clear_bucket_size.Init(kBucketId, 0); | 6588 expected.clear_bucket_size.Init(kBucketId, 0); |
6564 const char* kStrings[] = { kString1, kString2 }; | 6589 const char* kStrings[] = { kString1, kString2 }; |
6565 gl_->%(name)s(%(gl_args)s); | 6590 gl_->%(name)s(%(gl_args)s); |
6566 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 6591 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
6567 } | 6592 } |
6568 """ | 6593 """ |
6569 gl_args = [] | 6594 gl_args = [] |
6570 cmd_args = [] | 6595 bucket_args = [] |
6571 for arg in func.GetOriginalArgs(): | 6596 for arg in func.GetOriginalArgs(): |
6572 if arg == self.__GetDataArg(func): | 6597 if arg == self.__GetDataArg(func): |
6573 gl_args.append('kStrings') | 6598 gl_args.append('kStrings') |
| 6599 bucket_args.append('kBucketId') |
6574 elif arg == self.__GetLengthArg(func): | 6600 elif arg == self.__GetLengthArg(func): |
6575 gl_args.append('NULL') | 6601 gl_args.append('NULL') |
6576 elif arg.name == 'count': | 6602 elif arg.name == 'count': |
6577 gl_args.append('2') | 6603 gl_args.append('2') |
6578 else: | 6604 else: |
6579 gl_args.append(arg.GetValidClientSideArg(func)) | 6605 gl_args.append(arg.GetValidClientSideArg(func)) |
6580 cmd_args.append(arg.GetValidClientSideArg(func)) | 6606 bucket_args.append(arg.GetValidClientSideArg(func)) |
6581 file.Write(code % { | 6607 file.Write(code % { |
6582 'name': func.name, | 6608 'name': func.name, |
6583 'gl_args': ", ".join(gl_args), | 6609 'gl_args': ", ".join(gl_args), |
6584 'cmd_args': ", ".join(cmd_args), | 6610 'bucket_args': ", ".join(bucket_args), |
6585 }) | 6611 }) |
6586 | 6612 |
6587 if self.__GetLengthArg(func) == None: | 6613 if self.__GetLengthArg(func) == None: |
6588 return | 6614 return |
6589 code = """ | 6615 code = """ |
6590 TEST_F(GLES2ImplementationTest, %(name)sWithLength) { | 6616 TEST_F(GLES2ImplementationTest, %(name)sWithLength) { |
6591 const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 6617 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
6592 const char* kString = "foobar******"; | 6618 const char* kString = "foobar******"; |
6593 const size_t kStringSize = 6; // We only need "foobar". | 6619 const size_t kStringSize = 6; // We only need "foobar". |
6594 const size_t kHeaderSize = sizeof(GLint) * 2; | 6620 const size_t kHeaderSize = sizeof(GLint) * 2; |
(...skipping 16 matching lines...) Expand all Loading... |
6611 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize); | 6637 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize); |
6612 | 6638 |
6613 Cmds expected; | 6639 Cmds expected; |
6614 expected.set_bucket_size.Init(kBucketId, kSourceSize); | 6640 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
6615 expected.set_bucket_header.Init( | 6641 expected.set_bucket_header.Init( |
6616 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); | 6642 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
6617 expected.set_token1.Init(GetNextToken()); | 6643 expected.set_token1.Init(GetNextToken()); |
6618 expected.set_bucket_data.Init( | 6644 expected.set_bucket_data.Init( |
6619 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); | 6645 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); |
6620 expected.set_token2.Init(GetNextToken()); | 6646 expected.set_token2.Init(GetNextToken()); |
6621 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); | 6647 expected.shader_source_bucket.Init(%(bucket_args)s); |
6622 expected.clear_bucket_size.Init(kBucketId, 0); | 6648 expected.clear_bucket_size.Init(kBucketId, 0); |
6623 const char* kStrings[] = { kString }; | 6649 const char* kStrings[] = { kString }; |
6624 const GLint kLength[] = { kStringSize }; | 6650 const GLint kLength[] = { kStringSize }; |
6625 gl_->%(name)s(%(gl_args)s); | 6651 gl_->%(name)s(%(gl_args)s); |
6626 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 6652 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
6627 } | 6653 } |
6628 """ | 6654 """ |
6629 gl_args = [] | 6655 gl_args = [] |
6630 for arg in func.GetOriginalArgs(): | 6656 for arg in func.GetOriginalArgs(): |
6631 if arg == self.__GetDataArg(func): | 6657 if arg == self.__GetDataArg(func): |
6632 gl_args.append('kStrings') | 6658 gl_args.append('kStrings') |
6633 elif arg == self.__GetLengthArg(func): | 6659 elif arg == self.__GetLengthArg(func): |
6634 gl_args.append('kLength') | 6660 gl_args.append('kLength') |
6635 elif arg.name == 'count': | 6661 elif arg.name == 'count': |
6636 gl_args.append('1') | 6662 gl_args.append('1') |
6637 else: | 6663 else: |
6638 gl_args.append(arg.GetValidClientSideArg(func)) | 6664 gl_args.append(arg.GetValidClientSideArg(func)) |
6639 file.Write(code % { | 6665 file.Write(code % { |
6640 'name': func.name, | 6666 'name': func.name, |
6641 'gl_args': ", ".join(gl_args), | 6667 'gl_args': ", ".join(gl_args), |
6642 'cmd_args': ", ".join(cmd_args), | 6668 'bucket_args': ", ".join(bucket_args), |
6643 }) | 6669 }) |
6644 | 6670 |
6645 def WriteBucketServiceUnitTest(self, func, file, *extras): | 6671 def WriteBucketServiceUnitTest(self, func, file, *extras): |
6646 """Overrriden from TypeHandler.""" | 6672 """Overrriden from TypeHandler.""" |
6647 cmd_args = [] | 6673 cmd_args = [] |
6648 cmd_args_with_invalid_id = [] | 6674 cmd_args_with_invalid_id = [] |
| 6675 gl_args = [] |
6649 for index, arg in enumerate(func.GetOriginalArgs()): | 6676 for index, arg in enumerate(func.GetOriginalArgs()): |
6650 if (arg == self.__GetLengthArg(func) or | 6677 if arg == self.__GetLengthArg(func): |
6651 arg == self.__GetDataArg(func) or arg.name == 'count'): | 6678 gl_args.append('_') |
6652 continue | 6679 elif arg.name == 'count': |
6653 if index == 0: # Resource ID arg | 6680 gl_args.append('1') |
| 6681 elif arg == self.__GetDataArg(func): |
| 6682 cmd_args.append('kBucketId') |
| 6683 cmd_args_with_invalid_id.append('kBucketId') |
| 6684 gl_args.append('_') |
| 6685 elif index == 0: # Resource ID arg |
6654 cmd_args.append(arg.GetValidArg(func)) | 6686 cmd_args.append(arg.GetValidArg(func)) |
6655 cmd_args_with_invalid_id.append('kInvalidClientId') | 6687 cmd_args_with_invalid_id.append('kInvalidClientId') |
| 6688 gl_args.append(arg.GetValidGLArg(func)) |
6656 else: | 6689 else: |
6657 cmd_args.append(arg.GetValidArg(func)) | 6690 cmd_args.append(arg.GetValidArg(func)) |
6658 cmd_args_with_invalid_id.append(arg.GetValidArg(func)) | 6691 cmd_args_with_invalid_id.append(arg.GetValidArg(func)) |
| 6692 gl_args.append(arg.GetValidGLArg(func)) |
6659 | 6693 |
6660 test = """ | 6694 test = """ |
6661 TEST_P(%(test_name)s, %(name)sValidArgs) { | 6695 TEST_P(%(test_name)s, %(name)sValidArgs) { |
| 6696 EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); |
6662 const uint32 kBucketId = 123; | 6697 const uint32 kBucketId = 123; |
6663 const char kSource0[] = "hello"; | 6698 const char kSource0[] = "hello"; |
6664 const char* kSource[] = { kSource0 }; | 6699 const char* kSource[] = { kSource0 }; |
6665 const char kValidStrEnd = 0; | 6700 const char kValidStrEnd = 0; |
6666 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); | 6701 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
6667 cmds::%(name)s cmd; | 6702 cmds::%(name)s cmd; |
6668 cmd.Init(%(cmd_args)s, kBucketId); | 6703 cmd.Init(%(cmd_args)s); |
6669 decoder_->set_unsafe_es3_apis_enabled(true); | 6704 decoder_->set_unsafe_es3_apis_enabled(true); |
6670 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" | 6705 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" |
6671 if func.IsUnsafe(): | 6706 if func.IsUnsafe(): |
6672 test += """ | 6707 test += """ |
6673 decoder_->set_unsafe_es3_apis_enabled(false); | 6708 decoder_->set_unsafe_es3_apis_enabled(false); |
6674 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | 6709 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
6675 """ | 6710 """ |
6676 test += """ | 6711 test += """ |
6677 } | 6712 } |
6678 """ | 6713 """ |
6679 self.WriteValidUnitTest(func, file, test, { | 6714 self.WriteValidUnitTest(func, file, test, { |
6680 'cmd_args': ", ".join(cmd_args), | 6715 'cmd_args': ", ".join(cmd_args), |
| 6716 'gl_args': ", ".join(gl_args), |
6681 }, *extras) | 6717 }, *extras) |
6682 | 6718 |
6683 test = """ | 6719 test = """ |
6684 TEST_P(%(test_name)s, %(name)sInvalidArgs) { | 6720 TEST_P(%(test_name)s, %(name)sInvalidArgs) { |
6685 const uint32 kBucketId = 123; | 6721 const uint32 kBucketId = 123; |
6686 const char kSource0[] = "hello"; | 6722 const char kSource0[] = "hello"; |
6687 const char* kSource[] = { kSource0 }; | 6723 const char* kSource[] = { kSource0 }; |
6688 const char kValidStrEnd = 0; | 6724 const char kValidStrEnd = 0; |
6689 decoder_->set_unsafe_es3_apis_enabled(true); | 6725 decoder_->set_unsafe_es3_apis_enabled(true); |
6690 cmds::%(name)s cmd; | 6726 cmds::%(name)s cmd; |
6691 // Test no bucket. | 6727 // Test no bucket. |
6692 cmd.Init(%(cmd_args)s, kBucketId); | 6728 cmd.Init(%(cmd_args)s); |
6693 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 6729 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
6694 // Test invalid client. | 6730 // Test invalid client. |
6695 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); | 6731 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
6696 cmd.Init(%(cmd_args_with_invalid_id)s, kBucketId); | 6732 cmd.Init(%(cmd_args_with_invalid_id)s); |
6697 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 6733 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
6698 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 6734 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
6699 } | 6735 } |
6700 """ | 6736 """ |
6701 self.WriteValidUnitTest(func, file, test, { | 6737 self.WriteValidUnitTest(func, file, test, { |
6702 'cmd_args': ", ".join(cmd_args), | 6738 'cmd_args': ", ".join(cmd_args), |
6703 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id), | 6739 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id), |
6704 }, *extras) | 6740 }, *extras) |
6705 | 6741 |
6706 test = """ | 6742 test = """ |
6707 TEST_P(%(test_name)s, %(name)sInvalidHeader) { | 6743 TEST_P(%(test_name)s, %(name)sInvalidHeader) { |
6708 const uint32 kBucketId = 123; | 6744 const uint32 kBucketId = 123; |
6709 const char kSource0[] = "hello"; | 6745 const char kSource0[] = "hello"; |
6710 const char* kSource[] = { kSource0 }; | 6746 const char* kSource[] = { kSource0 }; |
6711 const char kValidStrEnd = 0; | 6747 const char kValidStrEnd = 0; |
6712 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); | 6748 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); |
6713 const GLsizei kTests[] = { | 6749 const GLsizei kTests[] = { |
6714 kCount, | 6750 kCount + 1, |
6715 0, | 6751 0, |
6716 std::numeric_limits<GLsizei>::max(), | 6752 std::numeric_limits<GLsizei>::max(), |
6717 -1, | 6753 -1, |
6718 kCount, | |
6719 }; | 6754 }; |
6720 decoder_->set_unsafe_es3_apis_enabled(true); | 6755 decoder_->set_unsafe_es3_apis_enabled(true); |
6721 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { | 6756 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
6722 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); | 6757 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); |
6723 cmds::%(name)s cmd; | 6758 cmds::%(name)s cmd; |
6724 cmd.Init(%(cmd_args)s, kBucketId); | 6759 cmd.Init(%(cmd_args)s); |
6725 if (kTests[ii] == kCount) { | 6760 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
6726 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6727 } else { | |
6728 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | |
6729 } | |
6730 } | 6761 } |
6731 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6732 } | 6762 } |
6733 """ | 6763 """ |
6734 self.WriteValidUnitTest(func, file, test, { | 6764 self.WriteValidUnitTest(func, file, test, { |
6735 'cmd_args': ", ".join(cmd_args), | 6765 'cmd_args': ", ".join(cmd_args), |
6736 }, *extras) | 6766 }, *extras) |
6737 | 6767 |
6738 test = """ | 6768 test = """ |
6739 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { | 6769 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { |
6740 const uint32 kBucketId = 123; | 6770 const uint32 kBucketId = 123; |
6741 const char kSource0[] = "hello"; | 6771 const char kSource0[] = "hello"; |
6742 const char* kSource[] = { kSource0 }; | 6772 const char* kSource[] = { kSource0 }; |
6743 const char kInvalidStrEnd = '*'; | 6773 const char kInvalidStrEnd = '*'; |
6744 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); | 6774 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); |
6745 cmds::%(name)s cmd; | 6775 cmds::%(name)s cmd; |
6746 cmd.Init(%(cmd_args)s, kBucketId); | 6776 cmd.Init(%(cmd_args)s); |
6747 decoder_->set_unsafe_es3_apis_enabled(true); | 6777 decoder_->set_unsafe_es3_apis_enabled(true); |
6748 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | 6778 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
6749 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6750 } | 6779 } |
6751 """ | 6780 """ |
6752 self.WriteValidUnitTest(func, file, test, { | 6781 self.WriteValidUnitTest(func, file, test, { |
6753 'cmd_args': ", ".join(cmd_args), | 6782 'cmd_args': ", ".join(cmd_args), |
6754 }, *extras) | 6783 }, *extras) |
6755 | 6784 |
6756 | 6785 |
6757 class PUTXnHandler(ArrayArgTypeHandler): | 6786 class PUTXnHandler(ArrayArgTypeHandler): |
6758 """Handler for glUniform?f functions.""" | 6787 """Handler for glUniform?f functions.""" |
6759 def __init__(self): | 6788 def __init__(self): |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7544 if func.IsImmediate(): | 7573 if func.IsImmediate(): |
7545 return 0 | 7574 return 0 |
7546 return 1 | 7575 return 1 |
7547 | 7576 |
7548 def GetInvalidArg(self, index): | 7577 def GetInvalidArg(self, index): |
7549 """overridden from Argument.""" | 7578 """overridden from Argument.""" |
7550 return ("-1", "kNoError", "GL_INVALID_VALUE") | 7579 return ("-1", "kNoError", "GL_INVALID_VALUE") |
7551 | 7580 |
7552 def WriteValidationCode(self, file, func): | 7581 def WriteValidationCode(self, file, func): |
7553 """overridden from Argument.""" | 7582 """overridden from Argument.""" |
7554 file.Write(" if (%s < 0) {\n" % self.name) | 7583 if func.IsUnsafe(): |
7555 file.Write( | 7584 return |
7556 " LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" % | 7585 code = """ if (%(var_name)s < 0) { |
7557 (func.original_name, self.name)) | 7586 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0"); |
7558 file.Write(" return error::kNoError;\n") | 7587 return error::kNoError; |
7559 file.Write(" }\n") | 7588 } |
| 7589 """ |
| 7590 file.Write(code % { |
| 7591 "var_name": self.name, |
| 7592 "func_name": func.original_name, |
| 7593 }) |
7560 | 7594 |
7561 def WriteClientSideValidationCode(self, file, func): | 7595 def WriteClientSideValidationCode(self, file, func): |
7562 """overridden from Argument.""" | 7596 """overridden from Argument.""" |
7563 file.Write(" if (%s < 0) {\n" % self.name) | 7597 code = """ if (%(var_name)s < 0) { |
7564 file.Write( | 7598 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0"); |
7565 " SetGLError(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" % | 7599 return; |
7566 (func.original_name, self.name)) | 7600 } |
7567 file.Write(" return;\n") | 7601 """ |
7568 file.Write(" }\n") | 7602 file.Write(code % { |
| 7603 "var_name": self.name, |
| 7604 "func_name": func.original_name, |
| 7605 }) |
7569 | 7606 |
7570 | 7607 |
7571 class SizeNotNegativeArgument(SizeArgument): | 7608 class SizeNotNegativeArgument(SizeArgument): |
7572 """class for GLsizeiNotNegative. It's NEVER allowed to be negative""" | 7609 """class for GLsizeiNotNegative. It's NEVER allowed to be negative""" |
7573 | 7610 |
7574 def __init__(self, name, type, gl_type): | 7611 def __init__(self, name, type, gl_type): |
7575 SizeArgument.__init__(self, name, gl_type) | 7612 SizeArgument.__init__(self, name, gl_type) |
7576 | 7613 |
7577 def GetInvalidArg(self, index): | 7614 def GetInvalidArg(self, index): |
7578 """overridden from SizeArgument.""" | 7615 """overridden from SizeArgument.""" |
(...skipping 2482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10061 Format(gen.generated_cpp_filenames) | 10098 Format(gen.generated_cpp_filenames) |
10062 | 10099 |
10063 if gen.errors > 0: | 10100 if gen.errors > 0: |
10064 print "%d errors" % gen.errors | 10101 print "%d errors" % gen.errors |
10065 return 1 | 10102 return 1 |
10066 return 0 | 10103 return 0 |
10067 | 10104 |
10068 | 10105 |
10069 if __name__ == '__main__': | 10106 if __name__ == '__main__': |
10070 sys.exit(main(sys.argv[1:])) | 10107 sys.exit(main(sys.argv[1:])) |
OLD | NEW |