Merge vk-gl-cts/master into vk-gl-cts/vulkan-cts-next-dev

Change-Id: If0522fee34abd42178dce1878d65f663c60a5d5a
diff --git a/Android.mk b/Android.mk
index 5f8a27d..d82732b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -51,6 +51,11 @@
 LOCAL_NDK_STL_VARIANT := gnustl_static
 LOCAL_RTTI_FLAG := -frtti -fexceptions
 LOCAL_MULTILIB := both
+LOCAL_TIDY_CHECKS := \
+    -google-build-explicit-make-pair, \
+    -google-global-names-in-headers, \
+    -google-runtime-member-string-references, \
+    -google-runtime-operator, \
 
 include $(BUILD_SHARED_LIBRARY)
 
diff --git a/AndroidGen.mk b/AndroidGen.mk
index 17ae902..50c7b29 100644
--- a/AndroidGen.mk
+++ b/AndroidGen.mk
@@ -215,6 +215,7 @@
 	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp \
 	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp \
 	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmTests.cpp \
+	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.cpp \
 	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUtils.cpp \
 	external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp \
 	external/vulkancts/modules/vulkan/ssbo/vktSSBOLayoutCase.cpp \
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 779afb9..5dccf9b 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
@@ -161947,6 +161947,7 @@
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.scalar_uint
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.vector_sint
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.vector_uint
+dEQP-VK.spirv_assembly.instruction.compute.ubo_padding.mat2x2
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opselect_single_buffer
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opfunctioncall_single_buffer
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opphi_single_buffer
@@ -163984,6 +163985,11 @@
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_geom
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_frag
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_vert
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_geom
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_frag
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_vert
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_tesse
@@ -199463,6 +199469,34 @@
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_intermediate_values
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_end_result
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_intermediate_values
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_unorm
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_snorm
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_uscaled
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl30-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl30-khr-master.txt
new file mode 100644
index 0000000..ead6f7c
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl30-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.gl30.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl45-khr-master.txt
similarity index 90%
rename from external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt
rename to external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl45-khr-master.txt
index f86fed4..62e8d73 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/noctx-khr-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/gl45-khr-master.txt
@@ -1,4 +1,3 @@
-KHR-NoContext.gl30.no_error.create_context
 KHR-NoContext.gl45.robustness.no_reset_notification
 KHR-NoContext.gl45.robustness.lose_context_on_reset
 KHR-NoContext.gl45.robustness.getnuniform
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml
index f61d5a7..cf19eaa 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/mustpass.xml
@@ -18,7 +18,7 @@
  * be lost! Modify the generating script instead.
  */-->
 	<TestPackage name="Khronos Mustpass GL NoContext">
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gl30-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gl45-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
 	</TestPackage>
 </Mustpass>
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl30-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl30-khr-master.txt
new file mode 100644
index 0000000..415e7ce
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl30-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.gl30.*
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl45-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl45-khr-master.txt
new file mode 100644
index 0000000..ff9df88
--- /dev/null
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/gl45-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.gl45.*
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt
deleted file mode 100644
index 706eb29..0000000
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/src/noctx-khr-master.txt
+++ /dev/null
@@ -1 +0,0 @@
-KHR-NoContext.gl*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles2-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles2-khr-master.txt
new file mode 100644
index 0000000..e363547
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles2-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles32-khr-master.txt
similarity index 90%
rename from external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
rename to external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles32-khr-master.txt
index 317a0a0..985fc13 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/gles32-khr-master.txt
@@ -1,4 +1,3 @@
-KHR-NoContext.es2.no_error.create_context
 KHR-NoContext.es32.robustness.no_reset_notification
 KHR-NoContext.es32.robustness.lose_context_on_reset
 KHR-NoContext.es32.robustness.getnuniform
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml
index 56b29ce..5528e4d 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/mustpass.xml
@@ -18,7 +18,7 @@
  * be lost! Modify the generating script instead.
  */-->
 	<TestPackage name="Khronos Mustpass ES NoContext">
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gles2-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gles32-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
 	</TestPackage>
 </Mustpass>
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles2-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles2-khr-master.txt
new file mode 100644
index 0000000..b794ccb
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles2-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles32-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles32-khr-master.txt
new file mode 100644
index 0000000..ed73a1c
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/gles32-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es32.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt
deleted file mode 100644
index 8b3a676..0000000
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/src/noctx-khr-master.txt
+++ /dev/null
@@ -1 +0,0 @@
-KHR-NoContext.es*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles2-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles2-khr-master.txt
new file mode 100644
index 0000000..e363547
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles2-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.no_error.create_context
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles32-khr-master.txt
similarity index 90%
copy from external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
copy to external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles32-khr-master.txt
index 317a0a0..985fc13 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/noctx-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/gles32-khr-master.txt
@@ -1,4 +1,3 @@
-KHR-NoContext.es2.no_error.create_context
 KHR-NoContext.es32.robustness.no_reset_notification
 KHR-NoContext.es32.robustness.lose_context_on_reset
 KHR-NoContext.es32.robustness.getnuniform
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml
index 6c41041..5bc5063 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/mustpass.xml
@@ -18,7 +18,7 @@
  * be lost! Modify the generating script instead.
  */-->
 	<TestPackage name="Khronos Mustpass ES NoContext">
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
-		<Configuration caseListFile="noctx-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=113 --deqp-surface-height=47 --deqp-base-seed=2 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gles2-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
+		<Configuration caseListFile="gles32-khr-master.txt" commandLine="--deqp-screen-rotation=unspecified --deqp-surface-width=64 --deqp-surface-height=64 --deqp-base-seed=1 --deqp-watchdog=disable" name="khr-master" os="any" useForFirstEGLConfig="True"/>
 	</TestPackage>
 </Mustpass>
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt
deleted file mode 100644
index 317a0a0..0000000
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/noctx-khr-master.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-KHR-NoContext.es2.no_error.create_context
-KHR-NoContext.es32.robustness.no_reset_notification
-KHR-NoContext.es32.robustness.lose_context_on_reset
-KHR-NoContext.es32.robustness.getnuniform
-KHR-NoContext.es32.robustness.readnpixels
-KHR-NoContext.es32.context_flags.no_flags_set_case
-KHR-NoContext.es32.context_flags.debug_flag_set_case
-KHR-NoContext.es32.context_flags.robust_flag_set_case
-KHR-NoContext.es32.context_flags.all_flags_set_case
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles2-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles2-khr-master.txt
new file mode 100644
index 0000000..b794ccb
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles2-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es2.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles32-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles32-khr-master.txt
new file mode 100644
index 0000000..ed73a1c
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/gles32-khr-master.txt
@@ -0,0 +1 @@
+KHR-NoContext.es32.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt
deleted file mode 100644
index 8b3a676..0000000
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass_noctx/master/src/noctx-khr-master.txt
+++ /dev/null
@@ -1 +0,0 @@
-KHR-NoContext.es*
diff --git a/external/openglcts/modules/common/glcPolygonOffsetClampTests.cpp b/external/openglcts/modules/common/glcPolygonOffsetClampTests.cpp
index 68caa2a..65c8e19 100644
--- a/external/openglcts/modules/common/glcPolygonOffsetClampTests.cpp
+++ b/external/openglcts/modules/common/glcPolygonOffsetClampTests.cpp
@@ -353,7 +353,7 @@
 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
 
 	bool result = true;
