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 1493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2445 'first_element_only': True, | 2455 'first_element_only': True, |
2446 'unsafe': True, | 2456 'unsafe': True, |
2447 }, | 2457 }, |
2448 'ShaderBinary': { | 2458 'ShaderBinary': { |
2449 'type': 'Custom', | 2459 'type': 'Custom', |
2450 'client_test': False, | 2460 'client_test': False, |
2451 }, | 2461 }, |
2452 'ShaderSource': { | 2462 'ShaderSource': { |
2453 'type': 'PUTSTR', | 2463 'type': 'PUTSTR', |
2454 'decoder_func': 'DoShaderSource', | 2464 'decoder_func': 'DoShaderSource', |
| 2465 'expectation': False, |
2455 'data_transfer_methods': ['bucket'], | 2466 'data_transfer_methods': ['bucket'], |
2456 'cmd_args': | 2467 'cmd_args': |
2457 'GLuint shader, const char** str', | 2468 'GLuint shader, const char** str', |
2458 'pepper_args': | 2469 'pepper_args': |
2459 'GLuint shader, GLsizei count, const char** str, const GLint* length', | 2470 'GLuint shader, GLsizei count, const char** str, const GLint* length', |
2460 }, | 2471 }, |
2461 'StencilMask': { | 2472 'StencilMask': { |
2462 'type': 'StateSetFrontBack', | 2473 'type': 'StateSetFrontBack', |
2463 'state': 'StencilMask', | 2474 'state': 'StencilMask', |
2464 'no_gl': True, | 2475 'no_gl': True, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2542 'type': 'Manual', | 2553 'type': 'Manual', |
2543 'data_transfer_methods': ['shm'], | 2554 'data_transfer_methods': ['shm'], |
2544 'client_test': False, | 2555 'client_test': False, |
2545 'cmd_args': 'GLenumTextureTarget target, GLint level, ' | 2556 'cmd_args': 'GLenumTextureTarget target, GLint level, ' |
2546 'GLint xoffset, GLint yoffset, GLint zoffset, ' | 2557 'GLint xoffset, GLint yoffset, GLint zoffset, ' |
2547 'GLsizei width, GLsizei height, GLsizei depth, ' | 2558 'GLsizei width, GLsizei height, GLsizei depth, ' |
2548 'GLenumTextureFormat format, GLenumPixelType type, ' | 2559 'GLenumTextureFormat format, GLenumPixelType type, ' |
2549 'const void* pixels, GLboolean internal', | 2560 'const void* pixels, GLboolean internal', |
2550 'unsafe': True, | 2561 'unsafe': True, |
2551 }, | 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 }, |
2552 'Uniform1f': {'type': 'PUTXn', 'count': 1}, | 2571 'Uniform1f': {'type': 'PUTXn', 'count': 1}, |
2553 'Uniform1fv': { | 2572 'Uniform1fv': { |
2554 'type': 'PUTn', | 2573 'type': 'PUTn', |
2555 'count': 1, | 2574 'count': 1, |
2556 'decoder_func': 'DoUniform1fv', | 2575 'decoder_func': 'DoUniform1fv', |
2557 }, | 2576 }, |
2558 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, | 2577 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, |
2559 'Uniform1iv': { | 2578 'Uniform1iv': { |
2560 'type': 'PUTn', | 2579 'type': 'PUTn', |
2561 'count': 1, | 2580 'count': 1, |
(...skipping 3857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6419 'data': data_arg.name, | 6438 'data': data_arg.name, |
6420 'length': length_arg.name if not length_arg == None else '' | 6439 'length': length_arg.name if not length_arg == None else '' |
6421 }) | 6440 }) |
6422 for arg in func.GetOriginalArgs(): | 6441 for arg in func.GetOriginalArgs(): |
6423 arg.WriteClientSideValidationCode(file, func) | 6442 arg.WriteClientSideValidationCode(file, func) |
6424 size_code_block = """ // Compute the total size. | 6443 size_code_block = """ // Compute the total size. |
6425 base::CheckedNumeric<size_t> total_size = count; | 6444 base::CheckedNumeric<size_t> total_size = count; |
6426 total_size += 1; | 6445 total_size += 1; |
6427 total_size *= sizeof(GLint); | 6446 total_size *= sizeof(GLint); |
6428 if (!total_size.IsValid()) { | 6447 if (!total_size.IsValid()) { |
6429 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6448 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6430 return; | 6449 return; |
6431 } | 6450 } |
6432 size_t header_size = total_size.ValueOrDefault(0); | 6451 size_t header_size = total_size.ValueOrDefault(0); |
6433 std::vector<GLint> header(count + 1); | 6452 std::vector<GLint> header(count + 1); |
6434 header[0] = static_cast<GLint>(count); | 6453 header[0] = static_cast<GLint>(count); |
6435 for (GLsizei ii = 0; ii < count; ++ii) { | 6454 for (GLsizei ii = 0; ii < count; ++ii) { |
6436 GLint len = 0; | 6455 GLint len = 0; |
6437 if (%(data)s[ii]) {""" | 6456 if (%(data)s[ii]) {""" |
6438 if length_arg == None: | 6457 if length_arg == None: |
6439 size_code_block += """ | 6458 size_code_block += """ |
6440 len = base::static_cast<GLint>(strlen(%(data)s[ii]));""" | 6459 len = static_cast<GLint>(strlen(%(data)s[ii]));""" |
6441 else: | 6460 else: |
6442 size_code_block += """ | 6461 size_code_block += """ |
6443 len = (%(length)s && %(length)s[ii] >= 0) ? | 6462 len = (%(length)s && %(length)s[ii] >= 0) ? |
6444 %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" | 6463 %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" |
6445 size_code_block += """ | 6464 size_code_block += """ |
6446 } | 6465 } |
6447 total_size += len; | 6466 total_size += len; |
6448 total_size += 1; // NULL at the end of each char array. | 6467 total_size += 1; // NULL at the end of each char array. |
6449 if (!total_size.IsValid()) { | 6468 if (!total_size.IsValid()) { |
6450 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6469 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6451 return; | 6470 return; |
6452 } | 6471 } |
6453 header[ii + 1] = len; | 6472 header[ii + 1] = len; |
6454 } | 6473 } |
6455 """ | 6474 """ |
6456 file.Write(size_code_block % { | 6475 file.Write(size_code_block % { |
6457 'data': data_arg.name, | 6476 'data': data_arg.name, |
6458 '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, |
6459 }) | 6479 }) |
6460 data_code_block = """ // Pack data into a bucket on the service. | 6480 data_code_block = """ // Pack data into a bucket on the service. |
6461 helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); | 6481 helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
6462 size_t offset = 0; | 6482 size_t offset = 0; |
6463 for (GLsizei ii = 0; ii <= count; ++ii) { | 6483 for (GLsizei ii = 0; ii <= count; ++ii) { |
6464 const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : | 6484 const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : |
6465 %(data)s[ii - 1]; | 6485 %(data)s[ii - 1]; |
6466 base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : | 6486 base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : |
6467 static_cast<size_t>(header[ii]); | 6487 static_cast<size_t>(header[ii]); |
6468 if (ii > 0) { | 6488 if (ii > 0) { |
6469 checked_size += 1; // NULL in the end. | 6489 checked_size += 1; // NULL in the end. |
6470 } | 6490 } |
6471 if (!checked_size.IsValid()) { | 6491 if (!checked_size.IsValid()) { |
6472 SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); | 6492 SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
6473 return; | 6493 return; |
6474 } | 6494 } |
6475 size_t size = checked_size.ValueOrDefault(0); | 6495 size_t size = checked_size.ValueOrDefault(0); |
6476 while (size) { | 6496 while (size) { |
6477 ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); | 6497 ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
6478 if (!buffer.valid() || buffer.size() == 0) { | 6498 if (!buffer.valid() || buffer.size() == 0) { |
6479 SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large"); | 6499 SetGLError(GL_OUT_OF_MEMORY, "gl%(func_name)s", "too large"); |
6480 return; | 6500 return; |
6481 } | 6501 } |
6482 size_t copy_size = buffer.size(); | 6502 size_t copy_size = buffer.size(); |
6483 if (ii > 0 && buffer.size() == size) | 6503 if (ii > 0 && buffer.size() == size) |
6484 --copy_size; | 6504 --copy_size; |
6485 if (copy_size) | 6505 if (copy_size) |
6486 memcpy(buffer.address(), src, copy_size); | 6506 memcpy(buffer.address(), src, copy_size); |
6487 if (copy_size < buffer.size()) { | 6507 if (copy_size < buffer.size()) { |
6488 // Append NULL in the end. | 6508 // Append NULL in the end. |
6489 DCHECK(copy_size + 1 == buffer.size()); | 6509 DCHECK(copy_size + 1 == buffer.size()); |
6490 char* str = reinterpret_cast<char*>(buffer.address()); | 6510 char* str = reinterpret_cast<char*>(buffer.address()); |
6491 str[copy_size] = 0; | 6511 str[copy_size] = 0; |
6492 } | 6512 } |
6493 helper_->SetBucketData(kResultBucketId, offset, buffer.size(), | 6513 helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |
6494 buffer.shm_id(), buffer.offset()); | 6514 buffer.shm_id(), buffer.offset()); |
6495 offset += buffer.size(); | 6515 offset += buffer.size(); |
6496 src += buffer.size(); | 6516 src += buffer.size(); |
6497 size -= buffer.size(); | 6517 size -= buffer.size(); |
6498 } | 6518 } |
6499 } | 6519 } |
6500 DCHECK_EQ(total_size.ValueOrDefault(0), offset); | 6520 DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
6501 """ | 6521 """ |
6502 file.Write(data_code_block % { | 6522 file.Write(data_code_block % { |
6503 'data': data_arg.name, | 6523 'data': data_arg.name, |
6504 '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, |
6505 }) | 6526 }) |
6506 bucket_cmd_arg_string = "" | 6527 bucket_args = [] |
6507 for arg in func.GetCmdArgs()[0:-2]: | 6528 for arg in func.GetOriginalArgs(): |
6508 if bucket_cmd_arg_string: | 6529 if arg.name == 'count' or arg == self.__GetLengthArg(func): |
6509 bucket_cmd_arg_string += ", " | 6530 continue |
6510 bucket_cmd_arg_string += arg.name | 6531 if arg == self.__GetDataArg(func): |
6511 if bucket_cmd_arg_string: | 6532 bucket_args.append('kResultBucketId') |
6512 bucket_cmd_arg_string += ", " | 6533 else: |
6513 bucket_cmd_arg_string += 'kResultBucketId' | 6534 bucket_args.append(arg.name) |
6514 file.Write(" helper_->%sBucket(%s);\n" % | 6535 file.Write(" helper_->%sBucket(%s);\n" % |
6515 (func.name, bucket_cmd_arg_string)) | 6536 (func.name, ", ".join(bucket_args))) |
6516 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); | 6537 file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); |
6517 file.Write(" CheckGLError();\n") | 6538 file.Write(" CheckGLError();\n") |
6518 file.Write("}\n") | 6539 file.Write("}\n") |
6519 file.Write("\n") | 6540 file.Write("\n") |
6520 | 6541 |
6521 def WriteGLES2ImplementationUnitTest(self, func, file): | 6542 def WriteGLES2ImplementationUnitTest(self, func, file): |
6522 """Overrriden from TypeHandler.""" | 6543 """Overrriden from TypeHandler.""" |
6523 code = """ | 6544 code = """ |
6524 TEST_F(GLES2ImplementationTest, %(name)s) { | 6545 TEST_F(GLES2ImplementationTest, %(name)s) { |
6525 const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 6546 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
(...skipping 10 matching lines...) Expand all Loading... |
6536 const size_t kPaddedString2Size = | 6557 const size_t kPaddedString2Size = |
6537 transfer_buffer_->RoundToAlignment(kString2Size); | 6558 transfer_buffer_->RoundToAlignment(kString2Size); |
6538 struct Cmds { | 6559 struct Cmds { |
6539 cmd::SetBucketSize set_bucket_size; | 6560 cmd::SetBucketSize set_bucket_size; |
6540 cmd::SetBucketData set_bucket_header; | 6561 cmd::SetBucketData set_bucket_header; |
6541 cmd::SetToken set_token1; | 6562 cmd::SetToken set_token1; |
6542 cmd::SetBucketData set_bucket_data1; | 6563 cmd::SetBucketData set_bucket_data1; |
6543 cmd::SetToken set_token2; | 6564 cmd::SetToken set_token2; |
6544 cmd::SetBucketData set_bucket_data2; | 6565 cmd::SetBucketData set_bucket_data2; |
6545 cmd::SetToken set_token3; | 6566 cmd::SetToken set_token3; |
6546 cmds::ShaderSourceBucket shader_source_bucket; | 6567 cmds::%(name)sBucket cmd_bucket; |
6547 cmd::SetBucketSize clear_bucket_size; | 6568 cmd::SetBucketSize clear_bucket_size; |
6548 }; | 6569 }; |
6549 | 6570 |
6550 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); | 6571 ExpectedMemoryInfo mem0 = GetExpectedMemory(kPaddedHeaderSize); |
6551 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); | 6572 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); |
6552 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); | 6573 ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); |
6553 | 6574 |
6554 Cmds expected; | 6575 Cmds expected; |
6555 expected.set_bucket_size.Init(kBucketId, kSourceSize); | 6576 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
6556 expected.set_bucket_header.Init( | 6577 expected.set_bucket_header.Init( |
6557 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); | 6578 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
6558 expected.set_token1.Init(GetNextToken()); | 6579 expected.set_token1.Init(GetNextToken()); |
6559 expected.set_bucket_data1.Init( | 6580 expected.set_bucket_data1.Init( |
6560 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset); | 6581 kBucketId, kHeaderSize, kString1Size, mem1.id, mem1.offset); |
6561 expected.set_token2.Init(GetNextToken()); | 6582 expected.set_token2.Init(GetNextToken()); |
6562 expected.set_bucket_data2.Init( | 6583 expected.set_bucket_data2.Init( |
6563 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, | 6584 kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, |
6564 mem2.offset); | 6585 mem2.offset); |
6565 expected.set_token3.Init(GetNextToken()); | 6586 expected.set_token3.Init(GetNextToken()); |
6566 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); | 6587 expected.cmd_bucket.Init(%(bucket_args)s); |
6567 expected.clear_bucket_size.Init(kBucketId, 0); | 6588 expected.clear_bucket_size.Init(kBucketId, 0); |
6568 const char* kStrings[] = { kString1, kString2 }; | 6589 const char* kStrings[] = { kString1, kString2 }; |
6569 gl_->%(name)s(%(gl_args)s); | 6590 gl_->%(name)s(%(gl_args)s); |
6570 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 6591 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
6571 } | 6592 } |
6572 """ | 6593 """ |
6573 gl_args = [] | 6594 gl_args = [] |
6574 cmd_args = [] | 6595 bucket_args = [] |
6575 for arg in func.GetOriginalArgs(): | 6596 for arg in func.GetOriginalArgs(): |
6576 if arg == self.__GetDataArg(func): | 6597 if arg == self.__GetDataArg(func): |
6577 gl_args.append('kStrings') | 6598 gl_args.append('kStrings') |
| 6599 bucket_args.append('kBucketId') |
6578 elif arg == self.__GetLengthArg(func): | 6600 elif arg == self.__GetLengthArg(func): |
6579 gl_args.append('NULL') | 6601 gl_args.append('NULL') |
6580 elif arg.name == 'count': | 6602 elif arg.name == 'count': |
6581 gl_args.append('2') | 6603 gl_args.append('2') |
6582 else: | 6604 else: |
6583 gl_args.append(arg.GetValidClientSideArg(func)) | 6605 gl_args.append(arg.GetValidClientSideArg(func)) |
6584 cmd_args.append(arg.GetValidClientSideArg(func)) | 6606 bucket_args.append(arg.GetValidClientSideArg(func)) |
6585 file.Write(code % { | 6607 file.Write(code % { |
6586 'name': func.name, | 6608 'name': func.name, |
6587 'gl_args': ", ".join(gl_args), | 6609 'gl_args': ", ".join(gl_args), |
6588 'cmd_args': ", ".join(cmd_args), | 6610 'bucket_args': ", ".join(bucket_args), |
6589 }) | 6611 }) |
6590 | 6612 |
6591 if self.__GetLengthArg(func) == None: | 6613 if self.__GetLengthArg(func) == None: |
6592 return | 6614 return |
6593 code = """ | 6615 code = """ |
6594 TEST_F(GLES2ImplementationTest, %(name)sWithLength) { | 6616 TEST_F(GLES2ImplementationTest, %(name)sWithLength) { |
6595 const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 6617 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
6596 const char* kString = "foobar******"; | 6618 const char* kString = "foobar******"; |
6597 const size_t kStringSize = 6; // We only need "foobar". | 6619 const size_t kStringSize = 6; // We only need "foobar". |
6598 const size_t kHeaderSize = sizeof(GLint) * 2; | 6620 const size_t kHeaderSize = sizeof(GLint) * 2; |
(...skipping 16 matching lines...) Expand all Loading... |
6615 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize); | 6637 ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedStringSize); |
6616 | 6638 |
6617 Cmds expected; | 6639 Cmds expected; |
6618 expected.set_bucket_size.Init(kBucketId, kSourceSize); | 6640 expected.set_bucket_size.Init(kBucketId, kSourceSize); |
6619 expected.set_bucket_header.Init( | 6641 expected.set_bucket_header.Init( |
6620 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); | 6642 kBucketId, 0, kHeaderSize, mem0.id, mem0.offset); |
6621 expected.set_token1.Init(GetNextToken()); | 6643 expected.set_token1.Init(GetNextToken()); |
6622 expected.set_bucket_data.Init( | 6644 expected.set_bucket_data.Init( |
6623 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); | 6645 kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); |
6624 expected.set_token2.Init(GetNextToken()); | 6646 expected.set_token2.Init(GetNextToken()); |
6625 expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); | 6647 expected.shader_source_bucket.Init(%(bucket_args)s); |
6626 expected.clear_bucket_size.Init(kBucketId, 0); | 6648 expected.clear_bucket_size.Init(kBucketId, 0); |
6627 const char* kStrings[] = { kString }; | 6649 const char* kStrings[] = { kString }; |
6628 const GLint kLength[] = { kStringSize }; | 6650 const GLint kLength[] = { kStringSize }; |
6629 gl_->%(name)s(%(gl_args)s); | 6651 gl_->%(name)s(%(gl_args)s); |
6630 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 6652 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
6631 } | 6653 } |
6632 """ | 6654 """ |
6633 gl_args = [] | 6655 gl_args = [] |
6634 for arg in func.GetOriginalArgs(): | 6656 for arg in func.GetOriginalArgs(): |
6635 if arg == self.__GetDataArg(func): | 6657 if arg == self.__GetDataArg(func): |
6636 gl_args.append('kStrings') | 6658 gl_args.append('kStrings') |
6637 elif arg == self.__GetLengthArg(func): | 6659 elif arg == self.__GetLengthArg(func): |
6638 gl_args.append('kLength') | 6660 gl_args.append('kLength') |
6639 elif arg.name == 'count': | 6661 elif arg.name == 'count': |
6640 gl_args.append('1') | 6662 gl_args.append('1') |
6641 else: | 6663 else: |
6642 gl_args.append(arg.GetValidClientSideArg(func)) | 6664 gl_args.append(arg.GetValidClientSideArg(func)) |
6643 file.Write(code % { | 6665 file.Write(code % { |
6644 'name': func.name, | 6666 'name': func.name, |
6645 'gl_args': ", ".join(gl_args), | 6667 'gl_args': ", ".join(gl_args), |
6646 'cmd_args': ", ".join(cmd_args), | 6668 'bucket_args': ", ".join(bucket_args), |
6647 }) | 6669 }) |
6648 | 6670 |
6649 def WriteBucketServiceUnitTest(self, func, file, *extras): | 6671 def WriteBucketServiceUnitTest(self, func, file, *extras): |
6650 """Overrriden from TypeHandler.""" | 6672 """Overrriden from TypeHandler.""" |
6651 cmd_args = [] | 6673 cmd_args = [] |
6652 cmd_args_with_invalid_id = [] | 6674 cmd_args_with_invalid_id = [] |
| 6675 gl_args = [] |
6653 for index, arg in enumerate(func.GetOriginalArgs()): | 6676 for index, arg in enumerate(func.GetOriginalArgs()): |
6654 if (arg == self.__GetLengthArg(func) or | 6677 if arg == self.__GetLengthArg(func): |
6655 arg == self.__GetDataArg(func) or arg.name == 'count'): | 6678 gl_args.append('_') |
6656 continue | 6679 elif arg.name == 'count': |
6657 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 |
6658 cmd_args.append(arg.GetValidArg(func)) | 6686 cmd_args.append(arg.GetValidArg(func)) |
6659 cmd_args_with_invalid_id.append('kInvalidClientId') | 6687 cmd_args_with_invalid_id.append('kInvalidClientId') |
| 6688 gl_args.append(arg.GetValidGLArg(func)) |
6660 else: | 6689 else: |
6661 cmd_args.append(arg.GetValidArg(func)) | 6690 cmd_args.append(arg.GetValidArg(func)) |
6662 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)) |
6663 | 6693 |
6664 test = """ | 6694 test = """ |
6665 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)); |
6666 const uint32 kBucketId = 123; | 6697 const uint32 kBucketId = 123; |
6667 const char kSource0[] = "hello"; | 6698 const char kSource0[] = "hello"; |
6668 const char* kSource[] = { kSource0 }; | 6699 const char* kSource[] = { kSource0 }; |
6669 const char kValidStrEnd = 0; | 6700 const char kValidStrEnd = 0; |
6670 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); | 6701 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
6671 cmds::%(name)s cmd; | 6702 cmds::%(name)s cmd; |
6672 cmd.Init(%(cmd_args)s, kBucketId); | 6703 cmd.Init(%(cmd_args)s); |
6673 decoder_->set_unsafe_es3_apis_enabled(true); | 6704 decoder_->set_unsafe_es3_apis_enabled(true); |
6674 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" | 6705 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" |
6675 if func.IsUnsafe(): | 6706 if func.IsUnsafe(): |
6676 test += """ | 6707 test += """ |
6677 decoder_->set_unsafe_es3_apis_enabled(false); | 6708 decoder_->set_unsafe_es3_apis_enabled(false); |
6678 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | 6709 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
6679 """ | 6710 """ |
6680 test += """ | 6711 test += """ |
6681 } | 6712 } |
6682 """ | 6713 """ |
6683 self.WriteValidUnitTest(func, file, test, { | 6714 self.WriteValidUnitTest(func, file, test, { |
6684 'cmd_args': ", ".join(cmd_args), | 6715 'cmd_args': ", ".join(cmd_args), |
| 6716 'gl_args': ", ".join(gl_args), |
6685 }, *extras) | 6717 }, *extras) |
6686 | 6718 |
6687 test = """ | 6719 test = """ |
6688 TEST_P(%(test_name)s, %(name)sInvalidArgs) { | 6720 TEST_P(%(test_name)s, %(name)sInvalidArgs) { |
6689 const uint32 kBucketId = 123; | 6721 const uint32 kBucketId = 123; |
6690 const char kSource0[] = "hello"; | 6722 const char kSource0[] = "hello"; |
6691 const char* kSource[] = { kSource0 }; | 6723 const char* kSource[] = { kSource0 }; |
6692 const char kValidStrEnd = 0; | 6724 const char kValidStrEnd = 0; |
6693 decoder_->set_unsafe_es3_apis_enabled(true); | 6725 decoder_->set_unsafe_es3_apis_enabled(true); |
6694 cmds::%(name)s cmd; | 6726 cmds::%(name)s cmd; |
6695 // Test no bucket. | 6727 // Test no bucket. |
6696 cmd.Init(%(cmd_args)s, kBucketId); | 6728 cmd.Init(%(cmd_args)s); |
6697 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 6729 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
6698 // Test invalid client. | 6730 // Test invalid client. |
6699 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); | 6731 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
6700 cmd.Init(%(cmd_args_with_invalid_id)s, kBucketId); | 6732 cmd.Init(%(cmd_args_with_invalid_id)s); |
6701 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 6733 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
6702 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 6734 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
6703 } | 6735 } |
6704 """ | 6736 """ |
6705 self.WriteValidUnitTest(func, file, test, { | 6737 self.WriteValidUnitTest(func, file, test, { |
6706 'cmd_args': ", ".join(cmd_args), | 6738 'cmd_args': ", ".join(cmd_args), |
6707 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id), | 6739 'cmd_args_with_invalid_id': ", ".join(cmd_args_with_invalid_id), |
6708 }, *extras) | 6740 }, *extras) |
6709 | 6741 |
6710 test = """ | 6742 test = """ |
6711 TEST_P(%(test_name)s, %(name)sInvalidHeader) { | 6743 TEST_P(%(test_name)s, %(name)sInvalidHeader) { |
6712 const uint32 kBucketId = 123; | 6744 const uint32 kBucketId = 123; |
6713 const char kSource0[] = "hello"; | 6745 const char kSource0[] = "hello"; |
6714 const char* kSource[] = { kSource0 }; | 6746 const char* kSource[] = { kSource0 }; |
6715 const char kValidStrEnd = 0; | 6747 const char kValidStrEnd = 0; |
6716 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); | 6748 const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); |
6717 const GLsizei kTests[] = { | 6749 const GLsizei kTests[] = { |
6718 kCount, | 6750 kCount + 1, |
6719 0, | 6751 0, |
6720 std::numeric_limits<GLsizei>::max(), | 6752 std::numeric_limits<GLsizei>::max(), |
6721 -1, | 6753 -1, |
6722 kCount, | |
6723 }; | 6754 }; |
6724 decoder_->set_unsafe_es3_apis_enabled(true); | 6755 decoder_->set_unsafe_es3_apis_enabled(true); |
6725 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { | 6756 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
6726 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); | 6757 SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); |
6727 cmds::%(name)s cmd; | 6758 cmds::%(name)s cmd; |
6728 cmd.Init(%(cmd_args)s, kBucketId); | 6759 cmd.Init(%(cmd_args)s); |
6729 if (kTests[ii] == kCount) { | 6760 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
6730 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6731 } else { | |
6732 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | |
6733 } | |
6734 } | 6761 } |
6735 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6736 } | 6762 } |
6737 """ | 6763 """ |
6738 self.WriteValidUnitTest(func, file, test, { | 6764 self.WriteValidUnitTest(func, file, test, { |
6739 'cmd_args': ", ".join(cmd_args), | 6765 'cmd_args': ", ".join(cmd_args), |
6740 }, *extras) | 6766 }, *extras) |
6741 | 6767 |
6742 test = """ | 6768 test = """ |
6743 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { | 6769 TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { |
6744 const uint32 kBucketId = 123; | 6770 const uint32 kBucketId = 123; |
6745 const char kSource0[] = "hello"; | 6771 const char kSource0[] = "hello"; |
6746 const char* kSource[] = { kSource0 }; | 6772 const char* kSource[] = { kSource0 }; |
6747 const char kInvalidStrEnd = '*'; | 6773 const char kInvalidStrEnd = '*'; |
6748 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); | 6774 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); |
6749 cmds::%(name)s cmd; | 6775 cmds::%(name)s cmd; |
6750 cmd.Init(%(cmd_args)s, kBucketId); | 6776 cmd.Init(%(cmd_args)s); |
6751 decoder_->set_unsafe_es3_apis_enabled(true); | 6777 decoder_->set_unsafe_es3_apis_enabled(true); |
6752 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | 6778 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
6753 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6754 } | 6779 } |
6755 """ | 6780 """ |
6756 self.WriteValidUnitTest(func, file, test, { | 6781 self.WriteValidUnitTest(func, file, test, { |
6757 'cmd_args': ", ".join(cmd_args), | 6782 'cmd_args': ", ".join(cmd_args), |
6758 }, *extras) | 6783 }, *extras) |
6759 | 6784 |
6760 | 6785 |
6761 class PUTXnHandler(ArrayArgTypeHandler): | 6786 class PUTXnHandler(ArrayArgTypeHandler): |
6762 """Handler for glUniform?f functions.""" | 6787 """Handler for glUniform?f functions.""" |
6763 def __init__(self): | 6788 def __init__(self): |
(...skipping 3309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10073 Format(gen.generated_cpp_filenames) | 10098 Format(gen.generated_cpp_filenames) |
10074 | 10099 |
10075 if gen.errors > 0: | 10100 if gen.errors > 0: |
10076 print "%d errors" % gen.errors | 10101 print "%d errors" % gen.errors |
10077 return 1 | 10102 return 1 |
10078 return 0 | 10103 return 0 |
10079 | 10104 |
10080 | 10105 |
10081 if __name__ == '__main__': | 10106 if __name__ == '__main__': |
10082 sys.exit(main(sys.argv[1:])) | 10107 sys.exit(main(sys.argv[1:])) |
OLD | NEW |