Merge in fixes from Khronos repository
diff --git a/android/cts/master/com.drawelements.deqp.gles3.xml b/android/cts/master/com.drawelements.deqp.gles3.xml
index 449ff26..389b170 100644
--- a/android/cts/master/com.drawelements.deqp.gles3.xml
+++ b/android/cts/master/com.drawelements.deqp.gles3.xml
@@ -3223,18 +3223,6 @@
 						<Test name="defined_macro_undef_fragment">
 							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 						</Test>
-						<Test name="define_defined_vertex">
-							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
-						</Test>
-						<Test name="define_defined_fragment">
-							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
-						</Test>
-						<Test name="define_defined_outside_if_vertex">
-							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
-						</Test>
-						<Test name="define_defined_outside_if_fragment">
-							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
-						</Test>
 						<Test name="defined_invalid_before_all_macros_replaced_vertex">
 							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 						</Test>
diff --git a/android/cts/master/com.drawelements.deqp.gles31.xml b/android/cts/master/com.drawelements.deqp.gles31.xml
index 73dfc12..d1d82e9 100644
--- a/android/cts/master/com.drawelements.deqp.gles31.xml
+++ b/android/cts/master/com.drawelements.deqp.gles31.xml
@@ -20347,6 +20347,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 						<TestCase name="vertex_io_array_size_shader_builtin">
 							<Test name="triangles">
@@ -20358,6 +20367,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 						<TestCase name="vertex_io_array_size_query">
 							<Test name="triangles">
@@ -20369,6 +20387,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 					</TestSuite>
 					<TestSuite name="per_vertex_block">
@@ -20382,6 +20409,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 						<TestCase name="vertex_io_array_size_shader_builtin">
 							<Test name="triangles">
@@ -20393,6 +20429,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 						<TestCase name="vertex_io_array_size_query">
 							<Test name="triangles">
@@ -20404,6 +20449,15 @@
 							<Test name="isolines">
 								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 							</Test>
+							<Test name="triangles_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="quads_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
+							<Test name="isolines_explicit_tcs_out_size">
+								<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
+							</Test>
 						</TestCase>
 					</TestSuite>
 					<TestCase name="negative">
@@ -20413,9 +20467,6 @@
 						<Test name="per_patch_structs_containing_arrays">
 							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 						</Test>
-						<Test name="per_vertex_incorrect_control_explicit_output_array_size_1">
-							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
-						</Test>
 						<Test name="per_vertex_incorrect_control_explicit_output_array_size_2">
 							<TestInstance glconfig="rgba8888d24s8ms0" rotation="unspecified" surfacetype="window"/>
 						</Test>
diff --git a/android/cts/master/gles3-master.txt b/android/cts/master/gles3-master.txt
index 8d410f1..2cd197f 100644
--- a/android/cts/master/gles3-master.txt
+++ b/android/cts/master/gles3-master.txt
@@ -960,10 +960,6 @@
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_defined_test_fragment
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_undef_vertex
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_undef_fragment
-dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_vertex
-dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_fragment
-dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_outside_if_vertex
-dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_outside_if_fragment
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_invalid_before_all_macros_replaced_vertex
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_invalid_before_all_macros_replaced_fragment
 dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.basic_3_vertex
diff --git a/android/cts/master/gles31-master.txt b/android/cts/master/gles31-master.txt
index 681a205..8843688 100644
--- a/android/cts/master/gles31-master.txt
+++ b/android/cts/master/gles31-master.txt
@@ -6355,24 +6355,41 @@
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_implicit.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_shader_builtin.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex.vertex_io_array_size_query.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_implicit.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_shader_builtin.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.triangles
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.quads
 dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.isolines
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.triangles_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.quads_explicit_tcs_out_size
+dEQP-GLES31.functional.tessellation.user_defined_io.per_vertex_block.vertex_io_array_size_query.isolines_explicit_tcs_out_size
 dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_patch_array_of_structs
 dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_patch_structs_containing_arrays
-dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_vertex_incorrect_control_explicit_output_array_size_1
 dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_vertex_incorrect_control_explicit_output_array_size_2
 dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_vertex_incorrect_control_explicit_output_array_size_3
 dEQP-GLES31.functional.tessellation.user_defined_io.negative.per_vertex_incorrect_eval_explicit_input_array_size