-	for (uint32_t i = 0; i < m_testValues.size(); ++i)
+	for (GLuint i = 0; i < m_testValues.size(); ++i)
 	{
 		// Prepare verification variables
 		GLfloat depthValue			  = 0.0f;
@@ -522,7 +522,7 @@
  *  @param offsetDepth      Case iteration number
  *  @param offsetClampDepth Case iteration number
  */
-bool PolygonOffsetClampMinMaxTestCase::verify(uint32_t caseNo, GLfloat depth, GLfloat offsetDepth,
+bool PolygonOffsetClampMinMaxTestCase::verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth,
 											  GLfloat offsetClampDepth)
 {
 	// Min offset case
@@ -584,7 +584,7 @@
 	m_testValues.push_back(PolygonOffsetClampValues(0.0f, 1000.0f, INFINITY));   // Max Offset, infinity clamp case
 }
 
-bool PolygonOffsetClampZeroInfinityTestCase::verify(uint32_t caseNo, GLfloat depth, GLfloat offsetDepth,
+bool PolygonOffsetClampZeroInfinityTestCase::verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth,
 													GLfloat offsetClampDepth)
 {
 	DE_UNREF(caseNo);
diff --git a/external/openglcts/modules/common/glcPolygonOffsetClampTests.hpp b/external/openglcts/modules/common/glcPolygonOffsetClampTests.hpp
index 999957d..7eaefe2 100644
--- a/external/openglcts/modules/common/glcPolygonOffsetClampTests.hpp
+++ b/external/openglcts/modules/common/glcPolygonOffsetClampTests.hpp
@@ -102,7 +102,7 @@
 
 	float readDepthValue(const glw::Functions& gl, const GLuint readDepthProgramId);
 
-	virtual bool verify(uint32_t caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth) = DE_NULL;
+	virtual bool verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth) = DE_NULL;
 };
 
 /** Test verifies if polygon offset clamp works as expected for zero and infinite clamp values
@@ -117,10 +117,10 @@
 
 protected:
 	/* Protected methods */
-	bool verify(uint32_t caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth);
+	bool verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth);
 };
 
-/** Test verifies ...
+/** Test verifies if polygon offset clamp works as expected for zero and infinite clamp values
 **/
 class PolygonOffsetClampZeroInfinityTestCase : public PolygonOffsetClampValueTestCaseBase
 {
@@ -132,7 +132,7 @@
 
 protected:
 	/* Protected methods */
-	bool verify(uint32_t caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth);
+	bool verify(GLuint caseNo, GLfloat depth, GLfloat offsetDepth, GLfloat offsetClampDepth);
 };
 
 /** Test group which encapsulates all ARB_shader_group_vote conformance tests */
diff --git a/external/openglcts/modules/gl/gl4cDirectStateAccessXFBTests.cpp b/external/openglcts/modules/gl/gl4cDirectStateAccessXFBTests.cpp
index f71b258..026fda0 100644
--- a/external/openglcts/modules/gl/gl4cDirectStateAccessXFBTests.cpp
+++ b/external/openglcts/modules/gl/gl4cDirectStateAccessXFBTests.cpp
@@ -588,7 +588,7 @@
 			is_ok &= testStart(1, 0, "glTransformFeedbackBufferRange");
 			is_ok &= testStart(2, s_bo_size / 2, "glTransformFeedbackBufferRange");
 
-			is_ok &= testSize(0, s_bo_size, "glTransformFeedbackBufferBase");
+			is_ok &= testSize(0, 0, "glTransformFeedbackBufferBase");
 			is_ok &= testSize(1, s_bo_size / 2, "glTransformFeedbackBufferRange");
 			is_ok &= testSize(2, s_bo_size / 2, "glTransformFeedbackBufferRange");
 		}
