am 92582aed: am e641e248: Use gcc for mips target.

* commit '92582aedc8542de989b289f14ba5d5635889a125':
  Use gcc for mips target.
diff --git a/.gitignore b/.gitignore
index 2f836aa..8c33faf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 *~
 *.pyc
+*.user
diff --git a/Android.mk b/Android.mk
index 56fdf52..b047f74 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,7 +5,7 @@
 deqp_dir := $(LOCAL_PATH)/
 
 LOCAL_MODULE_TAGS := tests
-LOCAL_MODULE := libtestercore
+LOCAL_MODULE := libdeqp
 LOCAL_SRC_FILES := \
 	execserver/xsDefs.cpp \
 	execserver/xsExecutionServer.cpp \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f04916c..02cb573 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -320,8 +320,8 @@
 	include_directories(framework/platform/android)
 	include_directories(executor)
 
-	add_library(testercore SHARED framework/platform/android/tcuAndroidMain.cpp framework/platform/android/tcuAndroidJNI.cpp framework/platform/android/tcuTestLogParserJNI.cpp ${DEQP_MODULE_ENTRY_POINTS})
-	target_link_libraries(testercore tcutil-platform xecore ${DEQP_MODULE_LIBRARIES})
+	add_library(deqp SHARED framework/platform/android/tcuAndroidMain.cpp framework/platform/android/tcuAndroidJNI.cpp framework/platform/android/tcuTestLogParserJNI.cpp ${DEQP_MODULE_ENTRY_POINTS})
+	target_link_libraries(deqp tcutil-platform xecore ${DEQP_MODULE_LIBRARIES})
 
 elseif (DE_OS_IS_IOS)
 	# Code sign identity
diff --git a/android/.gitignore b/android/.gitignore
index c8aa7c4..c26052a 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -9,4 +9,4 @@
 project.properties
 proguard-project.txt
 debug
-build
+native
diff --git a/android/cts/com.drawelements.deqp.gles3.xml b/android/cts/com.drawelements.deqp.gles3.xml
index 4a330eb..c8ee4b5 100644
--- a/android/cts/com.drawelements.deqp.gles3.xml
+++ b/android/cts/com.drawelements.deqp.gles3.xml
@@ -641,6 +641,7 @@
 <Test name="pixel_unpack_full" />
 <Test name="pixel_unpack_partial" />
 <Test name="transform_feedback_full" />
+<Test name="transform_feedback_partial" />
 <Test name="uniform_full" />
 <Test name="uniform_partial" />
 </TestCase>
@@ -3853,6 +3854,8 @@
 <Test name="in_return_type_fragment" />
 <Test name="out_return_type_vertex" />
 <Test name="out_return_type_fragment" />
+<Test name="inout_return_type_vertex" />
+<Test name="inout_return_type_fragment" />
 <Test name="main_invalid_return_type_vertex" />
 <Test name="main_invalid_return_type_fragment" />
 <Test name="main_has_arguments_vertex" />
@@ -15304,6 +15307,11 @@
 <Test name="float_highp" />
 <Test name="vec2_highp" />
 </TestCase>
+<TestCase name="uniform_loop">
+<Test name="float_mediump" />
+<Test name="float_highp" />
+<Test name="vec2_highp" />
+</TestCase>
 <TestCase name="uniform_switch">
 <Test name="float_mediump" />
 <Test name="float_highp" />
@@ -15386,6 +15394,7 @@
 </TestCase>
 <TestCase name="uniform_loop">
 <Test name="float_highp" />
+<Test name="vec2_highp" />
 </TestCase>
 <TestCase name="uniform_switch">
 <Test name="float_highp" />
@@ -15444,6 +15453,7 @@
 <Test name="float_highp" />
 <Test name="vec2_mediump" />
 <Test name="vec2_highp" />
+<Test name="vec4_mediump" />
 </TestCase>
 <TestCase name="static_switch">
 <Test name="float_mediump" />
@@ -15459,6 +15469,13 @@
 <Test name="vec2_highp" />
 <Test name="vec4_mediump" />
 </TestCase>
+<TestCase name="uniform_loop">
+<Test name="float_mediump" />
+<Test name="float_highp" />
+<Test name="vec2_mediump" />
+<Test name="vec2_highp" />
+<Test name="vec4_mediump" />
+</TestCase>
 <TestCase name="uniform_switch">
 <Test name="float_mediump" />
 <Test name="float_highp" />
@@ -17124,7 +17141,6 @@
 </TestCase>
 <TestCase name="highp_vertex">
 <Test name="vec3" />
-<Test name="vec4" />
 </TestCase>
 <TestCase name="highp_fragment">
 <Test name="vec3" />
@@ -22564,9 +22580,6 @@
 <Test name="never_depth24_stencil8" />
 </TestCase>
 <TestCase name="linear">
-<Test name="less_or_equal_depth_component16" />
-<Test name="less_or_equal_depth_component32f" />
-<Test name="less_or_equal_depth24_stencil8" />
 <Test name="greater_or_equal_depth_component16" />
 <Test name="greater_or_equal_depth_component32f" />
 <Test name="greater_or_equal_depth24_stencil8" />
@@ -28010,6 +28023,7 @@
 <Test name="rgba16f" />
 <Test name="depth24_stencil8" />
 <Test name="r11f_g11f_b10f" />
+<Test name="srgb_alpha_unsigned_byte" />
 <Test name="srgb8_alpha8" />
 <Test name="depth_component32f" />
 <Test name="depth32f_stencil8" />
@@ -28073,6 +28087,8 @@
 <Test name="rgb16f" />
 <Test name="depth24_stencil8" />
 <Test name="r11f_g11f_b10f" />
+<Test name="srgb_unsigned_byte" />
+<Test name="srgb_alpha_unsigned_byte" />
 <Test name="srgb8_alpha8" />
 <Test name="depth_component32f" />
 <Test name="depth32f_stencil8" />
@@ -28135,6 +28151,8 @@
 <Test name="rgb16f" />
 <Test name="depth24_stencil8" />
 <Test name="r11f_g11f_b10f" />
+<Test name="srgb_unsigned_byte" />
+<Test name="srgb_alpha_unsigned_byte" />
 <Test name="srgb8_alpha8" />
 <Test name="depth_component32f" />
 <Test name="depth32f_stencil8" />
@@ -32430,7 +32448,6 @@
 <Test name="15" />
 <Test name="18" />
 <Test name="23" />
-<Test name="24" />
 </TestCase>
 <TestCase name="all_per_block_buffers">
 <Test name="4" />
diff --git a/android/cts/com.drawelements.deqp.gles31.xml b/android/cts/com.drawelements.deqp.gles31.xml
index 366a794..52b38ea 100644
--- a/android/cts/com.drawelements.deqp.gles31.xml
+++ b/android/cts/com.drawelements.deqp.gles31.xml
@@ -769,42 +769,66 @@
 <Test name="vec4_highp_compute" />
 </TestCase>
 <TestCase name="frexp">
+<Test name="float_lowp_vertex" />
 <Test name="float_lowp_geometry" />
 <Test name="float_lowp_tess_control" />
 <Test name="float_lowp_tess_eval" />
+<Test name="float_lowp_compute" />
+<Test name="float_mediump_vertex" />
 <Test name="float_mediump_geometry" />
 <Test name="float_mediump_tess_control" />
 <Test name="float_mediump_tess_eval" />
+<Test name="float_mediump_compute" />
+<Test name="float_highp_vertex" />
 <Test name="float_highp_geometry" />
 <Test name="float_highp_tess_control" />
 <Test name="float_highp_tess_eval" />
+<Test name="float_highp_compute" />
+<Test name="vec2_lowp_vertex" />
 <Test name="vec2_lowp_geometry" />
 <Test name="vec2_lowp_tess_control" />
 <Test name="vec2_lowp_tess_eval" />
+<Test name="vec2_lowp_compute" />
+<Test name="vec2_mediump_vertex" />
 <Test name="vec2_mediump_geometry" />
 <Test name="vec2_mediump_tess_control" />
 <Test name="vec2_mediump_tess_eval" />
+<Test name="vec2_mediump_compute" />
+<Test name="vec2_highp_vertex" />
 <Test name="vec2_highp_geometry" />
 <Test name="vec2_highp_tess_control" />
 <Test name="vec2_highp_tess_eval" />
+<Test name="vec2_highp_compute" />
+<Test name="vec3_lowp_vertex" />
 <Test name="vec3_lowp_geometry" />
 <Test name="vec3_lowp_tess_control" />
 <Test name="vec3_lowp_tess_eval" />
+<Test name="vec3_lowp_compute" />
+<Test name="vec3_mediump_vertex" />
 <Test name="vec3_mediump_geometry" />
 <Test name="vec3_mediump_tess_control" />
 <Test name="vec3_mediump_tess_eval" />
+<Test name="vec3_mediump_compute" />
+<Test name="vec3_highp_vertex" />
 <Test name="vec3_highp_geometry" />
 <Test name="vec3_highp_tess_control" />
 <Test name="vec3_highp_tess_eval" />
+<Test name="vec3_highp_compute" />
+<Test name="vec4_lowp_vertex" />
 <Test name="vec4_lowp_geometry" />
 <Test name="vec4_lowp_tess_control" />
 <Test name="vec4_lowp_tess_eval" />
+<Test name="vec4_lowp_compute" />
+<Test name="vec4_mediump_vertex" />
 <Test name="vec4_mediump_geometry" />
 <Test name="vec4_mediump_tess_control" />
 <Test name="vec4_mediump_tess_eval" />
+<Test name="vec4_mediump_compute" />
+<Test name="vec4_highp_vertex" />
 <Test name="vec4_highp_geometry" />
 <Test name="vec4_highp_tess_control" />
 <Test name="vec4_highp_tess_eval" />
+<Test name="vec4_highp_compute" />
 </TestCase>
 <TestCase name="ldexp">
 <Test name="float_lowp_vertex" />
@@ -2791,12 +2815,6 @@
 <Test name="vec3" />
 <Test name="vec4" />
 </TestCase>
-<TestCase name="mediump_compute">
-<Test name="scalar" />
-<Test name="vec2" />
-<Test name="vec3" />
-<Test name="vec4" />
-</TestCase>
 </TestSuite>
 <TestSuite name="length">
 <TestCase name="lowp_compute">
@@ -3043,15 +3061,27 @@
 <TestSuite name="frexp">
 <TestCase name="lowp_vertex">
 <Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
 </TestCase>
 <TestCase name="lowp_compute">
 <Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
 </TestCase>
 <TestCase name="mediump_vertex">
 <Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
 </TestCase>
 <TestCase name="mediump_compute">
 <Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
 </TestCase>
 </TestSuite>
 <TestSuite name="ldexp">
@@ -3073,6 +3103,42 @@
 <Test name="vec3" />
 <Test name="vec4" />
 </TestCase>
+<TestCase name="mediump_vertex">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
+<TestCase name="mediump_fragment">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
+<TestCase name="mediump_compute">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
+<TestCase name="highp_vertex">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
+<TestCase name="highp_fragment">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
+<TestCase name="highp_compute">
+<Test name="scalar" />
+<Test name="vec2" />
+<Test name="vec3" />
+<Test name="vec4" />
+</TestCase>
 </TestSuite>
 <TestSuite name="fma">
 <TestCase name="lowp_vertex">
@@ -3537,15 +3603,18 @@
 </TestCase>
 <TestCase name="fragment">
 <Test name="sampler2d" />
+<Test name="samplercube" />
 <Test name="sampler2darray" />
 <Test name="sampler3d" />
 <Test name="sampler2dshadow" />
 <Test name="samplercubeshadow" />
 <Test name="sampler2darrayshadow" />
 <Test name="isampler2d" />
+<Test name="isamplercube" />
 <Test name="isampler2darray" />
 <Test name="isampler3d" />
 <Test name="usampler2d" />
+<Test name="usamplercube" />
 <Test name="usampler2darray" />
 <Test name="usampler3d" />
 </TestCase>
@@ -5491,12 +5560,15 @@
 <Test name="ssbo_cmd_barrier_single" />
 <Test name="ssbo_cmd_barrier_multiple" />
 <Test name="shared_var_single_invocation" />
+<Test name="shared_var_single_group" />
 <Test name="shared_var_multiple_invocations" />
 <Test name="shared_var_multiple_groups" />
 <Test name="shared_atomic_op_single_invocation" />
+<Test name="shared_atomic_op_single_group" />
 <Test name="shared_atomic_op_multiple_invocations" />
 <Test name="shared_atomic_op_multiple_groups" />
 <Test name="copy_image_to_ssbo_small" />
+<Test name="copy_ssbo_to_image_small" />
 <Test name="image_atomic_op_local_size_1" />
 <Test name="image_atomic_op_local_size_8" />
 <Test name="image_barrier_single" />
@@ -5601,34 +5673,66 @@
 </TestCase>
 <TestSuite name="atomic">
 <TestCase name="add">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="min">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="max">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="and">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="or">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="xor">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="exchange">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
 <TestCase name="compswap">
+<Test name="lowp_uint" />
+<Test name="lowp_int" />
+<Test name="mediump_uint" />
+<Test name="mediump_int" />
 <Test name="highp_uint" />
 <Test name="highp_int" />
 </TestCase>
@@ -5648,6 +5752,7 @@
 </TestCase>
 <TestCase name="gen_in_compute">
 <Test name="single_invocation" />
+<Test name="multiple_groups" />
 <Test name="multiple_groups_multiple_invocations" />
 <Test name="small_offset" />
 <Test name="empty_command" />
@@ -5799,18 +5904,26 @@
 <Test name="drawarrays_separate_grid_100x100_drawcount_1" />
 <Test name="drawarrays_separate_grid_200x200_drawcount_1" />
 <Test name="drawarrays_separate_grid_500x500_drawcount_1" />
+<Test name="drawarrays_separate_grid_1200x1200_drawcount_1" />
+<Test name="drawarrays_separate_grid_1500x1500_drawcount_1" />
 <Test name="drawarrays_separate_grid_100x100_drawcount_8" />
 <Test name="drawarrays_separate_grid_200x200_drawcount_8" />
 <Test name="drawarrays_separate_grid_500x500_drawcount_8" />
+<Test name="drawarrays_separate_grid_1200x1200_drawcount_8" />
+<Test name="drawarrays_separate_grid_1500x1500_drawcount_8" />
 <Test name="drawarrays_separate_grid_100x100_drawcount_200" />
 <Test name="drawarrays_separate_grid_200x200_drawcount_800" />
 <Test name="drawarrays_separate_grid_500x500_drawcount_2500" />
 <Test name="drawarrays_combined_grid_100x100_drawcount_1" />
 <Test name="drawarrays_combined_grid_200x200_drawcount_1" />
 <Test name="drawarrays_combined_grid_500x500_drawcount_1" />
+<Test name="drawarrays_combined_grid_1200x1200_drawcount_1" />
+<Test name="drawarrays_combined_grid_1500x1500_drawcount_1" />
 <Test name="drawarrays_combined_grid_100x100_drawcount_8" />
 <Test name="drawarrays_combined_grid_200x200_drawcount_8" />
 <Test name="drawarrays_combined_grid_500x500_drawcount_8" />
+<Test name="drawarrays_combined_grid_1200x1200_drawcount_8" />
+<Test name="drawarrays_combined_grid_1500x1500_drawcount_8" />
 <Test name="drawarrays_combined_grid_100x100_drawcount_200" />
 <Test name="drawarrays_combined_grid_200x200_drawcount_800" />
 <Test name="drawarrays_combined_grid_500x500_drawcount_2500" />
@@ -8332,7 +8445,6 @@
 <Test name="17" />
 <Test name="18" />
 <Test name="19" />
-<Test name="20" />
 <Test name="21" />
 <Test name="22" />
 <Test name="23" />
@@ -9268,6 +9380,7 @@
 <Test name="10" />
 <Test name="11" />
 <Test name="12" />
+<Test name="13" />
 <Test name="14" />
 <Test name="15" />
 <Test name="16" />
@@ -9282,6 +9395,7 @@
 <Test name="26" />
 <Test name="27" />
 <Test name="28" />
+<Test name="29" />
 <Test name="30" />
 <Test name="31" />
 <Test name="32" />
@@ -9425,6 +9539,12 @@
 <Test name="comp_swap_r32i_return_value" />
 </TestCase>
 <TestCase name="qualifiers">
+<Test name="coherent_r32f" />
+<Test name="volatile_r32f" />
+<Test name="coherent_r32ui" />
+<Test name="volatile_r32ui" />
+<Test name="coherent_r32i" />
+<Test name="volatile_r32i" />
 <Test name="restrict" />
 </TestCase>
 <TestCase name="format_reinterpret">
@@ -9472,11 +9592,13 @@
 <Test name="r32i_rgba8_snorm" />
 <Test name="rgba8_r32f" />
 <Test name="rgba8_rgba8ui" />
+<Test name="rgba8_r32ui" />
 <Test name="rgba8_rgba8i" />
 <Test name="rgba8_r32i" />
 <Test name="rgba8_rgba8_snorm" />
 <Test name="rgba8_snorm_r32f" />
 <Test name="rgba8_snorm_rgba8ui" />
+<Test name="rgba8_snorm_r32ui" />
 <Test name="rgba8_snorm_rgba8i" />
 <Test name="rgba8_snorm_r32i" />
 <Test name="rgba8_snorm_rgba8" />
@@ -9643,11 +9765,13 @@
 <Test name="r32i_rgba8_snorm" />
 <Test name="rgba8_r32f" />
 <Test name="rgba8_rgba8ui" />
+<Test name="rgba8_r32ui" />
 <Test name="rgba8_rgba8i" />
 <Test name="rgba8_r32i" />
 <Test name="rgba8_rgba8_snorm" />
 <Test name="rgba8_snorm_r32f" />
 <Test name="rgba8_snorm_rgba8ui" />
+<Test name="rgba8_snorm_r32ui" />
 <Test name="rgba8_snorm_rgba8i" />
 <Test name="rgba8_snorm_r32i" />
 <Test name="rgba8_snorm_rgba8" />
@@ -9814,11 +9938,13 @@
 <Test name="r32i_rgba8_snorm" />
 <Test name="rgba8_r32f" />
 <Test name="rgba8_rgba8ui" />
+<Test name="rgba8_r32ui" />
 <Test name="rgba8_rgba8i" />
 <Test name="rgba8_r32i" />
 <Test name="rgba8_rgba8_snorm" />
 <Test name="rgba8_snorm_r32f" />
 <Test name="rgba8_snorm_rgba8ui" />
+<Test name="rgba8_snorm_r32ui" />
 <Test name="rgba8_snorm_rgba8i" />
 <Test name="rgba8_snorm_r32i" />
 <Test name="rgba8_snorm_rgba8" />
@@ -9932,6 +10058,7 @@
 <Test name="comp_swap_r32i_return_value" />
 </TestCase>
 <TestCase name="qualifiers">
+<Test name="coherent_r32f" />
 <Test name="volatile_r32f" />
 <Test name="coherent_r32ui" />
 <Test name="volatile_r32ui" />
@@ -9984,11 +10111,13 @@
 <Test name="r32i_rgba8_snorm" />
 <Test name="rgba8_r32f" />
 <Test name="rgba8_rgba8ui" />
+<Test name="rgba8_r32ui" />
 <Test name="rgba8_rgba8i" />
 <Test name="rgba8_r32i" />
 <Test name="rgba8_rgba8_snorm" />
 <Test name="rgba8_snorm_r32f" />
 <Test name="rgba8_snorm_rgba8ui" />
+<Test name="rgba8_snorm_r32ui" />
 <Test name="rgba8_snorm_rgba8i" />
 <Test name="rgba8_snorm_r32i" />
 <Test name="rgba8_snorm_rgba8" />
@@ -10480,6 +10609,9 @@
 </TestSuite>
 <TestSuite name="stencil_texturing">
 <TestCase name="format">
+<Test name="depth32f_stencil8_2d" />
+<Test name="depth32f_stencil8_2d_array" />
+<Test name="depth32f_stencil8_cube" />
 <Test name="depth24_stencil8_2d" />
 <Test name="depth24_stencil8_2d_array" />
 <Test name="depth24_stencil8_cube" />
@@ -11337,9 +11469,13 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11350,6 +11486,10 @@
 </TestCase>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11362,9 +11502,13 @@
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11373,6 +11517,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11381,9 +11528,13 @@
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11392,6 +11543,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11401,23 +11555,31 @@
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
-<Test name="mirrored_repeat_clamp_to_edge" />
+<Test name="repeat_mirrored_repeat" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
-<Test name="mirrored_repeat_clamp_to_edge" />
+<Test name="repeat_mirrored_repeat" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11429,9 +11591,13 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11442,6 +11608,10 @@
 </TestCase>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11454,9 +11624,13 @@
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11465,6 +11639,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11473,9 +11650,13 @@
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11484,6 +11665,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11493,21 +11677,33 @@
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11527,6 +11723,18 @@
 <Test name="repeat_mirrored_repeat" />
 <Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
+<TestSuite name="no_corners">
+<TestCase name="size_pot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+<TestCase name="size_npot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+</TestSuite>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
 <Test name="blue_alpha_zero_one" />
@@ -11536,6 +11744,10 @@
 </TestCase>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11553,6 +11765,18 @@
 <Test name="repeat_mirrored_repeat" />
 <Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
+<TestSuite name="no_corners">
+<TestCase name="size_pot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+<TestCase name="size_npot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+</TestSuite>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
 <Test name="blue_alpha_zero_one" />
@@ -11560,6 +11784,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11576,6 +11803,18 @@
 <Test name="repeat_mirrored_repeat" />
 <Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
+<TestSuite name="no_corners">
+<TestCase name="size_pot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+<TestCase name="size_npot">
+<Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
+</TestCase>
+</TestSuite>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
 <Test name="blue_alpha_zero_one" />
@@ -11583,12 +11822,16 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
 </TestCase>
 </TestSuite>
 <TestSuite name="depth32f">
+<TestSuite name="no_corners">
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
@@ -11613,13 +11856,7 @@
 <Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
-<TestCase name="filter_mode">
-<Test name="min_linear_mag_linear" />
-</TestCase>
-<TestCase name="base_level">
-<Test name="level_1" />
-<Test name="level_2" />
-</TestCase>
+</TestSuite>
 </TestSuite>
 </TestSuite>
 </TestSuite>
@@ -11629,42 +11866,62 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="depth32f">
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 </TestSuite>
@@ -11673,42 +11930,62 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="depth32f">
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 </TestSuite>
@@ -11719,9 +11996,13 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11732,6 +12013,10 @@
 </TestCase>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11744,9 +12029,13 @@
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11755,6 +12044,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11763,9 +12055,13 @@
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11774,6 +12070,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11783,21 +12082,33 @@
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11809,9 +12120,13 @@
 <TestSuite name="rgba8">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11822,6 +12137,10 @@
 </TestCase>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -11834,9 +12153,13 @@
 <TestSuite name="rgba8ui">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11845,6 +12168,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11853,9 +12179,13 @@
 <TestSuite name="rgba8i">
 <TestCase name="size_pot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="size_npot">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="texture_swizzle">
 <Test name="green_blue_alpha_zero" />
@@ -11864,6 +12194,9 @@
 <Test name="zero_one_red_green" />
 <Test name="one_red_green_blue" />
 </TestCase>
+<TestCase name="filter_mode">
+<Test name="min_nearest_mipmap_nearest_mag_nearest" />
+</TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
 <Test name="level_2" />
@@ -11873,21 +12206,33 @@
 <TestSuite name="size_pot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestSuite name="size_npot">
 <TestCase name="compare_less">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 <TestCase name="compare_greater">
 <Test name="clamp_to_edge_repeat" />
+<Test name="repeat_mirrored_repeat" />
+<Test name="mirrored_repeat_clamp_to_edge" />
 </TestCase>
 </TestSuite>
 <TestCase name="filter_mode">
 <Test name="min_linear_mag_linear" />
+<Test name="min_nearest_mipmap_nearest_mag_linear" />
+<Test name="min_nearest_mipmap_linear_mag_linear" />
+<Test name="min_linear_mipmap_nearest_mag_linear" />
+<Test name="min_linear_mipmap_linear_mag_linear" />
 </TestCase>
 <TestCase name="base_level">
 <Test name="level_1" />
@@ -14830,6 +15175,7 @@
 <Test name="darken" />
 <Test name="lighten" />
 <Test name="colordodge" />
+<Test name="colorburn" />
 <Test name="hardlight" />
 <Test name="difference" />
 <Test name="exclusion" />
@@ -14865,7 +15211,10 @@
 <Test name="hardlight" />
 <Test name="difference" />
 <Test name="exclusion" />
+<Test name="hsl_hue" />
+<Test name="hsl_saturation" />
 <Test name="hsl_color" />
+<Test name="hsl_luminosity" />
 </TestCase>
 <TestCase name="coherent">
 <Test name="multiply" />
@@ -14940,63 +15289,155 @@
 </TestCase>
 <TestCase name="interface">
 <Test name="same_name_vertex_smooth_fragment_smooth" />
+<Test name="same_name_vertex_smooth_fragment_centroid" />
+<Test name="same_name_vertex_smooth" />
 <Test name="same_name_vertex_flat_fragment_flat" />
+<Test name="same_name_vertex_centroid_fragment_smooth" />
 <Test name="same_name_vertex_centroid_fragment_centroid" />
+<Test name="same_name_vertex_centroid" />
 <Test name="same_name_fragment_smooth" />
+<Test name="same_name_fragment_centroid" />
 <Test name="same_name" />
 <Test name="same_location_vertex_smooth_fragment_smooth" />
+<Test name="same_location_vertex_smooth_fragment_centroid" />
+<Test name="same_location_vertex_smooth" />
 <Test name="same_location_vertex_flat_fragment_flat" />
+<Test name="same_location_vertex_centroid_fragment_smooth" />
 <Test name="same_location_vertex_centroid_fragment_centroid" />
+<Test name="same_location_vertex_centroid" />
+<Test name="same_location_fragment_smooth" />
+<Test name="same_location_fragment_centroid" />
+<Test name="same_location" />
 </TestCase>
 <TestCase name="random">
+<Test name="0" />
+<Test name="1" />
+<Test name="2" />
+<Test name="3" />
 <Test name="4" />
 <Test name="5" />
+<Test name="6" />
 <Test name="7" />
+<Test name="8" />
 <Test name="9" />
 <Test name="10" />
+<Test name="11" />
+<Test name="12" />
+<Test name="13" />
+<Test name="14" />
 <Test name="15" />
+<Test name="16" />
+<Test name="17" />
+<Test name="18" />
 <Test name="19" />
 <Test name="20" />
+<Test name="21" />
+<Test name="22" />
+<Test name="23" />
+<Test name="24" />
+<Test name="25" />
 <Test name="26" />
 <Test name="27" />
+<Test name="28" />
 <Test name="29" />
+<Test name="30" />
 <Test name="31" />
+<Test name="32" />
 <Test name="33" />
 <Test name="34" />
+<Test name="35" />
 <Test name="36" />
+<Test name="37" />
+<Test name="38" />
+<Test name="39" />
 <Test name="40" />
 <Test name="41" />
 <Test name="42" />
 <Test name="43" />
 <Test name="44" />
+<Test name="45" />
 <Test name="46" />
 <Test name="47" />
 <Test name="48" />
+<Test name="49" />
+<Test name="50" />
+<Test name="51" />
+<Test name="52" />
 <Test name="53" />
+<Test name="54" />
 <Test name="55" />
+<Test name="56" />
 <Test name="57" />
+<Test name="58" />
+<Test name="59" />
+<Test name="60" />
+<Test name="61" />
+<Test name="62" />
+<Test name="63" />
+<Test name="64" />
+<Test name="65" />
 <Test name="66" />
+<Test name="67" />
+<Test name="68" />
+<Test name="69" />
+<Test name="70" />
+<Test name="71" />
 <Test name="72" />
+<Test name="73" />
 <Test name="74" />
 <Test name="75" />
 <Test name="76" />
+<Test name="77" />
+<Test name="78" />
+<Test name="79" />
+<Test name="80" />
+<Test name="81" />
+<Test name="82" />
+<Test name="83" />
 <Test name="84" />
 <Test name="85" />
+<Test name="86" />
 <Test name="87" />
+<Test name="88" />
+<Test name="89" />
+<Test name="90" />
+<Test name="91" />
 <Test name="92" />
 <Test name="93" />
 <Test name="94" />
+<Test name="95" />
+<Test name="96" />
+<Test name="97" />
 <Test name="98" />
+<Test name="99" />
+<Test name="100" />
 <Test name="101" />
+<Test name="102" />
+<Test name="103" />
+<Test name="104" />
 <Test name="105" />
+<Test name="106" />
+<Test name="107" />
+<Test name="108" />
 <Test name="109" />
 <Test name="110" />
+<Test name="111" />
+<Test name="112" />
+<Test name="113" />
+<Test name="114" />
+<Test name="115" />
 <Test name="116" />
 <Test name="117" />
+<Test name="118" />
 <Test name="119" />
 <Test name="120" />
+<Test name="121" />
+<Test name="122" />
 <Test name="123" />
+<Test name="124" />
 <Test name="125" />
+<Test name="126" />
+<Test name="127" />
 </TestCase>
 <TestCase name="api">
 <Test name="current_program_priority" />
@@ -15013,11 +15454,14 @@
 <Test name="mismatch_explicit_location_type" />
 <Test name="mismatch_explicit_location_precision" />
 <Test name="mismatch_explicit_location" />
+<Test name="mismatch_implicit_explicit_location_1" />
 <Test name="mismatch_implicit_explicit_location_2" />
 <Test name="mismatch_implicit_explicit_location_3" />
 <Test name="match_different_struct_names" />
+<Test name="mismatch_struct_member_name" />
 <Test name="mismatch_struct_member_type" />
 <Test name="mismatch_struct_member_precision" />
+<Test name="mismatch_struct_member_order" />
 <Test name="mismatch_array_element_type" />
 <Test name="mismatch_array_length" />
 <Test name="mismatch_array_precision" />
@@ -15430,7 +15874,6 @@
 <Test name="tessellation_output_triangles_point_mode_geometry_output_lines" />
 <Test name="tessellation_output_quads_point_mode_geometry_output_lines" />
 <Test name="tessellation_output_isolines_point_mode_geometry_output_triangles" />
-<Test name="record_variable_selection" />
 </TestCase>
 <TestCase name="point_size">
 <Test name="vertex_set" />
@@ -15469,6 +15912,7 @@
 <Test name="draw_buffers" />
 <Test name="flush_mapped_buffer_range" />
 <Test name="map_buffer_range" />
+<Test name="read_buffer" />
 <Test name="unmap_buffer" />
 <Test name="bind_framebuffer" />
 <Test name="bind_renderbuffer" />
@@ -15773,6 +16217,7 @@
 <Test name="draw_buffers" />
 <Test name="flush_mapped_buffer_range" />
 <Test name="map_buffer_range" />
+<Test name="read_buffer" />
 <Test name="unmap_buffer" />
 <Test name="bind_framebuffer" />
 <Test name="bind_renderbuffer" />
@@ -16330,7 +16775,6 @@
 <Test name="get_buffer_parameteriv" />
 <Test name="get_buffer_parameteri64v" />
 <Test name="get_buffer_pointerv" />
-<Test name="get_framebuffer_attachment_parameteriv" />
 <Test name="get_renderbuffer_parameteriv" />
 <Test name="get_queryiv" />
 <Test name="get_query_objectuiv" />
@@ -16364,9 +16808,6 @@
 <Test name="case_29" />
 <Test name="case_30" />
 </TestCase>
-<TestCase name="error_groups">
-<Test name="case_4" />
-</TestCase>
 <TestCase name="async">
 <Test name="case_0_log" />
 <Test name="case_1_callback" />
@@ -16439,8 +16880,72 @@
 </TestCase>
 </TestSuite>
 <TestSuite name="no_attachments">
+<TestCase name="size">
+<Test name="16x16" />
+<Test name="16x64" />
+<Test name="16x256" />
+<Test name="16x1024" />
+<Test name="64x16" />
+<Test name="64x64" />
+<Test name="64x256" />
+<Test name="64x1024" />
+<Test name="256x16" />
+<Test name="256x64" />
+<Test name="256x256" />
+<Test name="256x1024" />
+<Test name="1024x16" />
+<Test name="1024x64" />
+<Test name="1024x256" />
+<Test name="1024x1024" />
+</TestCase>
 <TestCase name="npot_size">
 <Test name="1x1" />
+<Test name="3x3" />
+<Test name="15x15" />
+<Test name="17x17" />
+<Test name="31x31" />
+<Test name="33x33" />
+<Test name="63x63" />
+<Test name="65x65" />
+<Test name="127x127" />
+<Test name="129x129" />
+<Test name="255x255" />
+<Test name="257x257" />
+<Test name="511x511" />
+<Test name="513x513" />
+<Test name="1023x1023" />
+<Test name="1025x1025" />
+<Test name="2047x2047" />
+<Test name="15x511" />
+<Test name="127x15" />
+<Test name="129x127" />
+<Test name="511x127" />
+<Test name="2047x1025" />
+</TestCase>
+<TestCase name="multisample">
+<Test name="samples0" />
+<Test name="samples1" />
+<Test name="samples2" />
+<Test name="samples3" />
+<Test name="samples4" />
+</TestCase>
+<TestCase name="random">
+<Test name="0" />
+<Test name="1" />
+<Test name="2" />
+<Test name="3" />
+<Test name="4" />
+<Test name="5" />
+<Test name="6" />
+<Test name="7" />
+<Test name="8" />
+<Test name="9" />
+<Test name="10" />
+<Test name="11" />
+<Test name="12" />
+<Test name="13" />
+<Test name="14" />
+<Test name="15" />
 </TestCase>
 <TestCase name="interaction">
 <Test name="256x256ms0_default_128x128ms1" />
@@ -16452,6 +16957,12 @@
 <Test name="2048x2048ms4_default_1x1ms0" />
 <Test name="1x1ms0_default_2048x2048ms4" />
 </TestCase>
+<TestCase name="maximums">
+<Test name="width" />
+<Test name="height" />
+<Test name="size" />
+<Test name="samples" />
+</TestCase>
 </TestSuite>
 <TestCase name="completeness">
 <Test name="no_attachments" />
@@ -16459,6 +16970,7 @@
 </TestSuite>
 <TestSuite name="program_interface_query">
 <TestCase name="buffer_limited_query">
+<Test name="resource_name_query" />
 <Test name="resource_query" />
 </TestCase>
 <TestSuite name="uniform">
@@ -16613,6 +17125,15 @@
 <Test name="mat3" />
 <Test name="mat4x2" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
 <Test name="image_2d" />
 <Test name="iimage_2d_array" />
 <Test name="uimage_2d" />
@@ -16707,9 +17228,23 @@
 <Test name="mat3" />
 <Test name="mat4x2" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="image_2d" />
+<Test name="iimage_2d_array" />
+<Test name="uimage_2d" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="aggregates">
+<Test name="sampler2D_struct" />
+<Test name="sampler2D_array" />
 <Test name="atomic_uint_array" />
 <Test name="float_struct" />
 <Test name="float_struct_struct" />
@@ -16868,6 +17403,24 @@
 <Test name="mat4" />
 </TestCase>
 <TestCase name="opaque_type">
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="sampler_cube_shadow" />
+<Test name="sampler_2d_array_shadow" />
+<Test name="isampler_2d" />
+<Test name="isampler_cube" />
+<Test name="isampler_2d_array" />
+<Test name="isampler_3d" />
+<Test name="usampler_2d" />
+<Test name="usampler_cube" />
+<Test name="usampler_2d_array" />
+<Test name="usampler_3d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="usampler_2d_ms" />
 <Test name="image_2d" />
 <Test name="image_cube" />
 <Test name="image_2d_array" />
@@ -16884,6 +17437,7 @@
 </TestCase>
 <TestCase name="array">
 <Test name="var_array" />
+<Test name="var_array_array" />
 </TestCase>
 </TestSuite>
 <TestCase name="named_block">
@@ -16931,6 +17485,36 @@
 <Test name="mat4" />
 </TestCase>
 <TestCase name="opaque_type">
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="sampler_cube_shadow" />
+<Test name="sampler_2d_array_shadow" />
+<Test name="isampler_2d" />
+<Test name="isampler_cube" />
+<Test name="isampler_2d_array" />
+<Test name="isampler_3d" />
+<Test name="usampler_2d" />
+<Test name="usampler_cube" />
+<Test name="usampler_2d_array" />
+<Test name="usampler_3d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="usampler_2d_ms" />
+<Test name="image_2d" />
+<Test name="image_cube" />
+<Test name="image_2d_array" />
+<Test name="image_3d" />
+<Test name="iimage_2d" />
+<Test name="iimage_cube" />
+<Test name="iimage_2d_array" />
+<Test name="iimage_3d" />
+<Test name="uimage_2d" />
+<Test name="uimage_cube" />
+<Test name="uimage_2d_array" />
+<Test name="uimage_3d" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestSuite name="array">
@@ -16951,6 +17535,18 @@
 <Test name="mat4" />
 </TestCase>
 <TestCase name="opaque_type">
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="image_2d" />
+<Test name="iimage_2d_array" />
+<Test name="uimage_2d" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="array">
@@ -16960,6 +17556,12 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
+<Test name="image_2d" />
+<Test name="iimage_2d_array" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="struct">
@@ -16969,6 +17571,10 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
 </TestCase>
 </TestSuite>
 <TestSuite name="struct">
@@ -16988,6 +17594,17 @@
 <Test name="mat4x2" />
 <Test name="mat4" />
 </TestCase>
+<TestCase name="opaque_type">
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+</TestCase>
 <TestCase name="array">
 <Test name="float" />
 <Test name="int" />
@@ -16995,6 +17612,10 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
 </TestCase>
 <TestCase name="struct">
 <Test name="float" />
@@ -17003,6 +17624,10 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
 </TestCase>
 </TestSuite>
 </TestSuite>
@@ -17039,6 +17664,15 @@
 <Test name="mat3x4" />
 <Test name="mat4x3" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
 <Test name="image_2d" />
 <Test name="iimage_2d_array" />
 <Test name="uimage_2d" />
@@ -17076,6 +17710,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17087,10 +17722,12 @@
 <TestCase name="no_qualifier">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17107,6 +17744,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17123,6 +17761,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17134,10 +17773,12 @@
 <TestCase name="no_qualifier">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17154,6 +17795,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17178,9 +17820,19 @@
 <Test name="mat3x4" />
 <Test name="mat4x3" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="isampler_2d" />
+<Test name="usampler_2d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
 <Test name="image_2d" />
 <Test name="iimage_2d_array" />
 <Test name="uimage_2d" />
+<Test name="atomic_uint" />
 </TestCase>
 <TestCase name="aggregates">
 <Test name="var" />
@@ -17223,6 +17875,7 @@
 <TestCase name="aggregates">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 </TestSuite>
 <TestSuite name="column_major">
@@ -17245,10 +17898,12 @@
 <TestCase name="no_qualifier">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17265,6 +17920,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17281,6 +17937,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17292,10 +17949,12 @@
 <TestCase name="no_qualifier">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17312,6 +17971,7 @@
 <TestCase name="row_major">
 <Test name="var" />
 <Test name="var_struct" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="column_major">
 <Test name="var" />
@@ -17378,6 +18038,36 @@
 <Test name="mat4x2" />
 <Test name="mat4x3" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="sampler_cube_shadow" />
+<Test name="sampler_2d_array_shadow" />
+<Test name="isampler_2d" />
+<Test name="isampler_cube" />
+<Test name="isampler_2d_array" />
+<Test name="isampler_3d" />
+<Test name="usampler_2d" />
+<Test name="usampler_cube" />
+<Test name="usampler_2d_array" />
+<Test name="usampler_3d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="usampler_2d_ms" />
+<Test name="image_2d" />
+<Test name="image_cube" />
+<Test name="image_2d_array" />
+<Test name="image_3d" />
+<Test name="iimage_2d" />
+<Test name="iimage_cube" />
+<Test name="iimage_2d_array" />
+<Test name="iimage_3d" />
+<Test name="uimage_2d" />
+<Test name="uimage_cube" />
+<Test name="uimage_2d_array" />
+<Test name="uimage_3d" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="aggregates">
@@ -17478,6 +18168,9 @@
 <Test name="float" />
 <Test name="float_array" />
 <Test name="float_struct" />
+<Test name="sampler" />
+<Test name="sampler_array" />
+<Test name="sampler_struct" />
 <Test name="atomic_uint" />
 <Test name="atomic_uint_array" />
 <Test name="float_array_struct" />
@@ -17610,6 +18303,8 @@
 <Test name="sampler" />
 <Test name="sampler_array" />
 <Test name="sampler_struct" />
+<Test name="atomic_uint" />
+<Test name="atomic_uint_array" />
 </TestCase>
 <TestCase name="uniform_block">
 <Test name="float" />
@@ -17635,6 +18330,8 @@
 <Test name="sampler" />
 <Test name="sampler_array" />
 <Test name="sampler_struct" />
+<Test name="atomic_uint" />
+<Test name="atomic_uint_array" />
 </TestCase>
 <TestCase name="uniform_block">
 <Test name="float" />
@@ -17681,6 +18378,36 @@
 <Test name="mat4x2" />
 <Test name="mat4x3" />
 <Test name="mat4" />
+<Test name="sampler_2d" />
+<Test name="sampler_cube" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="sampler_2d_shadow" />
+<Test name="sampler_cube_shadow" />
+<Test name="sampler_2d_array_shadow" />
+<Test name="isampler_2d" />
+<Test name="isampler_cube" />
+<Test name="isampler_2d_array" />
+<Test name="isampler_3d" />
+<Test name="usampler_2d" />
+<Test name="usampler_cube" />
+<Test name="usampler_2d_array" />
+<Test name="usampler_3d" />
+<Test name="sampler_2d_ms" />
+<Test name="isampler_2d_ms" />
+<Test name="usampler_2d_ms" />
+<Test name="image_2d" />
+<Test name="image_cube" />
+<Test name="image_2d_array" />
+<Test name="image_3d" />
+<Test name="iimage_2d" />
+<Test name="iimage_cube" />
+<Test name="iimage_2d_array" />
+<Test name="iimage_3d" />
+<Test name="uimage_2d" />
+<Test name="uimage_cube" />
+<Test name="uimage_2d_array" />
+<Test name="uimage_3d" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="array">
@@ -17690,6 +18417,12 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
+<Test name="image_2d" />
+<Test name="iimage_2d_array" />
 <Test name="atomic_uint" />
 </TestCase>
 <TestCase name="struct">
@@ -17699,6 +18432,10 @@
 <Test name="bool" />
 <Test name="vec3" />
 <Test name="vec4" />
+<Test name="sampler_2d" />
+<Test name="sampler_2d_array" />
+<Test name="sampler_3d" />
+<Test name="isampler_2d" />
 </TestCase>
 </TestSuite>
 <TestSuite name="named_block">
@@ -17801,16 +18538,20 @@
 </TestSuite>
 <TestCase name="random">
 <Test name="0" />
+<Test name="1" />
 <Test name="2" />
 <Test name="3" />
 <Test name="4" />
 <Test name="5" />
 <Test name="6" />
+<Test name="7" />
+<Test name="8" />
 <Test name="9" />
 <Test name="10" />
 <Test name="11" />
 <Test name="12" />
 <Test name="13" />
+<Test name="14" />
 <Test name="15" />
 <Test name="16" />
 <Test name="17" />
@@ -17829,7 +18570,9 @@
 <Test name="30" />
 <Test name="31" />
 <Test name="32" />
+<Test name="33" />
 <Test name="34" />
+<Test name="35" />
 <Test name="36" />
 <Test name="37" />
 <Test name="38" />
@@ -17909,6 +18652,8 @@
 <Test name="referenced_by_separable_vertex" />
 <Test name="referenced_by_separable_fragment" />
 <Test name="referenced_by_vertex_fragment" />
+<Test name="referenced_by_vertex_fragment_only_fragment" />
+<Test name="referenced_by_vertex_fragment_only_vertex" />
 </TestCase>
 <TestSuite name="program_input">
 <TestSuite name="resource_list">
@@ -17949,6 +18694,11 @@
 <Test name="var" />
 <Test name="var_explicit_location" />
 </TestCase>
+<TestCase name="separable_fragment">
+<Test name="var_explicit_location" />
+<Test name="var_struct_explicit_location" />
+<Test name="var_array_explicit_location" />
+</TestCase>
 </TestSuite>
 <TestSuite name="name_length">
 <TestCase name="vertex_fragment">
@@ -18093,6 +18843,7 @@
 <TestCase name="vertex_fragment">
 <Test name="empty" />
 <Test name="var" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="separable_vertex">
 <Test name="empty" />
@@ -18103,6 +18854,7 @@
 <TestCase name="separable_fragment">
 <Test name="empty" />
 <Test name="var" />
+<Test name="var_array" />
 </TestCase>
 <TestCase name="compute">
 <Test name="empty" />
@@ -18126,11 +18878,20 @@
 <TestSuite name="location">
 <TestCase name="vertex_fragment">
 <Test name="var" />
+<Test name="var_explicit_location" />
 <Test name="var_array" />
+<Test name="var_array_explicit_location" />
+</TestCase>
+<TestCase name="separable_vertex">
+<Test name="var_explicit_location" />
+<Test name="var_struct_explicit_location" />
+<Test name="var_array_explicit_location" />
 </TestCase>
 <TestCase name="separable_fragment">
 <Test name="var" />
+<Test name="var_explicit_location" />
 <Test name="var_array" />
+<Test name="var_array_explicit_location" />
 </TestCase>
 </TestSuite>
 <TestSuite name="name_length">
@@ -18292,10 +19053,12 @@
 <TestCase name="vertex_fragment">
 <Test name="builtin_gl_position" />
 <Test name="default_block_basic_type" />
+<Test name="default_block_array_element" />
 </TestCase>
 <TestCase name="separable_vertex">
 <Test name="builtin_gl_position" />
 <Test name="default_block_basic_type" />
+<Test name="default_block_array_element" />
 </TestCase>
 </TestSuite>
 <TestSuite name="array_size">
diff --git a/android/cts/es30-mustpass-2014.2.8-2014-10-13.txt b/android/cts/es30-lmp-mr1.txt
similarity index 99%
copy from android/cts/es30-mustpass-2014.2.8-2014-10-13.txt
copy to android/cts/es30-lmp-mr1.txt
index 1e53350..69decbe 100644
--- a/android/cts/es30-mustpass-2014.2.8-2014-10-13.txt
+++ b/android/cts/es30-lmp-mr1.txt
@@ -582,6 +582,7 @@
 dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.pixel_unpack_full
 dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.pixel_unpack_partial
 dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.transform_feedback_full
+dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.transform_feedback_partial
 dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.uniform_full
 dEQP-GLES3.functional.buffer.map.read_write.render_as_index_array.uniform_partial
 dEQP-GLES3.functional.buffer.map.read_write.usage_hints.array_stream_draw
@@ -3655,6 +3656,8 @@
 dEQP-GLES3.functional.shaders.functions.invalid.in_return_type_fragment
 dEQP-GLES3.functional.shaders.functions.invalid.out_return_type_vertex
 dEQP-GLES3.functional.shaders.functions.invalid.out_return_type_fragment
+dEQP-GLES3.functional.shaders.functions.invalid.inout_return_type_vertex
+dEQP-GLES3.functional.shaders.functions.invalid.inout_return_type_fragment
 dEQP-GLES3.functional.shaders.functions.invalid.main_invalid_return_type_vertex
 dEQP-GLES3.functional.shaders.functions.invalid.main_invalid_return_type_fragment
 dEQP-GLES3.functional.shaders.functions.invalid.main_has_arguments_vertex
@@ -14642,6 +14645,9 @@
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if.float_mediump
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if.float_highp
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_if.vec2_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop.float_mediump
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop.float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_loop.vec2_highp
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch.float_mediump
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch.float_highp
 dEQP-GLES3.functional.shaders.derivate.dfdx.uniform_switch.vec2_highp
@@ -14681,6 +14687,7 @@
 dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if.float_highp
 dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_if.vec2_highp
 dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop.float_highp
+dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_loop.vec2_highp
 dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch.float_highp
 dEQP-GLES3.functional.shaders.derivate.dfdy.uniform_switch.vec2_highp
 dEQP-GLES3.functional.shaders.derivate.dfdy.fbo.float_highp
@@ -14715,6 +14722,7 @@
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop.float_highp
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop.vec2_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop.vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.static_loop.vec4_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch.float_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch.float_highp
 dEQP-GLES3.functional.shaders.derivate.fwidth.static_switch.vec2_mediump
@@ -14725,6 +14733,11 @@
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if.vec2_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if.vec2_highp
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_if.vec4_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop.float_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop.float_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop.vec2_mediump
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop.vec2_highp
+dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_loop.vec4_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch.float_mediump
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch.float_highp
 dEQP-GLES3.functional.shaders.derivate.fwidth.uniform_switch.vec2_mediump
@@ -15848,7 +15861,6 @@
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment.vec3
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment.vec4
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_vertex.vec3
-dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_vertex.vec4
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_fragment.vec3
 dEQP-GLES3.functional.shaders.builtin_functions.precision.cross.lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.precision.cross.lowp_fragment
@@ -20901,9 +20913,6 @@
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth_component16
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth_component32f
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth24_stencil8
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth_component16
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth_component32f
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth24_stencil8
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth_component16
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth_component32f
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth24_stencil8
@@ -26092,6 +26101,7 @@
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.rgba16f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.depth24_stencil8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.r11f_g11f_b10f
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.srgb_alpha_unsigned_byte
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.srgb8_alpha8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.depth_component32f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.depth32f_stencil8
@@ -26153,6 +26163,8 @@
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.rgb16f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.depth24_stencil8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.r11f_g11f_b10f
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.srgb_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.srgb_alpha_unsigned_byte
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.srgb8_alpha8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.depth_component32f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.depth32f_stencil8
@@ -26213,6 +26225,8 @@
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.rgb16f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth24_stencil8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.r11f_g11f_b10f
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.srgb_unsigned_byte
+dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.srgb_alpha_unsigned_byte
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.srgb8_alpha8
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component32f
 dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth32f_stencil8
@@ -30250,7 +30264,6 @@
 dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays.15
 dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays.18
 dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays.23
-dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays.24
 dEQP-GLES3.functional.ubo.random.all_per_block_buffers.4
 dEQP-GLES3.functional.ubo.random.all_per_block_buffers.5
 dEQP-GLES3.functional.ubo.random.all_per_block_buffers.7
diff --git a/android/cts/es30-mustpass-2014.2.8-2014-10-13.txt b/android/cts/es30-lmp.txt
similarity index 99%
rename from android/cts/es30-mustpass-2014.2.8-2014-10-13.txt
rename to android/cts/es30-lmp.txt
index 1e53350..0cd22b4 100644
--- a/android/cts/es30-mustpass-2014.2.8-2014-10-13.txt
+++ b/android/cts/es30-lmp.txt
@@ -1471,14 +1471,6 @@
 dEQP-GLES3.functional.shaders.linkage.varying.struct.mat4x2
 dEQP-GLES3.functional.shaders.linkage.varying.struct.mat4x3
 dEQP-GLES3.functional.shaders.linkage.varying.struct.mat4
-dEQP-GLES3.functional.shaders.linkage.varying.struct.int
-dEQP-GLES3.functional.shaders.linkage.varying.struct.ivec2
-dEQP-GLES3.functional.shaders.linkage.varying.struct.ivec3
-dEQP-GLES3.functional.shaders.linkage.varying.struct.ivec4
-dEQP-GLES3.functional.shaders.linkage.varying.struct.uint
-dEQP-GLES3.functional.shaders.linkage.varying.struct.uvec2
-dEQP-GLES3.functional.shaders.linkage.varying.struct.uvec3
-dEQP-GLES3.functional.shaders.linkage.varying.struct.uvec4
 dEQP-GLES3.functional.shaders.linkage.varying.struct.float_vec3
 dEQP-GLES3.functional.shaders.linkage.varying.interpolation.smooth
 dEQP-GLES3.functional.shaders.linkage.varying.interpolation.centroid
@@ -2673,14 +2665,6 @@
 dEQP-GLES3.functional.shaders.conversions.matrix_combine.float_ivec3_bvec3_vec4_ivec2_float_vec2_to_mat4_fragment
 dEQP-GLES3.functional.shaders.conditionals.if.single_statement_vertex
 dEQP-GLES3.functional.shaders.conditionals.if.single_statement_fragment
-dEQP-GLES3.functional.shaders.conditionals.if.compound_statement_vertex
-dEQP-GLES3.functional.shaders.conditionals.if.compound_statement_fragment
-dEQP-GLES3.functional.shaders.conditionals.if.sequence_statements_vertex
-dEQP-GLES3.functional.shaders.conditionals.if.sequence_statements_fragment
-dEQP-GLES3.functional.shaders.conditionals.if.sequence_condition_vertex
-dEQP-GLES3.functional.shaders.conditionals.if.sequence_condition_fragment
-dEQP-GLES3.functional.shaders.conditionals.if.complex_condition_vertex
-dEQP-GLES3.functional.shaders.conditionals.if.complex_condition_fragment
 dEQP-GLES3.functional.shaders.conditionals.if.if_else_vertex
 dEQP-GLES3.functional.shaders.conditionals.if.if_else_fragment
 dEQP-GLES3.functional.shaders.conditionals.if.if_elseif_vertex
@@ -3425,7 +3409,6 @@
 dEQP-GLES3.functional.shaders.functions.datatypes.uint_uvec3_fragment
 dEQP-GLES3.functional.shaders.functions.datatypes.uint_uvec4_vertex
 dEQP-GLES3.functional.shaders.functions.datatypes.uint_uvec4_fragment
-dEQP-GLES3.functional.shaders.functions.datatypes.bool_bool_vertex
 dEQP-GLES3.functional.shaders.functions.datatypes.bool_bool_fragment
 dEQP-GLES3.functional.shaders.functions.datatypes.mat2_vertex
 dEQP-GLES3.functional.shaders.functions.datatypes.mat2_fragment
@@ -3523,16 +3506,13 @@
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_float_types_fragment
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_int_types_vertex
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_int_types_fragment
-dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_bool_types_vertex
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_bool_types_fragment
-dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_basic_types_vertex
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_basic_types_fragment
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_complex_types_vertex
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arg_complex_types_fragment
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arguments_vertex
 dEQP-GLES3.functional.shaders.functions.overloading.user_func_arguments_fragment
 dEQP-GLES3.functional.shaders.functions.overloading.array_size_vertex
-dEQP-GLES3.functional.shaders.functions.overloading.array_size_fragment
 dEQP-GLES3.functional.shaders.functions.array_arguments.local_in_float_vertex
 dEQP-GLES3.functional.shaders.functions.array_arguments.local_in_float_fragment
 dEQP-GLES3.functional.shaders.functions.array_arguments.global_in_float_vertex
@@ -11552,8 +11532,6 @@
 dEQP-GLES3.functional.shaders.operator.bool_compare.any.bvec2_fragment
 dEQP-GLES3.functional.shaders.operator.bool_compare.any.bvec3_vertex
 dEQP-GLES3.functional.shaders.operator.bool_compare.any.bvec3_fragment
-dEQP-GLES3.functional.shaders.operator.bool_compare.any.bvec4_vertex
-dEQP-GLES3.functional.shaders.operator.bool_compare.any.bvec4_fragment
 dEQP-GLES3.functional.shaders.operator.bool_compare.all.bvec2_vertex
 dEQP-GLES3.functional.shaders.operator.bool_compare.all.bvec2_fragment
 dEQP-GLES3.functional.shaders.operator.bool_compare.all.bvec3_vertex
@@ -14261,13 +14239,9 @@
 dEQP-GLES3.functional.shaders.fragdepth.compare.dynamic_conditional_write
 dEQP-GLES3.functional.shaders.fragdepth.compare.uniform_loop_write
 dEQP-GLES3.functional.shaders.fragdepth.compare.write_in_function
-dEQP-GLES3.functional.shaders.precision.float.highp_add_vertex
 dEQP-GLES3.functional.shaders.precision.float.highp_add_fragment
-dEQP-GLES3.functional.shaders.precision.float.highp_sub_vertex
 dEQP-GLES3.functional.shaders.precision.float.highp_sub_fragment
-dEQP-GLES3.functional.shaders.precision.float.highp_mul_vertex
 dEQP-GLES3.functional.shaders.precision.float.highp_mul_fragment
-dEQP-GLES3.functional.shaders.precision.float.highp_div_vertex
 dEQP-GLES3.functional.shaders.precision.float.highp_div_fragment
 dEQP-GLES3.functional.shaders.precision.float.mediump_add_vertex
 dEQP-GLES3.functional.shaders.precision.float.mediump_add_fragment
@@ -14464,17 +14438,11 @@
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2d_float_vertex
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2d_float_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.samplercube_fixed_vertex
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.samplercube_fixed_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.samplercube_float_vertex
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.samplercube_float_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darray_fixed_vertex
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darray_fixed_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darray_float_vertex
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darray_float_fragment
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler3d_fixed_vertex
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler3d_fixed_fragment
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler3d_float_vertex
-dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler3d_float_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_vertex
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_vertex
@@ -14487,10 +14455,6 @@
 dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2d_vec4_fixed_fragment
 dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2d_vec4_float_vertex
 dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2d_vec4_float_fragment
-dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler3d_fixed_vertex
-dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler3d_fixed_fragment
-dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler3d_float_vertex
-dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler3d_float_fragment
 dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_vertex
 dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_fragment
 dEQP-GLES3.functional.shaders.texture_functions.texelfetch.sampler2d_fixed_vertex
@@ -14795,14 +14759,6 @@
 dEQP-GLES3.functional.shaders.builtin_functions.common.abs.vec4_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.abs.vec4_highp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.abs.vec4_highp_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.int_lowp_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.int_mediump_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec2_lowp_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec2_mediump_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec3_lowp_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec3_mediump_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec4_lowp_fragment
-dEQP-GLES3.functional.shaders.builtin_functions.common.abs.ivec4_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.sign.float_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.sign.float_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.sign.float_mediump_vertex
@@ -14992,61 +14948,47 @@
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.float_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.float_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.float_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.float_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec2_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec3_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstoint.vec4_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.float_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec2_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec3_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_lowp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_mediump_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.int_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.int_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.ivec2_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.ivec2_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.ivec3_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.intbitstofloat.ivec3_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uvec2_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uvec2_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uvec3_highp_vertex
-dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uvec3_highp_fragment
 dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_mediump_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_highp_vertex
@@ -15848,7 +15790,6 @@
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment.vec3
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.mediump_fragment.vec4
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_vertex.vec3
-dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_vertex.vec4
 dEQP-GLES3.functional.shaders.builtin_functions.precision.dot.highp_fragment.vec3
 dEQP-GLES3.functional.shaders.builtin_functions.precision.cross.lowp_vertex
 dEQP-GLES3.functional.shaders.builtin_functions.precision.cross.lowp_fragment
@@ -17075,7 +17016,6 @@
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.63
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.64
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.65
-dEQP-GLES3.functional.shaders.random.conditionals.vertex.66
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.67
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.68
 dEQP-GLES3.functional.shaders.random.conditionals.vertex.69
@@ -17255,7 +17195,6 @@
 dEQP-GLES3.functional.shaders.random.conditionals.combined.43
 dEQP-GLES3.functional.shaders.random.conditionals.combined.44
 dEQP-GLES3.functional.shaders.random.conditionals.combined.45
-dEQP-GLES3.functional.shaders.random.conditionals.combined.46
 dEQP-GLES3.functional.shaders.random.conditionals.combined.47
 dEQP-GLES3.functional.shaders.random.conditionals.combined.48
 dEQP-GLES3.functional.shaders.random.conditionals.combined.49
@@ -20901,9 +20840,6 @@
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth_component16
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth_component32f
 dEQP-GLES3.functional.texture.shadow.cube.nearest.never_depth24_stencil8
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth_component16
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth_component32f
-dEQP-GLES3.functional.texture.shadow.cube.linear.less_or_equal_depth24_stencil8
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth_component16
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth_component32f
 dEQP-GLES3.functional.texture.shadow.cube.linear.greater_or_equal_depth24_stencil8
@@ -25991,7 +25927,6 @@
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.rgba16f
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.depth24_stencil8
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.r11f_g11f_b10f
-dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.srgb_unsigned_byte
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.srgb_alpha_unsigned_byte
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.srgb8_alpha8
 dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.depth_component32f
@@ -35375,7 +35310,6 @@
 dEQP-GLES3.functional.negative_api.state.is_query
 dEQP-GLES3.functional.negative_api.state.is_sampler
 dEQP-GLES3.functional.negative_api.state.is_sync
-dEQP-GLES3.functional.negative_api.state.is_transform_feedback
 dEQP-GLES3.functional.negative_api.state.is_vertex_array
 dEQP-GLES3.functional.multisample.default_framebuffer.num_samples_polygon
 dEQP-GLES3.functional.multisample.default_framebuffer.num_samples_line
@@ -35507,7 +35441,6 @@
 dEQP-GLES3.functional.dither.enabled.unicolored_quad_green
 dEQP-GLES3.functional.dither.enabled.unicolored_quad_blue
 dEQP-GLES3.functional.dither.enabled.unicolored_quad_alpha
-dEQP-GLES3.functional.state_query.boolean.primitive_restart_fixed_index_isenabled
 dEQP-GLES3.functional.state_query.boolean.primitive_restart_fixed_index_getboolean
 dEQP-GLES3.functional.state_query.boolean.primitive_restart_fixed_index_getinteger
 dEQP-GLES3.functional.state_query.boolean.primitive_restart_fixed_index_getinteger64
@@ -35542,7 +35475,6 @@
 dEQP-GLES3.functional.state_query.boolean.stencil_test_getinteger
 dEQP-GLES3.functional.state_query.boolean.stencil_test_getinteger64
 dEQP-GLES3.functional.state_query.boolean.stencil_test_getfloat
-dEQP-GLES3.functional.state_query.boolean.depth_test_isenabled
 dEQP-GLES3.functional.state_query.boolean.depth_test_getboolean
 dEQP-GLES3.functional.state_query.boolean.depth_test_getinteger
 dEQP-GLES3.functional.state_query.boolean.depth_test_getinteger64
@@ -35552,7 +35484,6 @@
 dEQP-GLES3.functional.state_query.boolean.blend_getinteger
 dEQP-GLES3.functional.state_query.boolean.blend_getinteger64
 dEQP-GLES3.functional.state_query.boolean.blend_getfloat
-dEQP-GLES3.functional.state_query.boolean.dither_isenabled
 dEQP-GLES3.functional.state_query.boolean.dither_getboolean
 dEQP-GLES3.functional.state_query.boolean.dither_getinteger
 dEQP-GLES3.functional.state_query.boolean.dither_getinteger64
@@ -36116,7 +36047,6 @@
 dEQP-GLES3.functional.state_query.floats.line_width_getfloat
 dEQP-GLES3.functional.state_query.floats.polygon_offset_factor_getfloat
 dEQP-GLES3.functional.state_query.floats.polygon_offset_units_getfloat
-dEQP-GLES3.functional.state_query.floats.sample_coverage_value_getboolean
 dEQP-GLES3.functional.state_query.floats.blend_color_getboolean
 dEQP-GLES3.functional.state_query.floats.blend_color_getfloat
 dEQP-GLES3.functional.state_query.floats.color_clear_value_getboolean
@@ -37308,7 +37238,6 @@
 dEQP-GLES3.functional.lifetime.gen.shader
 dEQP-GLES3.functional.lifetime.gen.program
 dEQP-GLES3.functional.lifetime.gen.query
-dEQP-GLES3.functional.lifetime.gen.transform_feedback
 dEQP-GLES3.functional.lifetime.gen.vertex_array
 dEQP-GLES3.functional.lifetime.gen.sampler
 dEQP-GLES3.functional.lifetime.delete.buffer
diff --git a/android/cts/es31-mustpass-2014.2.8-2014-10-15.txt b/android/cts/es31-lmp-mr1.txt
similarity index 95%
copy from android/cts/es31-mustpass-2014.2.8-2014-10-15.txt
copy to android/cts/es31-lmp-mr1.txt
index a36a3cb..020e4ae 100644
--- a/android/cts/es31-mustpass-2014.2.8-2014-10-15.txt
+++ b/android/cts/es31-lmp-mr1.txt
@@ -730,42 +730,66 @@
 dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_tess_eval
 dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_compute
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_geometry
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_tess_control
 dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_tess_eval
+dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_compute
 dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_vertex
 dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_fragment
 dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_geometry
@@ -2438,10 +2462,6 @@
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec3
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec4
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.scalar
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec2
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec3
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.scalar
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec3
@@ -2599,9 +2619,21 @@
 dEQP-GLES31.functional.shaders.builtin_functions.precision.inverse.lowp_compute.mat2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.inverse.mediump_compute.mat2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.scalar
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.vec3
@@ -2614,6 +2646,30 @@
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec3
 dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.fma.lowp_vertex.scalar
 dEQP-GLES31.functional.shaders.builtin_functions.precision.fma.lowp_vertex.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.fma.lowp_vertex.vec3
@@ -2979,15 +3035,18 @@
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.vertex.usampler2darray
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.vertex.usampler3d
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler2d
+dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.samplercube
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler2darray
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler3d
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler2dshadow
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.samplercubeshadow
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler2darrayshadow
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.isampler2d
+dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.isamplercube
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.isampler2darray
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.isampler3d
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.usampler2d
+dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.usamplercube
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.usampler2darray
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.usampler3d
 dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler2d
@@ -4694,12 +4753,15 @@
 dEQP-GLES31.functional.compute.basic.ssbo_cmd_barrier_single
 dEQP-GLES31.functional.compute.basic.ssbo_cmd_barrier_multiple
 dEQP-GLES31.functional.compute.basic.shared_var_single_invocation
+dEQP-GLES31.functional.compute.basic.shared_var_single_group
 dEQP-GLES31.functional.compute.basic.shared_var_multiple_invocations
 dEQP-GLES31.functional.compute.basic.shared_var_multiple_groups
 dEQP-GLES31.functional.compute.basic.shared_atomic_op_single_invocation
+dEQP-GLES31.functional.compute.basic.shared_atomic_op_single_group
 dEQP-GLES31.functional.compute.basic.shared_atomic_op_multiple_invocations
 dEQP-GLES31.functional.compute.basic.shared_atomic_op_multiple_groups
 dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_small
+dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_small
 dEQP-GLES31.functional.compute.basic.image_atomic_op_local_size_1
 dEQP-GLES31.functional.compute.basic.image_atomic_op_local_size_8
 dEQP-GLES31.functional.compute.basic.image_barrier_single
@@ -4796,20 +4858,52 @@
 dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_128_1_1
 dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_1_128_1
 dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_13_2_4
+dEQP-GLES31.functional.compute.shared_var.atomic.add.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.add.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.add.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.add.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.add.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.add.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.min.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.min.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.min.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.min.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.min.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.min.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.max.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.max.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.max.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.max.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.max.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.max.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.and.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.and.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.and.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.and.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.and.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.and.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.or.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.or.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.or.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.or.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.or.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.or.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.xor.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.xor.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.xor.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.xor.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.xor.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.xor.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.exchange.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.exchange.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.exchange.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.exchange.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.exchange.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.exchange.highp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.compswap.lowp_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.compswap.lowp_int
+dEQP-GLES31.functional.compute.shared_var.atomic.compswap.mediump_uint
+dEQP-GLES31.functional.compute.shared_var.atomic.compswap.mediump_int
 dEQP-GLES31.functional.compute.shared_var.atomic.compswap.highp_uint
 dEQP-GLES31.functional.compute.shared_var.atomic.compswap.highp_int
 dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.single_invocation
@@ -4822,6 +4916,7 @@
 dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multi_dispatch
 dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command
 dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.single_invocation
+dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multiple_groups
 dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations
 dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.small_offset
 dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.empty_command
@@ -4923,18 +5018,26 @@
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_1
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1200x1200_drawcount_1
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1500x1500_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_8
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1200x1200_drawcount_8
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1500x1500_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_200
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_800
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_2500
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_1
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1200x1200_drawcount_1
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1500x1500_drawcount_1
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_8
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1200x1200_drawcount_8
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1500x1500_drawcount_8
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_200
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_800
 dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_2500
@@ -7245,7 +7348,6 @@
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.17
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.18
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.19
-dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.20
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.21
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.22
 dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.23
@@ -8128,6 +8230,7 @@
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.10
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.11
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.12
+dEQP-GLES31.functional.ubo.random.all_per_block_buffers.13
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.14
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.15
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.16
@@ -8142,6 +8245,7 @@
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.26
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.27
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.28
+dEQP-GLES31.functional.ubo.random.all_per_block_buffers.29
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.30
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.31
 dEQP-GLES31.functional.ubo.random.all_per_block_buffers.32
@@ -8271,6 +8375,12 @@
 dEQP-GLES31.functional.image_load_store.2d.atomic.exchange_r32i_return_value
 dEQP-GLES31.functional.image_load_store.2d.atomic.comp_swap_r32i_result
 dEQP-GLES31.functional.image_load_store.2d.atomic.comp_swap_r32i_return_value
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32f
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32f
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32ui
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32ui
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32i
+dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32i
 dEQP-GLES31.functional.image_load_store.2d.qualifiers.restrict
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32f_rgba32ui
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32f_rgba32i
@@ -8316,11 +8426,13 @@
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32f
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8ui
+dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32ui
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8i
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32i
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32f
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8ui
+dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32ui
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8i
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32i
 dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8
@@ -8473,11 +8585,13 @@
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32f
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8ui
+dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32ui
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8i
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32i
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32f
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8ui
+dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32ui
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8i
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32i
 dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8
@@ -8630,11 +8744,13 @@
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32f
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8ui
+dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32ui
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8i
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32i
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32f
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8ui
+dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32ui
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8i
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32i
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8
@@ -8736,6 +8852,7 @@
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.exchange_r32i_return_value
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.comp_swap_r32i_result
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.comp_swap_r32i_return_value
+dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32f
 dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32f
 dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32ui
 dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32ui
@@ -8786,11 +8903,13 @@
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32f
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8ui
+dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32ui
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8i
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32i
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8_snorm
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32f
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8ui
+dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32ui
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8i
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32i
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8
@@ -9201,6 +9320,9 @@
 dEQP-GLES31.functional.atomic_counter.layout.invalid.invalid_offset_align
 dEQP-GLES31.functional.atomic_counter.layout.invalid.invalid_offset_overlap
 dEQP-GLES31.functional.atomic_counter.layout.invalid.invalid_default_offset
+dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_2d
+dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_2d_array
+dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_cube
 dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_2d
 dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_2d_array
 dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_cube
@@ -9980,77 +10102,133 @@
 dEQP-GLES31.functional.texture.multisample.negative.texture_high_sample_count
 dEQP-GLES31.functional.texture.multisample.negative.texture_zero_sample_count
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.one_red_green_blue
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.incomplete.mipmap_incomplete
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.repeat_mirrored_repeat
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.one_red_green_blue
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.incomplete.mipmap_incomplete
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_pot.clamp_to_edge_repeat
@@ -10059,12 +10237,22 @@
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.clamp_to_edge_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.repeat_mirrored_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.one_red_green_blue
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_pot.clamp_to_edge_repeat
@@ -10073,11 +10261,18 @@
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.clamp_to_edge_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.repeat_mirrored_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_pot.clamp_to_edge_repeat
@@ -10086,118 +10281,222 @@
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.clamp_to_edge_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.repeat_mirrored_repeat
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_2
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_1
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_2
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.one_red_green_blue
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.incomplete.mipmap_incomplete
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.one_red_green_blue
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.incomplete.mipmap_incomplete
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.green_blue_alpha_zero
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.blue_alpha_zero_one
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.alpha_zero_one_red
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.zero_one_red_green
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.one_red_green_blue
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.base_level.level_1
 dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.base_level.level_2
 dEQP-GLES31.functional.texture.gather.offset_dynamic.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat
@@ -12465,6 +12764,7 @@
 dEQP-GLES31.functional.blend_equation_advanced.srgb.darken
 dEQP-GLES31.functional.blend_equation_advanced.srgb.lighten
 dEQP-GLES31.functional.blend_equation_advanced.srgb.colordodge
+dEQP-GLES31.functional.blend_equation_advanced.srgb.colorburn
 dEQP-GLES31.functional.blend_equation_advanced.srgb.hardlight
 dEQP-GLES31.functional.blend_equation_advanced.srgb.difference
 dEQP-GLES31.functional.blend_equation_advanced.srgb.exclusion
@@ -12496,7 +12796,10 @@
 dEQP-GLES31.functional.blend_equation_advanced.barrier.hardlight
 dEQP-GLES31.functional.blend_equation_advanced.barrier.difference
 dEQP-GLES31.functional.blend_equation_advanced.barrier.exclusion
+dEQP-GLES31.functional.blend_equation_advanced.barrier.hsl_hue
+dEQP-GLES31.functional.blend_equation_advanced.barrier.hsl_saturation
 dEQP-GLES31.functional.blend_equation_advanced.barrier.hsl_color
+dEQP-GLES31.functional.blend_equation_advanced.barrier.hsl_luminosity
 dEQP-GLES31.functional.blend_equation_advanced.coherent.multiply
 dEQP-GLES31.functional.blend_equation_advanced.coherent.screen
 dEQP-GLES31.functional.blend_equation_advanced.coherent.overlay
@@ -12557,61 +12860,153 @@
 dEQP-GLES31.functional.separate_shader.create_shader_program.separate_programs_add_both
 dEQP-GLES31.functional.separate_shader.create_shader_program.single_program_add_both
 dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth_fragment_smooth
+dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth_fragment_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth
 dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_flat_fragment_flat
+dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid_fragment_smooth
 dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid_fragment_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid
 dEQP-GLES31.functional.separate_shader.interface.same_name_fragment_smooth
+dEQP-GLES31.functional.separate_shader.interface.same_name_fragment_centroid
 dEQP-GLES31.functional.separate_shader.interface.same_name
 dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth_fragment_smooth
+dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth_fragment_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth
 dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_flat_fragment_flat
+dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid_fragment_smooth
 dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid_fragment_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_location_fragment_smooth
+dEQP-GLES31.functional.separate_shader.interface.same_location_fragment_centroid
+dEQP-GLES31.functional.separate_shader.interface.same_location
+dEQP-GLES31.functional.separate_shader.random.0
+dEQP-GLES31.functional.separate_shader.random.1
+dEQP-GLES31.functional.separate_shader.random.2
+dEQP-GLES31.functional.separate_shader.random.3
 dEQP-GLES31.functional.separate_shader.random.4
 dEQP-GLES31.functional.separate_shader.random.5
+dEQP-GLES31.functional.separate_shader.random.6
 dEQP-GLES31.functional.separate_shader.random.7
+dEQP-GLES31.functional.separate_shader.random.8
 dEQP-GLES31.functional.separate_shader.random.9
 dEQP-GLES31.functional.separate_shader.random.10
+dEQP-GLES31.functional.separate_shader.random.11
+dEQP-GLES31.functional.separate_shader.random.12
+dEQP-GLES31.functional.separate_shader.random.13
+dEQP-GLES31.functional.separate_shader.random.14
 dEQP-GLES31.functional.separate_shader.random.15
+dEQP-GLES31.functional.separate_shader.random.16
+dEQP-GLES31.functional.separate_shader.random.17
+dEQP-GLES31.functional.separate_shader.random.18
 dEQP-GLES31.functional.separate_shader.random.19
 dEQP-GLES31.functional.separate_shader.random.20
+dEQP-GLES31.functional.separate_shader.random.21
+dEQP-GLES31.functional.separate_shader.random.22
+dEQP-GLES31.functional.separate_shader.random.23
+dEQP-GLES31.functional.separate_shader.random.24
+dEQP-GLES31.functional.separate_shader.random.25
 dEQP-GLES31.functional.separate_shader.random.26
 dEQP-GLES31.functional.separate_shader.random.27
+dEQP-GLES31.functional.separate_shader.random.28
 dEQP-GLES31.functional.separate_shader.random.29
+dEQP-GLES31.functional.separate_shader.random.30
 dEQP-GLES31.functional.separate_shader.random.31
+dEQP-GLES31.functional.separate_shader.random.32
 dEQP-GLES31.functional.separate_shader.random.33
 dEQP-GLES31.functional.separate_shader.random.34
+dEQP-GLES31.functional.separate_shader.random.35
 dEQP-GLES31.functional.separate_shader.random.36
+dEQP-GLES31.functional.separate_shader.random.37
+dEQP-GLES31.functional.separate_shader.random.38
+dEQP-GLES31.functional.separate_shader.random.39
 dEQP-GLES31.functional.separate_shader.random.40
 dEQP-GLES31.functional.separate_shader.random.41
 dEQP-GLES31.functional.separate_shader.random.42
 dEQP-GLES31.functional.separate_shader.random.43
 dEQP-GLES31.functional.separate_shader.random.44
+dEQP-GLES31.functional.separate_shader.random.45
 dEQP-GLES31.functional.separate_shader.random.46
 dEQP-GLES31.functional.separate_shader.random.47
 dEQP-GLES31.functional.separate_shader.random.48
+dEQP-GLES31.functional.separate_shader.random.49
+dEQP-GLES31.functional.separate_shader.random.50
+dEQP-GLES31.functional.separate_shader.random.51
+dEQP-GLES31.functional.separate_shader.random.52
 dEQP-GLES31.functional.separate_shader.random.53
+dEQP-GLES31.functional.separate_shader.random.54
 dEQP-GLES31.functional.separate_shader.random.55
+dEQP-GLES31.functional.separate_shader.random.56
 dEQP-GLES31.functional.separate_shader.random.57
+dEQP-GLES31.functional.separate_shader.random.58
+dEQP-GLES31.functional.separate_shader.random.59
+dEQP-GLES31.functional.separate_shader.random.60
+dEQP-GLES31.functional.separate_shader.random.61
+dEQP-GLES31.functional.separate_shader.random.62
+dEQP-GLES31.functional.separate_shader.random.63
+dEQP-GLES31.functional.separate_shader.random.64
+dEQP-GLES31.functional.separate_shader.random.65
 dEQP-GLES31.functional.separate_shader.random.66
+dEQP-GLES31.functional.separate_shader.random.67
+dEQP-GLES31.functional.separate_shader.random.68
+dEQP-GLES31.functional.separate_shader.random.69
+dEQP-GLES31.functional.separate_shader.random.70
+dEQP-GLES31.functional.separate_shader.random.71
 dEQP-GLES31.functional.separate_shader.random.72
+dEQP-GLES31.functional.separate_shader.random.73
 dEQP-GLES31.functional.separate_shader.random.74
 dEQP-GLES31.functional.separate_shader.random.75
 dEQP-GLES31.functional.separate_shader.random.76
+dEQP-GLES31.functional.separate_shader.random.77
+dEQP-GLES31.functional.separate_shader.random.78
+dEQP-GLES31.functional.separate_shader.random.79
+dEQP-GLES31.functional.separate_shader.random.80
+dEQP-GLES31.functional.separate_shader.random.81
+dEQP-GLES31.functional.separate_shader.random.82
+dEQP-GLES31.functional.separate_shader.random.83
 dEQP-GLES31.functional.separate_shader.random.84
 dEQP-GLES31.functional.separate_shader.random.85
+dEQP-GLES31.functional.separate_shader.random.86
 dEQP-GLES31.functional.separate_shader.random.87
+dEQP-GLES31.functional.separate_shader.random.88
+dEQP-GLES31.functional.separate_shader.random.89
+dEQP-GLES31.functional.separate_shader.random.90
+dEQP-GLES31.functional.separate_shader.random.91
 dEQP-GLES31.functional.separate_shader.random.92
 dEQP-GLES31.functional.separate_shader.random.93
 dEQP-GLES31.functional.separate_shader.random.94
+dEQP-GLES31.functional.separate_shader.random.95
+dEQP-GLES31.functional.separate_shader.random.96
+dEQP-GLES31.functional.separate_shader.random.97
 dEQP-GLES31.functional.separate_shader.random.98
+dEQP-GLES31.functional.separate_shader.random.99
+dEQP-GLES31.functional.separate_shader.random.100
 dEQP-GLES31.functional.separate_shader.random.101
+dEQP-GLES31.functional.separate_shader.random.102
+dEQP-GLES31.functional.separate_shader.random.103
+dEQP-GLES31.functional.separate_shader.random.104
 dEQP-GLES31.functional.separate_shader.random.105
+dEQP-GLES31.functional.separate_shader.random.106
+dEQP-GLES31.functional.separate_shader.random.107
+dEQP-GLES31.functional.separate_shader.random.108
 dEQP-GLES31.functional.separate_shader.random.109
 dEQP-GLES31.functional.separate_shader.random.110
+dEQP-GLES31.functional.separate_shader.random.111
+dEQP-GLES31.functional.separate_shader.random.112
+dEQP-GLES31.functional.separate_shader.random.113
+dEQP-GLES31.functional.separate_shader.random.114
+dEQP-GLES31.functional.separate_shader.random.115
 dEQP-GLES31.functional.separate_shader.random.116
 dEQP-GLES31.functional.separate_shader.random.117
+dEQP-GLES31.functional.separate_shader.random.118
 dEQP-GLES31.functional.separate_shader.random.119
 dEQP-GLES31.functional.separate_shader.random.120
+dEQP-GLES31.functional.separate_shader.random.121
+dEQP-GLES31.functional.separate_shader.random.122
 dEQP-GLES31.functional.separate_shader.random.123
+dEQP-GLES31.functional.separate_shader.random.124
 dEQP-GLES31.functional.separate_shader.random.125
+dEQP-GLES31.functional.separate_shader.random.126
+dEQP-GLES31.functional.separate_shader.random.127
 dEQP-GLES31.functional.separate_shader.api.current_program_priority
 dEQP-GLES31.functional.separate_shader.api.active_program_uniform
 dEQP-GLES31.functional.separate_shader.api.pipeline_programs
@@ -12623,11 +13018,14 @@
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location_type
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location_precision
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location
+dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_1
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_2
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_3
 dEQP-GLES31.functional.separate_shader.validation.varying.match_different_struct_names
+dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_name
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_type
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_precision
+dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_order
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_element_type
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_length
 dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_precision
@@ -13007,7 +13405,6 @@
 dEQP-GLES31.functional.tessellation_geometry_interaction.feedback.tessellation_output_triangles_point_mode_geometry_output_lines
 dEQP-GLES31.functional.tessellation_geometry_interaction.feedback.tessellation_output_quads_point_mode_geometry_output_lines
 dEQP-GLES31.functional.tessellation_geometry_interaction.feedback.tessellation_output_isolines_point_mode_geometry_output_triangles
-dEQP-GLES31.functional.tessellation_geometry_interaction.feedback.record_variable_selection
 dEQP-GLES31.functional.tessellation_geometry_interaction.point_size.vertex_set
 dEQP-GLES31.functional.tessellation_geometry_interaction.point_size.evaluation_set
 dEQP-GLES31.functional.tessellation_geometry_interaction.point_size.geometry_set
@@ -13038,6 +13435,7 @@
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.draw_buffers
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.flush_mapped_buffer_range
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.map_buffer_range
+dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.read_buffer
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.unmap_buffer
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.bind_framebuffer
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.bind_renderbuffer
@@ -13328,6 +13726,7 @@
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.draw_buffers
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.flush_mapped_buffer_range
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.map_buffer_range
+dEQP-GLES31.functional.debug.negative_coverage.log.buffer.read_buffer
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.unmap_buffer
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.bind_framebuffer
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.bind_renderbuffer
@@ -13861,7 +14260,6 @@
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_parameteri64v
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_pointerv
-dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_framebuffer_attachment_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_renderbuffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_queryiv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_query_objectuiv
@@ -13888,7 +14286,6 @@
 dEQP-GLES31.functional.debug.error_filters.case_28
 dEQP-GLES31.functional.debug.error_filters.case_29
 dEQP-GLES31.functional.debug.error_filters.case_30
-dEQP-GLES31.functional.debug.error_groups.case_4
 dEQP-GLES31.functional.debug.async.case_0_log
 dEQP-GLES31.functional.debug.async.case_1_callback
 dEQP-GLES31.functional.debug.async.case_2_log
@@ -13950,7 +14347,65 @@
 dEQP-GLES31.functional.fbo.color.texcubearray.r32f
 dEQP-GLES31.functional.fbo.color.texcubearray.r16f
 dEQP-GLES31.functional.fbo.color.texcubearray.rgb16f
+dEQP-GLES31.functional.fbo.no_attachments.size.16x16
+dEQP-GLES31.functional.fbo.no_attachments.size.16x64
+dEQP-GLES31.functional.fbo.no_attachments.size.16x256
+dEQP-GLES31.functional.fbo.no_attachments.size.16x1024
+dEQP-GLES31.functional.fbo.no_attachments.size.64x16
+dEQP-GLES31.functional.fbo.no_attachments.size.64x64
+dEQP-GLES31.functional.fbo.no_attachments.size.64x256
+dEQP-GLES31.functional.fbo.no_attachments.size.64x1024
+dEQP-GLES31.functional.fbo.no_attachments.size.256x16
+dEQP-GLES31.functional.fbo.no_attachments.size.256x64
+dEQP-GLES31.functional.fbo.no_attachments.size.256x256
+dEQP-GLES31.functional.fbo.no_attachments.size.256x1024
+dEQP-GLES31.functional.fbo.no_attachments.size.1024x16
+dEQP-GLES31.functional.fbo.no_attachments.size.1024x64
+dEQP-GLES31.functional.fbo.no_attachments.size.1024x256
+dEQP-GLES31.functional.fbo.no_attachments.size.1024x1024
 dEQP-GLES31.functional.fbo.no_attachments.npot_size.1x1
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.3x3
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.15x15
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.17x17
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.31x31
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.33x33
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.63x63
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.65x65
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.127x127
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.129x129
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.255x255
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.257x257
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.511x511
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.513x513
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.1023x1023
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.1025x1025
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.2047x2047
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.15x511
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.127x15
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.129x127
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.511x127
+dEQP-GLES31.functional.fbo.no_attachments.npot_size.2047x1025
+dEQP-GLES31.functional.fbo.no_attachments.multisample.samples0
+dEQP-GLES31.functional.fbo.no_attachments.multisample.samples1
+dEQP-GLES31.functional.fbo.no_attachments.multisample.samples2
+dEQP-GLES31.functional.fbo.no_attachments.multisample.samples3
+dEQP-GLES31.functional.fbo.no_attachments.multisample.samples4
+dEQP-GLES31.functional.fbo.no_attachments.random.0
+dEQP-GLES31.functional.fbo.no_attachments.random.1
+dEQP-GLES31.functional.fbo.no_attachments.random.2
+dEQP-GLES31.functional.fbo.no_attachments.random.3
+dEQP-GLES31.functional.fbo.no_attachments.random.4
+dEQP-GLES31.functional.fbo.no_attachments.random.5
+dEQP-GLES31.functional.fbo.no_attachments.random.6
+dEQP-GLES31.functional.fbo.no_attachments.random.7
+dEQP-GLES31.functional.fbo.no_attachments.random.8
+dEQP-GLES31.functional.fbo.no_attachments.random.9
+dEQP-GLES31.functional.fbo.no_attachments.random.10
+dEQP-GLES31.functional.fbo.no_attachments.random.11
+dEQP-GLES31.functional.fbo.no_attachments.random.12
+dEQP-GLES31.functional.fbo.no_attachments.random.13
+dEQP-GLES31.functional.fbo.no_attachments.random.14
+dEQP-GLES31.functional.fbo.no_attachments.random.15
 dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms0_default_128x128ms1
 dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms1_default_128x128ms0
 dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms0_default_512x512ms2
@@ -13959,7 +14414,12 @@
 dEQP-GLES31.functional.fbo.no_attachments.interaction.17x512ms4_default_16x16ms2
 dEQP-GLES31.functional.fbo.no_attachments.interaction.2048x2048ms4_default_1x1ms0
 dEQP-GLES31.functional.fbo.no_attachments.interaction.1x1ms0_default_2048x2048ms4
+dEQP-GLES31.functional.fbo.no_attachments.maximums.width
+dEQP-GLES31.functional.fbo.no_attachments.maximums.height
+dEQP-GLES31.functional.fbo.no_attachments.maximums.size
+dEQP-GLES31.functional.fbo.no_attachments.maximums.samples
 dEQP-GLES31.functional.fbo.completeness.no_attachments
+dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_name_query
 dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_query
 dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var
 dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct
@@ -14099,6 +14559,15 @@
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat3
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.isampler_2d_ms
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.image_2d
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.iimage_2d_array
 dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.uimage_2d
@@ -14175,7 +14644,21 @@
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat3
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.iimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.uimage_2d
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.sampler2D_struct
+dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.sampler2D_array
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.atomic_uint_array
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_struct
 dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_struct_struct
@@ -14304,6 +14787,24 @@
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_cube_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_array_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d_ms
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_2d
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_cube
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_2d_array
@@ -14318,6 +14819,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.uimage_3d
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.array.var_array
+dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.array.var_array_array
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.float
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.int
 dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.uint
@@ -14353,6 +14855,36 @@
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_cube_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_array_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_3d
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.int
@@ -14368,6 +14900,18 @@
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.iimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.uimage_2d
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.int
@@ -14375,6 +14919,12 @@
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.bool
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.iimage_2d_array
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.int
@@ -14382,6 +14932,10 @@
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.bool
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.isampler_2d
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.int
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.uint
@@ -14396,18 +14950,35 @@
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.isampler_2d_ms
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.int
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.uint
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.bool
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.isampler_2d
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.int
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.uint
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.bool
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.isampler_2d
 dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.float
 dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.int
 dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.uint
@@ -14432,6 +15003,15 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat3x4
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.isampler_2d_ms
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.image_2d
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.iimage_2d_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.uimage_2d
@@ -14456,13 +15036,16 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.aggregates.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var_array
@@ -14471,6 +15054,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var_array
@@ -14479,13 +15063,16 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var_array
@@ -14494,6 +15081,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var_array
@@ -14509,9 +15097,19 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat3x4
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.isampler_2d_ms
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.image_2d
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.iimage_2d_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.uimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var_array
@@ -14538,6 +15136,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat4
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat2
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat2x3
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat3
@@ -14549,8 +15148,10 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.aggregates.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var_array
@@ -14559,6 +15160,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var_array
@@ -14567,13 +15169,16 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var_array
@@ -14582,6 +15187,7 @@
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.no_qualifier.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var_struct
+dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var_array
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var_struct
 dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var_array
@@ -14630,6 +15236,36 @@
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_cube_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_array_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_3d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_3d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_3d
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.aggregates.atomic_uint_array
 dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.aggregates.float_struct
@@ -14700,6 +15336,9 @@
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler_array
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler_struct
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.atomic_uint_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_array_struct
@@ -14792,6 +15431,8 @@
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.atomic_uint_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float_struct
@@ -14807,6 +15448,8 @@
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler_struct
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.atomic_uint
+dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.atomic_uint_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float_array
 dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float_struct
@@ -14841,6 +15484,36 @@
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4x2
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4x3
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_cube_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_array_shadow
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d_ms
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_cube
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_3d
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.float
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.int
@@ -14848,6 +15521,12 @@
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.bool
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.isampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.image_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.iimage_2d_array
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.atomic_uint
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.float
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.int
@@ -14855,6 +15534,10 @@
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.bool
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.vec4
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_2d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_2d_array
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_3d
+dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.isampler_2d
 dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.float
 dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.int
 dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.uint
@@ -14929,16 +15612,20 @@
 dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.vec3
 dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.vec4
 dEQP-GLES31.functional.program_interface_query.uniform.random.0
+dEQP-GLES31.functional.program_interface_query.uniform.random.1
 dEQP-GLES31.functional.program_interface_query.uniform.random.2
 dEQP-GLES31.functional.program_interface_query.uniform.random.3
 dEQP-GLES31.functional.program_interface_query.uniform.random.4
 dEQP-GLES31.functional.program_interface_query.uniform.random.5
 dEQP-GLES31.functional.program_interface_query.uniform.random.6
+dEQP-GLES31.functional.program_interface_query.uniform.random.7
+dEQP-GLES31.functional.program_interface_query.uniform.random.8
 dEQP-GLES31.functional.program_interface_query.uniform.random.9
 dEQP-GLES31.functional.program_interface_query.uniform.random.10
 dEQP-GLES31.functional.program_interface_query.uniform.random.11
 dEQP-GLES31.functional.program_interface_query.uniform.random.12
 dEQP-GLES31.functional.program_interface_query.uniform.random.13
+dEQP-GLES31.functional.program_interface_query.uniform.random.14
 dEQP-GLES31.functional.program_interface_query.uniform.random.15
 dEQP-GLES31.functional.program_interface_query.uniform.random.16
 dEQP-GLES31.functional.program_interface_query.uniform.random.17
@@ -14957,7 +15644,9 @@
 dEQP-GLES31.functional.program_interface_query.uniform.random.30
 dEQP-GLES31.functional.program_interface_query.uniform.random.31
 dEQP-GLES31.functional.program_interface_query.uniform.random.32
+dEQP-GLES31.functional.program_interface_query.uniform.random.33
 dEQP-GLES31.functional.program_interface_query.uniform.random.34
+dEQP-GLES31.functional.program_interface_query.uniform.random.35
 dEQP-GLES31.functional.program_interface_query.uniform.random.36
 dEQP-GLES31.functional.program_interface_query.uniform.random.37
 dEQP-GLES31.functional.program_interface_query.uniform.random.38
@@ -15008,6 +15697,8 @@
 dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_separable_vertex
 dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_separable_fragment
 dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment_only_fragment
+dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment_only_vertex
 dEQP-GLES31.functional.program_interface_query.program_input.resource_list.vertex_fragment.empty
 dEQP-GLES31.functional.program_interface_query.program_input.resource_list.vertex_fragment.var
 dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_vertex.empty
@@ -15025,6 +15716,9 @@
 dEQP-GLES31.functional.program_interface_query.program_input.location.vertex_fragment.var_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_input.location.separable_vertex.var
 dEQP-GLES31.functional.program_interface_query.program_input.location.separable_vertex.var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_array_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_input.name_length.vertex_fragment.var
 dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_vertex.var
 dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_fragment.var
@@ -15140,12 +15834,14 @@
 dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat4
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.empty
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.var_array
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.empty
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var_struct
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var_array
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.empty
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.var
+dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.var_array
 dEQP-GLES31.functional.program_interface_query.program_output.resource_list.compute.empty
 dEQP-GLES31.functional.program_interface_query.program_output.array_size.vertex_fragment.var
 dEQP-GLES31.functional.program_interface_query.program_output.array_size.vertex_fragment.var_array
@@ -15155,9 +15851,16 @@
 dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_fragment.var
 dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_fragment.var_array
 dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var
+dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_array_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_struct_explicit_location
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_array_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_array
+dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_array_explicit_location
 dEQP-GLES31.functional.program_interface_query.program_output.name_length.vertex_fragment.var
 dEQP-GLES31.functional.program_interface_query.program_output.name_length.vertex_fragment.var_array
 dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_vertex.var
@@ -15281,8 +15984,10 @@
 dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.uvec4
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.builtin_gl_position
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_array_element
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.builtin_gl_position
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_basic_type
+dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_array_element
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.builtin_gl_position
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_basic_type
 dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_array_element
diff --git a/android/cts/es31-mustpass-2014.2.8-2014-10-15.txt b/android/cts/es31-lmp.txt
similarity index 99%
rename from android/cts/es31-mustpass-2014.2.8-2014-10-15.txt
rename to android/cts/es31-lmp.txt
index a36a3cb..09b73d2 100644
--- a/android/cts/es31-mustpass-2014.2.8-2014-10-15.txt
+++ b/android/cts/es31-lmp.txt
@@ -2438,10 +2438,6 @@
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec3
 dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec4
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.scalar
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec2
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec3
-dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.mediump_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.scalar
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec2
 dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec3
@@ -8579,12 +8575,6 @@
 dEQP-GLES31.functional.image_load_store.3d.atomic.exchange_r32i_return_value
 dEQP-GLES31.functional.image_load_store.3d.atomic.comp_swap_r32i_result
 dEQP-GLES31.functional.image_load_store.3d.atomic.comp_swap_r32i_return_value
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32f
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32f
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32ui
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32ui
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32i
-dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32i
 dEQP-GLES31.functional.image_load_store.3d.qualifiers.restrict
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32f_rgba32ui
 dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32f_rgba32i
@@ -8736,11 +8726,6 @@
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.exchange_r32i_return_value
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.comp_swap_r32i_result
 dEQP-GLES31.functional.image_load_store.2d_array.atomic.comp_swap_r32i_return_value
-dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32f
-dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32ui
-dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32ui
-dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32i
-dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32i
 dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.restrict
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32f_rgba32ui
 dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32f_rgba32i
@@ -10009,9 +9994,7 @@
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_1
 dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_2
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
 dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mag_linear
@@ -13300,7 +13283,6 @@
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_buffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_buffer_parameteri64v
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_buffer_pointerv
-dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_framebuffer_attachment_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_renderbuffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_internalformativ
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.state.get_queryiv
@@ -13590,7 +13572,6 @@
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_buffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_buffer_parameteri64v
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_buffer_pointerv
-dEQP-GLES31.functional.debug.negative_coverage.log.state.get_framebuffer_attachment_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_renderbuffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_internalformativ
 dEQP-GLES31.functional.debug.negative_coverage.log.state.get_queryiv
@@ -13861,7 +13842,6 @@
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_parameteri64v
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_buffer_pointerv
-dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_framebuffer_attachment_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_renderbuffer_parameteriv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_queryiv
 dEQP-GLES31.functional.debug.negative_coverage.get_error.state.get_query_objectuiv
diff --git a/android/package/Android.mk b/android/package/Android.mk
index 54264c1..d4015a3 100644
--- a/android/package/Android.mk
+++ b/android/package/Android.mk
@@ -4,7 +4,7 @@
 LOCAL_MODULE_TAGS := tests
 
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_JNI_SHARED_LIBRARIES := libtestercore
+LOCAL_JNI_SHARED_LIBRARIES := libdeqp
 
 LOCAL_ASSET_DIR := $(LOCAL_PATH)/../../data
 LOCAL_PACKAGE_NAME := com.drawelements.deqp
diff --git a/android/package/AndroidManifest.xml b/android/package/AndroidManifest.xml
index 33380c2..4da88a1 100644
--- a/android/package/AndroidManifest.xml
+++ b/android/package/AndroidManifest.xml
@@ -33,7 +33,7 @@
 				  android:exported="true"
 				  android:process=":testercore">
 			<meta-data android:name="android.app.lib_name"
-					   android:value="testercore" />
+					   android:value="deqp" />
 			<meta-data android:name="android.app.func_name"
 					   android:value="createTestActivity" />
 		</activity>
diff --git a/android/package/src/com/drawelements/deqp/execserver/ExecService.java b/android/package/src/com/drawelements/deqp/execserver/ExecService.java
index 140339b..84d0909 100644
--- a/android/package/src/com/drawelements/deqp/execserver/ExecService.java
+++ b/android/package/src/com/drawelements/deqp/execserver/ExecService.java
@@ -38,12 +38,7 @@
 
 public class ExecService extends Service {
 	static {
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
-			System.loadLibrary("testercore");
-		} else {
-			// Pre-gingerbread version without EGL tests.
-			System.loadLibrary("testercore_legacy");
-		}
+		System.loadLibrary("deqp");
 	}
 
 	long m_server = 0; //!< Server pointer.
diff --git a/android/package/src/com/drawelements/deqp/testercore/TestLogParser.java b/android/package/src/com/drawelements/deqp/testercore/TestLogParser.java
index f5befc8..05ee665 100644
--- a/android/package/src/com/drawelements/deqp/testercore/TestLogParser.java
+++ b/android/package/src/com/drawelements/deqp/testercore/TestLogParser.java
@@ -32,7 +32,7 @@
 public class TestLogParser
 {
 	static {
-		System.loadLibrary("testercore");
+		System.loadLibrary("deqp");
 	}
 
 	private long				m_nativePointer;
diff --git a/android/scripts/build.py b/android/scripts/build.py
index 12419cc..8f1cc2d 100644
--- a/android/scripts/build.py
+++ b/android/scripts/build.py
@@ -24,37 +24,41 @@
 		common.die("Could not read signing key passwords")
 	return (storepass, keypass)
 
-def getNativeBuildDir (nativeLib, buildType):
-	deqpDir = os.path.normpath(os.path.join(common.ANDROID_DIR, ".."))
-	return os.path.normpath(os.path.join(deqpDir, "android", "build", "%s-%d-%s" % (buildType.lower(), nativeLib.apiVersion, nativeLib.abiVersion)))
+def getNativeBuildDir (buildRoot, nativeLib, buildType):
+	buildName = "%s-%d-%s" % (buildType.lower(), nativeLib.apiVersion, nativeLib.abiVersion)
+	return os.path.normpath(os.path.join(buildRoot, "native", buildName))
 
-def buildNative (nativeLib, buildType):
+def getAssetsDir (buildRoot, nativeLib, buildType):
+	return os.path.join(getNativeBuildDir(buildRoot, nativeLib, buildType), "assets")
+
+def getPrebuiltsDirName (abiName):
+	PREBUILT_DIRS = {
+			'x86':			'android-x86',
+			'armeabi-v7a':	'android-arm',
+			'arm64-v8a':	'android-arm64'
+		}
+
+	if not abiName in PREBUILT_DIRS:
+		raise Exception("Unknown ABI %s, don't know where prebuilts are" % abiName)
+
+	return PREBUILT_DIRS[abiName]
+
+def buildNative (buildRoot, libTargetDir, nativeLib, buildType):
 	deqpDir		= os.path.normpath(os.path.join(common.ANDROID_DIR, ".."))
-	buildDir	= getNativeBuildDir(nativeLib, buildType)
-	assetsDir	= os.path.join(buildDir, "assets")
-	libsDir		= os.path.join(common.ANDROID_DIR, "package", "libs", nativeLib.abiVersion)
-	srcLibFile	= os.path.join(buildDir, "libtestercore.so")
-	dstLibFile	= os.path.join(libsDir, "lib%s.so" % nativeLib.libName)
-
-	# Remove old lib files if such exist
-	if os.path.exists(srcLibFile):
-		os.unlink(srcLibFile)
-
-	if os.path.exists(dstLibFile):
-		os.unlink(dstLibFile)
-
-	# Remove assets directory so that we don't collect unnecessary cruft to the APK
-	if os.path.exists(assetsDir):
-		shutil.rmtree(assetsDir)
+	buildDir	= getNativeBuildDir(buildRoot, nativeLib, buildType)
+	libsDir		= os.path.join(libTargetDir, nativeLib.abiVersion)
+	srcLibFile	= os.path.join(buildDir, common.NATIVE_LIB_NAME)
+	dstLibFile	= os.path.join(libsDir, common.NATIVE_LIB_NAME)
 
 	# Make build directory if necessary
 	if not os.path.exists(buildDir):
 		os.makedirs(buildDir)
 		os.chdir(buildDir)
+		toolchainFile = '%s/framework/delibs/cmake/toolchain-android-%s.cmake' % (deqpDir, common.ANDROID_NDK_TOOLCHAIN_VERSION)
 		common.execArgs([
 				'cmake',
 				'-G%s' % common.CMAKE_GENERATOR,
-				'-DCMAKE_TOOLCHAIN_FILE=%s/framework/delibs/cmake/toolchain-android-%s.cmake' % (deqpDir, common.ANDROID_NDK_TOOLCHAIN_VERSION),
+				'-DCMAKE_TOOLCHAIN_FILE=%s' % toolchainFile,
 				'-DANDROID_NDK_HOST_OS=%s' % common.ANDROID_NDK_HOST_OS,
 				'-DANDROID_NDK_PATH=%s' % common.ANDROID_NDK_PATH,
 				'-DANDROID_ABI=%s' % nativeLib.abiVersion,
@@ -65,71 +69,105 @@
 			])
 
 	os.chdir(buildDir)
-	common.execute(common.BUILD_CMD)
+	common.execArgs(['cmake', '--build', '.'] + common.EXTRA_BUILD_ARGS)
 
 	if not os.path.exists(libsDir):
 		os.makedirs(libsDir)
 
-	# Copy libtestercore.so
 	shutil.copyfile(srcLibFile, dstLibFile)
 
 	# Copy gdbserver for debugging
 	if buildType.lower() == "debug":
-		if nativeLib.abiVersion == "x86":
-			shutil.copyfile(os.path.join(common.ANDROID_NDK_PATH, "prebuilt/android-x86/gdbserver/gdbserver"), os.path.join(libsDir, "gdbserver"))
-		elif nativeLib.abiVersion == "armeabi-v7a":
-			shutil.copyfile(os.path.join(common.ANDROID_NDK_PATH, "prebuilt/android-arm/gdbserver/gdbserver"), os.path.join(libsDir, "gdbserver"))
-		else:
-			print("Unknown ABI. Won't copy gdbserver to package")
-	elif os.path.exists(os.path.join(libsDir, "gdbserver")):
-		# Make sure there is no gdbserver if build is not debug build
-		os.unlink(os.path.join(libsDir, "gdbserver"))
+		srcGdbserverPath = os.path.join(common.ANDROID_NDK_PATH,
+										'prebuilt',
+										getPrebuiltsDirName(nativeLib.abiVersion),
+										'gdbserver',
+										'gdbserver')
+		dstGdbserverPath = os.path.join(libsDir, 'gdbserver')
+		shutil.copyfile(srcGdbserverPath, dstGdbserverPath)
+	else:
+		assert not os.path.exists(os.path.join(libsDir, "gdbserver"))
 
-def copyAssets (nativeLib, buildType):
-	srcDir = os.path.join(getNativeBuildDir(nativeLib, buildType), "assets")
-	dstDir = os.path.join(common.ANDROID_DIR, "package", "assets")
-
-	if os.path.exists(dstDir):
-		shutil.rmtree(dstDir)
-
-	if os.path.exists(srcDir):
-		shutil.copytree(srcDir, dstDir)
-
-def fileContains (filename, str):
-	f = open(filename, 'rb')
-	data = f.read()
-	f.close()
-
-	return data.find(str) >= 0
-
-def buildApp (isRelease):
-	appDir	= os.path.join(common.ANDROID_DIR, "package")
+def buildApp (buildRoot, isRelease):
+	appDir	= os.path.join(buildRoot, "package")
 
 	# Set up app
 	os.chdir(appDir)
-	common.execute("%s update project --name dEQP --path . --target %s" % (common.shellquote(common.ANDROID_BIN), common.ANDROID_JAVA_API))
+
+	manifestSrcPath = os.path.normpath(os.path.join(common.ANDROID_DIR, "package", "AndroidManifest.xml"))
+	manifestDstPath = os.path.normpath(os.path.join(appDir, "AndroidManifest.xml"))
+
+	# Build dir can be the Android dir, in which case the copy is not needed.
+	if manifestSrcPath != manifestDstPath:
+		shutil.copy(manifestSrcPath, manifestDstPath)
+
+	common.execArgs([
+			common.ANDROID_BIN,
+			'update', 'project',
+			'--name', 'dEQP',
+			'--path', '.',
+			'--target', str(common.ANDROID_JAVA_API),
+		])
 
 	# Build
-	common.execute("%s %s" % (common.shellquote(common.ANT_BIN), "release" if isRelease else "debug"))
+	common.execArgs([
+			common.ANT_BIN,
+			"release" if isRelease else "debug",
+			"-Dsource.dir=" + os.path.join(common.ANDROID_DIR, "package", "src"),
+			"-Dresource.absolute.dir=" + os.path.join(common.ANDROID_DIR, "package", "res")
+		])
 
 def signApp (keystore, keyname, storepass, keypass):
 	os.chdir(os.path.join(common.ANDROID_DIR, "package"))
-	common.execute("%s -keystore %s -storepass %s -keypass %s -sigfile CERT -digestalg SHA1 -sigalg MD5withRSA -signedjar bin/dEQP-unaligned.apk bin/dEQP-release-unsigned.apk %s" % (common.shellquote(common.JARSIGNER_BIN), common.shellquote(keystore), storepass, keypass, keyname))
-	common.execute("%s -f 4 bin/dEQP-unaligned.apk bin/dEQP-release.apk" % (common.shellquote(common.ZIPALIGN_BIN)))
+	common.execArgs([
+			common.JARSIGNER_BIN,
+			'-keystore', keystore,
+			'-storepass', storepass,
+			'-keypass', keypass,
+			'-sigfile', 'CERT',
+			'-digestalg', 'SHA1',
+			'-sigalg', 'MD5withRSA',
+			'-signedjar', 'bin/dEQP-unaligned.apk',
+			'bin/dEQP-release-unsigned.apk',
+			keyname
+		])
+	common.execArgs([
+			common.ZIPALIGN_BIN,
+			'-f', '4',
+			'bin/dEQP-unaligned.apk',
+			'bin/dEQP-release.apk'
+		])
 
-def build (isRelease=False, nativeBuildType="Release"):
+def build (buildRoot=common.ANDROID_DIR, isRelease=False, nativeBuildType="Release"):
 	curDir = os.getcwd()
 
 	try:
+		assetsSrcDir = getAssetsDir(buildRoot, common.NATIVE_LIBS[0], nativeBuildType)
+		assetsDstDir = os.path.join(buildRoot, "package", "assets")
+
+		# Remove assets from the first build dir where we copy assets from
+		# to avoid collecting cruft there.
+		if os.path.exists(assetsSrcDir):
+			shutil.rmtree(assetsSrcDir)
+		if os.path.exists(assetsDstDir):
+			shutil.rmtree(assetsDstDir)
+
+		# Remove old libs dir to avoid collecting out-of-date versions
+		# of libs for ABIs not built this time.
+		libTargetDir = os.path.join(buildRoot, "package", "libs")
+		if os.path.exists(libTargetDir):
+			shutil.rmtree(libTargetDir)
+
 		# Build native code
 		for lib in common.NATIVE_LIBS:
-			buildNative(lib, nativeBuildType)
+			buildNative(buildRoot, libTargetDir, lib, nativeBuildType)
 
-		# Copy assets from first build dir
-		copyAssets(common.NATIVE_LIBS[0], nativeBuildType)
+		# Copy assets
+		if os.path.exists(assetsSrcDir):
+			shutil.copytree(assetsSrcDir, assetsDstDir)
 
 		# Build java code and .apk
-		buildApp(isRelease)
+		buildApp(buildRoot, isRelease)
 
 	finally:
 		# Restore working dir
@@ -139,7 +177,8 @@
 	parser = argparse.ArgumentParser()
 	parser.add_argument('--is-release', dest='isRelease', type=bool, default=False, help="Build android project in release mode.")
 	parser.add_argument('--native-build-type', dest='nativeBuildType', default="Release", help="Build type passed cmake when building native code.")
+	parser.add_argument('--build-root', dest='buildRoot', default=common.ANDROID_DIR, help="Root directory for storing build results.")
 
 	args = parser.parse_args()
 
-	build(isRelease=args.isRelease, nativeBuildType=args.nativeBuildType)
+	build(buildRoot=os.path.abspath(args.buildRoot), isRelease=args.isRelease, nativeBuildType=args.nativeBuildType)
diff --git a/android/scripts/common.py b/android/scripts/common.py
index 9cd12b5..fd3d8a9 100644
--- a/android/scripts/common.py
+++ b/android/scripts/common.py
@@ -1,15 +1,16 @@
 # -*- coding: utf-8 -*-
 
 import os
+import re
 import sys
 import shlex
 import subprocess
+import multiprocessing
 
 class NativeLib:
-	def __init__ (self, libName, apiVersion, abiVersion):
-		self.libName		= libName
-		self.apiVersion		= apiVersion
-		self.abiVersion		= abiVersion
+	def __init__ (self, apiVersion, abiVersion):
+		self.apiVersion	= apiVersion
+		self.abiVersion	= abiVersion
 
 def getPlatform ():
 	if sys.platform.startswith('linux'):
@@ -17,7 +18,7 @@
 	else:
 		return sys.platform
 
-def getCfg (variants):
+def selectByOS (variants):
 	platform = getPlatform()
 	if platform in variants:
 		return variants[platform]
@@ -41,12 +42,19 @@
 def isBinaryInPath (binName):
 	return which(binName) != None
 
-def selectBin (basePaths, relBinPath):
-	for basePath in basePaths:
-		fullPath = os.path.normpath(os.path.join(basePath, relBinPath))
-		if isExecutable(fullPath):
-			return fullPath
-	return which(os.path.basename(relBinPath))
+def selectFirstExistingBinary (filenames):
+	for filename in filenames:
+		if filename != None and isExecutable(filename):
+			return filename
+
+	return None
+
+def selectFirstExistingDir (paths):
+	for path in paths:
+		if path != None and os.path.isdir(path):
+			return path
+
+	return None
 
 def die (msg):
 	print msg
@@ -66,31 +74,37 @@
 	if retcode != 0:
 		raise Exception("Failed to execute '%s', got %d" % (str(args), retcode))
 
-# deqp/android path
-ANDROID_DIR				= os.path.realpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
+class Device:
+	def __init__(self, serial, product, model, device):
+		self.serial		= serial
+		self.product	= product
+		self.model		= model
+		self.device		= device
 
-# Build configuration
-NATIVE_LIBS				= [
-		#		  library name		API		ABI
-#		NativeLib("testercore",		13,		"armeabi"),			# ARM v5 ABI
-		NativeLib("testercore",		13,		"armeabi-v7a"),		# ARM v7a ABI
-		NativeLib("testercore",		13,		"x86"),				# x86
-#		NativeLib("testercore",		21,		"arm64-v8a"),		# ARM64 v8a ABI
-	]
-ANDROID_JAVA_API		= "android-13"
+	def __str__ (self):
+		return "%s: {product: %s, model: %s, device: %s}" % (self.serial, self.product, self.model, self.device)
 
-# NDK paths
-ANDROID_NDK_HOST_OS		= getCfg({
-		'win32':	"windows",
-		'darwin':	"darwin-x86",
-		'linux':	"linux-x86"
-	})
-ANDROID_NDK_PATH		= getCfg({
-		'win32':	"C:/android/android-ndk-r9d",
-		'darwin':	os.path.expanduser("~/android-ndk-r9d"),
-		'linux':	os.path.expanduser("~/android-ndk-r9d")
-	})
-ANDROID_NDK_TOOLCHAIN_VERSION = "clang-r9d" # Toolchain file is selected based on this
+def getDevices (adb):
+	proc = subprocess.Popen([adb, 'devices', '-l'], stdout=subprocess.PIPE)
+	(stdout, stderr) = proc.communicate()
+
+	if proc.returncode != 0:
+		raise Exception("adb devices -l failed, got %d" % retcode)
+
+	ptrn = re.compile(r'^([a-zA-Z0-9]+)\s+.*product:([^\s]+)\s+model:([^\s]+)\s+device:([^\s]+)')
+	devices = []
+	for line in stdout.splitlines()[1:]:
+		if len(line.strip()) == 0:
+			continue
+
+		m = ptrn.match(line)
+		if m == None:
+			print "WARNING: Failed to parse device info '%s'" % line
+			continue
+
+		devices.append(Device(m.group(1), m.group(2), m.group(3), m.group(4)))
+
+	return devices
 
 def getWin32Generator ():
 	if which("jom.exe") != None:
@@ -98,46 +112,93 @@
 	else:
 		return "NMake Makefiles"
 
+def isNinjaSupported ():
+	return which("ninja") != None
+
+def getUnixGenerator ():
+	if isNinjaSupported():
+		return "Ninja"
+	else:
+		return "Unix Makefiles"
+
+def getExtraBuildArgs (generator):
+	if generator == "Unix Makefiles":
+		return ["--", "-j%d" % multiprocessing.cpu_count()]
+	else:
+		return []
+
+NDK_HOST_OS_NAMES = [
+	"windows",
+	"windows_x86-64",
+	"darwin-x86",
+	"darwin-x86-64",
+	"linux-x86",
+	"linux-x86_64"
+]
+
+def getNDKHostOsName (ndkPath):
+	for name in NDK_HOST_OS_NAMES:
+		if os.path.exists(os.path.join(ndkPath, "prebuilt", name)):
+			return name
+
+	raise Exception("Couldn't determine NDK host OS")
+
+# deqp/android path
+ANDROID_DIR				= os.path.realpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
+
+# Build configuration
+NATIVE_LIBS				= [
+		#		  API		ABI
+		NativeLib(13,		"armeabi-v7a"),		# ARM v7a ABI
+		NativeLib(13,		"x86"),				# x86
+		NativeLib(21,		"arm64-v8a"),		# ARM64 v8a ABI
+	]
+ANDROID_JAVA_API		= "android-13"
+NATIVE_LIB_NAME			= "libdeqp.so"
+
+# NDK paths
+ANDROID_NDK_PATH		= selectFirstExistingDir([
+		os.path.expanduser("~/android-ndk-r10c"),
+		"C:/android/android-ndk-r10c",
+	])
+ANDROID_NDK_HOST_OS				= getNDKHostOsName(ANDROID_NDK_PATH)
+ANDROID_NDK_TOOLCHAIN_VERSION	= "r10c" # Toolchain file is selected based on this
+
 # Native code build settings
-CMAKE_GENERATOR			= getCfg({
+CMAKE_GENERATOR			= selectByOS({
 		'win32':	getWin32Generator(),
-		'darwin':	"Unix Makefiles",
-		'linux':	"Unix Makefiles"
+		'other':	getUnixGenerator()
 	})
-BUILD_CMD				= getCfg({
-		'win32':	"cmake --build .",
-		'darwin':	"cmake --build . -- -j 4",
-		'linux':	"cmake --build . -- -j 4"
-	})
+EXTRA_BUILD_ARGS		= getExtraBuildArgs(CMAKE_GENERATOR)
 
 # SDK paths
-ANDROID_SDK_PATHS		= [
-	"C:/android/android-sdk-windows",
-	os.path.expanduser("~/android-sdk-mac_x86"),
-	os.path.expanduser("~/android-sdk-linux")
-	]
-ANDROID_BIN				= getCfg({
-		'win32':	selectBin(ANDROID_SDK_PATHS, "tools/android.bat"),
-		'other':	selectBin(ANDROID_SDK_PATHS, "tools/android"),
-	})
-ADB_BIN					= getCfg({
-		'win32':	selectBin(ANDROID_SDK_PATHS, "platform-tools/adb.exe"),
-		'other':	selectBin(ANDROID_SDK_PATHS, "platform-tools/adb"),
-	})
-ZIPALIGN_BIN			= getCfg({
-		'win32':	selectBin(ANDROID_SDK_PATHS, "tools/zipalign.exe"),
-		'other':	selectBin(ANDROID_SDK_PATHS, "tools/zipalign"),
-	})
-JARSIGNER_BIN			= "jarsigner"
+ANDROID_SDK_PATH		= selectFirstExistingDir([
+		os.path.expanduser("~/android-sdk-linux"),
+		os.path.expanduser("~/android-sdk-mac_x86"),
+		"C:/android/android-sdk-windows",
+	])
+ANDROID_BIN				= selectFirstExistingBinary([
+		os.path.join(ANDROID_SDK_PATH, "tools", "android"),
+		os.path.join(ANDROID_SDK_PATH, "tools", "android.bat"),
+		which('android'),
+	])
+ADB_BIN					= selectFirstExistingBinary([
+		which('adb'), # \note Prefer adb in path to avoid version issues on dev machines
+		os.path.join(ANDROID_SDK_PATH, "platform-tools", "adb"),
+		os.path.join(ANDROID_SDK_PATH, "platform-tools", "adb.exe"),
+	])
+ZIPALIGN_BIN			= selectFirstExistingBinary([
+		os.path.join(ANDROID_SDK_PATH, "tools", "zipalign"),
+		os.path.join(ANDROID_SDK_PATH, "tools", "zipalign.exe"),
+		which('zipalign'),
+	])
+JARSIGNER_BIN			= which('jarsigner')
 
 # Apache ant
-ANT_PATHS				= [
-	"C:/android/apache-ant-1.8.4",
-	"C:/android/apache-ant-1.9.2",
-	"C:/android/apache-ant-1.9.3",
-	"C:/android/apache-ant-1.9.4",
-	]
-ANT_BIN					= getCfg({
-		'win32':	selectBin(ANT_PATHS, "bin/ant.bat"),
-		'other':	selectBin(ANT_PATHS, "bin/ant")
-	})
+ANT_BIN					= selectFirstExistingBinary([
+		which('ant'),
+		"C:/android/apache-ant-1.8.4/bin/ant.bat",
+		"C:/android/apache-ant-1.9.2/bin/ant.bat",
+		"C:/android/apache-ant-1.9.3/bin/ant.bat",
+		"C:/android/apache-ant-1.9.4/bin/ant.bat",
+	])
diff --git a/android/scripts/debug.py b/android/scripts/debug.py
index 17d8017..7989e56 100644
--- a/android/scripts/debug.py
+++ b/android/scripts/debug.py
@@ -117,8 +117,8 @@
 			print("Pull library %s from device" % lib)
 			common.execute("%s pull %s" % (adbCmd, lib))
 
-		print("Copy libtestercore.so from build dir")
-		shutil.copyfile(os.path.join(buildDir, "libtestercore.so"), "libtestercore.so")
+		print("Copy %s from build dir" % common.NATIVE_LIB_NAME)
+		shutil.copyfile(os.path.join(buildDir, common.NATIVE_LIB_NAME), common.NATIVE_LIB_NAME)
 
 		# Forward local port for jdb
 		print("Forward local port to jdb port")
diff --git a/android/scripts/install.py b/android/scripts/install.py
index 8d2205f..2ef02cd 100644
--- a/android/scripts/install.py
+++ b/android/scripts/install.py
@@ -7,29 +7,55 @@
 
 import common
 
-def install (extraArgs = ""):
+def install (extraArgs = []):
 	curDir = os.getcwd()
 	try:
 		os.chdir(common.ANDROID_DIR)
 
-		adbCmd = common.shellquote(common.ADB_BIN)
-		if len(extraArgs) > 0:
-			adbCmd += " %s" % extraArgs
-
 		print "Removing old dEQP Package..."
-		common.execute("%s uninstall com.drawelements.deqp" % adbCmd)
+		common.execArgs([common.ADB_BIN] + extraArgs + [
+				'uninstall',
+				'com.drawelements.deqp'
+			])
 		print ""
 
 		print "Installing dEQP Package..."
-		common.execute("%s install -r package/bin/dEQP-debug.apk" % adbCmd)
+		common.execArgs([common.ADB_BIN] + extraArgs + [
+				'install',
+				'-r',
+				'package/bin/dEQP-debug.apk'
+			])
 		print ""
 
 	finally:
 		# Restore working dir
 		os.chdir(curDir)
-		
+
+def installToDevice (device):
+	print "Installing to %s (%s)..." % (device.serial, device.model)
+	install(['-s', device.serial])
+
+def installToAllDevices ():
+	devices = common.getDevices(common.ADB_BIN)
+	for device in devices:
+		installToDevice(device)
+
 if __name__ == "__main__":
 	if len(sys.argv) > 1:
-		install(string.join(sys.argv[1:], " "))
+		if sys.argv[1] == '-a':
+			installToAllDevices()
+		else:
+			install(sys.argv[1:])
 	else:
-		install()
+		devices = common.getDevices(common.ADB_BIN)
+		if len(devices) == 0:
+			common.die('No devices connected')
+		elif len(devices) == 1:
+			installToDevice(devices[0])
+		else:
+			print "More than one device connected:"
+			for i in range(0, len(devices)):
+				print "%3d: %16s %s" % ((i+1), devices[i].serial, devices[i].model)
+
+			deviceNdx = int(raw_input("Choose device (1-%d): " % len(devices)))
+			installToDevice(devices[deviceNdx-1])
diff --git a/data/gles2/shaders/keywords.test b/data/gles2/shaders/keywords.test
index d05fea3..16fc390 100644
--- a/data/gles2/shaders/keywords.test
+++ b/data/gles2/shaders/keywords.test
@@ -1558,57 +1558,6 @@
 end # reserved_keywords
 group invalid_identifiers "Usage of invalid identifiers."
 
-	case two_underscores_begin
-		expect compile_fail
-		values {}
-
-		both ""
-			precision mediump float;
-
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float __invalid = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
-	case two_underscores_middle
-		expect compile_fail
-		values {}
-
-		both ""
-			precision mediump float;
-
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float in__valid = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
-	case two_underscores_end
-		expect compile_fail
-		values {}
-
-		both ""
-			precision mediump float;
-
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float invalid__ = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
 	case gl_begin
 		expect compile_fail
 		values {}
diff --git a/data/gles2/shaders/preprocessor.test b/data/gles2/shaders/preprocessor.test
index 03f0193..593f37f 100644
--- a/data/gles2/shaders/preprocessor.test
+++ b/data/gles2/shaders/preprocessor.test
@@ -112,6 +112,21 @@
 		""
 	end
 
+	case identifier_with_double_underscore
+		values { output float out0 = 1.0; }
+		both ""
+			precision mediump float;
+			${DECLARATIONS}
+			# define __VALUE__	1
+
+			void main()
+			{
+				// __VALUE__ not used since it might be set by an "underlying software layer"
+				out0 = float(1.0);
+				${OUTPUT}
+			}
+		""
+	end
 end # basic
 
 group definitions "Symbol Definition Tests"
@@ -559,19 +574,6 @@
 
 group invalid_redefinitions "Invalid Redefinitions Tests"
 
-	case invalid_identifier_1
-		expect compile_fail
-		both ""
-			precision mediump float;
-			# define __VALUE__	1
-
-			void main()
-			{
-				${POSITION_FRAG_COLOR} = vec4(__VALUE__);
-			}
-		""
-	end
-
 	case invalid_identifier_2
 		expect compile_fail
 		both ""
diff --git a/data/gles3/shaders/keywords.test b/data/gles3/shaders/keywords.test
index 3de68ae..b588cd7 100644
--- a/data/gles3/shaders/keywords.test
+++ b/data/gles3/shaders/keywords.test
@@ -3143,60 +3143,6 @@
 end # reserved_keywords
 group invalid_identifiers "Usage of invalid identifiers."
 
-	case two_underscores_begin
-		expect compile_fail
-		values {}
-		version 300 es
-
-		both ""
-			#version 300 es
-			precision mediump float;
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float __invalid = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
-	case two_underscores_middle
-		expect compile_fail
-		values {}
-		version 300 es
-
-		both ""
-			#version 300 es
-			precision mediump float;
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float in__valid = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
-	case two_underscores_end
-		expect compile_fail
-		values {}
-		version 300 es
-
-		both ""
-			#version 300 es
-			precision mediump float;
-			${DECLARATIONS}
-
-			void main()
-			{
-				${SETUP}
-				float invalid__ = 1.0;
-				${OUTPUT}
-			}
-		""
-	end
 	case gl_begin
 		expect compile_fail
 		values {}
diff --git a/data/gles3/shaders/preprocessor.test b/data/gles3/shaders/preprocessor.test
index ba82610..bee7011 100644
--- a/data/gles3/shaders/preprocessor.test
+++ b/data/gles3/shaders/preprocessor.test
@@ -134,6 +134,23 @@
 		""
 	end
 
+	case identifier_with_double_underscore
+		values { output float out0 = 1.0; }
+		version 300 es
+		both ""
+			#version 300 es
+			precision mediump float;
+			${DECLARATIONS}
+			# define __VALUE__	1
+
+			void main()
+			{
+				// __VALUE__ not used since it might be set by an "underlying software layer"
+				out0 = float(1.0);
+				${OUTPUT}
+			}
+		""
+	end
 end # basic
 
 group definitions "Symbol Definition Tests"
@@ -646,22 +663,6 @@
 
 group invalid_redefinitions "Invalid Redefinitions Tests"
 
-	case invalid_identifier_1
-		version 300 es
-		expect compile_fail
-		both ""
-			#version 300 es
-			precision mediump float;
-			${DECLARATIONS}
-			# define __VALUE__	1
-
-			void main()
-			{
-				${POSITION_FRAG_COLOR} = vec4(__VALUE__);
-			}
-		""
-	end
-
 	case invalid_identifier_2
 		version 300 es
 		expect compile_fail
diff --git a/doc/testspecs/GLES31/functional.blend_equation_advanced.txt b/doc/testspecs/GLES31/functional.blend_equation_advanced.txt
index 72d06ff..cc7822d 100644
--- a/doc/testspecs/GLES31/functional.blend_equation_advanced.txt
+++ b/doc/testspecs/GLES31/functional.blend_equation_advanced.txt
@@ -32,6 +32,7 @@
 Excludes (will be added later):
  + Use of blend_support_all qualifier
  + Interaction with other per-fragment operations
+ + Non-premultiplied / invalid color inputs
  + Negative tests
 
 Description:
diff --git a/executor/tools/xeCommandLineExecutor.cpp b/executor/tools/xeCommandLineExecutor.cpp
index 28caa56..de8f082 100644
--- a/executor/tools/xeCommandLineExecutor.cpp
+++ b/executor/tools/xeCommandLineExecutor.cpp
@@ -81,19 +81,19 @@
 		{ "no",		false	}
 	};
 
-	parser << Option<StartServer>	("s",		"start-server",	"Start local execserver")
-		   << Option<Host>			("c",		"connect",		"Connect to host",							"127.0.0.1")
-		   << Option<Port>			("p",		"port",			"Select TCP port to use",					"50016")
-		   << Option<CaseListDir>	("cd",		"caselistdir",	"Path to test case XML files",				".")
-		   << Option<TestSet>		("t",		"testset",		"Test set",									parseCommaSeparatedList)
-		   << Option<ExcludeSet>	("e",		"exclude",		"Comma-separated list of exclude filters",	parseCommaSeparatedList)
+	parser << Option<StartServer>	("s",		"start-server",	"Start local execserver",								"")
+		   << Option<Host>			("c",		"connect",		"Connect to host",										"127.0.0.1")
+		   << Option<Port>			("p",		"port",			"Select TCP port to use",								"50016")
+		   << Option<CaseListDir>	("cd",		"caselistdir",	"Path to test case XML files",							".")
+		   << Option<TestSet>		("t",		"testset",		"Test set",												parseCommaSeparatedList,	"")
+		   << Option<ExcludeSet>	("e",		"exclude",		"Comma-separated list of exclude filters",				parseCommaSeparatedList,	"")
 		   << Option<ContinueFile>	(DE_NULL,	"continue",		"Continue execution by initializing results from existing test log")
-		   << Option<TestLogFile>	("o",		"out",			"Output test log filename")
-		   << Option<InfoLogFile>	("i",		"info",			"Output info log filename")
-		   << Option<Summary>		(DE_NULL,	"summary",		"Print summary at the end",					s_yesNo,	"yes")
-		   << Option<BinaryName>	("b",		"binaryname",	"Test binary path, relative to working directory")
-		   << Option<WorkingDir>	("wd",		"workdir",		"Working directory for test execution")
-		   << Option<CmdLineArgs>	(DE_NULL,	"cmdline",		"Additional command line arguments for test binary");
+		   << Option<TestLogFile>	("o",		"out",			"Output test log filename",								"")
+		   << Option<InfoLogFile>	("i",		"info",			"Output info log filename",								"")
+		   << Option<Summary>		(DE_NULL,	"summary",		"Print summary at the end",								s_yesNo,	"yes")
+		   << Option<BinaryName>	("b",		"binaryname",	"Test binary path, relative to working directory",		"")
+		   << Option<WorkingDir>	("wd",		"workdir",		"Working directory for test execution",					"")
+		   << Option<CmdLineArgs>	(DE_NULL,	"cmdline",		"Additional command line arguments for test binary",	"");
 }
 
 } // opt
diff --git a/external/fetch_sources.py b/external/fetch_sources.py
new file mode 100644
index 0000000..a957a3f
--- /dev/null
+++ b/external/fetch_sources.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+
+import os
+import sys
+import shutil
+import tarfile
+import urllib2
+import hashlib
+import argparse
+
+EXTERNAL_DIR	= os.path.realpath(os.path.normpath(os.path.dirname(__file__)))
+
+class SourcePackage:
+	def __init__(self, url, filename, checksum, dstDir, postExtract=None):
+		self.url			= url
+		self.filename		= filename
+		self.checksum		= checksum
+		self.dstDir			= dstDir
+		self.postExtract	= postExtract
+
+def computeChecksum (data):
+	return hashlib.sha256(data).hexdigest()
+
+def clean (pkg):
+	srcPath = os.path.join(EXTERNAL_DIR, pkg.dstDir)
+
+	for entry in os.listdir(srcPath):
+		if entry == "CMakeLists.txt":
+			continue
+
+		fullPath = os.path.join(srcPath, entry)
+
+		if os.path.isfile(fullPath):
+			os.unlink(fullPath)
+		elif os.path.isdir(fullPath):
+			shutil.rmtree(fullPath, ignore_errors=False)
+
+def fetch (pkg):
+	print "Fetching %s" % pkg.url
+
+	req			= urllib2.urlopen(pkg.url)
+	data		= req.read()
+	checksum	= computeChecksum(data)
+	dstPath		= os.path.join(EXTERNAL_DIR, pkg.filename)
+
+	if checksum != pkg.checksum:
+		raise Exception("Checksum mismatch for %s, exepected %s, got %s" % (pkg.filename, pkg.checksum, checksum))
+
+	out = open(dstPath, 'wb')
+	out.write(data)
+	out.close()
+
+def extract (pkg):
+	print "Extracting %s to %s" % (pkg.filename, pkg.dstDir)
+
+	srcPath	= os.path.join(EXTERNAL_DIR, pkg.filename)
+	tmpPath	= os.path.join(EXTERNAL_DIR, ".extract-tmp-%s" % pkg.dstDir)
+	dstPath	= os.path.join(EXTERNAL_DIR, pkg.dstDir)
+	archive	= tarfile.open(srcPath)
+
+	if os.path.exists(tmpPath):
+		shutil.rmtree(tmpPath, ignore_errors=False)
+
+	os.mkdir(tmpPath)
+
+	archive.extractall(tmpPath)
+	archive.close()
+
+	extractedEntries = os.listdir(tmpPath)
+	if len(extractedEntries) != 1 or not os.path.isdir(os.path.join(tmpPath, extractedEntries[0])):
+		raise Exception("%s doesn't contain single top-level directory") % pkg.filename
+
+	topLevelPath = os.path.join(tmpPath, extractedEntries[0])
+
+	for entry in os.listdir(topLevelPath):
+		if os.path.exists(os.path.join(dstPath, entry)):
+			print "  skipping %s" % entry
+			continue
+
+		shutil.move(os.path.join(topLevelPath, entry), dstPath)
+
+	shutil.rmtree(tmpPath, ignore_errors=True)
+
+	if pkg.postExtract != None:
+		pkg.postExtract(dstPath)
+
+def postExtractLibpng (path):
+	shutil.copy(os.path.join(path, "scripts", "pnglibconf.h.prebuilt"),
+				os.path.join(path, "pnglibconf.h"))
+
+PACKAGES = [
+	SourcePackage("http://zlib.net/zlib-1.2.8.tar.gz",
+				  "zlib-1.2.8.tar.gz",
+				  "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d",
+				  "zlib"),
+	SourcePackage("http://www.imagemagick.org/download/delegates/libpng-1.6.14.tar.gz",
+				  "libpng-1.6.14.tar.gz",
+				  "e6cab38f051bfc66929e766c1e67eba6fafac9e0f463ee3bbeb4ac16f173fe8e",
+				  "libpng",
+				  postExtract = postExtractLibpng),
+]
+
+def parseArgs ():
+	parser = argparse.ArgumentParser(description = "Fetch external sources")
+	parser.add_argument('--clean-only', dest='cleanOnly', action='store_true', default=False,
+						help='Clean only, do not fetch/extract')
+	parser.add_argument('--keep-archive', dest='keepArchive', action='store_true', default=False,
+						help='Keep archive after extracting')
+	return parser.parse_args()
+
+if __name__ == "__main__":
+	args = parseArgs()
+
+	for pkg in PACKAGES:
+		clean(pkg)
+
+		if args.cleanOnly:
+			continue
+
+		fetch(pkg)
+		extract(pkg)
+
+		if not args.keepArchive:
+			os.unlink(os.path.join(EXTERNAL_DIR, pkg.filename))
diff --git a/external/libpng/CMakeLists.txt b/external/libpng/CMakeLists.txt
index f3d6c65..838f892 100644
--- a/external/libpng/CMakeLists.txt
+++ b/external/libpng/CMakeLists.txt
@@ -4,35 +4,48 @@
 	message(FATAL_ERROR "Include Defs.cmake")
 endif ()
 
-set(PNG_SRC_PATH "../../../libpng" CACHE STRING "Path to libpng source tree")
+if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/png.h")
+	set(DEFAULT_PNG_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR})
+else ()
+	# Assume build inside Android source tree
+	set(DEFAULT_PNG_SRC_PATH "../libpng")
+endif ()
+
+set(PNG_SRC_PATH ${DEFAULT_PNG_SRC_PATH} CACHE STRING "Path to libpng source tree")
+
+if (IS_ABSOLUTE ${PNG_SRC_PATH})
+	set(PNG_ABS_PATH ${PNG_SRC_PATH})
+else ()
+	set(PNG_ABS_PATH "${CMAKE_SOURCE_DIR}/${PNG_SRC_PATH}")
+endif ()
 
 set(PNG_SRCS
-	${PNG_SRC_PATH}/png.h
-	${PNG_SRC_PATH}/pngconf.h
-	${PNG_SRC_PATH}/png.c
-	${PNG_SRC_PATH}/pngset.c
-	${PNG_SRC_PATH}/pngget.c
-	${PNG_SRC_PATH}/pngrutil.c
-	${PNG_SRC_PATH}/pngtrans.c
-	${PNG_SRC_PATH}/pngwutil.c
-	${PNG_SRC_PATH}/pngread.c
-	${PNG_SRC_PATH}/pngrio.c
-	${PNG_SRC_PATH}/pngwio.c
-	${PNG_SRC_PATH}/pngwrite.c
-	${PNG_SRC_PATH}/pngrtran.c
-	${PNG_SRC_PATH}/pngwtran.c
-	${PNG_SRC_PATH}/pngmem.c
-	${PNG_SRC_PATH}/pngerror.c
-	${PNG_SRC_PATH}/pngpread.c
+	${PNG_ABS_PATH}/png.h
+	${PNG_ABS_PATH}/pngconf.h
+	${PNG_ABS_PATH}/png.c
+	${PNG_ABS_PATH}/pngset.c
+	${PNG_ABS_PATH}/pngget.c
+	${PNG_ABS_PATH}/pngrutil.c
+	${PNG_ABS_PATH}/pngtrans.c
+	${PNG_ABS_PATH}/pngwutil.c
+	${PNG_ABS_PATH}/pngread.c
+	${PNG_ABS_PATH}/pngrio.c
+	${PNG_ABS_PATH}/pngwio.c
+	${PNG_ABS_PATH}/pngwrite.c
+	${PNG_ABS_PATH}/pngrtran.c
+	${PNG_ABS_PATH}/pngwtran.c
+	${PNG_ABS_PATH}/pngmem.c
+	${PNG_ABS_PATH}/pngerror.c
+	${PNG_ABS_PATH}/pngpread.c
 	)
 
 if (DE_CPU_IS_ARM_64)
 	# armv8-a has always neon
 	set(PNG_SRCS
 		${PNG_SRCS}
-		${PNG_SRC_PATH}/arm/arm_init.c
-		${PNG_SRC_PATH}/arm/filter_neon_intrinsics.c
-		${PNG_SRC_PATH}/arm/filter_neon.S
+		${PNG_ABS_PATH}/arm/arm_init.c
+		${PNG_ABS_PATH}/arm/filter_neon_intrinsics.c
+		${PNG_ABS_PATH}/arm/filter_neon.S
 		)
 endif ()
 
@@ -50,10 +63,5 @@
 add_library(png STATIC ${PNG_SRCS})
 target_link_libraries(png ${ZLIB_LIBRARY})
 
-if (IS_ABSOLUTE ${PNG_SRC_PATH})
-	set(PNG_INCLUDE_PATH ${PNG_SRC_PATH} PARENT_SCOPE)
-else ()
-	set(PNG_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${PNG_SRC_PATH}" PARENT_SCOPE)
-endif ()
-
-set(PNG_LIBRARY png PARENT_SCOPE)
+set(PNG_INCLUDE_PATH	${PNG_ABS_PATH}	PARENT_SCOPE)
+set(PNG_LIBRARY			png				PARENT_SCOPE)
diff --git a/external/zlib/CMakeLists.txt b/external/zlib/CMakeLists.txt
index f5d41b8..53c257a 100644
--- a/external/zlib/CMakeLists.txt
+++ b/external/zlib/CMakeLists.txt
@@ -4,35 +4,48 @@
 	message(FATAL_ERROR "Include Defs.cmake")
 endif ()
 
-set(ZLIB_SRC_PATH "../../../zlib/src" CACHE STRING "Path to zlib source tree")
+if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/zlib.h")
+	set(DEFAULT_ZLIB_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR})
+else ()
+	# Assume build inside Android source tree
+	set(DEFAULT_ZLIB_SRC_PATH "../zlib/src")
+endif ()
+
+set(ZLIB_SRC_PATH ${DEFAULT_ZLIB_SRC_PATH} CACHE STRING "Path to zlib source tree")
+
+if (IS_ABSOLUTE ${ZLIB_SRC_PATH})
+	set(ZLIB_ABS_PATH ${ZLIB_SRC_PATH})
+else ()
+	set(ZLIB_ABS_PATH "${CMAKE_SOURCE_DIR}/${ZLIB_SRC_PATH}")
+endif ()
 
 set(ZLIB_SRCS
-	${ZLIB_SRC_PATH}/adler32.c
-	${ZLIB_SRC_PATH}/compress.c
-	${ZLIB_SRC_PATH}/crc32.c
-	${ZLIB_SRC_PATH}/crc32.h
-	${ZLIB_SRC_PATH}/deflate.c
-	${ZLIB_SRC_PATH}/deflate.h
-	${ZLIB_SRC_PATH}/gzclose.c
-	${ZLIB_SRC_PATH}/gzguts.h
-	${ZLIB_SRC_PATH}/gzlib.c
-	${ZLIB_SRC_PATH}/gzread.c
-	${ZLIB_SRC_PATH}/gzwrite.c
-	${ZLIB_SRC_PATH}/infback.c
-	${ZLIB_SRC_PATH}/inffast.c
-	${ZLIB_SRC_PATH}/inffast.h
-	${ZLIB_SRC_PATH}/inffixed.h
-	${ZLIB_SRC_PATH}/inflate.c
-	${ZLIB_SRC_PATH}/inflate.h
-	${ZLIB_SRC_PATH}/inftrees.c
-	${ZLIB_SRC_PATH}/inftrees.h
-	${ZLIB_SRC_PATH}/trees.c
-	${ZLIB_SRC_PATH}/trees.h
-	${ZLIB_SRC_PATH}/uncompr.c
-	${ZLIB_SRC_PATH}/zconf.h
-	${ZLIB_SRC_PATH}/zlib.h
-	${ZLIB_SRC_PATH}/zutil.c
-	${ZLIB_SRC_PATH}/zutil.h
+	${ZLIB_ABS_PATH}/adler32.c
+	${ZLIB_ABS_PATH}/compress.c
+	${ZLIB_ABS_PATH}/crc32.c
+	${ZLIB_ABS_PATH}/crc32.h
+	${ZLIB_ABS_PATH}/deflate.c
+	${ZLIB_ABS_PATH}/deflate.h
+	${ZLIB_ABS_PATH}/gzclose.c
+	${ZLIB_ABS_PATH}/gzguts.h
+	${ZLIB_ABS_PATH}/gzlib.c
+	${ZLIB_ABS_PATH}/gzread.c
+	${ZLIB_ABS_PATH}/gzwrite.c
+	${ZLIB_ABS_PATH}/infback.c
+	${ZLIB_ABS_PATH}/inffast.c
+	${ZLIB_ABS_PATH}/inffast.h
+	${ZLIB_ABS_PATH}/inffixed.h
+	${ZLIB_ABS_PATH}/inflate.c
+	${ZLIB_ABS_PATH}/inflate.h
+	${ZLIB_ABS_PATH}/inftrees.c
+	${ZLIB_ABS_PATH}/inftrees.h
+	${ZLIB_ABS_PATH}/trees.c
+	${ZLIB_ABS_PATH}/trees.h
+	${ZLIB_ABS_PATH}/uncompr.c
+	${ZLIB_ABS_PATH}/zconf.h
+	${ZLIB_ABS_PATH}/zlib.h
+	${ZLIB_ABS_PATH}/zutil.c
+	${ZLIB_ABS_PATH}/zutil.h
 	)
 
 if (DE_COMPILER_IS_MSC)
@@ -41,6 +54,10 @@
 	# 4242, 4244: conversion from 'x' to 'y', possible loss of data
 	# 4996: deprecated POSIX name
 	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall /wd4127 /wd4131 /wd4242 /wd4244 /wd4996")
+
+elseif (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG)
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration")
+
 endif ()
 
 if (DE_OS_IS_UNIX)
@@ -49,10 +66,5 @@
 
 add_library(z STATIC ${ZLIB_SRCS})
 
-if (IS_ABSOLUTE ${ZLIB_SRC_PATH})
-	set(ZLIB_INCLUDE_PATH ${ZLIB_SRC_PATH} PARENT_SCOPE)
-else ()
-	set(ZLIB_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${ZLIB_SRC_PATH}" PARENT_SCOPE)
-endif ()
-
-set(ZLIB_LIBRARY z PARENT_SCOPE)
+set(ZLIB_INCLUDE_PATH	${ZLIB_ABS_PATH}	PARENT_SCOPE)
+set(ZLIB_LIBRARY		z					PARENT_SCOPE)
diff --git a/framework/common/tcuApp.cpp b/framework/common/tcuApp.cpp
index eebeab0..a0d733b 100644
--- a/framework/common/tcuApp.cpp
+++ b/framework/common/tcuApp.cpp
@@ -66,9 +66,6 @@
 	print("dEQP Core %s (0x%08x) starting..\n", qpGetReleaseName(), qpGetReleaseId());
 	print("  target implementation = '%s'\n", qpGetTargetName());
 
-	if (!qpIsLicenseValid())
-		qpPrintf("WARNING: License has expired!\n");
-
 	if (!deSetRoundingMode(DE_ROUNDINGMODE_TO_NEAREST))
 		qpPrintf("WARNING: Failed to set floating-point rounding mode!\n");
 
diff --git a/framework/common/tcuBilinearImageCompare.cpp b/framework/common/tcuBilinearImageCompare.cpp
index 26e896b..9b53ff9 100644
--- a/framework/common/tcuBilinearImageCompare.cpp
+++ b/framework/common/tcuBilinearImageCompare.cpp
@@ -37,7 +37,8 @@
 	NUM_SUBPIXEL_BITS	= 8	//!< Number of subpixel bits used when doing bilinear interpolation.
 };
 
-// \todo [2013-03-26 pyry] Big-endian architectures?
+// \note Algorithm assumes that colors are packed to 32-bit values as dictated by
+//		 tcu::RGBA::*_SHIFT values.
 
 template<int Channel>
 static inline deUint8 getChannel (deUint32 color)
@@ -45,10 +46,17 @@
 	return (deUint8)((color >> (Channel*8)) & 0xff);
 }
 
+#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
 inline deUint32 readRGBA8Raw (const ConstPixelBufferAccess& src, deUint32 x, deUint32 y)
 {
 	return *(const deUint32*)((const deUint8*)src.getDataPtr() + y*src.getRowPitch() + x*4);
 }
+#else
+inline deUint32 readRGBA8Raw (const ConstPixelBufferAccess& src, deUint32 x, deUint32 y)
+{
+	return deReverseBytes32(*(const deUint32*)((const deUint8*)src.getDataPtr() + y*src.getRowPitch() + x*4));
+}
+#endif
 
 inline RGBA readRGBA8 (const ConstPixelBufferAccess& src, deUint32 x, deUint32 y)
 {
diff --git a/framework/common/tcuCommandLine.cpp b/framework/common/tcuCommandLine.cpp
index 72d4402..6cb8295 100644
--- a/framework/common/tcuCommandLine.cpp
+++ b/framework/common/tcuCommandLine.cpp
@@ -23,6 +23,7 @@
 
 #include "tcuCommandLine.hpp"
 #include "tcuPlatform.hpp"
+#include "tcuTestCase.hpp"
 #include "deFilePath.hpp"
 #include "deStringUtil.hpp"
 #include "deString.h"
@@ -138,22 +139,22 @@
 		<< Option<StdinCaseList>		(DE_NULL,	"deqp-stdin-caselist",			"Read case list (in trie format) from stdin")
 		<< Option<LogFilename>			(DE_NULL,	"deqp-log-filename",			"Write test results to given file",					"TestResults.qpa")
 		<< Option<RunMode>				(DE_NULL,	"deqp-runmode",					"Execute tests, or write list of test cases into a file",
-																					s_runModes, "execute")
+																																		s_runModes,			"execute")
 		<< Option<WatchDog>				(DE_NULL,	"deqp-watchdog",				"Enable test watchdog",								s_enableNames,		"disable")
 		<< Option<CrashHandler>			(DE_NULL,	"deqp-crashhandler",			"Enable crash handling",							s_enableNames,		"disable")
-		<< Option<BaseSeed>				(DE_NULL,	"deqp-base-seed",				"Base seed for test cases that use randomization")
-		<< Option<TestIterationCount>	(DE_NULL,	"deqp-test-iteration-count",	"Iteration count for cases that support variable number of iterations")
+		<< Option<BaseSeed>				(DE_NULL,	"deqp-base-seed",				"Base seed for test cases that use randomization",						"0")
+		<< Option<TestIterationCount>	(DE_NULL,	"deqp-test-iteration-count",	"Iteration count for cases that support variable number of iterations",	"0")
 		<< Option<Visibility>			(DE_NULL,	"deqp-visibility",				"Default test window visibility",					s_visibilites,		"windowed")
-		<< Option<SurfaceWidth>			(DE_NULL,	"deqp-surface-width",			"Use given surface width if possible",	"-1")
-		<< Option<SurfaceHeight>		(DE_NULL,	"deqp-surface-height",			"Use given surface height if possible",	"-1")
+		<< Option<SurfaceWidth>			(DE_NULL,	"deqp-surface-width",			"Use given surface width if possible",									"-1")
+		<< Option<SurfaceHeight>		(DE_NULL,	"deqp-surface-height",			"Use given surface height if possible",									"-1")
 		<< Option<SurfaceType>			(DE_NULL,	"deqp-surface-type",			"Use given surface type",							s_surfaceTypes,		"window")
 		<< Option<ScreenRotation>		(DE_NULL,	"deqp-screen-rotation",			"Screen rotation for platforms that support it",	s_screenRotations,	"0")
 		<< Option<GLContextType>		(DE_NULL,	"deqp-gl-context-type",			"OpenGL context type for platforms that support multiple")
-		<< Option<GLConfigID>			(DE_NULL,	"deqp-gl-config-id",			"OpenGL (ES) render config ID (EGL config id on EGL platforms)",	"-1")
+		<< Option<GLConfigID>			(DE_NULL,	"deqp-gl-config-id",			"OpenGL (ES) render config ID (EGL config id on EGL platforms)",		"-1")
 		<< Option<GLConfigName>			(DE_NULL,	"deqp-gl-config-name",			"Symbolic OpenGL (ES) render config name")
 		<< Option<GLContextFlags>		(DE_NULL,	"deqp-gl-context-flags",		"OpenGL context flags (comma-separated, supports debug and robust)")
-		<< Option<CLPlatformID>			(DE_NULL,	"deqp-cl-platform-id",			"Execute tests on given OpenCL platform (IDs start from 1)",		"1")
-		<< Option<CLDeviceIDs>			(DE_NULL,	"deqp-cl-device-ids",			"Execute tests on given CL devices (comma-separated, IDs start from 1)",	parseIntList)
+		<< Option<CLPlatformID>			(DE_NULL,	"deqp-cl-platform-id",			"Execute tests on given OpenCL platform (IDs start from 1)",			"1")
+		<< Option<CLDeviceIDs>			(DE_NULL,	"deqp-cl-device-ids",			"Execute tests on given CL devices (comma-separated, IDs start from 1)",	parseIntList,	"")
 		<< Option<CLBuildOptions>		(DE_NULL,	"deqp-cl-build-options",		"Extra build options for OpenCL compiler")
 		<< Option<EGLDisplayType>		(DE_NULL,	"deqp-egl-display-type",		"EGL native display type")
 		<< Option<EGLWindowType>		(DE_NULL,	"deqp-egl-window-type",			"EGL native window type")
@@ -237,15 +238,24 @@
 										CaseTreeNode		(const std::string& name) : m_name(name) {}
 										~CaseTreeNode		(void);
 
-	void								addChild			(CaseTreeNode* child) { m_children.push_back(child); }
+	const std::string&					getName				(void) const { return m_name;				}
+	bool								hasChildren			(void) const { return !m_children.empty();	}
 
-	const std::string&					getName				(void) const { return m_name;		}
-	const std::vector<CaseTreeNode*>&	getChildren			(void) const { return m_children;	}
+	bool								hasChild			(const std::string& name) const;
+	const CaseTreeNode*					getChild			(const std::string& name) const;
+	CaseTreeNode*						getChild			(const std::string& name);
+
+	void								addChild			(CaseTreeNode* child) { m_children.push_back(child); }
 
 private:
 										CaseTreeNode		(const CaseTreeNode&);
 	CaseTreeNode&						operator=			(const CaseTreeNode&);
 
+	enum { NOT_FOUND = -1 };
+
+	// \todo [2014-10-30 pyry] Speed up with hash / sorting
+	int									findChildNdx		(const std::string& name) const;
+
 	std::string							m_name;
 	std::vector<CaseTreeNode*>			m_children;
 };
@@ -256,64 +266,251 @@
 		delete *i;
 }
 
-static CaseTreeNode* parseCaseTree (std::istream& in)
+int CaseTreeNode::findChildNdx (const std::string& name) const
+{
+	for (int ndx = 0; ndx < (int)m_children.size(); ++ndx)
+	{
+		if (m_children[ndx]->getName() == name)
+			return ndx;
+	}
+	return NOT_FOUND;
+}
+
+inline bool CaseTreeNode::hasChild (const std::string& name) const
+{
+	return findChildNdx(name) != NOT_FOUND;
+}
+
+inline const CaseTreeNode* CaseTreeNode::getChild (const std::string& name) const
+{
+	const int ndx = findChildNdx(name);
+	return ndx == NOT_FOUND ? DE_NULL : m_children[ndx];
+}
+
+inline CaseTreeNode* CaseTreeNode::getChild (const std::string& name)
+{
+	const int ndx = findChildNdx(name);
+	return ndx == NOT_FOUND ? DE_NULL : m_children[ndx];
+}
+
+static int getCurrentComponentLen (const char* path)
+{
+	int ndx = 0;
+	for (; path[ndx] != 0 && path[ndx] != '.'; ++ndx);
+	return ndx;
+}
+
+static const CaseTreeNode* findNode (const CaseTreeNode* root, const char* path)
+{
+	const CaseTreeNode*	curNode		= root;
+	const char*			curPath		= path;
+	int					curLen		= getCurrentComponentLen(curPath);
+
+	for (;;)
+	{
+		curNode = curNode->getChild(std::string(curPath, curPath+curLen));
+
+		if (!curNode)
+			break;
+
+		curPath	+= curLen;
+
+		if (curPath[0] == 0)
+			break;
+		else
+		{
+			DE_ASSERT(curPath[0] == '.');
+			curPath		+= 1;
+			curLen		 = getCurrentComponentLen(curPath);
+		}
+	}
+
+	return curNode;
+}
+
+static void parseCaseTrie (CaseTreeNode* root, std::istream& in)
 {
 	vector<CaseTreeNode*>	nodeStack;
 	string					curName;
+	bool					expectNode		= true;
 
 	if (in.get() != '{')
-		throw std::invalid_argument("Malformed case tree");
+		throw std::invalid_argument("Malformed case trie");
 
-	nodeStack.reserve(1);
-	nodeStack.push_back(new CaseTreeNode(""));
+	nodeStack.push_back(root);
 
-	try
+	while (!nodeStack.empty())
 	{
-		for (;;)
+		const int	curChr	= in.get();
+
+		if (curChr == std::char_traits<char>::eof() || curChr == 0)
+			throw std::invalid_argument("Unterminated case tree");
+
+		if (curChr == '{' || curChr == ',' || curChr == '}')
 		{
-			const int	curChr	= in.get();
-
-			if (curChr == std::char_traits<char>::eof() || curChr == 0)
-				break;
-
-			if (nodeStack.empty())
-				throw std::invalid_argument("Trailing characters at end of case tree");
-
-			if (!curName.empty() && (curChr == '{' || curChr == ',' || curChr == '}'))
+			if (!curName.empty() && expectNode)
 			{
-				// Create child and push to stack.
-				nodeStack.reserve(nodeStack.size()+1);
-				nodeStack.push_back(new CaseTreeNode(curName));
+				CaseTreeNode* const newChild = new CaseTreeNode(curName);
+
+				try
+				{
+					nodeStack.back()->addChild(newChild);
+				}
+				catch (...)
+				{
+					delete newChild;
+					throw;
+				}
+
+				if (curChr == '{')
+					nodeStack.push_back(newChild);
 
 				curName.clear();
 			}
+			else if (curName.empty() == expectNode)
+				throw std::invalid_argument(expectNode ? "Empty node name" : "Missing node separator");
 
-			if (curChr == ',' || curChr == '}')
+			if (curChr == '}')
 			{
-				// Attach to parent
-				if (nodeStack.size() < 2)
-					throw std::invalid_argument("Malformed case tree");
-
-				(*(nodeStack.end()-2))->addChild(nodeStack.back());
+				expectNode = false;
 				nodeStack.pop_back();
+
+				// consume trailing new line
+				if (nodeStack.empty())
+				{
+					if (in.peek() == '\r')
+					  in.get();
+					if (in.peek() == '\n')
+					  in.get();
+				}
 			}
-			else if (curChr != '{')
-				curName += (char)curChr;
+			else
+				expectNode = true;
+		}
+		else if (isValidTestCaseNameChar((char)curChr))
+			curName += (char)curChr;
+		else
+			throw std::invalid_argument("Illegal character in node name");
+	}
+}
+
+static void parseCaseList (CaseTreeNode* root, std::istream& in)
+{
+	// \note Algorithm assumes that cases are sorted by groups, but will
+	//		 function fine, albeit more slowly, if that is not the case.
+	vector<CaseTreeNode*>	nodeStack;
+	int						stackPos	= 0;
+	string					curName;
+
+	nodeStack.resize(8, DE_NULL);
+
+	nodeStack[0] = root;
+
+	for (;;)
+	{
+		const int	curChr	= in.get();
+
+		if (curChr == std::char_traits<char>::eof() || curChr == 0 || curChr == '\n' || curChr == '\r')
+		{
+			if (curName.empty())
+				throw std::invalid_argument("Empty test case name");
+
+			if (nodeStack[stackPos]->hasChild(curName))
+				throw std::invalid_argument("Duplicate test case");
+
+			CaseTreeNode* const newChild = new CaseTreeNode(curName);
+
+			try
+			{
+				nodeStack[stackPos]->addChild(newChild);
+			}
+			catch (...)
+			{
+				delete newChild;
+				throw;
+			}
+
+			curName.clear();
+			stackPos = 0;
+
+			if (curChr == '\r' && in.peek() == '\n')
+				in.get();
+
+			{
+				const int nextChr = in.peek();
+
+				if (nextChr == std::char_traits<char>::eof() || nextChr == 0)
+					break;
+			}
+		}
+		else if (curChr == '.')
+		{
+			if (curName.empty())
+				throw std::invalid_argument("Empty test group name");
+
+			if ((int)nodeStack.size() <= stackPos+1)
+				nodeStack.resize(nodeStack.size()*2, DE_NULL);
+
+			if (!nodeStack[stackPos+1] || nodeStack[stackPos+1]->getName() != curName)
+			{
+				CaseTreeNode* curGroup = nodeStack[stackPos]->getChild(curName);
+
+				if (!curGroup)
+				{
+					curGroup = new CaseTreeNode(curName);
+
+					try
+					{
+						nodeStack[stackPos]->addChild(curGroup);
+					}
+					catch (...)
+					{
+						delete curGroup;
+						throw;
+					}
+				}
+
+				nodeStack[stackPos+1] = curGroup;
+
+				if ((int)nodeStack.size() > stackPos+2)
+					nodeStack[stackPos+2] = DE_NULL; // Invalidate rest of entries
+			}
+
+			DE_ASSERT(nodeStack[stackPos+1]->getName() == curName);
+
+			curName.clear();
+			stackPos += 1;
+		}
+		else if (isValidTestCaseNameChar((char)curChr))
+			curName += (char)curChr;
+		else
+			throw std::invalid_argument("Illegal character in test case name");
+	}
+}
+
+static CaseTreeNode* parseCaseList (std::istream& in)
+{
+	CaseTreeNode* const root = new CaseTreeNode("");
+	try
+	{
+		if (in.peek() == '{')
+			parseCaseTrie(root, in);
+		else
+			parseCaseList(root, in);
+
+		{
+			const int curChr = in.get();
+			if (curChr != std::char_traits<char>::eof() && curChr != 0)
+				throw std::invalid_argument("Trailing characters at end of case list");
 		}
 
-		if (nodeStack.size() != 1 || nodeStack[0]->getName() != "")
-			throw std::invalid_argument("Unterminated case tree");
+		return root;
 	}
 	catch (...)
 	{
-		// Nodes in stack are not attached to any parents and must be deleted individually.
-		for (vector<CaseTreeNode*>::const_iterator i = nodeStack.begin(); i != nodeStack.end(); ++i)
-			delete *i;
-
+		delete root;
 		throw;
 	}
-
-	return nodeStack[0];
 }
 
 class CasePaths
@@ -506,9 +703,9 @@
 	if (!m_cmdLine.getOption<opt::LogImages>())
 		m_logFlags |= QP_TEST_LOG_EXCLUDE_IMAGES;
 
-	if ((m_cmdLine.getOption<opt::CasePath>().empty()?0:1) +
-		(m_cmdLine.getOption<opt::CaseList>().empty()?0:1) +
-		(m_cmdLine.getOption<opt::CaseListFile>().empty()?0:1) +
+	if ((m_cmdLine.hasOption<opt::CasePath>()?1:0) +
+		(m_cmdLine.hasOption<opt::CaseList>()?1:0) +
+		(m_cmdLine.hasOption<opt::CaseListFile>()?1:0) +
 		(m_cmdLine.getOption<opt::StdinCaseList>()?1:0) > 1)
 	{
 		debugOut << "ERROR: multiple test case list options given!\n" << std::endl;
@@ -518,26 +715,26 @@
 
 	try
 	{
-		if (!m_cmdLine.getOption<opt::CaseList>().empty())
+		if (m_cmdLine.hasOption<opt::CaseList>())
 		{
 			std::istringstream str(m_cmdLine.getOption<opt::CaseList>());
 
-			m_caseTree = parseCaseTree(str);
+			m_caseTree = parseCaseList(str);
 		}
-		else if (!m_cmdLine.getOption<opt::CaseListFile>().empty())
+		else if (m_cmdLine.hasOption<opt::CaseListFile>())
 		{
 			std::ifstream in(m_cmdLine.getOption<opt::CaseListFile>().c_str(), std::ios_base::binary);
 
 			if (!in.is_open() || !in.good())
 				throw Exception("Failed to open case list file '" + m_cmdLine.getOption<opt::CaseListFile>() + "'");
 
-			m_caseTree = parseCaseTree(in);
+			m_caseTree = parseCaseList(in);
 		}
 		else if (m_cmdLine.getOption<opt::StdinCaseList>())
 		{
-			m_caseTree = parseCaseTree(std::cin);
+			m_caseTree = parseCaseList(std::cin);
 		}
-		else if (!m_cmdLine.getOption<opt::CasePath>().empty())
+		else if (m_cmdLine.hasOption<opt::CasePath>())
 			m_casePaths = de::MovePtr<const CasePaths>(new CasePaths(m_cmdLine.getOption<opt::CasePath>()));
 	}
 	catch (const std::exception& e)
@@ -591,21 +788,18 @@
 int						CommandLine::getGLConfigId				(void) const	{ return m_cmdLine.getOption<opt::GLConfigID>();				}
 int						CommandLine::getCLPlatformId			(void) const	{ return m_cmdLine.getOption<opt::CLPlatformID>();				}
 const std::vector<int>&	CommandLine::getCLDeviceIds				(void) const	{ return m_cmdLine.getOption<opt::CLDeviceIDs>();				}
-const char*				CommandLine::getEGLDisplayType			(void) const	{ return m_cmdLine.getOption<opt::EGLDisplayType>().c_str();	}
-const char*				CommandLine::getEGLWindowType			(void) const	{ return m_cmdLine.getOption<opt::EGLWindowType>().c_str();		}
-const char*				CommandLine::getEGLPixmapType			(void) const	{ return m_cmdLine.getOption<opt::EGLPixmapType>().c_str();		}
 bool					CommandLine::isOutOfMemoryTestEnabled	(void) const	{ return m_cmdLine.getOption<opt::TestOOM>();					}
 
 const char* CommandLine::getGLContextType (void) const
 {
-	if (!m_cmdLine.getOption<opt::GLContextType>().empty())
+	if (m_cmdLine.hasOption<opt::GLContextType>())
 		return m_cmdLine.getOption<opt::GLContextType>().c_str();
 	else
 		return DE_NULL;
 }
 const char* CommandLine::getGLConfigName (void) const
 {
-	if (!m_cmdLine.getOption<opt::GLConfigName>().empty())
+	if (m_cmdLine.hasOption<opt::GLConfigName>())
 		return m_cmdLine.getOption<opt::GLConfigName>().c_str();
 	else
 		return DE_NULL;
@@ -613,7 +807,7 @@
 
 const char* CommandLine::getGLContextFlags (void) const
 {
-	if (!m_cmdLine.getOption<opt::GLContextFlags>().empty())
+	if (m_cmdLine.hasOption<opt::GLContextFlags>())
 		return m_cmdLine.getOption<opt::GLContextFlags>().c_str();
 	else
 		return DE_NULL;
@@ -621,50 +815,46 @@
 
 const char* CommandLine::getCLBuildOptions (void) const
 {
-	if (!m_cmdLine.getOption<opt::CLBuildOptions>().empty())
+	if (m_cmdLine.hasOption<opt::CLBuildOptions>())
 		return m_cmdLine.getOption<opt::CLBuildOptions>().c_str();
 	else
 		return DE_NULL;
 }
 
-static bool checkTestGroupName (const CaseTreeNode* node, const char* groupName)
+const char* CommandLine::getEGLDisplayType (void) const
 {
-	for (vector<CaseTreeNode*>::const_iterator childIter = node->getChildren().begin(); childIter != node->getChildren().end(); ++childIter)
-	{
-		const CaseTreeNode* const child = *childIter;
-
-		if (deStringBeginsWith(groupName, child->getName().c_str()))
-		{
-			const int prefixLen = (int)child->getName().length();
-
-			if (groupName[prefixLen] == 0)
-				return true;
-			else if (groupName[prefixLen] == '.')
-				return checkTestGroupName(child, groupName + prefixLen + 1);
-		}
-	}
-
-	return false;
+	if (m_cmdLine.hasOption<opt::EGLDisplayType>())
+		return m_cmdLine.getOption<opt::EGLDisplayType>().c_str();
+	else
+		return DE_NULL;
 }
 
-static bool checkTestCaseName (const CaseTreeNode* node, const char* caseName)
+const char* CommandLine::getEGLWindowType (void) const
 {
-	for (vector<CaseTreeNode*>::const_iterator childIter = node->getChildren().begin(); childIter != node->getChildren().end(); ++childIter)
-	{
-		const CaseTreeNode* const child = *childIter;
+	if (m_cmdLine.hasOption<opt::EGLWindowType>())
+		return m_cmdLine.getOption<opt::EGLWindowType>().c_str();
+	else
+		return DE_NULL;
+}
 
-		if (deStringBeginsWith(caseName, child->getName().c_str()))
-		{
-			const int prefixLen = (int)child->getName().length();
+const char* CommandLine::getEGLPixmapType (void) const
+{
+	if (m_cmdLine.hasOption<opt::EGLPixmapType>())
+		return m_cmdLine.getOption<opt::EGLPixmapType>().c_str();
+	else
+		return DE_NULL;
+}
 
-			if (caseName[prefixLen] == 0 && child->getChildren().empty())
-				return true;
-			else if (caseName[prefixLen] == '.')
-				return checkTestCaseName(child, caseName + prefixLen + 1);
-		}
-	}
+static bool checkTestGroupName (const CaseTreeNode* root, const char* groupPath)
+{
+	const CaseTreeNode* node = findNode(root, groupPath);
+	return node && node->hasChildren();
+}
 
-	return false;
+static bool checkTestCaseName (const CaseTreeNode* root, const char* casePath)
+{
+	const CaseTreeNode* node = findNode(root, casePath);
+	return node && !node->hasChildren();
 }
 
 bool CommandLine::checkTestGroupName (const char* groupName) const
diff --git a/framework/common/tcuFuzzyImageCompare.cpp b/framework/common/tcuFuzzyImageCompare.cpp
index fcf6252..cfcd576 100644
--- a/framework/common/tcuFuzzyImageCompare.cpp
+++ b/framework/common/tcuFuzzyImageCompare.cpp
@@ -34,8 +34,6 @@
 
 using std::vector;
 
-// \todo [2012-12-13 pyry] Big-endian architectures?
-
 template<int Channel>
 static inline deUint8 getChannel (deUint32 color)
 {
@@ -82,11 +80,13 @@
 	return v;
 }
 
+#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
 template<>
 inline deUint32 readUnorm8<4> (const tcu::ConstPixelBufferAccess& src, int x, int y)
 {
 	return *(const deUint32*)((const deUint8*)src.getDataPtr() + src.getRowPitch()*y + x*4);
 }
+#endif
 
 template<int NumChannels>
 static inline void writeUnorm8 (const tcu::PixelBufferAccess& dst, int x, int y, deUint32 val)
@@ -97,11 +97,13 @@
 		ptr[c] = getChannel(val, c);
 }
 
+#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
 template<>
 inline void writeUnorm8<4> (const tcu::PixelBufferAccess& dst, int x, int y, deUint32 val)
 {
 	*(deUint32*)((deUint8*)dst.getDataPtr() + dst.getRowPitch()*y + x*4) = val;
 }
+#endif
 
 static inline float compareColors (deUint32 pa, deUint32 pb, int minErrThreshold)
 {
diff --git a/framework/common/tcuTestCase.cpp b/framework/common/tcuTestCase.cpp
index 2138e26..a8aeeb7 100644
--- a/framework/common/tcuTestCase.cpp
+++ b/framework/common/tcuTestCase.cpp
@@ -33,19 +33,11 @@
 
 // TestNode.
 
-inline bool isValidCaseNameChar (char c)
-{
-	return de::inRange(c, 'a', 'z') ||
-		   de::inRange(c, 'A', 'Z') ||
-		   de::inRange(c, '0', '9') ||
-		   c == '_' || c == '-';
-}
-
 inline bool isValidCaseName (const char* name)
 {
 	for (const char* p = name; *p != '\0'; p++)
 	{
-		if (!isValidCaseNameChar(*p))
+		if (!isValidTestCaseNameChar(*p))
 			return false;
 	}
 	return true;
diff --git a/framework/common/tcuTestCase.hpp b/framework/common/tcuTestCase.hpp
index f333f22..431f7d1 100644
--- a/framework/common/tcuTestCase.hpp
+++ b/framework/common/tcuTestCase.hpp
@@ -51,6 +51,14 @@
 		   type == NODETYPE_ACCURACY;
 }
 
+inline bool isValidTestCaseNameChar (char c)
+{
+	return de::inRange(c, 'a', 'z') ||
+		   de::inRange(c, 'A', 'Z') ||
+		   de::inRange(c, '0', '9') ||
+		   c == '_' || c == '-';
+}
+
 /*--------------------------------------------------------------------*//*!
  * \brief Test case hierarchy node
  *
diff --git a/framework/delibs/cmake/CFlags.cmake b/framework/delibs/cmake/CFlags.cmake
index 5d4b982..e468b56 100644
--- a/framework/delibs/cmake/CFlags.cmake
+++ b/framework/delibs/cmake/CFlags.cmake
@@ -148,9 +148,9 @@
 	set(CLANG_COMMON_FLAGS "-Wall -Wextra -Wno-long-long -Wshadow -Wundef")
 
 	if (DE_CPU_IS_X86)
-		set(GCC_MACHINE_FLAGS "-m32")
+		set(CLANG_MACHINE_FLAGS "-m32")
 	elseif (DE_CPU_IS_X86_64)
-		set(GCC_MACHINE_FLAGS "-m64")
+		set(CLANG_MACHINE_FLAGS "-m64")
 	endif ()
 
 	# For 3rd party sw disable all warnings
diff --git a/framework/delibs/cmake/toolchain-android-r10c.cmake b/framework/delibs/cmake/toolchain-android-r10c.cmake
index fe48832..739c276 100644
--- a/framework/delibs/cmake/toolchain-android-r10c.cmake
+++ b/framework/delibs/cmake/toolchain-android-r10c.cmake
@@ -31,7 +31,8 @@
 	set(DE_ANDROID_API 9)
 endif ()
 
-set(COMMON_C_FLAGS		"-fpic -DANDROID -D__ANDROID__ -D__STDC_INT64__")
+set(COMMON_C_FLAGS		"-mandroid -D__STDC_INT64__")
+set(COMMON_CXX_FLAGS	"${COMMON_C_FLAGS} -frtti -fexceptions")
 set(COMMON_LINKER_FLAGS	"")
 set(ARM_C_FLAGS			"-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ ")
 
@@ -140,6 +141,6 @@
 
 # \note Without CACHE STRING FORCE cmake ignores these.
 set(CMAKE_C_FLAGS				"--sysroot=${ANDROID_SYSROOT} ${COMMON_C_FLAGS} ${TARGET_C_FLAGS}" CACHE STRING "" FORCE)
-set(CMAKE_CXX_FLAGS				"--sysroot=${ANDROID_SYSROOT} ${COMMON_C_FLAGS} ${TARGET_C_FLAGS} -I${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9/include -I${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9/libs/${ANDROID_ABI}/include" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS				"--sysroot=${ANDROID_SYSROOT} ${COMMON_CXX_FLAGS} ${TARGET_C_FLAGS} -I${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9/include -I${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9/libs/${ANDROID_ABI}/include" CACHE STRING "" FORCE)
 set(CMAKE_SHARED_LINKER_FLAGS	"-nostdlib -Wl,-shared,-Bsymbolic -Wl,--no-undefined ${COMMON_LINKER_FLAGS} ${TARGET_LINKER_FLAGS}" CACHE STRING "" FORCE)
 set(CMAKE_EXE_LINKER_FLAGS		"${COMMON_LINKER_FLAGS} ${TARGET_LINKER_FLAGS}" CACHE STRING "" FORCE)
diff --git a/framework/delibs/debase/deInt32.h b/framework/delibs/debase/deInt32.h
index aa4c8cb..a360f62 100644
--- a/framework/delibs/debase/deInt32.h
+++ b/framework/delibs/debase/deInt32.h
@@ -337,6 +337,20 @@
 	return (int)t;
 }
 
+/*--------------------------------------------------------------------*//*!
+ * \brief Reverse bytes in 32-bit integer (for example MSB -> LSB).
+ * \param a	Input value.
+ * \return The input with bytes reversed
+ *//*--------------------------------------------------------------------*/
+DE_INLINE deUint32 deReverseBytes32 (deUint32 v)
+{
+	deUint32 b0 = v << 24;
+	deUint32 b1 = (v & 0x0000ff00) << 8;
+	deUint32 b2 = (v & 0x00ff0000) >> 8;
+	deUint32 b3 = v >> 24;
+	return b0|b1|b2|b3;
+}
+
 DE_INLINE deInt32 deSafeMul32 (deInt32 a, deInt32 b)
 {
 	deInt32 res = a * b;
diff --git a/framework/delibs/decpp/deCommandLine.cpp b/framework/delibs/decpp/deCommandLine.cpp
index dd2b4e2..d601780 100644
--- a/framework/delibs/decpp/deCommandLine.cpp
+++ b/framework/delibs/decpp/deCommandLine.cpp
@@ -55,11 +55,17 @@
 
 TypedFieldMap::~TypedFieldMap (void)
 {
+	clear();
+}
+
+void TypedFieldMap::clear (void)
+{
 	for (Map::const_iterator iter = m_fields.begin(); iter != m_fields.end(); ++iter)
 	{
 		if (iter->second.value)
 			iter->second.destructor(iter->second.value);
 	}
+	m_fields.clear();
 }
 
 bool TypedFieldMap::contains (const std::type_info* key) const
@@ -138,8 +144,8 @@
 		// Set default values.
 		if (opt.defaultValue)
 			opt.dispatchParse(&opt, opt.defaultValue, &dst->m_options);
-		else
-			opt.getDefault(&dst->m_options);
+		else if (opt.setDefault)
+			opt.setDefault(&dst->m_options);
 	}
 
 	DE_ASSERT(!dst->m_options.get<Help>());
@@ -332,10 +338,11 @@
 
 // Tests
 
-DE_DECLARE_COMMAND_LINE_OPT(TestStringOpt,	std::string);
-DE_DECLARE_COMMAND_LINE_OPT(TestIntOpt,		int);
-DE_DECLARE_COMMAND_LINE_OPT(TestBoolOpt,	bool);
-DE_DECLARE_COMMAND_LINE_OPT(TestNamedOpt,	deUint64);
+DE_DECLARE_COMMAND_LINE_OPT(TestStringOpt,		std::string);
+DE_DECLARE_COMMAND_LINE_OPT(TestStringDefOpt,	std::string);
+DE_DECLARE_COMMAND_LINE_OPT(TestIntOpt,			int);
+DE_DECLARE_COMMAND_LINE_OPT(TestBoolOpt,		bool);
+DE_DECLARE_COMMAND_LINE_OPT(TestNamedOpt,		deUint64);
 
 void selfTest (void)
 {
@@ -396,10 +403,11 @@
 			{ "huge",	~0ull	}
 		};
 
-		parser << Option<TestStringOpt>	("s",	"string",	"String option")
-			   << Option<TestIntOpt>	("i",	"int",		"Int option")
-			   << Option<TestBoolOpt>	("b",	"bool",		"Test boolean flag")
-			   << Option<TestNamedOpt>	("n",	"named",	"Test named opt",	DE_ARRAY_BEGIN(s_namedValues),	DE_ARRAY_END(s_namedValues),	"one");
+		parser << Option<TestStringOpt>		("s",	"string",	"String option")
+			   << Option<TestStringDefOpt>	("x",	"xyz",		"String option w/ default value",	"foo")
+			   << Option<TestIntOpt>		("i",	"int",		"Int option")
+			   << Option<TestBoolOpt>		("b",	"bool",		"Test boolean flag")
+			   << Option<TestNamedOpt>		("n",	"named",	"Test named opt",	DE_ARRAY_BEGIN(s_namedValues),	DE_ARRAY_END(s_namedValues),	"one");
 
 		{
 			std::ostringstream err;
@@ -417,10 +425,11 @@
 			DE_TEST_ASSERT(parseOk);
 			DE_TEST_ASSERT(err.str().empty());
 
-			DE_TEST_ASSERT(cmdLine.getOption<TestStringOpt>() == "");
-			DE_TEST_ASSERT(cmdLine.getOption<TestIntOpt>() == 0);
-			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>() == false);
+			DE_TEST_ASSERT(!cmdLine.hasOption<TestStringOpt>());
+			DE_TEST_ASSERT(!cmdLine.hasOption<TestIntOpt>());
 			DE_TEST_ASSERT(cmdLine.getOption<TestNamedOpt>() == 1);
+			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>() == false);
+			DE_TEST_ASSERT(cmdLine.getOption<TestStringDefOpt>() == "foo");
 		}
 
 		// Basic parsing
@@ -437,6 +446,7 @@
 			DE_TEST_ASSERT(cmdLine.getOption<TestIntOpt>() == 9);
 			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>());
 			DE_TEST_ASSERT(cmdLine.getOption<TestNamedOpt>() == ~0ull);
+			DE_TEST_ASSERT(cmdLine.getOption<TestStringDefOpt>() == "foo");
 		}
 
 		// End of argument list (--)
@@ -451,7 +461,7 @@
 
 			DE_TEST_ASSERT(cmdLine.getOption<TestStringOpt>() == "foo");
 			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>());
-			DE_TEST_ASSERT(cmdLine.getOption<TestIntOpt>() == 0); // Not specified
+			DE_TEST_ASSERT(!cmdLine.hasOption<TestIntOpt>());
 
 			DE_TEST_ASSERT(cmdLine.getArgs().size() == 2);
 			DE_TEST_ASSERT(cmdLine.getArgs()[0] == "--int=2");
@@ -470,7 +480,7 @@
 
 			DE_TEST_ASSERT(cmdLine.getOption<TestStringOpt>() == "--");
 			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>());
-			DE_TEST_ASSERT(cmdLine.getOption<TestIntOpt>() == 0); // Not specified
+			DE_TEST_ASSERT(!cmdLine.hasOption<TestIntOpt>());
 
 			DE_TEST_ASSERT(cmdLine.getArgs().size() == 1);
 			DE_TEST_ASSERT(cmdLine.getArgs()[0] == "foo");
@@ -555,7 +565,7 @@
 
 		// Empty value --arg=
 		{
-			const char*			args[]	= { "--string=", "-b" };
+			const char*			args[]	= { "--string=", "-b", "-x", "" };
 			CommandLine			cmdLine;
 			std::ostringstream	err;
 			bool				parseOk	= parser.parse(DE_LENGTH_OF_ARRAY(args), &args[0], &cmdLine, err);
@@ -563,6 +573,7 @@
 			DE_TEST_ASSERT(parseOk);
 			DE_TEST_ASSERT(err.str().empty());
 			DE_TEST_ASSERT(cmdLine.getOption<TestStringOpt>() == "");
+			DE_TEST_ASSERT(cmdLine.getOption<TestStringDefOpt>() == "");
 			DE_TEST_ASSERT(cmdLine.getOption<TestBoolOpt>());
 		}
 	}
diff --git a/framework/delibs/decpp/deCommandLine.hpp b/framework/delibs/decpp/deCommandLine.hpp
index 4f19aac..50bfca5 100644
--- a/framework/delibs/decpp/deCommandLine.hpp
+++ b/framework/delibs/decpp/deCommandLine.hpp
@@ -58,7 +58,7 @@
 	const char*						shortName;
 	const char*						longName;
 	const char*						description;
-	const char*						defaultValue;		//!< Default value (parsed from string), or null if default should be T()
+	const char*						defaultValue;		//!< Default value (parsed from string), or null if should not be set
 
 	// \note Either parse or namedValues must be null.
 	ParseFunc						parse;				//!< Custom parsing function or null.
@@ -165,7 +165,7 @@
 						~TypedFieldMap			(void);
 
 	bool				empty					(void) const	{ return m_fields.empty();	}
-	void				clear					(void)			{ m_fields.clear();			}
+	void				clear					(void);
 
 	template<typename Name>
 	void				set						(typename TypedFieldTraits<Name>::ValueType* value);
@@ -262,7 +262,7 @@
 	struct OptInfo;
 
 	typedef void		(*DispatchParseFunc)		(const OptInfo* info, const char* src, TypedFieldMap* dst);
-	typedef void		(*GetDefaultFunc)			(TypedFieldMap* dst);
+	typedef void		(*SetDefaultFunc)			(TypedFieldMap* dst);
 
 	struct OptInfo
 	{
@@ -279,7 +279,7 @@
 		size_t					namedValueStride;
 
 		DispatchParseFunc		dispatchParse;
-		GetDefaultFunc			getDefault;
+		SetDefaultFunc			setDefault;
 
 		OptInfo (void)
 			: shortName			(DE_NULL)
@@ -292,7 +292,7 @@
 			, namedValuesEnd	(DE_NULL)
 			, namedValueStride	(0)
 			, dispatchParse		(DE_NULL)
-			, getDefault		(DE_NULL)
+			, setDefault		(DE_NULL)
 		{}
 	};
 
@@ -340,7 +340,7 @@
 }
 
 template<typename OptType>
-void dispatchGetDefault (TypedFieldMap* dst)
+void dispatchSetDefault (TypedFieldMap* dst)
 {
 	typename OptTraits<OptType>::ValueType* value = new typename OptTraits<OptType>::ValueType();
 	try
@@ -384,7 +384,9 @@
 	opt.namedValuesEnd		= (const void*)option.namedValuesEnd;
 	opt.namedValueStride	= sizeof(*option.namedValues);
 	opt.dispatchParse		= dispatchParse<OptType>;
-	opt.getDefault			= dispatchGetDefault<OptType>;
+
+	if (opt.isFlag)
+		opt.setDefault		= dispatchSetDefault<OptType>;
 
 	addOption(opt);
 }
@@ -401,8 +403,11 @@
 	const vector<string>&		getArgs			(void) const	{ return m_args;	}
 
 	template<typename Option>
+	bool						hasOption		(void) const	{ return m_options.contains<Option>();	}
+
+	template<typename Option>
 	const typename TypedFieldTraits<Option>::ValueType&
-								getOption		(void) const	{ return m_options.get<Option>(); }
+								getOption		(void) const	{ return m_options.get<Option>();		}
 
 private:
 	TypedFieldMap				m_options;
diff --git a/framework/egl/egluGLContextFactory.cpp b/framework/egl/egluGLContextFactory.cpp
index 6a23acc..bf9c1c7 100644
--- a/framework/egl/egluGLContextFactory.cpp
+++ b/framework/egl/egluGLContextFactory.cpp
@@ -742,7 +742,7 @@
 template<typename Factory>
 const Factory* selectFactory (const tcu::FactoryRegistry<Factory>& registry, const char* objectTypeName, const char* cmdLineArg)
 {
-	if (cmdLineArg[0] != 0)
+	if (cmdLineArg)
 	{
 		const Factory* factory = registry.getFactoryByName(cmdLineArg);
 
diff --git a/framework/opengl/gluVarType.hpp b/framework/opengl/gluVarType.hpp
index 5ac6d5b..8cdbb8a 100644
--- a/framework/opengl/gluVarType.hpp
+++ b/framework/opengl/gluVarType.hpp
@@ -169,7 +169,7 @@
 
 enum Storage
 {
-	STORAGE_IN,
+	STORAGE_IN = 0,
 	STORAGE_OUT,
 	STORAGE_CONST,
 	STORAGE_UNIFORM,
@@ -181,7 +181,7 @@
 
 enum Interpolation
 {
-	INTERPOLATION_SMOOTH,
+	INTERPOLATION_SMOOTH = 0,
 	INTERPOLATION_FLAT,
 	INTERPOLATION_CENTROID,
 	INTERPOLATION_LAST
diff --git a/framework/opengl/simplereference/sglrGLContext.cpp b/framework/opengl/simplereference/sglrGLContext.cpp
index ffb1857..6e65113 100644
--- a/framework/opengl/simplereference/sglrGLContext.cpp
+++ b/framework/opengl/simplereference/sglrGLContext.cpp
@@ -864,6 +864,7 @@
 	if (!program->isOk())
 	{
 		m_log << *program;
+		delete program;
 		TCU_FAIL("Compile failed");
 	}
 
diff --git a/framework/platform/android/tcuAndroidRenderActivity.cpp b/framework/platform/android/tcuAndroidRenderActivity.cpp
index 142435e..ddbf40e 100644
--- a/framework/platform/android/tcuAndroidRenderActivity.cpp
+++ b/framework/platform/android/tcuAndroidRenderActivity.cpp
@@ -291,7 +291,6 @@
 
 void RenderActivity::setThread (RenderThread* thread)
 {
-	DE_ASSERT(!m_thread && thread);
 	m_thread = thread;
 }
 
diff --git a/framework/platform/android/tcuTestLogParserJNI.cpp b/framework/platform/android/tcuTestLogParserJNI.cpp
index 59a4edb..e436b97 100644
--- a/framework/platform/android/tcuTestLogParserJNI.cpp
+++ b/framework/platform/android/tcuTestLogParserJNI.cpp
@@ -107,12 +107,12 @@
 
 void TestLogListener::beginSession (void)
 {
-	m_env->CallObjectMethod(m_object, m_beginSessionID);
+	m_env->CallVoidMethod(m_object, m_beginSessionID);
 }
 
 void TestLogListener::endSession (void)
 {
-	m_env->CallObjectMethod(m_object, m_endSessionID);
+	m_env->CallVoidMethod(m_object, m_endSessionID);
 }
 
 void TestLogListener::sessionInfo (const char* name, const char* value)
@@ -120,26 +120,30 @@
 	jstring jName	= m_env->NewStringUTF(name);
 	jstring jValue	= m_env->NewStringUTF(value);
 
-	m_env->CallObjectMethod(m_object, m_sessionInfoID, jName, jValue);
+	m_env->CallVoidMethod(m_object, m_sessionInfoID, jName, jValue);
+	m_env->DeleteLocalRef(jName);
+	m_env->DeleteLocalRef(jValue);
 }
 
 void TestLogListener::beginTestCase (const char* testCasePath)
 {
 	jstring jTestCasePath = m_env->NewStringUTF(testCasePath);
 
-	m_env->CallObjectMethod(m_object, m_beginTestCaseID, jTestCasePath);
+	m_env->CallVoidMethod(m_object, m_beginTestCaseID, jTestCasePath);
+	m_env->DeleteLocalRef(jTestCasePath);
 }
 
 void TestLogListener::endTestCase (void)
 {
-	m_env->CallObjectMethod(m_object, m_endTestCaseID);
+	m_env->CallVoidMethod(m_object, m_endTestCaseID);
 }
 
 void TestLogListener::terminateTestCase (const char* reason)
 {
 	jstring	 jReason = m_env->NewStringUTF(reason);
 
-	m_env->CallObjectMethod(m_object, m_terminateTestCaseID, jReason);
+	m_env->CallVoidMethod(m_object, m_terminateTestCaseID, jReason);
+	m_env->DeleteLocalRef(jReason);
 }
 
 void TestLogListener::testCaseResult (const char* statusCode, const char* details)
@@ -147,14 +151,17 @@
 	jstring	 jStatusCode	= m_env->NewStringUTF(statusCode);
 	jstring	 jDetails		= m_env->NewStringUTF(details);
 
-	m_env->CallObjectMethod(m_object, m_testCaseResultID, jStatusCode, jDetails);
+	m_env->CallVoidMethod(m_object, m_testCaseResultID, jStatusCode, jDetails);
+	m_env->DeleteLocalRef(jStatusCode);
+	m_env->DeleteLocalRef(jDetails);
 }
 
 void TestLogListener::testLogData (const char* data)
 {
 	jstring logData = m_env->NewStringUTF(data);
 
-	m_env->CallObjectMethod(m_object, m_testLogData, logData);
+	m_env->CallVoidMethod(m_object, m_testLogData, logData);
+	m_env->DeleteLocalRef(logData);
 }
 
 class TestLogParser
diff --git a/framework/qphelper/qpInfo.c b/framework/qphelper/qpInfo.c
index 6589b82..49cc3d0 100644
--- a/framework/qphelper/qpInfo.c
+++ b/framework/qphelper/qpInfo.c
@@ -23,14 +23,10 @@
 
 #include "qpInfo.h"
 
-#include <time.h>
-
 DE_BEGIN_EXTERN_C
 
 #define DEQP_RELEASE_NAME	"2014.x"
 #define DEQP_RELEASE_ID		0xcafebabe
-#define DEQP_LICENSE_BEGIN	0
-#define DEQP_LICENSE_END	0xffffffffu
 
 const char* qpGetTargetName (void)
 {
@@ -51,13 +47,4 @@
 	return DEQP_RELEASE_ID;
 }
 
-deBool qpIsLicenseValid (void)
-{
-	deUint64	begin	= (deUint64)DEQP_LICENSE_BEGIN;
-	deUint64	end		= (deUint64)DEQP_LICENSE_END;
-	deUint64	curTime	= (deUint64)time(DE_NULL);
-
-	return begin <= curTime && curTime <= end;
-}
-
 DE_END_EXTERN_C
diff --git a/framework/qphelper/qpInfo.h b/framework/qphelper/qpInfo.h
index 96aaacc..58830cd 100644
--- a/framework/qphelper/qpInfo.h
+++ b/framework/qphelper/qpInfo.h
@@ -31,8 +31,6 @@
 const char*			qpGetReleaseName		(void);
 deUint32			qpGetReleaseId			(void);
 
-deBool				qpIsLicenseValid		(void);
-
 DE_END_EXTERN_C
 
 #endif /* _QPINFO_H */
diff --git a/framework/qphelper/qpTestLog.c b/framework/qphelper/qpTestLog.c
index 9fe4716..c383713 100644
--- a/framework/qphelper/qpTestLog.c
+++ b/framework/qphelper/qpTestLog.c
@@ -691,14 +691,35 @@
 	/* nada */
 }
 
+static deBool writeCompressedPNG (png_structp png, png_infop info, png_byte** rowPointers, int width, int height, int colorFormat)
+{
+	if (setjmp(png_jmpbuf(png)) == 0)
+	{
+		/* Write data. */
+		png_set_IHDR(png, info, width, height,
+			8,
+			colorFormat,
+			PNG_INTERLACE_NONE,
+			PNG_COMPRESSION_TYPE_BASE,
+			PNG_FILTER_TYPE_BASE);
+		png_write_info(png, info);
+		png_write_image(png, rowPointers);
+		png_write_end(png, NULL);
+
+		return DE_TRUE;
+	}
+	else
+		return DE_FALSE;
+}
+
 static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data)
 {
-	deBool		compressOk		= DE_FALSE;
-	png_structp	png				= DE_NULL;
-	png_infop	info			= DE_NULL;
-	png_byte**	rowPointers		= DE_NULL;
-	deBool		hasAlpha		= imageFormat == QP_IMAGE_FORMAT_RGBA8888;
-	int			ndx;
+	deBool			compressOk		= DE_FALSE;
+	png_structp		png				= DE_NULL;
+	png_infop		info			= DE_NULL;
+	png_byte**		rowPointers		= DE_NULL;
+	deBool			hasAlpha		= imageFormat == QP_IMAGE_FORMAT_RGBA8888;
+	int				ndx;
 
 	/* Handle format. */
 	DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888);
@@ -709,31 +730,18 @@
 		return DE_FALSE;
 
 	for (ndx = 0; ndx < height; ndx++)
-		rowPointers[ndx] = (png_bytep)((const deUint8*)data + ndx*rowStride);
+		rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride);
 
 	/* Initialize PNG compressor. */
 	png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 	info = png ? png_create_info_struct(png) : DE_NULL;
 	if (png && info)
 	{
-		if (setjmp(png_jmpbuf(png)) == 0)
-		{
-			/* Set our own write function. */
-			png_set_write_fn(png, buffer, pngWriteData, pngFlushData);
+		/* Set our own write function. */
+		png_set_write_fn(png, buffer, pngWriteData, pngFlushData);
 
-			/* Write data. */
-			png_set_IHDR(png, info, width, height,
-				8,
-				hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB,
-				PNG_INTERLACE_NONE,
-				PNG_COMPRESSION_TYPE_BASE,
-				PNG_FILTER_TYPE_BASE);
-			png_write_info(png, info);
-			png_write_image(png, rowPointers);
-			png_write_end(png, NULL);
-
-			compressOk = DE_TRUE;
-		}
+		compressOk = writeCompressedPNG(png, info, rowPointers, width, height,
+										hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB);
 	}
 
 	/* Cleanup & return. */
diff --git a/modules/egl/teglNegativeApiTests.cpp b/modules/egl/teglNegativeApiTests.cpp
old mode 100644
new mode 100755
index cd91ca9..920abe5
--- a/modules/egl/teglNegativeApiTests.cpp
+++ b/modules/egl/teglNegativeApiTests.cpp
@@ -309,7 +309,7 @@
 				EGLConfig glOnlyConfig;
 				if (getConfig(&glOnlyConfig, FilterList() << (ConfigRenderableType() & EGL_OPENGL_BIT) << (ConfigRenderableType() ^ EGL_OPENVG_BIT)))
 				{
-					expectTrue(eglBindAPI(EGL_OPENGL_ES_API));
+					expectTrue(eglBindAPI(EGL_OPENVG_API));
 					expectNoContext(eglCreateContext(display, glOnlyConfig, EGL_NO_CONTEXT, s_emptyAttribList));
 					expectError(EGL_BAD_CONFIG);
 				}
@@ -317,7 +317,7 @@
 				EGLConfig es1OnlyConfig;
 				if (getConfig(&es1OnlyConfig, FilterList() << (ConfigRenderableType() & EGL_OPENGL_ES_BIT) << (ConfigRenderableType() ^ EGL_OPENVG_BIT)))
 				{
-					expectTrue(eglBindAPI(EGL_OPENGL_API));
+					expectTrue(eglBindAPI(EGL_OPENVG_API));
 					expectNoContext(eglCreateContext(display, es1OnlyConfig, EGL_NO_CONTEXT, s_es1ContextAttribList));
 					expectError(EGL_BAD_CONFIG);
 				}
@@ -325,7 +325,7 @@
 				EGLConfig es2OnlyConfig;
 				if (getConfig(&es2OnlyConfig, FilterList() << (ConfigRenderableType() & EGL_OPENGL_ES2_BIT) << (ConfigRenderableType() ^ EGL_OPENVG_BIT)))
 				{
-					expectTrue(eglBindAPI(EGL_OPENGL_API));
+					expectTrue(eglBindAPI(EGL_OPENVG_API));
 					expectNoContext(eglCreateContext(display, es2OnlyConfig, EGL_NO_CONTEXT, s_es2ContextAttribList));
 					expectError(EGL_BAD_CONFIG);
 				}
@@ -434,10 +434,13 @@
 
 			log << TestLog::Section("Test3", "EGL_BAD_PARAMETER is generated if buftype is not EGL_OPENVG_IMAGE");
 
+			log << TestLog::EndSection;
+
 			expectTrue(eglGetConfigs(display, &anyConfig, 1, &unused));
 
+			log << TestLog::Section("Test4", "EGL_BAD_PARAMETER is generated if buffer is not valid OpenVG image");
 			expectNoSurface(eglCreatePbufferFromClientBuffer(display, EGL_OPENVG_IMAGE, (EGLClientBuffer)-1, anyConfig, DE_NULL));
-			expectError(EGL_BAD_CONFIG);
+			expectError(EGL_BAD_PARAMETER);
 
 			log << TestLog::EndSection;
 		});
@@ -642,10 +645,10 @@
 			if (getConfig(&windowConfig, FilterList() << (ConfigSurfaceType() & EGL_WINDOW_BIT)))
 			{
 				expectNoSurface(eglCreateWindowSurface(display, windowConfig, DE_NULL, s_emptyAttribList));
-				expectError(EGL_BAD_NATIVE_PIXMAP);
+				expectError(EGL_BAD_NATIVE_WINDOW);
 
 				expectNoSurface(eglCreateWindowSurface(display, windowConfig, (EGLNativeWindowType)-1, s_emptyAttribList));
-				expectError(EGL_BAD_NATIVE_PIXMAP);
+				expectError(EGL_BAD_NATIVE_WINDOW);
 			}
 
 			log << TestLog::EndSection;
@@ -838,9 +841,6 @@
 
 			if (surface)
 			{
-				expectFalse(eglMakeCurrent(display, surface, surface, DE_NULL));
-				expectError(EGL_BAD_CONTEXT);
-
 				expectFalse(eglMakeCurrent(display, surface, surface, (EGLContext)-1));
 				expectError(EGL_BAD_CONTEXT);
 			}
diff --git a/modules/egl/teglQueryContextTests.cpp b/modules/egl/teglQueryContextTests.cpp
index c6edb9d..3f3fe2b 100644
--- a/modules/egl/teglQueryContextTests.cpp
+++ b/modules/egl/teglQueryContextTests.cpp
@@ -404,7 +404,8 @@
 		{
 			const EGLint	clientVersion	= getContextAttrib(display, context, EGL_CONTEXT_CLIENT_VERSION);
 
-			if (info.clientType == EGL_OPENGL_ES_API && clientVersion != info.clientVersion)
+			// \todo [2014-10-21 mika] Query actual supported api version from client api to make this check stricter.
+			if (info.clientType == EGL_OPENGL_ES_API && ((info.clientVersion == 1 && clientVersion != 1) || clientVersion < info.clientVersion))
 			{
 				log << TestLog::Message << "  Fail, client API version doesn't match." << TestLog::EndMessage;
 				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid client API version");
diff --git a/modules/egl/teglQuerySurfaceTests.cpp b/modules/egl/teglQuerySurfaceTests.cpp
index 4a993aa..0817e9e 100644
--- a/modules/egl/teglQuerySurfaceTests.cpp
+++ b/modules/egl/teglQuerySurfaceTests.cpp
@@ -476,14 +476,25 @@
 	// Mipmap level
 	if (info.renderableType & EGL_OPENGL_ES_BIT || info.renderableType & EGL_OPENGL_ES2_BIT)
 	{
-		const EGLint	value	= surface.getAttribute(EGL_MIPMAP_LEVEL);
+		const EGLint initialValue = 0xDEADBAAD;
+		EGLint value = initialValue;
+
+		TCU_CHECK_EGL_CALL(eglQuerySurface(surface.getDisplay().getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, &value));
 
 		logSurfaceAttribute(log, EGL_MIPMAP_LEVEL, value);
 
-		if (value != 0)
+		if (dynamic_cast<tcu::egl::PbufferSurface*>(&surface))
 		{
-			log << TestLog::Message << "    Fail, initial mipmap level value should be 0, is " << value << TestLog::EndMessage;
-			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default mipmap level");
+			if (value != 0)
+			{
+				log << TestLog::Message << "    Fail, initial mipmap level value should be 0, is " << value << TestLog::EndMessage;
+				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default mipmap level");
+			}
+		}
+		else if (value != initialValue)
+		{
+			log << TestLog::Message << "    Fail, eglQuerySurface changed value when querying EGL_MIPMAP_LEVEL for non-pbuffer surface. Result: " << value << ". Expected: " << initialValue << TestLog::EndMessage;
+			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "EGL_MIPMAP_LEVEL query modified result for non-pbuffer surface.");
 		}
 
 		eglSurfaceAttrib(display.getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, 1);
diff --git a/modules/egl/teglTestPackage.cpp b/modules/egl/teglTestPackage.cpp
index f1ff130..06ee088 100644
--- a/modules/egl/teglTestPackage.cpp
+++ b/modules/egl/teglTestPackage.cpp
@@ -194,9 +194,9 @@
 	, m_caseWrapper	(DE_NULL)
 {
 	const eglu::NativeDisplayFactoryRegistry&	dpyFactoryRegistry	= testCtx.getPlatform().getEGLPlatform().getNativeDisplayFactoryRegistry();
-	const std::string							displayFactoryName	= testCtx.getCommandLine().getEGLDisplayType();
-	const std::string							windowFactoryName	= testCtx.getCommandLine().getEGLWindowType();
-	const std::string							pixmapFactoryName	= testCtx.getCommandLine().getEGLPixmapType();
+	const char* const							displayFactoryName	= testCtx.getCommandLine().getEGLDisplayType();
+	const char* const							windowFactoryName	= testCtx.getCommandLine().getEGLWindowType();
+	const char* const							pixmapFactoryName	= testCtx.getCommandLine().getEGLPixmapType();
 
 	const eglu::NativeDisplayFactory*			displayFactory		= DE_NULL;
 	const eglu::NativeWindowFactory*			windowFactory		= DE_NULL;
@@ -208,15 +208,15 @@
 		throw tcu::NotSupportedError("Platform doesn't have EGL any native display factories", DE_NULL, __FILE__, __LINE__);
 	}
 
-	if (displayFactoryName.empty())
+	if (!displayFactoryName)
 		displayFactory = dpyFactoryRegistry.getDefaultFactory();
 	else
 	{
-		displayFactory = dpyFactoryRegistry.getFactoryByName(displayFactoryName.c_str());
+		displayFactory = dpyFactoryRegistry.getFactoryByName(displayFactoryName);
 
 		if (!displayFactory)
 		{
-			tcu::print("ERROR: Unknown/unsupported EGL native display type '%s'\n", displayFactoryName.c_str());
+			tcu::print("ERROR: Unknown/unsupported EGL native display type '%s'\n", displayFactoryName);
 			tcu::print("Supported EGL native display types:\n");
 
 			for (int factoryNdx = 0; factoryNdx < (int)dpyFactoryRegistry.getFactoryCount(); factoryNdx++)
@@ -227,7 +227,7 @@
 				tcu::print("  %s: %s\n", name, desc);
 			}
 
-			throw tcu::NotSupportedError(("Unknown EGL native display type '" + displayFactoryName + "'.").c_str(), DE_NULL, __FILE__, __LINE__);
+			throw tcu::NotSupportedError(("Unknown EGL native display type '" + std::string(displayFactoryName) + "'.").c_str(), DE_NULL, __FILE__, __LINE__);
 		}
 	}
 
@@ -235,13 +235,13 @@
 
 	if (!displayFactory->getNativeWindowRegistry().empty())
 	{
-		windowFactory = windowFactoryName.empty() ? displayFactory->getNativeWindowRegistry().getDefaultFactory()
-												  : displayFactory->getNativeWindowRegistry().getFactoryByName(windowFactoryName.c_str());
+		windowFactory = windowFactoryName ? displayFactory->getNativeWindowRegistry().getFactoryByName(windowFactoryName)
+										  : displayFactory->getNativeWindowRegistry().getDefaultFactory();
 
 		if (!windowFactory)
 		{
-			DE_ASSERT(!windowFactoryName.empty());
-			tcu::print("ERROR: Unknown/unsupported EGL native window type '%s'\n", windowFactoryName.c_str());
+			DE_ASSERT(windowFactoryName);
+			tcu::print("ERROR: Unknown/unsupported EGL native window type '%s'\n", windowFactoryName);
 			tcu::print("Supported EGL native window types for native display '%s':\n", displayFactory->getName());
 
 			for (int factoryNdx = 0; factoryNdx < (int)displayFactory->getNativeWindowRegistry().getFactoryCount(); factoryNdx++)
@@ -252,7 +252,7 @@
 				tcu::print("  %s: %s\n", name, desc);
 			}
 
-			throw tcu::NotSupportedError(("Unknown EGL native window type '" + windowFactoryName + "'").c_str(), DE_NULL, __FILE__, __LINE__);
+			throw tcu::NotSupportedError(("Unknown EGL native window type '" + std::string(windowFactoryName) + "'").c_str(), DE_NULL, __FILE__, __LINE__);
 		}
 	}
 	else
@@ -260,13 +260,13 @@
 
 	if (!displayFactory->getNativePixmapRegistry().empty())
 	{
-		pixmapFactory = pixmapFactoryName.empty() ? displayFactory->getNativePixmapRegistry().getDefaultFactory()
-												  : displayFactory->getNativePixmapRegistry().getFactoryByName(pixmapFactoryName.c_str());
+		pixmapFactory = pixmapFactoryName ? displayFactory->getNativePixmapRegistry().getFactoryByName(pixmapFactoryName)
+										  : displayFactory->getNativePixmapRegistry().getDefaultFactory();
 
 		if (!pixmapFactory)
 		{
-			DE_ASSERT(!pixmapFactoryName.empty());
-			tcu::print("ERROR: Unknown/unsupported EGL native pixmap type '%s'\n", pixmapFactoryName.c_str());
+			DE_ASSERT(pixmapFactoryName);
+			tcu::print("ERROR: Unknown/unsupported EGL native pixmap type '%s'\n", pixmapFactoryName);
 			tcu::print("Supported EGL native pixmap types for native display '%s':\n", displayFactory->getName());
 
 			for (int factoryNdx = 0; factoryNdx < (int)displayFactory->getNativePixmapRegistry().getFactoryCount(); factoryNdx++)
@@ -277,7 +277,7 @@
 				tcu::print("  %s: %s\n", name, desc);
 			}
 
-			throw tcu::NotSupportedError(("Unknown EGL native pixmap type '" + pixmapFactoryName + "'").c_str(), DE_NULL, __FILE__, __LINE__);
+			throw tcu::NotSupportedError(("Unknown EGL native pixmap type '" + std::string(pixmapFactoryName) + "'").c_str(), DE_NULL, __FILE__, __LINE__);
 		}
 	}
 	else
diff --git a/modules/gles2/functional/es2fFboCompletenessTests.cpp b/modules/gles2/functional/es2fFboCompletenessTests.cpp
index 24882aa..5a67f8d 100644
--- a/modules/gles2/functional/es2fFboCompletenessTests.cpp
+++ b/modules/gles2/functional/es2fFboCompletenessTests.cpp
@@ -96,6 +96,12 @@
 	GLS_UNSIZED_FORMATKEY(GL_RGB,	GL_HALF_FLOAT_OES),
 };
 
+// GL_EXT_sRGB_write_control
+static const FormatKey s_extSrgbWriteControlFormats[] =
+{
+	GL_SRGB8_ALPHA8
+};
+
 static const FormatExtEntry s_es2ExtFormats[] =
 {
 	// The extension does not specify these to be color-renderable.
@@ -109,6 +115,13 @@
 		TEXTURE_VALID,
 		GLS_ARRAY_RANGE(s_oesTextureHalfFloatFormats)
 	},
+
+	// GL_EXT_sRGB_write_control makes SRGB8_ALPHA8 color-renderable
+	{
+		"GL_EXT_sRGB_write_control",
+		REQUIRED_RENDERABLE | TEXTURE_VALID | COLOR_RENDERABLE | RENDERBUFFER_VALID,
+		GLS_ARRAY_RANGE(s_extSrgbWriteControlFormats)
+	},
 };
 
 class ES2Checker : public Checker
diff --git a/modules/gles2/functional/es2fNegativeShaderApiTests.cpp b/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
index a273bca..51cffc6 100644
--- a/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
+++ b/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
@@ -898,6 +898,8 @@
 			GLint vMatUnif		= glGetUniformLocation(program.getProgram(), "vMatrix");	// mat4
 			GLint fSamplerUnif	= glGetUniformLocation(program.getProgram(), "fSampler");	// sampler2D
 
+			m_log << program;
+
 			if (vMatUnif == -1 || fSamplerUnif == -1)
 			{
 				m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
@@ -929,6 +931,8 @@
 			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
 			glUseProgram(program.getProgram());
 
+			m_log << program;
+
 			std::vector<GLfloat> data(16);
 
 			m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1.");
@@ -957,6 +961,8 @@
 			glUseProgram(program.getProgram());
 			GLint vMatUnif		= glGetUniformLocation(program.getProgram(), "vMatrix");		// mat4
 
+			m_log << program;
+
 			if (vMatUnif == -1)
 			{
 				m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
@@ -983,6 +989,8 @@
 			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
 			glUseProgram(program.getProgram());
 
+			m_log << program;
+
 			std::vector<GLfloat> data(16);
 
 			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if transpose is not GL_FALSE.");
diff --git a/modules/gles3/functional/es3fFboCompletenessTests.cpp b/modules/gles3/functional/es3fFboCompletenessTests.cpp
index c594e4c..b392f51 100644
--- a/modules/gles3/functional/es3fFboCompletenessTests.cpp
+++ b/modules/gles3/functional/es3fFboCompletenessTests.cpp
@@ -93,6 +93,14 @@
 	GL_RGBA16F, GL_RGB16F, GL_RG16F, GL_R16F,
 };
 
+static const FormatKey s_es3NotRenderableTextureFormats[] =
+{
+	GL_R8_SNORM, GL_RG8_SNORM, GL_RGB8_SNORM, GL_RGBA8_SNORM,
+	GL_RGB9_E5, GL_SRGB8,
+	GL_RGB8I, GL_RGB16I, GL_RGB32I,
+	GL_RGB8UI, GL_RGB16UI,GL_RGB32UI,
+};
+
 static const FormatEntry s_es3Formats[] =
 {
 	// Renderbuffers don't support unsized formats
@@ -106,6 +114,8 @@
 	  GLS_ARRAY_RANGE(s_es3StencilRboRenderables) },
 	{ REQUIRED_RENDERABLE | STENCIL_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID,
 	  GLS_ARRAY_RANGE(s_es3StencilRenderables) },
+	{ TEXTURE_VALID,
+	  GLS_ARRAY_RANGE(s_es3NotRenderableTextureFormats) },
 
 	// These are not color-renderable in vanilla ES3, but we need to mark them
 	// as valid for textures, since EXT_color_buffer_(half_)float brings in
diff --git a/modules/gles3/functional/es3fInternalFormatQueryTests.cpp b/modules/gles3/functional/es3fInternalFormatQueryTests.cpp
index 5955250..eefb110 100644
--- a/modules/gles3/functional/es3fInternalFormatQueryTests.cpp
+++ b/modules/gles3/functional/es3fInternalFormatQueryTests.cpp
@@ -64,15 +64,6 @@
 
 		m_testCtx.getLog() << TestLog::Message << "// sample counts is " << sampleCounts << TestLog::EndMessage;
 
-		if (m_isIntegerInternalFormat && sampleCounts != 0)
-		{
-			// Since multisampling is not supported for signed and unsigned integer internal
-			// formats, the value of NUM_SAMPLE_COUNTS will be zero for such formats.
-			m_testCtx.getLog() << TestLog::Message << "// ERROR: integer internal formats should have NUM_SAMPLE_COUNTS = 0; got " << sampleCounts << TestLog::EndMessage;
-			if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
-				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
-		}
-
 		if (sampleCounts == 0)
 			return;
 
@@ -106,26 +97,29 @@
 			}
 		}
 
-		// the maximum value in SAMPLES is guaranteed to be at least the value of MAX_SAMPLES
-		StateQueryMemoryWriteGuard<GLint> maxSamples;
-		glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
-		expectError(GL_NO_ERROR);
-
-		if (maxSamples.verifyValidity(m_testCtx))
+		if (!m_isIntegerInternalFormat)
 		{
-			const GLint maximumFormatSampleCount = samples[0];
-			if (!(maximumFormatSampleCount >= maxSamples))
+			// the maximum value in SAMPLES is guaranteed to be at least the value of MAX_SAMPLES
+			StateQueryMemoryWriteGuard<GLint> maxSamples;
+			glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
+			expectError(GL_NO_ERROR);
+
+			if (maxSamples.verifyValidity(m_testCtx))
 			{
-				m_testCtx.getLog() << TestLog::Message << "// ERROR: Expected maximum value in SAMPLES (" << maximumFormatSampleCount << ") to be at least the value of MAX_SAMPLES (" << maxSamples << ")" << TestLog::EndMessage;
-				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
-					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid maximum sample count");
-			}
+				const GLint maximumFormatSampleCount = samples[0];
+				if (!(maximumFormatSampleCount >= maxSamples))
+				{
+					m_testCtx.getLog() << TestLog::Message << "// ERROR: Expected maximum value in SAMPLES (" << maximumFormatSampleCount << ") to be at least the value of MAX_SAMPLES (" << maxSamples << ")" << TestLog::EndMessage;
+					if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
+						m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid maximum sample count");
+				}
+		  }
 		}
 	}
 
 private:
-	GLenum	m_internalFormat;
-	bool	m_isIntegerInternalFormat;
+	const GLenum	m_internalFormat;
+	const bool		m_isIntegerInternalFormat;
 };
 
 class SamplesBufferSizeCase : public ApiCase
diff --git a/modules/gles3/functional/es3fNegativeBufferApiTests.cpp b/modules/gles3/functional/es3fNegativeBufferApiTests.cpp
index 33871cf..7fdad38 100644
--- a/modules/gles3/functional/es3fNegativeBufferApiTests.cpp
+++ b/modules/gles3/functional/es3fNegativeBufferApiTests.cpp
@@ -1396,11 +1396,6 @@
 			expectError							(GL_INVALID_ENUM);
 			m_log << TestLog::EndSection;
 
-			m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if internalformat is a signed or unsigned integer format and samples is greater than 0.");
-			glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 1, GL_RGBA8UI, 1, 1);
-			expectError							(GL_INVALID_OPERATION);
-			m_log << TestLog::EndSection;
-
 			m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if width or height is less than zero.");
 			glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, -1, 1);
 			expectError							(GL_INVALID_VALUE);
diff --git a/modules/gles3/functional/es3fShaderDerivateTests.cpp b/modules/gles3/functional/es3fShaderDerivateTests.cpp
index 3291e2d..97a948f 100644
--- a/modules/gles3/functional/es3fShaderDerivateTests.cpp
+++ b/modules/gles3/functional/es3fShaderDerivateTests.cpp
@@ -44,6 +44,7 @@
 #include "tcuTextureUtil.hpp"
 #include "tcuRGBA.hpp"
 #include "tcuFloat.hpp"
+#include "tcuInterval.hpp"
 #include "deRandom.hpp"
 #include "deUniquePtr.hpp"
 #include "deString.h"
@@ -218,15 +219,117 @@
 	return tcu::Float32::construct(+1, exp, (1u<<23) | mask).asFloat() - tcu::Float32::construct(+1, exp, 1u<<23).asFloat();
 }
 
+static int getNumMantissaBits (const glu::Precision precision)
+{
+	switch (precision)
+	{
+		case glu::PRECISION_HIGHP:		return 23;
+		case glu::PRECISION_MEDIUMP:	return 10;
+		case glu::PRECISION_LOWP:		return 6;
+		default:
+			DE_ASSERT(false);
+			return 0;
+	}
+}
+
+static int getMinExponent (const glu::Precision precision)
+{
+	switch (precision)
+	{
+		case glu::PRECISION_HIGHP:		return -126;
+		case glu::PRECISION_MEDIUMP:	return -14;
+		case glu::PRECISION_LOWP:		return -8;
+		default:
+			DE_ASSERT(false);
+			return 0;
+	}
+}
+
+static float getSingleULPForExponent (int exp, int numMantissaBits)
+{
+	if (numMantissaBits > 0)
+	{
+		DE_ASSERT(numMantissaBits <= 23);
+
+		const int ulpBitNdx = 23-numMantissaBits;
+		return tcu::Float32::construct(+1, exp, (1<<23) | (1 << ulpBitNdx)).asFloat() - tcu::Float32::construct(+1, exp, (1<<23)).asFloat();
+	}
+	else
+	{
+		DE_ASSERT(numMantissaBits == 0);
+		return tcu::Float32::construct(+1, exp, (1<<23)).asFloat();
+	}
+}
+
+static float getSingleULPForValue (float value, int numMantissaBits)
+{
+	const int exp = tcu::Float32(value).exponent();
+	return getSingleULPForExponent(exp, numMantissaBits);
+}
+
+static float convertFloorFlushToZero (float value, int minExponent, int numAccurateBits)
+{
+	if (value == 0.0f)
+	{
+		return 0.0f;
+	}
+	else
+	{
+		const tcu::Float32	inputFloat			= tcu::Float32(value);
+		const int			numTruncatedBits	= 23-numAccurateBits;
+		const deUint32		truncMask			= (1u<<numTruncatedBits)-1u;
+
+		if (value > 0.0f)
+		{
+			if (value > 0.0f && tcu::Float32(value).exponent() < minExponent)
+			{
+				// flush to zero if possible
+				return 0.0f;
+			}
+			else
+			{
+				// just mask away non-representable bits
+				return tcu::Float32::construct(+1, inputFloat.exponent(), inputFloat.mantissa() & ~truncMask).asFloat();
+			}
+		}
+		else
+		{
+			if (inputFloat.mantissa() & truncMask)
+			{
+				// decrement one ulp if truncated bits are non-zero (i.e. if value is not representable)
+				return tcu::Float32::construct(-1, inputFloat.exponent(), inputFloat.mantissa() & ~truncMask).asFloat() - getSingleULPForExponent(inputFloat.exponent(), numAccurateBits);
+			}
+			else
+			{
+				// value is representable, no need to do anything
+				return value;
+			}
+		}
+	}
+}
+
+static float convertCeilFlushToZero (float value, int minExponent, int numAccurateBits)
+{
+	return -convertFloorFlushToZero(-value, minExponent, numAccurateBits);
+}
+
+static float addErrorUlp (float value, float numUlps, int numMantissaBits)
+{
+	return value + numUlps * getSingleULPForValue(value, numMantissaBits);
+}
+
+enum
+{
+	INTERPOLATION_LOST_BITS = 3, // number mantissa of bits allowed to be lost in varying interpolation
+};
+
 static inline tcu::Vec4 getDerivateThreshold (const glu::Precision precision, const tcu::Vec4& valueMin, const tcu::Vec4& valueMax, const tcu::Vec4& expectedDerivate)
 {
-	const int			baseBits		= precision == glu::PRECISION_HIGHP		? 23	:
-										  precision == glu::PRECISION_MEDIUMP	? 10	:
-										  precision == glu::PRECISION_LOWP		? 6		: 0;
+	const int			baseBits		= getNumMantissaBits(precision);
 	const tcu::UVec4	derivExp		= getCompExpBits(expectedDerivate);
 	const tcu::UVec4	maxValueExp		= max(getCompExpBits(valueMin), getCompExpBits(valueMax));
 	const tcu::UVec4	numBitsLost		= maxValueExp - min(maxValueExp, derivExp);
-	const tcu::IVec4	numAccurateBits	= max(baseBits - numBitsLost.asInt() - 3, tcu::IVec4(0));
+	const tcu::IVec4	numAccurateBits	= max(baseBits - numBitsLost.asInt() - (int)INTERPOLATION_LOST_BITS, tcu::IVec4(0));
 
 	return tcu::Vec4(computeFloatingPointError(expectedDerivate[0], numAccurateBits[0]),
 					 computeFloatingPointError(expectedDerivate[1], numAccurateBits[1]),
@@ -260,6 +363,12 @@
 
 } // anonymous
 
+enum VerificationLogging
+{
+	LOG_ALL = 0,
+	LOG_NOTHING
+};
+
 static bool verifyConstantDerivate (tcu::TestLog&						log,
 									const tcu::ConstPixelBufferAccess&	result,
 									const tcu::PixelBufferAccess&		errorMask,
@@ -267,13 +376,15 @@
 									const tcu::Vec4&					reference,
 									const tcu::Vec4&					threshold,
 									const tcu::Vec4&					scale,
-									const tcu::Vec4&					bias)
+									const tcu::Vec4&					bias,
+									VerificationLogging					logPolicy = LOG_ALL)
 {
 	const int			numComps		= glu::getDataTypeFloatScalars(dataType);
 	const tcu::BVec4	mask			= tcu::logicalNot(getDerivateMask(dataType));
 	int					numFailedPixels	= 0;
 
-	log << TestLog::Message << "Expecting " << LogVecComps(reference, numComps) << " with threshold " << LogVecComps(threshold, numComps) << TestLog::EndMessage;
+	if (logPolicy == LOG_ALL)
+		log << TestLog::Message << "Expecting " << LogVecComps(reference, numComps) << " with threshold " << LogVecComps(threshold, numComps) << TestLog::EndMessage;
 
 	for (int y = 0; y < result.getHeight(); y++)
 	{
@@ -284,7 +395,7 @@
 
 			if (!isOk)
 			{
-				if (numFailedPixels < MAX_FAILED_MESSAGES)
+				if (numFailedPixels < MAX_FAILED_MESSAGES && logPolicy == LOG_ALL)
 					log << TestLog::Message << "FAIL: got " << LogVecComps(resDerivate, numComps)
 											<< ", diff = " << LogVecComps(tcu::abs(reference - resDerivate), numComps)
 											<< ", at x = " << x << ", y = " << y
@@ -295,6 +406,145 @@
 		}
 	}
 
+	if (numFailedPixels >= MAX_FAILED_MESSAGES && logPolicy == LOG_ALL)
+		log << TestLog::Message << "..." << TestLog::EndMessage;
+
+	if (numFailedPixels > 0 && logPolicy == LOG_ALL)
+		log << TestLog::Message << "FAIL: found " << numFailedPixels << " failed pixels" << TestLog::EndMessage;
+
+	return numFailedPixels == 0;
+}
+
+struct Linear2DFunctionEvaluator
+{
+	tcu::Matrix<float, 4, 3> matrix;
+
+	//      .-----.
+	//      | s_x |
+	//  M x | s_y |
+	//      | 1.0 |
+	//      '-----'
+	tcu::Vec4 evaluateAt (float screenX, float screenY) const;
+};
+
+tcu::Vec4 Linear2DFunctionEvaluator::evaluateAt (float screenX, float screenY) const
+{
+	const tcu::Vec3 position(screenX, screenY, 1.0f);
+	return matrix * position;
+}
+
+static bool reverifyConstantDerivateWithFlushRelaxations (tcu::TestLog&							log,
+														  const tcu::ConstPixelBufferAccess&	result,
+														  const tcu::PixelBufferAccess&			errorMask,
+														  glu::DataType							dataType,
+														  glu::Precision						precision,
+														  const tcu::Vec4&						derivScale,
+														  const tcu::Vec4&						derivBias,
+														  const tcu::Vec4&						surfaceThreshold,
+														  DerivateFunc							derivateFunc,
+														  const Linear2DFunctionEvaluator&		function)
+{
+	DE_ASSERT(result.getWidth() == errorMask.getWidth());
+	DE_ASSERT(result.getHeight() == errorMask.getHeight());
+	DE_ASSERT(derivateFunc == DERIVATE_DFDX || derivateFunc == DERIVATE_DFDY);
+
+	const tcu::IVec4	red						(255, 0, 0, 255);
+	const tcu::IVec4	green					(0, 255, 0, 255);
+	const float			divisionErrorUlps		= 2.5f;
+
+	const int			numComponents			= glu::getDataTypeFloatScalars(dataType);
+	const int			numBits					= getNumMantissaBits(precision);
+	const int			minExponent				= getMinExponent(precision);
+
+	const int			numVaryingSampleBits	= numBits - INTERPOLATION_LOST_BITS;
+	int					numFailedPixels			= 0;
+
+	tcu::clear(errorMask, green);
+
+	// search for failed pixels
+	for (int y = 0; y < result.getHeight(); ++y)
+	for (int x = 0; x < result.getWidth(); ++x)
+	{
+		//                 flushToZero?(f2z?(functionValueCurrent) - f2z?(functionValueBefore))
+		// flushToZero? ( ------------------------------------------------------------------------ +- 2.5 ULP )
+		//                                                  dx
+
+		const tcu::Vec4	resultDerivative		= readDerivate(result, derivScale, derivBias, x, y);
+
+		// sample at the front of the back pixel and the back of the front pixel to cover the whole area of
+		// legal sample positions. In general case this is NOT OK, but we know that the target funtion is
+		// (mostly*) linear which allows us to take the sample points at arbitrary points. This gets us the
+		// maximum difference possible in exponents which are used in error bound calculations.
+		// * non-linearity may happen around zero or with very high function values due to subnorms not
+		//   behaving well.
+		const tcu::Vec4	functionValueForward	= (derivateFunc == DERIVATE_DFDX)
+													? (function.evaluateAt(x + 2.0f, y + 0.5f))
+													: (function.evaluateAt(x + 0.5f, y + 2.0f));
+		const tcu::Vec4	functionValueBackward	= (derivateFunc == DERIVATE_DFDX)
+													? (function.evaluateAt(x - 1.0f, y + 0.5f))
+													: (function.evaluateAt(x + 0.5f, y - 1.0f));
+
+		bool	anyComponentFailed				= false;
+
+		// check components separately
+		for (int c = 0; c < numComponents; ++c)
+		{
+			// interpolation value range
+			const tcu::Interval	forwardComponent		(convertFloorFlushToZero(functionValueForward[c], minExponent, numVaryingSampleBits),
+														 convertCeilFlushToZero(functionValueForward[c], minExponent, numVaryingSampleBits));
+			const tcu::Interval	backwardComponent		(convertFloorFlushToZero(functionValueBackward[c], minExponent, numVaryingSampleBits),
+														 convertCeilFlushToZero(functionValueBackward[c], minExponent, numVaryingSampleBits));
+			const int			maxValueExp				= de::max(de::max(tcu::Float32(forwardComponent.lo()).exponent(),   tcu::Float32(forwardComponent.hi()).exponent()),
+																  de::max(tcu::Float32(backwardComponent.lo()).exponent(),  tcu::Float32(backwardComponent.hi()).exponent()));
+
+			// subtraction in nominator will likely cause a cancellation of the most
+			// significant bits. Apply error bounds.
+
+			const tcu::Interval	nominator				(forwardComponent - backwardComponent);
+			const int			nominatorLoExp			= tcu::Float32(nominator.lo()).exponent();
+			const int			nominatorHiExp			= tcu::Float32(nominator.hi()).exponent();
+			const int			nominatorLoBitsLost		= maxValueExp - nominatorLoExp;
+			const int			nominatorHiBitsLost		= maxValueExp - nominatorHiExp;
+			const int			nominatorLoBits			= de::max(0, numBits - nominatorLoBitsLost);
+			const int			nominatorHiBits			= de::max(0, numBits - nominatorHiBitsLost);
+
+			const tcu::Interval	nominatorRange			(convertFloorFlushToZero(nominator.lo(), minExponent, nominatorLoBits),
+														 convertCeilFlushToZero(nominator.hi(), minExponent, nominatorHiBits));
+
+			const tcu::Interval	divisionRange			= nominatorRange / 3.0f; // legal sample area is anywhere within this and neighboring pixels (i.e. size = 3)
+			const tcu::Interval	divisionResultRange		(convertFloorFlushToZero(addErrorUlp(divisionRange.lo(), -divisionErrorUlps, numBits), minExponent, numBits),
+														 convertCeilFlushToZero(addErrorUlp(divisionRange.hi(), +divisionErrorUlps, numBits), minExponent, numBits));
+			const tcu::Interval	finalResultRange		(divisionResultRange.lo() - surfaceThreshold[c], divisionResultRange.hi() + surfaceThreshold[c]);
+
+			if (resultDerivative[c] >= finalResultRange.lo() && resultDerivative[c] <= finalResultRange.hi())
+			{
+				// value ok
+			}
+			else
+			{
+				if (numFailedPixels < MAX_FAILED_MESSAGES)
+					log << tcu::TestLog::Message
+						<< "Error in pixel at " << x << ", " << y << " with component " << c << " (channel " << ("rgba"[c]) << ")\n"
+						<< "\tGot pixel value " << result.getPixelInt(x, y) << "\n"
+						<< "\t\tdFd" << ((derivateFunc == DERIVATE_DFDX) ? ('x') : ('y')) << " ~= " << resultDerivative[c] << "\n"
+						<< "\t\tdifference to a valid range: "
+							<< ((resultDerivative[c] < finalResultRange.lo()) ? ("-") : ("+"))
+							<< ((resultDerivative[c] < finalResultRange.lo()) ? (finalResultRange.lo() - resultDerivative[c]) : (resultDerivative[c] - finalResultRange.hi()))
+							<< "\n"
+						<< "\tDerivative value range:\n"
+						<< "\t\tMin: " << finalResultRange.lo() << "\n"
+						<< "\t\tMax: " << finalResultRange.hi() << "\n"
+						<< tcu::TestLog::EndMessage;
+
+				++numFailedPixels;
+				anyComponentFailed = true;
+			}
+		}
+
+		if (anyComponentFailed)
+			errorMask.setPixel(red, x, y);
+	}
+
 	if (numFailedPixels >= MAX_FAILED_MESSAGES)
 		log << TestLog::Message << "..." << TestLog::EndMessage;
 
@@ -428,7 +678,15 @@
 		TCU_CHECK(gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
 	}
 	else
-		m_testCtx.getLog() << TestLog::Message << "Rendering to default framebuffer" << TestLog::EndMessage;
+	{
+		const tcu::PixelFormat pixelFormat = m_context.getRenderTarget().getPixelFormat();
+
+		m_testCtx.getLog()
+			<< TestLog::Message
+			<< "Rendering to default framebuffer\n"
+			<< "\tColor depth: R=" << pixelFormat.redBits << ", G=" << pixelFormat.greenBits << ", B=" << pixelFormat.blueBits << ", A=" << pixelFormat.alphaBits
+			<< TestLog::EndMessage;
+	}
 
 	m_testCtx.getLog() << TestLog::Message << "in: " << m_coordMin << " -> " << m_coordMax << "\n"
 										   << "v_coord.x = in.x * x\n"
@@ -465,6 +723,7 @@
 
 		gl.clearColor(0.125f, 0.25f, 0.5f, 1.0f);
 		gl.clear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
+		gl.disable(GL_DITHER);
 
 		gl.useProgram(program.getProgram());
 
@@ -804,9 +1063,54 @@
 		const tcu::Vec4		reference	= ((m_coordMax - m_coordMin) / div) * scale;
 		const tcu::Vec4		opThreshold	= getDerivateThreshold(m_precision, m_coordMin*scale, m_coordMax*scale, reference);
 		const tcu::Vec4		threshold	= max(surfaceThreshold, opThreshold);
+		const int			numComps	= glu::getDataTypeFloatScalars(m_dataType);
 
-		return verifyConstantDerivate(m_testCtx.getLog(), result, errorMask, m_dataType,
-									  reference, threshold, m_derivScale, m_derivBias);
+		m_testCtx.getLog()
+			<< tcu::TestLog::Message
+			<< "Verifying result image.\n"
+			<< "\tValid derivative is " << LogVecComps(reference, numComps) << " with threshold " << LogVecComps(threshold, numComps)
+			<< tcu::TestLog::EndMessage;
+
+		// short circuit if result is strictly within the normal value error bounds.
+		// This improves performance significantly.
+		if (verifyConstantDerivate(m_testCtx.getLog(), result, errorMask, m_dataType,
+								   reference, threshold, m_derivScale, m_derivBias,
+								   LOG_NOTHING))
+		{
+			m_testCtx.getLog()
+				<< tcu::TestLog::Message
+				<< "No incorrect derivatives found, result valid."
+				<< tcu::TestLog::EndMessage;
+
+			return true;
+		}
+
+		// some pixels exceed error bounds calculated for normal values. Verify that these
+		// potentially invalid pixels are in fact valid due to (for example) subnorm flushing.
+
+		m_testCtx.getLog()
+			<< tcu::TestLog::Message
+			<< "Initial verification failed, verifying image by calculating accurate error bounds for each result pixel.\n"
+			<< "\tVerifying each result derivative is within its range of legal result values."
+			<< tcu::TestLog::EndMessage;
+
+		{
+			const tcu::IVec2			viewportSize	= getViewportSize();
+			const float					w				= float(viewportSize.x());
+			const float					h				= float(viewportSize.y());
+			const tcu::Vec4				valueRamp		= (m_coordMax - m_coordMin);
+			Linear2DFunctionEvaluator	function;
+
+			function.matrix.setRow(0, tcu::Vec3(valueRamp.x() / w, 0.0f, m_coordMin.x()));
+			function.matrix.setRow(1, tcu::Vec3(0.0f, valueRamp.y() / h, m_coordMin.y()));
+			function.matrix.setRow(2, tcu::Vec3(valueRamp.z() / w, valueRamp.z() / h, m_coordMin.z() + m_coordMin.z()) / 2.0f);
+			function.matrix.setRow(3, tcu::Vec3(-valueRamp.w() / w, -valueRamp.w() / h, m_coordMax.w() + m_coordMax.w()) / 2.0f);
+
+			return reverifyConstantDerivateWithFlushRelaxations(m_testCtx.getLog(), result, errorMask,
+																m_dataType, m_precision, m_derivScale,
+																m_derivBias, surfaceThreshold, m_func,
+																function);
+		}
 	}
 	else
 	{
@@ -1054,9 +1358,51 @@
 		const tcu::Vec4		reference	= ((m_texValueMax - m_texValueMin) / div) * scale;
 		const tcu::Vec4		opThreshold	= getDerivateThreshold(m_precision, m_texValueMin*scale, m_texValueMax*scale, reference);
 		const tcu::Vec4		threshold	= max(surfaceThreshold, opThreshold);
+		const int			numComps	= glu::getDataTypeFloatScalars(m_dataType);
 
-		return verifyConstantDerivate(m_testCtx.getLog(), compareArea, maskArea, m_dataType,
-									  reference, threshold, m_derivScale, m_derivBias);
+		m_testCtx.getLog()
+			<< tcu::TestLog::Message
+			<< "Verifying result image.\n"
+			<< "\tValid derivative is " << LogVecComps(reference, numComps) << " with threshold " << LogVecComps(threshold, numComps)
+			<< tcu::TestLog::EndMessage;
+
+		// short circuit if result is strictly within the normal value error bounds.
+		// This improves performance significantly.
+		if (verifyConstantDerivate(m_testCtx.getLog(), compareArea, maskArea, m_dataType,
+								   reference, threshold, m_derivScale, m_derivBias,
+								   LOG_NOTHING))
+		{
+			m_testCtx.getLog()
+				<< tcu::TestLog::Message
+				<< "No incorrect derivatives found, result valid."
+				<< tcu::TestLog::EndMessage;
+
+			return true;
+		}
+
+		// some pixels exceed error bounds calculated for normal values. Verify that these
+		// potentially invalid pixels are in fact valid due to (for example) subnorm flushing.
+
+		m_testCtx.getLog()
+			<< tcu::TestLog::Message
+			<< "Initial verification failed, verifying image by calculating accurate error bounds for each result pixel.\n"
+			<< "\tVerifying each result derivative is within its range of legal result values."
+			<< tcu::TestLog::EndMessage;
+
+		{
+			const tcu::Vec4				valueRamp		= (m_texValueMax - m_texValueMin);
+			Linear2DFunctionEvaluator	function;
+
+			function.matrix.setRow(0, tcu::Vec3(valueRamp.x() / w, 0.0f, m_texValueMin.x()));
+			function.matrix.setRow(1, tcu::Vec3(0.0f, valueRamp.y() / h, m_texValueMin.y()));
+			function.matrix.setRow(2, tcu::Vec3(valueRamp.z() / w, valueRamp.z() / h, m_texValueMin.z() + m_texValueMin.z()) / 2.0f);
+			function.matrix.setRow(3, tcu::Vec3(-valueRamp.w() / w, -valueRamp.w() / h, m_texValueMax.w() + m_texValueMax.w()) / 2.0f);
+
+			return reverifyConstantDerivateWithFlushRelaxations(m_testCtx.getLog(), compareArea, maskArea,
+																m_dataType, m_precision, m_derivScale,
+																m_derivBias, surfaceThreshold, m_func,
+																function);
+		}
 	}
 	else
 	{
diff --git a/modules/gles31/functional/es31fAdvancedBlendTests.cpp b/modules/gles31/functional/es31fAdvancedBlendTests.cpp
index dcde00f..aed9395 100644
--- a/modules/gles31/functional/es31fAdvancedBlendTests.cpp
+++ b/modules/gles31/functional/es31fAdvancedBlendTests.cpp
@@ -419,10 +419,15 @@
 
 		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to set render state");
 
+		gl.clear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
+
 		gl.disable(GL_BLEND);
 		gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, DE_NULL);
 		gl.enable(GL_BLEND);
 
+		if (!m_coherentBlending)
+			gl.blendBarrierKHR();
+
 		if (m_coherentBlending)
 		{
 			gl.drawElements(GL_TRIANGLES, 6*(numQuads-1), GL_UNSIGNED_SHORT, (const void*)(deUintptr)(6*sizeof(deUint16)));
diff --git a/modules/gles31/functional/es31fInternalFormatQueryTests.cpp b/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
index 2251aa7..d91f84d 100644
--- a/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
+++ b/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
@@ -53,27 +53,32 @@
 	void				init				(void);
 	IterateResult		iterate				(void);
 
-	const glw::GLenum	m_texTarget;
+	const glw::GLenum	m_target;
 	const glw::GLenum	m_internalFormat;
 	const FormatType	m_type;
 };
 
-FormatSamplesCase::FormatSamplesCase (Context& ctx, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum internalFormat, FormatType type)
+FormatSamplesCase::FormatSamplesCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, glw::GLenum internalFormat, FormatType type)
 	: TestCase			(ctx, name, desc)
-	, m_texTarget		(texTarget)
+	, m_target			(target)
 	, m_internalFormat	(internalFormat)
 	, m_type			(type)
 {
-	DE_ASSERT(m_texTarget == GL_TEXTURE_2D_MULTISAMPLE || m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
+	DE_ASSERT(m_target == GL_TEXTURE_2D_MULTISAMPLE 		||
+			  m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY 	||
+			  m_target == GL_RENDERBUFFER);
 }
 
 void FormatSamplesCase::init (void)
 {
-	if (m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+	const bool isTextureTarget = (m_target == GL_TEXTURE_2D_MULTISAMPLE) ||
+								 (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
+
+	if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
 		throw tcu::NotSupportedError("Test requires OES_texture_storage_multisample_2d_array extension");
 
 	// stencil8 textures are not supported without GL_OES_texture_stencil8 extension
-	if (m_internalFormat == GL_STENCIL_INDEX8 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_stencil8"))
+	if (isTextureTarget && m_internalFormat == GL_STENCIL_INDEX8 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_stencil8"))
 		throw tcu::NotSupportedError("Test requires GL_OES_texture_stencil8 extension");
 }
 
@@ -103,7 +108,7 @@
 
 	// Number of sample counts
 	{
-		gl.getInternalformativ(m_texTarget, m_internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &numSampleCounts);
+		gl.getInternalformativ(m_target, m_internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &numSampleCounts);
 		GLU_EXPECT_NO_ERROR(gl.getError(), "get GL_NUM_SAMPLE_COUNTS");
 
 		m_testCtx.getLog() << tcu::TestLog::Message << "GL_NUM_SAMPLE_COUNTS = " << numSampleCounts << tcu::TestLog::EndMessage;
@@ -124,7 +129,7 @@
 		{
 			samples.resize(numSampleCounts, -1);
 
-			gl.getInternalformativ(m_texTarget, m_internalFormat, GL_SAMPLES, numSampleCounts, &samples[0]);
+			gl.getInternalformativ(m_target, m_internalFormat, GL_SAMPLES, numSampleCounts, &samples[0]);
 			GLU_EXPECT_NO_ERROR(gl.getError(), "get GL_SAMPLES");
 		}
 		else
@@ -401,6 +406,7 @@
 		deUint32	target;
 	} textureTargets[] =
 	{
+		{ "renderbuffer",					GL_RENDERBUFFER					},
 		{ "texture_2d_multisample",			GL_TEXTURE_2D_MULTISAMPLE		},
 		{ "texture_2d_multisample_array",	GL_TEXTURE_2D_MULTISAMPLE_ARRAY	},
 	};
diff --git a/modules/gles31/functional/es31fLayoutBindingTests.cpp b/modules/gles31/functional/es31fLayoutBindingTests.cpp
index 21ee901..70672ca 100644
--- a/modules/gles31/functional/es31fLayoutBindingTests.cpp
+++ b/modules/gles31/functional/es31fLayoutBindingTests.cpp
@@ -673,7 +673,7 @@
 			break;
 
 		case SHADERTYPE_BOTH:
-			maxUnits = maxCombinedUnits/2;
+			maxUnits = de::min(de::min(maxVertexUnits, maxFragmentUnits), maxCombinedUnits/2);
 			break;
 
 		default:
@@ -691,9 +691,19 @@
 		case TESTTYPE_BINDING_MULTIPLE:
 		case TESTTYPE_BINDING_ARRAY:
 		case TESTTYPE_BINDING_MAX_ARRAY:
-			if (maxUnits < 2)
-				throw tcu::NotSupportedError("Not enough uniforms available for test");
-			m_numBindings = rnd.getInt(2, deMin32(MAX_UNIFORM_ARRAY_SIZE, maxUnits));
+			if (m_errorType == ERRORTYPE_CONTRADICTORY)
+			{
+				// leave room for contradictory case
+				if (maxUnits < 3)
+					throw tcu::NotSupportedError("Not enough uniforms available for test");
+				m_numBindings = rnd.getInt(2, deMin32(MAX_UNIFORM_ARRAY_SIZE, maxUnits-1));
+			}
+			else
+			{
+				if (maxUnits < 2)
+					throw tcu::NotSupportedError("Not enough uniforms available for test");
+				m_numBindings = rnd.getInt(2, deMin32(MAX_UNIFORM_ARRAY_SIZE, maxUnits));
+			}
 			break;
 
 		default:
@@ -711,6 +721,8 @@
 	// Check that we have enough binding points to perform the tests
 	if (numBindingPoints < m_numBindings)
 		throw tcu::NotSupportedError("Not enough binding points available for test");
+	if (m_errorType == ERRORTYPE_CONTRADICTORY && numBindingPoints == m_numBindings)
+		throw tcu::NotSupportedError("Not enough binding points available for test");
 
 	// Initialize the binding points i.e. populate the two binding point vectors
 	initBindingPoints(0, numBindingPoints);
@@ -778,7 +790,7 @@
 
 		case ERRORTYPE_LESS_THAN_ZERO:	// Select a random negative binding point
 		{
-			const glw::GLint binding = -rnd.getInt(1, numBindingPoints-m_numBindings);
+			const glw::GLint binding = -rnd.getInt(1, m_numBindings);
 			m_vertexShaderBinding.push_back(binding);
 			m_fragmentShaderBinding.push_back(binding);
 			break;
@@ -787,7 +799,8 @@
 		case ERRORTYPE_CONTRADICTORY:	// Select two valid, but contradictory binding points
 		{
 			m_vertexShaderBinding.push_back(minBindingPoint);
-			m_fragmentShaderBinding.push_back(numBindingPoints-m_numBindings);
+			m_fragmentShaderBinding.push_back((minBindingPoint+1)%numBindingPoints);
+			DE_ASSERT(m_vertexShaderBinding.back() != m_fragmentShaderBinding.back());
 			break;
 		}
 
@@ -1612,7 +1625,7 @@
 	// Generate the shader body for the vertex and fragment shaders
 	for (int bindNdx = 0; bindNdx < m_numBindings*2; ++bindNdx)	// Multiply by two to cover cases for both colors for each UBO
 	{
-		const std::string uname = (arrayInstance ? getUniformName("colors", 0, m_numBindings) : getUniformName("colors", bindNdx/2));
+		const std::string uname = (arrayInstance ? getUniformName("colors", 0, bindNdx/2) : getUniformName("colors", bindNdx/2));
 		shaderBody	<< "	" << (bindNdx == 0 ? "if" : "else if") << " (u_arrayNdx == " << de::toString(bindNdx) << ")\n"
 					<< "	{\n"
 					<< "		color = " << uname << (bindNdx%2 == 0 ? ".color1" : ".color2") << ";\n"
diff --git a/modules/gles31/functional/es31fNegativeBufferApiTests.cpp b/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
index 3c9e27b..9f63623 100644
--- a/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
@@ -1396,8 +1396,11 @@
 {
 	deUint32							rbo = 0x1234;
 	int									maxSamplesSupportedRGBA4 = -1;
+	int									maxSamplesSupportedRGBA8UI = -1;
 
 	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA4, GL_SAMPLES, 1, &maxSamplesSupportedRGBA4);
+	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA8UI, GL_SAMPLES, 1, &maxSamplesSupportedRGBA8UI);
+
 	ctx.glGenRenderbuffers					(1, &rbo);
 	ctx.glBindRenderbuffer					(GL_RENDERBUFFER, rbo);
 
@@ -1427,8 +1430,8 @@
 	ctx.expectError							(GL_INVALID_ENUM);
 	ctx.endSection();
 
-	ctx.beginSection("GL_INVALID_OPERATION is generated if internalformat is a signed or unsigned integer format and samples is greater than 0.");
-	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 1, GL_RGBA8UI, 1, 1);
+	ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat. (Unsigned integer format)");
+	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, maxSamplesSupportedRGBA8UI+1, GL_RGBA8UI, 1, 1);
 	ctx.expectError							(GL_INVALID_OPERATION);
 	ctx.endSection();
 
diff --git a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
index ccc0d80..5dca33b 100644
--- a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
@@ -893,6 +893,35 @@
 	return numComponents;
 }
 
+static int getFragmentOutputMaxLocation (const ProgramInterfaceDefinition::Shader* shader)
+{
+	DE_ASSERT(shader->getType() == glu::SHADERTYPE_FRAGMENT);
+
+	int maxOutputLocation = -1;
+
+	for (int ndx = 0; ndx < (int)shader->getDefaultBlock().variables.size(); ++ndx)
+	{
+		if (shader->getDefaultBlock().variables[ndx].storage == glu::STORAGE_OUT)
+		{
+			// missing location qualifier means location == 0
+			const int outputLocation 		= (shader->getDefaultBlock().variables[ndx].layout.location == -1)
+												? (0)
+												: (shader->getDefaultBlock().variables[ndx].layout.location);
+
+			// only basic types or arrays of basic types possible
+			DE_ASSERT(!shader->getDefaultBlock().variables[ndx].varType.isStructType());
+
+			const int locationSlotsTaken	= (shader->getDefaultBlock().variables[ndx].varType.isArrayType())
+												? (shader->getDefaultBlock().variables[ndx].varType.getArraySize())
+												: (1);
+
+			maxOutputLocation = de::max(maxOutputLocation, outputLocation + locationSlotsTaken - 1);
+		}
+	}
+
+	return maxOutputLocation;
+}
+
 } // anonymous
 
 std::vector<std::string> getProgramInterfaceBlockMemberResourceList (const glu::InterfaceBlock& interfaceBlock)
@@ -1315,27 +1344,28 @@
 {
 	ProgramInterfaceDefinition::ProgramResourceUsage retVal;
 
-	retVal.uniformBufferMaxBinding				= 0;
+	retVal.uniformBufferMaxBinding				= -1; // max binding is inclusive upper bound. Allow 0 bindings by using negative value
 	retVal.uniformBufferMaxSize					= 0;
 	retVal.numUniformBlocks						= 0;
 	retVal.numCombinedVertexUniformComponents	= 0;
 	retVal.numCombinedFragmentUniformComponents	= 0;
-	retVal.shaderStorageBufferMaxBinding		= 0;
+	retVal.shaderStorageBufferMaxBinding		= -1; // see above
 	retVal.shaderStorageBufferMaxSize			= 0;
 	retVal.numShaderStorageBlocks				= 0;
 	retVal.numVaryingComponents					= 0;
 	retVal.numVaryingVectors					= 0;
 	retVal.numCombinedSamplers					= 0;
-	retVal.atomicCounterBufferMaxBinding		= 0;
+	retVal.atomicCounterBufferMaxBinding		= -1; // see above
 	retVal.atomicCounterBufferMaxSize			= 0;
 	retVal.numAtomicCounterBuffers				= 0;
 	retVal.numAtomicCounters					= 0;
-	retVal.maxImageBinding						= 0;
+	retVal.maxImageBinding						= -1; // see above
 	retVal.numCombinedImages					= 0;
 	retVal.numCombinedOutputResources			= 0;
 	retVal.numXFBInterleavedComponents			= 0;
 	retVal.numXFBSeparateAttribs				= 0;
 	retVal.numXFBSeparateComponents				= 0;
+	retVal.fragmentOutputMaxBinding				= -1; // see above
 
 	for (int shaderNdx = 0; shaderNdx < (int)program->getShaders().size(); ++shaderNdx)
 	{
@@ -1372,8 +1402,12 @@
 
 		retVal.numCombinedOutputResources		+= getNumTypeInstances(shader, glu::STORAGE_UNIFORM, glu::isDataTypeImage);
 		retVal.numCombinedOutputResources		+= getNumShaderBlocks(shader, glu::STORAGE_BUFFER);
+
 		if (shader->getType() == glu::SHADERTYPE_FRAGMENT)
+		{
 			retVal.numCombinedOutputResources += getNumVectors(shader, glu::STORAGE_OUT);
+			retVal.fragmentOutputMaxBinding = de::max(retVal.fragmentOutputMaxBinding, getFragmentOutputMaxLocation(shader));
+		}
 	}
 
 	if (program->getTransformFeedbackMode() == GL_INTERLEAVED_ATTRIBS)
diff --git a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.hpp b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.hpp
index 0117013..ac24fce 100644
--- a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.hpp
+++ b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.hpp
@@ -147,6 +147,7 @@
 	int numXFBInterleavedComponents;
 	int numXFBSeparateAttribs;
 	int numXFBSeparateComponents;
+	int fragmentOutputMaxBinding;
 };
 
 } // ProgramInterfaceDefinition
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp b/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
index 728d13a..a8a86e9 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
@@ -2117,7 +2117,7 @@
 		{ GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE,					usage.atomicCounterBufferMaxSize			},
 		{ GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS,				usage.numAtomicCounterBuffers				},
 		{ GL_MAX_COMBINED_ATOMIC_COUNTERS,						usage.numAtomicCounters						},
-		{ GL_MAX_IMAGE_UNITS,									usage.maxImageBinding						},
+		{ GL_MAX_IMAGE_UNITS,									usage.maxImageBinding+1						},
 		{ GL_MAX_COMBINED_IMAGE_UNIFORMS,						usage.numCombinedImages						},
 		{ GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,				usage.shaderStorageBufferMaxBinding+1		},
 		{ GL_MAX_SHADER_STORAGE_BLOCK_SIZE,						usage.shaderStorageBufferMaxSize			},
@@ -2125,6 +2125,7 @@
 		{ GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS,		usage.numXFBInterleavedComponents			},
 		{ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,			usage.numXFBSeparateAttribs					},
 		{ GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS,		usage.numXFBSeparateComponents				},
+		{ GL_MAX_DRAW_BUFFERS,									usage.fragmentOutputMaxBinding+1			},
 	};
 
 	bool allOk = true;
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
index cf22cb1..c55237a 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
@@ -953,45 +953,48 @@
 
 		if (index == GL_INVALID_INDEX)
 		{
-			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource " << referenceResources[ndx] << " got index GL_INVALID_INDEX." << tcu::TestLog::EndMessage;
+			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource \"" << referenceResources[ndx] << "\" got index GL_INVALID_INDEX." << tcu::TestLog::EndMessage;
 			error = true;
 		}
 		else if ((int)index >= (int)resourceList.size())
 		{
-			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource " << referenceResources[ndx] << " got index " << index << " (larger or equal to GL_ACTIVE_RESOURCES)." << tcu::TestLog::EndMessage;
+			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource \"" << referenceResources[ndx] << "\" got index " << index << " (larger or equal to GL_ACTIVE_RESOURCES)." << tcu::TestLog::EndMessage;
 			error = true;
 		}
 		else if (resourceList[index] != referenceResources[ndx])
 		{
-			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource " << referenceResources[ndx] << " got index (index = " << index << ") of another resource (" << resourceList[index] << ")." << tcu::TestLog::EndMessage;
+			m_testCtx.getLog() << tcu::TestLog::Message << "Error, for active resource \"" << referenceResources[ndx] << "\" got index (index = " << index << ") of another resource (" << resourceList[index] << ")." << tcu::TestLog::EndMessage;
 			error = true;
 		}
 	}
 
-	// Query for "name" should match "name[0]"
+	// Query for "name" should match "name[0]" except for XFB
 
-	for (int ndx = 0; ndx < (int)referenceResources.size(); ++ndx)
+	if (m_programInterface != PROGRAMINTERFACE_TRANSFORM_FEEDBACK_VARYING)
 	{
-		if (stringEndsWith(referenceResources[ndx], "[0]"))
+		for (int ndx = 0; ndx < (int)referenceResources.size(); ++ndx)
 		{
-			const std::string	queryString	= referenceResources[ndx].substr(0, referenceResources[ndx].length()-3);
-			const glw::GLuint	index		= gl.getProgramResourceIndex(program, programInterface, queryString.c_str());
-			GLU_EXPECT_NO_ERROR(gl.getError(), "query resource index");
+			if (stringEndsWith(referenceResources[ndx], "[0]"))
+			{
+				const std::string	queryString	= referenceResources[ndx].substr(0, referenceResources[ndx].length()-3);
+				const glw::GLuint	index		= gl.getProgramResourceIndex(program, programInterface, queryString.c_str());
+				GLU_EXPECT_NO_ERROR(gl.getError(), "query resource index");
 
-			if (index == GL_INVALID_INDEX)
-			{
-				m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for " << queryString << " resulted in index GL_INVALID_INDEX." << tcu::TestLog::EndMessage;
-				error = true;
-			}
-			else if ((int)index >= (int)resourceList.size())
-			{
-				m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for " << queryString << " resulted in index " << index << " (larger or equal to GL_ACTIVE_RESOURCES)." << tcu::TestLog::EndMessage;
-				error = true;
-			}
-			else if (resourceList[index] != queryString + "[0]")
-			{
-				m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for " << queryString << " got index (index = " << index << ") of another resource (" << resourceList[index] << ")." << tcu::TestLog::EndMessage;
-				error = true;
+				if (index == GL_INVALID_INDEX)
+				{
+					m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for \"" << queryString << "\" resulted in index GL_INVALID_INDEX." << tcu::TestLog::EndMessage;
+					error = true;
+				}
+				else if ((int)index >= (int)resourceList.size())
+				{
+					m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for \"" << queryString << "\" resulted in index " << index << " (larger or equal to GL_ACTIVE_RESOURCES)." << tcu::TestLog::EndMessage;
+					error = true;
+				}
+				else if (resourceList[index] != queryString + "[0]")
+				{
+					m_testCtx.getLog() << tcu::TestLog::Message << "Error, query for \"" << queryString << "\" got index (index = " << index << ") of another resource (\"" << resourceList[index] << "\")." << tcu::TestLog::EndMessage;
+					error = true;
+				}
 			}
 		}
 	}
@@ -4839,7 +4842,7 @@
 		}
 		// .var_array_explicit_location
 		{
-			const ResourceDefinition::Node::SharedPtr layout	(new ResourceDefinition::LayoutQualifier(output, glu::Layout(2)));
+			const ResourceDefinition::Node::SharedPtr layout	(new ResourceDefinition::LayoutQualifier(output, glu::Layout(1)));
 			const ResourceDefinition::Node::SharedPtr arrayElem	(new ResourceDefinition::ArrayElement(layout));
 			const ResourceDefinition::Node::SharedPtr variable	(new ResourceDefinition::Variable(arrayElem, glu::TYPE_FLOAT_VEC4));
 			targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var_array_explicit_location"));
diff --git a/modules/gles31/functional/es31fSeparateShaderTests.cpp b/modules/gles31/functional/es31fSeparateShaderTests.cpp
index e73ac09..90d7161 100644
--- a/modules/gles31/functional/es31fSeparateShaderTests.cpp
+++ b/modules/gles31/functional/es31fSeparateShaderTests.cpp
@@ -79,7 +79,6 @@
 using glu::CallLogWrapper;
 using glu::DataType;
 using glu::VariableDeclaration;
-using glu::Interpolation;
 using glu::Precision;
 using glu::Program;
 using glu::ProgramPipeline;
@@ -107,6 +106,17 @@
 	VIEWPORT_SIZE = 128
 };
 
+enum VaryingInterpolation
+{
+	VARYINGINTERPOLATION_SMOOTH		= 0,
+	VARYINGINTERPOLATION_FLAT,
+	VARYINGINTERPOLATION_CENTROID,
+	VARYINGINTERPOLATION_DEFAULT,
+	VARYINGINTERPOLATION_RANDOM,
+
+	VARYINGINTERPOLATION_LAST
+};
+
 DataType randomType (Random& rnd)
 {
 	using namespace glu;
@@ -131,11 +141,49 @@
 	return TYPE_INVALID;
 }
 
-Interpolation randomInterpolation (Random& rnd)
+VaryingInterpolation randomInterpolation (Random& rnd)
 {
-	return Interpolation(rnd.getInt(0, glu::INTERPOLATION_LAST - 1));
+	static const VaryingInterpolation s_validInterpolations[] =
+	{
+		VARYINGINTERPOLATION_SMOOTH,
+		VARYINGINTERPOLATION_FLAT,
+		VARYINGINTERPOLATION_CENTROID,
+		VARYINGINTERPOLATION_DEFAULT,
+	};
+	return s_validInterpolations[rnd.getInt(0, DE_LENGTH_OF_ARRAY(s_validInterpolations)-1)];
 }
 
+glu::Interpolation getGluInterpolation (VaryingInterpolation interpolation)
+{
+	switch (interpolation)
+	{
+		case VARYINGINTERPOLATION_SMOOTH:	return glu::INTERPOLATION_SMOOTH;
+		case VARYINGINTERPOLATION_FLAT:		return glu::INTERPOLATION_FLAT;
+		case VARYINGINTERPOLATION_CENTROID:	return glu::INTERPOLATION_CENTROID;
+		case VARYINGINTERPOLATION_DEFAULT:	return glu::INTERPOLATION_LAST;		//!< Last means no qualifier, i.e. default
+		default:
+			DE_ASSERT(!"Invalid interpolation");
+			return glu::INTERPOLATION_LAST;
+	}
+}
+
+// used only for debug sanity checks
+#if defined(DE_DEBUG)
+VaryingInterpolation getVaryingInterpolation (glu::Interpolation interpolation)
+{
+	switch (interpolation)
+	{
+		case glu::INTERPOLATION_SMOOTH:		return VARYINGINTERPOLATION_SMOOTH;
+		case glu::INTERPOLATION_FLAT:		return VARYINGINTERPOLATION_FLAT;
+		case glu::INTERPOLATION_CENTROID:	return VARYINGINTERPOLATION_CENTROID;
+		case glu::INTERPOLATION_LAST:		return VARYINGINTERPOLATION_DEFAULT;		//!< Last means no qualifier, i.e. default
+		default:
+			DE_ASSERT(!"Invalid interpolation");
+			return VARYINGINTERPOLATION_LAST;
+	}
+}
+#endif
+
 enum BindingKind
 {
 	BINDING_NAME,
@@ -220,18 +268,18 @@
 
 struct VaryingParams
 {
-	VaryingParams 			(void)
+	VaryingParams			(void)
 		: count				(0)
 		, type				(glu::TYPE_LAST)
 		, binding			(BINDING_LAST)
-		, vtxInterp			(glu::INTERPOLATION_LAST)
-		, frgInterp			(glu::INTERPOLATION_LAST) {}
+		, vtxInterp			(VARYINGINTERPOLATION_LAST)
+		, frgInterp			(VARYINGINTERPOLATION_LAST) {}
 
 	int						count;
 	DataType				type;
 	BindingKind				binding;
-	Interpolation			vtxInterp;
-	Interpolation			frgInterp;
+	VaryingInterpolation	vtxInterp;
+	VaryingInterpolation	frgInterp;
 };
 
 struct VaryingInterface
@@ -243,17 +291,36 @@
 // Generate corresponding input and output variable declarations that may vary
 // in compatible ways.
 
-Interpolation chooseInterpolation (Interpolation param, DataType type, Random& rnd)
+VaryingInterpolation chooseInterpolation (VaryingInterpolation param, DataType type, Random& rnd)
 {
 	if (glu::getDataTypeScalarType(type) != glu::TYPE_FLOAT)
-		return glu::INTERPOLATION_FLAT;
+		return VARYINGINTERPOLATION_FLAT;
 
-	if (param == glu::INTERPOLATION_LAST)
+	if (param == VARYINGINTERPOLATION_RANDOM)
 		return randomInterpolation(rnd);
 
 	return param;
 }
 
+bool isSSOCompatibleInterpolation (VaryingInterpolation vertexInterpolation, VaryingInterpolation fragmentInterpolation)
+{
+	// interpolations must be fully specified
+	DE_ASSERT(vertexInterpolation != VARYINGINTERPOLATION_RANDOM);
+	DE_ASSERT(vertexInterpolation < VARYINGINTERPOLATION_LAST);
+	DE_ASSERT(fragmentInterpolation != VARYINGINTERPOLATION_RANDOM);
+	DE_ASSERT(fragmentInterpolation < VARYINGINTERPOLATION_LAST);
+
+	// interpolation can only be either smooth or flat. Auxiliary storage does not matter.
+	const bool isSmoothVtx =    (vertexInterpolation == VARYINGINTERPOLATION_SMOOTH)      || //!< trivial
+	                            (vertexInterpolation == VARYINGINTERPOLATION_DEFAULT)     || //!< default to smooth
+	                            (vertexInterpolation == VARYINGINTERPOLATION_CENTROID);      //!< default to smooth, ignore storage
+	const bool isSmoothFrag =   (fragmentInterpolation == VARYINGINTERPOLATION_SMOOTH)    || //!< trivial
+	                            (fragmentInterpolation == VARYINGINTERPOLATION_DEFAULT)   || //!< default to smooth
+	                            (fragmentInterpolation == VARYINGINTERPOLATION_CENTROID);    //!< default to smooth, ignore storage
+	// Khronos bug #12630: flat / smooth qualifiers must match in SSO
+	return isSmoothVtx == isSmoothFrag;
+}
+
 VaryingInterface genVaryingInterface (const VaryingParams&		params,
 									  Random&					rnd)
 {
@@ -264,19 +331,21 @@
 
 	for (int varNdx = 0; varNdx < params.count; ++varNdx)
 	{
-		const BindingKind	binding			= ((params.binding == BINDING_LAST)
-											   ? randomBinding(rnd) : params.binding);
-		const DataType		type			= ((params.type == TYPE_LAST)
-											   ? randomType(rnd) : params.type);
-		const Interpolation	vtxInterp		= chooseInterpolation(params.vtxInterp, type, rnd);
-		const Interpolation	frgInterp		= chooseInterpolation(params.frgInterp, type, rnd);
-		const int			loc				= ((binding == BINDING_LOCATION) ? offset : -1);
-		const string		ndxStr			= de::toString(varNdx);
-		const string		vtxName			= ((binding == BINDING_NAME)
-											   ? "var" + ndxStr : "vtxVar" + ndxStr);
-		const string		frgName			= ((binding == BINDING_NAME)
-											   ? "var" + ndxStr : "frgVar" + ndxStr);
-		const VarType		varType			(type, PRECISION_HIGHP);
+		const BindingKind			binding			= ((params.binding == BINDING_LAST)
+													   ? randomBinding(rnd) : params.binding);
+		const DataType				type			= ((params.type == TYPE_LAST)
+													   ? randomType(rnd) : params.type);
+		const VaryingInterpolation	vtxInterp		= chooseInterpolation(params.vtxInterp, type, rnd);
+		const VaryingInterpolation	frgInterp		= chooseInterpolation(params.frgInterp, type, rnd);
+		const VaryingInterpolation	vtxCompatInterp	= (isSSOCompatibleInterpolation(vtxInterp, frgInterp))
+													   ? (vtxInterp) : (frgInterp);
+		const int					loc				= ((binding == BINDING_LOCATION) ? offset : -1);
+		const string				ndxStr			= de::toString(varNdx);
+		const string				vtxName			= ((binding == BINDING_NAME)
+													   ? "var" + ndxStr : "vtxVar" + ndxStr);
+		const string				frgName			= ((binding == BINDING_NAME)
+													   ? "var" + ndxStr : "frgVar" + ndxStr);
+		const VarType				varType			(type, PRECISION_HIGHP);
 
 		offset += getDataTypeNumLocations(type);
 
@@ -285,9 +354,9 @@
 			break;
 
 		ret.vtxOutputs.push_back(
-			VariableDeclaration(varType, vtxName, STORAGE_OUT, vtxInterp, loc));
+			VariableDeclaration(varType, vtxName, STORAGE_OUT, getGluInterpolation(vtxCompatInterp), loc));
 		ret.frgInputs.push_back(
-			VariableDeclaration(varType, frgName, STORAGE_IN, frgInterp, loc));
+			VariableDeclaration(varType, frgName, STORAGE_IN, getGluInterpolation(frgInterp), loc));
 	}
 
 	return ret;
@@ -378,11 +447,17 @@
 {
 	ostringstream		oss;
 	Random				rnd								(seed);
-	enum { 				NUM_COMPONENTS 					= 2 };
+	enum {				NUM_COMPONENTS					= 2 };
 	static const int	s_quadrants[][NUM_COMPONENTS]	= { {1, 1}, {-1, 1}, {1, -1} };
 
 	oss << "#version 310 es\n";
 
+	printFloatDeclaration(oss, varName, uniform, value);
+
+	for (vector<VariableDeclaration>::const_iterator it = outputs.begin();
+		 it != outputs.end(); ++it)
+		oss << *it << ";\n";
+
 	oss << "const vec2 triangle[3] = vec2[3](\n";
 
 	for (int vertexNdx = 0; vertexNdx < DE_LENGTH_OF_ARRAY(s_quadrants); ++vertexNdx)
@@ -413,12 +488,9 @@
 			oss << (i == 0 ? "\t" : ",\n\t");
 			printRandomInitializer(oss, type, rnd);
 		}
-		oss << ");\n"
-			<< *it << ";\n";
+		oss << ");\n";
 	}
 
-	printFloatDeclaration(oss, varName, uniform, value);
-
 	oss << "void main (void)\n"
 		<< "{\n"
 		<< "\tgl_Position = vec4(" << varName << " * triangle[gl_VertexID], 0.0, 1.0);\n";
@@ -445,9 +517,9 @@
 	oss.width(7);
 	oss << "#version 310 es\n";
 
-	oss << "precision highp float;\n";;
+	oss << "precision highp float;\n";
 
-	oss << "out vec4 fragColor;\n";;
+	oss << "out vec4 fragColor;\n";
 
 	printFloatDeclaration(oss, varName, uniform, value);
 
@@ -518,7 +590,7 @@
 class ProgramWrapper
 {
 public:
-	virtual 		~ProgramWrapper			(void) {}
+	virtual			~ProgramWrapper			(void) {}
 
 	virtual GLuint	getProgramName			(void) = 0;
 	virtual void	writeToLog				(TestLog& log) = 0;
@@ -614,8 +686,8 @@
 
 deUint32 paramsSeed (const TestParams& params)
 {
-	deUint32 paramCode 	= (params.initSingle	 		<< 0 |
-						   params.switchVtx 			<< 1 |
+	deUint32 paramCode	= (params.initSingle			<< 0 |
+						   params.switchVtx				<< 1 |
 						   params.switchFrg				<< 2 |
 						   params.useUniform			<< 3 |
 						   params.useSameName			<< 4 |
@@ -649,15 +721,15 @@
 			 params.varyings.binding == BINDING_LOCATION ? "l" :
 			 params.varyings.binding == BINDING_LAST ? "r" :
 			"")
-		 << (params.varyings.vtxInterp == INTERPOLATION_SMOOTH ? "m" :
-			 params.varyings.vtxInterp == INTERPOLATION_CENTROID ? "e" :
-			 params.varyings.vtxInterp == INTERPOLATION_FLAT ? "a" :
-			 params.varyings.vtxInterp == INTERPOLATION_LAST ? "r" :
+		 << (params.varyings.vtxInterp == VARYINGINTERPOLATION_SMOOTH ? "m" :
+			 params.varyings.vtxInterp == VARYINGINTERPOLATION_CENTROID ? "e" :
+			 params.varyings.vtxInterp == VARYINGINTERPOLATION_FLAT ? "a" :
+			 params.varyings.vtxInterp == VARYINGINTERPOLATION_RANDOM ? "r" :
 			"o")
-		 << (params.varyings.frgInterp == INTERPOLATION_SMOOTH ? "m" :
-			 params.varyings.frgInterp == INTERPOLATION_CENTROID ? "e" :
-			 params.varyings.frgInterp == INTERPOLATION_FLAT ? "a" :
-			 params.varyings.frgInterp == INTERPOLATION_LAST ? "r" :
+		 << (params.varyings.frgInterp == VARYINGINTERPOLATION_SMOOTH ? "m" :
+			 params.varyings.frgInterp == VARYINGINTERPOLATION_CENTROID ? "e" :
+			 params.varyings.frgInterp == VARYINGINTERPOLATION_FLAT ? "a" :
+			 params.varyings.frgInterp == VARYINGINTERPOLATION_RANDOM ? "r" :
 			"o");
 	return oss.str();
 }
@@ -688,17 +760,40 @@
 
 	// Interpolation is meaningless if we don't use an in/out variable.
 	if (params.varyings.count == 0 &&
-		!(params.varyings.vtxInterp == INTERPOLATION_LAST &&
-		  params.varyings.frgInterp == INTERPOLATION_LAST))
+		!(params.varyings.vtxInterp == VARYINGINTERPOLATION_LAST &&
+		  params.varyings.frgInterp == VARYINGINTERPOLATION_LAST))
 		return false;
 
 	// Mismatch by flat / smooth is not allowed. See Khronos bug #12630
-	if ((params.varyings.vtxInterp == INTERPOLATION_FLAT) != (params.varyings.frgInterp == INTERPOLATION_FLAT))
+	// \note: iterpolations might be RANDOM, causing generated varyings potentially match / mismatch anyway.
+	//        This is checked later on. Here, we just make sure that we don't force the generator to generate
+	//        only invalid varying configurations, i.e. there exists a valid varying configuration for this
+	//        test param config.
+	if ((params.varyings.vtxInterp != VARYINGINTERPOLATION_RANDOM) &&
+		(params.varyings.frgInterp != VARYINGINTERPOLATION_RANDOM) &&
+		(params.varyings.vtxInterp == VARYINGINTERPOLATION_FLAT) != (params.varyings.frgInterp == VARYINGINTERPOLATION_FLAT))
 		return false;
 
 	return true;
 }
 
+// used only for debug sanity checks
+#if defined(DE_DEBUG)
+bool varyingsValid (const VaryingInterface& varyings)
+{
+	for (int ndx = 0; ndx < (int)varyings.vtxOutputs.size(); ++ndx)
+	{
+		const VaryingInterpolation vertexInterpolation		= getVaryingInterpolation(varyings.vtxOutputs[ndx].interpolation);
+		const VaryingInterpolation fragmentInterpolation	= getVaryingInterpolation(varyings.frgInputs[ndx].interpolation);
+
+		if (!isSSOCompatibleInterpolation(vertexInterpolation, fragmentInterpolation))
+			return false;
+	}
+
+	return true;
+}
+#endif
+
 void logParams (TestLog& log, const TestParams& params)
 {
 	// We don't log operational details here since those are shown
@@ -743,16 +838,20 @@
 		}
 
 		msg << "In the vertex shader the varyings are qualified ";
-		if (params.varyings.vtxInterp == glu::INTERPOLATION_LAST)
+		if (params.varyings.vtxInterp == VARYINGINTERPOLATION_DEFAULT)
+			msg << "with no interpolation qualifiers.\n";
+		else if (params.varyings.vtxInterp == VARYINGINTERPOLATION_RANDOM)
 			msg << "with a random interpolation qualifier.\n";
 		else
-			msg << "'" << glu::getInterpolationName(params.varyings.vtxInterp) << "'.\n";
+			msg << "'" << glu::getInterpolationName(getGluInterpolation(params.varyings.vtxInterp)) << "'.\n";
 
 		msg << "In the fragment shader the varyings are qualified ";
-		if (params.varyings.frgInterp == glu::INTERPOLATION_LAST)
+		if (params.varyings.frgInterp == VARYINGINTERPOLATION_DEFAULT)
+			msg << "with no interpolation qualifiers.\n";
+		else if (params.varyings.frgInterp == VARYINGINTERPOLATION_RANDOM)
 			msg << "with a random interpolation qualifier.\n";
 		else
-			msg << "'" << glu::getInterpolationName(params.varyings.frgInterp) << "'.\n";
+			msg << "'" << glu::getInterpolationName(getGluInterpolation(params.varyings.frgInterp)) << "'.\n";
 	}
 
 	msg << TestLog::EndMessage;
@@ -783,15 +882,15 @@
 		{
 			params.varyings.type		= glu::TYPE_LAST;
 			params.varyings.binding		= BINDING_LAST;
-			params.varyings.vtxInterp	= glu::INTERPOLATION_LAST;
-			params.varyings.frgInterp	= glu::INTERPOLATION_LAST;
+			params.varyings.vtxInterp	= VARYINGINTERPOLATION_RANDOM;
+			params.varyings.frgInterp	= VARYINGINTERPOLATION_RANDOM;
 		}
 		else
 		{
 			params.varyings.type		= glu::TYPE_INVALID;
 			params.varyings.binding		= BINDING_LAST;
-			params.varyings.vtxInterp	= glu::INTERPOLATION_LAST;
-			params.varyings.frgInterp	= glu::INTERPOLATION_LAST;
+			params.varyings.vtxInterp	= VARYINGINTERPOLATION_LAST;
+			params.varyings.frgInterp	= VARYINGINTERPOLATION_LAST;
 		}
 
 		tryNdx += 1;
@@ -977,6 +1076,7 @@
 	, m_varyings		(genVaryingInterface(params.varyings, m_rnd))
 {
 	DE_ASSERT(paramsValid(params));
+	DE_ASSERT(varyingsValid(m_varyings));
 }
 
 MovePtr<ProgramWrapper> SeparateShaderTest::createShaderProgram (const string*	vtxSource,
@@ -1030,7 +1130,7 @@
 		RawProgramWrapper* const	wrapper	= new RawProgramWrapper(renderCtx, programName,
 																	shaderType, src);
 		MovePtr<ProgramWrapper>		wrapperPtr(wrapper);
-		Program& 					program = wrapper->getProgram();
+		Program&					program = wrapper->getProgram();
 
 		if (!program.getLinkStatus())
 		{
@@ -1080,7 +1180,7 @@
 	msg << TestLog::EndMessage;
 }
 
-MovePtr<Pipeline> SeparateShaderTest::createPipeline(const ProgramParams& pp)
+MovePtr<Pipeline> SeparateShaderTest::createPipeline (const ProgramParams& pp)
 {
 	const bool		useUniform	= m_params.useUniform;
 	const string	vtxName		= m_params.useSameName ? "scale" : "vtxScale";
@@ -1178,7 +1278,7 @@
 	return MovePtr<Pipeline>(new Pipeline(pipeline, fullProg, vtxProg, frgProg));
 }
 
-MovePtr<ProgramWrapper> SeparateShaderTest::createReferenceProgram(const ProgramParams& pp)
+MovePtr<ProgramWrapper> SeparateShaderTest::createReferenceProgram (const ProgramParams& pp)
 {
 	bool					useUniform	= m_params.useUniform;
 	const string			vtxSrc		= genVtxShaderSrc(pp.vtxSeed,
@@ -1206,7 +1306,7 @@
 {
 	const RenderContext&	renderCtx	= getRenderContext();
 	Random					rnd			(seed > 0 ? seed : m_rnd.getUint32());
-	Rectangle				viewport 	= randomViewport(renderCtx, rnd,
+	Rectangle				viewport	= randomViewport(renderCtx, rnd,
 														 VIEWPORT_SIZE, VIEWPORT_SIZE);
 	glClearColor(0.125f, 0.25f, 0.5f, 1.f);
 	setViewport(renderCtx, viewport);
@@ -1305,8 +1405,8 @@
 
 	{
 		ProgramParams				changePp	= genProgramParams(m_rnd);
-		changePp.vtxSeed 						= refPp.vtxSeed;
-		changePp.frgSeed 						= refPp.frgSeed;
+		changePp.vtxSeed						= refPp.vtxSeed;
+		changePp.frgSeed						= refPp.frgSeed;
 		UniquePtr<ProgramWrapper>	changeProg	(createReferenceProgram(changePp));
 		GLuint						changeName	= changeProg->getProgramName();
 		ProgramPipeline				pipeline	(getRenderContext());
@@ -1492,17 +1592,19 @@
 	return true;
 }
 
-void describeInterpolation(const string& stage, Interpolation qual,
-						   ostringstream& name, ostringstream& desc)
+void describeInterpolation (const string& stage, VaryingInterpolation qual,
+							ostringstream& name, ostringstream& desc)
 {
-	if (qual == glu::INTERPOLATION_LAST)
+	DE_ASSERT(qual < VARYINGINTERPOLATION_RANDOM);
+
+	if (qual == VARYINGINTERPOLATION_DEFAULT)
 	{
 		desc << ", unqualified in " << stage << " shader";
 		return;
 	}
 	else
 	{
-		const string qualName = glu::getInterpolationName(qual);
+		const string qualName = glu::getInterpolationName(getGluInterpolation(qual));
 
 		name << "_" << stage << "_" << qualName;
 		desc << ", qualified '" << qualName << "' in " << stage << " shader";
@@ -1510,7 +1612,7 @@
 }
 
 
-} // anonymous namespace
+} // anonymous
 
 TestCaseGroup* createSeparateShaderTests (Context& ctx)
 {
@@ -1529,8 +1631,8 @@
 	defaultParams.varyings.count		= 0;
 	defaultParams.varyings.type			= glu::TYPE_INVALID;
 	defaultParams.varyings.binding		= BINDING_NAME;
-	defaultParams.varyings.vtxInterp	= glu::INTERPOLATION_LAST;
-	defaultParams.varyings.frgInterp	= glu::INTERPOLATION_LAST;
+	defaultParams.varyings.vtxInterp	= VARYINGINTERPOLATION_LAST;
+	defaultParams.varyings.frgInterp	= VARYINGINTERPOLATION_LAST;
 
 	TestCaseGroup* stagesGroup =
 		new TestCaseGroup(ctx, "pipeline", "Pipeline configuration tests");
@@ -1613,21 +1715,21 @@
 
 	enum
 	{
-		NUM_INTERPOLATIONS	= glu::INTERPOLATION_LAST + 1, // INTERPOLATION_LAST is valid
+		NUM_INTERPOLATIONS	= VARYINGINTERPOLATION_RANDOM, // VARYINGINTERPOLATION_RANDOM is one after last fully specified interpolation
 		INTERFACEFLAGS_LAST = BINDING_LAST * NUM_INTERPOLATIONS * NUM_INTERPOLATIONS
 	};
 
 	for (deUint32 flags = 0; flags < INTERFACEFLAGS_LAST; ++flags)
 	{
-		deUint32		tmpFlags	= flags;
-		Interpolation	frgInterp	= Interpolation(tmpFlags % NUM_INTERPOLATIONS);
-		Interpolation	vtxInterp	= Interpolation((tmpFlags /= NUM_INTERPOLATIONS)
-													% NUM_INTERPOLATIONS);
-		BindingKind		binding		= BindingKind((tmpFlags /= NUM_INTERPOLATIONS)
-												  % BINDING_LAST);
-		TestParams		params		= defaultParams;
-		ostringstream	name;
-		ostringstream	desc;
+		deUint32				tmpFlags	= flags;
+		VaryingInterpolation	frgInterp	= VaryingInterpolation(tmpFlags % NUM_INTERPOLATIONS);
+		VaryingInterpolation	vtxInterp	= VaryingInterpolation((tmpFlags /= NUM_INTERPOLATIONS)
+																   % NUM_INTERPOLATIONS);
+		BindingKind				binding		= BindingKind((tmpFlags /= NUM_INTERPOLATIONS)
+														  % BINDING_LAST);
+		TestParams				params		= defaultParams;
+		ostringstream			name;
+		ostringstream			desc;
 
 		params.varyings.count		= 1;
 		params.varyings.type		= glu::TYPE_FLOAT;
diff --git a/modules/gles31/functional/es31fShaderAtomicOpTests.cpp b/modules/gles31/functional/es31fShaderAtomicOpTests.cpp
index 2758566..bef5a40 100644
--- a/modules/gles31/functional/es31fShaderAtomicOpTests.cpp
+++ b/modules/gles31/functional/es31fShaderAtomicOpTests.cpp
@@ -116,6 +116,10 @@
 	const bool			isSSBO		= m_operandType == ATOMIC_OPERAND_BUFFER_VARIABLE;
 	const char*			precName	= getPrecisionName(m_precision);
 	const char*			typeName	= getDataTypeName(m_type);
+
+	const DataType		outType		= isSSBO ? m_type : glu::TYPE_UINT;
+	const char*			outTypeName	= getDataTypeName(outType);
+
 	const deUint32		numValues	= product(m_workGroupSize)*product(m_numWorkGroups);
 	std::ostringstream	src;
 
@@ -126,8 +130,8 @@
 		<< "layout(binding = 0) buffer InOut\n"
 		<< "{\n"
 		<< "	" << precName << " " << typeName << " inputValues[" << numValues << "];\n"
-		<< "	" << precName << " " << typeName << " outputValues[" << numValues << "];\n"
-		<< "	" << (isSSBO ? "coherent " : "") << precName << " " << typeName << " groupValues[" << product(m_numWorkGroups) << "];\n"
+		<< "	" << precName << " " << outTypeName << " outputValues[" << numValues << "];\n"
+		<< "	" << (isSSBO ? "coherent " : "") << precName << " " << outTypeName << " groupValues[" << product(m_numWorkGroups) << "];\n"
 		<< "} sb_inout;\n";
 
 	if (!isSSBO)
@@ -144,17 +148,22 @@
 
 	if (isSSBO)
 	{
+		DE_ASSERT(outType == m_type);
 		src << "	sb_inout.outputValues[offset] = " << m_funcName << "(sb_inout.groupValues[globalNdx], sb_inout.inputValues[offset]);\n";
 	}
 	else
 	{
+		const string		castBeg	= outType != m_type ? (string(outTypeName) + "(") : string("");
+		const char* const	castEnd	= outType != m_type ? ")" : "";
+
 		src << "	if (gl_LocalInvocationIndex == 0u)\n"
 			<< "		s_var = " << typeName << "(" << tcu::toHex(m_initialValue) << "u);\n"
 			<< "	barrier();\n"
-			<< "	sb_inout.outputValues[offset] = " << m_funcName << "(s_var, sb_inout.inputValues[offset]);\n"
+			<< "	" << precName << " " << typeName << " res = " << m_funcName << "(s_var, sb_inout.inputValues[offset]);\n"
+			<< "	sb_inout.outputValues[offset] = " << castBeg << "res" << castEnd << ";\n"
 			<< "	barrier();\n"
 			<< "	if (gl_LocalInvocationIndex == 0u)\n"
-			<< "		sb_inout.groupValues[globalNdx] = s_var;\n";
+			<< "		sb_inout.groupValues[globalNdx] = " << castBeg << "s_var" << castEnd << ";\n";
 	}
 
 	src << "}\n";
@@ -334,6 +343,69 @@
 	}
 };
 
+
+static int getPrecisionNumIntegerBits (glu::Precision precision)
+{
+	switch (precision)
+	{
+		case glu::PRECISION_HIGHP:		return 32;
+		case glu::PRECISION_MEDIUMP:	return 16;
+		case glu::PRECISION_LOWP:		return 9;
+		default:
+			DE_ASSERT(false);
+			return 0;
+	}
+}
+
+static deUint32 getPrecisionMask (int numPreciseBits)
+{
+	// \note: bit shift with larger or equal than var length is undefined, use 64 bit ints
+	return (deUint32)((((deUint64)1u) << numPreciseBits) - 1) ;
+}
+
+static bool intEqualsAfterUintCast (deInt32 value, deUint32 casted, glu::Precision precision)
+{
+	// Bit format of 'casted' = [ uint -> highp uint promotion bits (0) ] [ sign extend bits (s) ] [ value bits ]
+	//                                                                                             |--min len---|
+	//                                                                    |---------------signed length---------|
+	//                          |-------------------------------- highp uint length ----------------------------|
+
+	const deUint32	reference		= (deUint32)value;
+	const int		signBitOn		= value < 0;
+	const int		numPreciseBits	= getPrecisionNumIntegerBits(precision);
+	const deUint32	preciseMask		= getPrecisionMask(numPreciseBits);
+
+	// Lowest N bits must match, N = minimum precision
+	if ((reference & preciseMask) != (casted & preciseMask))
+		return false;
+
+	// Other lowest bits must match the sign and the remaining (topmost) if any must be 0
+	for (int signedIntegerLength = numPreciseBits; signedIntegerLength <= 32; ++signedIntegerLength)
+	{
+		const deUint32 signBits = (signBitOn) ? (getPrecisionMask(signedIntegerLength)) : (0u);
+
+		if ((signBits & ~preciseMask) == (casted & ~preciseMask))
+			return true;
+	}
+	return false;
+}
+
+static bool containsAfterUintCast (const std::set<deInt32>& haystack, deUint32 needle, glu::Precision precision)
+{
+	for (std::set<deInt32>::const_iterator it = haystack.begin(); it != haystack.end(); ++it)
+		if (intEqualsAfterUintCast(*it, needle, precision))
+			return true;
+	return false;
+}
+
+static bool containsAfterUintCast (const std::set<deUint32>& haystack, deInt32 needle, glu::Precision precision)
+{
+	for (std::set<deUint32>::const_iterator it = haystack.begin(); it != haystack.end(); ++it)
+		if (intEqualsAfterUintCast(needle, *it, precision))
+			return true;
+	return false;
+}
+
 class ShaderAtomicMinCase : public ShaderAtomicOpCase
 {
 public:
@@ -359,51 +431,59 @@
 	{
 		const int	workGroupSize	= (int)product(m_workGroupSize);
 		const int	numWorkGroups	= numValues/workGroupSize;
+		bool		anyError		= false;
 
 		for (int groupNdx = 0; groupNdx < numWorkGroups; groupNdx++)
 		{
-			const int	groupOffset		= groupNdx*workGroupSize;
-			const int	groupOutput		= *(const int*)((const deUint8*)groupOutputs + groupNdx*groupStride);
-			set<int>	inValues;
-			set<int>	outValues;
-			int			minValue		= (int)m_initialValue;
+			const int		groupOffset		= groupNdx*workGroupSize;
+			const deUint32	groupOutput		= *(const deUint32*)((const deUint8*)groupOutputs + groupNdx*groupStride);
+			set<deInt32>	inValues;
+			set<deUint32>	outValues;
+			int				minValue		= (int)m_initialValue;
 
 			for (int localNdx = 0; localNdx < workGroupSize; localNdx++)
 			{
-				const int inputValue = *(const int*)((const deUint8*)inputs + inputStride*(groupOffset+localNdx));
+				const deInt32 inputValue = *(const deInt32*)((const deUint8*)inputs + inputStride*(groupOffset+localNdx));
 				inValues.insert(inputValue);
 				minValue = de::min(inputValue, minValue);
 			}
 
-			if (minValue != groupOutput)
+			if (!intEqualsAfterUintCast(minValue, groupOutput, m_precision))
 			{
-				m_testCtx.getLog() << TestLog::Message << "ERROR: at group " << groupNdx << ": expected minimum " << minValue << ", got " << groupOutput << TestLog::EndMessage;
-				return false;
+				m_testCtx.getLog()
+					<< TestLog::Message
+					<< "ERROR: at group " << groupNdx
+					<< ": expected minimum " << minValue << " (" << tcu::Format::Hex<8>((deUint32)minValue) << ")"
+					<< ", got " << groupOutput << " (" << tcu::Format::Hex<8>(groupOutput) << ")"
+					<< TestLog::EndMessage;
+				anyError = true;
 			}
 
 			for (int localNdx = 0; localNdx < workGroupSize; localNdx++)
 			{
-				const int outputValue = *(const int*)((const deUint8*)outputs + outputStride*(groupOffset+localNdx));
+				const deUint32 outputValue = *(const deUint32*)((const deUint8*)outputs + outputStride*(groupOffset+localNdx));
 
-				if (inValues.find(outputValue) == inValues.end() && outputValue != (int)m_initialValue)
+				if (!containsAfterUintCast(inValues, outputValue, m_precision) &&
+					!intEqualsAfterUintCast((deInt32)m_initialValue, outputValue, m_precision))
 				{
 					m_testCtx.getLog() << TestLog::Message << "ERROR: at group " << groupNdx << ", invocation " << localNdx
 														   << ": found unexpected value " << outputValue
+														   << " (" << tcu::Format::Hex<8>(outputValue) << ")"
 									   << TestLog::EndMessage;
-					return false;
+					anyError = true;
 				}
 
 				outValues.insert(outputValue);
 			}
 
-			if (outValues.find((int)m_initialValue) == outValues.end())
+			if (!containsAfterUintCast(outValues, (int)m_initialValue, m_precision))
 			{
 				m_testCtx.getLog() << TestLog::Message << "ERROR: could not find initial value from group " << groupNdx << TestLog::EndMessage;
-				return false;
+				anyError = true;
 			}
 		}
 
-		return true;
+		return !anyError;
 	}
 };
 
@@ -433,51 +513,59 @@
 	{
 		const int	workGroupSize	= (int)product(m_workGroupSize);
 		const int	numWorkGroups	= numValues/workGroupSize;
+		bool		anyError		= false;
 
 		for (int groupNdx = 0; groupNdx < numWorkGroups; groupNdx++)
 		{
-			const int	groupOffset		= groupNdx*workGroupSize;
-			const int	groupOutput		= *(const int*)((const deUint8*)groupOutputs + groupNdx*groupStride);
-			set<int>	inValues;
-			set<int>	outValues;
-			int			maxValue		= (int)m_initialValue;
+			const int		groupOffset		= groupNdx*workGroupSize;
+			const deUint32	groupOutput		= *(const deUint32*)((const deUint8*)groupOutputs + groupNdx*groupStride);
+			set<int>		inValues;
+			set<deUint32>	outValues;
+			int				maxValue		= (int)m_initialValue;
 
 			for (int localNdx = 0; localNdx < workGroupSize; localNdx++)
 			{
-				const int inputValue = *(const int*)((const deUint8*)inputs + inputStride*(groupOffset+localNdx));
+				const deInt32 inputValue = *(const deInt32*)((const deUint8*)inputs + inputStride*(groupOffset+localNdx));
 				inValues.insert(inputValue);
 				maxValue = de::max(maxValue, inputValue);
 			}
 
-			if (maxValue != groupOutput)
+			if (!intEqualsAfterUintCast(maxValue, groupOutput, m_precision))
 			{
-				m_testCtx.getLog() << TestLog::Message << "ERROR: at group " << groupNdx << ": expected maximum " << maxValue << ", got " << groupOutput << TestLog::EndMessage;
-				return false;
+				m_testCtx.getLog()
+					<< TestLog::Message
+					<< "ERROR: at group " << groupNdx
+					<< ": expected maximum " << maxValue << " (" << tcu::Format::Hex<8>((deUint32)maxValue) << ")"
+					<< ", got " << groupOutput << " (" << tcu::Format::Hex<8>(groupOutput) << ")"
+					<< TestLog::EndMessage;
+				anyError = true;
 			}
 
 			for (int localNdx = 0; localNdx < workGroupSize; localNdx++)
 			{
-				const int outputValue = *(const int*)((const deUint8*)outputs + outputStride*(groupOffset+localNdx));
+				const deUint32 outputValue = *(const deUint32*)((const deUint8*)outputs + outputStride*(groupOffset+localNdx));
 
-				if (inValues.find(outputValue) == inValues.end() && outputValue != (int)m_initialValue)
+				if (!containsAfterUintCast(inValues, outputValue, m_precision) &&
+					!intEqualsAfterUintCast((deInt32)m_initialValue, outputValue, m_precision))
 				{
 					m_testCtx.getLog() << TestLog::Message << "ERROR: at group " << groupNdx << ", invocation " << localNdx
 														   << ": found unexpected value " << outputValue
+														   << " (" << tcu::Format::Hex<8>(outputValue) << ")"
 									   << TestLog::EndMessage;
-					return false;
+					anyError = true;
 				}
 
 				outValues.insert(outputValue);
 			}
 
-			if (outValues.find((int)m_initialValue) == outValues.end())
+			if (!containsAfterUintCast(outValues, (int)m_initialValue, m_precision))
 			{
 				m_testCtx.getLog() << TestLog::Message << "ERROR: could not find initial value from group " << groupNdx << TestLog::EndMessage;
-				return false;
+				anyError = true;
 			}
 		}
 
-		return true;
+		return !anyError;
 	}
 };
 
diff --git a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
index ea23ab2..f993654 100644
--- a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
+++ b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
@@ -2874,10 +2874,21 @@
 		TESTTYPE_LAST
 	};
 
-	EarlyFragmentTestsCase (Context& context, const char* name, const char* description, TestType type, bool useEarlyTests)
+	enum RenderTargetType
+	{
+		RENDERTARGET_DEFAULT = 0,
+		RENDERTARGET_FBO,
+		RENDERTARGET_FBO_WITHOUT_TEST_ATTACHMENT,
+
+		RENDERTARGET_LAST
+	};
+
+
+	EarlyFragmentTestsCase (Context& context, const char* name, const char* description, TestType type, bool useEarlyTests, RenderTargetType renderTarget)
 		: TestCase			(context, name, description)
 		, m_type			(type)
 		, m_useEarlyTests	(useEarlyTests)
+		, m_renderTarget	(renderTarget)
 	{
 	}
 
@@ -2889,33 +2900,53 @@
 		if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
 			throw tcu::NotSupportedError("Test requires OES_shader_image_atomic extension");
 
-		if (m_context.getRenderTarget().getWidth() < RENDER_SIZE || m_context.getRenderTarget().getHeight() < RENDER_SIZE)
+		if (m_type == TESTTYPE_DEPTH 				&&
+			m_renderTarget == RENDERTARGET_DEFAULT	&&
+			m_context.getRenderTarget().getDepthBits() == 0)
+		{
+			throw tcu::NotSupportedError("Test requires depth buffer");
+		}
+
+		if (m_type == TESTTYPE_STENCIL 				&&
+			m_renderTarget == RENDERTARGET_DEFAULT	&&
+			m_context.getRenderTarget().getStencilBits() == 0)
+		{
+			throw tcu::NotSupportedError("Test requires stencil buffer");
+		}
+
+		if (m_renderTarget == RENDERTARGET_DEFAULT	&&
+			(m_context.getRenderTarget().getWidth() < RENDER_SIZE || m_context.getRenderTarget().getHeight() < RENDER_SIZE))
 			throw tcu::NotSupportedError("Render target must have at least " + toString(RENDER_SIZE) + " width and height");
 	}
 
 	IterateResult iterate (void);
 
 private:
-	static const int RENDER_SIZE;
+	static const int 		RENDER_SIZE;
 
-	const TestType	m_type;
-	const bool		m_useEarlyTests;
+	const TestType			m_type;
+	const bool				m_useEarlyTests;
+	const RenderTargetType 	m_renderTarget;
 };
 
 const int EarlyFragmentTestsCase::RENDER_SIZE = 32;
 
 EarlyFragmentTestsCase::IterateResult EarlyFragmentTestsCase::iterate (void)
 {
-	const RenderContext&		renderCtx		= m_context.getRenderContext();
-	TestLog&					log				(m_testCtx.getLog());
-	glu::CallLogWrapper			glLog			(renderCtx.getFunctions(), log);
-	de::Random					rnd				(deStringHash(getName()));
-	const int					viewportWidth	= RENDER_SIZE;
-	const int					viewportHeight	= RENDER_SIZE;
-	const int					viewportX		= rnd.getInt(0, renderCtx.getRenderTarget().getWidth() - viewportWidth);
-	const int					viewportY		= rnd.getInt(0, renderCtx.getRenderTarget().getHeight() - viewportHeight);
-	const IVec3					imageSize		= defaultImageSize(TEXTURETYPE_2D);
-	const glu::Texture			texture			(renderCtx);
+	const RenderContext&			renderCtx			= m_context.getRenderContext();
+	TestLog&						log					(m_testCtx.getLog());
+	glu::CallLogWrapper				glLog				(renderCtx.getFunctions(), log);
+	de::Random						rnd					(deStringHash(getName()));
+	const bool						expectPartialResult	= m_useEarlyTests && m_renderTarget != RENDERTARGET_FBO_WITHOUT_TEST_ATTACHMENT;
+	const int						viewportWidth		= RENDER_SIZE;
+	const int						viewportHeight		= RENDER_SIZE;
+	const int						viewportX			= (m_renderTarget == RENDERTARGET_DEFAULT) ? (rnd.getInt(0, renderCtx.getRenderTarget().getWidth() - viewportWidth))	: (0);
+	const int						viewportY			= (m_renderTarget == RENDERTARGET_DEFAULT) ? (rnd.getInt(0, renderCtx.getRenderTarget().getHeight() - viewportHeight))	: (0);
+	const IVec3						imageSize			= defaultImageSize(TEXTURETYPE_2D);
+	const glu::Texture				texture				(renderCtx);
+	de::MovePtr<glu::Framebuffer>	fbo;
+	de::MovePtr<glu::Renderbuffer> 	colorAttachment;
+	de::MovePtr<glu::Renderbuffer> 	testAttachment;
 
 	glLog.enableLogging(true);
 
@@ -2934,6 +2965,46 @@
 	glLog.glBindImageTexture(0, *texture, 0, GL_TRUE, 0, GL_READ_WRITE, GL_R32UI);
 	GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "glBindImageTexture");
 
+	// Set up framebuffer
+	if (m_renderTarget == RENDERTARGET_FBO ||
+		m_renderTarget == RENDERTARGET_FBO_WITHOUT_TEST_ATTACHMENT)
+	{
+		fbo 			= de::MovePtr<glu::Framebuffer>(new glu::Framebuffer(renderCtx));
+		colorAttachment	= de::MovePtr<glu::Renderbuffer>(new glu::Renderbuffer(renderCtx));
+		testAttachment	= de::MovePtr<glu::Renderbuffer>(new glu::Renderbuffer(renderCtx));
+
+		glLog.glBindRenderbuffer(GL_RENDERBUFFER, **colorAttachment);
+		glLog.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, RENDER_SIZE, RENDER_SIZE);
+		GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "gen color attachment rb");
+
+		glLog.glBindFramebuffer(GL_FRAMEBUFFER, **fbo);
+		glLog.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, **colorAttachment);
+		GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "set fbo color attachment");
+
+		if (m_renderTarget == RENDERTARGET_FBO && m_type == TESTTYPE_DEPTH)
+		{
+			glLog.glBindRenderbuffer(GL_RENDERBUFFER, **testAttachment);
+			glLog.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, RENDER_SIZE, RENDER_SIZE);
+			GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "gen depth attachment rb");
+
+			glLog.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, **testAttachment);
+			GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "set fbo depth attachment");
+		}
+		else if (m_renderTarget == RENDERTARGET_FBO && m_type == TESTTYPE_STENCIL)
+		{
+			glLog.glBindRenderbuffer(GL_RENDERBUFFER, **testAttachment);
+			glLog.glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, RENDER_SIZE, RENDER_SIZE);
+			GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "gen stencil attachment rb");
+
+			glLog.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, **testAttachment);
+			GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "set fbo stencil attachment");
+		}
+
+		glLog.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, **colorAttachment);
+		GLU_EXPECT_NO_ERROR(renderCtx.getFunctions().getError(), "setup fbo");
+		TCU_CHECK(glLog.glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
+	}
+
 	// Set up appropriate conditions for the test.
 
 	glLog.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
@@ -3040,8 +3111,8 @@
 	// Read counter value and check.
 	{
 		const int numSamples		= de::max(1, renderCtx.getRenderTarget().getNumSamples());
-		const int expectedCounter	= m_useEarlyTests ? viewportWidth*viewportHeight/2				: viewportWidth*viewportHeight;
-		const int tolerance			= m_useEarlyTests ? de::max(viewportWidth, viewportHeight)*3	: 0;
+		const int expectedCounter	= expectPartialResult ? viewportWidth*viewportHeight/2				: viewportWidth*viewportHeight;
+		const int tolerance			= expectPartialResult ? de::max(viewportWidth, viewportHeight)*3	: 0;
 		const int expectedMin		= de::max(0, expectedCounter - tolerance);
 		const int expectedMax		= (expectedCounter + tolerance) * numSamples;
 
@@ -3252,25 +3323,31 @@
 		TestCaseGroup* const earlyTestsGroup = new TestCaseGroup(m_context, "early_fragment_tests", "");
 		addChild(earlyTestsGroup);
 
+		for (int testRenderTargetI = 0; testRenderTargetI < EarlyFragmentTestsCase::RENDERTARGET_LAST; testRenderTargetI++)
 		for (int useEarlyTestsI = 0; useEarlyTestsI <= 1; useEarlyTestsI++)
+		for (int testTypeI = 0; testTypeI < EarlyFragmentTestsCase::TESTTYPE_LAST; testTypeI++)
 		{
-			const bool useEarlyTests = useEarlyTestsI != 0;
+			const EarlyFragmentTestsCase::RenderTargetType	targetType		= (EarlyFragmentTestsCase::RenderTargetType)testRenderTargetI;
+			const bool 										useEarlyTests 	= useEarlyTestsI != 0;
+			const EarlyFragmentTestsCase::TestType			testType		= (EarlyFragmentTestsCase::TestType)testTypeI;
 
-			for (int testTypeI = 0; testTypeI < EarlyFragmentTestsCase::TESTTYPE_LAST; testTypeI++)
-			{
-				const EarlyFragmentTestsCase::TestType		testType		= (EarlyFragmentTestsCase::TestType)testTypeI;
+			const string									testTypeName	= testType == EarlyFragmentTestsCase::TESTTYPE_DEPTH	? "depth"
+																			: testType == EarlyFragmentTestsCase::TESTTYPE_STENCIL	? "stencil"
+																			: DE_NULL;
 
-				const string								testTypeName	= testType == EarlyFragmentTestsCase::TESTTYPE_DEPTH		? "depth"
-																			  : testType == EarlyFragmentTestsCase::TESTTYPE_STENCIL	? "stencil"
-																			  : DE_NULL;
+			const string									targetName		= targetType == EarlyFragmentTestsCase::RENDERTARGET_FBO 							? (std::string("_fbo"))
+																			: targetType == EarlyFragmentTestsCase::RENDERTARGET_FBO_WITHOUT_TEST_ATTACHMENT	? (std::string("_fbo_with_no_") + testTypeName)
+																			: std::string("");
 
-				const string								caseName		= string(useEarlyTests ? "" : "no_") + "early_fragment_tests_" + testTypeName;
+			const string									caseName		= string(useEarlyTests ? "" : "no_") + "early_fragment_tests_" + testTypeName + targetName;
 
-				const string								caseDesc		= string(useEarlyTests ? "Specify" : "Don't specify")
-																			+ " early_fragment_tests, target the " + testTypeName + " test";
+			const string									caseDesc		= string(useEarlyTests ? "Specify" : "Don't specify")
+																			+ " early_fragment_tests, use the " + testTypeName + " test"
+																			+ ((targetType == EarlyFragmentTestsCase::RENDERTARGET_FBO) 							? (", render to fbo")
+																			   : (targetType == EarlyFragmentTestsCase::RENDERTARGET_FBO_WITHOUT_TEST_ATTACHMENT) 	? (", render to fbo without relevant buffer")
+																			   : (""));
 
-				earlyTestsGroup->addChild(new EarlyFragmentTestsCase(m_context, caseName.c_str(), caseDesc.c_str(), testType, useEarlyTests));
-			}
+			earlyTestsGroup->addChild(new EarlyFragmentTestsCase(m_context, caseName.c_str(), caseDesc.c_str(), testType, useEarlyTests, targetType));
 		}
 	}
 }
diff --git a/modules/gles31/functional/es31fTextureGatherTests.cpp b/modules/gles31/functional/es31fTextureGatherTests.cpp
index a35444c..74e6354 100644
--- a/modules/gles31/functional/es31fTextureGatherTests.cpp
+++ b/modules/gles31/functional/es31fTextureGatherTests.cpp
@@ -85,8 +85,8 @@
 
 static void fillWithRandomColorTiles (const PixelBufferAccess& dst, const Vec4& minVal, const Vec4& maxVal, deUint32 seed)
 {
-	const int	numCols		= 7;
-	const int	numRows		= 5;
+	const int	numCols		= dst.getWidth()  >= 7 ? 7 : dst.getWidth();
+	const int	numRows		= dst.getHeight() >= 5 ? 5 : dst.getHeight();
 	de::Random	rnd			(seed);
 
 	for (int slice = 0; slice < dst.getDepth(); slice++)
@@ -751,6 +751,12 @@
 	GATHERTYPE_LAST
 };
 
+enum GatherCaseFlags
+{
+	GATHERCASE_MIPMAP_INCOMPLETE		= (1<<0),	//!< Excercise special case of sampling mipmap-incomplete texture
+	GATHERCASE_DONT_SAMPLE_CUBE_CORNERS	= (1<<1)	//!< For cube map cases: do not sample cube corners
+};
+
 static inline const char* gatherTypeName (GatherType type)
 {
 	switch (type)
@@ -950,7 +956,7 @@
 																 tcu::Sampler::FilterMode	minFilter,
 																 tcu::Sampler::FilterMode	magFilter,
 																 int						baseLevel,
-																 bool						mipmapIncomplete);
+																 deUint32					flags);
 
 	void								init					(void);
 	void								deinit					(void);
@@ -982,7 +988,7 @@
 	const tcu::Sampler::FilterMode		m_minFilter;
 	const tcu::Sampler::FilterMode		m_magFilter;
 	const int							m_baseLevel;
-	const bool							m_mipmapIncomplete;
+	const deUint32						m_flags;
 
 private:
 	enum
@@ -1024,7 +1030,7 @@
 									  tcu::Sampler::FilterMode		minFilter,
 									  tcu::Sampler::FilterMode		magFilter,
 									  int							baseLevel,
-									  bool							mipmapIncomplete)
+									  deUint32						flags)
 	: TestCase				(context, name, description)
 	, m_gatherType			(gatherType)
 	, m_offsetSize			(offsetSize)
@@ -1036,7 +1042,7 @@
 	, m_minFilter			(minFilter)
 	, m_magFilter			(magFilter)
 	, m_baseLevel			(baseLevel)
-	, m_mipmapIncomplete	(mipmapIncomplete)
+	, m_flags				(flags)
 	, m_textureType			(textureType)
 	, m_colorBufferFormat	(tcu::TextureFormat(tcu::TextureFormat::RGBA,
 												isDepthFormat(textureFormat) ? tcu::TextureFormat::UNORM_INT8 : textureFormat.type))
@@ -1051,8 +1057,9 @@
 			  m_colorBufferFormat.type == tcu::TextureFormat::SIGNED_INT16);
 	DE_ASSERT(glu::isGLInternalColorFormatFilterable(glu::getInternalFormat(m_colorBufferFormat)) ||
 			  (m_magFilter == tcu::Sampler::NEAREST && (m_minFilter == tcu::Sampler::NEAREST || m_minFilter == tcu::Sampler::NEAREST_MIPMAP_NEAREST)));
-	DE_ASSERT(isMipmapFilter(m_minFilter) || !m_mipmapIncomplete);
-	DE_ASSERT(!(m_mipmapIncomplete && isDepthFormat(m_textureFormat))); // It's not clear what shadow textures should return when incomplete.
+	DE_ASSERT(isMipmapFilter(m_minFilter) || !(m_flags & GATHERCASE_MIPMAP_INCOMPLETE));
+	DE_ASSERT(m_textureType == TEXTURETYPE_CUBE || !(m_flags & GATHERCASE_DONT_SAMPLE_CUBE_CORNERS));
+	DE_ASSERT(!((m_flags & GATHERCASE_MIPMAP_INCOMPLETE) && isDepthFormat(m_textureFormat))); // It's not clear what shadow textures should return when incomplete.
 }
 
 IVec2 TextureGatherCase::getOffsetRange (void) const
@@ -1306,7 +1313,7 @@
 		<< TestLog::Message << "Minification and magnification filter modes are "
 							<< glu::getTextureFilterName(glu::getGLFilterMode(m_minFilter)) << " and "
 							<< glu::getTextureFilterName(glu::getGLFilterMode(m_magFilter)) << ", respectively "
-							<< (m_mipmapIncomplete ?
+							<< ((m_flags & GATHERCASE_MIPMAP_INCOMPLETE) ?
 								"(note that they cause the texture to be incomplete)" :
 								"(note that they should have no effect on gather result)")
 							<< TestLog::EndMessage
@@ -1448,7 +1455,7 @@
 {
 	TestLog& log = m_testCtx.getLog();
 
-	if (m_mipmapIncomplete)
+	if (m_flags & GATHERCASE_MIPMAP_INCOMPLETE)
 	{
 		const int	componentNdx		= de::max(0, gatherArgs.componentNdx);
 		const Vec4	incompleteColor		(0.0f, 0.0f, 0.0f, 1.0f);
@@ -1623,9 +1630,9 @@
 						 tcu::Sampler::FilterMode	minFilter,
 						 tcu::Sampler::FilterMode	magFilter,
 						 int						baseLevel,
-						 bool						mipmapIncomplete,
+						 deUint32					flags,
 						 const IVec2&				textureSize)
-		: TextureGatherCase		(context, name, description, TEXTURETYPE_2D, gatherType, offsetSize, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete)
+		: TextureGatherCase		(context, name, description, TEXTURETYPE_2D, gatherType, offsetSize, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags)
 		, m_textureSize			(textureSize)
 		, m_swizzledTexture		(tcu::TextureFormat(), 1, 1)
 	{
@@ -1671,7 +1678,7 @@
 	{
 		tcu::Texture2D&		refTexture	= m_texture->getRefTexture();
 		const int			levelBegin	= m_baseLevel;
-		const int			levelEnd	= isMipmapFilter(m_minFilter) && !m_mipmapIncomplete ? refTexture.getNumLevels() : m_baseLevel+1;
+		const int			levelEnd	= isMipmapFilter(m_minFilter) && !(m_flags & GATHERCASE_MIPMAP_INCOMPLETE) ? refTexture.getNumLevels() : m_baseLevel+1;
 		DE_ASSERT(m_baseLevel < refTexture.getNumLevels());
 
 		for (int levelNdx = levelBegin; levelNdx < levelEnd; levelNdx++)
@@ -1713,9 +1720,9 @@
 							  tcu::Sampler::FilterMode		minFilter,
 							  tcu::Sampler::FilterMode		magFilter,
 							  int							baseLevel,
-							  bool							mipmapIncomplete,
+							  deUint32						flags,
 							  const IVec3&					textureSize)
-		: TextureGatherCase		(context, name, description, TEXTURETYPE_2D_ARRAY, gatherType, offsetSize, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete)
+		: TextureGatherCase		(context, name, description, TEXTURETYPE_2D_ARRAY, gatherType, offsetSize, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags)
 		, m_textureSize			(textureSize)
 		, m_swizzledTexture		(tcu::TextureFormat(), 1, 1, 1)
 	{
@@ -1798,7 +1805,7 @@
 	{
 		tcu::Texture2DArray&	refTexture	= m_texture->getRefTexture();
 		const int				levelBegin	= m_baseLevel;
-		const int				levelEnd	= isMipmapFilter(m_minFilter) && !m_mipmapIncomplete ? refTexture.getNumLevels() : m_baseLevel+1;
+		const int				levelEnd	= isMipmapFilter(m_minFilter) && !(m_flags & GATHERCASE_MIPMAP_INCOMPLETE) ? refTexture.getNumLevels() : m_baseLevel+1;
 		DE_ASSERT(m_baseLevel < refTexture.getNumLevels());
 
 		for (int levelNdx = levelBegin; levelNdx < levelEnd; levelNdx++)
@@ -1845,9 +1852,9 @@
 						   tcu::Sampler::FilterMode		minFilter,
 						   tcu::Sampler::FilterMode		magFilter,
 						   int							baseLevel,
-						   bool							mipmapIncomplete,
+						   deUint32						flags,
 						   int							textureSize)
-		: TextureGatherCase		(context, name, description, TEXTURETYPE_CUBE, GATHERTYPE_BASIC, OFFSETSIZE_NONE, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete)
+		: TextureGatherCase		(context, name, description, TEXTURETYPE_CUBE, GATHERTYPE_BASIC, OFFSETSIZE_NONE, textureFormat, shadowCompareMode, wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags)
 		, m_textureSize			(textureSize)
 		, m_swizzledTexture		(tcu::TextureFormat(), 1)
 	{
@@ -1877,8 +1884,11 @@
 
 vector<float> TextureGatherCubeCase::computeQuadTexCoord (int iterationNdx) const
 {
-	vector<float> res;
-	gls::TextureTestUtil::computeQuadTexCoordCube(res, m_iterations[iterationNdx].face, Vec2(-1.2f), Vec2(1.2f));
+	const bool		corners	= (m_flags & GATHERCASE_DONT_SAMPLE_CUBE_CORNERS) == 0;
+	const Vec2		minC	= corners ? Vec2(-1.2f) : Vec2(-0.6f, -1.2f);
+	const Vec2		maxC	= corners ? Vec2( 1.2f) : Vec2( 0.6f,  1.2f);
+	vector<float>	res;
+	gls::TextureTestUtil::computeQuadTexCoordCube(res, m_iterations[iterationNdx].face, minC, maxC);
 	return res;
 }
 
@@ -1931,7 +1941,7 @@
 	{
 		tcu::TextureCube&	refTexture	= m_texture->getRefTexture();
 		const int			levelBegin	= m_baseLevel;
-		const int			levelEnd	= isMipmapFilter(m_minFilter) && !m_mipmapIncomplete ? refTexture.getNumLevels() : m_baseLevel+1;
+		const int			levelEnd	= isMipmapFilter(m_minFilter) && !(m_flags & GATHERCASE_MIPMAP_INCOMPLETE) ? refTexture.getNumLevels() : m_baseLevel+1;
 		DE_ASSERT(m_baseLevel < refTexture.getNumLevels());
 
 		for (int levelNdx = levelBegin; levelNdx < levelEnd; levelNdx++)
@@ -1983,23 +1993,23 @@
 														tcu::Sampler::FilterMode	magFilter,
 														int							baseLevel,
 														const IVec3&				textureSize,
-														bool						mipmapIncomplete = false)
+														deUint32					flags = 0)
 {
 	switch (textureType)
 	{
 		case TEXTURETYPE_2D:
 			return new TextureGather2DCase(context, name, description, gatherType, offsetSize, textureFormat, shadowCompareMode,
-										   wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete, textureSize.swizzle(0, 1));
+										   wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags, textureSize.swizzle(0, 1));
 
 		case TEXTURETYPE_2D_ARRAY:
 			return new TextureGather2DArrayCase(context, name, description, gatherType, offsetSize, textureFormat, shadowCompareMode,
-												wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete, textureSize);
+												wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags, textureSize);
 
 		case TEXTURETYPE_CUBE:
 			DE_ASSERT(gatherType == GATHERTYPE_BASIC);
 			DE_ASSERT(offsetSize == OFFSETSIZE_NONE);
 			return new TextureGatherCubeCase(context, name, description, textureFormat, shadowCompareMode,
-											 wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, mipmapIncomplete, textureSize.x());
+											 wrapS, wrapT, texSwizzle, minFilter, magFilter, baseLevel, flags, textureSize.x());
 
 		default:
 			DE_ASSERT(false);
@@ -2116,43 +2126,55 @@
 					TestCaseGroup* const		formatGroup		= new TestCaseGroup(m_context, formats[formatNdx].name, "");
 					textureTypeGroup->addChild(formatGroup);
 
-					for (int textureSizeNdx = 0; textureSizeNdx < DE_LENGTH_OF_ARRAY(textureSizes); textureSizeNdx++)
+					for (int noCornersI = 0; noCornersI <= (textureType == TEXTURETYPE_CUBE)?1:0; noCornersI++)
 					{
-						const IVec3&			textureSize			= textureSizes[textureSizeNdx].size;
-						TestCaseGroup* const	textureSizeGroup	= new TestCaseGroup(m_context, textureSizes[textureSizeNdx].name, "");
-						formatGroup->addChild(textureSizeGroup);
+						const bool				noCorners		= noCornersI!= 0;
+						TestCaseGroup* const	cornersGroup	= noCorners
+																? new TestCaseGroup(m_context, "no_corners", "Test case variants that don't sample around cube map corners")
+																: formatGroup;
 
-						for (int compareModeI = 0; compareModeI < tcu::Sampler::COMPAREMODE_LAST; compareModeI++)
+						if (formatGroup != cornersGroup)
+							formatGroup->addChild(cornersGroup);
+
+						for (int textureSizeNdx = 0; textureSizeNdx < DE_LENGTH_OF_ARRAY(textureSizes); textureSizeNdx++)
 						{
-							const tcu::Sampler::CompareMode compareMode = (tcu::Sampler::CompareMode)compareModeI;
+							const IVec3&			textureSize			= textureSizes[textureSizeNdx].size;
+							TestCaseGroup* const	textureSizeGroup	= new TestCaseGroup(m_context, textureSizes[textureSizeNdx].name, "");
+							cornersGroup->addChild(textureSizeGroup);
 
-							if ((compareMode != tcu::Sampler::COMPAREMODE_NONE) != isDepthFormat(format))
-								continue;
-
-							if (compareMode != tcu::Sampler::COMPAREMODE_NONE &&
-								compareMode != tcu::Sampler::COMPAREMODE_LESS &&
-								compareMode != tcu::Sampler::COMPAREMODE_GREATER)
-								continue;
-
-							TestCaseGroup* const compareModeGroup = compareMode == tcu::Sampler::COMPAREMODE_NONE ?
-																		textureSizeGroup :
-																		new TestCaseGroup(m_context,
-																						  (string() + "compare_" + compareModeName(compareMode)).c_str(),
-																						  "");
-							if (compareModeGroup != textureSizeGroup)
-								textureSizeGroup->addChild(compareModeGroup);
-
-							for (int wrapCaseNdx = 0; wrapCaseNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapCaseNdx++)
+							for (int compareModeI = 0; compareModeI < tcu::Sampler::COMPAREMODE_LAST; compareModeI++)
 							{
-								const int						wrapSNdx	= wrapCaseNdx;
-								const int						wrapTNdx	= (wrapCaseNdx + 1) % DE_LENGTH_OF_ARRAY(wrapModes);
-								const tcu::Sampler::WrapMode	wrapS		= wrapModes[wrapSNdx].mode;
-								const tcu::Sampler::WrapMode	wrapT		= wrapModes[wrapTNdx].mode;
+								const tcu::Sampler::CompareMode compareMode = (tcu::Sampler::CompareMode)compareModeI;
 
-								const string caseName = string() + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
+								if ((compareMode != tcu::Sampler::COMPAREMODE_NONE) != isDepthFormat(format))
+									continue;
 
-								compareModeGroup->addChild(makeTextureGatherCase(textureType, m_context, caseName.c_str(), "", gatherType, offsetSize, format, compareMode, wrapS, wrapT,
-																				 MaybeTextureSwizzle::createNoneTextureSwizzle(), tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 0, textureSize));
+								if (compareMode != tcu::Sampler::COMPAREMODE_NONE &&
+									compareMode != tcu::Sampler::COMPAREMODE_LESS &&
+									compareMode != tcu::Sampler::COMPAREMODE_GREATER)
+									continue;
+
+								TestCaseGroup* const compareModeGroup = compareMode == tcu::Sampler::COMPAREMODE_NONE ?
+																			textureSizeGroup :
+																			new TestCaseGroup(m_context,
+																							  (string() + "compare_" + compareModeName(compareMode)).c_str(),
+																							  "");
+								if (compareModeGroup != textureSizeGroup)
+									textureSizeGroup->addChild(compareModeGroup);
+
+								for (int wrapCaseNdx = 0; wrapCaseNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapCaseNdx++)
+								{
+									const int						wrapSNdx	= wrapCaseNdx;
+									const int						wrapTNdx	= (wrapCaseNdx + 1) % DE_LENGTH_OF_ARRAY(wrapModes);
+									const tcu::Sampler::WrapMode	wrapS		= wrapModes[wrapSNdx].mode;
+									const tcu::Sampler::WrapMode	wrapT		= wrapModes[wrapTNdx].mode;
+
+									const string caseName = string() + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
+
+									compareModeGroup->addChild(makeTextureGatherCase(textureType, m_context, caseName.c_str(), "", gatherType, offsetSize, format, compareMode, wrapS, wrapT,
+																					 MaybeTextureSwizzle::createNoneTextureSwizzle(), tcu::Sampler::NEAREST, tcu::Sampler::NEAREST, 0, textureSize,
+																					 noCorners ? GATHERCASE_DONT_SAMPLE_CUBE_CORNERS : 0));
+								}
 							}
 						}
 					}
@@ -2255,7 +2277,7 @@
 							incompleteGroup->addChild(makeTextureGatherCase(textureType, m_context, "mipmap_incomplete", "", gatherType, offsetSize, format,
 																			compareMode, tcu::Sampler::REPEAT_GL, tcu::Sampler::REPEAT_GL,
 																			MaybeTextureSwizzle::createNoneTextureSwizzle(), tcu::Sampler::NEAREST_MIPMAP_NEAREST, tcu::Sampler::NEAREST,
-																			0, IVec3(64, 64, 3), true /* Mipmap-incomplete */));
+																			0, IVec3(64, 64, 3), GATHERCASE_MIPMAP_INCOMPLETE));
 						}
 					}
 				}
diff --git a/modules/glshared/glsDrawTest.cpp b/modules/glshared/glsDrawTest.cpp
index 69e4f22..b82f261 100644
--- a/modules/glshared/glsDrawTest.cpp
+++ b/modules/glshared/glsDrawTest.cpp
@@ -60,7 +60,6 @@
 #include "glwDefs.hpp"
 #include "glwEnums.hpp"
 
-
 namespace deqp
 {
 namespace gls
@@ -1652,6 +1651,16 @@
 	return DE_NULL;
 }
 
+#if (DE_COMPILER == DE_COMPILER_GCC) && (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)
+	// GCC 4.8/4.9 incorrectly emits array-bounds warning from createBasicArray()
+#	define GCC_ARRAY_BOUNDS_FALSE_NEGATIVE 1
+#endif
+
+#if defined(GCC_ARRAY_BOUNDS_FALSE_NEGATIVE)
+#	pragma GCC diagnostic push
+#	pragma GCC diagnostic ignored "-Warray-bounds"
+#endif
+
 template<typename T, typename GLType>
 char* RandomArrayGenerator::createBasicArray (int seed, int elementCount, int componentCount, int offset, int stride)
 {
@@ -1700,6 +1709,10 @@
 	return data;
 }
 
+#if defined(GCC_ARRAY_BOUNDS_FALSE_NEGATIVE)
+#	pragma GCC diagnostic pop
+#endif
+
 char* RandomArrayGenerator::generatePackedArray (int seed, int elementCount, int componentCount, int offset, int stride)
 {
 	DE_ASSERT(componentCount == 4);
diff --git a/modules/glshared/glsFboCompletenessTests.cpp b/modules/glshared/glsFboCompletenessTests.cpp
index 498f1fd..6033acf 100644
--- a/modules/glshared/glsFboCompletenessTests.cpp
+++ b/modules/glshared/glsFboCompletenessTests.cpp
@@ -175,10 +175,30 @@
 	GL_SRGB8_ALPHA8,
 };
 
-static const FormatKey s_extSrgbTexFormats[] =
+static const FormatKey s_extSrgbRenderableTexFormats[] =
+{
+	GLS_UNSIZED_FORMATKEY(GL_SRGB_ALPHA,	GL_UNSIGNED_BYTE),
+};
+
+static const FormatKey s_extSrgbNonRenderableTexFormats[] =
 {
 	GLS_UNSIZED_FORMATKEY(GL_SRGB,			GL_UNSIGNED_BYTE),
-	GLS_UNSIZED_FORMATKEY(GL_SRGB_ALPHA,	GL_UNSIGNED_BYTE),
+	GL_SRGB8,
+};
+
+static const FormatKey s_nvSrgbFormatsRboFormats[] =
+{
+	GL_SRGB8,
+};
+
+static const FormatKey s_nvSrgbFormatsTextureFormats[] =
+{
+	GL_SRGB8,
+
+	// The extension does not actually require any unsized format
+	// to be renderable. However, the renderablility of unsized
+	// SRGB,UBYTE internalformat-type pair is implied.
+	GLS_UNSIZED_FORMATKEY(GL_SRGB,			GL_UNSIGNED_BYTE),
 };
 
 static const FormatKey s_oesRgb8Rgba8TexFormats[] =
@@ -282,13 +302,28 @@
 	{
 		"GL_EXT_sRGB",
 		COLOR_RENDERABLE | TEXTURE_VALID,
-		GLS_ARRAY_RANGE(s_extSrgbTexFormats)
+		GLS_ARRAY_RANGE(s_extSrgbRenderableTexFormats)
+	},
+	{
+		"GL_EXT_sRGB",
+		TEXTURE_VALID,
+		GLS_ARRAY_RANGE(s_extSrgbNonRenderableTexFormats)
 	},
 	{
 		"GL_EXT_sRGB",
 		REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID,
 		GLS_ARRAY_RANGE(s_extSrgbRboFormats)
 	},
+	{
+		"GL_NV_sRGB_formats",
+		REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID,
+		GLS_ARRAY_RANGE(s_nvSrgbFormatsRboFormats)
+	},
+	{
+		"GL_NV_sRGB_formats",
+		REQUIRED_RENDERABLE | COLOR_RENDERABLE | TEXTURE_VALID,
+		GLS_ARRAY_RANGE(s_nvSrgbFormatsTextureFormats)
+	},
 
 	 // In Khronos bug 7333 discussion, the consensus is that these texture
 	 // formats, at least, should be color-renderable. Still, that cannot be
diff --git a/modules/glshared/glsShaderLibrary.cpp b/modules/glshared/glsShaderLibrary.cpp
index 386b16f..3d4d976 100644
--- a/modules/glshared/glsShaderLibrary.cpp
+++ b/modules/glshared/glsShaderLibrary.cpp
@@ -319,6 +319,7 @@
 
 	// Eat first empty line from beginning.
 	while (*p == ' ') p++;
+	if (*p == '\r') p++;
 	if (*p == '\n') p++;
 
 	while ((p[0] != '"') || (p[1] != '"'))
diff --git a/modules/internal/ditFrameworkTests.cpp b/modules/internal/ditFrameworkTests.cpp
index 3882c45..0b5b1b5 100644
--- a/modules/internal/ditFrameworkTests.cpp
+++ b/modules/internal/ditFrameworkTests.cpp
@@ -22,12 +22,528 @@
  *//*--------------------------------------------------------------------*/
 
 #include "ditFrameworkTests.hpp"
-
 #include "tcuFloatFormat.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
 
 namespace dit
 {
 
+namespace
+{
+
+using std::string;
+using std::vector;
+using tcu::TestLog;
+
+struct MatchCase
+{
+	enum Expected { NO_MATCH, MATCH_GROUP, MATCH_CASE, EXPECTED_LAST };
+
+	const char*	path;
+	Expected	expected;
+};
+
+const char* getMatchCaseExpectedDesc (MatchCase::Expected expected)
+{
+	static const char* descs[] =
+	{
+		"no match",
+		"group to match",
+		"case to match"
+	};
+	return de::getSizedArrayElement<MatchCase::EXPECTED_LAST>(descs, expected);
+}
+
+class CaseListParserCase : public tcu::TestCase
+{
+public:
+	CaseListParserCase (tcu::TestContext& testCtx, const char* name, const char* caseList, const MatchCase* subCases, int numSubCases)
+		: tcu::TestCase	(testCtx, name, "")
+		, m_caseList	(caseList)
+		, m_subCases	(subCases)
+		, m_numSubCases	(numSubCases)
+	{
+	}
+
+	IterateResult iterate (void)
+	{
+		TestLog&			log		= m_testCtx.getLog();
+		tcu::CommandLine	cmdLine;
+		int					numPass	= 0;
+
+		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
+
+		{
+			const char* argv[] =
+			{
+				"deqp",
+				"--deqp-caselist",
+				m_caseList
+			};
+
+			if (!cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
+				TCU_FAIL("Failed to parse case list");
+		}
+
+		for (int subCaseNdx = 0; subCaseNdx < m_numSubCases; subCaseNdx++)
+		{
+			const MatchCase&	curCase		= m_subCases[subCaseNdx];
+			bool				matchGroup;
+			bool				matchCase;
+
+			log << TestLog::Message << "Checking \"" << curCase.path << "\""
+									<< ", expecting " << getMatchCaseExpectedDesc(curCase.expected)
+				<< TestLog::EndMessage;
+
+			matchGroup	= cmdLine.checkTestGroupName(curCase.path);
+			matchCase	= cmdLine.checkTestCaseName(curCase.path);
+
+			if ((matchGroup	== (curCase.expected == MatchCase::MATCH_GROUP)) &&
+				(matchCase	== (curCase.expected == MatchCase::MATCH_CASE)))
+			{
+				log << TestLog::Message << "   pass" << TestLog::EndMessage;
+				numPass += 1;
+			}
+			else
+				log << TestLog::Message << "   FAIL!" << TestLog::EndMessage;
+		}
+
+		m_testCtx.setTestResult((numPass == m_numSubCases) ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
+								(numPass == m_numSubCases) ? "All passed"			: "Unexpected match result");
+
+		return STOP;
+	}
+
+private:
+	const char* const			m_caseList;
+	const MatchCase* const		m_subCases;
+	const int					m_numSubCases;
+};
+
+class NegativeCaseListCase : public tcu::TestCase
+{
+public:
+	NegativeCaseListCase (tcu::TestContext& testCtx, const char* name, const char* caseList)
+		: tcu::TestCase	(testCtx, name, "")
+		, m_caseList	(caseList)
+	{
+	}
+
+	IterateResult iterate (void)
+	{
+		TestLog&			log		= m_testCtx.getLog();
+		tcu::CommandLine	cmdLine;
+
+		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
+
+		{
+			const char* argv[] =
+			{
+				"deqp",
+				"--deqp-caselist",
+				m_caseList
+			};
+
+			if (cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
+				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Parsing passed, should have failed");
+			else
+				m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Parsing failed as expected");
+		}
+
+		return STOP;
+	}
+
+private:
+	const char* const	m_caseList;
+};
+
+class TrieParserTests : public tcu::TestCaseGroup
+{
+public:
+	TrieParserTests (tcu::TestContext& testCtx)
+		: tcu::TestCaseGroup(testCtx, "trie", "Test case trie parser tests")
+	{
+	}
+
+	void init (void)
+	{
+		{
+			static const char* const	caseList	= "{test}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "test",		MatchCase::MATCH_CASE	},
+				{ "test.cd",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{a{b}}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{a{b,c}}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{a{b},c{d,e}}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{a,c{d,e}}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_CASE	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{c{d,e},a}";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_CASE	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{test}\r";
+			static const MatchCase		subCases[]	=
+			{
+				{ "test",		MatchCase::MATCH_CASE	},
+				{ "test.cd",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "trailing_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{test}\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "test",		MatchCase::MATCH_CASE	},
+				{ "test.cd",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "trailing_lf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "{test}\r\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "test",		MatchCase::MATCH_CASE	},
+				{ "test.cd",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "trailing_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+
+		// Negative tests
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_root",				"{}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_group",				"{test{}}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_1",		"{{}}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_2",		"{{test}}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_1",		"{"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_2",		"{test"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_3",		"{test,"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_4",		"{test{a}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_5",		"{a,b"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_1",	"{test{"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_2",	"{test{a"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_3",	"{test{a,"));
+		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_4",	"{test{a,b"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_1",		"{a,,b}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_2",		"{,b}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_3",		"{a,}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "no_separator",			"{a{b}c}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_1",			"{a.b}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_2",			"{a[]}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_1",			"{a}}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_2",			"{a}x"));
+		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_1",		"{\na}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_2",		"{a\n,b}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_3",		"{a,\nb}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_4",		"{a{b\n}}"));
+		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_5",		"{a{b}\n}"));
+	}
+};
+
+class ListParserTests : public tcu::TestCaseGroup
+{
+public:
+	ListParserTests (tcu::TestContext& testCtx)
+		: tcu::TestCaseGroup(testCtx, "list", "Test case list parser tests")
+	{
+	}
+
+	void init (void)
+	{
+		{
+			static const char* const	caseList	= "test";
+			static const MatchCase		subCases[]	=
+			{
+				{ "test",		MatchCase::MATCH_CASE	},
+				{ "test.cd",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\na.c";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\na.c";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "separator_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\ra.c";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "separator_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\r\na.c";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "separator_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\na.c\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "end_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\na.c\r";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "end_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\na.c\r\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.a",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "end_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b\nc.d\nc.e";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_GROUP	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::MATCH_CASE	},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a\nc.d\nc.e";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_CASE	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "c.d\nc.e\na";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",		MatchCase::MATCH_CASE	},
+				{ "b",		MatchCase::NO_MATCH		},
+				{ "a.b",	MatchCase::NO_MATCH		},
+				{ "a.c",	MatchCase::NO_MATCH		},
+				{ "a.d",	MatchCase::NO_MATCH		},
+				{ "a.e",	MatchCase::NO_MATCH		},
+				{ "c",		MatchCase::MATCH_GROUP	},
+				{ "c.b",	MatchCase::NO_MATCH		},
+				{ "c.d",	MatchCase::MATCH_CASE	},
+				{ "c.e",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	= "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",												MatchCase::MATCH_GROUP	},
+				{ "b",												MatchCase::NO_MATCH		},
+				{ "a.b",											MatchCase::MATCH_GROUP	},
+				{ "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x",	MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "long_name", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	=
+				"a.b.c.d.e\n"
+				"a.b.c.f\n"
+				"x.y.z\n"
+				"a.b.c.d.g\n"
+				"a.b.c.x\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",				MatchCase::MATCH_GROUP	},
+				{ "a.b",			MatchCase::MATCH_GROUP	},
+				{ "a.b.c.d.e",		MatchCase::MATCH_CASE	},
+				{ "a.b.c.d.g",		MatchCase::MATCH_CASE	},
+				{ "x.y",			MatchCase::MATCH_GROUP	},
+				{ "x.y.z",			MatchCase::MATCH_CASE	},
+				{ "a.b.c.f",		MatchCase::MATCH_CASE	},
+				{ "a.b.c.x",		MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "partial_prefix", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+		{
+			static const char* const	caseList	=
+				"a.a.c.d\n"
+				"a.b.c.d\n";
+			static const MatchCase		subCases[]	=
+			{
+				{ "a",				MatchCase::MATCH_GROUP	},
+				{ "a.a",			MatchCase::MATCH_GROUP	},
+				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
+				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
+			};
+			addChild(new CaseListParserCase(m_testCtx, "reparenting", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
+		}
+
+		// Negative tests
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name",		".test"));
+		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name",			"test."));
+	}
+};
+
+class CaseListParserTests : public tcu::TestCaseGroup
+{
+public:
+	CaseListParserTests (tcu::TestContext& testCtx)
+		: tcu::TestCaseGroup(testCtx, "case_list_parser", "Test case list parser tests")
+	{
+	}
+
+	void init (void)
+	{
+		addChild(new TrieParserTests(m_testCtx));
+		addChild(new ListParserTests(m_testCtx));
+	}
+};
+
 class CommonFrameworkTests : public tcu::TestCaseGroup
 {
 public:
@@ -40,9 +556,12 @@
 	{
 		addChild(new SelfCheckCase(m_testCtx, "float_format","tcu::FloatFormat_selfTest()",
 								   tcu::FloatFormat_selfTest));
+		addChild(new CaseListParserTests(m_testCtx));
 	}
 };
 
+} // anonymous
+
 FrameworkTests::FrameworkTests (tcu::TestContext& testCtx)
 	: tcu::TestCaseGroup(testCtx, "framework", "Miscellaneous framework tests")
 {
diff --git a/scripts/build/build.py b/scripts/build/build.py
index 2ed6187..222c3bb 100644
--- a/scripts/build/build.py
+++ b/scripts/build/build.py
@@ -7,7 +7,6 @@
 from config import *
 
 def initBuildDir (config, generator):
-	srcPath = DEQP_DIR
 	cfgArgs = []
 
 	# Build base configuration args
@@ -20,7 +19,7 @@
 		os.makedirs(config.buildDir)
 
 	pushWorkingDir(config.getBuildDir())
-	execute(["cmake", srcPath] + cfgArgs)
+	execute(["cmake", config.getSrcPath()] + cfgArgs)
 	popWorkingDir()
 
 def build (config, generator, targets = None):
diff --git a/scripts/build/common.py b/scripts/build/common.py
index f31a20a..8b39268 100644
--- a/scripts/build/common.py
+++ b/scripts/build/common.py
@@ -42,3 +42,12 @@
 	f = open(filename, 'wb')
 	f.write(data)
 	f.close()
+
+def which (binName):
+	for path in os.environ['PATH'].split(os.pathsep):
+		path = path.strip('"')
+		fullPath = os.path.join(path, binName)
+		if os.path.isfile(fullPath) and os.access(fullPath, os.X_OK):
+			return fullPath
+
+	return None
diff --git a/scripts/build/config.py b/scripts/build/config.py
index e4121aa..e94de67 100644
--- a/scripts/build/config.py
+++ b/scripts/build/config.py
@@ -1,7 +1,11 @@
 # -*- coding: utf-8 -*-
 
 import os
+import copy
 import platform
+import multiprocessing
+
+from common import which, DEQP_DIR
 
 try:
 	import _winreg
@@ -9,10 +13,14 @@
 	_winreg = None
 
 class BuildConfig:
-	def __init__ (self, buildDir, buildType, args):
+	def __init__ (self, buildDir, buildType, args, srcPath = DEQP_DIR):
+		self.srcPath		= srcPath
 		self.buildDir		= buildDir
 		self.buildType		= buildType
-		self.args			= args
+		self.args			= copy.copy(args)
+
+	def getSrcPath (self):
+		return self.srcPath
 
 	def getBuildDir (self):
 		return self.buildDir
@@ -24,9 +32,10 @@
 		return self.args
 
 class CMakeGenerator:
-	def __init__ (self, name, isMultiConfig = False):
+	def __init__ (self, name, isMultiConfig = False, extraBuildArgs = []):
 		self.name			= name
 		self.isMultiConfig	= isMultiConfig
+		self.extraBuildArgs	= copy.copy(extraBuildArgs)
 
 	def getName (self):
 		return self.name
@@ -41,20 +50,26 @@
 		args = []
 		if self.isMultiConfig:
 			args += ['--config', buildType]
+		if len(self.extraBuildArgs) > 0:
+			args += ['--'] + self.extraBuildArgs
 		return args
 
 	def getBinaryPath (self, buildType, basePath):
 		return basePath
 
-class DefaultGenerator(CMakeGenerator):
+class UnixMakefileGenerator(CMakeGenerator):
 	def __init__(self):
-		CMakeGenerator.__init__("default")
+		CMakeGenerator.__init__(self, "Unix Makefiles", extraBuildArgs = ["-j%d" % multiprocessing.cpu_count()])
 
-	def getGenerateArgs (self, buildType):
-		args = []
-		if not self.isMultiConfig:
-			args.append('-DCMAKE_BUILD_TYPE=%s' % buildType)
-		return args
+	def isAvailable (self):
+		return which('make') != None
+
+class NinjaGenerator(CMakeGenerator):
+	def __init__(self):
+		CMakeGenerator.__init__(self, "Ninja")
+
+	def isAvailable (self):
+		return which('ninja') != None
 
 class VSProjectGenerator(CMakeGenerator):
 	ARCH_32BIT	= 0
@@ -65,13 +80,10 @@
 		if arch == self.ARCH_64BIT:
 			name += " Win64"
 
-		CMakeGenerator.__init__(self, name, isMultiConfig = True)
+		CMakeGenerator.__init__(self, name, isMultiConfig = True, extraBuildArgs = ['/m'])
 		self.version		= version
 		self.arch			= arch
 
-	def getBuildArgs (self, buildType):
-		return CMakeGenerator.getBuildArgs(self, buildType) + ['--', '/m']
-
 	def getBinaryPath (self, buildType, basePath):
 		return os.path.join(os.path.dirname(basePath), buildType, os.path.basename(basePath) + ".exe")
 
@@ -119,21 +131,34 @@
 		else:
 			return False
 
-	@staticmethod
-	def getDefault (arch):
-		for version in reversed(range(10, 13)):
-			gen = VSProjectGenerator(version, arch)
-			if gen.isAvailable():
-				return gen
-		return None
-
 # Pre-defined generators
 
-MAKEFILE_GENERATOR		= CMakeGenerator("Unix Makefiles")
+MAKEFILE_GENERATOR		= UnixMakefileGenerator()
+NINJA_GENERATOR			= NinjaGenerator()
 VS2010_X32_GENERATOR	= VSProjectGenerator(10, VSProjectGenerator.ARCH_32BIT)
 VS2010_X64_GENERATOR	= VSProjectGenerator(10, VSProjectGenerator.ARCH_64BIT)
-VS2013_X64_GENERATOR	= VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
+VS2012_X32_GENERATOR	= VSProjectGenerator(11, VSProjectGenerator.ARCH_32BIT)
+VS2012_X64_GENERATOR	= VSProjectGenerator(11, VSProjectGenerator.ARCH_64BIT)
+VS2013_X32_GENERATOR	= VSProjectGenerator(12, VSProjectGenerator.ARCH_32BIT)
 VS2013_X64_GENERATOR	= VSProjectGenerator(12, VSProjectGenerator.ARCH_64BIT)
 
-ANY_VS_X32_GENERATOR	= VSProjectGenerator.getDefault(VSProjectGenerator.ARCH_32BIT)
-ANY_VS_X64_GENERATOR	= VSProjectGenerator.getDefault(VSProjectGenerator.ARCH_64BIT)
+def selectFirstAvailableGenerator (generators):
+	for generator in generators:
+		if generator.isAvailable():
+			return generator
+	return None
+
+ANY_VS_X32_GENERATOR	= selectFirstAvailableGenerator([
+								VS2013_X32_GENERATOR,
+								VS2012_X32_GENERATOR,
+								VS2010_X32_GENERATOR,
+							])
+ANY_VS_X64_GENERATOR	= selectFirstAvailableGenerator([
+								VS2013_X64_GENERATOR,
+								VS2012_X64_GENERATOR,
+								VS2010_X64_GENERATOR,
+							])
+ANY_UNIX_GENERATOR		= selectFirstAvailableGenerator([
+								NINJA_GENERATOR,
+								MAKEFILE_GENERATOR,
+							])
diff --git a/scripts/make_release.py b/scripts/make_release.py
new file mode 100644
index 0000000..d996b40
--- /dev/null
+++ b/scripts/make_release.py
@@ -0,0 +1,512 @@
+# -*- coding: utf-8 -*-
+
+import os
+import re
+import sys
+import copy
+import zlib
+import time
+import shlex
+import shutil
+import fnmatch
+import tarfile
+import argparse
+import platform
+import datetime
+import tempfile
+import posixpath
+import subprocess
+
+from build.common import *
+from build.config import *
+from build.build import *
+
+def die (msg):
+	print msg
+	sys.exit(-1)
+
+def removeLeadingPath (path, basePath):
+	# Both inputs must be normalized already
+	assert os.path.normpath(path) == path
+	assert os.path.normpath(basePath) == basePath
+	return path[len(basePath) + 1:]
+
+def findFile (candidates):
+	for file in candidates:
+		if os.path.exists(file):
+			return file
+	return None
+
+def getFileList (basePath):
+	allFiles	= []
+	basePath	= os.path.normpath(basePath)
+	for root, dirs, files in os.walk(basePath):
+		for file in files:
+			relPath = removeLeadingPath(os.path.normpath(os.path.join(root, file)), basePath)
+			allFiles.append(relPath)
+	return allFiles
+
+def toDatetime (dateTuple):
+	Y, M, D = dateTuple
+	return datetime.datetime(Y, M, D)
+
+class PackageBuildInfo:
+	def __init__ (self, releaseConfig, srcBasePath, dstBasePath, tmpBasePath):
+		self.releaseConfig	= releaseConfig
+		self.srcBasePath	= srcBasePath
+		self.dstBasePath	= dstBasePath
+		self.tmpBasePath	= tmpBasePath
+
+	def getReleaseConfig (self):
+		return self.releaseConfig
+
+	def getReleaseVersion (self):
+		return self.releaseConfig.getVersion()
+
+	def getReleaseId (self):
+		# Release id is crc32(releaseConfig + release)
+		return zlib.crc32(self.releaseConfig.getName() + self.releaseConfig.getVersion()) & 0xffffffff
+
+	def getSrcBasePath (self):
+		return self.srcBasePath
+
+	def getTmpBasePath (self):
+		return self.tmpBasePath
+
+class DstFile (object):
+	def __init__ (self, dstFile):
+		self.dstFile = dstFile
+
+	def makeDir (self):
+		dirName = os.path.dirname(self.dstFile)
+		if not os.path.exists(dirName):
+			os.makedirs(dirName)
+
+	def make (self, packageBuildInfo):
+		assert False # Should not be called
+
+class CopyFile (DstFile):
+	def __init__ (self, srcFile, dstFile):
+		super(CopyFile, self).__init__(dstFile)
+		self.srcFile = srcFile
+
+	def make (self, packageBuildInfo):
+		self.makeDir()
+		if os.path.exists(self.dstFile):
+			die("%s already exists" % self.dstFile)
+		shutil.copyfile(self.srcFile, self.dstFile)
+
+class GenInfoFile (DstFile):
+	def __init__ (self, srcFile, dstFile):
+		super(GenInfoFile, self).__init__(dstFile)
+		self.srcFile = srcFile
+
+	def make (self, packageBuildInfo):
+		self.makeDir()
+		print "    GenInfoFile: %s" % removeLeadingPath(self.dstFile, packageBuildInfo.dstBasePath)
+		src			= readFile(self.srcFile)
+
+		for define, value in [("DEQP_RELEASE_NAME", 	"\"%s\""	% packageBuildInfo.getReleaseVersion()),
+							  ("DEQP_RELEASE_ID",		"0x%08x"	% packageBuildInfo.getReleaseId())]:
+			src = re.sub('(#\s*define\s+%s\s+)[^\n\r]+' % re.escape(define), r'\1 %s' % value, src)
+
+		writeFile(self.dstFile, src)
+
+class GenCMake (DstFile):
+	def __init__ (self, srcFile, dstFile, replaceVars):
+		super(GenCMake, self).__init__(dstFile)
+		self.srcFile		= srcFile
+		self.replaceVars	= replaceVars
+
+	def make (self, packageBuildInfo):
+		self.makeDir()
+		print "    GenCMake: %s" % removeLeadingPath(self.dstFile, packageBuildInfo.dstBasePath)
+		src = readFile(self.srcFile)
+		for var, value in self.replaceVars:
+			src = re.sub('set\(%s\s+"[^"]*"' % re.escape(var),
+						 'set(%s "%s"' % (var, value), src)
+		writeFile(self.dstFile, src)
+
+def createFileTargets (srcBasePath, dstBasePath, files, filters):
+	usedFiles	= set() # Files that are already included by other filters
+	targets		= []
+
+	for isMatch, createFileObj in filters:
+		# Build list of files that match filter
+		matchingFiles = []
+		for file in files:
+			if not file in usedFiles and isMatch(file):
+				matchingFiles.append(file)
+
+		# Build file objects, add to used set
+		for file in matchingFiles:
+			usedFiles.add(file)
+			targets.append(createFileObj(os.path.join(srcBasePath, file), os.path.join(dstBasePath, file)))
+
+	return targets
+
+# Generates multiple file targets based on filters
+class FileTargetGroup:
+	def __init__ (self, srcBasePath, dstBasePath, filters, srcBasePathFunc=PackageBuildInfo.getSrcBasePath):
+		self.srcBasePath	= srcBasePath
+		self.dstBasePath	= dstBasePath
+		self.filters		= filters
+		self.getSrcBasePath	= srcBasePathFunc
+
+	def make (self, packageBuildInfo):
+		fullSrcPath		= os.path.normpath(os.path.join(self.getSrcBasePath(packageBuildInfo), self.srcBasePath))
+		fullDstPath		= os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstBasePath))
+
+		allFiles		= getFileList(fullSrcPath)
+		targets		 	= createFileTargets(fullSrcPath, fullDstPath, allFiles, self.filters)
+
+		# Make all file targets
+		for file in targets:
+			file.make(packageBuildInfo)
+
+# Single file target
+class SingleFileTarget:
+	def __init__ (self, srcFile, dstFile, makeTarget):
+		self.srcFile	= srcFile
+		self.dstFile	= dstFile
+		self.makeTarget	= makeTarget
+
+	def make (self, packageBuildInfo):
+		fullSrcPath		= os.path.normpath(os.path.join(packageBuildInfo.srcBasePath, self.srcFile))
+		fullDstPath		= os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile))
+
+		target = self.makeTarget(fullSrcPath, fullDstPath)
+		target.make(packageBuildInfo)
+
+class BuildTarget:
+	def __init__ (self, baseConfig, generator, targets = None):
+		self.baseConfig	= baseConfig
+		self.generator	= generator
+		self.targets	= targets
+
+	def make (self, packageBuildInfo):
+		print "    Building %s" % self.baseConfig.getBuildDir()
+
+		# Create config with full build dir path
+		config = BuildConfig(os.path.join(packageBuildInfo.getTmpBasePath(), self.baseConfig.getBuildDir()),
+							 self.baseConfig.getBuildType(),
+							 self.baseConfig.getArgs(),
+							 srcPath = os.path.join(packageBuildInfo.dstBasePath, "src"))
+
+		assert not os.path.exists(config.getBuildDir())
+		build(config, self.generator, self.targets)
+
+class BuildAndroidTarget:
+	def __init__ (self, dstFile):
+		self.dstFile = dstFile
+
+	def make (self, packageBuildInfo):
+		print "    Building Android binary"
+
+		buildRoot = os.path.join(packageBuildInfo.tmpBasePath, "android-build")
+
+		assert not os.path.exists(buildRoot)
+		os.makedirs(buildRoot)
+
+		# Execute build script
+		scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "android", "scripts", "build.py"))
+		execute([
+				"python",
+				"-B", # no .py[co]
+				scriptPath,
+				"--build-root=%s" % buildRoot,
+			])
+
+		srcFile		= os.path.normpath(os.path.join(buildRoot, "package", "bin", "dEQP-debug.apk"))
+		dstFile		= os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile))
+
+		CopyFile(srcFile, dstFile).make(packageBuildInfo)
+
+class FetchExternalSourcesTarget:
+	def __init__ (self):
+		pass
+
+	def make (self, packageBuildInfo):
+		scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "external", "fetch_sources.py"))
+		execute([
+				"python",
+				"-B", # no .py[co]
+				scriptPath,
+			])
+
+class RemoveSourcesTarget:
+	def __init__ (self):
+		pass
+
+	def make (self, packageBuildInfo):
+		shutil.rmtree(os.path.join(packageBuildInfo.dstBasePath, "src"), ignore_errors=False)
+
+class Module:
+	def __init__ (self, name, targets):
+		self.name		= name
+		self.targets	= targets
+
+	def make (self, packageBuildInfo):
+		for target in self.targets:
+			target.make(packageBuildInfo)
+
+class ReleaseConfig:
+	def __init__ (self, name, version, modules, sources = True):
+		self.name			= name
+		self.version		= version
+		self.modules		= modules
+		self.sources		= sources
+
+	def getName (self):
+		return self.name
+
+	def getVersion (self):
+		return self.version
+
+	def getModules (self):
+		return self.modules
+
+	def packageWithSources (self):
+		return self.sources
+
+def matchIncludeExclude (includePatterns, excludePatterns, filename):
+	components = os.path.normpath(filename).split(os.sep)
+	for pattern in excludePatterns:
+		for component in components:
+			if fnmatch.fnmatch(component, pattern):
+				return False
+
+	for pattern in includePatterns:
+		for component in components:
+			if fnmatch.fnmatch(component, pattern):
+				return True
+
+	return False
+
+def copyFileFilter (includePatterns, excludePatterns=[]):
+	return (lambda f: matchIncludeExclude(includePatterns, excludePatterns, f),
+			lambda s, d: CopyFile(s, d))
+
+def makeFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]):
+	return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)])
+
+def makeTmpFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]):
+	return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)], PackageBuildInfo.getTmpBasePath)
+
+def makeFileCopy (srcFile, dstFile):
+	return SingleFileTarget(srcFile, dstFile, lambda s, d: CopyFile(s, d))
+
+def getReleaseFileName (configName, releaseName):
+	today = datetime.date.today()
+	return "dEQP-%s-%04d-%02d-%02d-%s" % (releaseName, today.year, today.month, today.day, configName)
+
+def getTempDir ():
+	dirName = os.path.join(tempfile.gettempdir(), "dEQP-Releases")
+	if not os.path.exists(dirName):
+		os.makedirs(dirName)
+	return dirName
+
+def makeRelease (releaseConfig):
+	releaseName			= getReleaseFileName(releaseConfig.getName(), releaseConfig.getVersion())
+	tmpPath				= getTempDir()
+	srcBasePath			= DEQP_DIR
+	dstBasePath			= os.path.join(tmpPath, releaseName)
+	tmpBasePath			= os.path.join(tmpPath, releaseName + "-tmp")
+	packageBuildInfo	= PackageBuildInfo(releaseConfig, srcBasePath, dstBasePath, tmpBasePath)
+	dstArchiveName		= releaseName + ".tar.bz2"
+
+	print "Creating release %s to %s" % (releaseName, tmpPath)
+
+	# Remove old temporary dirs
+	for path in [dstBasePath, tmpBasePath]:
+		if os.path.exists(path):
+			shutil.rmtree(path, ignore_errors=False)
+
+	# Make all modules
+	for module in releaseConfig.getModules():
+		print "  Processing module %s" % module.name
+		module.make(packageBuildInfo)
+
+	# Remove sources?
+	if not releaseConfig.packageWithSources():
+		shutil.rmtree(os.path.join(dstBasePath, "src"), ignore_errors=False)
+
+	# Create archive
+	print "Creating %s" % dstArchiveName
+	archive	= tarfile.open(dstArchiveName, 'w:bz2')
+	archive.add(dstBasePath, arcname=releaseName)
+	archive.close()
+
+	# Remove tmp dirs
+	for path in [dstBasePath, tmpBasePath]:
+		if os.path.exists(path):
+			shutil.rmtree(path, ignore_errors=False)
+
+	print "Done!"
+
+# Module declarations
+
+SRC_FILE_PATTERNS	= ["*.h", "*.hpp", "*.c", "*.cpp", "*.m", "*.mm", "*.inl", "*.java", "*.aidl", "CMakeLists.txt", "LICENSE.txt", "*.cmake"]
+TARGET_PATTERNS		= ["*.cmake", "*.h", "*.lib", "*.dll", "*.so", "*.txt"]
+
+BASE = Module("Base", [
+	makeFileCopy		("LICENSE",									"src/LICENSE"),
+	makeFileCopy		("CMakeLists.txt",							"src/CMakeLists.txt"),
+	makeFileCopyGroup	("targets",									"src/targets",							TARGET_PATTERNS),
+	makeFileCopyGroup	("execserver",								"src/execserver",						SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("executor",								"src/executor",							SRC_FILE_PATTERNS),
+	makeFileCopy		("modules/CMakeLists.txt", 					"src/modules/CMakeLists.txt"),
+	makeFileCopyGroup	("external", 								"src/external",							["CMakeLists.txt", "*.py"]),
+
+	# Stylesheet for displaying test logs on browser
+	makeFileCopyGroup	("doc/testlog-stylesheet",					"doc/testlog-stylesheet",				["*"]),
+
+	# Non-optional parts of framework
+	# \note qpInfo.c must be processed!
+	FileTargetGroup		("framework", "src/framework", [
+			# If file is qpInfo.c use GenInfoFile
+			(lambda f: f[-8:] == "qpInfo.c", lambda s, d: GenInfoFile(s, d)),
+			# Otherwise just CopyFile targets
+			copyFileFilter(SRC_FILE_PATTERNS, ["imagedifftester", "randomshaders", "simplereference", "referencerenderer"])
+		]),
+
+	# Main modules CMakeLists.txt
+
+	# android sources
+	makeFileCopyGroup	("android/package/src",						"src/android/package/src",				SRC_FILE_PATTERNS),
+	makeFileCopy		("android/package/AndroidManifest.xml",		"src/android/package/AndroidManifest.xml"),
+	makeFileCopyGroup	("android/package/res",						"src/android/package/res",				["*.png", "*.xml"]),
+	makeFileCopyGroup	("android/scripts",							"src/android/scripts", [
+		"common.py",
+		"build.py",
+		"resources.py",
+		"install.py",
+		"launch.py",
+		"debug.py"
+		]),
+])
+
+DOCUMENTATION = Module("Documentation", [
+	makeFileCopyGroup	("doc/pdf",									"doc",									["*.pdf"]),
+	makeFileCopyGroup	("doc",										"doc",									["porting_layer_changes_*.txt"]),
+])
+
+GLSHARED = Module("Shared GL Tests", [
+	# Optional framework components
+	makeFileCopyGroup	("framework/randomshaders",					"src/framework/randomshaders",			SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("framework/opengl/simplereference",		"src/framework/opengl/simplereference",	SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("framework/referencerenderer",				"src/framework/referencerenderer",		SRC_FILE_PATTERNS),
+
+	makeFileCopyGroup	("modules/glshared",						"src/modules/glshared",					SRC_FILE_PATTERNS),
+])
+
+GLES2 = Module("GLES2", [
+	makeFileCopyGroup	("modules/gles2",							"src/modules/gles2",					SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("data/gles2",								"src/data/gles2", 						["*.*"]),
+	makeFileCopyGroup	("doc/testspecs/GLES2",						"doc/testspecs/GLES2",					["*.txt"])
+])
+
+GLES3 = Module("GLES3", [
+	makeFileCopyGroup	("modules/gles3",							"src/modules/gles3",					SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("data/gles3",								"src/data/gles3", 						["*.*"]),
+	makeFileCopyGroup	("doc/testspecs/GLES3",						"doc/testspecs/GLES3",					["*.txt"])
+])
+
+GLES31 = Module("GLES31", [
+	makeFileCopyGroup	("modules/gles31",							"src/modules/gles31",					SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("data/gles31",								"src/data/gles31", 						["*.*"]),
+	makeFileCopyGroup	("doc/testspecs/GLES31",					"doc/testspecs/GLES31",					["*.txt"])
+])
+
+EGL = Module("EGL", [
+	makeFileCopyGroup	("modules/egl",								"src/modules/egl",						SRC_FILE_PATTERNS)
+])
+
+INTERNAL = Module("Internal", [
+	makeFileCopyGroup	("modules/internal",						"src/modules/internal",					SRC_FILE_PATTERNS),
+	makeFileCopyGroup	("data/internal",							"src/data/internal", 					["*.*"]),
+])
+
+EXTERNAL_SRCS = Module("External sources", [
+	FetchExternalSourcesTarget()
+])
+
+ANDROID_BINARIES = Module("Android Binaries", [
+	BuildAndroidTarget	("bin/android/dEQP.apk"),
+	makeFileCopyGroup	("targets/android",							"bin/android",							["*.bat", "*.sh"]),
+])
+
+COMMON_BUILD_ARGS	= ['-DPNG_SRC_PATH=%s' % os.path.realpath(os.path.join(DEQP_DIR, '..', 'libpng'))]
+NULL_X32_CONFIG		= BuildConfig('null-x32',	'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS)
+NULL_X64_CONFIG		= BuildConfig('null-x64',	'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS)
+GLX_X32_CONFIG		= BuildConfig('glx-x32',	'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS)
+GLX_X64_CONFIG		= BuildConfig('glx-x64',	'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS)
+
+EXCLUDE_BUILD_FILES = ["CMakeFiles", "*.a", "*.cmake"]
+
+LINUX_X32_COMMON_BINARIES = Module("Linux x32 Common Binaries", [
+	BuildTarget			(NULL_X32_CONFIG, ANY_UNIX_GENERATOR),
+	makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/execserver",		"bin/linux32",					["*"],	EXCLUDE_BUILD_FILES),
+	makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/executor",		"bin/linux32",					["*"],	EXCLUDE_BUILD_FILES),
+])
+
+LINUX_X64_COMMON_BINARIES = Module("Linux x64 Common Binaries", [
+	BuildTarget			(NULL_X64_CONFIG, ANY_UNIX_GENERATOR),
+	makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/execserver",		"bin/linux64",					["*"],	EXCLUDE_BUILD_FILES),
+	makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/executor",		"bin/linux64",					["*"],	EXCLUDE_BUILD_FILES),
+])
+
+# Special module to remove src dir, for example after binary build
+REMOVE_SOURCES = Module("Remove sources from package", [
+	RemoveSourcesTarget()
+])
+
+# Release configuration
+
+ALL_MODULES		= [
+	BASE,
+	DOCUMENTATION,
+	GLSHARED,
+	GLES2,
+	GLES3,
+	GLES31,
+	EGL,
+	INTERNAL,
+	EXTERNAL_SRCS,
+]
+
+ALL_BINARIES	= [
+	LINUX_X64_COMMON_BINARIES,
+	ANDROID_BINARIES,
+]
+
+RELEASE_CONFIGS	= {
+	"src":		ALL_MODULES,
+	"src-bin":	ALL_MODULES + ALL_BINARIES,
+	"bin":		ALL_MODULES + ALL_BINARIES + [REMOVE_SOURCES],
+}
+
+def parseArgs ():
+	parser = argparse.ArgumentParser(description = "Build release package")
+	parser.add_argument("-c",
+						"--config",
+						dest="config",
+						choices=RELEASE_CONFIGS.keys(),
+						required=True,
+						help="Release configuration")
+	parser.add_argument("-n",
+						"--name",
+						dest="name",
+						required=True,
+						help="Package-specific name")
+	parser.add_argument("-v",
+						"--version",
+						dest="version",
+						required=True,
+						help="Version code")
+	return parser.parse_args()
+
+if __name__ == "__main__":
+	args	= parseArgs()
+	config	= ReleaseConfig(args.name, args.version, RELEASE_CONFIGS[args.config])
+	makeRelease(config)
diff --git a/targets/android/install.bat b/targets/android/install.bat
index a7be860..42534b1 100644
--- a/targets/android/install.bat
+++ b/targets/android/install.bat
@@ -1,6 +1,6 @@
 @echo off
 echo Removing old dEQP Ondevice Package...
-adb %* uninstall com.drawelements.deqp.execserver
+adb %* uninstall com.drawelements.deqp
 
 echo Installing dEQP Ondevice Package...
-adb %* install -r dEQP-ondevice.apk
+adb %* install -r dEQP.apk
diff --git a/targets/android/install.sh b/targets/android/install.sh
new file mode 100755
index 0000000..1ac9130
--- /dev/null
+++ b/targets/android/install.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+echo "Removing old dEQP Ondevice Package..."
+adb $* uninstall com.drawelements.deqp
+
+echo "Installing dEQP Ondevice Package..."
+adb $* install -r dEQP.apk
diff --git a/targets/android/launch.bat b/targets/android/launch.bat
index 05e6d77..2f89947 100644
--- a/targets/android/launch.bat
+++ b/targets/android/launch.bat
@@ -1,4 +1,4 @@
 @echo off
 adb %* forward tcp:50016 tcp:50016
 adb %* shell setprop log.tag.dEQP DEBUG
-adb %* shell am start -n com.drawelements.deqp.execserver/.ServiceStarter
+adb %* shell am start -n com.drawelements.deqp/.execserver.ServiceStarter