Index: gpu/command_buffer/build_gles2_cmd_buffer.py |
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py |
index 577861a1d0d108368157550d4fb93ee350ed8e86..b0884b676487356b834c89840ab9cd444088bd87 100755 |
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py |
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py |
@@ -939,6 +939,16 @@ _NAMED_TYPE_INFO = { |
'GL_PIXEL_PACK_BUFFER', |
], |
}, |
+ 'BufferMode': { |
+ 'type': 'GLenum', |
+ 'valid': [ |
+ 'GL_INTERLEAVED_ATTRIBS', |
+ 'GL_SEPARATE_ATTRIBS', |
+ ], |
+ 'invalid': [ |
+ 'GL_PIXEL_PACK_BUFFER', |
+ ], |
+ }, |
'FrameBufferParameter': { |
'type': 'GLenum', |
'valid': [ |
@@ -1712,6 +1722,10 @@ _FUNCTION_INFO = { |
'decoder_func': 'DoCopyTexSubImage2D', |
'defer_reads': True, |
}, |
+ 'CopyTexSubImage3D': { |
+ 'defer_reads': True, |
+ 'unsafe': True, |
+ }, |
'CreateImageCHROMIUM': { |
'type': 'Manual', |
'cmd_args': |
@@ -2448,6 +2462,7 @@ _FUNCTION_INFO = { |
'ShaderSource': { |
'type': 'PUTSTR', |
'decoder_func': 'DoShaderSource', |
+ 'expectation': False, |
'data_transfer_methods': ['bucket'], |
'cmd_args': |
'GLuint shader, const char** str', |
@@ -2545,6 +2560,14 @@ _FUNCTION_INFO = { |
'const void* pixels, GLboolean internal', |
'unsafe': True, |
}, |
+ 'TransformFeedbackVaryings': { |
+ 'type': 'PUTSTR', |
+ 'data_transfer_methods': ['bucket'], |
+ 'decoder_func': 'DoTransformFeedbackVaryings', |
+ 'cmd_args': |
+ 'GLuint program, const char** varyings, GLenum buffermode', |
+ 'unsafe': True, |
+ }, |
'Uniform1f': {'type': 'PUTXn', 'count': 1}, |
'Uniform1fv': { |
'type': 'PUTn', |
@@ -6422,7 +6445,7 @@ class PUTSTRHandler(ArrayArgTypeHandler): |
total_size += 1; |
total_size *= sizeof(GLint); |
if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
+ SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
return; |
} |
size_t header_size = total_size.ValueOrDefault(0); |
@@ -6433,7 +6456,7 @@ class PUTSTRHandler(ArrayArgTypeHandler): |
if (%(data)s[ii]) {""" |
if length_arg == None: |
size_code_block += """ |
- len = base::static_cast<GLint>(strlen(%(data)s[ii]));""" |
+ len = static_cast<GLint>(strlen(%(data)s[ii]));""" |
else: |
size_code_block += """ |
len = (%(length)s && %(length)s[ii] >= 0) ? |
@@ -6443,15 +6466,16 @@ class PUTSTRHandler(ArrayArgTypeHandler): |
total_size += len; |
total_size += 1; // NULL at the end of each char array. |
if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
+ SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
return; |
} |
header[ii + 1] = len; |
} |
""" |
file.Write(size_code_block % { |
- 'data': data_arg.name, |
- 'length': length_arg.name if not length_arg == None else '' |
+ 'data': data_arg.name, |
+ 'length': length_arg.name if not length_arg == None else '', |
+ 'func_name': func.name, |
}) |
data_code_block = """ // Pack data into a bucket on the service. |
helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
@@ -6465,14 +6489,14 @@ class PUTSTRHandler(ArrayArgTypeHandler): |
checked_size += 1; // NULL in the end. |
} |
if (!checked_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
+ SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |
return; |
} |
size_t size = checked_size.ValueOrDefault(0); |
while (size) { |
ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
if (!buffer.valid() || buffer.size() == 0) { |
- SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large"); |
+ SetGLError(GL_OUT_OF_MEMORY, "gl%(func_name)s", "too large"); |
return; |
} |
size_t copy_size = buffer.size(); |
@@ -6496,19 +6520,20 @@ class PUTSTRHandler(ArrayArgTypeHandler): |
DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
""" |
file.Write(data_code_block % { |
- 'data': data_arg.name, |
- 'length': length_arg.name if not length_arg == None else '' |
+ 'data': data_arg.name, |
+ 'length': length_arg.name if not length_arg == None else '', |
+ 'func_name': func.name, |
}) |
- bucket_cmd_arg_string = "" |
- for arg in func.GetCmdArgs()[0:-2]: |
- if bucket_cmd_arg_string: |
- bucket_cmd_arg_string += ", " |
- bucket_cmd_arg_string += arg.name |
- if bucket_cmd_arg_string: |
- bucket_cmd_arg_string += ", " |
- bucket_cmd_arg_string += 'kResultBucketId' |
+ bucket_args = [] |
+ for arg in func.GetOriginalArgs(): |
+ if arg.name == 'count' or arg == self.__GetLengthArg(func): |
+ continue |
+ if arg == self.__GetDataArg(func): |
+ bucket_args.append('kResultBucketId') |
+ else: |
+ bucket_args.append(arg.name) |
file.Write(" helper_->%sBucket(%s);\n" % |
- (func.name, bucket_cmd_arg_string)) |
+ (func.name, ", ".join(bucket_args))) |
file.Write(" helper_->SetBucketSize(kResultBucketId, 0);"); |
file.Write(" CheckGLError();\n") |
file.Write("}\n") |
@@ -6539,7 +6564,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
cmd::SetToken set_token2; |
cmd::SetBucketData set_bucket_data2; |
cmd::SetToken set_token3; |
- cmds::ShaderSourceBucket shader_source_bucket; |
+ cmds::%(name)sBucket cmd_bucket; |
cmd::SetBucketSize clear_bucket_size; |
}; |
@@ -6559,7 +6584,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
kBucketId, kHeaderSize + kString1Size, kString2Size, mem2.id, |
mem2.offset); |
expected.set_token3.Init(GetNextToken()); |
- expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); |
+ expected.cmd_bucket.Init(%(bucket_args)s); |
expected.clear_bucket_size.Init(kBucketId, 0); |
const char* kStrings[] = { kString1, kString2 }; |
gl_->%(name)s(%(gl_args)s); |
@@ -6567,21 +6592,22 @@ TEST_F(GLES2ImplementationTest, %(name)s) { |
} |
""" |
gl_args = [] |
- cmd_args = [] |
+ bucket_args = [] |
for arg in func.GetOriginalArgs(): |
if arg == self.__GetDataArg(func): |
gl_args.append('kStrings') |
+ bucket_args.append('kBucketId') |
elif arg == self.__GetLengthArg(func): |
gl_args.append('NULL') |
elif arg.name == 'count': |
gl_args.append('2') |
else: |
gl_args.append(arg.GetValidClientSideArg(func)) |
- cmd_args.append(arg.GetValidClientSideArg(func)) |
+ bucket_args.append(arg.GetValidClientSideArg(func)) |
file.Write(code % { |
'name': func.name, |
'gl_args': ", ".join(gl_args), |
- 'cmd_args': ", ".join(cmd_args), |
+ 'bucket_args': ", ".join(bucket_args), |
}) |
if self.__GetLengthArg(func) == None: |
@@ -6618,7 +6644,7 @@ TEST_F(GLES2ImplementationTest, %(name)sWithLength) { |
expected.set_bucket_data.Init( |
kBucketId, kHeaderSize, kStringSize + 1, mem1.id, mem1.offset); |
expected.set_token2.Init(GetNextToken()); |
- expected.shader_source_bucket.Init(%(cmd_args)s, kBucketId); |
+ expected.shader_source_bucket.Init(%(bucket_args)s); |
expected.clear_bucket_size.Init(kBucketId, 0); |
const char* kStrings[] = { kString }; |
const GLint kLength[] = { kStringSize }; |
@@ -6639,33 +6665,42 @@ TEST_F(GLES2ImplementationTest, %(name)sWithLength) { |
file.Write(code % { |
'name': func.name, |
'gl_args': ", ".join(gl_args), |
- 'cmd_args': ", ".join(cmd_args), |
+ 'bucket_args': ", ".join(bucket_args), |
}) |
def WriteBucketServiceUnitTest(self, func, file, *extras): |
"""Overrriden from TypeHandler.""" |
cmd_args = [] |
cmd_args_with_invalid_id = [] |
+ gl_args = [] |
for index, arg in enumerate(func.GetOriginalArgs()): |
- if (arg == self.__GetLengthArg(func) or |
- arg == self.__GetDataArg(func) or arg.name == 'count'): |
- continue |
- if index == 0: # Resource ID arg |
+ if arg == self.__GetLengthArg(func): |
+ gl_args.append('_') |
+ elif arg.name == 'count': |
+ gl_args.append('1') |
+ elif arg == self.__GetDataArg(func): |
+ cmd_args.append('kBucketId') |
+ cmd_args_with_invalid_id.append('kBucketId') |
+ gl_args.append('_') |
+ elif index == 0: # Resource ID arg |
cmd_args.append(arg.GetValidArg(func)) |
cmd_args_with_invalid_id.append('kInvalidClientId') |
+ gl_args.append(arg.GetValidGLArg(func)) |
else: |
cmd_args.append(arg.GetValidArg(func)) |
cmd_args_with_invalid_id.append(arg.GetValidArg(func)) |
+ gl_args.append(arg.GetValidGLArg(func)) |
test = """ |
TEST_P(%(test_name)s, %(name)sValidArgs) { |
+ EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); |
const uint32 kBucketId = 123; |
const char kSource0[] = "hello"; |
const char* kSource[] = { kSource0 }; |
const char kValidStrEnd = 0; |
SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
cmds::%(name)s cmd; |
- cmd.Init(%(cmd_args)s, kBucketId); |
+ cmd.Init(%(cmd_args)s); |
decoder_->set_unsafe_es3_apis_enabled(true); |
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));""" |
if func.IsUnsafe(): |
@@ -6678,6 +6713,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) { |
""" |
self.WriteValidUnitTest(func, file, test, { |
'cmd_args': ", ".join(cmd_args), |
+ 'gl_args': ", ".join(gl_args), |
}, *extras) |
test = """ |
@@ -6689,11 +6725,11 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) { |
decoder_->set_unsafe_es3_apis_enabled(true); |
cmds::%(name)s cmd; |
// Test no bucket. |
- cmd.Init(%(cmd_args)s, kBucketId); |
+ cmd.Init(%(cmd_args)s); |
EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
// Test invalid client. |
SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
- cmd.Init(%(cmd_args_with_invalid_id)s, kBucketId); |
+ cmd.Init(%(cmd_args_with_invalid_id)s); |
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
} |
@@ -6711,24 +6747,18 @@ TEST_P(%(test_name)s, %(name)sInvalidHeader) { |
const char kValidStrEnd = 0; |
const GLsizei kCount = static_cast<GLsizei>(arraysize(kSource)); |
const GLsizei kTests[] = { |
- kCount, |
+ kCount + 1, |
0, |
std::numeric_limits<GLsizei>::max(), |
-1, |
- kCount, |
}; |
decoder_->set_unsafe_es3_apis_enabled(true); |
for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
SetBucketAsCStrings(kBucketId, 1, kSource, kTests[ii], kValidStrEnd); |
cmds::%(name)s cmd; |
- cmd.Init(%(cmd_args)s, kBucketId); |
- if (kTests[ii] == kCount) { |
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
- } else { |
- EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
- } |
+ cmd.Init(%(cmd_args)s); |
+ EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
} |
- EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
} |
""" |
self.WriteValidUnitTest(func, file, test, { |
@@ -6743,10 +6773,9 @@ TEST_P(%(test_name)s, %(name)sInvalidStringEnding) { |
const char kInvalidStrEnd = '*'; |
SetBucketAsCStrings(kBucketId, 1, kSource, 1, kInvalidStrEnd); |
cmds::%(name)s cmd; |
- cmd.Init(%(cmd_args)s, kBucketId); |
+ cmd.Init(%(cmd_args)s); |
decoder_->set_unsafe_es3_apis_enabled(true); |
EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
- EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
} |
""" |
self.WriteValidUnitTest(func, file, test, { |
@@ -7551,21 +7580,29 @@ class SizeArgument(Argument): |
def WriteValidationCode(self, file, func): |
"""overridden from Argument.""" |
- file.Write(" if (%s < 0) {\n" % self.name) |
- file.Write( |
- " LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" % |
- (func.original_name, self.name)) |
- file.Write(" return error::kNoError;\n") |
- file.Write(" }\n") |
+ if func.IsUnsafe(): |
+ return |
+ code = """ if (%(var_name)s < 0) { |
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0"); |
+ return error::kNoError; |
+ } |
+""" |
+ file.Write(code % { |
+ "var_name": self.name, |
+ "func_name": func.original_name, |
+ }) |
def WriteClientSideValidationCode(self, file, func): |
"""overridden from Argument.""" |
- file.Write(" if (%s < 0) {\n" % self.name) |
- file.Write( |
- " SetGLError(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" % |
- (func.original_name, self.name)) |
- file.Write(" return;\n") |
- file.Write(" }\n") |
+ code = """ if (%(var_name)s < 0) { |
+ SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "%(var_name)s < 0"); |
+ return; |
+ } |
+""" |
+ file.Write(code % { |
+ "var_name": self.name, |
+ "func_name": func.original_name, |
+ }) |
class SizeNotNegativeArgument(SizeArgument): |