| 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 |