Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: gpu/command_buffer/build_gles2_cmd_buffer.py

Issue 872713004: Add glTransformFeedbackVaryings to GPU command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@caritas
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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:]))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698