diff --git a/android/cts/master/src/gles3-spec-issues.txt b/android/cts/master/src/gles3-spec-issues.txt
index 7efd102..ad1f008 100644
--- a/android/cts/master/src/gles3-spec-issues.txt
+++ b/android/cts/master/src/gles3-spec-issues.txt
@@ -519,3 +519,9 @@
 # Khronos bug 14266, internal bug 22654014
 dEQP-GLES3.functional.negative_api.texture.compressedteximage3d_invalid_astc_target
 dEQP-GLES3.functional.negative_api.texture.texstorage3d_invalid_astc_target
+
+# Khronos bug 15567, internal bug 27126954
+dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_vertex
+dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_fragment
+dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_outside_if_vertex
+dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_outside_if_fragment
diff --git a/data/gles31/shaders/tessellation_negative_user_defined_io.test b/data/gles31/shaders/tessellation_negative_user_defined_io.test
index 32ae315..1204b6f 100644
--- a/data/gles31/shaders/tessellation_negative_user_defined_io.test
+++ b/data/gles31/shaders/tessellation_negative_user_defined_io.test
@@ -115,52 +115,6 @@
 	""
 end
 
-case per_vertex_incorrect_control_explicit_output_array_size_1
-	version 310 es
-	desc "Incorrectly sized tessellation control output array"
-	expect compile_or_link_fail
-	require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
-	vertex ""
-		#version 310 es
-		${VERTEX_DECLARATIONS}
-		void main()
-		{
-			${VERTEX_OUTPUT}
-		}
-	""
-	tessellation_control ""
-		#version 310 es
-		${TESSELLATION_CONTROL_DECLARATIONS}
-		out highp float varyingArray[3]; // size is not equal to gl_MaxPatchVertices
-		void main()
-		{
-			varyingArray[gl_InvocationID] = gl_in[0].gl_Position[gl_InvocationID];
-			${TESSELLATION_CONTROL_OUTPUT}
-		}
-	""
-	tessellation_evaluation ""
-		#version 310 es
-		${TESSELLATION_EVALUATION_DECLARATIONS}
-		in highp float varyingArray[gl_MaxPatchVertices]; // size is correct
-		out mediump float te_out;
-		void main()
-		{
-			te_out = varyingArray[0] * gl_TessCoord.x + varyingArray[1] * gl_TessCoord.y + varyingArray[2];
-			${TESSELLATION_EVALUATION_OUTPUT}
-		}
-	""
-	fragment ""
-		#version 310 es
-		precision mediump float;
-		${FRAGMENT_DECLARATIONS}
-		in mediump float te_out;
-		void main()
-		{
-			${FRAG_COLOR} = vec4(te_out);
-		}
-	""
-end
-
 case per_vertex_incorrect_control_explicit_output_array_size_2
 	version 310 es
 	desc "Incorrectly sized tessellation control output array"
diff --git a/modules/gles31/functional/es31fTessellationTests.cpp b/modules/gles31/functional/es31fTessellationTests.cpp
index 78f2308..22f09c2 100644
--- a/modules/gles31/functional/es31fTessellationTests.cpp
+++ b/modules/gles31/functional/es31fTessellationTests.cpp
@@ -5509,12 +5509,21 @@
 		VERTEX_IO_ARRAY_SIZE_LAST
 	};
 
-	UserDefinedIOCase (Context& context, const char* name, const char* description, TessPrimitiveType primType, IOType ioType, VertexIOArraySize vertexIOArraySize, const char* referenceImagePath)
-		: TestCase				(context, name, description)
-		, m_primitiveType		(primType)
-		, m_ioType				(ioType)
-		, m_vertexIOArraySize	(vertexIOArraySize)
-		, m_referenceImagePath	(referenceImagePath)
+	enum TessControlOutArraySize
+	{
+		TESS_CONTROL_OUT_ARRAY_SIZE_IMPLICIT = 0,
+		TESS_CONTROL_OUT_ARRAY_SIZE_LAYOUT,
+		TESS_CONTROL_OUT_ARRAY_SIZE_QUERY,
+		TESS_CONTROL_OUT_ARRAY_SIZE_SHADER_BUILTIN
+	};
+
+	UserDefinedIOCase (Context& context, const char* name, const char* description, TessPrimitiveType primType, IOType ioType, VertexIOArraySize vertexIOArraySize, TessControlOutArraySize tessControlOutArraySize, const char* referenceImagePath)
+		: TestCase					(context, name, description)
+		, m_primitiveType			(primType)
+		, m_ioType					(ioType)
+		, m_vertexIOArraySize		(vertexIOArraySize)
+		, m_tessControlOutArraySize	(tessControlOutArraySize)
+		, m_referenceImagePath		(referenceImagePath)
 	{
 	}
 