diff --git a/external/openglcts/modules/gl/gl4cProgramInterfaceQueryTests.cpp b/external/openglcts/modules/gl/gl4cProgramInterfaceQueryTests.cpp
index 8bfd856..648aea0 100644
--- a/external/openglcts/modules/gl/gl4cProgramInterfaceQueryTests.cpp
+++ b/external/openglcts/modules/gl/gl4cProgramInterfaceQueryTests.cpp
@@ -2748,8 +2748,8 @@
 	{
 		long error = NO_ERROR;
 
-		GLint   res;
-		GLsizei len;
+		GLint   res = 0;
+		GLsizei len = 0;
 		GLchar  name[100] = { '\0' };
 		GLenum  props[1]  = { GL_NAME_LENGTH };
 
@@ -2833,8 +2833,8 @@
 
 		long error = NO_ERROR;
 
-		GLint   res;
-		GLsizei len;
+		GLint   res = 0;
+		GLsizei len = 0;
 		GLchar  name[100] = { '\0' };
 		GLenum  props[1]  = { GL_TEXTURE_1D };
 
@@ -2895,8 +2895,8 @@
 		LinkProgram(program);
 
 		const GLuint sh = glCreateShader(GL_FRAGMENT_SHADER);
-		GLint		 res;
-		GLsizei		 len;
+		GLint		 res = 0;
+		GLsizei		 len = 0;
 		GLchar		 name[100] = { '\0' };
 		GLenum		 props[1]  = { GL_OFFSET };
 
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
index 4b61afa..b4130de 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
@@ -22,8 +22,8 @@
 const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_noctx/3.2.4.x/";
 
 static const RunParams khronos_mustpass_es_nocontext_first_cfg[] = {
-	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
-	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 2, DE_NULL, 113, 47 },
+	{ glu::ApiType::es(2, 0), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+	{ glu::ApiType::es(3, 2), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
 };
 
 #endif // _GLCKHRONOSMUSTPASSESNOCONTEXT_HPP
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp b/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp
index 2a51d14..9939b61 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassGlNocontext.hpp
@@ -22,8 +22,8 @@
 const char* mustpassDir = "gl_cts/data/mustpass/gl/khronos_mustpass_noctx/4.5.5.x/";
 
 static const RunParams khronos_mustpass_gl_nocontext_first_cfg[] = {
-	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
-	{ glu::ApiType(), "khr-master", DE_NULL, "unspecified", 2, DE_NULL, 113, 47 },
+	{ glu::ApiType::core(3, 0), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
+	{ glu::ApiType::core(4, 5), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
 };
 
 #endif // _GLCKHRONOSMUSTPASSGLNOCONTEXT_HPP
diff --git a/external/openglcts/modules/runner/glcTestRunner.cpp b/external/openglcts/modules/runner/glcTestRunner.cpp
index afbd316..4b94179 100644
--- a/external/openglcts/modules/runner/glcTestRunner.cpp
+++ b/external/openglcts/modules/runner/glcTestRunner.cpp
@@ -363,14 +363,17 @@
 	}
 }
 
-static void getTestRunsForNoContext(vector<TestRunParams>& runs, const ConfigList& configs, const RunParams* runParams,
+static void getTestRunsForNoContext(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs, const RunParams* runParams,
 									const int numRunParams, const char* mustpassDir)
 {
 	vector<Config>::const_iterator cfgIter = configs.configs.begin();
 
 	for (int i = 0; i < numRunParams; ++i)
 	{
-		const char* apiName = "noctx";
+		if (!glu::contextSupports(glu::ContextType(type), runParams[i].apiType))
+				continue;
+
+		const char* apiName = getApiName(runParams[i].apiType);
 
 		const int width  = runParams[i].surfaceWidth;
 		const int height = runParams[i].surfaceHeight;
@@ -390,10 +393,10 @@
 	}
 }
 
-static void getTestRunsForNoContextES(vector<TestRunParams>& runs, const ConfigList& configs)
+static void getTestRunsForNoContextES(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs)
 {
 #include "glcKhronosMustpassEsNocontext.hpp"
-	getTestRunsForNoContext(runs, configs, khronos_mustpass_es_nocontext_first_cfg,
+	getTestRunsForNoContext(type, runs, configs, khronos_mustpass_es_nocontext_first_cfg,
 							DE_LENGTH_OF_ARRAY(khronos_mustpass_es_nocontext_first_cfg), mustpassDir);
 }
 
@@ -401,7 +404,7 @@
 {
 	getTestRunsForAOSPEGL(runs, configs);
 	getTestRunsForAOSPES(runs, configs, type);
-	getTestRunsForNoContextES(runs, configs);
+	getTestRunsForNoContextES(type, runs, configs);
 
 #include "glcKhronosMustpassEs.hpp"
 
@@ -439,16 +442,16 @@
 	}
 }
 
-static void getTestRunsForNoContextGL(vector<TestRunParams>& runs, const ConfigList& configs)
+static void getTestRunsForNoContextGL(glu::ApiType type, vector<TestRunParams>& runs, const ConfigList& configs)
 {
 #include "glcKhronosMustpassGlNocontext.hpp"
-	getTestRunsForNoContext(runs, configs, khronos_mustpass_gl_nocontext_first_cfg,
+	getTestRunsForNoContext(type, runs, configs, khronos_mustpass_gl_nocontext_first_cfg,
 							DE_LENGTH_OF_ARRAY(khronos_mustpass_gl_nocontext_first_cfg), mustpassDir);
 }
 
 static void getTestRunsForGL(glu::ApiType type, const ConfigList& configs, vector<TestRunParams>& runs)
 {
-	getTestRunsForNoContextGL(runs, configs);
+	getTestRunsForNoContextGL(type, runs, configs);
 #include "glcKhronosMustpassGl.hpp"
 
 	for (vector<Config>::const_iterator cfgIter = configs.configs.begin(); cfgIter != configs.configs.end(); ++cfgIter)
diff --git a/external/openglcts/scripts/build_caselists.py b/external/openglcts/scripts/build_caselists.py
index 8c30f55..bf84af2 100644
--- a/external/openglcts/scripts/build_caselists.py
+++ b/external/openglcts/scripts/build_caselists.py
@@ -48,11 +48,11 @@
 	Module("KHR-GLES2",		"GLES2"),
 	Module("KHR-GLES31",	"GLES31"),
 	Module("KHR-GLES32",	"GLES32"),
-	Module("KHR-NoContext",	"NOCTX"),
+	Module("KHR-NOCTX-ES2",	"GLES2"),
+	Module("KHR-NOCTX-ES32","GLES32"),
 	Module("GTF-GLES2",		"GLES2" ),
 	Module("GTF-GLES3",		"GLES3" ),
 	Module("GTF-GLES31",	"GLES31"),
-	Module("KHR-NoContext",	"NOCTX"),
 	Module("KHR-GL45",		"GL45"),
 	Module("KHR-GL44",		"GL44"),
 	Module("KHR-GL43",		"GL43"),
@@ -73,6 +73,8 @@
 	Module("GTF-GL32",		"GL32"),
 	Module("GTF-GL31",		"GL31"),
 	Module("GTF-GL30",		"GL30"),
+	Module("KHR-NOCTX-GL30","GL30"),
+	Module("KHR-NOCTX-GL45","GL45"),
 ]
 GLCTS_BIN_NAME = "glcts"
 GLCTS_DIR_NAME = "external/openglcts/modules/"
@@ -97,7 +99,10 @@
 	return os.path.join(buildCfg.getBuildDir(), GLCTS_DIR_NAME)
 
 def getCaseListFileName (module, caseListType):
-	return "%s-cases.%s" % (module.name, caseListType)
+	mname = module.name
+	if mname == "KHR-NOCTX-ES2" or mname == "KHR-NOCTX-ES32" or mname == "KHR-NOCTX-GL30" or mname == "KHR-NOCTX-GL45":
+		mname =  "KHR-NoContext"
+	return "%s-cases.%s" % (mname, caseListType)
 
 def getCaseListPath (buildCfg, module, caseListType):
 	workDir = getModulesPath(buildCfg)
diff --git a/external/openglcts/scripts/build_mustpass.py b/external/openglcts/scripts/build_mustpass.py
index 3a44d56..488d9de 100644
--- a/external/openglcts/scripts/build_mustpass.py
+++ b/external/openglcts/scripts/build_mustpass.py
@@ -88,7 +88,8 @@
 ES3KHR_MODULE					= getModuleByName("KHR-GLES3")
 ES31KHR_MODULE					= getModuleByName("KHR-GLES31")
 ES32KHR_MODULE					= getModuleByName("KHR-GLES32")
-NOCTXKHR_MODULE					= getModuleByName("KHR-NoContext")
+NOCTX_ES2_KHR_MODULE			= getModuleByName("KHR-NOCTX-ES2")
+NOCTX_ES32_KHR_MODULE			= getModuleByName("KHR-NOCTX-ES32")
 
 ES2GTF_MODULE					= getModuleByName("GTF-GLES2")
 ES3GTF_MODULE					= getModuleByName("GTF-GLES3")
@@ -851,18 +852,22 @@
 					filters			= [include("gles32-khr-master.txt")]),
 	])
 
-GLCTS_NOCTX_KHR_PKG_1CFG			= Package(module = NOCTXKHR_MODULE, configurations = [
+GLCTS_NOCTX_ES2_KHR_PKG			= Package(module = NOCTX_ES2_KHR_MODULE, configurations = [
 		# Master
 		Configuration(name			= "khr-master",
 					surfacewidth	= "64",
 					surfaceheight	= "64",
 					baseseed		= "1",
-					filters			= [include("noctx-khr-master.txt")]),
+					filters			= [include("gles2-khr-master.txt")]),
+	])
+
+GLCTS_NOCTX_ES32_KHR_PKG		= Package(module = NOCTX_ES32_KHR_MODULE, configurations = [
+		# Master
 		Configuration(name			= "khr-master",
-					surfacewidth	= "113",
-					surfaceheight	= "47",
-					baseseed		= "2",
-					filters			= [include("noctx-khr-master.txt")]),
+					surfacewidth	= "64",
+					surfaceheight	= "64",
+					baseseed		= "1",
+					filters			= [include("gles32-khr-master.txt")]),
 	])
 
 ES_MUSTPASS_LISTS		= [
@@ -931,7 +936,7 @@
 
 
 	Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "3.2.4.x", isCurrent=True,
-			packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+			packages = [GLCTS_NOCTX_ES2_KHR_PKG, GLCTS_NOCTX_ES32_KHR_PKG]),
 
 	Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "3.2.4.x", isCurrent=True,
 			packages = [GLCTS_3_2_3_GLES2_PKG, GLCTS_3_2_3_GLES3_PKG, GLCTS_3_2_3_GLES31_PKG]),
@@ -953,7 +958,7 @@
 						]),
 
 	Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "master", isCurrent=False,
-			packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+			packages = [GLCTS_NOCTX_ES2_KHR_PKG, GLCTS_NOCTX_ES32_KHR_PKG]),
 
 	Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "master", isCurrent=False,
 			packages = [MASTER_GLES2_PKG, MASTER_GLES3_PKG, MASTER_GLES31_PKG]),
@@ -1004,6 +1009,27 @@
 			('GTF-GL30',		['gtf-master',	[include('gl30-gtf-master.txt')]])
 		])
 
+NOCTX_GL30_KHR_MODULE			= getModuleByName("KHR-NOCTX-GL30")
+NOCTX_GL45_KHR_MODULE			= getModuleByName("KHR-NOCTX-GL45")
+
+GLCTS_NOCTX_GL30_KHR_PKG			= Package(module = NOCTX_GL30_KHR_MODULE, configurations = [
+		# Master
+		Configuration(name			= "khr-master",
+					surfacewidth	= "64",
+					surfaceheight	= "64",
+					baseseed		= "1",
+					filters			= [include("gl30-khr-master.txt")]),
+	])
+
+GLCTS_NOCTX_GL45_KHR_PKG			= Package(module = NOCTX_GL45_KHR_MODULE, configurations = [
+		# Master
+		Configuration(name			= "khr-master",
+					surfacewidth	= "64",
+					surfaceheight	= "64",
+					baseseed		= "1",
+					filters			= [include("gl45-khr-master.txt")]),
+	])
+
 def generateGLMustpass():
 		gl_packages = []
 		for packageName in GL_MODULES:
@@ -1031,7 +1057,7 @@
 			gl_packages.append(pkg1)
 
 		mustpass = [Mustpass(project = GL_CTS_KHR_MP_PROJECT, version = "4.5.5.x", isCurrent=True, packages = gl_packages),
-					Mustpass(project = GL_CTS_NOCTX_PROJECT, version = "4.5.5.x", isCurrent=True, packages = [GLCTS_NOCTX_KHR_PKG_1CFG]),
+					Mustpass(project = GL_CTS_NOCTX_PROJECT, version = "4.5.5.x", isCurrent=True, packages = [GLCTS_NOCTX_GL30_KHR_PKG, GLCTS_NOCTX_GL45_KHR_PKG]),
 					]
 		return mustpass
 
