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 1216a7f45ae9e4c6f4f4034afa4eeb2e9583f050..5cfe6dc44a77918d332d380179e9fddeceb3a1ba 100755 |
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py |
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py |
@@ -425,6 +425,7 @@ _STATES = { |
'type': 'GLfloat', |
'default': '1.0f', |
'range_checks': [{'check': "<= 0.0f", 'test_value': "0.0f"}], |
+ 'nan_check': True, |
}], |
}, |
'DepthMask': { |
@@ -3324,19 +3325,27 @@ class StateSetHandler(TypeHandler): |
state = _STATES[state_name] |
states = state['states'] |
args = func.GetOriginalArgs() |
- code = [] |
for ndx,item in enumerate(states): |
+ code = [] |
if 'range_checks' in item: |
for range_check in item['range_checks']: |
code.append("%s %s" % (args[ndx].name, range_check['check'])) |
- if len(code): |
- file.Write(" if (%s) {\n" % " ||\n ".join(code)) |
- file.Write( |
- ' LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,' |
- ' "%s", "%s out of range");\n' % |
- (func.name, args[ndx].name)) |
- file.Write(" return error::kNoError;\n") |
- file.Write(" }\n") |
+ if 'nan_check' in item: |
+ # Drivers might generate an INVALID_VALUE error when a value is set |
+ # to NaN. This is allowed behavior under GLES 3.0 section 2.1.1 or |
+ # OpenGL 4.5 section 2.3.4.1 - providing NaN allows undefined results. |
+ # Make this behavior consistent within Chromium, and avoid leaking GL |
+ # errors by generating the error in the command buffer instead of |
+ # letting the GL driver generate it. |
+ code.append("base::IsNaN(%s)" % args[ndx].name) |
+ if len(code): |
+ file.Write(" if (%s) {\n" % " ||\n ".join(code)) |
+ file.Write( |
+ ' LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,' |
+ ' "%s", "%s out of range");\n' % |
+ (func.name, args[ndx].name)) |
+ file.Write(" return error::kNoError;\n") |
+ file.Write(" }\n") |
code = [] |
for ndx,item in enumerate(states): |
code.append("state_.%s != %s" % (item['name'], args[ndx].name)) |
@@ -3387,6 +3396,30 @@ TEST_P(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) { |
'args': ", ".join(arg_strings), |
} |
file.Write(valid_test % vars) |
+ if 'nan_check' in item: |
+ valid_test = """ |
+TEST_P(%(test_name)s, %(name)sNaNValue%(ndx)d) { |
+ SpecializedSetup<cmds::%(name)s, 0>(false); |
+ cmds::%(name)s cmd; |
+ cmd.Init(%(args)s); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+""" |
+ name = func.name |
+ arg_strings = [ |
+ arg.GetValidArg(func) \ |
+ for arg in func.GetOriginalArgs() if not arg.IsConstant() |
+ ] |
+ |
+ arg_strings[ndx] = 'nanf("")' |
+ vars = { |
+ 'test_name': 'GLES2DecoderTest%d' % file.file_num, |
+ 'name': name, |
+ 'ndx': ndx, |
+ 'args': ", ".join(arg_strings), |
+ } |
+ file.Write(valid_test % vars) |
class StateSetRGBAlphaHandler(TypeHandler): |