diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-12 23:36:24 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-12 23:36:24 +0000 |
commit | cbb22e4ca7a48d2b3b9b40c8569dbe6bc21d49f4 (patch) | |
tree | ed91d534f5505e3d256f9bb7661e2a9a7574072c /gpu | |
parent | b0b0d2c474c9a9b8743a4eb5bb46ac34f8b1086d (diff) | |
download | chromium_src-cbb22e4ca7a48d2b3b9b40c8569dbe6bc21d49f4.zip chromium_src-cbb22e4ca7a48d2b3b9b40c8569dbe6bc21d49f4.tar.gz chromium_src-cbb22e4ca7a48d2b3b9b40c8569dbe6bc21d49f4.tar.bz2 |
Validate glTexParameter parameters.
This was never previously validated so you could pass through
desktop gl parameters like GL_CLAMP_TO_BORDER
Now fixed.
TEST=unit tests
BUG=none
R=apatrick@chromium.org
Review URL: http://codereview.chromium.org/6949011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85213 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
8 files changed, 273 insertions, 79 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 8ff4959..a955e00 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -838,6 +838,32 @@ _ENUM_LISTS = { 'GL_GENERATE_MIPMAP', ], }, + 'TextureWrapMode': { + 'type': 'GLenum', + 'valid': [ + 'GL_CLAMP_TO_EDGE', + 'GL_MIRRORED_REPEAT', + 'GL_REPEAT', + ], + }, + 'TextureMinFilterMode': { + 'type': 'GLenum', + 'valid': [ + 'GL_NEAREST', + 'GL_LINEAR', + 'GL_NEAREST_MIPMAP_NEAREST', + 'GL_LINEAR_MIPMAP_NEAREST', + 'GL_NEAREST_MIPMAP_LINEAR', + 'GL_LINEAR_MIPMAP_LINEAR', + ], + }, + 'TextureMagFilterMode': { + 'type': 'GLenum', + 'valid': [ + 'GL_NEAREST', + 'GL_LINEAR', + ], + }, 'VertexAttribute': { 'type': 'GLenum', 'valid': [ @@ -1056,6 +1082,8 @@ _ENUM_LISTS = { # expectation: If False the unit test will have no expected calls. # gen_func: Name of function that generates GL resource for corresponding # bind function. +# valid_args: A dictionary of argument indices to args to use in unit tests +# when they can not be automatically determined. _FUNCTION_INFO = { 'ActiveTexture': {'decoder_func': 'DoActiveTexture', 'unit_test': False}, @@ -1479,17 +1507,29 @@ _FUNCTION_INFO = { 'extension': True, }, 'TexImage2D': {'type': 'Manual', 'immediate': True}, - 'TexParameterf': {'decoder_func': 'DoTexParameterf'}, - 'TexParameteri': {'decoder_func': 'DoTexParameteri'}, + 'TexParameterf': { + 'decoder_func': 'DoTexParameterf', + 'valid_args': { + '2': 'GL_NEAREST' + }, + }, + 'TexParameteri': { + 'decoder_func': 'DoTexParameteri', + 'valid_args': { + '2': 'GL_NEAREST' + }, + }, 'TexParameterfv': { 'type': 'PUT', 'data_type': 'GLfloat', + 'data_value': 'GL_NEAREST', 'count': 1, 'decoder_func': 'DoTexParameterfv', }, 'TexParameteriv': { 'type': 'PUT', 'data_type': 'GLint', + 'data_value': 'GL_NEAREST', 'count': 1, 'decoder_func': 'DoTexParameteriv', }, @@ -2069,12 +2109,12 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, arg_strings = [] count = 0 for arg in func.GetOriginalArgs(): - arg_strings.append(arg.GetValidArg(count, 0)) + arg_strings.append(arg.GetValidArg(func, count, 0)) count += 1 gl_arg_strings = [] count = 0 for arg in func.GetOriginalArgs(): - gl_arg_strings.append(arg.GetValidGLArg(count, 0)) + gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) count += 1 gl_func_name = func.GetGLTestFunctionName() vars = { @@ -2102,7 +2142,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, (arg_string, parse_result, gl_error) = arg.GetInvalidArg( count, value_index) else: - arg_string = arg.GetValidArg(count, 0) + arg_string = arg.GetValidArg(func, count, 0) arg_strings.append(arg_string) count += 1 gl_arg_strings = [] @@ -2585,8 +2625,8 @@ TEST_F(%(test_name)s, %(name)sValidArgsNewId) { gen_func_names = { } self.WriteValidUnitTest(func, file, valid_test, { - 'first_arg': func.GetOriginalArgs()[0].GetValidArg(0, 0), - 'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(0, 0), + 'first_arg': func.GetOriginalArgs()[0].GetValidArg(func, 0, 0), + 'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func, 0, 0), 'resource_type': func.GetOriginalArgs()[1].resource_type, 'gl_gen_func_name': func.GetInfo("gen_func"), }) @@ -3261,7 +3301,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { valid_pname = '' count = 0 for arg in func.GetOriginalArgs()[:-1]: - arg_value = arg.GetValidGLArg(count, 0) + arg_value = arg.GetValidGLArg(func, count, 0) gl_arg_strings.append(arg_value) if arg.name == 'pname': valid_pname = arg_value @@ -3298,6 +3338,37 @@ class PUTHandler(TypeHandler): def __init__(self): TypeHandler.__init__(self) + def WriteServiceUnitTest(self, func, file): + """Writes the service unit test for a command.""" + valid_test = """ +TEST_F(%(test_name)s, %(name)sValidArgs) { + EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); + SpecializedSetup<%(name)s, 0>(true); + %(name)s cmd; + cmd.Init(%(args)s); + GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s; + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +""" + extra = { + 'data_type': func.GetInfo('data_type'), + 'data_value': func.GetInfo('data_value') or '0', + } + self.WriteValidUnitTest(func, file, valid_test, extra) + + invalid_test = """ +TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { + EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); + SpecializedSetup<%(name)s, 0>(false); + %(name)s cmd; + cmd.Init(%(args)s); + GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s; + EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s +} +""" + self.WriteInvalidUnitTest(func, file, invalid_test, extra) + def WriteImmediateServiceUnitTest(self, func, file): """Writes the service unit test for a command.""" valid_test = """ @@ -3308,7 +3379,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { %(gl_func_name)s(%(gl_args)s, reinterpret_cast<%(data_type)s*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<%(name)s, 0>(true); - %(data_type)s temp[%(data_count)s] = { 0, }; + %(data_type)s temp[%(data_count)s] = { %(data_value)s, }; cmd.Init(%(gl_args)s, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -3319,12 +3390,13 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { gl_any_strings = [] count = 0 for arg in func.GetOriginalArgs()[0:-1]: - gl_arg_strings.append(arg.GetValidGLArg(count, 0)) + gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) gl_any_strings.append("_") count += 1 extra = { 'data_type': func.GetInfo('data_type'), 'data_count': func.GetInfo('count'), + 'data_value': func.GetInfo('data_value') or '0', 'gl_args': ", ".join(gl_arg_strings), 'gl_any_args': ", ".join(gl_any_strings), } @@ -3335,7 +3407,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { %(name)s& cmd = *GetImmediateAs<%(name)s>(); EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0); SpecializedSetup<%(name)s, 0>(false); - %(data_type)s temp[%(data_count)s] = { 0, }; + %(data_type)s temp[%(data_count)s] = { %(data_value)s, }; cmd.Init(%(all_but_last_args)s, &temp[0]); EXPECT_EQ(error::%(parse_result)s, ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s @@ -3508,8 +3580,8 @@ TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { # the number of elements requested in the command. arg_strings.append("5") else: - gl_arg_strings.append(arg.GetValidGLArg(count, 0)) - arg_strings.append(arg.GetValidArg(count, 0)) + gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) + arg_strings.append(arg.GetValidArg(func, count, 0)) count += 1 extra = { 'gl_args': ", ".join(gl_arg_strings), @@ -3538,7 +3610,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { gl_any_strings = [] count = 0 for arg in func.GetOriginalArgs()[0:-1]: - gl_arg_strings.append(arg.GetValidGLArg(count, 0)) + gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) gl_any_strings.append("_") count += 1 extra = { @@ -3729,7 +3801,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { } """ args = func.GetOriginalArgs() - local_args = "%s, 1, _" % args[0].GetValidArg(0, 0) + local_args = "%s, 1, _" % args[0].GetValidArg(func, 0, 0) self.WriteValidUnitTest(func, file, valid_test, { 'count': func.GetInfo('count'), 'local_args': local_args, @@ -4039,15 +4111,16 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { } """ args = func.GetOriginalArgs() - id_name = args[0].GetValidGLArg(0, 0) + id_name = args[0].GetValidGLArg(func, 0, 0) get_len_func = func.GetInfo('get_len_func') get_len_enum = func.GetInfo('get_len_enum') sub = { 'id_name': id_name, 'get_len_func': get_len_func, 'get_len_enum': get_len_enum, - 'gl_args': '%s, strlen(kInfo) + 1, _, _' % args[0].GetValidGLArg(0, 0), - 'args': '%s, kBucketId' % args[0].GetValidArg(0, 0), + 'gl_args': '%s, strlen(kInfo) + 1, _, _' % + args[0].GetValidGLArg(func, 0, 0), + 'args': '%s, kBucketId' % args[0].GetValidArg(func, 0, 0), 'expect_len_code': '', } if get_len_func and get_len_func[0:2] == 'gl': @@ -4121,10 +4194,18 @@ class Argument(object): """Adds init arguments for this argument to the given list.""" return args.append(self) - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): + """Gets a valid value for this argument.""" + valid_arg = func.GetValidArg(offset) + if valid_arg != None: + return valid_arg return str(offset + 1) - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): + """Gets a valid GL value for this argument.""" + valid_arg = func.GetValidArg(offset) + if valid_arg != None: + return valid_arg return str(offset + 1) def GetNumInvalidValues(self, func): @@ -4257,7 +4338,10 @@ class EnumBaseArgument(Argument): file.Write(" return error::kNoError;\n") file.Write(" }\n") - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): + valid_arg = func.GetValidArg(offset) + if valid_arg != None: + return valid_arg if 'valid' in self.enum_info: valid = self.enum_info['valid'] num_valid = len(valid) @@ -4266,8 +4350,8 @@ class EnumBaseArgument(Argument): return valid[index] return str(offset + 1) - def GetValidGLArg(self, offset, index): - return self.GetValidArg(offset, index) + def GetValidGLArg(self, func, offset, index): + return self.GetValidArg(func, offset, index) def GetNumInvalidValues(self, func): """returns the number of invalid values to be tested.""" @@ -4390,11 +4474,11 @@ class PointerArgument(Argument): """Returns true if argument is a pointer.""" return True - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): """Overridden from Argument.""" return "shared_memory_id_, shared_memory_offset_" - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): """Overridden from Argument.""" return "reinterpret_cast<%s>(shared_memory_address_)" % self.type @@ -4477,10 +4561,10 @@ class InputStringBucketArgument(Argument): 'name': self.name, }) - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): return "kNameBucketId" - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): return "_" @@ -4512,10 +4596,10 @@ class ResourceIdArgument(Argument): """Overridden from Argument.""" file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name)) - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): return "kService%sId" % self.resource_type @@ -4534,10 +4618,10 @@ class ResourceIdBindArgument(Argument): """ file.Write(code % {'type': self.type, 'name': self.name}) - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): return "kService%sId" % self.resource_type @@ -4554,10 +4638,10 @@ class ResourceIdZeroArgument(Argument): """Overridden from Argument.""" file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name)) - def GetValidArg(self, offset, index): + def GetValidArg(self, func, offset, index): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, offset, index): + def GetValidGLArg(self, func, offset, index): return "kService%sId" % self.resource_type def GetNumInvalidValues(self, func): @@ -4602,6 +4686,13 @@ class Function(object): return getattr(self.info, name) return None + def GetValidArg(self, index): + """Gets a valid arg from the function info if one exists.""" + valid_args = self.GetInfo('valid_args') + if valid_args and str(index) in valid_args: + return valid_args[str(index)] + return None + def AddInfo(self, name, value): """Adds an info.""" setattr(self.info, name, value) diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 3167ceb..7c1c0e2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -3723,11 +3723,15 @@ void GLES2DecoderImpl::DoTexParameterf( TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); if (!info) { SetGLError(GL_INVALID_VALUE, "glTexParameterf: unknown texture"); - } else { - texture_manager()->SetParameter( - feature_info_, info, pname, static_cast<GLint>(param)); - glTexParameterf(target, pname, param); + return; + } + + if (!texture_manager()->SetParameter( + feature_info_, info, pname, static_cast<GLint>(param))) { + SetGLError(GL_INVALID_ENUM, "glTexParameterf: param GL_INVALID_ENUM"); + return; } + glTexParameterf(target, pname, param); } void GLES2DecoderImpl::DoTexParameteri( @@ -3735,10 +3739,14 @@ void GLES2DecoderImpl::DoTexParameteri( TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); if (!info) { SetGLError(GL_INVALID_VALUE, "glTexParameteri: unknown texture"); - } else { - texture_manager()->SetParameter(feature_info_, info, pname, param); - glTexParameteri(target, pname, param); + return; + } + + if (!texture_manager()->SetParameter(feature_info_, info, pname, param)) { + SetGLError(GL_INVALID_ENUM, "glTexParameteri: param GL_INVALID_ENUM"); + return; } + glTexParameteri(target, pname, param); } void GLES2DecoderImpl::DoTexParameterfv( @@ -3746,11 +3754,15 @@ void GLES2DecoderImpl::DoTexParameterfv( TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); if (!info) { SetGLError(GL_INVALID_VALUE, "glTexParameterfv: unknown texture"); - } else { - texture_manager()->SetParameter( - feature_info_, info, pname, *reinterpret_cast<const GLint*>(params)); - glTexParameterfv(target, pname, params); + return; + } + + if (!texture_manager()->SetParameter( + feature_info_, info, pname, static_cast<GLint>(params[0]))) { + SetGLError(GL_INVALID_ENUM, "glTexParameterfv: param GL_INVALID_ENUM"); + return; } + glTexParameterfv(target, pname, params); } void GLES2DecoderImpl::DoTexParameteriv( @@ -3758,10 +3770,14 @@ void GLES2DecoderImpl::DoTexParameteriv( TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); if (!info) { SetGLError(GL_INVALID_VALUE, "glTexParameteriv: unknown texture"); - } else { - texture_manager()->SetParameter(feature_info_, info, pname, *params); - glTexParameteriv(target, pname, params); + return; + } + + if (!texture_manager()->SetParameter(feature_info_, info, pname, *params)) { + SetGLError(GL_INVALID_ENUM, "glTexParameteriv: param GL_INVALID_ENUM"); + return; } + glTexParameteriv(target, pname, params); } bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h index 350067d..5d7375b 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h @@ -383,10 +383,11 @@ TEST_F(GLES2DecoderTest2, StencilOpSeparateValidArgs) { TEST_F(GLES2DecoderTest2, TexParameterfValidArgs) { - EXPECT_CALL(*gl_, TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3)); + EXPECT_CALL( + *gl_, TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); SpecializedSetup<TexParameterf, 0>(true); TexParameterf cmd; - cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -395,7 +396,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_0) { EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<TexParameterf, 0>(false); TexParameterf cmd; - cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -404,7 +405,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_1) { EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<TexParameterf, 0>(false); TexParameterf cmd; - cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -413,7 +414,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs1_0) { EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<TexParameterf, 0>(false); TexParameterf cmd; - cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 3); + cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -428,6 +429,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvValidArgs) { cmd.Init( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -439,6 +441,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs0_0) { cmd.Init( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -450,6 +453,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs0_1) { cmd.Init( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -461,6 +465,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs1_0) { cmd.Init( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -470,6 +475,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs2_0) { SpecializedSetup<TexParameterfv, 0>(false); TexParameterfv cmd; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -480,6 +486,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs2_1) { cmd.Init( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -490,7 +497,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvImmediateValidArgs) { TexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<TexParameterfvImmediate, 0>(true); - GLfloat temp[1] = { 0, }; + GLfloat temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -501,7 +508,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_0) { TexParameterfvImmediate& cmd = *GetImmediateAs<TexParameterfvImmediate>(); EXPECT_CALL(*gl_, TexParameterfv(_, _, _)).Times(0); SpecializedSetup<TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { 0, }; + GLfloat temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -512,7 +519,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_1) { TexParameterfvImmediate& cmd = *GetImmediateAs<TexParameterfvImmediate>(); EXPECT_CALL(*gl_, TexParameterfv(_, _, _)).Times(0); SpecializedSetup<TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { 0, }; + GLfloat temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -523,7 +530,7 @@ TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs1_0) { TexParameterfvImmediate& cmd = *GetImmediateAs<TexParameterfvImmediate>(); EXPECT_CALL(*gl_, TexParameterfv(_, _, _)).Times(0); SpecializedSetup<TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { 0, }; + GLfloat temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -531,10 +538,11 @@ TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs1_0) { } TEST_F(GLES2DecoderTest2, TexParameteriValidArgs) { - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3)); + EXPECT_CALL( + *gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); SpecializedSetup<TexParameteri, 0>(true); TexParameteri cmd; - cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -543,7 +551,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_0) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<TexParameteri, 0>(false); TexParameteri cmd; - cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -552,7 +560,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_1) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<TexParameteri, 0>(false); TexParameteri cmd; - cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, 3); + cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -561,7 +569,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs1_0) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<TexParameteri, 0>(false); TexParameteri cmd; - cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 3); + cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_NEAREST); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -576,6 +584,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivValidArgs) { cmd.Init( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -587,6 +596,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs0_0) { cmd.Init( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -598,6 +608,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs0_1) { cmd.Init( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -609,6 +620,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs1_0) { cmd.Init( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } @@ -618,6 +630,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs2_0) { SpecializedSetup<TexParameteriv, 0>(false); TexParameteriv cmd; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -628,6 +641,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs2_1) { cmd.Init( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -638,7 +652,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivImmediateValidArgs) { TexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<TexParameterivImmediate, 0>(true); - GLint temp[1] = { 0, }; + GLint temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -649,7 +663,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_0) { TexParameterivImmediate& cmd = *GetImmediateAs<TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteriv(_, _, _)).Times(0); SpecializedSetup<TexParameterivImmediate, 0>(false); - GLint temp[1] = { 0, }; + GLint temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -660,7 +674,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_1) { TexParameterivImmediate& cmd = *GetImmediateAs<TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteriv(_, _, _)).Times(0); SpecializedSetup<TexParameterivImmediate, 0>(false); - GLint temp[1] = { 0, }; + GLint temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -671,7 +685,7 @@ TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs1_0) { TexParameterivImmediate& cmd = *GetImmediateAs<TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteriv(_, _, _)).Times(0); SpecializedSetup<TexParameterivImmediate, 0>(false); - GLint temp[1] = { 0, }; + GLint temp[1] = { GL_NEAREST, }; cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, &temp[0]); EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); @@ -1456,6 +1470,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib1fvValidArgs) { SpecializedSetup<VertexAttrib1fv, 0>(true); VertexAttrib1fv cmd; cmd.Init(1, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -1465,6 +1480,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib1fvInvalidArgs1_0) { SpecializedSetup<VertexAttrib1fv, 0>(false); VertexAttrib1fv cmd; cmd.Init(1, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1473,6 +1489,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib1fvInvalidArgs1_1) { SpecializedSetup<VertexAttrib1fv, 0>(false); VertexAttrib1fv cmd; cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1506,6 +1523,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib2fvValidArgs) { SpecializedSetup<VertexAttrib2fv, 0>(true); VertexAttrib2fv cmd; cmd.Init(1, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -1515,6 +1533,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib2fvInvalidArgs1_0) { SpecializedSetup<VertexAttrib2fv, 0>(false); VertexAttrib2fv cmd; cmd.Init(1, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1523,6 +1542,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib2fvInvalidArgs1_1) { SpecializedSetup<VertexAttrib2fv, 0>(false); VertexAttrib2fv cmd; cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1556,6 +1576,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib3fvValidArgs) { SpecializedSetup<VertexAttrib3fv, 0>(true); VertexAttrib3fv cmd; cmd.Init(1, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -1565,6 +1586,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib3fvInvalidArgs1_0) { SpecializedSetup<VertexAttrib3fv, 0>(false); VertexAttrib3fv cmd; cmd.Init(1, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1573,6 +1595,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib3fvInvalidArgs1_1) { SpecializedSetup<VertexAttrib3fv, 0>(false); VertexAttrib3fv cmd; cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1606,6 +1629,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib4fvValidArgs) { SpecializedSetup<VertexAttrib4fv, 0>(true); VertexAttrib4fv cmd; cmd.Init(1, shared_memory_id_, shared_memory_offset_); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -1615,6 +1639,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib4fvInvalidArgs1_0) { SpecializedSetup<VertexAttrib4fv, 0>(false); VertexAttrib4fv cmd; cmd.Init(1, kInvalidSharedMemoryId, 0); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } @@ -1623,6 +1648,7 @@ TEST_F(GLES2DecoderTest2, VertexAttrib4fvInvalidArgs1_1) { SpecializedSetup<VertexAttrib4fv, 0>(false); VertexAttrib4fv cmd; cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); + GetSharedMemoryAs<GLfloat*>()[0] = 0; EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } diff --git a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h index 46da61e..c7def35 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h @@ -46,8 +46,11 @@ ValueValidator<GLenum> texture_bind_target; ValueValidator<GLint> texture_border; ValueValidator<GLenum> texture_format; ValueValidator<GLenum> texture_internal_format; +ValueValidator<GLenum> texture_mag_filter_mode; +ValueValidator<GLenum> texture_min_filter_mode; ValueValidator<GLenum> texture_parameter; ValueValidator<GLenum> texture_target; +ValueValidator<GLenum> texture_wrap_mode; ValueValidator<GLint> vertex_attrib_size; ValueValidator<GLenum> vertex_attrib_type; ValueValidator<GLenum> vertex_attribute; diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h index 62c71df..c3cd9d2 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h @@ -369,6 +369,20 @@ static GLenum valid_texture_internal_format_table[] = { GL_RGBA, }; +static GLenum valid_texture_mag_filter_mode_table[] = { + GL_NEAREST, + GL_LINEAR, +}; + +static GLenum valid_texture_min_filter_mode_table[] = { + GL_NEAREST, + GL_LINEAR, + GL_NEAREST_MIPMAP_NEAREST, + GL_LINEAR_MIPMAP_NEAREST, + GL_NEAREST_MIPMAP_LINEAR, + GL_LINEAR_MIPMAP_LINEAR, +}; + static GLenum valid_texture_parameter_table[] = { GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, @@ -386,6 +400,12 @@ static GLenum valid_texture_target_table[] = { GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, }; +static GLenum valid_texture_wrap_mode_table[] = { + GL_CLAMP_TO_EDGE, + GL_MIRRORED_REPEAT, + GL_REPEAT, +}; + static GLint valid_vertex_attrib_size_table[] = { 1, 2, @@ -513,11 +533,20 @@ Validators::Validators() texture_internal_format( valid_texture_internal_format_table, arraysize( valid_texture_internal_format_table)), + texture_mag_filter_mode( + valid_texture_mag_filter_mode_table, arraysize( + valid_texture_mag_filter_mode_table)), + texture_min_filter_mode( + valid_texture_min_filter_mode_table, arraysize( + valid_texture_min_filter_mode_table)), texture_parameter( valid_texture_parameter_table, arraysize( valid_texture_parameter_table)), texture_target( valid_texture_target_table, arraysize(valid_texture_target_table)), + texture_wrap_mode( + valid_texture_wrap_mode_table, arraysize( + valid_texture_wrap_mode_table)), vertex_attrib_size( valid_vertex_attrib_size_table, arraysize( valid_vertex_attrib_size_table)), diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index 9e407fa..70bef85 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc @@ -252,19 +252,32 @@ bool TextureManager::TextureInfo::GetLevelType( return false; } -void TextureManager::TextureInfo::SetParameter( +bool TextureManager::TextureInfo::SetParameter( const FeatureInfo* feature_info, GLenum pname, GLint param) { + DCHECK(feature_info); switch (pname) { case GL_TEXTURE_MIN_FILTER: + if (!feature_info->validators()->texture_min_filter_mode.IsValid(param)) { + return false; + } min_filter_ = param; break; case GL_TEXTURE_MAG_FILTER: + if (!feature_info->validators()->texture_mag_filter_mode.IsValid(param)) { + return false; + } mag_filter_ = param; break; case GL_TEXTURE_WRAP_S: + if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { + return false; + } wrap_s_ = param; break; case GL_TEXTURE_WRAP_T: + if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { + return false; + } wrap_t_ = param; break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: @@ -272,9 +285,10 @@ void TextureManager::TextureInfo::SetParameter( break; default: NOTREACHED(); - break; + return false; } Update(feature_info); + return true; } void TextureManager::TextureInfo::Update(const FeatureInfo* feature_info) { @@ -461,18 +475,20 @@ void TextureManager::SetLevelInfo( } } -void TextureManager::SetParameter( +bool TextureManager::SetParameter( const FeatureInfo* feature_info, TextureManager::TextureInfo* info, GLenum pname, GLint param) { + DCHECK(feature_info); DCHECK(info); DCHECK(!info->IsDeleted()); if (!info->CanRender(feature_info)) { --num_unrenderable_textures_; } - info->SetParameter(feature_info, pname, param); + bool result = info->SetParameter(feature_info, pname, param); if (!info->CanRender(feature_info)) { ++num_unrenderable_textures_; } + return result; } bool TextureManager::MarkMipmapsGenerated( diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index f89fde6..fd74a7d 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h @@ -174,7 +174,8 @@ class TextureManager { // Sets a texture parameter. // TODO(gman): Expand to SetParameteri,f,iv,fv - void SetParameter( + // Returns false if param was INVALID_ENUN + bool SetParameter( const FeatureInfo* feature_info, GLenum pname, GLint param); // Makes each of the mip levels as though they were generated. @@ -298,7 +299,7 @@ class TextureManager { // Sets a texture parameter of a TextureInfo // TODO(gman): Expand to SetParameteri,f,iv,fv - void SetParameter( + bool SetParameter( const FeatureInfo* feature_info, TextureInfo* info, GLenum pname, GLint param); diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc index c6bf742..e5b0d4d 100644 --- a/gpu/command_buffer/service/texture_manager_unittest.cc +++ b/gpu/command_buffer/service/texture_manager_unittest.cc @@ -102,17 +102,29 @@ TEST_F(TextureManagerTest, SetParameter) { // Check texture got created. TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id); ASSERT_TRUE(info != NULL); - manager_.SetParameter( - &feature_info_, info, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_TRUE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->min_filter()); - manager_.SetParameter( - &feature_info_, info, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_TRUE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->mag_filter()); - manager_.SetParameter( - &feature_info_, info, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + EXPECT_TRUE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_s()); - manager_.SetParameter( - &feature_info_, info, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_TRUE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_t()); + EXPECT_FALSE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE)); + EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->min_filter()); + EXPECT_FALSE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE)); + EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), info->min_filter()); + EXPECT_FALSE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_S, GL_NEAREST)); + EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_s()); + EXPECT_FALSE(manager_.SetParameter( + &feature_info_, info, GL_TEXTURE_WRAP_T, GL_NEAREST)); EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), info->wrap_t()); } |