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