summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-12 23:36:24 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-12 23:36:24 +0000
commitcbb22e4ca7a48d2b3b9b40c8569dbe6bc21d49f4 (patch)
treeed91d534f5505e3d256f9bb7661e2a9a7574072c /gpu
parentb0b0d2c474c9a9b8743a4eb5bb46ac34f8b1086d (diff)
downloadchromium_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')
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py157
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc44
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h62
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_autogen.h3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h29
-rw-r--r--gpu/command_buffer/service/texture_manager.cc24
-rw-r--r--gpu/command_buffer/service/texture_manager.h5
-rw-r--r--gpu/command_buffer/service/texture_manager_unittest.cc28
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());
}