diff --git a/external/openglcts/scripts/mustpass.py b/external/openglcts/scripts/mustpass.py
index c8292c8..c73b82d 100644
--- a/external/openglcts/scripts/mustpass.py
+++ b/external/openglcts/scripts/mustpass.py
@@ -285,7 +285,7 @@
 		return "glu::ApiType::core(3, 1)"
 	if apiName == "GL30":
 		return "glu::ApiType::core(3, 0)"
-	if apiName == "EGL" or apiName == "NOCTX":
+	if apiName == "EGL":
 		return "glu::ApiType()"
 
 	raise Exception("Unknown API %s" % apiName)
diff --git a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
index 7166e14..e9f311d 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
@@ -82,6 +82,7 @@
 	ATOMIC_OPERATION_OR,
 	ATOMIC_OPERATION_XOR,
 	ATOMIC_OPERATION_EXCHANGE,
+	ATOMIC_OPERATION_COMPARE_EXCHANGE,
 
 	ATOMIC_OPERATION_LAST
 };
@@ -126,6 +127,7 @@
 		case ATOMIC_OPERATION_XOR:
 			return string("(" + x + "*" + x + " + " + y + "*" + y + " + " + z + "*" + z + ")");
 		case ATOMIC_OPERATION_EXCHANGE:
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:
 			return string("((" + z + "*" + toString(gridSize.x()) + " + " + x + ")*" + toString(gridSize.y()) + " + " + y + ")");
 		default:
 			DE_ASSERT(false);
