GLES2: uniform struct{sampler} as a function arg

(Some of?) these tests failed on Pixel2016/7.0 (they were
fixed in 8.0 and pass on Pixel2016/8.1):
  https://crbug.com/695680
This is a port from WebGL:
  https://github.com/KhronosGroup/WebGL/blob/master/sdk/tests/conformance/glsl/bugs/sampler-struct-function-arg.html

New tests:
  dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_vertex
  dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_fragment
  dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_vertex
  dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_fragment
Components: AOSP

Change-Id: Ic71a7969c9bcf481c12b95a99e6379cfec659a8e
diff --git a/android/cts/master/gles2-master.txt b/android/cts/master/gles2-master.txt
index 6264211..e2a1e66 100644
--- a/android/cts/master/gles2-master.txt
+++ b/android/cts/master/gles2-master.txt
@@ -6613,6 +6613,10 @@
 dEQP-GLES2.functional.shaders.struct.uniform.sampler_fragment
 dEQP-GLES2.functional.shaders.struct.uniform.sampler_nested_vertex
 dEQP-GLES2.functional.shaders.struct.uniform.sampler_nested_fragment
+dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_vertex
+dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_fragment
+dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_vertex
+dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_fragment
 dEQP-GLES2.functional.shaders.struct.uniform.equal_vertex
 dEQP-GLES2.functional.shaders.struct.uniform.equal_fragment
 dEQP-GLES2.functional.shaders.struct.uniform.not_equal_vertex
diff --git a/modules/gles2/functional/es2fShaderStructTests.cpp b/modules/gles2/functional/es2fShaderStructTests.cpp
index 555a154..292c526 100644
--- a/modules/gles2/functional/es2fShaderStructTests.cpp
+++ b/modules/gles2/functional/es2fShaderStructTests.cpp
@@ -1859,6 +1859,58 @@
 			c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2);
 		});
 
+	UNIFORM_STRUCT_CASE(sampler_in_function_arg, "Sampler in struct as function arg", FLAG_USES_TEXTURES,
+		LineStream()
+		<< "${DECLARATIONS}"
+		<< ""
+		<< "struct S {"
+		<< "	sampler2D		source;"
+		<< "};"
+		<< ""
+		<< "mediump vec4 fun(S s) {"
+		<< "	return texture2D(s.source, vec2(0.5));"
+		<< "}"
+		<< ""
+		<< "uniform S s;"
+		<< "void main (void)"
+		<< "{"
+		<< "	${DST} = fun(s);"
+		<< "	${ASSIGN_POS}"
+		<< "}",
+		{
+			DE_UNREF(constCoords);
+			setUniform(gl, programID, "s.source", 0);
+		},
+		{
+			c.color.xyz() = c.texture2D(TEXTURE_BRICK, tcu::Vec2(0.5f, 0.5f)).swizzle(0,1,2);
+		});
+
+	UNIFORM_STRUCT_CASE(sampler_in_array_function_arg, "Sampler in struct as function arg", FLAG_USES_TEXTURES,
+		LineStream()
+		<< "${DECLARATIONS}"
+		<< ""
+		<< "struct S {"
+		<< "	sampler2D		source;"
+		<< "};"
+		<< ""
+		<< "mediump vec4 fun(S s[2]) {"
+		<< "	return texture2D(s[0].source, vec2(0.5));"
+		<< "}"
+		<< ""
+		<< "uniform S s[2];"
+		<< "void main (void)"
+		<< "{"
+		<< "	${DST} = fun(s);"
+		<< "	${ASSIGN_POS}"
+		<< "}",
+		{
+			DE_UNREF(constCoords);
+			setUniform(gl, programID, "s[0].source", 0);
+		},
+		{
+			c.color.xyz() = c.texture2D(TEXTURE_BRICK, tcu::Vec2(0.5f, 0.5f)).swizzle(0,1,2);
+		});
+
 	UNIFORM_STRUCT_CASE(equal, "Struct equality", 0,
 		LineStream()
 		<< "${DECLARATIONS}"