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