@@ -5629,6 +5638,7 @@
 	const TessPrimitiveType					m_primitiveType;
 	const IOType							m_ioType;
 	const VertexIOArraySize					m_vertexIOArraySize;
+	const TessControlOutArraySize			m_tessControlOutArraySize;
 	const string							m_referenceImagePath;
 
 	vector<glu::StructType>					m_structTypes;
@@ -5999,9 +6009,11 @@
 
 			if (isArray)
 			{
-				// \note: TCS output arrays are always implicitly-sized
-				tcsDeclarations += outMaybePatch + output.declareArray(m_ioType == IO_TYPE_PER_PATCH_ARRAY			? de::toString(int(NUM_PER_PATCH_ARRAY_ELEMS))
-																	   : m_ioType == IO_TYPE_PER_PATCH_BLOCK_ARRAY	? de::toString(int(NUM_PER_PATCH_BLOCKS))
+				tcsDeclarations += outMaybePatch + output.declareArray(m_ioType == IO_TYPE_PER_PATCH_ARRAY											? de::toString(int(NUM_PER_PATCH_ARRAY_ELEMS))
+																	   : m_ioType == IO_TYPE_PER_PATCH_BLOCK_ARRAY									? de::toString(int(NUM_PER_PATCH_BLOCKS))
+																	   : m_tessControlOutArraySize == TESS_CONTROL_OUT_ARRAY_SIZE_LAYOUT			? de::toString(int(NUM_OUTPUT_VERTICES))
+																	   : m_tessControlOutArraySize == TESS_CONTROL_OUT_ARRAY_SIZE_QUERY				? de::toString(m_context.getContextInfo().getInt(GL_MAX_PATCH_VERTICES))
+																	   : m_tessControlOutArraySize == TESS_CONTROL_OUT_ARRAY_SIZE_SHADER_BUILTIN	? "gl_MaxPatchVertices"
 																	   : "");
 			}
 			else
@@ -7566,9 +7578,20 @@
 				for (int primitiveTypeI = 0; primitiveTypeI < TESSPRIMITIVETYPE_LAST; primitiveTypeI++)
 				{
 					const TessPrimitiveType primitiveType = (TessPrimitiveType)primitiveTypeI;
-					vertexArraySizeGroup->addChild(new UserDefinedIOCase(m_context, getTessPrimitiveTypeShaderName(primitiveType), "", primitiveType, ioCases[ndx].ioType, vertexArraySize,
+					vertexArraySizeGroup->addChild(new UserDefinedIOCase(m_context, getTessPrimitiveTypeShaderName(primitiveType), "", primitiveType, ioCases[ndx].ioType, vertexArraySize, UserDefinedIOCase::TESS_CONTROL_OUT_ARRAY_SIZE_IMPLICIT,
 																		 (string() + "data/tessellation/user_defined_io_" + getTessPrimitiveTypeShaderName(primitiveType) + "_ref.png").c_str()));
 				}
+
+				if (ioCases[ndx].ioType == UserDefinedIOCase::IO_TYPE_PER_VERTEX
+					|| ioCases[ndx].ioType == UserDefinedIOCase::IO_TYPE_PER_VERTEX_BLOCK)
+				{
+					for (int primitiveTypeI = 0; primitiveTypeI < TESSPRIMITIVETYPE_LAST; primitiveTypeI++)
+					{
+						const TessPrimitiveType primitiveType = (TessPrimitiveType)primitiveTypeI;
+						vertexArraySizeGroup->addChild(new UserDefinedIOCase(m_context, (string(getTessPrimitiveTypeShaderName(primitiveType)) + "_explicit_tcs_out_size").c_str(), "", primitiveType, ioCases[ndx].ioType, vertexArraySize, UserDefinedIOCase::TESS_CONTROL_OUT_ARRAY_SIZE_LAYOUT,
+																			 (string() + "data/tessellation/user_defined_io_" + getTessPrimitiveTypeShaderName(primitiveType) + "_ref.png").c_str()));
+					}
+				}
 			}
 		}