@@ -137,13 +139,14 @@
 {
 	switch (op)
 	{
-		case ATOMIC_OPERATION_ADD:			return string("add");
-		case ATOMIC_OPERATION_MIN:			return string("min");
-		case ATOMIC_OPERATION_MAX:			return string("max");
-		case ATOMIC_OPERATION_AND:			return string("and");
-		case ATOMIC_OPERATION_OR:			return string("or");
-		case ATOMIC_OPERATION_XOR:			return string("xor");
-		case ATOMIC_OPERATION_EXCHANGE:		return string("exchange");
+		case ATOMIC_OPERATION_ADD:				return string("add");
+		case ATOMIC_OPERATION_MIN:				return string("min");
+		case ATOMIC_OPERATION_MAX:				return string("max");
+		case ATOMIC_OPERATION_AND:				return string("and");
+		case ATOMIC_OPERATION_OR:				return string("or");
+		case ATOMIC_OPERATION_XOR:				return string("xor");
+		case ATOMIC_OPERATION_EXCHANGE:			return string("exchange");
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return string("compare_exchange");
 		default:
 			DE_ASSERT(false);
 			return DE_NULL;
@@ -154,13 +157,14 @@
 {
 	switch (op)
 	{
-		case ATOMIC_OPERATION_ADD:			return string("imageAtomicAdd");
-		case ATOMIC_OPERATION_MIN:			return string("imageAtomicMin");
-		case ATOMIC_OPERATION_MAX:			return string("imageAtomicMax");
-		case ATOMIC_OPERATION_AND:			return string("imageAtomicAnd");
-		case ATOMIC_OPERATION_OR:			return string("imageAtomicOr");
-		case ATOMIC_OPERATION_XOR:			return string("imageAtomicXor");
-		case ATOMIC_OPERATION_EXCHANGE:		return string("imageAtomicExchange");
+		case ATOMIC_OPERATION_ADD:				return string("imageAtomicAdd");
+		case ATOMIC_OPERATION_MIN:				return string("imageAtomicMin");
+		case ATOMIC_OPERATION_MAX:				return string("imageAtomicMax");
+		case ATOMIC_OPERATION_AND:				return string("imageAtomicAnd");
+		case ATOMIC_OPERATION_OR:				return string("imageAtomicOr");
+		case ATOMIC_OPERATION_XOR:				return string("imageAtomicXor");
+		case ATOMIC_OPERATION_EXCHANGE:			return string("imageAtomicExchange");
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return string("imageAtomicCompSwap");
 		default:
 			DE_ASSERT(false);
 			return DE_NULL;
@@ -172,13 +176,14 @@
 	switch (op)
 	{
 		// \note 18 is just an arbitrary small nonzero value.
-		case ATOMIC_OPERATION_ADD:			return 18;
-		case ATOMIC_OPERATION_MIN:			return (1 << 15) - 1;
-		case ATOMIC_OPERATION_MAX:			return 18;
-		case ATOMIC_OPERATION_AND:			return (1 << 15) - 1;
-		case ATOMIC_OPERATION_OR:			return 18;
-		case ATOMIC_OPERATION_XOR:			return 18;
-		case ATOMIC_OPERATION_EXCHANGE:		return 18;
+		case ATOMIC_OPERATION_ADD:				return 18;
+		case ATOMIC_OPERATION_MIN:				return (1 << 15) - 1;
+		case ATOMIC_OPERATION_MAX:				return 18;
+		case ATOMIC_OPERATION_AND:				return (1 << 15) - 1;
+		case ATOMIC_OPERATION_OR:				return 18;
+		case ATOMIC_OPERATION_XOR:				return 18;
+		case ATOMIC_OPERATION_EXCHANGE:			return 18;
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return 18;
 		default:
 			DE_ASSERT(false);
 			return -1;
@@ -202,6 +207,7 @@
 		case ATOMIC_OPERATION_XOR:
 			return x*x + y*y + z*z;
 		case ATOMIC_OPERATION_EXCHANGE:
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:
 			return (z*gridSize.x() + x)*gridSize.y() + y;
 		default:
 			DE_ASSERT(false);
@@ -225,13 +231,14 @@
 {
 	switch (op)
 	{
-		case ATOMIC_OPERATION_ADD:			return a + b;
-		case ATOMIC_OPERATION_MIN:			return de::min(a, b);
-		case ATOMIC_OPERATION_MAX:			return de::max(a, b);
-		case ATOMIC_OPERATION_AND:			return a & b;
-		case ATOMIC_OPERATION_OR:			return a | b;
-		case ATOMIC_OPERATION_XOR:			return a ^ b;
-		case ATOMIC_OPERATION_EXCHANGE:		return b;
+		case ATOMIC_OPERATION_ADD:				return a + b;
+		case ATOMIC_OPERATION_MIN:				return de::min(a, b);
+		case ATOMIC_OPERATION_MAX:				return de::max(a, b);
+		case ATOMIC_OPERATION_AND:				return a & b;
+		case ATOMIC_OPERATION_OR:				return a | b;
+		case ATOMIC_OPERATION_XOR:				return a ^ b;
+		case ATOMIC_OPERATION_EXCHANGE:			return b;
+		case ATOMIC_OPERATION_COMPARE_EXCHANGE:	return (a == 18) ? b : a;
 		default:
 			DE_ASSERT(false);
 			return -1;
@@ -290,7 +297,8 @@
 	const string	atomicArgExpr			= (uintFormat ? "uint" : intFormat ? "int" : "float")
 											+ getAtomicFuncArgumentShaderStr(m_operation, "gx", "gy", "gz", IVec3(NUM_INVOCATIONS_PER_PIXEL*gridSize.x(), gridSize.y(), gridSize.z()));
 
-	const string	atomicInvocation		= getAtomicOperationShaderFuncName(m_operation) + "(u_resultImage, " + atomicCoord + ", " + atomicArgExpr + ")";
+	const string	compareExchangeStr		= (m_operation == ATOMIC_OPERATION_COMPARE_EXCHANGE) ? ", 18" + string(uintFormat ? "u" : "") : "";
+	const string	atomicInvocation		= getAtomicOperationShaderFuncName(m_operation) + "(u_resultImage, " + atomicCoord + compareExchangeStr + ", " + atomicArgExpr + ")";
 	const string	shaderImageFormatStr	= getShaderImageFormatQualifier(m_format);
 	const string	shaderImageTypeStr		= getShaderImageType(m_format, m_imageType);
 
@@ -364,7 +372,8 @@
 	const string	atomicArgExpr			= (uintFormat ? "uint" : intFormat ? "int" : "float")
 											+ getAtomicFuncArgumentShaderStr(m_operation, "gx", "gy", "gz", IVec3(NUM_INVOCATIONS_PER_PIXEL*gridSize.x(), gridSize.y(), gridSize.z()));
 
-	const string	atomicInvocation		= getAtomicOperationShaderFuncName(m_operation) + "(u_resultImage, " + atomicCoord + ", " + atomicArgExpr + ")";
+	const string	compareExchangeStr		= (m_operation == ATOMIC_OPERATION_COMPARE_EXCHANGE) ? ", 18" + string(uintFormat ? "u" : "")  : "";
+	const string	atomicInvocation		= getAtomicOperationShaderFuncName(m_operation) + "(u_resultImage, " + atomicCoord + compareExchangeStr + ", " + atomicArgExpr + ")";
 	const string	shaderImageFormatStr	= getShaderImageFormatQualifier(m_format);
 	const string	shaderImageTypeStr		= getShaderImageType(m_format, m_imageType);
 
@@ -693,6 +702,20 @@
 			if (!matchFound)
 				return false;
 		}
+		else if (m_operation == ATOMIC_OPERATION_COMPARE_EXCHANGE)
+		{
+			// Check if the end result equals one of the atomic args.
+			bool matchFound = false;
+
+			for (deInt32 i = 0; i < static_cast<deInt32>(NUM_INVOCATIONS_PER_PIXEL) && !matchFound; i++)
+			{
+				const IVec3 gid(x + i*gridSize.x(), y, z);
+				matchFound = (resultValue == getAtomicFuncArgument(m_operation, gid, extendedGridSize));
+			}
+
+			if (!matchFound)
+				return false;
+		}
 		else
 			DE_ASSERT(false);
 	}
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt b/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
index 31c82a4..5717740 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/CMakeLists.txt
@@ -5,6 +5,8 @@
 set(DEQP_VK_SPIRV_ASSEMBLY_SRCS
 	vktSpvAsm16bitStorageTests.cpp
 	vktSpvAsm16bitStorageTests.hpp
+	vktSpvAsmUboMatrixPaddingTests.cpp
+	vktSpvAsmUboMatrixPaddingTests.hpp
 	vktSpvAsmComputeShaderCase.cpp
 	vktSpvAsmComputeShaderCase.hpp
 	vktSpvAsmComputeShaderTestUtil.cpp
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
index c727aa3..12f837b 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
@@ -100,6 +100,11 @@
 	flushMappedMemoryRange(vkdi, device, destAlloc->getMemory(), destAlloc->getOffset(), numBytes);
 }
 
+void invalidateMemory (const DeviceInterface& vkdi, const VkDevice& device, Allocation* srcAlloc, size_t numBytes)
+{
+	invalidateMappedMemoryRange(vkdi, device, srcAlloc->getMemory(), srcAlloc->getOffset(), numBytes);
+}
+
 /*--------------------------------------------------------------------*//*!
  * \brief Create a descriptor set layout with the given descriptor types
  *
@@ -455,6 +460,12 @@
 	VK_CHECK(vkdi.queueSubmit(queue, 1, &submitInfo, *cmdCompleteFence));
 	VK_CHECK(vkdi.waitForFences(device, 1, &cmdCompleteFence.get(), 0u, infiniteTimeout)); // \note: timeout is failure
 
+	// Invalidate output memory ranges before checking on host.
+	for (size_t outputNdx = 0; outputNdx < m_shaderSpec.outputs.size(); ++outputNdx)
+	{
+		invalidateMemory(vkdi, device, outputAllocs[outputNdx].get(), m_shaderSpec.outputs[outputNdx]->getNumBytes());
+	}
+
 	// Check output.
 	if (m_shaderSpec.verifyIO)
 	{
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
index a796f63..eb32c24 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
@@ -51,6 +51,7 @@
 #include "tcuStringTemplate.hpp"
 
 #include "vktSpvAsm16bitStorageTests.hpp"
+#include "vktSpvAsmUboMatrixPaddingTests.hpp"
 #include "vktSpvAsmComputeShaderCase.hpp"
 #include "vktSpvAsmComputeShaderTestUtil.hpp"
 #include "vktSpvAsmGraphicsShaderTestUtil.hpp"
@@ -7840,6 +7841,7 @@
 	}
 
 	computeTests->addChild(create16BitStorageComputeGroup(testCtx));
+	computeTests->addChild(createUboMatrixPaddingComputeGroup(testCtx));
 	computeTests->addChild(createVariablePointersComputeGroup(testCtx));
 	graphicsTests->addChild(createOpNopTests(testCtx));
 	graphicsTests->addChild(createOpSourceTests(testCtx));
@@ -7875,6 +7877,7 @@
 	}
 
 	graphicsTests->addChild(create16BitStorageGraphicsGroup(testCtx));
+	graphicsTests->addChild(createUboMatrixPaddingGraphicsGroup(testCtx));
 	graphicsTests->addChild(createVariablePointersGraphicsGroup(testCtx));
 
 	instructionTests->addChild(computeTests.release());
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.cpp
new file mode 100644
index 0000000..fbe2cac
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.cpp
@@ -0,0 +1,265 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief SPIR-V Assembly Tests for UBO matrix padding.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktSpvAsmUboMatrixPaddingTests.hpp"
+#include "vktSpvAsmComputeShaderCase.hpp"
+#include "vktSpvAsmComputeShaderTestUtil.hpp"
+#include "vktSpvAsmGraphicsShaderTestUtil.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+using namespace vk;
+using std::map;
+using std::string;
+using std::vector;
+using tcu::IVec3;
+using tcu::RGBA;
+using tcu::Vec4;
+
+namespace
+{
+
+void addComputeUboMatrixPaddingTest (tcu::TestCaseGroup* group)
+{
+	tcu::TestContext&	testCtx			= group->getTestContext();
+	de::Random			rnd				(deStringHash(group->getName()));
+	const int			numElements		= 128;
+
+	// Read input UBO containing and array of mat2x2 using no padding inside matrix. Output
+	// into output buffer containing floats. The input and output buffer data should match.
+	const string		shaderSource	=
+		"                       OpCapability Shader\n"
+		"                  %1 = OpExtInstImport \"GLSL.std.450\"\n"
+		"                       OpMemoryModel Logical GLSL450\n"
+		"                       OpEntryPoint GLCompute %main \"main\" %id\n"
+		"                       OpExecutionMode %main LocalSize 1 1 1\n"
+		"                       OpSource GLSL 430\n"
+		"                       OpDecorate %id BuiltIn GlobalInvocationId\n"
+		"                       OpDecorate %_arr_v4 ArrayStride 16\n"
+		"                       OpMemberDecorate %Output 0 Offset 0\n"
+		"                       OpDecorate %Output BufferBlock\n"
+		"                       OpDecorate %dataOutput DescriptorSet 0\n"
+		"                       OpDecorate %dataOutput Binding 1\n"
+		"                       OpDecorate %_arr_mat2v2 ArrayStride 16\n"
+		"                       OpMemberDecorate %Input 0 ColMajor\n"
+		"                       OpMemberDecorate %Input 0 Offset 0\n"
+		"                       OpMemberDecorate %Input 0 MatrixStride 8\n"
+		"                       OpDecorate %Input Block\n"
+		"                       OpDecorate %dataInput DescriptorSet 0\n"
+		"                       OpDecorate %dataInput Binding 0\n"
+		"               %void = OpTypeVoid\n"
+		"                  %3 = OpTypeFunction %void\n"
+		"                %u32 = OpTypeInt 32 0\n"
+		" %_ptr_Function_uint = OpTypePointer Function %u32\n"
+		"             %v3uint = OpTypeVector %u32 3\n"
+		"  %_ptr_Input_v3uint = OpTypePointer Input %v3uint\n"
+		"                 %id = OpVariable %_ptr_Input_v3uint Input\n"
+		"                %i32 = OpTypeInt 32 1\n"
+		"              %int_0 = OpConstant %i32 0\n"
+		"              %int_1 = OpConstant %i32 1\n"
+		"             %uint_0 = OpConstant %u32 0\n"
+		"             %uint_1 = OpConstant %u32 1\n"
+		"             %uint_2 = OpConstant %u32 2\n"
+		"             %uint_3 = OpConstant %u32 3\n"
+		"    %_ptr_Input_uint = OpTypePointer Input %u32\n"
+		"                %f32 = OpTypeFloat 32\n"
+		"            %v4float = OpTypeVector %f32 4\n"
+		"           %uint_128 = OpConstant %u32 128\n"
+		"            %_arr_v4 = OpTypeArray %v4float %uint_128\n"
+		"             %Output = OpTypeStruct %_arr_v4\n"
+		"%_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+		"         %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+		"            %v2float = OpTypeVector %f32 2\n"
+		"        %mat2v2float = OpTypeMatrix %v2float 2\n"
+		"        %_arr_mat2v2 = OpTypeArray %mat2v2float %uint_128\n"
+		"              %Input = OpTypeStruct %_arr_mat2v2\n"
+		" %_ptr_Uniform_Input = OpTypePointer Uniform %Input\n"
+		"          %dataInput = OpVariable %_ptr_Uniform_Input Uniform\n"
+		" %_ptr_Uniform_float = OpTypePointer Uniform %f32\n"
+		"               %main = OpFunction %void None %3\n"
+		"                  %5 = OpLabel\n"
+		"                  %i = OpVariable %_ptr_Function_uint Function\n"
+		"                 %14 = OpAccessChain %_ptr_Input_uint %id %uint_0\n"
+		"                 %15 = OpLoad %u32 %14\n"
+		"                       OpStore %i %15\n"
+		"                %idx = OpLoad %u32 %i\n"
+		"                 %34 = OpAccessChain %_ptr_Uniform_float %dataInput %int_0 %idx %int_0 %uint_0\n"
+		"                 %35 = OpLoad %f32 %34\n"
+		"                 %36 = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %idx %uint_0\n"
+		"                       OpStore %36 %35\n"
+		"                 %40 = OpAccessChain %_ptr_Uniform_float %dataInput %int_0 %idx %int_0 %uint_1\n"
+		"                 %41 = OpLoad %f32 %40\n"
+		"                 %42 = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %idx %uint_1\n"
+		"                       OpStore %42 %41\n"
+		"                 %46 = OpAccessChain %_ptr_Uniform_float %dataInput %int_0 %idx %int_1 %uint_0\n"
+		"                 %47 = OpLoad %f32 %46\n"
+		"                 %49 = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %idx %uint_2\n"
+		"                       OpStore %49 %47\n"
+		"                 %52 = OpAccessChain %_ptr_Uniform_float %dataInput %int_0 %idx %int_1 %uint_1\n"
+		"                 %53 = OpLoad %f32 %52\n"
+		"                 %55 = OpAccessChain %_ptr_Uniform_float %dataOutput %int_0 %idx %uint_3\n"
+		"                       OpStore %55 %53\n"
+		"                       OpReturn\n"
+		"                       OpFunctionEnd\n";
+
+		vector<tcu::Vec4>		inputData;
+		ComputeShaderSpec		spec;
+
+		inputData.reserve(numElements);
+		for (deUint32 numIdx = 0; numIdx < numElements; ++numIdx)
+			inputData.push_back(tcu::Vec4(rnd.getFloat(), rnd.getFloat(), rnd.getFloat(), rnd.getFloat()));
+
+		spec.assembly			= shaderSource;
+		spec.numWorkGroups		= IVec3(numElements, 1, 1);
+		spec.inputTypes[0]		= VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+
+		spec.inputs.push_back(BufferSp(new Vec4Buffer(inputData)));
+		// Shader is expected to pass the input data by treating the input vec4 as mat2x2
+		spec.outputs.push_back(BufferSp(new Vec4Buffer(inputData)));
+
+		group->addChild(new SpvAsmComputeShaderCase(testCtx, "mat2x2", "Tests mat2x2 member in UBO struct without padding (treated as vec4).", spec));
+	}
+}
+
+void addGraphicsUboMatrixPaddingTest (tcu::TestCaseGroup* group)
+{
+	de::Random				rnd					(deStringHash(group->getName()));
+	map<string, string>		fragments;
+	const deUint32			numDataPoints		= 128;
+	RGBA					defaultColors[4];
+	GraphicsResources		resources;
+	vector<tcu::Vec4>		inputData;
+
+	inputData.reserve(numDataPoints);
+	for (deUint32 numIdx = 0; numIdx < numDataPoints; ++numIdx)
+		inputData.push_back(tcu::Vec4(rnd.getFloat(), rnd.getFloat(), rnd.getFloat(), rnd.getFloat()));
+
+	resources.inputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, BufferSp(new Vec4Buffer(inputData))));
+	// Shader is expected to pass the input data by treating the input vec4 as mat2x2
+	resources.outputs.push_back(std::make_pair(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BufferSp(new Vec4Buffer(inputData))));
+
+	getDefaultColors(defaultColors);
+
+	fragments["pre_main"]	=
+		"             %uint_128 = OpConstant %u32 128\n"
+		"    %_arr_v4f_uint_128 = OpTypeArray %v4f32 %uint_128\n"
+		"               %Output = OpTypeStruct %_arr_v4f_uint_128\n"
+		"  %_ptr_Uniform_Output = OpTypePointer Uniform %Output\n"
+		"           %dataOutput = OpVariable %_ptr_Uniform_Output Uniform\n"
+		"              %mat2v2f = OpTypeMatrix %v2f32 2\n"
+		"%_arr_mat2v2f_uint_128 = OpTypeArray %mat2v2f %uint_128\n"
+		"                %Input = OpTypeStruct %_arr_mat2v2f_uint_128\n"
+		"   %_ptr_Uniform_Input = OpTypePointer Uniform %Input\n"
+		"            %dataInput = OpVariable %_ptr_Uniform_Input Uniform\n"
+		"       %_ptr_Uniform_f = OpTypePointer Uniform %f32\n"
+		"            %c_i32_128 = OpConstant %i32 128\n";
+
+	fragments["decoration"]	=
+		"                         OpDecorate %_arr_v4f_uint_128 ArrayStride 16\n"
+		"                         OpMemberDecorate %Output 0 Offset 0\n"
+		"                         OpDecorate %Output BufferBlock\n"
+		"                         OpDecorate %dataOutput DescriptorSet 0\n"
+		"                         OpDecorate %dataOutput Binding 1\n"
+		"                         OpDecorate %_arr_mat2v2f_uint_128 ArrayStride 16\n"
+		"                         OpMemberDecorate %Input 0 ColMajor\n"
+		"                         OpMemberDecorate %Input 0 Offset 0\n"
+		"                         OpMemberDecorate %Input 0 MatrixStride 8\n"
+		"                         OpDecorate %Input Block\n"
+		"                         OpDecorate %dataInput DescriptorSet 0\n"
+		"                         OpDecorate %dataInput Binding 0\n";
+
+	// Read input UBO containing and array of mat2x2 using no padding inside matrix. Output
+	// into output buffer containing floats. The input and output buffer data should match.
+	// The whole array is handled inside a for loop.
+	fragments["testfun"]	=
+		"            %test_code = OpFunction %v4f32 None %v4f32_function\n"
+		"                %param = OpFunctionParameter %v4f32\n"
+
+		"                %entry = OpLabel\n"
+		"                    %i = OpVariable %fp_i32 Function\n"
+		"                         OpStore %i %c_i32_0\n"
+		"                         OpBranch %loop\n"
+
+		"                 %loop = OpLabel\n"
+		"                   %15 = OpLoad %i32 %i\n"
+		"                   %lt = OpSLessThan %bool %15 %c_i32_128\n"
+		"                         OpLoopMerge %merge %inc None\n"
+		"                         OpBranchConditional %lt %write %merge\n"
+
+		"                %write = OpLabel\n"
+		"                   %30 = OpLoad %i32 %i\n"
+		"                   %34 = OpAccessChain %_ptr_Uniform_f %dataInput %c_i32_0 %30 %c_i32_0 %c_u32_0\n"
+		"                   %35 = OpLoad %f32 %34\n"
+		"                   %36 = OpAccessChain %_ptr_Uniform_f %dataOutput %c_i32_0 %30 %c_u32_0\n"
+		"                         OpStore %36 %35\n"
+		"                   %40 = OpAccessChain %_ptr_Uniform_f %dataInput %c_i32_0 %30 %c_i32_0 %c_u32_1\n"
+		"                   %41 = OpLoad %f32 %40\n"
+		"                   %42 = OpAccessChain %_ptr_Uniform_f %dataOutput %c_i32_0 %30 %c_u32_1\n"
+		"                         OpStore %42 %41\n"
+		"                   %46 = OpAccessChain %_ptr_Uniform_f %dataInput %c_i32_0 %30 %c_i32_1 %c_u32_0\n"
+		"                   %47 = OpLoad %f32 %46\n"
+		"                   %49 = OpAccessChain %_ptr_Uniform_f %dataOutput %c_i32_0 %30 %c_u32_2\n"
+		"                         OpStore %49 %47\n"
+		"                   %52 = OpAccessChain %_ptr_Uniform_f %dataInput %c_i32_0 %30 %c_i32_1 %c_u32_1\n"
+		"                   %53 = OpLoad %f32 %52\n"
+		"                   %55 = OpAccessChain %_ptr_Uniform_f %dataOutput %c_i32_0 %30 %c_u32_3\n"
+		"                         OpStore %55 %53\n"
+		"                         OpBranch %inc\n"
+
+		"                  %inc = OpLabel\n"
+		"                   %37 = OpLoad %i32 %i\n"
+		"                   %39 = OpIAdd %i32 %37 %c_i32_1\n"
+		"                         OpStore %i %39\n"
+		"                         OpBranch %loop\n"
+
+		"                %merge = OpLabel\n"
+		"                         OpReturnValue %param\n"
+
+		"                         OpFunctionEnd\n";
+
+	resources.inputs.back().first	= VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+
+	createTestsForAllStages("mat2x2", defaultColors, defaultColors, fragments, resources, vector<string>(), group);
+}
+
+tcu::TestCaseGroup* createUboMatrixPaddingComputeGroup (tcu::TestContext& testCtx)
+{
+	de::MovePtr<tcu::TestCaseGroup> group		(new tcu::TestCaseGroup(testCtx, "ubo_padding", "Compute tests for UBO struct member packing."));
+	addComputeUboMatrixPaddingTest(group.get());
+
+	return group.release();
+}
+
+tcu::TestCaseGroup* createUboMatrixPaddingGraphicsGroup (tcu::TestContext& testCtx)
+{
+	de::MovePtr<tcu::TestCaseGroup> group		(new tcu::TestCaseGroup(testCtx, "ubo_padding", "Graphics tests for UBO struct member packing."));
+	addGraphicsUboMatrixPaddingTest(group.get());
+
+	return group.release();
+}
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.hpp
new file mode 100644
index 0000000..5fdf719
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmUboMatrixPaddingTests.hpp
@@ -0,0 +1,40 @@
+#ifndef _VKTSPVASMUBOMATRIXPADDINGTESTS_HPP
+#define _VKTSPVASMUBOMATRIXPADDINGTESTS_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief SPIR-V Assembly Tests for UBO matrix padding.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace SpirVAssembly
+{
+
+tcu::TestCaseGroup*	createUboMatrixPaddingComputeGroup	(tcu::TestContext& testCtx);
+tcu::TestCaseGroup*	createUboMatrixPaddingGraphicsGroup	(tcu::TestContext& testCtx);
+
+} // SpirVAssembly
+} // vkt
+
+#endif // _VKTSPVASMUBOMATRIXPADDINGTESTS_HPP
diff --git a/external/vulkancts/mustpass/1.0.3/vk-default.txt b/external/vulkancts/mustpass/1.0.3/vk-default.txt
index a35cf1f..05d1595 100644
--- a/external/vulkancts/mustpass/1.0.3/vk-default.txt
+++ b/external/vulkancts/mustpass/1.0.3/vk-default.txt
@@ -161948,6 +161948,7 @@
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.scalar_uint
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.vector_sint
 dEQP-VK.spirv_assembly.instruction.compute.16bit_storage.push_constant_16_to_32.vector_uint
+dEQP-VK.spirv_assembly.instruction.compute.ubo_padding.mat2x2
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opselect_single_buffer
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opfunctioncall_single_buffer
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.reads_opphi_single_buffer
@@ -163965,6 +163966,11 @@
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_geom
 dEQP-VK.spirv_assembly.instruction.graphics.16bit_storage.push_constant_int_16_to_32.uint_vector_frag
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_vert
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_geom
+dEQP-VK.spirv_assembly.instruction.graphics.ubo_padding.mat2x2_frag
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_vert
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.variable_pointers.graphics.reads_opselect_single_buffer_tesse
@@ -199448,6 +199454,34 @@
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_intermediate_values
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_end_result
 dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_intermediate_values
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_unorm
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_snorm
 dEQP-VK.image.texel_view_compatible.compute.image_load.bc1_rgb_unorm_block.r16g16b16a16_uscaled
diff --git a/framework/common/tcuFuzzyImageCompare.cpp b/framework/common/tcuFuzzyImageCompare.cpp
index 596ab83..4e76476 100644
--- a/framework/common/tcuFuzzyImageCompare.cpp
+++ b/framework/common/tcuFuzzyImageCompare.cpp
@@ -318,7 +318,7 @@
 
 	for (int y = 1; y < height-1; y++)
 	{
-		for (int x = 1; x < width-1; x += params.maxSampleSkip > 0 ? (int)rnd.getInt(0, params.maxSampleSkip) : 1)
+		for (int x = 1; x < width-1; x += 1 + (int)rnd.getInt(0, params.maxSampleSkip))
 		{
 			const deUint32	minDist2RefToCmp	= distSquaredToNeighbor<4>(rnd, readUnorm8<4>(refAccess, x, y), cmpAccess, x, y);
 			const deUint32	minDist2CmpToRef	= distSquaredToNeighbor<4>(rnd, readUnorm8<4>(cmpAccess, x, y), refAccess, x, y);
diff --git a/modules/egl/teglBufferAgeTests.cpp b/modules/egl/teglBufferAgeTests.cpp
index 7aac350..e1a3dc2 100644
--- a/modules/egl/teglBufferAgeTests.cpp
+++ b/modules/egl/teglBufferAgeTests.cpp
@@ -345,6 +345,10 @@
 		const ColoredRect& coloredRect = frame.draws[drawNdx].rect;
 		if (frame.draws[drawNdx].drawType == BufferAgeTest::DRAWTYPE_GLES2_RENDER || frame.draws[drawNdx].drawType == BufferAgeTest::DRAWTYPE_GLES2_CLEAR)
 		{
+			// tcu does not support degenerate subregions. Since they correspond to no-op rendering, just skip them.
+			if (coloredRect.bottomLeft.x() == coloredRect.topRight.x() || coloredRect.bottomLeft.y() == coloredRect.topRight.y())
+				continue;
+
 			const tcu::UVec4 color(coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255);
 			tcu::clear(tcu::getSubregion(target->getAccess(), coloredRect.bottomLeft.x(), coloredRect.bottomLeft.y(),
 										 coloredRect.topRight.x()-coloredRect.bottomLeft.x(), coloredRect.topRight.y()-coloredRect.bottomLeft.y()), color);
diff --git a/modules/egl/teglPartialUpdateTests.cpp b/modules/egl/teglPartialUpdateTests.cpp
index 097701a..a70374a 100644
--- a/modules/egl/teglPartialUpdateTests.cpp
+++ b/modules/egl/teglPartialUpdateTests.cpp
@@ -334,6 +334,10 @@
 		const ColoredRect& coloredRect = frame.draws[drawNdx].rect;
 		if (frame.draws[drawNdx].drawType == PartialUpdateTest::DRAWTYPE_GLES2_RENDER || frame.draws[drawNdx].drawType == PartialUpdateTest::DRAWTYPE_GLES2_CLEAR)
 		{
+			// tcu does not support degenerate subregions. Since they correspond to no-op rendering, just skip them.
+			if (coloredRect.bottomLeft.x() == coloredRect.topRight.x() || coloredRect.bottomLeft.y() == coloredRect.topRight.y())
+				continue;
+
 			const tcu::UVec4 color(coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255);
 			tcu::clear(tcu::getSubregion(target->getAccess(), coloredRect.bottomLeft.x(), coloredRect.bottomLeft.y(),
 										 coloredRect.topRight.x()-coloredRect.bottomLeft.x(), coloredRect.topRight.y()-coloredRect.bottomLeft.y()), color);
diff --git a/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp b/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
index 11764c1..7b47e13 100644
--- a/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
+++ b/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
@@ -218,6 +218,13 @@
 
 void VertexIDCase::init (void)
 {
+	if (m_method == deqp::gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_BASEVERTEX ||
+		m_method == gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX ||
+		m_method == gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX)
+	{
+		TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+	}
+
 	m_testCtx.getLog()	<< TestLog::Message
 						<< "gl_VertexID should be the index of the vertex that is being passed to the shader. i.e. indices[i] + basevertex"
 						<< TestLog::EndMessage;
diff --git a/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp b/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
index ea68a5a..54b77da 100644
--- a/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
+++ b/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
@@ -137,6 +137,12 @@
 {
 	checkSupported(ctx);
 
+	if ((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") && !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
+		(!ctx.isExtensionSupported("GL_EXT_geometry_shader") && !ctx.isExtensionSupported("GL_OES_geometry_shader")))
+	{
+		TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
+	}
+
 	std::ostringstream	shader;
 
 	struct testConfig
@@ -356,4 +362,4 @@
 } // NegativeTestShared
 } // Functional
 } // gles31
-} // deqp
\ No newline at end of file
+} // deqp
diff --git a/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp b/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
index 9d77831..c9b0c69 100644
--- a/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
+++ b/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
@@ -1144,7 +1144,7 @@
 private:
 	void				create2DTextureArrayMipMaps		(const vector<tcu::Vec4>& colors);
 	tcu::TextureLevel	genReferenceTexture				(int level, const vector<tcu::Vec4>& colors, const tcu::Vec4& uniformColor);
-	void				genReferenceMipmap				(int level, const tcu::Vec4& color, tcu::TextureLevel& reference);
+	void				genReferenceMipmap				(const tcu::Vec4& color, tcu::TextureLevel& reference);
 };
 
 TextureLevelTestCase::TextureLevelTestCase (Context& context, const char* name, const char* desc, deUint32 format)
@@ -1180,30 +1180,19 @@
 
 tcu::TextureLevel TextureLevelTestCase::genReferenceTexture (int level, const vector<tcu::Vec4>& colors, const tcu::Vec4& uniformColor)
 {
-	tcu::TextureLevel	reference	(glu::mapGLTransferFormat(m_transferFmt.format, m_transferFmt.dataType), VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 1);
+	tcu::TextureLevel	reference	(glu::mapGLTransferFormat(m_transferFmt.format, m_transferFmt.dataType), VIEWPORT_WIDTH >> level, VIEWPORT_HEIGHT >> level, 1);
 
-	// calculate reference image based on current mipmap level and previously
-	// rendered mipmaps in framebuffer
-	for (int ndx = 0; ndx <= level; ++ndx)
-		genReferenceMipmap(ndx, colors[ndx] + uniformColor, reference);
+	genReferenceMipmap(colors[level] + uniformColor, reference);
 
 	return reference;
 }
 
-void TextureLevelTestCase::genReferenceMipmap (int level, const tcu::Vec4& color, tcu::TextureLevel& reference)
+void TextureLevelTestCase::genReferenceMipmap (const tcu::Vec4& color, tcu::TextureLevel& reference)
 {
-	int	width	= reference.getAccess().getWidth();
-	int	height	= reference.getAccess().getHeight();
-	int	left	= width /2;
-	int	top		= height/2;
-
-	for (int i = 0; i < level; ++i)
-	{
-		width	= de::max(1, width	/ 2);
-		height	= de::max(1, height / 2);
-		left	= width /2;
-		top		= height/2;
-	}
+	const int	width	= reference.getAccess().getWidth();
+	const int	height	= reference.getAccess().getHeight();
+	const int	left	= width  / 2;
+	const int	top		= height / 2;
 
 	clear(getSubregion(reference.getAccess(), left,		0,		0, width-left,	top,		1),	color);
 	clear(getSubregion(reference.getAccess(), 0,		top,	0, left,		height-top,	1), color);
@@ -1214,7 +1203,6 @@
 TextureLevelTestCase::IterateResult TextureLevelTestCase::iterate (void)
 {
 	const tcu::Vec4		uniformColor	= scaleColorValue(m_texFmt, tcu::Vec4(0.1f, 0.0f, 0.0f, 1.0f));
-	tcu::TextureLevel	result			(getReadPixelFormat(m_texFmt), VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
 	vector<tcu::Vec4>	levelColors;
 
 	levelColors.push_back(scaleColorValue(m_texFmt, tcu::Vec4(0.4f, 0.0f, 0.0f, 1.0f)));
@@ -1233,10 +1221,11 @@
 		name << "Level "		<< level;
 		desc << "Mipmap level " << level;
 
-		const tcu::ScopedLogSection section			(m_testCtx.getLog(), name.str(), desc.str());
+		const tcu::ScopedLogSection	section			(m_testCtx.getLog(), name.str(), desc.str());
+		tcu::TextureLevel			result			(getReadPixelFormat(m_texFmt), VIEWPORT_WIDTH >> level, VIEWPORT_HEIGHT >> level);
 		tcu::TextureLevel			reference		= genReferenceTexture(level, levelColors, uniformColor);
 
-		m_gl.framebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texColorBuffer, level);
+		m_gl.framebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texColorBuffer, level, 0);
 
 		genUniformColor(uniformColor);
 		render();
diff --git a/modules/glshared/glsDrawTest.cpp b/modules/glshared/glsDrawTest.cpp
index 155bd35..472c5ea 100644
--- a/modules/glshared/glsDrawTest.cpp
+++ b/modules/glshared/glsDrawTest.cpp
@@ -3150,10 +3150,18 @@
 DrawTest::IterateResult DrawTest::iterate (void)
 {
 	const int					specNdx			= (m_iteration / 2);
+	const DrawTestSpec&			spec			= m_specs[specNdx];
+
+	if (spec.drawMethod == DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_BASEVERTEX ||
+		spec.drawMethod == DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX ||
+		spec.drawMethod == DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX)
+	{
+		TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_renderCtx.getType(), glu::ApiType::es(3, 2)), "Tests requires a 3.2 context or higher context version.");
+	}
+
 	const bool					drawStep		= (m_iteration % 2) == 0;
 	const bool					compareStep		= (m_iteration % 2) == 1;
 	const IterateResult			iterateResult	= ((size_t)m_iteration + 1 == m_specs.size()*2) ? (STOP) : (CONTINUE);
-	const DrawTestSpec&			spec			= m_specs[specNdx];
 	const bool					updateProgram	= (m_iteration == 0) || (drawStep && !checkSpecsShaderCompatible(m_specs[specNdx], m_specs[specNdx-1])); // try to use the same shader in all iterations
 	IterationLogSectionEmitter	sectionEmitter	(m_testCtx.getLog(), specNdx, m_specs.size(), m_iteration_descriptions[specNdx], drawStep && m_specs.size()!=1);
 
diff --git a/scripts/check_build_sanity.py b/scripts/check_build_sanity.py
index 620b07a..c35aafc 100644
--- a/scripts/check_build_sanity.py
+++ b/scripts/check_build_sanity.py
@@ -189,6 +189,10 @@
 			RunScript(os.path.join("external", "vulkancts", "scripts", "build_mustpass.py"),
 					  lambda env: ["--build-dir", os.path.join(env.tmpDir, "vulkan-mustpass")]),
 		]),
+	('spirv-binaries', [
+			RunScript(os.path.join("external", "vulkancts", "scripts", "build_spirv_binaries.py"),
+					  lambda env: ["--build-dir", os.path.join(env.tmpDir, "spirv-binaries")]),
+		]),
 	('gen-inl-files', [
 			RunScript(os.path.join("scripts", "gen_egl.py")),
 			RunScript(os.path.join("scripts", "opengl", "gen_all.py")),