Merge vulkancts/vulkan-cts-1.0.2 into vulkancts/vulkan-cts-1.0-dev

Change-Id: I930987be3bb947d4fe51d9b931ed882f04e45a19
diff --git a/Android.mk b/Android.mk
index ea13fd3..cf95dd8 100644
--- a/Android.mk
+++ b/Android.mk
@@ -589,6 +589,7 @@
 	modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp \
 	modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp \
 	modules/gles31/functional/es31fNegativeShaderImageLoadStoreTests.cpp \
+	modules/gles31/functional/es31fNegativeShaderStorageTests.cpp \
 	modules/gles31/functional/es31fNegativeStateApiTests.cpp \
 	modules/gles31/functional/es31fNegativeTestShared.cpp \
 	modules/gles31/functional/es31fNegativeTextureApiTests.cpp \
diff --git a/android/cts/master/egl-master.txt b/android/cts/master/egl-master.txt
index 74f28a9..60e5a14 100644
--- a/android/cts/master/egl-master.txt
+++ b/android/cts/master/egl-master.txt
@@ -2364,11 +2364,14 @@
 dEQP-EGL.functional.multithread.single_window_context
 dEQP-EGL.functional.multithread.pbuffer_single_window_context
 dEQP-EGL.functional.get_proc_address.extension.egl_android_blob_cache
+dEQP-EGL.functional.get_proc_address.extension.egl_android_create_native_client_buffer
 dEQP-EGL.functional.get_proc_address.extension.egl_android_native_fence_sync
+dEQP-EGL.functional.get_proc_address.extension.egl_android_presentation_time
 dEQP-EGL.functional.get_proc_address.extension.egl_angle_query_surface_pointer
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_device_base
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_device_enumeration
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_device_query
+dEQP-EGL.functional.get_proc_address.extension.egl_ext_image_dma_buf_import_modifiers
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_output_base
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_platform_base
 dEQP-EGL.functional.get_proc_address.extension.egl_ext_stream_consumer_egloutput
@@ -2384,6 +2387,7 @@
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_partial_update
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_reusable_sync
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_stream
+dEQP-EGL.functional.get_proc_address.extension.egl_khr_stream_attrib
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_stream_consumer_gltexture
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_stream_cross_process_fd
 dEQP-EGL.functional.get_proc_address.extension.egl_khr_stream_fifo
@@ -2398,6 +2402,7 @@
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_post_sub_buffer
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_stream_consumer_gltexture_yuv
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_stream_metadata
+dEQP-EGL.functional.get_proc_address.extension.egl_nv_stream_reset
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_stream_sync
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_sync
 dEQP-EGL.functional.get_proc_address.extension.egl_nv_system_time
diff --git a/android/cts/master/gles31-master.txt b/android/cts/master/gles31-master.txt
index 8204cb8..7671af2 100644
--- a/android/cts/master/gles31-master.txt
+++ b/android/cts/master/gles31-master.txt
@@ -15875,7 +15875,6 @@
 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
@@ -15897,7 +15896,6 @@
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_member_precision
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_different_member_interpolation
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_member_array_size
-dEQP-GLES31.functional.separate_shader.validation.io_blocks.match_different_member_struct_names
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_member_struct_member_name
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_member_struct_member_type
 dEQP-GLES31.functional.separate_shader.validation.io_blocks.mismatch_member_struct_member_precision
@@ -16763,6 +16761,8 @@
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.precise.precise_as_function_argument
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.advanced_blend.blend_qualifier_mismatch
 dEQP-GLES31.functional.debug.negative_coverage.callbacks.advanced_blend.attachment_advanced_equation
+dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_storage.block_number_limits
+dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_storage.max_combined_block_number_limit
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.bind_buffer
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.delete_buffers
 dEQP-GLES31.functional.debug.negative_coverage.log.buffer.gen_buffers
@@ -17209,6 +17209,8 @@
 dEQP-GLES31.functional.debug.negative_coverage.log.precise.precise_as_function_argument
 dEQP-GLES31.functional.debug.negative_coverage.log.advanced_blend.blend_qualifier_mismatch
 dEQP-GLES31.functional.debug.negative_coverage.log.advanced_blend.attachment_advanced_equation
+dEQP-GLES31.functional.debug.negative_coverage.log.shader_storage.block_number_limits
+dEQP-GLES31.functional.debug.negative_coverage.log.shader_storage.max_combined_block_number_limit
 dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.bind_buffer
 dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.delete_buffers
 dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.gen_buffers
@@ -17653,6 +17655,8 @@
 dEQP-GLES31.functional.debug.negative_coverage.get_error.precise.precise_as_function_argument
 dEQP-GLES31.functional.debug.negative_coverage.get_error.advanced_blend.blend_qualifier_mismatch
 dEQP-GLES31.functional.debug.negative_coverage.get_error.advanced_blend.attachment_advanced_equation
+dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_storage.block_number_limits
+dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_storage.max_combined_block_number_limit
 dEQP-GLES31.functional.debug.externally_generated.application_messages
 dEQP-GLES31.functional.debug.externally_generated.third_party_messages
 dEQP-GLES31.functional.debug.externally_generated.push_pop_stack
diff --git a/android/cts/master/src/gles31-test-issues.txt b/android/cts/master/src/gles31-test-issues.txt
index 545ba85..f391068 100644
--- a/android/cts/master/src/gles31-test-issues.txt
+++ b/android/cts/master/src/gles31-test-issues.txt
@@ -49,3 +49,7 @@
 dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.mediump_compute.vec3
 dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.mediump_compute.vec4
 dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.highp_compute.vec3
+
+# Bug 33457655
+dEQP-GLES31.functional.separate_shader.validation.varying.match_different_struct_names
+dEQP-GLES31.functional.separate_shader.validation.io_blocks.match_different_member_struct_names
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index c718db7..fce11ff 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
@@ -18310,13 +18310,13 @@
 dEQP-VK.api.copy_and_blit.blit_image.all_formats.a8b8g8r8_srgb_pack32_b8g8r8a8_srgb_linear
 dEQP-VK.api.copy_and_blit.blit_image.all_formats.a8b8g8r8_srgb_pack32_a8b8g8r8_srgb_pack32_nearest
 dEQP-VK.api.copy_and_blit.blit_image.all_formats.a8b8g8r8_srgb_pack32_a8b8g8r8_srgb_pack32_linear
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_d16_unorm_d16_unorm_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_x8_d24_unorm_pack32_x8_d24_unorm_pack32_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_d32_sfloat_d32_sfloat_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_s8_uint_s8_uint_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_d16_unorm_s8_uint_d16_unorm_s8_uint_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_d24_unorm_s8_uint_d24_unorm_s8_uint_nearest
-dEQP-VK.api.copy_and_blit.blit_image.all_formats.scaling_partial_d32_sfloat_s8_uint_d32_sfloat_s8_uint_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.d16_unorm_d16_unorm_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.x8_d24_unorm_pack32_x8_d24_unorm_pack32_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.d32_sfloat_d32_sfloat_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.s8_uint_s8_uint_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.d16_unorm_s8_uint_d16_unorm_s8_uint_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.d24_unorm_s8_uint_d24_unorm_s8_uint_nearest
+dEQP-VK.api.copy_and_blit.blit_image.all_formats.d32_sfloat_s8_uint_d32_sfloat_s8_uint_nearest
 dEQP-VK.api.copy_and_blit.resolve_image.whole_2_bit
 dEQP-VK.api.copy_and_blit.resolve_image.whole_4_bit
 dEQP-VK.api.copy_and_blit.resolve_image.whole_8_bit
@@ -18347,6 +18347,42 @@
 dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_16_bit
 dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_32_bit
 dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_266_256_1_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_512_1_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_src_256_256_11_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_266_256_1_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_512_1_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.diff_image_size_dst_256_256_11_64_bit
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4_unorm_pack8
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4b4a4_unorm_pack16
 dEQP-VK.api.image_clearing.clear_color_image.1d_b4g4r4a4_unorm_pack16
@@ -19477,6 +19513,8 @@
 dEQP-VK.api.granularity.in_render_pass.d16_unorm_s8_uint
 dEQP-VK.api.granularity.in_render_pass.d24_unorm_s8_uint
 dEQP-VK.api.granularity.in_render_pass.d32_sfloat_s8_uint
+dEQP-VK.api.get_memory_commitment.memory_commitment
+dEQP-VK.api.get_memory_commitment.memory_commitment_allocate_only
 dEQP-VK.memory.allocation.basic.size_64.forward.count_1
 dEQP-VK.memory.allocation.basic.size_64.forward.count_10
 dEQP-VK.memory.allocation.basic.size_64.forward.count_100
@@ -89362,6 +89400,82 @@
 dEQP-VK.pipeline.multisample_interpolation.offset_interpolate_at_sample_position.137_191_1.samples_16
 dEQP-VK.pipeline.multisample_interpolation.offset_interpolate_at_sample_position.137_191_1.samples_32
 dEQP-VK.pipeline.multisample_interpolation.offset_interpolate_at_sample_position.137_191_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.128_128_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_id.137_191_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.128_128_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.distribution.137_191_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.128_128_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_position.correctness.137_191_1.samples_64
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.pattern.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_count.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.correct_bit.137_191_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.128_128_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.128_128_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.128_128_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.128_128_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.128_128_1.samples_32
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.137_191_1.samples_2
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.137_191_1.samples_4
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.137_191_1.samples_8
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.137_191_1.samples_16
+dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.write.137_191_1.samples_32
 dEQP-VK.pipeline.vertex_input.single_attribute.float_as_r8_unorm_rate_vertex
 dEQP-VK.pipeline.vertex_input.single_attribute.float_as_r8_unorm_rate_instance
 dEQP-VK.pipeline.vertex_input.single_attribute.float_as_r8_snorm_rate_vertex
@@ -96976,6 +97090,10 @@
 dEQP-VK.spirv_assembly.instruction.compute.opquantize.exact
 dEQP-VK.spirv_assembly.instruction.compute.opquantize.rounded
 dEQP-VK.spirv_assembly.instruction.compute.opfrem.all
+dEQP-VK.spirv_assembly.instruction.compute.opsrem.positive
+dEQP-VK.spirv_assembly.instruction.compute.opsrem.all
+dEQP-VK.spirv_assembly.instruction.compute.opsmod.positive
+dEQP-VK.spirv_assembly.instruction.compute.opsmod.all
 dEQP-VK.spirv_assembly.instruction.compute.sconvert.int16_to_int32
 dEQP-VK.spirv_assembly.instruction.compute.sconvert.int16_to_int64
 dEQP-VK.spirv_assembly.instruction.compute.sconvert.int32_to_int64
@@ -97861,6 +97979,26 @@
 dEQP-VK.spirv_assembly.instruction.graphics.frem.frem_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.frem.frem_geom
 dEQP-VK.spirv_assembly.instruction.graphics.frem.frem_frag
+dEQP-VK.spirv_assembly.instruction.graphics.srem.positive_vert
+dEQP-VK.spirv_assembly.instruction.graphics.srem.positive_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.srem.positive_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.srem.positive_geom
+dEQP-VK.spirv_assembly.instruction.graphics.srem.positive_frag
+dEQP-VK.spirv_assembly.instruction.graphics.srem.all_vert
+dEQP-VK.spirv_assembly.instruction.graphics.srem.all_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.srem.all_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.srem.all_geom
+dEQP-VK.spirv_assembly.instruction.graphics.srem.all_frag
+dEQP-VK.spirv_assembly.instruction.graphics.smod.positive_vert
+dEQP-VK.spirv_assembly.instruction.graphics.smod.positive_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.smod.positive_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.smod.positive_geom
+dEQP-VK.spirv_assembly.instruction.graphics.smod.positive_frag
+dEQP-VK.spirv_assembly.instruction.graphics.smod.all_vert
+dEQP-VK.spirv_assembly.instruction.graphics.smod.all_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.smod.all_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.smod.all_geom
+dEQP-VK.spirv_assembly.instruction.graphics.smod.all_frag
 dEQP-VK.glsl.arrays.constructor.float3_vertex
 dEQP-VK.glsl.arrays.constructor.float3_fragment
 dEQP-VK.glsl.arrays.constructor.float4_vertex
@@ -109222,6 +109360,42 @@
 dEQP-VK.glsl.texture_functions.texture.isampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.texture.sparse_usampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.texture.usampler3d_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texture.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texture.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texture.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1d_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1d_bias_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isampler1d_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.usampler1d_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texture.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texture.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texture.usampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darray_bias_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isampler1darray_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.usampler1darray_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_float_vertex
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texture.isamplercubearray_fragment
+dEQP-VK.glsl.texture_functions.texture.usamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texture.usamplercubearray_fragment
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.texture.samplercubearray_bias_float_fragment
+dEQP-VK.glsl.texture_functions.texture.isamplercubearray_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.usamplercubearray_bias_fragment
 dEQP-VK.glsl.texture_functions.texture.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texture.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texture.sparse_sampler2dshadow_fragment
@@ -109238,6 +109412,13 @@
 dEQP-VK.glsl.texture_functions.texture.sampler2darrayshadow_vertex
 dEQP-VK.glsl.texture_functions.texture.sparse_sampler2darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.texture.sampler2darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1dshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.texture.sampler1darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.texture.sampler1darrayshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.texture.samplercubearrayshadow_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureoffset.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2d_fixed_fragment
@@ -109310,12 +109491,46 @@
 dEQP-VK.glsl.texture_functions.textureoffset.isampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_usampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.usampler3d_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1d_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1d_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1d_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1darray_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darray_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.isampler1darray_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.usampler1darray_bias_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2dshadow_bias_fragment
 dEQP-VK.glsl.texture_functions.textureoffset.sampler2dshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler2darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sparse_sampler2darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler2darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1dshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.textureoffset.sampler1darrayshadow_bias_fragment
 dEQP-VK.glsl.texture_functions.textureproj.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureproj.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureproj.sampler2d_vec3_float_vertex
@@ -109352,9 +109567,36 @@
 dEQP-VK.glsl.texture_functions.textureproj.sampler3d_bias_float_fragment
 dEQP-VK.glsl.texture_functions.textureproj.isampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.textureproj.usampler3d_bias_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec2_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec2_bias_fragment
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec2_bias_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1d_vec4_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureproj.isampler1d_vec4_bias_fragment
+dEQP-VK.glsl.texture_functions.textureproj.usampler1d_vec4_bias_fragment
 dEQP-VK.glsl.texture_functions.textureproj.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureproj.sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureproj.sampler2dshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureproj.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureproj.sampler1dshadow_bias_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2d_vec3_float_vertex
@@ -109391,9 +109633,36 @@
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler3d_bias_float_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.isampler3d_bias_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.usampler3d_bias_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec2_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec2_bias_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec2_bias_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_bias_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1d_vec4_bias_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.isampler1d_vec4_bias_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.usampler1d_vec4_bias_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureprojoffset.sampler2dshadow_bias_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureprojoffset.sampler1dshadow_bias_fragment
 dEQP-VK.glsl.texture_functions.texturelod.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturelod.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturelod.sparse_sampler2d_fixed_fragment
@@ -109458,10 +109727,38 @@
 dEQP-VK.glsl.texture_functions.texturelod.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texturelod.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texturelod.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texturelod.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturelod.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturelod.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturelod.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texturelod.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturelod.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturelod.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturelod.usampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturelod.samplercubearray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturelod.samplercubearray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturelod.samplercubearray_float_vertex
+dEQP-VK.glsl.texture_functions.texturelod.samplercubearray_float_fragment
+dEQP-VK.glsl.texture_functions.texturelod.isamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texturelod.isamplercubearray_fragment
+dEQP-VK.glsl.texture_functions.texturelod.usamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texturelod.usamplercubearray_fragment
 dEQP-VK.glsl.texture_functions.texturelod.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturelod.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturelod.sparse_sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.texturelod.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.texturelod.sampler1darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.texturelodoffset.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturelodoffset.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturelodoffset.sparse_sampler2d_fixed_fragment
@@ -109510,10 +109807,30 @@
 dEQP-VK.glsl.texture_functions.texturelodoffset.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texturelodoffset.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texturelodoffset.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.usampler1darray_fragment
 dEQP-VK.glsl.texture_functions.texturelodoffset.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturelodoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturelodoffset.sparse_sampler2dshadow_fragment
 dEQP-VK.glsl.texture_functions.texturelodoffset.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.texturelodoffset.sampler1darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.textureprojlod.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureprojlod.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureprojlod.sampler2d_vec3_float_vertex
@@ -109538,8 +109855,26 @@
 dEQP-VK.glsl.texture_functions.textureprojlod.isampler3d_fragment
 dEQP-VK.glsl.texture_functions.textureprojlod.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.textureprojlod.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.usampler1d_vec4_fragment
 dEQP-VK.glsl.texture_functions.textureprojlod.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureprojlod.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureprojlod.sampler1dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler2d_vec3_float_vertex
@@ -109564,8 +109899,26 @@
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.isampler3d_fragment
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.usampler1d_vec4_fragment
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureprojlodoffset.sampler1dshadow_fragment
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_sampler2d_fixed_fragment
@@ -109630,6 +109983,30 @@
 dEQP-VK.glsl.texture_functions.texturegrad.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texturegrad.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.usampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.samplercubearray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.samplercubearray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.samplercubearray_float_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.samplercubearray_float_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.isamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.isamplercubearray_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.usamplercubearray_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.usamplercubearray_fragment
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_sampler2dshadow_fragment
@@ -109642,6 +110019,10 @@
 dEQP-VK.glsl.texture_functions.texturegrad.sampler2darrayshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegrad.sparse_sampler2darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.texturegrad.sampler2darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.texturegrad.sampler1darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_sampler2d_fixed_fragment
@@ -109690,6 +110071,22 @@
 dEQP-VK.glsl.texture_functions.texturegradoffset.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texturegradoffset.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.usampler1darray_fragment
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_sampler2dshadow_fragment
@@ -109698,6 +110095,10 @@
 dEQP-VK.glsl.texture_functions.texturegradoffset.sampler2darrayshadow_vertex
 dEQP-VK.glsl.texture_functions.texturegradoffset.sparse_sampler2darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.texturegradoffset.sampler2darrayshadow_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1dshadow_fragment
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darrayshadow_vertex
+dEQP-VK.glsl.texture_functions.texturegradoffset.sampler1darrayshadow_fragment
 dEQP-VK.glsl.texture_functions.textureprojgrad.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureprojgrad.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureprojgrad.sampler2d_vec3_float_vertex
@@ -109722,8 +110123,26 @@
 dEQP-VK.glsl.texture_functions.textureprojgrad.isampler3d_fragment
 dEQP-VK.glsl.texture_functions.textureprojgrad.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.textureprojgrad.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.usampler1d_vec4_fragment
 dEQP-VK.glsl.texture_functions.textureprojgrad.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureprojgrad.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureprojgrad.sampler1dshadow_fragment
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler2d_vec3_fixed_vertex
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler2d_vec3_fixed_fragment
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler2d_vec3_float_vertex
@@ -109748,8 +110167,26 @@
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.isampler3d_fragment
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec2_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec2_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec2_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec2_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.isampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.isampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler1d_vec2_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler1d_vec2_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec4_fixed_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec4_fixed_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec4_float_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1d_vec4_float_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.isampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.isampler1d_vec4_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler1d_vec4_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.usampler1d_vec4_fragment
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler2dshadow_vertex
 dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler2dshadow_fragment
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1dshadow_vertex
+dEQP-VK.glsl.texture_functions.textureprojgradoffset.sampler1dshadow_fragment
 dEQP-VK.glsl.texture_functions.texelfetch.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texelfetch.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texelfetch.sparse_sampler2d_fixed_fragment
@@ -109798,6 +110235,22 @@
 dEQP-VK.glsl.texture_functions.texelfetch.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texelfetch.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texelfetch.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texelfetch.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texelfetch.usampler1darray_fragment
 dEQP-VK.glsl.texture_functions.texelfetchoffset.sparse_sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.texelfetchoffset.sparse_sampler2d_fixed_fragment
@@ -109846,6 +110299,22 @@
 dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler3d_vertex
 dEQP-VK.glsl.texture_functions.texelfetchoffset.sparse_usampler3d_fragment
 dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler3d_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1d_fixed_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1d_fixed_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1d_float_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1d_float_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.isampler1d_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.isampler1d_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler1d_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler1d_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1darray_fixed_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1darray_fixed_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1darray_float_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.sampler1darray_float_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.isampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.isampler1darray_fragment
+dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler1darray_vertex
+dEQP-VK.glsl.texture_functions.texelfetchoffset.usampler1darray_fragment
 dEQP-VK.glsl.texture_functions.query.texturesize.sampler2d_fixed_vertex
 dEQP-VK.glsl.texture_functions.query.texturesize.sampler2d_fixed_fragment
 dEQP-VK.glsl.texture_functions.query.texturesize.sampler2d_float_vertex
diff --git a/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java b/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
index cbcec16..465d2da 100644
--- a/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
+++ b/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
@@ -2116,6 +2116,7 @@
         destination.mExcludeFilters = new ArrayList<>(source.mExcludeFilters);
         destination.mAbi = source.mAbi;
         destination.mLogData = source.mLogData;
+        destination.mCollectTestsOnly = source.mCollectTestsOnly;
     }
 
     /**
diff --git a/android/scripts/common.py b/android/scripts/common.py
index 16b5276..87aad8a 100644
--- a/android/scripts/common.py
+++ b/android/scripts/common.py
@@ -110,7 +110,7 @@
 	if retcode != 0:
 		raise Exception("Failed to execute '%s', got %d" % (str(args), retcode))
 
-def execArgsInDirectory (args, cwd, linePrefix=""):
+def execArgsInDirectory (args, cwd, linePrefix="", failOnNonZeroExit=True):
 
 	def readApplyPrefixAndPrint (source, prefix, sink):
 		while True:
@@ -125,7 +125,7 @@
 	stdoutJob.start()
 	stderrJob.start()
 	retcode = process.wait()
-	if retcode != 0:
+	if failOnNonZeroExit and retcode != 0:
 		raise Exception("Failed to execute '%s', got %d" % (str(args), retcode))
 
 def serialApply(f, argsList):
@@ -173,7 +173,7 @@
 	if proc.returncode != 0:
 		raise Exception("adb devices -l failed, got %d" % proc.returncode)
 
-	ptrn = re.compile(r'^([a-zA-Z0-9:]+)\s+.*product:([^\s]+)\s+model:([^\s]+)\s+device:([^\s]+)')
+	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:
diff --git a/android/scripts/install.py b/android/scripts/install.py
index 6c9ff0f..5545cbb 100644
--- a/android/scripts/install.py
+++ b/android/scripts/install.py
@@ -33,7 +33,7 @@
 	common.execArgsInDirectory([common.ADB_BIN] + extraArgs + [
 			'uninstall',
 			'com.drawelements.deqp'
-		], buildRoot, printPrefix)
+		], buildRoot, printPrefix, failOnNonZeroExit=False)
 	print printPrefix + "Remove complete\n",
 
 	print printPrefix + "Installing dEQP Package from %s...\n" %(buildRoot),
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index 4e37982..e5c77d6 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -1,147 +1,146 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-virtual void		destroyDevice									(VkDevice device, const VkAllocationCallbacks* pAllocator) const;
-virtual void		getDeviceQueue									(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue) const;
-virtual VkResult	queueSubmit										(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence) const;
-virtual VkResult	queueWaitIdle									(VkQueue queue) const;
-virtual VkResult	deviceWaitIdle									(VkDevice device) const;
-virtual VkResult	allocateMemory									(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const;
-virtual void		freeMemory										(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	mapMemory										(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) const;
-virtual void		unmapMemory										(VkDevice device, VkDeviceMemory memory) const;
-virtual VkResult	flushMappedMemoryRanges							(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const;
-virtual VkResult	invalidateMappedMemoryRanges					(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const;
-virtual void		getDeviceMemoryCommitment						(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) const;
-virtual VkResult	bindBufferMemory								(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) const;
-virtual VkResult	bindImageMemory									(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const;
-virtual void		getBufferMemoryRequirements						(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) const;
-virtual void		getImageMemoryRequirements						(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements) const;
-virtual void		getImageSparseMemoryRequirements				(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) const;
-virtual VkResult	queueBindSparse									(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) const;
-virtual VkResult	createFence										(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence) const;
-virtual void		destroyFence									(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	resetFences										(VkDevice device, deUint32 fenceCount, const VkFence* pFences) const;
-virtual VkResult	getFenceStatus									(VkDevice device, VkFence fence) const;
-virtual VkResult	waitForFences									(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) const;
-virtual VkResult	createSemaphore									(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) const;
-virtual void		destroySemaphore								(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createEvent										(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) const;
-virtual void		destroyEvent									(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	getEventStatus									(VkDevice device, VkEvent event) const;
-virtual VkResult	setEvent										(VkDevice device, VkEvent event) const;
-virtual VkResult	resetEvent										(VkDevice device, VkEvent event) const;
-virtual VkResult	createQueryPool									(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool) const;
-virtual void		destroyQueryPool								(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	getQueryPoolResults								(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags) const;
-virtual VkResult	createBuffer									(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) const;
-virtual void		destroyBuffer									(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createBufferView								(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView) const;
-virtual void		destroyBufferView								(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createImage										(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage) const;
-virtual void		destroyImage									(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator) const;
-virtual void		getImageSubresourceLayout						(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) const;
-virtual VkResult	createImageView									(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView) const;
-virtual void		destroyImageView								(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createShaderModule								(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule) const;
-virtual void		destroyShaderModule								(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createPipelineCache								(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) const;
-virtual void		destroyPipelineCache							(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	getPipelineCacheData							(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData) const;
-virtual VkResult	mergePipelineCaches								(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches) const;
-virtual VkResult	createGraphicsPipelines							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const;
-virtual VkResult	createComputePipelines							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const;
-virtual void		destroyPipeline									(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createPipelineLayout							(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout) const;
-virtual void		destroyPipelineLayout							(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createSampler									(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const;
-virtual void		destroySampler									(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createDescriptorSetLayout						(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout) const;
-virtual void		destroyDescriptorSetLayout						(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createDescriptorPool							(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) const;
-virtual void		destroyDescriptorPool							(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	resetDescriptorPool								(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) const;
-virtual VkResult	allocateDescriptorSets							(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets) const;
-virtual VkResult	freeDescriptorSets								(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets) const;
-virtual void		updateDescriptorSets							(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) const;
-virtual VkResult	createFramebuffer								(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const;
-virtual void		destroyFramebuffer								(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createRenderPass								(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
-virtual void		destroyRenderPass								(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator) const;
-virtual void		getRenderAreaGranularity						(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) const;
-virtual VkResult	createCommandPool								(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) const;
-virtual void		destroyCommandPool								(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	resetCommandPool								(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) const;
-virtual VkResult	allocateCommandBuffers							(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers) const;
-virtual void		freeCommandBuffers								(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const;
-virtual VkResult	beginCommandBuffer								(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo) const;
-virtual VkResult	endCommandBuffer								(VkCommandBuffer commandBuffer) const;
-virtual VkResult	resetCommandBuffer								(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) const;
-virtual void		cmdBindPipeline									(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) const;
-virtual void		cmdSetViewport									(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports) const;
-virtual void		cmdSetScissor									(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors) const;
-virtual void		cmdSetLineWidth									(VkCommandBuffer commandBuffer, float lineWidth) const;
-virtual void		cmdSetDepthBias									(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const;
-virtual void		cmdSetBlendConstants							(VkCommandBuffer commandBuffer, const float blendConstants[4]) const;
-virtual void		cmdSetDepthBounds								(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) const;
-virtual void		cmdSetStencilCompareMask						(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask) const;
-virtual void		cmdSetStencilWriteMask							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask) const;
-virtual void		cmdSetStencilReference							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference) const;
-virtual void		cmdBindDescriptorSets							(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets) const;
-virtual void		cmdBindIndexBuffer								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const;
-virtual void		cmdBindVertexBuffers							(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) const;
-virtual void		cmdDraw											(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance) const;
-virtual void		cmdDrawIndexed									(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance) const;
-virtual void		cmdDrawIndirect									(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const;
-virtual void		cmdDrawIndexedIndirect							(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const;
-virtual void		cmdDispatch										(VkCommandBuffer commandBuffer, deUint32 x, deUint32 y, deUint32 z) const;
-virtual void		cmdDispatchIndirect								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const;
-virtual void		cmdCopyBuffer									(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions) const;
-virtual void		cmdCopyImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions) const;
-virtual void		cmdBlitImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter) const;
-virtual void		cmdCopyBufferToImage							(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions) const;
-virtual void		cmdCopyImageToBuffer							(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions) const;
-virtual void		cmdUpdateBuffer									(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) const;
-virtual void		cmdFillBuffer									(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data) const;
-virtual void		cmdClearColorImage								(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const;
-virtual void		cmdClearDepthStencilImage						(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const;
-virtual void		cmdClearAttachments								(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects) const;
-virtual void		cmdResolveImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions) const;
-virtual void		cmdSetEvent										(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const;
-virtual void		cmdResetEvent									(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const;
-virtual void		cmdWaitEvents									(VkCommandBuffer commandBuffer, deUint32 eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const;
-virtual void		cmdPipelineBarrier								(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const;
-virtual void		cmdBeginQuery									(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags) const;
-virtual void		cmdEndQuery										(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query) const;
-virtual void		cmdResetQueryPool								(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const;
-virtual void		cmdWriteTimestamp								(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query) const;
-virtual void		cmdCopyQueryPoolResults							(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) const;
-virtual void		cmdPushConstants								(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues) const;
-virtual void		cmdBeginRenderPass								(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) const;
-virtual void		cmdNextSubpass									(VkCommandBuffer commandBuffer, VkSubpassContents contents) const;
-virtual void		cmdEndRenderPass								(VkCommandBuffer commandBuffer) const;
-virtual void		cmdExecuteCommands								(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const;
-virtual VkResult	createSwapchainKHR								(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const;
-virtual void		destroySwapchainKHR								(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	getSwapchainImagesKHR							(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const;
-virtual VkResult	acquireNextImageKHR								(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex) const;
-virtual VkResult	queuePresentKHR									(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const;
-virtual VkResult	createSharedSwapchainsKHR						(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const;
-virtual void		trimCommandPoolKHR								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const;
-virtual VkResult	debugMarkerSetObjectTagEXT						(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const;
-virtual VkResult	debugMarkerSetObjectNameEXT						(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const;
-virtual void		cmdDebugMarkerBeginEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
-virtual void		cmdDebugMarkerEndEXT							(VkCommandBuffer commandBuffer) const;
-virtual void		cmdDebugMarkerInsertEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
-virtual void		cmdDrawIndirectCountAMD							(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
-virtual void		cmdDrawIndexedIndirectCountAMD					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
-virtual VkResult	getMemoryWin32HandleNV							(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const;
-virtual void		cmdProcessCommandsNVX							(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const;
-virtual void		cmdReserveSpaceForCommandsNVX					(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const;
-virtual VkResult	createIndirectCommandsLayoutNVX					(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout) const;
-virtual void		destroyIndirectCommandsLayoutNVX				(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	createObjectTableNVX							(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable) const;
-virtual void		destroyObjectTableNVX							(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	registerObjectsNVX								(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const deUint32* pObjectIndices) const;
-virtual VkResult	unregisterObjectsNVX							(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const deUint32* pObjectIndices) const;
-virtual void		getPhysicalDeviceGeneratedCommandsPropertiesNVX	(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const;
+virtual void		destroyDevice						(VkDevice device, const VkAllocationCallbacks* pAllocator) const;
+virtual void		getDeviceQueue						(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue) const;
+virtual VkResult	queueSubmit							(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence) const;
+virtual VkResult	queueWaitIdle						(VkQueue queue) const;
+virtual VkResult	deviceWaitIdle						(VkDevice device) const;
+virtual VkResult	allocateMemory						(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const;
+virtual void		freeMemory							(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	mapMemory							(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) const;
+virtual void		unmapMemory							(VkDevice device, VkDeviceMemory memory) const;
+virtual VkResult	flushMappedMemoryRanges				(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const;
+virtual VkResult	invalidateMappedMemoryRanges		(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const;
+virtual void		getDeviceMemoryCommitment			(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) const;
+virtual VkResult	bindBufferMemory					(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) const;
+virtual VkResult	bindImageMemory						(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const;
+virtual void		getBufferMemoryRequirements			(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) const;
+virtual void		getImageMemoryRequirements			(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements) const;
+virtual void		getImageSparseMemoryRequirements	(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) const;
+virtual VkResult	queueBindSparse						(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) const;
+virtual VkResult	createFence							(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence) const;
+virtual void		destroyFence						(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	resetFences							(VkDevice device, deUint32 fenceCount, const VkFence* pFences) const;
+virtual VkResult	getFenceStatus						(VkDevice device, VkFence fence) const;
+virtual VkResult	waitForFences						(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) const;
+virtual VkResult	createSemaphore						(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) const;
+virtual void		destroySemaphore					(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createEvent							(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) const;
+virtual void		destroyEvent						(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	getEventStatus						(VkDevice device, VkEvent event) const;
+virtual VkResult	setEvent							(VkDevice device, VkEvent event) const;
+virtual VkResult	resetEvent							(VkDevice device, VkEvent event) const;
+virtual VkResult	createQueryPool						(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool) const;
+virtual void		destroyQueryPool					(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	getQueryPoolResults					(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags) const;
+virtual VkResult	createBuffer						(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) const;
+virtual void		destroyBuffer						(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createBufferView					(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView) const;
+virtual void		destroyBufferView					(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createImage							(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage) const;
+virtual void		destroyImage						(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator) const;
+virtual void		getImageSubresourceLayout			(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) const;
+virtual VkResult	createImageView						(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView) const;
+virtual void		destroyImageView					(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createShaderModule					(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule) const;
+virtual void		destroyShaderModule					(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createPipelineCache					(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) const;
+virtual void		destroyPipelineCache				(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	getPipelineCacheData				(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData) const;
+virtual VkResult	mergePipelineCaches					(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches) const;
+virtual VkResult	createGraphicsPipelines				(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const;
+virtual VkResult	createComputePipelines				(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const;
+virtual void		destroyPipeline						(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createPipelineLayout				(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout) const;
+virtual void		destroyPipelineLayout				(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createSampler						(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const;
+virtual void		destroySampler						(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createDescriptorSetLayout			(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout) const;
+virtual void		destroyDescriptorSetLayout			(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createDescriptorPool				(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) const;
+virtual void		destroyDescriptorPool				(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	resetDescriptorPool					(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) const;
+virtual VkResult	allocateDescriptorSets				(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets) const;
+virtual VkResult	freeDescriptorSets					(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets) const;
+virtual void		updateDescriptorSets				(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) const;
+virtual VkResult	createFramebuffer					(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const;
+virtual void		destroyFramebuffer					(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createRenderPass					(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
+virtual void		destroyRenderPass					(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator) const;
+virtual void		getRenderAreaGranularity			(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) const;
+virtual VkResult	createCommandPool					(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) const;
+virtual void		destroyCommandPool					(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	resetCommandPool					(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) const;
+virtual VkResult	allocateCommandBuffers				(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers) const;
+virtual void		freeCommandBuffers					(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const;
+virtual VkResult	beginCommandBuffer					(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo) const;
+virtual VkResult	endCommandBuffer					(VkCommandBuffer commandBuffer) const;
+virtual VkResult	resetCommandBuffer					(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) const;
+virtual void		cmdBindPipeline						(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) const;
+virtual void		cmdSetViewport						(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports) const;
+virtual void		cmdSetScissor						(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors) const;
+virtual void		cmdSetLineWidth						(VkCommandBuffer commandBuffer, float lineWidth) const;
+virtual void		cmdSetDepthBias						(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const;
+virtual void		cmdSetBlendConstants				(VkCommandBuffer commandBuffer, const float blendConstants[4]) const;
+virtual void		cmdSetDepthBounds					(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) const;
+virtual void		cmdSetStencilCompareMask			(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask) const;
+virtual void		cmdSetStencilWriteMask				(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask) const;
+virtual void		cmdSetStencilReference				(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference) const;
+virtual void		cmdBindDescriptorSets				(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets) const;
+virtual void		cmdBindIndexBuffer					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const;
+virtual void		cmdBindVertexBuffers				(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) const;
+virtual void		cmdDraw								(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance) const;
+virtual void		cmdDrawIndexed						(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance) const;
+virtual void		cmdDrawIndirect						(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const;
+virtual void		cmdDrawIndexedIndirect				(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const;
+virtual void		cmdDispatch							(VkCommandBuffer commandBuffer, deUint32 x, deUint32 y, deUint32 z) const;
+virtual void		cmdDispatchIndirect					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const;
+virtual void		cmdCopyBuffer						(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions) const;
+virtual void		cmdCopyImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions) const;
+virtual void		cmdBlitImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter) const;
+virtual void		cmdCopyBufferToImage				(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions) const;
+virtual void		cmdCopyImageToBuffer				(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions) const;
+virtual void		cmdUpdateBuffer						(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) const;
+virtual void		cmdFillBuffer						(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data) const;
+virtual void		cmdClearColorImage					(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const;
+virtual void		cmdClearDepthStencilImage			(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const;
+virtual void		cmdClearAttachments					(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects) const;
+virtual void		cmdResolveImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions) const;
+virtual void		cmdSetEvent							(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const;
+virtual void		cmdResetEvent						(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const;
+virtual void		cmdWaitEvents						(VkCommandBuffer commandBuffer, deUint32 eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const;
+virtual void		cmdPipelineBarrier					(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const;
+virtual void		cmdBeginQuery						(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags) const;
+virtual void		cmdEndQuery							(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query) const;
+virtual void		cmdResetQueryPool					(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const;
+virtual void		cmdWriteTimestamp					(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query) const;
+virtual void		cmdCopyQueryPoolResults				(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) const;
+virtual void		cmdPushConstants					(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues) const;
+virtual void		cmdBeginRenderPass					(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) const;
+virtual void		cmdNextSubpass						(VkCommandBuffer commandBuffer, VkSubpassContents contents) const;
+virtual void		cmdEndRenderPass					(VkCommandBuffer commandBuffer) const;
+virtual void		cmdExecuteCommands					(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const;
+virtual VkResult	createSwapchainKHR					(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const;
+virtual void		destroySwapchainKHR					(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	getSwapchainImagesKHR				(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const;
+virtual VkResult	acquireNextImageKHR					(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex) const;
+virtual VkResult	queuePresentKHR						(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const;
+virtual VkResult	createSharedSwapchainsKHR			(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const;
+virtual void		trimCommandPoolKHR					(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const;
+virtual VkResult	debugMarkerSetObjectTagEXT			(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const;
+virtual VkResult	debugMarkerSetObjectNameEXT			(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const;
+virtual void		cmdDebugMarkerBeginEXT				(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
+virtual void		cmdDebugMarkerEndEXT				(VkCommandBuffer commandBuffer) const;
+virtual void		cmdDebugMarkerInsertEXT				(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
+virtual void		cmdDrawIndirectCountAMD				(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual void		cmdDrawIndexedIndirectCountAMD		(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual VkResult	getMemoryWin32HandleNV				(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const;
+virtual void		cmdProcessCommandsNVX				(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const;
+virtual void		cmdReserveSpaceForCommandsNVX		(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const;
+virtual VkResult	createIndirectCommandsLayoutNVX		(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout) const;
+virtual void		destroyIndirectCommandsLayoutNVX	(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	createObjectTableNVX				(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable) const;
+virtual void		destroyObjectTableNVX				(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	registerObjectsNVX					(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const deUint32* pObjectIndices) const;
+virtual VkResult	unregisterObjectsNVX				(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const deUint32* pObjectIndices) const;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
index a4e8a08..cb7229f 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
@@ -48,3 +48,4 @@
 virtual void				destroyDebugReportCallbackEXT						(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const;
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
 virtual VkResult			getPhysicalDeviceExternalImageFormatPropertiesNV	(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) const;
+virtual void				getPhysicalDeviceGeneratedCommandsPropertiesNVX		(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index ed7bb99..990ce9b 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -716,8 +716,3 @@
 {
 	return m_vk.unregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
 }
-
-void DeviceDriver::getPhysicalDeviceGeneratedCommandsPropertiesNVX (VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const
-{
-	m_vk.getPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
-}
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index 49685d9..42c20a9 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -1,147 +1,146 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-DestroyDeviceFunc									destroyDevice;
-GetDeviceQueueFunc									getDeviceQueue;
-QueueSubmitFunc										queueSubmit;
-QueueWaitIdleFunc									queueWaitIdle;
-DeviceWaitIdleFunc									deviceWaitIdle;
-AllocateMemoryFunc									allocateMemory;
-FreeMemoryFunc										freeMemory;
-MapMemoryFunc										mapMemory;
-UnmapMemoryFunc										unmapMemory;
-FlushMappedMemoryRangesFunc							flushMappedMemoryRanges;
-InvalidateMappedMemoryRangesFunc					invalidateMappedMemoryRanges;
-GetDeviceMemoryCommitmentFunc						getDeviceMemoryCommitment;
-BindBufferMemoryFunc								bindBufferMemory;
-BindImageMemoryFunc									bindImageMemory;
-GetBufferMemoryRequirementsFunc						getBufferMemoryRequirements;
-GetImageMemoryRequirementsFunc						getImageMemoryRequirements;
-GetImageSparseMemoryRequirementsFunc				getImageSparseMemoryRequirements;
-QueueBindSparseFunc									queueBindSparse;
-CreateFenceFunc										createFence;
-DestroyFenceFunc									destroyFence;
-ResetFencesFunc										resetFences;
-GetFenceStatusFunc									getFenceStatus;
-WaitForFencesFunc									waitForFences;
-CreateSemaphoreFunc									createSemaphore;
-DestroySemaphoreFunc								destroySemaphore;
-CreateEventFunc										createEvent;
-DestroyEventFunc									destroyEvent;
-GetEventStatusFunc									getEventStatus;
-SetEventFunc										setEvent;
-ResetEventFunc										resetEvent;
-CreateQueryPoolFunc									createQueryPool;
-DestroyQueryPoolFunc								destroyQueryPool;
-GetQueryPoolResultsFunc								getQueryPoolResults;
-CreateBufferFunc									createBuffer;
-DestroyBufferFunc									destroyBuffer;
-CreateBufferViewFunc								createBufferView;
-DestroyBufferViewFunc								destroyBufferView;
-CreateImageFunc										createImage;
-DestroyImageFunc									destroyImage;
-GetImageSubresourceLayoutFunc						getImageSubresourceLayout;
-CreateImageViewFunc									createImageView;
-DestroyImageViewFunc								destroyImageView;
-CreateShaderModuleFunc								createShaderModule;
-DestroyShaderModuleFunc								destroyShaderModule;
-CreatePipelineCacheFunc								createPipelineCache;
-DestroyPipelineCacheFunc							destroyPipelineCache;
-GetPipelineCacheDataFunc							getPipelineCacheData;
-MergePipelineCachesFunc								mergePipelineCaches;
-CreateGraphicsPipelinesFunc							createGraphicsPipelines;
-CreateComputePipelinesFunc							createComputePipelines;
-DestroyPipelineFunc									destroyPipeline;
-CreatePipelineLayoutFunc							createPipelineLayout;
-DestroyPipelineLayoutFunc							destroyPipelineLayout;
-CreateSamplerFunc									createSampler;
-DestroySamplerFunc									destroySampler;
-CreateDescriptorSetLayoutFunc						createDescriptorSetLayout;
-DestroyDescriptorSetLayoutFunc						destroyDescriptorSetLayout;
-CreateDescriptorPoolFunc							createDescriptorPool;
-DestroyDescriptorPoolFunc							destroyDescriptorPool;
-ResetDescriptorPoolFunc								resetDescriptorPool;
-AllocateDescriptorSetsFunc							allocateDescriptorSets;
-FreeDescriptorSetsFunc								freeDescriptorSets;
-UpdateDescriptorSetsFunc							updateDescriptorSets;
-CreateFramebufferFunc								createFramebuffer;
-DestroyFramebufferFunc								destroyFramebuffer;
-CreateRenderPassFunc								createRenderPass;
-DestroyRenderPassFunc								destroyRenderPass;
-GetRenderAreaGranularityFunc						getRenderAreaGranularity;
-CreateCommandPoolFunc								createCommandPool;
-DestroyCommandPoolFunc								destroyCommandPool;
-ResetCommandPoolFunc								resetCommandPool;
-AllocateCommandBuffersFunc							allocateCommandBuffers;
-FreeCommandBuffersFunc								freeCommandBuffers;
-BeginCommandBufferFunc								beginCommandBuffer;
-EndCommandBufferFunc								endCommandBuffer;
-ResetCommandBufferFunc								resetCommandBuffer;
-CmdBindPipelineFunc									cmdBindPipeline;
-CmdSetViewportFunc									cmdSetViewport;
-CmdSetScissorFunc									cmdSetScissor;
-CmdSetLineWidthFunc									cmdSetLineWidth;
-CmdSetDepthBiasFunc									cmdSetDepthBias;
-CmdSetBlendConstantsFunc							cmdSetBlendConstants;
-CmdSetDepthBoundsFunc								cmdSetDepthBounds;
-CmdSetStencilCompareMaskFunc						cmdSetStencilCompareMask;
-CmdSetStencilWriteMaskFunc							cmdSetStencilWriteMask;
-CmdSetStencilReferenceFunc							cmdSetStencilReference;
-CmdBindDescriptorSetsFunc							cmdBindDescriptorSets;
-CmdBindIndexBufferFunc								cmdBindIndexBuffer;
-CmdBindVertexBuffersFunc							cmdBindVertexBuffers;
-CmdDrawFunc											cmdDraw;
-CmdDrawIndexedFunc									cmdDrawIndexed;
-CmdDrawIndirectFunc									cmdDrawIndirect;
-CmdDrawIndexedIndirectFunc							cmdDrawIndexedIndirect;
-CmdDispatchFunc										cmdDispatch;
-CmdDispatchIndirectFunc								cmdDispatchIndirect;
-CmdCopyBufferFunc									cmdCopyBuffer;
-CmdCopyImageFunc									cmdCopyImage;
-CmdBlitImageFunc									cmdBlitImage;
-CmdCopyBufferToImageFunc							cmdCopyBufferToImage;
-CmdCopyImageToBufferFunc							cmdCopyImageToBuffer;
-CmdUpdateBufferFunc									cmdUpdateBuffer;
-CmdFillBufferFunc									cmdFillBuffer;
-CmdClearColorImageFunc								cmdClearColorImage;
-CmdClearDepthStencilImageFunc						cmdClearDepthStencilImage;
-CmdClearAttachmentsFunc								cmdClearAttachments;
-CmdResolveImageFunc									cmdResolveImage;
-CmdSetEventFunc										cmdSetEvent;
-CmdResetEventFunc									cmdResetEvent;
-CmdWaitEventsFunc									cmdWaitEvents;
-CmdPipelineBarrierFunc								cmdPipelineBarrier;
-CmdBeginQueryFunc									cmdBeginQuery;
-CmdEndQueryFunc										cmdEndQuery;
-CmdResetQueryPoolFunc								cmdResetQueryPool;
-CmdWriteTimestampFunc								cmdWriteTimestamp;
-CmdCopyQueryPoolResultsFunc							cmdCopyQueryPoolResults;
-CmdPushConstantsFunc								cmdPushConstants;
-CmdBeginRenderPassFunc								cmdBeginRenderPass;
-CmdNextSubpassFunc									cmdNextSubpass;
-CmdEndRenderPassFunc								cmdEndRenderPass;
-CmdExecuteCommandsFunc								cmdExecuteCommands;
-CreateSwapchainKHRFunc								createSwapchainKHR;
-DestroySwapchainKHRFunc								destroySwapchainKHR;
-GetSwapchainImagesKHRFunc							getSwapchainImagesKHR;
-AcquireNextImageKHRFunc								acquireNextImageKHR;
-QueuePresentKHRFunc									queuePresentKHR;
-CreateSharedSwapchainsKHRFunc						createSharedSwapchainsKHR;
-TrimCommandPoolKHRFunc								trimCommandPoolKHR;
-DebugMarkerSetObjectTagEXTFunc						debugMarkerSetObjectTagEXT;
-DebugMarkerSetObjectNameEXTFunc						debugMarkerSetObjectNameEXT;
-CmdDebugMarkerBeginEXTFunc							cmdDebugMarkerBeginEXT;
-CmdDebugMarkerEndEXTFunc							cmdDebugMarkerEndEXT;
-CmdDebugMarkerInsertEXTFunc							cmdDebugMarkerInsertEXT;
-CmdDrawIndirectCountAMDFunc							cmdDrawIndirectCountAMD;
-CmdDrawIndexedIndirectCountAMDFunc					cmdDrawIndexedIndirectCountAMD;
-GetMemoryWin32HandleNVFunc							getMemoryWin32HandleNV;
-CmdProcessCommandsNVXFunc							cmdProcessCommandsNVX;
-CmdReserveSpaceForCommandsNVXFunc					cmdReserveSpaceForCommandsNVX;
-CreateIndirectCommandsLayoutNVXFunc					createIndirectCommandsLayoutNVX;
-DestroyIndirectCommandsLayoutNVXFunc				destroyIndirectCommandsLayoutNVX;
-CreateObjectTableNVXFunc							createObjectTableNVX;
-DestroyObjectTableNVXFunc							destroyObjectTableNVX;
-RegisterObjectsNVXFunc								registerObjectsNVX;
-UnregisterObjectsNVXFunc							unregisterObjectsNVX;
-GetPhysicalDeviceGeneratedCommandsPropertiesNVXFunc	getPhysicalDeviceGeneratedCommandsPropertiesNVX;
+DestroyDeviceFunc						destroyDevice;
+GetDeviceQueueFunc						getDeviceQueue;
+QueueSubmitFunc							queueSubmit;
+QueueWaitIdleFunc						queueWaitIdle;
+DeviceWaitIdleFunc						deviceWaitIdle;
+AllocateMemoryFunc						allocateMemory;
+FreeMemoryFunc							freeMemory;
+MapMemoryFunc							mapMemory;
+UnmapMemoryFunc							unmapMemory;
+FlushMappedMemoryRangesFunc				flushMappedMemoryRanges;
+InvalidateMappedMemoryRangesFunc		invalidateMappedMemoryRanges;
+GetDeviceMemoryCommitmentFunc			getDeviceMemoryCommitment;
+BindBufferMemoryFunc					bindBufferMemory;
+BindImageMemoryFunc						bindImageMemory;
+GetBufferMemoryRequirementsFunc			getBufferMemoryRequirements;
+GetImageMemoryRequirementsFunc			getImageMemoryRequirements;
+GetImageSparseMemoryRequirementsFunc	getImageSparseMemoryRequirements;
+QueueBindSparseFunc						queueBindSparse;
+CreateFenceFunc							createFence;
+DestroyFenceFunc						destroyFence;
+ResetFencesFunc							resetFences;
+GetFenceStatusFunc						getFenceStatus;
+WaitForFencesFunc						waitForFences;
+CreateSemaphoreFunc						createSemaphore;
+DestroySemaphoreFunc					destroySemaphore;
+CreateEventFunc							createEvent;
+DestroyEventFunc						destroyEvent;
+GetEventStatusFunc						getEventStatus;
+SetEventFunc							setEvent;
+ResetEventFunc							resetEvent;
+CreateQueryPoolFunc						createQueryPool;
+DestroyQueryPoolFunc					destroyQueryPool;
+GetQueryPoolResultsFunc					getQueryPoolResults;
+CreateBufferFunc						createBuffer;
+DestroyBufferFunc						destroyBuffer;
+CreateBufferViewFunc					createBufferView;
+DestroyBufferViewFunc					destroyBufferView;
+CreateImageFunc							createImage;
+DestroyImageFunc						destroyImage;
+GetImageSubresourceLayoutFunc			getImageSubresourceLayout;
+CreateImageViewFunc						createImageView;
+DestroyImageViewFunc					destroyImageView;
+CreateShaderModuleFunc					createShaderModule;
+DestroyShaderModuleFunc					destroyShaderModule;
+CreatePipelineCacheFunc					createPipelineCache;
+DestroyPipelineCacheFunc				destroyPipelineCache;
+GetPipelineCacheDataFunc				getPipelineCacheData;
+MergePipelineCachesFunc					mergePipelineCaches;
+CreateGraphicsPipelinesFunc				createGraphicsPipelines;
+CreateComputePipelinesFunc				createComputePipelines;
+DestroyPipelineFunc						destroyPipeline;
+CreatePipelineLayoutFunc				createPipelineLayout;
+DestroyPipelineLayoutFunc				destroyPipelineLayout;
+CreateSamplerFunc						createSampler;
+DestroySamplerFunc						destroySampler;
+CreateDescriptorSetLayoutFunc			createDescriptorSetLayout;
+DestroyDescriptorSetLayoutFunc			destroyDescriptorSetLayout;
+CreateDescriptorPoolFunc				createDescriptorPool;
+DestroyDescriptorPoolFunc				destroyDescriptorPool;
+ResetDescriptorPoolFunc					resetDescriptorPool;
+AllocateDescriptorSetsFunc				allocateDescriptorSets;
+FreeDescriptorSetsFunc					freeDescriptorSets;
+UpdateDescriptorSetsFunc				updateDescriptorSets;
+CreateFramebufferFunc					createFramebuffer;
+DestroyFramebufferFunc					destroyFramebuffer;
+CreateRenderPassFunc					createRenderPass;
+DestroyRenderPassFunc					destroyRenderPass;
+GetRenderAreaGranularityFunc			getRenderAreaGranularity;
+CreateCommandPoolFunc					createCommandPool;
+DestroyCommandPoolFunc					destroyCommandPool;
+ResetCommandPoolFunc					resetCommandPool;
+AllocateCommandBuffersFunc				allocateCommandBuffers;
+FreeCommandBuffersFunc					freeCommandBuffers;
+BeginCommandBufferFunc					beginCommandBuffer;
+EndCommandBufferFunc					endCommandBuffer;
+ResetCommandBufferFunc					resetCommandBuffer;
+CmdBindPipelineFunc						cmdBindPipeline;
+CmdSetViewportFunc						cmdSetViewport;
+CmdSetScissorFunc						cmdSetScissor;
+CmdSetLineWidthFunc						cmdSetLineWidth;
+CmdSetDepthBiasFunc						cmdSetDepthBias;
+CmdSetBlendConstantsFunc				cmdSetBlendConstants;
+CmdSetDepthBoundsFunc					cmdSetDepthBounds;
+CmdSetStencilCompareMaskFunc			cmdSetStencilCompareMask;
+CmdSetStencilWriteMaskFunc				cmdSetStencilWriteMask;
+CmdSetStencilReferenceFunc				cmdSetStencilReference;
+CmdBindDescriptorSetsFunc				cmdBindDescriptorSets;
+CmdBindIndexBufferFunc					cmdBindIndexBuffer;
+CmdBindVertexBuffersFunc				cmdBindVertexBuffers;
+CmdDrawFunc								cmdDraw;
+CmdDrawIndexedFunc						cmdDrawIndexed;
+CmdDrawIndirectFunc						cmdDrawIndirect;
+CmdDrawIndexedIndirectFunc				cmdDrawIndexedIndirect;
+CmdDispatchFunc							cmdDispatch;
+CmdDispatchIndirectFunc					cmdDispatchIndirect;
+CmdCopyBufferFunc						cmdCopyBuffer;
+CmdCopyImageFunc						cmdCopyImage;
+CmdBlitImageFunc						cmdBlitImage;
+CmdCopyBufferToImageFunc				cmdCopyBufferToImage;
+CmdCopyImageToBufferFunc				cmdCopyImageToBuffer;
+CmdUpdateBufferFunc						cmdUpdateBuffer;
+CmdFillBufferFunc						cmdFillBuffer;
+CmdClearColorImageFunc					cmdClearColorImage;
+CmdClearDepthStencilImageFunc			cmdClearDepthStencilImage;
+CmdClearAttachmentsFunc					cmdClearAttachments;
+CmdResolveImageFunc						cmdResolveImage;
+CmdSetEventFunc							cmdSetEvent;
+CmdResetEventFunc						cmdResetEvent;
+CmdWaitEventsFunc						cmdWaitEvents;
+CmdPipelineBarrierFunc					cmdPipelineBarrier;
+CmdBeginQueryFunc						cmdBeginQuery;
+CmdEndQueryFunc							cmdEndQuery;
+CmdResetQueryPoolFunc					cmdResetQueryPool;
+CmdWriteTimestampFunc					cmdWriteTimestamp;
+CmdCopyQueryPoolResultsFunc				cmdCopyQueryPoolResults;
+CmdPushConstantsFunc					cmdPushConstants;
+CmdBeginRenderPassFunc					cmdBeginRenderPass;
+CmdNextSubpassFunc						cmdNextSubpass;
+CmdEndRenderPassFunc					cmdEndRenderPass;
+CmdExecuteCommandsFunc					cmdExecuteCommands;
+CreateSwapchainKHRFunc					createSwapchainKHR;
+DestroySwapchainKHRFunc					destroySwapchainKHR;
+GetSwapchainImagesKHRFunc				getSwapchainImagesKHR;
+AcquireNextImageKHRFunc					acquireNextImageKHR;
+QueuePresentKHRFunc						queuePresentKHR;
+CreateSharedSwapchainsKHRFunc			createSharedSwapchainsKHR;
+TrimCommandPoolKHRFunc					trimCommandPoolKHR;
+DebugMarkerSetObjectTagEXTFunc			debugMarkerSetObjectTagEXT;
+DebugMarkerSetObjectNameEXTFunc			debugMarkerSetObjectNameEXT;
+CmdDebugMarkerBeginEXTFunc				cmdDebugMarkerBeginEXT;
+CmdDebugMarkerEndEXTFunc				cmdDebugMarkerEndEXT;
+CmdDebugMarkerInsertEXTFunc				cmdDebugMarkerInsertEXT;
+CmdDrawIndirectCountAMDFunc				cmdDrawIndirectCountAMD;
+CmdDrawIndexedIndirectCountAMDFunc		cmdDrawIndexedIndirectCountAMD;
+GetMemoryWin32HandleNVFunc				getMemoryWin32HandleNV;
+CmdProcessCommandsNVXFunc				cmdProcessCommandsNVX;
+CmdReserveSpaceForCommandsNVXFunc		cmdReserveSpaceForCommandsNVX;
+CreateIndirectCommandsLayoutNVXFunc		createIndirectCommandsLayoutNVX;
+DestroyIndirectCommandsLayoutNVXFunc	destroyIndirectCommandsLayoutNVX;
+CreateObjectTableNVXFunc				createObjectTableNVX;
+DestroyObjectTableNVXFunc				destroyObjectTableNVX;
+RegisterObjectsNVXFunc					registerObjectsNVX;
+UnregisterObjectsNVXFunc				unregisterObjectsNVX;
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index 2c0ff8e..1c3b362 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -1,147 +1,146 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-m_vk.destroyDevice										= (DestroyDeviceFunc)									GET_PROC_ADDR("vkDestroyDevice");
-m_vk.getDeviceQueue										= (GetDeviceQueueFunc)									GET_PROC_ADDR("vkGetDeviceQueue");
-m_vk.queueSubmit										= (QueueSubmitFunc)										GET_PROC_ADDR("vkQueueSubmit");
-m_vk.queueWaitIdle										= (QueueWaitIdleFunc)									GET_PROC_ADDR("vkQueueWaitIdle");
-m_vk.deviceWaitIdle										= (DeviceWaitIdleFunc)									GET_PROC_ADDR("vkDeviceWaitIdle");
-m_vk.allocateMemory										= (AllocateMemoryFunc)									GET_PROC_ADDR("vkAllocateMemory");
-m_vk.freeMemory											= (FreeMemoryFunc)										GET_PROC_ADDR("vkFreeMemory");
-m_vk.mapMemory											= (MapMemoryFunc)										GET_PROC_ADDR("vkMapMemory");
-m_vk.unmapMemory										= (UnmapMemoryFunc)										GET_PROC_ADDR("vkUnmapMemory");
-m_vk.flushMappedMemoryRanges							= (FlushMappedMemoryRangesFunc)							GET_PROC_ADDR("vkFlushMappedMemoryRanges");
-m_vk.invalidateMappedMemoryRanges						= (InvalidateMappedMemoryRangesFunc)					GET_PROC_ADDR("vkInvalidateMappedMemoryRanges");
-m_vk.getDeviceMemoryCommitment							= (GetDeviceMemoryCommitmentFunc)						GET_PROC_ADDR("vkGetDeviceMemoryCommitment");
-m_vk.bindBufferMemory									= (BindBufferMemoryFunc)								GET_PROC_ADDR("vkBindBufferMemory");
-m_vk.bindImageMemory									= (BindImageMemoryFunc)									GET_PROC_ADDR("vkBindImageMemory");
-m_vk.getBufferMemoryRequirements						= (GetBufferMemoryRequirementsFunc)						GET_PROC_ADDR("vkGetBufferMemoryRequirements");
-m_vk.getImageMemoryRequirements							= (GetImageMemoryRequirementsFunc)						GET_PROC_ADDR("vkGetImageMemoryRequirements");
-m_vk.getImageSparseMemoryRequirements					= (GetImageSparseMemoryRequirementsFunc)				GET_PROC_ADDR("vkGetImageSparseMemoryRequirements");
-m_vk.queueBindSparse									= (QueueBindSparseFunc)									GET_PROC_ADDR("vkQueueBindSparse");
-m_vk.createFence										= (CreateFenceFunc)										GET_PROC_ADDR("vkCreateFence");
-m_vk.destroyFence										= (DestroyFenceFunc)									GET_PROC_ADDR("vkDestroyFence");
-m_vk.resetFences										= (ResetFencesFunc)										GET_PROC_ADDR("vkResetFences");
-m_vk.getFenceStatus										= (GetFenceStatusFunc)									GET_PROC_ADDR("vkGetFenceStatus");
-m_vk.waitForFences										= (WaitForFencesFunc)									GET_PROC_ADDR("vkWaitForFences");
-m_vk.createSemaphore									= (CreateSemaphoreFunc)									GET_PROC_ADDR("vkCreateSemaphore");
-m_vk.destroySemaphore									= (DestroySemaphoreFunc)								GET_PROC_ADDR("vkDestroySemaphore");
-m_vk.createEvent										= (CreateEventFunc)										GET_PROC_ADDR("vkCreateEvent");
-m_vk.destroyEvent										= (DestroyEventFunc)									GET_PROC_ADDR("vkDestroyEvent");
-m_vk.getEventStatus										= (GetEventStatusFunc)									GET_PROC_ADDR("vkGetEventStatus");
-m_vk.setEvent											= (SetEventFunc)										GET_PROC_ADDR("vkSetEvent");
-m_vk.resetEvent											= (ResetEventFunc)										GET_PROC_ADDR("vkResetEvent");
-m_vk.createQueryPool									= (CreateQueryPoolFunc)									GET_PROC_ADDR("vkCreateQueryPool");
-m_vk.destroyQueryPool									= (DestroyQueryPoolFunc)								GET_PROC_ADDR("vkDestroyQueryPool");
-m_vk.getQueryPoolResults								= (GetQueryPoolResultsFunc)								GET_PROC_ADDR("vkGetQueryPoolResults");
-m_vk.createBuffer										= (CreateBufferFunc)									GET_PROC_ADDR("vkCreateBuffer");
-m_vk.destroyBuffer										= (DestroyBufferFunc)									GET_PROC_ADDR("vkDestroyBuffer");
-m_vk.createBufferView									= (CreateBufferViewFunc)								GET_PROC_ADDR("vkCreateBufferView");
-m_vk.destroyBufferView									= (DestroyBufferViewFunc)								GET_PROC_ADDR("vkDestroyBufferView");
-m_vk.createImage										= (CreateImageFunc)										GET_PROC_ADDR("vkCreateImage");
-m_vk.destroyImage										= (DestroyImageFunc)									GET_PROC_ADDR("vkDestroyImage");
-m_vk.getImageSubresourceLayout							= (GetImageSubresourceLayoutFunc)						GET_PROC_ADDR("vkGetImageSubresourceLayout");
-m_vk.createImageView									= (CreateImageViewFunc)									GET_PROC_ADDR("vkCreateImageView");
-m_vk.destroyImageView									= (DestroyImageViewFunc)								GET_PROC_ADDR("vkDestroyImageView");
-m_vk.createShaderModule									= (CreateShaderModuleFunc)								GET_PROC_ADDR("vkCreateShaderModule");
-m_vk.destroyShaderModule								= (DestroyShaderModuleFunc)								GET_PROC_ADDR("vkDestroyShaderModule");
-m_vk.createPipelineCache								= (CreatePipelineCacheFunc)								GET_PROC_ADDR("vkCreatePipelineCache");
-m_vk.destroyPipelineCache								= (DestroyPipelineCacheFunc)							GET_PROC_ADDR("vkDestroyPipelineCache");
-m_vk.getPipelineCacheData								= (GetPipelineCacheDataFunc)							GET_PROC_ADDR("vkGetPipelineCacheData");
-m_vk.mergePipelineCaches								= (MergePipelineCachesFunc)								GET_PROC_ADDR("vkMergePipelineCaches");
-m_vk.createGraphicsPipelines							= (CreateGraphicsPipelinesFunc)							GET_PROC_ADDR("vkCreateGraphicsPipelines");
-m_vk.createComputePipelines								= (CreateComputePipelinesFunc)							GET_PROC_ADDR("vkCreateComputePipelines");
-m_vk.destroyPipeline									= (DestroyPipelineFunc)									GET_PROC_ADDR("vkDestroyPipeline");
-m_vk.createPipelineLayout								= (CreatePipelineLayoutFunc)							GET_PROC_ADDR("vkCreatePipelineLayout");
-m_vk.destroyPipelineLayout								= (DestroyPipelineLayoutFunc)							GET_PROC_ADDR("vkDestroyPipelineLayout");
-m_vk.createSampler										= (CreateSamplerFunc)									GET_PROC_ADDR("vkCreateSampler");
-m_vk.destroySampler										= (DestroySamplerFunc)									GET_PROC_ADDR("vkDestroySampler");
-m_vk.createDescriptorSetLayout							= (CreateDescriptorSetLayoutFunc)						GET_PROC_ADDR("vkCreateDescriptorSetLayout");
-m_vk.destroyDescriptorSetLayout							= (DestroyDescriptorSetLayoutFunc)						GET_PROC_ADDR("vkDestroyDescriptorSetLayout");
-m_vk.createDescriptorPool								= (CreateDescriptorPoolFunc)							GET_PROC_ADDR("vkCreateDescriptorPool");
-m_vk.destroyDescriptorPool								= (DestroyDescriptorPoolFunc)							GET_PROC_ADDR("vkDestroyDescriptorPool");
-m_vk.resetDescriptorPool								= (ResetDescriptorPoolFunc)								GET_PROC_ADDR("vkResetDescriptorPool");
-m_vk.allocateDescriptorSets								= (AllocateDescriptorSetsFunc)							GET_PROC_ADDR("vkAllocateDescriptorSets");
-m_vk.freeDescriptorSets									= (FreeDescriptorSetsFunc)								GET_PROC_ADDR("vkFreeDescriptorSets");
-m_vk.updateDescriptorSets								= (UpdateDescriptorSetsFunc)							GET_PROC_ADDR("vkUpdateDescriptorSets");
-m_vk.createFramebuffer									= (CreateFramebufferFunc)								GET_PROC_ADDR("vkCreateFramebuffer");
-m_vk.destroyFramebuffer									= (DestroyFramebufferFunc)								GET_PROC_ADDR("vkDestroyFramebuffer");
-m_vk.createRenderPass									= (CreateRenderPassFunc)								GET_PROC_ADDR("vkCreateRenderPass");
-m_vk.destroyRenderPass									= (DestroyRenderPassFunc)								GET_PROC_ADDR("vkDestroyRenderPass");
-m_vk.getRenderAreaGranularity							= (GetRenderAreaGranularityFunc)						GET_PROC_ADDR("vkGetRenderAreaGranularity");
-m_vk.createCommandPool									= (CreateCommandPoolFunc)								GET_PROC_ADDR("vkCreateCommandPool");
-m_vk.destroyCommandPool									= (DestroyCommandPoolFunc)								GET_PROC_ADDR("vkDestroyCommandPool");
-m_vk.resetCommandPool									= (ResetCommandPoolFunc)								GET_PROC_ADDR("vkResetCommandPool");
-m_vk.allocateCommandBuffers								= (AllocateCommandBuffersFunc)							GET_PROC_ADDR("vkAllocateCommandBuffers");
-m_vk.freeCommandBuffers									= (FreeCommandBuffersFunc)								GET_PROC_ADDR("vkFreeCommandBuffers");
-m_vk.beginCommandBuffer									= (BeginCommandBufferFunc)								GET_PROC_ADDR("vkBeginCommandBuffer");
-m_vk.endCommandBuffer									= (EndCommandBufferFunc)								GET_PROC_ADDR("vkEndCommandBuffer");
-m_vk.resetCommandBuffer									= (ResetCommandBufferFunc)								GET_PROC_ADDR("vkResetCommandBuffer");
-m_vk.cmdBindPipeline									= (CmdBindPipelineFunc)									GET_PROC_ADDR("vkCmdBindPipeline");
-m_vk.cmdSetViewport										= (CmdSetViewportFunc)									GET_PROC_ADDR("vkCmdSetViewport");
-m_vk.cmdSetScissor										= (CmdSetScissorFunc)									GET_PROC_ADDR("vkCmdSetScissor");
-m_vk.cmdSetLineWidth									= (CmdSetLineWidthFunc)									GET_PROC_ADDR("vkCmdSetLineWidth");
-m_vk.cmdSetDepthBias									= (CmdSetDepthBiasFunc)									GET_PROC_ADDR("vkCmdSetDepthBias");
-m_vk.cmdSetBlendConstants								= (CmdSetBlendConstantsFunc)							GET_PROC_ADDR("vkCmdSetBlendConstants");
-m_vk.cmdSetDepthBounds									= (CmdSetDepthBoundsFunc)								GET_PROC_ADDR("vkCmdSetDepthBounds");
-m_vk.cmdSetStencilCompareMask							= (CmdSetStencilCompareMaskFunc)						GET_PROC_ADDR("vkCmdSetStencilCompareMask");
-m_vk.cmdSetStencilWriteMask								= (CmdSetStencilWriteMaskFunc)							GET_PROC_ADDR("vkCmdSetStencilWriteMask");
-m_vk.cmdSetStencilReference								= (CmdSetStencilReferenceFunc)							GET_PROC_ADDR("vkCmdSetStencilReference");
-m_vk.cmdBindDescriptorSets								= (CmdBindDescriptorSetsFunc)							GET_PROC_ADDR("vkCmdBindDescriptorSets");
-m_vk.cmdBindIndexBuffer									= (CmdBindIndexBufferFunc)								GET_PROC_ADDR("vkCmdBindIndexBuffer");
-m_vk.cmdBindVertexBuffers								= (CmdBindVertexBuffersFunc)							GET_PROC_ADDR("vkCmdBindVertexBuffers");
-m_vk.cmdDraw											= (CmdDrawFunc)											GET_PROC_ADDR("vkCmdDraw");
-m_vk.cmdDrawIndexed										= (CmdDrawIndexedFunc)									GET_PROC_ADDR("vkCmdDrawIndexed");
-m_vk.cmdDrawIndirect									= (CmdDrawIndirectFunc)									GET_PROC_ADDR("vkCmdDrawIndirect");
-m_vk.cmdDrawIndexedIndirect								= (CmdDrawIndexedIndirectFunc)							GET_PROC_ADDR("vkCmdDrawIndexedIndirect");
-m_vk.cmdDispatch										= (CmdDispatchFunc)										GET_PROC_ADDR("vkCmdDispatch");
-m_vk.cmdDispatchIndirect								= (CmdDispatchIndirectFunc)								GET_PROC_ADDR("vkCmdDispatchIndirect");
-m_vk.cmdCopyBuffer										= (CmdCopyBufferFunc)									GET_PROC_ADDR("vkCmdCopyBuffer");
-m_vk.cmdCopyImage										= (CmdCopyImageFunc)									GET_PROC_ADDR("vkCmdCopyImage");
-m_vk.cmdBlitImage										= (CmdBlitImageFunc)									GET_PROC_ADDR("vkCmdBlitImage");
-m_vk.cmdCopyBufferToImage								= (CmdCopyBufferToImageFunc)							GET_PROC_ADDR("vkCmdCopyBufferToImage");
-m_vk.cmdCopyImageToBuffer								= (CmdCopyImageToBufferFunc)							GET_PROC_ADDR("vkCmdCopyImageToBuffer");
-m_vk.cmdUpdateBuffer									= (CmdUpdateBufferFunc)									GET_PROC_ADDR("vkCmdUpdateBuffer");
-m_vk.cmdFillBuffer										= (CmdFillBufferFunc)									GET_PROC_ADDR("vkCmdFillBuffer");
-m_vk.cmdClearColorImage									= (CmdClearColorImageFunc)								GET_PROC_ADDR("vkCmdClearColorImage");
-m_vk.cmdClearDepthStencilImage							= (CmdClearDepthStencilImageFunc)						GET_PROC_ADDR("vkCmdClearDepthStencilImage");
-m_vk.cmdClearAttachments								= (CmdClearAttachmentsFunc)								GET_PROC_ADDR("vkCmdClearAttachments");
-m_vk.cmdResolveImage									= (CmdResolveImageFunc)									GET_PROC_ADDR("vkCmdResolveImage");
-m_vk.cmdSetEvent										= (CmdSetEventFunc)										GET_PROC_ADDR("vkCmdSetEvent");
-m_vk.cmdResetEvent										= (CmdResetEventFunc)									GET_PROC_ADDR("vkCmdResetEvent");
-m_vk.cmdWaitEvents										= (CmdWaitEventsFunc)									GET_PROC_ADDR("vkCmdWaitEvents");
-m_vk.cmdPipelineBarrier									= (CmdPipelineBarrierFunc)								GET_PROC_ADDR("vkCmdPipelineBarrier");
-m_vk.cmdBeginQuery										= (CmdBeginQueryFunc)									GET_PROC_ADDR("vkCmdBeginQuery");
-m_vk.cmdEndQuery										= (CmdEndQueryFunc)										GET_PROC_ADDR("vkCmdEndQuery");
-m_vk.cmdResetQueryPool									= (CmdResetQueryPoolFunc)								GET_PROC_ADDR("vkCmdResetQueryPool");
-m_vk.cmdWriteTimestamp									= (CmdWriteTimestampFunc)								GET_PROC_ADDR("vkCmdWriteTimestamp");
-m_vk.cmdCopyQueryPoolResults							= (CmdCopyQueryPoolResultsFunc)							GET_PROC_ADDR("vkCmdCopyQueryPoolResults");
-m_vk.cmdPushConstants									= (CmdPushConstantsFunc)								GET_PROC_ADDR("vkCmdPushConstants");
-m_vk.cmdBeginRenderPass									= (CmdBeginRenderPassFunc)								GET_PROC_ADDR("vkCmdBeginRenderPass");
-m_vk.cmdNextSubpass										= (CmdNextSubpassFunc)									GET_PROC_ADDR("vkCmdNextSubpass");
-m_vk.cmdEndRenderPass									= (CmdEndRenderPassFunc)								GET_PROC_ADDR("vkCmdEndRenderPass");
-m_vk.cmdExecuteCommands									= (CmdExecuteCommandsFunc)								GET_PROC_ADDR("vkCmdExecuteCommands");
-m_vk.createSwapchainKHR									= (CreateSwapchainKHRFunc)								GET_PROC_ADDR("vkCreateSwapchainKHR");
-m_vk.destroySwapchainKHR								= (DestroySwapchainKHRFunc)								GET_PROC_ADDR("vkDestroySwapchainKHR");
-m_vk.getSwapchainImagesKHR								= (GetSwapchainImagesKHRFunc)							GET_PROC_ADDR("vkGetSwapchainImagesKHR");
-m_vk.acquireNextImageKHR								= (AcquireNextImageKHRFunc)								GET_PROC_ADDR("vkAcquireNextImageKHR");
-m_vk.queuePresentKHR									= (QueuePresentKHRFunc)									GET_PROC_ADDR("vkQueuePresentKHR");
-m_vk.createSharedSwapchainsKHR							= (CreateSharedSwapchainsKHRFunc)						GET_PROC_ADDR("vkCreateSharedSwapchainsKHR");
-m_vk.trimCommandPoolKHR									= (TrimCommandPoolKHRFunc)								GET_PROC_ADDR("vkTrimCommandPoolKHR");
-m_vk.debugMarkerSetObjectTagEXT							= (DebugMarkerSetObjectTagEXTFunc)						GET_PROC_ADDR("vkDebugMarkerSetObjectTagEXT");
-m_vk.debugMarkerSetObjectNameEXT						= (DebugMarkerSetObjectNameEXTFunc)						GET_PROC_ADDR("vkDebugMarkerSetObjectNameEXT");
-m_vk.cmdDebugMarkerBeginEXT								= (CmdDebugMarkerBeginEXTFunc)							GET_PROC_ADDR("vkCmdDebugMarkerBeginEXT");
-m_vk.cmdDebugMarkerEndEXT								= (CmdDebugMarkerEndEXTFunc)							GET_PROC_ADDR("vkCmdDebugMarkerEndEXT");
-m_vk.cmdDebugMarkerInsertEXT							= (CmdDebugMarkerInsertEXTFunc)							GET_PROC_ADDR("vkCmdDebugMarkerInsertEXT");
-m_vk.cmdDrawIndirectCountAMD							= (CmdDrawIndirectCountAMDFunc)							GET_PROC_ADDR("vkCmdDrawIndirectCountAMD");
-m_vk.cmdDrawIndexedIndirectCountAMD						= (CmdDrawIndexedIndirectCountAMDFunc)					GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountAMD");
-m_vk.getMemoryWin32HandleNV								= (GetMemoryWin32HandleNVFunc)							GET_PROC_ADDR("vkGetMemoryWin32HandleNV");
-m_vk.cmdProcessCommandsNVX								= (CmdProcessCommandsNVXFunc)							GET_PROC_ADDR("vkCmdProcessCommandsNVX");
-m_vk.cmdReserveSpaceForCommandsNVX						= (CmdReserveSpaceForCommandsNVXFunc)					GET_PROC_ADDR("vkCmdReserveSpaceForCommandsNVX");
-m_vk.createIndirectCommandsLayoutNVX					= (CreateIndirectCommandsLayoutNVXFunc)					GET_PROC_ADDR("vkCreateIndirectCommandsLayoutNVX");
-m_vk.destroyIndirectCommandsLayoutNVX					= (DestroyIndirectCommandsLayoutNVXFunc)				GET_PROC_ADDR("vkDestroyIndirectCommandsLayoutNVX");
-m_vk.createObjectTableNVX								= (CreateObjectTableNVXFunc)							GET_PROC_ADDR("vkCreateObjectTableNVX");
-m_vk.destroyObjectTableNVX								= (DestroyObjectTableNVXFunc)							GET_PROC_ADDR("vkDestroyObjectTableNVX");
-m_vk.registerObjectsNVX									= (RegisterObjectsNVXFunc)								GET_PROC_ADDR("vkRegisterObjectsNVX");
-m_vk.unregisterObjectsNVX								= (UnregisterObjectsNVXFunc)							GET_PROC_ADDR("vkUnregisterObjectsNVX");
-m_vk.getPhysicalDeviceGeneratedCommandsPropertiesNVX	= (GetPhysicalDeviceGeneratedCommandsPropertiesNVXFunc)	GET_PROC_ADDR("vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");
+m_vk.destroyDevice						= (DestroyDeviceFunc)						GET_PROC_ADDR("vkDestroyDevice");
+m_vk.getDeviceQueue						= (GetDeviceQueueFunc)						GET_PROC_ADDR("vkGetDeviceQueue");
+m_vk.queueSubmit						= (QueueSubmitFunc)							GET_PROC_ADDR("vkQueueSubmit");
+m_vk.queueWaitIdle						= (QueueWaitIdleFunc)						GET_PROC_ADDR("vkQueueWaitIdle");
+m_vk.deviceWaitIdle						= (DeviceWaitIdleFunc)						GET_PROC_ADDR("vkDeviceWaitIdle");
+m_vk.allocateMemory						= (AllocateMemoryFunc)						GET_PROC_ADDR("vkAllocateMemory");
+m_vk.freeMemory							= (FreeMemoryFunc)							GET_PROC_ADDR("vkFreeMemory");
+m_vk.mapMemory							= (MapMemoryFunc)							GET_PROC_ADDR("vkMapMemory");
+m_vk.unmapMemory						= (UnmapMemoryFunc)							GET_PROC_ADDR("vkUnmapMemory");
+m_vk.flushMappedMemoryRanges			= (FlushMappedMemoryRangesFunc)				GET_PROC_ADDR("vkFlushMappedMemoryRanges");
+m_vk.invalidateMappedMemoryRanges		= (InvalidateMappedMemoryRangesFunc)		GET_PROC_ADDR("vkInvalidateMappedMemoryRanges");
+m_vk.getDeviceMemoryCommitment			= (GetDeviceMemoryCommitmentFunc)			GET_PROC_ADDR("vkGetDeviceMemoryCommitment");
+m_vk.bindBufferMemory					= (BindBufferMemoryFunc)					GET_PROC_ADDR("vkBindBufferMemory");
+m_vk.bindImageMemory					= (BindImageMemoryFunc)						GET_PROC_ADDR("vkBindImageMemory");
+m_vk.getBufferMemoryRequirements		= (GetBufferMemoryRequirementsFunc)			GET_PROC_ADDR("vkGetBufferMemoryRequirements");
+m_vk.getImageMemoryRequirements			= (GetImageMemoryRequirementsFunc)			GET_PROC_ADDR("vkGetImageMemoryRequirements");
+m_vk.getImageSparseMemoryRequirements	= (GetImageSparseMemoryRequirementsFunc)	GET_PROC_ADDR("vkGetImageSparseMemoryRequirements");
+m_vk.queueBindSparse					= (QueueBindSparseFunc)						GET_PROC_ADDR("vkQueueBindSparse");
+m_vk.createFence						= (CreateFenceFunc)							GET_PROC_ADDR("vkCreateFence");
+m_vk.destroyFence						= (DestroyFenceFunc)						GET_PROC_ADDR("vkDestroyFence");
+m_vk.resetFences						= (ResetFencesFunc)							GET_PROC_ADDR("vkResetFences");
+m_vk.getFenceStatus						= (GetFenceStatusFunc)						GET_PROC_ADDR("vkGetFenceStatus");
+m_vk.waitForFences						= (WaitForFencesFunc)						GET_PROC_ADDR("vkWaitForFences");
+m_vk.createSemaphore					= (CreateSemaphoreFunc)						GET_PROC_ADDR("vkCreateSemaphore");
+m_vk.destroySemaphore					= (DestroySemaphoreFunc)					GET_PROC_ADDR("vkDestroySemaphore");
+m_vk.createEvent						= (CreateEventFunc)							GET_PROC_ADDR("vkCreateEvent");
+m_vk.destroyEvent						= (DestroyEventFunc)						GET_PROC_ADDR("vkDestroyEvent");
+m_vk.getEventStatus						= (GetEventStatusFunc)						GET_PROC_ADDR("vkGetEventStatus");
+m_vk.setEvent							= (SetEventFunc)							GET_PROC_ADDR("vkSetEvent");
+m_vk.resetEvent							= (ResetEventFunc)							GET_PROC_ADDR("vkResetEvent");
+m_vk.createQueryPool					= (CreateQueryPoolFunc)						GET_PROC_ADDR("vkCreateQueryPool");
+m_vk.destroyQueryPool					= (DestroyQueryPoolFunc)					GET_PROC_ADDR("vkDestroyQueryPool");
+m_vk.getQueryPoolResults				= (GetQueryPoolResultsFunc)					GET_PROC_ADDR("vkGetQueryPoolResults");
+m_vk.createBuffer						= (CreateBufferFunc)						GET_PROC_ADDR("vkCreateBuffer");
+m_vk.destroyBuffer						= (DestroyBufferFunc)						GET_PROC_ADDR("vkDestroyBuffer");
+m_vk.createBufferView					= (CreateBufferViewFunc)					GET_PROC_ADDR("vkCreateBufferView");
+m_vk.destroyBufferView					= (DestroyBufferViewFunc)					GET_PROC_ADDR("vkDestroyBufferView");
+m_vk.createImage						= (CreateImageFunc)							GET_PROC_ADDR("vkCreateImage");
+m_vk.destroyImage						= (DestroyImageFunc)						GET_PROC_ADDR("vkDestroyImage");
+m_vk.getImageSubresourceLayout			= (GetImageSubresourceLayoutFunc)			GET_PROC_ADDR("vkGetImageSubresourceLayout");
+m_vk.createImageView					= (CreateImageViewFunc)						GET_PROC_ADDR("vkCreateImageView");
+m_vk.destroyImageView					= (DestroyImageViewFunc)					GET_PROC_ADDR("vkDestroyImageView");
+m_vk.createShaderModule					= (CreateShaderModuleFunc)					GET_PROC_ADDR("vkCreateShaderModule");
+m_vk.destroyShaderModule				= (DestroyShaderModuleFunc)					GET_PROC_ADDR("vkDestroyShaderModule");
+m_vk.createPipelineCache				= (CreatePipelineCacheFunc)					GET_PROC_ADDR("vkCreatePipelineCache");
+m_vk.destroyPipelineCache				= (DestroyPipelineCacheFunc)				GET_PROC_ADDR("vkDestroyPipelineCache");
+m_vk.getPipelineCacheData				= (GetPipelineCacheDataFunc)				GET_PROC_ADDR("vkGetPipelineCacheData");
+m_vk.mergePipelineCaches				= (MergePipelineCachesFunc)					GET_PROC_ADDR("vkMergePipelineCaches");
+m_vk.createGraphicsPipelines			= (CreateGraphicsPipelinesFunc)				GET_PROC_ADDR("vkCreateGraphicsPipelines");
+m_vk.createComputePipelines				= (CreateComputePipelinesFunc)				GET_PROC_ADDR("vkCreateComputePipelines");
+m_vk.destroyPipeline					= (DestroyPipelineFunc)						GET_PROC_ADDR("vkDestroyPipeline");
+m_vk.createPipelineLayout				= (CreatePipelineLayoutFunc)				GET_PROC_ADDR("vkCreatePipelineLayout");
+m_vk.destroyPipelineLayout				= (DestroyPipelineLayoutFunc)				GET_PROC_ADDR("vkDestroyPipelineLayout");
+m_vk.createSampler						= (CreateSamplerFunc)						GET_PROC_ADDR("vkCreateSampler");
+m_vk.destroySampler						= (DestroySamplerFunc)						GET_PROC_ADDR("vkDestroySampler");
+m_vk.createDescriptorSetLayout			= (CreateDescriptorSetLayoutFunc)			GET_PROC_ADDR("vkCreateDescriptorSetLayout");
+m_vk.destroyDescriptorSetLayout			= (DestroyDescriptorSetLayoutFunc)			GET_PROC_ADDR("vkDestroyDescriptorSetLayout");
+m_vk.createDescriptorPool				= (CreateDescriptorPoolFunc)				GET_PROC_ADDR("vkCreateDescriptorPool");
+m_vk.destroyDescriptorPool				= (DestroyDescriptorPoolFunc)				GET_PROC_ADDR("vkDestroyDescriptorPool");
+m_vk.resetDescriptorPool				= (ResetDescriptorPoolFunc)					GET_PROC_ADDR("vkResetDescriptorPool");
+m_vk.allocateDescriptorSets				= (AllocateDescriptorSetsFunc)				GET_PROC_ADDR("vkAllocateDescriptorSets");
+m_vk.freeDescriptorSets					= (FreeDescriptorSetsFunc)					GET_PROC_ADDR("vkFreeDescriptorSets");
+m_vk.updateDescriptorSets				= (UpdateDescriptorSetsFunc)				GET_PROC_ADDR("vkUpdateDescriptorSets");
+m_vk.createFramebuffer					= (CreateFramebufferFunc)					GET_PROC_ADDR("vkCreateFramebuffer");
+m_vk.destroyFramebuffer					= (DestroyFramebufferFunc)					GET_PROC_ADDR("vkDestroyFramebuffer");
+m_vk.createRenderPass					= (CreateRenderPassFunc)					GET_PROC_ADDR("vkCreateRenderPass");
+m_vk.destroyRenderPass					= (DestroyRenderPassFunc)					GET_PROC_ADDR("vkDestroyRenderPass");
+m_vk.getRenderAreaGranularity			= (GetRenderAreaGranularityFunc)			GET_PROC_ADDR("vkGetRenderAreaGranularity");
+m_vk.createCommandPool					= (CreateCommandPoolFunc)					GET_PROC_ADDR("vkCreateCommandPool");
+m_vk.destroyCommandPool					= (DestroyCommandPoolFunc)					GET_PROC_ADDR("vkDestroyCommandPool");
+m_vk.resetCommandPool					= (ResetCommandPoolFunc)					GET_PROC_ADDR("vkResetCommandPool");
+m_vk.allocateCommandBuffers				= (AllocateCommandBuffersFunc)				GET_PROC_ADDR("vkAllocateCommandBuffers");
+m_vk.freeCommandBuffers					= (FreeCommandBuffersFunc)					GET_PROC_ADDR("vkFreeCommandBuffers");
+m_vk.beginCommandBuffer					= (BeginCommandBufferFunc)					GET_PROC_ADDR("vkBeginCommandBuffer");
+m_vk.endCommandBuffer					= (EndCommandBufferFunc)					GET_PROC_ADDR("vkEndCommandBuffer");
+m_vk.resetCommandBuffer					= (ResetCommandBufferFunc)					GET_PROC_ADDR("vkResetCommandBuffer");
+m_vk.cmdBindPipeline					= (CmdBindPipelineFunc)						GET_PROC_ADDR("vkCmdBindPipeline");
+m_vk.cmdSetViewport						= (CmdSetViewportFunc)						GET_PROC_ADDR("vkCmdSetViewport");
+m_vk.cmdSetScissor						= (CmdSetScissorFunc)						GET_PROC_ADDR("vkCmdSetScissor");
+m_vk.cmdSetLineWidth					= (CmdSetLineWidthFunc)						GET_PROC_ADDR("vkCmdSetLineWidth");
+m_vk.cmdSetDepthBias					= (CmdSetDepthBiasFunc)						GET_PROC_ADDR("vkCmdSetDepthBias");
+m_vk.cmdSetBlendConstants				= (CmdSetBlendConstantsFunc)				GET_PROC_ADDR("vkCmdSetBlendConstants");
+m_vk.cmdSetDepthBounds					= (CmdSetDepthBoundsFunc)					GET_PROC_ADDR("vkCmdSetDepthBounds");
+m_vk.cmdSetStencilCompareMask			= (CmdSetStencilCompareMaskFunc)			GET_PROC_ADDR("vkCmdSetStencilCompareMask");
+m_vk.cmdSetStencilWriteMask				= (CmdSetStencilWriteMaskFunc)				GET_PROC_ADDR("vkCmdSetStencilWriteMask");
+m_vk.cmdSetStencilReference				= (CmdSetStencilReferenceFunc)				GET_PROC_ADDR("vkCmdSetStencilReference");
+m_vk.cmdBindDescriptorSets				= (CmdBindDescriptorSetsFunc)				GET_PROC_ADDR("vkCmdBindDescriptorSets");
+m_vk.cmdBindIndexBuffer					= (CmdBindIndexBufferFunc)					GET_PROC_ADDR("vkCmdBindIndexBuffer");
+m_vk.cmdBindVertexBuffers				= (CmdBindVertexBuffersFunc)				GET_PROC_ADDR("vkCmdBindVertexBuffers");
+m_vk.cmdDraw							= (CmdDrawFunc)								GET_PROC_ADDR("vkCmdDraw");
+m_vk.cmdDrawIndexed						= (CmdDrawIndexedFunc)						GET_PROC_ADDR("vkCmdDrawIndexed");
+m_vk.cmdDrawIndirect					= (CmdDrawIndirectFunc)						GET_PROC_ADDR("vkCmdDrawIndirect");
+m_vk.cmdDrawIndexedIndirect				= (CmdDrawIndexedIndirectFunc)				GET_PROC_ADDR("vkCmdDrawIndexedIndirect");
+m_vk.cmdDispatch						= (CmdDispatchFunc)							GET_PROC_ADDR("vkCmdDispatch");
+m_vk.cmdDispatchIndirect				= (CmdDispatchIndirectFunc)					GET_PROC_ADDR("vkCmdDispatchIndirect");
+m_vk.cmdCopyBuffer						= (CmdCopyBufferFunc)						GET_PROC_ADDR("vkCmdCopyBuffer");
+m_vk.cmdCopyImage						= (CmdCopyImageFunc)						GET_PROC_ADDR("vkCmdCopyImage");
+m_vk.cmdBlitImage						= (CmdBlitImageFunc)						GET_PROC_ADDR("vkCmdBlitImage");
+m_vk.cmdCopyBufferToImage				= (CmdCopyBufferToImageFunc)				GET_PROC_ADDR("vkCmdCopyBufferToImage");
+m_vk.cmdCopyImageToBuffer				= (CmdCopyImageToBufferFunc)				GET_PROC_ADDR("vkCmdCopyImageToBuffer");
+m_vk.cmdUpdateBuffer					= (CmdUpdateBufferFunc)						GET_PROC_ADDR("vkCmdUpdateBuffer");
+m_vk.cmdFillBuffer						= (CmdFillBufferFunc)						GET_PROC_ADDR("vkCmdFillBuffer");
+m_vk.cmdClearColorImage					= (CmdClearColorImageFunc)					GET_PROC_ADDR("vkCmdClearColorImage");
+m_vk.cmdClearDepthStencilImage			= (CmdClearDepthStencilImageFunc)			GET_PROC_ADDR("vkCmdClearDepthStencilImage");
+m_vk.cmdClearAttachments				= (CmdClearAttachmentsFunc)					GET_PROC_ADDR("vkCmdClearAttachments");
+m_vk.cmdResolveImage					= (CmdResolveImageFunc)						GET_PROC_ADDR("vkCmdResolveImage");
+m_vk.cmdSetEvent						= (CmdSetEventFunc)							GET_PROC_ADDR("vkCmdSetEvent");
+m_vk.cmdResetEvent						= (CmdResetEventFunc)						GET_PROC_ADDR("vkCmdResetEvent");
+m_vk.cmdWaitEvents						= (CmdWaitEventsFunc)						GET_PROC_ADDR("vkCmdWaitEvents");
+m_vk.cmdPipelineBarrier					= (CmdPipelineBarrierFunc)					GET_PROC_ADDR("vkCmdPipelineBarrier");
+m_vk.cmdBeginQuery						= (CmdBeginQueryFunc)						GET_PROC_ADDR("vkCmdBeginQuery");
+m_vk.cmdEndQuery						= (CmdEndQueryFunc)							GET_PROC_ADDR("vkCmdEndQuery");
+m_vk.cmdResetQueryPool					= (CmdResetQueryPoolFunc)					GET_PROC_ADDR("vkCmdResetQueryPool");
+m_vk.cmdWriteTimestamp					= (CmdWriteTimestampFunc)					GET_PROC_ADDR("vkCmdWriteTimestamp");
+m_vk.cmdCopyQueryPoolResults			= (CmdCopyQueryPoolResultsFunc)				GET_PROC_ADDR("vkCmdCopyQueryPoolResults");
+m_vk.cmdPushConstants					= (CmdPushConstantsFunc)					GET_PROC_ADDR("vkCmdPushConstants");
+m_vk.cmdBeginRenderPass					= (CmdBeginRenderPassFunc)					GET_PROC_ADDR("vkCmdBeginRenderPass");
+m_vk.cmdNextSubpass						= (CmdNextSubpassFunc)						GET_PROC_ADDR("vkCmdNextSubpass");
+m_vk.cmdEndRenderPass					= (CmdEndRenderPassFunc)					GET_PROC_ADDR("vkCmdEndRenderPass");
+m_vk.cmdExecuteCommands					= (CmdExecuteCommandsFunc)					GET_PROC_ADDR("vkCmdExecuteCommands");
+m_vk.createSwapchainKHR					= (CreateSwapchainKHRFunc)					GET_PROC_ADDR("vkCreateSwapchainKHR");
+m_vk.destroySwapchainKHR				= (DestroySwapchainKHRFunc)					GET_PROC_ADDR("vkDestroySwapchainKHR");
+m_vk.getSwapchainImagesKHR				= (GetSwapchainImagesKHRFunc)				GET_PROC_ADDR("vkGetSwapchainImagesKHR");
+m_vk.acquireNextImageKHR				= (AcquireNextImageKHRFunc)					GET_PROC_ADDR("vkAcquireNextImageKHR");
+m_vk.queuePresentKHR					= (QueuePresentKHRFunc)						GET_PROC_ADDR("vkQueuePresentKHR");
+m_vk.createSharedSwapchainsKHR			= (CreateSharedSwapchainsKHRFunc)			GET_PROC_ADDR("vkCreateSharedSwapchainsKHR");
+m_vk.trimCommandPoolKHR					= (TrimCommandPoolKHRFunc)					GET_PROC_ADDR("vkTrimCommandPoolKHR");
+m_vk.debugMarkerSetObjectTagEXT			= (DebugMarkerSetObjectTagEXTFunc)			GET_PROC_ADDR("vkDebugMarkerSetObjectTagEXT");
+m_vk.debugMarkerSetObjectNameEXT		= (DebugMarkerSetObjectNameEXTFunc)			GET_PROC_ADDR("vkDebugMarkerSetObjectNameEXT");
+m_vk.cmdDebugMarkerBeginEXT				= (CmdDebugMarkerBeginEXTFunc)				GET_PROC_ADDR("vkCmdDebugMarkerBeginEXT");
+m_vk.cmdDebugMarkerEndEXT				= (CmdDebugMarkerEndEXTFunc)				GET_PROC_ADDR("vkCmdDebugMarkerEndEXT");
+m_vk.cmdDebugMarkerInsertEXT			= (CmdDebugMarkerInsertEXTFunc)				GET_PROC_ADDR("vkCmdDebugMarkerInsertEXT");
+m_vk.cmdDrawIndirectCountAMD			= (CmdDrawIndirectCountAMDFunc)				GET_PROC_ADDR("vkCmdDrawIndirectCountAMD");
+m_vk.cmdDrawIndexedIndirectCountAMD		= (CmdDrawIndexedIndirectCountAMDFunc)		GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountAMD");
+m_vk.getMemoryWin32HandleNV				= (GetMemoryWin32HandleNVFunc)				GET_PROC_ADDR("vkGetMemoryWin32HandleNV");
+m_vk.cmdProcessCommandsNVX				= (CmdProcessCommandsNVXFunc)				GET_PROC_ADDR("vkCmdProcessCommandsNVX");
+m_vk.cmdReserveSpaceForCommandsNVX		= (CmdReserveSpaceForCommandsNVXFunc)		GET_PROC_ADDR("vkCmdReserveSpaceForCommandsNVX");
+m_vk.createIndirectCommandsLayoutNVX	= (CreateIndirectCommandsLayoutNVXFunc)		GET_PROC_ADDR("vkCreateIndirectCommandsLayoutNVX");
+m_vk.destroyIndirectCommandsLayoutNVX	= (DestroyIndirectCommandsLayoutNVXFunc)	GET_PROC_ADDR("vkDestroyIndirectCommandsLayoutNVX");
+m_vk.createObjectTableNVX				= (CreateObjectTableNVXFunc)				GET_PROC_ADDR("vkCreateObjectTableNVX");
+m_vk.destroyObjectTableNVX				= (DestroyObjectTableNVXFunc)				GET_PROC_ADDR("vkDestroyObjectTableNVX");
+m_vk.registerObjectsNVX					= (RegisterObjectsNVXFunc)					GET_PROC_ADDR("vkRegisterObjectsNVX");
+m_vk.unregisterObjectsNVX				= (UnregisterObjectsNVXFunc)				GET_PROC_ADDR("vkUnregisterObjectsNVX");
diff --git a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
index 10ab1ae..fd29cb0 100644
--- a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
@@ -48,3 +48,4 @@
 m_vk.destroyDebugReportCallbackEXT						= (DestroyDebugReportCallbackEXTFunc)						GET_PROC_ADDR("vkDestroyDebugReportCallbackEXT");
 m_vk.debugReportMessageEXT								= (DebugReportMessageEXTFunc)								GET_PROC_ADDR("vkDebugReportMessageEXT");
 m_vk.getPhysicalDeviceExternalImageFormatPropertiesNV	= (GetPhysicalDeviceExternalImageFormatPropertiesNVFunc)	GET_PROC_ADDR("vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
+m_vk.getPhysicalDeviceGeneratedCommandsPropertiesNVX	= (GetPhysicalDeviceGeneratedCommandsPropertiesNVXFunc)		GET_PROC_ADDR("vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");
diff --git a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
index fb3d713..9a03fd4 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
@@ -236,3 +236,8 @@
 {
 	return m_vk.getPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
 }
+
+void InstanceDriver::getPhysicalDeviceGeneratedCommandsPropertiesNVX (VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const
+{
+	m_vk.getPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
+}
diff --git a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
index 148b83f..7062fb9 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
@@ -48,3 +48,4 @@
 DestroyDebugReportCallbackEXTFunc						destroyDebugReportCallbackEXT;
 DebugReportMessageEXTFunc								debugReportMessageEXT;
 GetPhysicalDeviceExternalImageFormatPropertiesNVFunc	getPhysicalDeviceExternalImageFormatPropertiesNV;
+GetPhysicalDeviceGeneratedCommandsPropertiesNVXFunc		getPhysicalDeviceGeneratedCommandsPropertiesNVX;
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index ff3d2aa..e2c70ce 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -1366,153 +1366,153 @@
 	VK_NULL_FUNC_ENTRY(vkDestroyDebugReportCallbackEXT,						destroyDebugReportCallbackEXT),
 	VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,								debugReportMessageEXT),
 	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalImageFormatPropertiesNV,	getPhysicalDeviceExternalImageFormatPropertiesNV),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX,	getPhysicalDeviceGeneratedCommandsPropertiesNVX),
 };
 
 static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
 {
-	VK_NULL_FUNC_ENTRY(vkDestroyDevice,										destroyDevice),
-	VK_NULL_FUNC_ENTRY(vkGetDeviceQueue,									getDeviceQueue),
-	VK_NULL_FUNC_ENTRY(vkQueueSubmit,										queueSubmit),
-	VK_NULL_FUNC_ENTRY(vkQueueWaitIdle,										queueWaitIdle),
-	VK_NULL_FUNC_ENTRY(vkDeviceWaitIdle,									deviceWaitIdle),
-	VK_NULL_FUNC_ENTRY(vkAllocateMemory,									allocateMemory),
-	VK_NULL_FUNC_ENTRY(vkFreeMemory,										freeMemory),
-	VK_NULL_FUNC_ENTRY(vkMapMemory,											mapMemory),
-	VK_NULL_FUNC_ENTRY(vkUnmapMemory,										unmapMemory),
-	VK_NULL_FUNC_ENTRY(vkFlushMappedMemoryRanges,							flushMappedMemoryRanges),
-	VK_NULL_FUNC_ENTRY(vkInvalidateMappedMemoryRanges,						invalidateMappedMemoryRanges),
-	VK_NULL_FUNC_ENTRY(vkGetDeviceMemoryCommitment,							getDeviceMemoryCommitment),
-	VK_NULL_FUNC_ENTRY(vkBindBufferMemory,									bindBufferMemory),
-	VK_NULL_FUNC_ENTRY(vkBindImageMemory,									bindImageMemory),
-	VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements,						getBufferMemoryRequirements),
-	VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements,						getImageMemoryRequirements),
-	VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements,					getImageSparseMemoryRequirements),
-	VK_NULL_FUNC_ENTRY(vkQueueBindSparse,									queueBindSparse),
-	VK_NULL_FUNC_ENTRY(vkCreateFence,										createFence),
-	VK_NULL_FUNC_ENTRY(vkDestroyFence,										destroyFence),
-	VK_NULL_FUNC_ENTRY(vkResetFences,										resetFences),
-	VK_NULL_FUNC_ENTRY(vkGetFenceStatus,									getFenceStatus),
-	VK_NULL_FUNC_ENTRY(vkWaitForFences,										waitForFences),
-	VK_NULL_FUNC_ENTRY(vkCreateSemaphore,									createSemaphore),
-	VK_NULL_FUNC_ENTRY(vkDestroySemaphore,									destroySemaphore),
-	VK_NULL_FUNC_ENTRY(vkCreateEvent,										createEvent),
-	VK_NULL_FUNC_ENTRY(vkDestroyEvent,										destroyEvent),
-	VK_NULL_FUNC_ENTRY(vkGetEventStatus,									getEventStatus),
-	VK_NULL_FUNC_ENTRY(vkSetEvent,											setEvent),
-	VK_NULL_FUNC_ENTRY(vkResetEvent,										resetEvent),
-	VK_NULL_FUNC_ENTRY(vkCreateQueryPool,									createQueryPool),
-	VK_NULL_FUNC_ENTRY(vkDestroyQueryPool,									destroyQueryPool),
-	VK_NULL_FUNC_ENTRY(vkGetQueryPoolResults,								getQueryPoolResults),
-	VK_NULL_FUNC_ENTRY(vkCreateBuffer,										createBuffer),
-	VK_NULL_FUNC_ENTRY(vkDestroyBuffer,										destroyBuffer),
-	VK_NULL_FUNC_ENTRY(vkCreateBufferView,									createBufferView),
-	VK_NULL_FUNC_ENTRY(vkDestroyBufferView,									destroyBufferView),
-	VK_NULL_FUNC_ENTRY(vkCreateImage,										createImage),
-	VK_NULL_FUNC_ENTRY(vkDestroyImage,										destroyImage),
-	VK_NULL_FUNC_ENTRY(vkGetImageSubresourceLayout,							getImageSubresourceLayout),
-	VK_NULL_FUNC_ENTRY(vkCreateImageView,									createImageView),
-	VK_NULL_FUNC_ENTRY(vkDestroyImageView,									destroyImageView),
-	VK_NULL_FUNC_ENTRY(vkCreateShaderModule,								createShaderModule),
-	VK_NULL_FUNC_ENTRY(vkDestroyShaderModule,								destroyShaderModule),
-	VK_NULL_FUNC_ENTRY(vkCreatePipelineCache,								createPipelineCache),
-	VK_NULL_FUNC_ENTRY(vkDestroyPipelineCache,								destroyPipelineCache),
-	VK_NULL_FUNC_ENTRY(vkGetPipelineCacheData,								getPipelineCacheData),
-	VK_NULL_FUNC_ENTRY(vkMergePipelineCaches,								mergePipelineCaches),
-	VK_NULL_FUNC_ENTRY(vkCreateGraphicsPipelines,							createGraphicsPipelines),
-	VK_NULL_FUNC_ENTRY(vkCreateComputePipelines,							createComputePipelines),
-	VK_NULL_FUNC_ENTRY(vkDestroyPipeline,									destroyPipeline),
-	VK_NULL_FUNC_ENTRY(vkCreatePipelineLayout,								createPipelineLayout),
-	VK_NULL_FUNC_ENTRY(vkDestroyPipelineLayout,								destroyPipelineLayout),
-	VK_NULL_FUNC_ENTRY(vkCreateSampler,										createSampler),
-	VK_NULL_FUNC_ENTRY(vkDestroySampler,									destroySampler),
-	VK_NULL_FUNC_ENTRY(vkCreateDescriptorSetLayout,							createDescriptorSetLayout),
-	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorSetLayout,						destroyDescriptorSetLayout),
-	VK_NULL_FUNC_ENTRY(vkCreateDescriptorPool,								createDescriptorPool),
-	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorPool,								destroyDescriptorPool),
-	VK_NULL_FUNC_ENTRY(vkResetDescriptorPool,								resetDescriptorPool),
-	VK_NULL_FUNC_ENTRY(vkAllocateDescriptorSets,							allocateDescriptorSets),
-	VK_NULL_FUNC_ENTRY(vkFreeDescriptorSets,								freeDescriptorSets),
-	VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSets,								updateDescriptorSets),
-	VK_NULL_FUNC_ENTRY(vkCreateFramebuffer,									createFramebuffer),
-	VK_NULL_FUNC_ENTRY(vkDestroyFramebuffer,								destroyFramebuffer),
-	VK_NULL_FUNC_ENTRY(vkCreateRenderPass,									createRenderPass),
-	VK_NULL_FUNC_ENTRY(vkDestroyRenderPass,									destroyRenderPass),
-	VK_NULL_FUNC_ENTRY(vkGetRenderAreaGranularity,							getRenderAreaGranularity),
-	VK_NULL_FUNC_ENTRY(vkCreateCommandPool,									createCommandPool),
-	VK_NULL_FUNC_ENTRY(vkDestroyCommandPool,								destroyCommandPool),
-	VK_NULL_FUNC_ENTRY(vkResetCommandPool,									resetCommandPool),
-	VK_NULL_FUNC_ENTRY(vkAllocateCommandBuffers,							allocateCommandBuffers),
-	VK_NULL_FUNC_ENTRY(vkFreeCommandBuffers,								freeCommandBuffers),
-	VK_NULL_FUNC_ENTRY(vkBeginCommandBuffer,								beginCommandBuffer),
-	VK_NULL_FUNC_ENTRY(vkEndCommandBuffer,									endCommandBuffer),
-	VK_NULL_FUNC_ENTRY(vkResetCommandBuffer,								resetCommandBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdBindPipeline,									cmdBindPipeline),
-	VK_NULL_FUNC_ENTRY(vkCmdSetViewport,									cmdSetViewport),
-	VK_NULL_FUNC_ENTRY(vkCmdSetScissor,										cmdSetScissor),
-	VK_NULL_FUNC_ENTRY(vkCmdSetLineWidth,									cmdSetLineWidth),
-	VK_NULL_FUNC_ENTRY(vkCmdSetDepthBias,									cmdSetDepthBias),
-	VK_NULL_FUNC_ENTRY(vkCmdSetBlendConstants,								cmdSetBlendConstants),
-	VK_NULL_FUNC_ENTRY(vkCmdSetDepthBounds,									cmdSetDepthBounds),
-	VK_NULL_FUNC_ENTRY(vkCmdSetStencilCompareMask,							cmdSetStencilCompareMask),
-	VK_NULL_FUNC_ENTRY(vkCmdSetStencilWriteMask,							cmdSetStencilWriteMask),
-	VK_NULL_FUNC_ENTRY(vkCmdSetStencilReference,							cmdSetStencilReference),
-	VK_NULL_FUNC_ENTRY(vkCmdBindDescriptorSets,								cmdBindDescriptorSets),
-	VK_NULL_FUNC_ENTRY(vkCmdBindIndexBuffer,								cmdBindIndexBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdBindVertexBuffers,								cmdBindVertexBuffers),
-	VK_NULL_FUNC_ENTRY(vkCmdDraw,											cmdDraw),
-	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexed,									cmdDrawIndexed),
-	VK_NULL_FUNC_ENTRY(vkCmdDrawIndirect,									cmdDrawIndirect),
-	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirect,							cmdDrawIndexedIndirect),
-	VK_NULL_FUNC_ENTRY(vkCmdDispatch,										cmdDispatch),
-	VK_NULL_FUNC_ENTRY(vkCmdDispatchIndirect,								cmdDispatchIndirect),
-	VK_NULL_FUNC_ENTRY(vkCmdCopyBuffer,										cmdCopyBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdCopyImage,										cmdCopyImage),
-	VK_NULL_FUNC_ENTRY(vkCmdBlitImage,										cmdBlitImage),
-	VK_NULL_FUNC_ENTRY(vkCmdCopyBufferToImage,								cmdCopyBufferToImage),
-	VK_NULL_FUNC_ENTRY(vkCmdCopyImageToBuffer,								cmdCopyImageToBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdUpdateBuffer,									cmdUpdateBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdFillBuffer,										cmdFillBuffer),
-	VK_NULL_FUNC_ENTRY(vkCmdClearColorImage,								cmdClearColorImage),
-	VK_NULL_FUNC_ENTRY(vkCmdClearDepthStencilImage,							cmdClearDepthStencilImage),
-	VK_NULL_FUNC_ENTRY(vkCmdClearAttachments,								cmdClearAttachments),
-	VK_NULL_FUNC_ENTRY(vkCmdResolveImage,									cmdResolveImage),
-	VK_NULL_FUNC_ENTRY(vkCmdSetEvent,										cmdSetEvent),
-	VK_NULL_FUNC_ENTRY(vkCmdResetEvent,										cmdResetEvent),
-	VK_NULL_FUNC_ENTRY(vkCmdWaitEvents,										cmdWaitEvents),
-	VK_NULL_FUNC_ENTRY(vkCmdPipelineBarrier,								cmdPipelineBarrier),
-	VK_NULL_FUNC_ENTRY(vkCmdBeginQuery,										cmdBeginQuery),
-	VK_NULL_FUNC_ENTRY(vkCmdEndQuery,										cmdEndQuery),
-	VK_NULL_FUNC_ENTRY(vkCmdResetQueryPool,									cmdResetQueryPool),
-	VK_NULL_FUNC_ENTRY(vkCmdWriteTimestamp,									cmdWriteTimestamp),
-	VK_NULL_FUNC_ENTRY(vkCmdCopyQueryPoolResults,							cmdCopyQueryPoolResults),
-	VK_NULL_FUNC_ENTRY(vkCmdPushConstants,									cmdPushConstants),
-	VK_NULL_FUNC_ENTRY(vkCmdBeginRenderPass,								cmdBeginRenderPass),
-	VK_NULL_FUNC_ENTRY(vkCmdNextSubpass,									cmdNextSubpass),
-	VK_NULL_FUNC_ENTRY(vkCmdEndRenderPass,									cmdEndRenderPass),
-	VK_NULL_FUNC_ENTRY(vkCmdExecuteCommands,								cmdExecuteCommands),
-	VK_NULL_FUNC_ENTRY(vkCreateSwapchainKHR,								createSwapchainKHR),
-	VK_NULL_FUNC_ENTRY(vkDestroySwapchainKHR,								destroySwapchainKHR),
-	VK_NULL_FUNC_ENTRY(vkGetSwapchainImagesKHR,								getSwapchainImagesKHR),
-	VK_NULL_FUNC_ENTRY(vkAcquireNextImageKHR,								acquireNextImageKHR),
-	VK_NULL_FUNC_ENTRY(vkQueuePresentKHR,									queuePresentKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateSharedSwapchainsKHR,							createSharedSwapchainsKHR),
-	VK_NULL_FUNC_ENTRY(vkTrimCommandPoolKHR,								trimCommandPoolKHR),
-	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectTagEXT,						debugMarkerSetObjectTagEXT),
-	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectNameEXT,						debugMarkerSetObjectNameEXT),
-	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerBeginEXT,							cmdDebugMarkerBeginEXT),
-	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerEndEXT,								cmdDebugMarkerEndEXT),
-	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerInsertEXT,							cmdDebugMarkerInsertEXT),
-	VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountAMD,							cmdDrawIndirectCountAMD),
-	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountAMD,					cmdDrawIndexedIndirectCountAMD),
-	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleNV,							getMemoryWin32HandleNV),
-	VK_NULL_FUNC_ENTRY(vkCmdProcessCommandsNVX,								cmdProcessCommandsNVX),
-	VK_NULL_FUNC_ENTRY(vkCmdReserveSpaceForCommandsNVX,						cmdReserveSpaceForCommandsNVX),
-	VK_NULL_FUNC_ENTRY(vkCreateIndirectCommandsLayoutNVX,					createIndirectCommandsLayoutNVX),
-	VK_NULL_FUNC_ENTRY(vkDestroyIndirectCommandsLayoutNVX,					destroyIndirectCommandsLayoutNVX),
-	VK_NULL_FUNC_ENTRY(vkCreateObjectTableNVX,								createObjectTableNVX),
-	VK_NULL_FUNC_ENTRY(vkDestroyObjectTableNVX,								destroyObjectTableNVX),
-	VK_NULL_FUNC_ENTRY(vkRegisterObjectsNVX,								registerObjectsNVX),
-	VK_NULL_FUNC_ENTRY(vkUnregisterObjectsNVX,								unregisterObjectsNVX),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX,	getPhysicalDeviceGeneratedCommandsPropertiesNVX),
+	VK_NULL_FUNC_ENTRY(vkDestroyDevice,						destroyDevice),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceQueue,					getDeviceQueue),
+	VK_NULL_FUNC_ENTRY(vkQueueSubmit,						queueSubmit),
+	VK_NULL_FUNC_ENTRY(vkQueueWaitIdle,						queueWaitIdle),
+	VK_NULL_FUNC_ENTRY(vkDeviceWaitIdle,					deviceWaitIdle),
+	VK_NULL_FUNC_ENTRY(vkAllocateMemory,					allocateMemory),
+	VK_NULL_FUNC_ENTRY(vkFreeMemory,						freeMemory),
+	VK_NULL_FUNC_ENTRY(vkMapMemory,							mapMemory),
+	VK_NULL_FUNC_ENTRY(vkUnmapMemory,						unmapMemory),
+	VK_NULL_FUNC_ENTRY(vkFlushMappedMemoryRanges,			flushMappedMemoryRanges),
+	VK_NULL_FUNC_ENTRY(vkInvalidateMappedMemoryRanges,		invalidateMappedMemoryRanges),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceMemoryCommitment,			getDeviceMemoryCommitment),
+	VK_NULL_FUNC_ENTRY(vkBindBufferMemory,					bindBufferMemory),
+	VK_NULL_FUNC_ENTRY(vkBindImageMemory,					bindImageMemory),
+	VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements,		getBufferMemoryRequirements),
+	VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements,		getImageMemoryRequirements),
+	VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements,	getImageSparseMemoryRequirements),
+	VK_NULL_FUNC_ENTRY(vkQueueBindSparse,					queueBindSparse),
+	VK_NULL_FUNC_ENTRY(vkCreateFence,						createFence),
+	VK_NULL_FUNC_ENTRY(vkDestroyFence,						destroyFence),
+	VK_NULL_FUNC_ENTRY(vkResetFences,						resetFences),
+	VK_NULL_FUNC_ENTRY(vkGetFenceStatus,					getFenceStatus),
+	VK_NULL_FUNC_ENTRY(vkWaitForFences,						waitForFences),
+	VK_NULL_FUNC_ENTRY(vkCreateSemaphore,					createSemaphore),
+	VK_NULL_FUNC_ENTRY(vkDestroySemaphore,					destroySemaphore),
+	VK_NULL_FUNC_ENTRY(vkCreateEvent,						createEvent),
+	VK_NULL_FUNC_ENTRY(vkDestroyEvent,						destroyEvent),
+	VK_NULL_FUNC_ENTRY(vkGetEventStatus,					getEventStatus),
+	VK_NULL_FUNC_ENTRY(vkSetEvent,							setEvent),
+	VK_NULL_FUNC_ENTRY(vkResetEvent,						resetEvent),
+	VK_NULL_FUNC_ENTRY(vkCreateQueryPool,					createQueryPool),
+	VK_NULL_FUNC_ENTRY(vkDestroyQueryPool,					destroyQueryPool),
+	VK_NULL_FUNC_ENTRY(vkGetQueryPoolResults,				getQueryPoolResults),
+	VK_NULL_FUNC_ENTRY(vkCreateBuffer,						createBuffer),
+	VK_NULL_FUNC_ENTRY(vkDestroyBuffer,						destroyBuffer),
+	VK_NULL_FUNC_ENTRY(vkCreateBufferView,					createBufferView),
+	VK_NULL_FUNC_ENTRY(vkDestroyBufferView,					destroyBufferView),
+	VK_NULL_FUNC_ENTRY(vkCreateImage,						createImage),
+	VK_NULL_FUNC_ENTRY(vkDestroyImage,						destroyImage),
+	VK_NULL_FUNC_ENTRY(vkGetImageSubresourceLayout,			getImageSubresourceLayout),
+	VK_NULL_FUNC_ENTRY(vkCreateImageView,					createImageView),
+	VK_NULL_FUNC_ENTRY(vkDestroyImageView,					destroyImageView),
+	VK_NULL_FUNC_ENTRY(vkCreateShaderModule,				createShaderModule),
+	VK_NULL_FUNC_ENTRY(vkDestroyShaderModule,				destroyShaderModule),
+	VK_NULL_FUNC_ENTRY(vkCreatePipelineCache,				createPipelineCache),
+	VK_NULL_FUNC_ENTRY(vkDestroyPipelineCache,				destroyPipelineCache),
+	VK_NULL_FUNC_ENTRY(vkGetPipelineCacheData,				getPipelineCacheData),
+	VK_NULL_FUNC_ENTRY(vkMergePipelineCaches,				mergePipelineCaches),
+	VK_NULL_FUNC_ENTRY(vkCreateGraphicsPipelines,			createGraphicsPipelines),
+	VK_NULL_FUNC_ENTRY(vkCreateComputePipelines,			createComputePipelines),
+	VK_NULL_FUNC_ENTRY(vkDestroyPipeline,					destroyPipeline),
+	VK_NULL_FUNC_ENTRY(vkCreatePipelineLayout,				createPipelineLayout),
+	VK_NULL_FUNC_ENTRY(vkDestroyPipelineLayout,				destroyPipelineLayout),
+	VK_NULL_FUNC_ENTRY(vkCreateSampler,						createSampler),
+	VK_NULL_FUNC_ENTRY(vkDestroySampler,					destroySampler),
+	VK_NULL_FUNC_ENTRY(vkCreateDescriptorSetLayout,			createDescriptorSetLayout),
+	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorSetLayout,		destroyDescriptorSetLayout),
+	VK_NULL_FUNC_ENTRY(vkCreateDescriptorPool,				createDescriptorPool),
+	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorPool,				destroyDescriptorPool),
+	VK_NULL_FUNC_ENTRY(vkResetDescriptorPool,				resetDescriptorPool),
+	VK_NULL_FUNC_ENTRY(vkAllocateDescriptorSets,			allocateDescriptorSets),
+	VK_NULL_FUNC_ENTRY(vkFreeDescriptorSets,				freeDescriptorSets),
+	VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSets,				updateDescriptorSets),
+	VK_NULL_FUNC_ENTRY(vkCreateFramebuffer,					createFramebuffer),
+	VK_NULL_FUNC_ENTRY(vkDestroyFramebuffer,				destroyFramebuffer),
+	VK_NULL_FUNC_ENTRY(vkCreateRenderPass,					createRenderPass),
+	VK_NULL_FUNC_ENTRY(vkDestroyRenderPass,					destroyRenderPass),
+	VK_NULL_FUNC_ENTRY(vkGetRenderAreaGranularity,			getRenderAreaGranularity),
+	VK_NULL_FUNC_ENTRY(vkCreateCommandPool,					createCommandPool),
+	VK_NULL_FUNC_ENTRY(vkDestroyCommandPool,				destroyCommandPool),
+	VK_NULL_FUNC_ENTRY(vkResetCommandPool,					resetCommandPool),
+	VK_NULL_FUNC_ENTRY(vkAllocateCommandBuffers,			allocateCommandBuffers),
+	VK_NULL_FUNC_ENTRY(vkFreeCommandBuffers,				freeCommandBuffers),
+	VK_NULL_FUNC_ENTRY(vkBeginCommandBuffer,				beginCommandBuffer),
+	VK_NULL_FUNC_ENTRY(vkEndCommandBuffer,					endCommandBuffer),
+	VK_NULL_FUNC_ENTRY(vkResetCommandBuffer,				resetCommandBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdBindPipeline,					cmdBindPipeline),
+	VK_NULL_FUNC_ENTRY(vkCmdSetViewport,					cmdSetViewport),
+	VK_NULL_FUNC_ENTRY(vkCmdSetScissor,						cmdSetScissor),
+	VK_NULL_FUNC_ENTRY(vkCmdSetLineWidth,					cmdSetLineWidth),
+	VK_NULL_FUNC_ENTRY(vkCmdSetDepthBias,					cmdSetDepthBias),
+	VK_NULL_FUNC_ENTRY(vkCmdSetBlendConstants,				cmdSetBlendConstants),
+	VK_NULL_FUNC_ENTRY(vkCmdSetDepthBounds,					cmdSetDepthBounds),
+	VK_NULL_FUNC_ENTRY(vkCmdSetStencilCompareMask,			cmdSetStencilCompareMask),
+	VK_NULL_FUNC_ENTRY(vkCmdSetStencilWriteMask,			cmdSetStencilWriteMask),
+	VK_NULL_FUNC_ENTRY(vkCmdSetStencilReference,			cmdSetStencilReference),
+	VK_NULL_FUNC_ENTRY(vkCmdBindDescriptorSets,				cmdBindDescriptorSets),
+	VK_NULL_FUNC_ENTRY(vkCmdBindIndexBuffer,				cmdBindIndexBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdBindVertexBuffers,				cmdBindVertexBuffers),
+	VK_NULL_FUNC_ENTRY(vkCmdDraw,							cmdDraw),
+	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexed,					cmdDrawIndexed),
+	VK_NULL_FUNC_ENTRY(vkCmdDrawIndirect,					cmdDrawIndirect),
+	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirect,			cmdDrawIndexedIndirect),
+	VK_NULL_FUNC_ENTRY(vkCmdDispatch,						cmdDispatch),
+	VK_NULL_FUNC_ENTRY(vkCmdDispatchIndirect,				cmdDispatchIndirect),
+	VK_NULL_FUNC_ENTRY(vkCmdCopyBuffer,						cmdCopyBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdCopyImage,						cmdCopyImage),
+	VK_NULL_FUNC_ENTRY(vkCmdBlitImage,						cmdBlitImage),
+	VK_NULL_FUNC_ENTRY(vkCmdCopyBufferToImage,				cmdCopyBufferToImage),
+	VK_NULL_FUNC_ENTRY(vkCmdCopyImageToBuffer,				cmdCopyImageToBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdUpdateBuffer,					cmdUpdateBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdFillBuffer,						cmdFillBuffer),
+	VK_NULL_FUNC_ENTRY(vkCmdClearColorImage,				cmdClearColorImage),
+	VK_NULL_FUNC_ENTRY(vkCmdClearDepthStencilImage,			cmdClearDepthStencilImage),
+	VK_NULL_FUNC_ENTRY(vkCmdClearAttachments,				cmdClearAttachments),
+	VK_NULL_FUNC_ENTRY(vkCmdResolveImage,					cmdResolveImage),
+	VK_NULL_FUNC_ENTRY(vkCmdSetEvent,						cmdSetEvent),
+	VK_NULL_FUNC_ENTRY(vkCmdResetEvent,						cmdResetEvent),
+	VK_NULL_FUNC_ENTRY(vkCmdWaitEvents,						cmdWaitEvents),
+	VK_NULL_FUNC_ENTRY(vkCmdPipelineBarrier,				cmdPipelineBarrier),
+	VK_NULL_FUNC_ENTRY(vkCmdBeginQuery,						cmdBeginQuery),
+	VK_NULL_FUNC_ENTRY(vkCmdEndQuery,						cmdEndQuery),
+	VK_NULL_FUNC_ENTRY(vkCmdResetQueryPool,					cmdResetQueryPool),
+	VK_NULL_FUNC_ENTRY(vkCmdWriteTimestamp,					cmdWriteTimestamp),
+	VK_NULL_FUNC_ENTRY(vkCmdCopyQueryPoolResults,			cmdCopyQueryPoolResults),
+	VK_NULL_FUNC_ENTRY(vkCmdPushConstants,					cmdPushConstants),
+	VK_NULL_FUNC_ENTRY(vkCmdBeginRenderPass,				cmdBeginRenderPass),
+	VK_NULL_FUNC_ENTRY(vkCmdNextSubpass,					cmdNextSubpass),
+	VK_NULL_FUNC_ENTRY(vkCmdEndRenderPass,					cmdEndRenderPass),
+	VK_NULL_FUNC_ENTRY(vkCmdExecuteCommands,				cmdExecuteCommands),
+	VK_NULL_FUNC_ENTRY(vkCreateSwapchainKHR,				createSwapchainKHR),
+	VK_NULL_FUNC_ENTRY(vkDestroySwapchainKHR,				destroySwapchainKHR),
+	VK_NULL_FUNC_ENTRY(vkGetSwapchainImagesKHR,				getSwapchainImagesKHR),
+	VK_NULL_FUNC_ENTRY(vkAcquireNextImageKHR,				acquireNextImageKHR),
+	VK_NULL_FUNC_ENTRY(vkQueuePresentKHR,					queuePresentKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateSharedSwapchainsKHR,			createSharedSwapchainsKHR),
+	VK_NULL_FUNC_ENTRY(vkTrimCommandPoolKHR,				trimCommandPoolKHR),
+	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectTagEXT,		debugMarkerSetObjectTagEXT),
+	VK_NULL_FUNC_ENTRY(vkDebugMarkerSetObjectNameEXT,		debugMarkerSetObjectNameEXT),
+	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerBeginEXT,			cmdDebugMarkerBeginEXT),
+	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerEndEXT,				cmdDebugMarkerEndEXT),
+	VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerInsertEXT,			cmdDebugMarkerInsertEXT),
+	VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountAMD,			cmdDrawIndirectCountAMD),
+	VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountAMD,	cmdDrawIndexedIndirectCountAMD),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleNV,			getMemoryWin32HandleNV),
+	VK_NULL_FUNC_ENTRY(vkCmdProcessCommandsNVX,				cmdProcessCommandsNVX),
+	VK_NULL_FUNC_ENTRY(vkCmdReserveSpaceForCommandsNVX,		cmdReserveSpaceForCommandsNVX),
+	VK_NULL_FUNC_ENTRY(vkCreateIndirectCommandsLayoutNVX,	createIndirectCommandsLayoutNVX),
+	VK_NULL_FUNC_ENTRY(vkDestroyIndirectCommandsLayoutNVX,	destroyIndirectCommandsLayoutNVX),
+	VK_NULL_FUNC_ENTRY(vkCreateObjectTableNVX,				createObjectTableNVX),
+	VK_NULL_FUNC_ENTRY(vkDestroyObjectTableNVX,				destroyObjectTableNVX),
+	VK_NULL_FUNC_ENTRY(vkRegisterObjectsNVX,				registerObjectsNVX),
+	VK_NULL_FUNC_ENTRY(vkUnregisterObjectsNVX,				unregisterObjectsNVX),
 };
 
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index a4edc30..c808a73 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -1,147 +1,146 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-virtual void		destroyDevice									(VkDevice device, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual void		getDeviceQueue									(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue) const = 0;
-virtual VkResult	queueSubmit										(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence) const = 0;
-virtual VkResult	queueWaitIdle									(VkQueue queue) const = 0;
-virtual VkResult	deviceWaitIdle									(VkDevice device) const = 0;
-virtual VkResult	allocateMemory									(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const = 0;
-virtual void		freeMemory										(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	mapMemory										(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) const = 0;
-virtual void		unmapMemory										(VkDevice device, VkDeviceMemory memory) const = 0;
-virtual VkResult	flushMappedMemoryRanges							(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const = 0;
-virtual VkResult	invalidateMappedMemoryRanges					(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const = 0;
-virtual void		getDeviceMemoryCommitment						(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) const = 0;
-virtual VkResult	bindBufferMemory								(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) const = 0;
-virtual VkResult	bindImageMemory									(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const = 0;
-virtual void		getBufferMemoryRequirements						(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) const = 0;
-virtual void		getImageMemoryRequirements						(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements) const = 0;
-virtual void		getImageSparseMemoryRequirements				(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) const = 0;
-virtual VkResult	queueBindSparse									(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) const = 0;
-virtual VkResult	createFence										(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence) const = 0;
-virtual void		destroyFence									(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	resetFences										(VkDevice device, deUint32 fenceCount, const VkFence* pFences) const = 0;
-virtual VkResult	getFenceStatus									(VkDevice device, VkFence fence) const = 0;
-virtual VkResult	waitForFences									(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) const = 0;
-virtual VkResult	createSemaphore									(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) const = 0;
-virtual void		destroySemaphore								(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createEvent										(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) const = 0;
-virtual void		destroyEvent									(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	getEventStatus									(VkDevice device, VkEvent event) const = 0;
-virtual VkResult	setEvent										(VkDevice device, VkEvent event) const = 0;
-virtual VkResult	resetEvent										(VkDevice device, VkEvent event) const = 0;
-virtual VkResult	createQueryPool									(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool) const = 0;
-virtual void		destroyQueryPool								(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	getQueryPoolResults								(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags) const = 0;
-virtual VkResult	createBuffer									(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) const = 0;
-virtual void		destroyBuffer									(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createBufferView								(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView) const = 0;
-virtual void		destroyBufferView								(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createImage										(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage) const = 0;
-virtual void		destroyImage									(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual void		getImageSubresourceLayout						(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) const = 0;
-virtual VkResult	createImageView									(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView) const = 0;
-virtual void		destroyImageView								(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createShaderModule								(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule) const = 0;
-virtual void		destroyShaderModule								(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createPipelineCache								(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) const = 0;
-virtual void		destroyPipelineCache							(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	getPipelineCacheData							(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData) const = 0;
-virtual VkResult	mergePipelineCaches								(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches) const = 0;
-virtual VkResult	createGraphicsPipelines							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const = 0;
-virtual VkResult	createComputePipelines							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const = 0;
-virtual void		destroyPipeline									(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createPipelineLayout							(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout) const = 0;
-virtual void		destroyPipelineLayout							(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createSampler									(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const = 0;
-virtual void		destroySampler									(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createDescriptorSetLayout						(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout) const = 0;
-virtual void		destroyDescriptorSetLayout						(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createDescriptorPool							(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) const = 0;
-virtual void		destroyDescriptorPool							(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	resetDescriptorPool								(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) const = 0;
-virtual VkResult	allocateDescriptorSets							(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets) const = 0;
-virtual VkResult	freeDescriptorSets								(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets) const = 0;
-virtual void		updateDescriptorSets							(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) const = 0;
-virtual VkResult	createFramebuffer								(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const = 0;
-virtual void		destroyFramebuffer								(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createRenderPass								(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const = 0;
-virtual void		destroyRenderPass								(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual void		getRenderAreaGranularity						(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) const = 0;
-virtual VkResult	createCommandPool								(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) const = 0;
-virtual void		destroyCommandPool								(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	resetCommandPool								(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) const = 0;
-virtual VkResult	allocateCommandBuffers							(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers) const = 0;
-virtual void		freeCommandBuffers								(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const = 0;
-virtual VkResult	beginCommandBuffer								(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo) const = 0;
-virtual VkResult	endCommandBuffer								(VkCommandBuffer commandBuffer) const = 0;
-virtual VkResult	resetCommandBuffer								(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) const = 0;
-virtual void		cmdBindPipeline									(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) const = 0;
-virtual void		cmdSetViewport									(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports) const = 0;
-virtual void		cmdSetScissor									(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors) const = 0;
-virtual void		cmdSetLineWidth									(VkCommandBuffer commandBuffer, float lineWidth) const = 0;
-virtual void		cmdSetDepthBias									(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const = 0;
-virtual void		cmdSetBlendConstants							(VkCommandBuffer commandBuffer, const float blendConstants[4]) const = 0;
-virtual void		cmdSetDepthBounds								(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) const = 0;
-virtual void		cmdSetStencilCompareMask						(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask) const = 0;
-virtual void		cmdSetStencilWriteMask							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask) const = 0;
-virtual void		cmdSetStencilReference							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference) const = 0;
-virtual void		cmdBindDescriptorSets							(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets) const = 0;
-virtual void		cmdBindIndexBuffer								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const = 0;
-virtual void		cmdBindVertexBuffers							(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) const = 0;
-virtual void		cmdDraw											(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance) const = 0;
-virtual void		cmdDrawIndexed									(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance) const = 0;
-virtual void		cmdDrawIndirect									(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const = 0;
-virtual void		cmdDrawIndexedIndirect							(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const = 0;
-virtual void		cmdDispatch										(VkCommandBuffer commandBuffer, deUint32 x, deUint32 y, deUint32 z) const = 0;
-virtual void		cmdDispatchIndirect								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const = 0;
-virtual void		cmdCopyBuffer									(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions) const = 0;
-virtual void		cmdCopyImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions) const = 0;
-virtual void		cmdBlitImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter) const = 0;
-virtual void		cmdCopyBufferToImage							(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions) const = 0;
-virtual void		cmdCopyImageToBuffer							(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions) const = 0;
-virtual void		cmdUpdateBuffer									(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) const = 0;
-virtual void		cmdFillBuffer									(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data) const = 0;
-virtual void		cmdClearColorImage								(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const = 0;
-virtual void		cmdClearDepthStencilImage						(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const = 0;
-virtual void		cmdClearAttachments								(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects) const = 0;
-virtual void		cmdResolveImage									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions) const = 0;
-virtual void		cmdSetEvent										(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const = 0;
-virtual void		cmdResetEvent									(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const = 0;
-virtual void		cmdWaitEvents									(VkCommandBuffer commandBuffer, deUint32 eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const = 0;
-virtual void		cmdPipelineBarrier								(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const = 0;
-virtual void		cmdBeginQuery									(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags) const = 0;
-virtual void		cmdEndQuery										(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query) const = 0;
-virtual void		cmdResetQueryPool								(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const = 0;
-virtual void		cmdWriteTimestamp								(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query) const = 0;
-virtual void		cmdCopyQueryPoolResults							(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) const = 0;
-virtual void		cmdPushConstants								(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues) const = 0;
-virtual void		cmdBeginRenderPass								(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) const = 0;
-virtual void		cmdNextSubpass									(VkCommandBuffer commandBuffer, VkSubpassContents contents) const = 0;
-virtual void		cmdEndRenderPass								(VkCommandBuffer commandBuffer) const = 0;
-virtual void		cmdExecuteCommands								(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const = 0;
-virtual VkResult	createSwapchainKHR								(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const = 0;
-virtual void		destroySwapchainKHR								(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	getSwapchainImagesKHR							(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const = 0;
-virtual VkResult	acquireNextImageKHR								(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex) const = 0;
-virtual VkResult	queuePresentKHR									(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const = 0;
-virtual VkResult	createSharedSwapchainsKHR						(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const = 0;
-virtual void		trimCommandPoolKHR								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const = 0;
-virtual VkResult	debugMarkerSetObjectTagEXT						(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const = 0;
-virtual VkResult	debugMarkerSetObjectNameEXT						(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const = 0;
-virtual void		cmdDebugMarkerBeginEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
-virtual void		cmdDebugMarkerEndEXT							(VkCommandBuffer commandBuffer) const = 0;
-virtual void		cmdDebugMarkerInsertEXT							(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
-virtual void		cmdDrawIndirectCountAMD							(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
-virtual void		cmdDrawIndexedIndirectCountAMD					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
-virtual VkResult	getMemoryWin32HandleNV							(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const = 0;
-virtual void		cmdProcessCommandsNVX							(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const = 0;
-virtual void		cmdReserveSpaceForCommandsNVX					(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const = 0;
-virtual VkResult	createIndirectCommandsLayoutNVX					(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout) const = 0;
-virtual void		destroyIndirectCommandsLayoutNVX				(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	createObjectTableNVX							(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable) const = 0;
-virtual void		destroyObjectTableNVX							(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	registerObjectsNVX								(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const deUint32* pObjectIndices) const = 0;
-virtual VkResult	unregisterObjectsNVX							(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const deUint32* pObjectIndices) const = 0;
-virtual void		getPhysicalDeviceGeneratedCommandsPropertiesNVX	(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const = 0;
+virtual void		destroyDevice						(VkDevice device, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void		getDeviceQueue						(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue) const = 0;
+virtual VkResult	queueSubmit							(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence) const = 0;
+virtual VkResult	queueWaitIdle						(VkQueue queue) const = 0;
+virtual VkResult	deviceWaitIdle						(VkDevice device) const = 0;
+virtual VkResult	allocateMemory						(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const = 0;
+virtual void		freeMemory							(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	mapMemory							(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) const = 0;
+virtual void		unmapMemory							(VkDevice device, VkDeviceMemory memory) const = 0;
+virtual VkResult	flushMappedMemoryRanges				(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const = 0;
+virtual VkResult	invalidateMappedMemoryRanges		(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges) const = 0;
+virtual void		getDeviceMemoryCommitment			(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) const = 0;
+virtual VkResult	bindBufferMemory					(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) const = 0;
+virtual VkResult	bindImageMemory						(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const = 0;
+virtual void		getBufferMemoryRequirements			(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) const = 0;
+virtual void		getImageMemoryRequirements			(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements) const = 0;
+virtual void		getImageSparseMemoryRequirements	(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) const = 0;
+virtual VkResult	queueBindSparse						(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) const = 0;
+virtual VkResult	createFence							(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence) const = 0;
+virtual void		destroyFence						(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	resetFences							(VkDevice device, deUint32 fenceCount, const VkFence* pFences) const = 0;
+virtual VkResult	getFenceStatus						(VkDevice device, VkFence fence) const = 0;
+virtual VkResult	waitForFences						(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) const = 0;
+virtual VkResult	createSemaphore						(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) const = 0;
+virtual void		destroySemaphore					(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createEvent							(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent) const = 0;
+virtual void		destroyEvent						(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	getEventStatus						(VkDevice device, VkEvent event) const = 0;
+virtual VkResult	setEvent							(VkDevice device, VkEvent event) const = 0;
+virtual VkResult	resetEvent							(VkDevice device, VkEvent event) const = 0;
+virtual VkResult	createQueryPool						(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool) const = 0;
+virtual void		destroyQueryPool					(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	getQueryPoolResults					(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags) const = 0;
+virtual VkResult	createBuffer						(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer) const = 0;
+virtual void		destroyBuffer						(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createBufferView					(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView) const = 0;
+virtual void		destroyBufferView					(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createImage							(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage) const = 0;
+virtual void		destroyImage						(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void		getImageSubresourceLayout			(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) const = 0;
+virtual VkResult	createImageView						(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView) const = 0;
+virtual void		destroyImageView					(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createShaderModule					(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule) const = 0;
+virtual void		destroyShaderModule					(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createPipelineCache					(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) const = 0;
+virtual void		destroyPipelineCache				(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	getPipelineCacheData				(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData) const = 0;
+virtual VkResult	mergePipelineCaches					(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches) const = 0;
+virtual VkResult	createGraphicsPipelines				(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const = 0;
+virtual VkResult	createComputePipelines				(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines) const = 0;
+virtual void		destroyPipeline						(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createPipelineLayout				(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout) const = 0;
+virtual void		destroyPipelineLayout				(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createSampler						(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const = 0;
+virtual void		destroySampler						(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createDescriptorSetLayout			(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout) const = 0;
+virtual void		destroyDescriptorSetLayout			(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createDescriptorPool				(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool) const = 0;
+virtual void		destroyDescriptorPool				(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	resetDescriptorPool					(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) const = 0;
+virtual VkResult	allocateDescriptorSets				(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets) const = 0;
+virtual VkResult	freeDescriptorSets					(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets) const = 0;
+virtual void		updateDescriptorSets				(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) const = 0;
+virtual VkResult	createFramebuffer					(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const = 0;
+virtual void		destroyFramebuffer					(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createRenderPass					(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const = 0;
+virtual void		destroyRenderPass					(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void		getRenderAreaGranularity			(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) const = 0;
+virtual VkResult	createCommandPool					(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool) const = 0;
+virtual void		destroyCommandPool					(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	resetCommandPool					(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) const = 0;
+virtual VkResult	allocateCommandBuffers				(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers) const = 0;
+virtual void		freeCommandBuffers					(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const = 0;
+virtual VkResult	beginCommandBuffer					(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo) const = 0;
+virtual VkResult	endCommandBuffer					(VkCommandBuffer commandBuffer) const = 0;
+virtual VkResult	resetCommandBuffer					(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) const = 0;
+virtual void		cmdBindPipeline						(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) const = 0;
+virtual void		cmdSetViewport						(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports) const = 0;
+virtual void		cmdSetScissor						(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors) const = 0;
+virtual void		cmdSetLineWidth						(VkCommandBuffer commandBuffer, float lineWidth) const = 0;
+virtual void		cmdSetDepthBias						(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) const = 0;
+virtual void		cmdSetBlendConstants				(VkCommandBuffer commandBuffer, const float blendConstants[4]) const = 0;
+virtual void		cmdSetDepthBounds					(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) const = 0;
+virtual void		cmdSetStencilCompareMask			(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask) const = 0;
+virtual void		cmdSetStencilWriteMask				(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask) const = 0;
+virtual void		cmdSetStencilReference				(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference) const = 0;
+virtual void		cmdBindDescriptorSets				(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets) const = 0;
+virtual void		cmdBindIndexBuffer					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const = 0;
+virtual void		cmdBindVertexBuffers				(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) const = 0;
+virtual void		cmdDraw								(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance) const = 0;
+virtual void		cmdDrawIndexed						(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance) const = 0;
+virtual void		cmdDrawIndirect						(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const = 0;
+virtual void		cmdDrawIndexedIndirect				(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride) const = 0;
+virtual void		cmdDispatch							(VkCommandBuffer commandBuffer, deUint32 x, deUint32 y, deUint32 z) const = 0;
+virtual void		cmdDispatchIndirect					(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const = 0;
+virtual void		cmdCopyBuffer						(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions) const = 0;
+virtual void		cmdCopyImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions) const = 0;
+virtual void		cmdBlitImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter) const = 0;
+virtual void		cmdCopyBufferToImage				(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions) const = 0;
+virtual void		cmdCopyImageToBuffer				(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions) const = 0;
+virtual void		cmdUpdateBuffer						(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData) const = 0;
+virtual void		cmdFillBuffer						(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data) const = 0;
+virtual void		cmdClearColorImage					(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const = 0;
+virtual void		cmdClearDepthStencilImage			(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges) const = 0;
+virtual void		cmdClearAttachments					(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects) const = 0;
+virtual void		cmdResolveImage						(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions) const = 0;
+virtual void		cmdSetEvent							(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const = 0;
+virtual void		cmdResetEvent						(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) const = 0;
+virtual void		cmdWaitEvents						(VkCommandBuffer commandBuffer, deUint32 eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const = 0;
+virtual void		cmdPipelineBarrier					(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const = 0;
+virtual void		cmdBeginQuery						(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags) const = 0;
+virtual void		cmdEndQuery							(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query) const = 0;
+virtual void		cmdResetQueryPool					(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount) const = 0;
+virtual void		cmdWriteTimestamp					(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query) const = 0;
+virtual void		cmdCopyQueryPoolResults				(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) const = 0;
+virtual void		cmdPushConstants					(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues) const = 0;
+virtual void		cmdBeginRenderPass					(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) const = 0;
+virtual void		cmdNextSubpass						(VkCommandBuffer commandBuffer, VkSubpassContents contents) const = 0;
+virtual void		cmdEndRenderPass					(VkCommandBuffer commandBuffer) const = 0;
+virtual void		cmdExecuteCommands					(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers) const = 0;
+virtual VkResult	createSwapchainKHR					(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain) const = 0;
+virtual void		destroySwapchainKHR					(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	getSwapchainImagesKHR				(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages) const = 0;
+virtual VkResult	acquireNextImageKHR					(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex) const = 0;
+virtual VkResult	queuePresentKHR						(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) const = 0;
+virtual VkResult	createSharedSwapchainsKHR			(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const = 0;
+virtual void		trimCommandPoolKHR					(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) const = 0;
+virtual VkResult	debugMarkerSetObjectTagEXT			(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo) const = 0;
+virtual VkResult	debugMarkerSetObjectNameEXT			(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo) const = 0;
+virtual void		cmdDebugMarkerBeginEXT				(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
+virtual void		cmdDebugMarkerEndEXT				(VkCommandBuffer commandBuffer) const = 0;
+virtual void		cmdDebugMarkerInsertEXT				(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
+virtual void		cmdDrawIndirectCountAMD				(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual void		cmdDrawIndexedIndirectCountAMD		(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual VkResult	getMemoryWin32HandleNV				(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const = 0;
+virtual void		cmdProcessCommandsNVX				(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const = 0;
+virtual void		cmdReserveSpaceForCommandsNVX		(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const = 0;
+virtual VkResult	createIndirectCommandsLayoutNVX		(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout) const = 0;
+virtual void		destroyIndirectCommandsLayoutNVX	(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	createObjectTableNVX				(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable) const = 0;
+virtual void		destroyObjectTableNVX				(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	registerObjectsNVX					(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectTableEntryNVX* const* ppObjectTableEntries, const deUint32* pObjectIndices) const = 0;
+virtual VkResult	unregisterObjectsNVX				(VkDevice device, VkObjectTableNVX objectTable, deUint32 objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const deUint32* pObjectIndices) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
index 1793be0..0809ccf 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
@@ -48,3 +48,4 @@
 virtual void				destroyDebugReportCallbackEXT						(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const = 0;
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
 virtual VkResult			getPhysicalDeviceExternalImageFormatPropertiesNV	(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) const = 0;
+virtual void				getPhysicalDeviceGeneratedCommandsPropertiesNVX		(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits) const = 0;
diff --git a/external/vulkancts/modules/vulkan/api/CMakeLists.txt b/external/vulkancts/modules/vulkan/api/CMakeLists.txt
index 55a55c0..4e85c1c 100644
--- a/external/vulkancts/modules/vulkan/api/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/api/CMakeLists.txt
@@ -37,6 +37,8 @@
 	vktApiNullHandleTests.hpp
 	vktApiGranularityTests.cpp
 	vktApiGranularityTests.hpp
+    vktApiGetMemoryCommitment.cpp
+    vktApiGetMemoryCommitment.hpp
 	)
 
 set(DEQP_VK_API_LIBS
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
index 8ccd621..c34b9fd 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
@@ -199,13 +199,6 @@
 	BufferCaseParameters		m_testCase;
 };
 
-inline VkDeviceSize alignDeviceSize (VkDeviceSize val, VkDeviceSize align)
-{
-	DE_ASSERT(deIsPowerOfTwo64(align));
-	DE_ASSERT(val + align >= val);				// crash on overflow
-	return (val + align - 1) & ~(align - 1);
-}
-
 tcu::TestStatus BufferTestInstance::bufferCreateAndAllocTest (VkDeviceSize size)
 {
 	const VkPhysicalDevice					vkPhysicalDevice	= getPhysicalDevice();
@@ -243,7 +236,7 @@
 		const deUint32		heapTypeIndex	= (deUint32)deCtz32(memReqs.memoryTypeBits);
 		const VkMemoryType	memoryType		= memoryProperties.memoryTypes[heapTypeIndex];
 		const VkMemoryHeap	memoryHeap		= memoryProperties.memoryHeaps[memoryType.heapIndex];
-		const VkDeviceSize	maxBufferSize	= alignDeviceSize(memoryHeap.size >> 1, memReqs.alignment);
+		const VkDeviceSize	maxBufferSize	= deAlign64(memoryHeap.size >> 1, memReqs.alignment);
 		const deUint32		shrinkBits		= 4;	// number of bits to shift when reducing the size with each iteration
 
 		size = std::min(size, maxBufferSize);
@@ -261,7 +254,7 @@
 
 				if (result != VK_SUCCESS)
 				{
-					size = alignDeviceSize(size >> shrinkBits, memReqs.alignment);
+					size = deAlign64(size >> shrinkBits, memReqs.alignment);
 
 					if (size == 0 || bufferParams.size == memReqs.alignment)
 						return tcu::TestStatus::fail("Buffer creation failed! (" + de::toString(getResultName(result)) + ")");
@@ -298,7 +291,7 @@
 
 				if (result != VK_SUCCESS)
 				{
-					size = alignDeviceSize(size >> shrinkBits, memReqs.alignment);
+					size = deAlign64(size >> shrinkBits, memReqs.alignment);
 
 					if (size == 0 || memReqs.size == memReqs.alignment)
 						return tcu::TestStatus::fail("Unable to allocate " + de::toString(memReqs.size) + " bytes of memory");
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
index 6a89a1d..a2a46da 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
@@ -32,6 +32,7 @@
 #include "tcuTextureUtil.hpp"
 #include "tcuVectorType.hpp"
 #include "tcuVectorUtil.hpp"
+#include "tcuTexLookupVerifier.hpp"
 
 #include "vkImageUtil.hpp"
 #include "vkMemUtil.hpp"
@@ -269,52 +270,81 @@
 
 void CopiesAndBlittingTestInstance::generateBuffer (tcu::PixelBufferAccess buffer, int width, int height, int depth, FillMode mode)
 {
+	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(buffer.getFormat().type);
+	tcu::Vec4						maxValue		(1.0f);
+
+	if (buffer.getFormat().order == tcu::TextureFormat::S)
+	{
+		// Stencil-only is stored in the first component. Stencil is always 8 bits.
+		maxValue.x() = 1 << 8;
+	}
+	else if (buffer.getFormat().order == tcu::TextureFormat::DS)
+	{
+		// In a combined format, fillWithComponentGradients expects stencil in the fourth component.
+		maxValue.w() = 1 << 8;
+	}
+	else if (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
+	{
+		// The tcu::Vectors we use as pixels are 32-bit, so clamp to that.
+		const tcu::IVec4	bits	= tcu::min(tcu::getTextureFormatBitDepth(buffer.getFormat()), tcu::IVec4(32));
+		const int			signBit	= (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ? 1 : 0);
+
+		for (int i = 0; i < 4; ++i)
+		{
+			if (bits[i] != 0)
+				maxValue[i] = static_cast<float>((1 << (bits[i] - signBit)) - 1);
+		}
+	}
+
 	if (mode == FILL_MODE_GRADIENT)
 	{
-		tcu::fillWithComponentGradients(buffer, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+		tcu::fillWithComponentGradients(buffer, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), maxValue);
 		return;
 	}
 
-	const tcu::Vec4		redColor	(1.0, 0.0, 0.0, 1.0);
-	const tcu::Vec4		greenColor	(0.0, 1.0, 0.0, 1.0);
-	const tcu::Vec4		blueColor	(0.0, 0.0, 1.0, 1.0);
-	const tcu::Vec4		whiteColor	(1.0, 1.0, 1.0, 1.0);
+	const tcu::Vec4		redColor	(maxValue.x(),	0.0,			0.0,			maxValue.w());
+	const tcu::Vec4		greenColor	(0.0,			maxValue.y(),	0.0,			maxValue.w());
+	const tcu::Vec4		blueColor	(0.0,			0.0,			maxValue.z(),	maxValue.w());
+	const tcu::Vec4		whiteColor	(maxValue.x(),	maxValue.y(),	maxValue.z(),	maxValue.w());
 
-	for (int z = 0; z < depth; z++)
+	for (int z = 0; z < depth;  ++z)
+	for (int y = 0; y < height; ++y)
+	for (int x = 0; x < width;  ++x)
 	{
-		for (int y = 0; y < height; y++)
+		switch (mode)
 		{
-			for (int x = 0; x < width; x++)
-			{
-				switch (mode)
+			case FILL_MODE_WHITE:
+				if (tcu::isCombinedDepthStencilType(buffer.getFormat().type))
 				{
-					case FILL_MODE_WHITE:
-						if (tcu::isCombinedDepthStencilType(buffer.getFormat().type))
-						{
-							buffer.setPixDepth(1.0f, x, y, z);
-							if (tcu::hasStencilComponent(buffer.getFormat().order))
-								buffer.setPixStencil(255, x, y, z);
-						}
-						else
-							buffer.setPixel(whiteColor, x, y, z);
-						break;
-					case FILL_MODE_RED:
-						if (tcu::isCombinedDepthStencilType(buffer.getFormat().type))
-						{
-							buffer.setPixDepth(redColor[x % 4], x, y, z);
-							if (tcu::hasStencilComponent(buffer.getFormat().order))
-								buffer.setPixStencil(255 * (int)redColor[y % 4], x, y, z);
-						}
-						else
-							buffer.setPixel(redColor, x, y, z);
-						break;
-					case FILL_MODE_MULTISAMPLE:
-						buffer.setPixel((x == y) ? tcu::Vec4(0.0, 0.5, 0.5, 1.0) : ((x > y) ? greenColor : blueColor), x, y, z);
-						break;
-					default:
-						break;
+					buffer.setPixDepth(1.0f, x, y, z);
+					if (tcu::hasStencilComponent(buffer.getFormat().order))
+						buffer.setPixStencil(255, x, y, z);
 				}
+				else
+					buffer.setPixel(whiteColor, x, y, z);
+				break;
+
+			case FILL_MODE_RED:
+				if (tcu::isCombinedDepthStencilType(buffer.getFormat().type))
+				{
+					buffer.setPixDepth(redColor[x % 4], x, y, z);
+					if (tcu::hasStencilComponent(buffer.getFormat().order))
+						buffer.setPixStencil(255 * (int)redColor[y % 4], x, y, z);
+				}
+				else
+					buffer.setPixel(redColor, x, y, z);
+				break;
+
+			case FILL_MODE_MULTISAMPLE:
+			{
+				float xScaled = static_cast<float>(x) / static_cast<float>(width);
+				float yScaled = static_cast<float>(y) / static_cast<float>(height);
+				buffer.setPixel((xScaled == yScaled) ? tcu::Vec4(0.0, 0.5, 0.5, 1.0) : ((xScaled > yScaled) ? greenColor : blueColor), x, y, z);
+				break;
 			}
+
+			default:
+				break;
 		}
 	}
 }
@@ -1597,10 +1627,13 @@
 	virtual void						copyRegionToTextureLevel		(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
 	virtual void						generateExpectedResult			(void);
 private:
-	bool								checkClampedAndUnclampedResult	(const tcu::ConstPixelBufferAccess&	result,
+	bool								checkLinearFilteredResult		(const tcu::ConstPixelBufferAccess&	result,
 																		 const tcu::ConstPixelBufferAccess&	clampedReference,
 																		 const tcu::ConstPixelBufferAccess&	unclampedReference,
-																		 VkImageAspectFlagBits				aspect);
+																		 const tcu::TextureFormat&			sourceFormat);
+	bool								checkNearestFilteredResult		(const tcu::ConstPixelBufferAccess&	result,
+																		 const tcu::ConstPixelBufferAccess& source);
+
 	Move<VkImage>						m_source;
 	de::MovePtr<Allocation>				m_sourceImageAlloc;
 	Move<VkImage>						m_destination;
@@ -1853,38 +1886,16 @@
 		return threshold;
 }
 
-tcu::TextureFormat getFormatAspect (VkFormat format, VkImageAspectFlagBits aspect)
-{
-	const tcu::TextureFormat	baseFormat	= mapVkFormat(format);
-
-	if (isCombinedDepthStencilType(baseFormat.type))
-	{
-		if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT)
-			return getEffectiveDepthStencilTextureFormat(baseFormat, tcu::Sampler::MODE_DEPTH);
-		else if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT)
-			return getEffectiveDepthStencilTextureFormat(baseFormat, tcu::Sampler::MODE_STENCIL);
-		else
-			DE_FATAL("Invalid aspect");
-	}
-
-	return baseFormat;
-}
-
-bool BlittingImages::checkClampedAndUnclampedResult (const tcu::ConstPixelBufferAccess&	result,
-													 const tcu::ConstPixelBufferAccess& clampedExpected,
-													 const tcu::ConstPixelBufferAccess& unclampedExpected,
-													 VkImageAspectFlagBits				aspect)
+bool BlittingImages::checkLinearFilteredResult (const tcu::ConstPixelBufferAccess&	result,
+												const tcu::ConstPixelBufferAccess&	clampedExpected,
+												const tcu::ConstPixelBufferAccess&	unclampedExpected,
+												const tcu::TextureFormat&			srcFormat)
 {
 	tcu::TestLog&				log			(m_context.getTestContext().getLog());
-	const bool					isLinear	= m_params.filter == VK_FILTER_LINEAR;
-	const tcu::TextureFormat	srcFormat	= getFormatAspect(m_params.src.image.format, aspect);
 	const tcu::TextureFormat	dstFormat	= result.getFormat();
 	bool						isOk		= false;
 
-	DE_ASSERT(dstFormat == getFormatAspect(m_params.dst.image.format, aspect));
-
-	if (isLinear)
-		log << tcu::TestLog::Section("ClampedSourceImage", "Region with clamped edges on source image.");
+	log << tcu::TestLog::Section("ClampedSourceImage", "Region with clamped edges on source image.");
 
 	if (isFloatFormat(dstFormat))
 	{
@@ -1894,11 +1905,9 @@
 		const tcu::Vec4	threshold	= tcu::max(srcMaxDiff, dstMaxDiff);
 
 		isOk = tcu::floatThresholdCompare(log, "Compare", "Result comparsion", clampedExpected, result, threshold, tcu::COMPARE_LOG_RESULT);
+		log << tcu::TestLog::EndSection;
 
-		if (isLinear)
-			log << tcu::TestLog::EndSection;
-
-		if (!isOk && isLinear)
+		if (!isOk)
 		{
 			log << tcu::TestLog::Section("NonClampedSourceImage", "Region with non-clamped edges on source image.");
 			isOk = tcu::floatThresholdCompare(log, "Compare", "Result comparsion", unclampedExpected, result, threshold, tcu::COMPARE_LOG_RESULT);
@@ -1914,61 +1923,318 @@
 			threshold[i] = de::max( (0x1 << bitDepth[i]) / 256, 1);
 
 		isOk = tcu::intThresholdCompare(log, "Compare", "Result comparsion", clampedExpected, result, threshold, tcu::COMPARE_LOG_RESULT);
+		log << tcu::TestLog::EndSection;
 
-		if (isLinear)
-			log << tcu::TestLog::EndSection;
-
-		if (!isOk && isLinear)
+		if (!isOk)
 		{
 			log << tcu::TestLog::Section("NonClampedSourceImage", "Region with non-clamped edges on source image.");
 			isOk = tcu::intThresholdCompare(log, "Compare", "Result comparsion", unclampedExpected, result, threshold, tcu::COMPARE_LOG_RESULT);
 			log << tcu::TestLog::EndSection;
 		}
 	}
+
 	return isOk;
 }
 
+//! Utility to encapsulate coordinate computation and loops.
+struct CompareEachPixelInEachRegion
+{
+	virtual		 ~CompareEachPixelInEachRegion  (void) {}
+	virtual bool compare						(const void* pUserData, const int x, const int y, const tcu::Vec2& srcNormCoord) const = 0;
+
+	bool forEach (const void*						pUserData,
+				  const std::vector<CopyRegion>&	regions,
+				  const int							sourceWidth,
+				  const int							sourceHeight,
+				  const tcu::PixelBufferAccess&		errorMask) const
+	{
+		bool compareOk = true;
+
+		for (std::vector<CopyRegion>::const_iterator regionIter = regions.begin(); regionIter != regions.end(); ++regionIter)
+		{
+			const VkImageBlit& blit = regionIter->imageBlit;
+
+			const int	dx		= deSign32(blit.dstOffsets[1].x - blit.dstOffsets[0].x);
+			const int	dy		= deSign32(blit.dstOffsets[1].y - blit.dstOffsets[0].y);
+			const float	xScale	= static_cast<float>(blit.srcOffsets[1].x - blit.srcOffsets[0].x) / static_cast<float>(blit.dstOffsets[1].x - blit.dstOffsets[0].x);
+			const float	yScale	= static_cast<float>(blit.srcOffsets[1].y - blit.srcOffsets[0].y) / static_cast<float>(blit.dstOffsets[1].y - blit.dstOffsets[0].y);
+			const float srcInvW	= 1.0f / static_cast<float>(sourceWidth);
+			const float srcInvH	= 1.0f / static_cast<float>(sourceHeight);
+
+			for (int y = blit.dstOffsets[0].y; y < blit.dstOffsets[1].y; y += dy)
+			for (int x = blit.dstOffsets[0].x; x < blit.dstOffsets[1].x; x += dx)
+			{
+				const tcu::Vec2 srcNormCoord
+				(
+					(xScale * (static_cast<float>(x - blit.dstOffsets[0].x) + 0.5f) + static_cast<float>(blit.srcOffsets[0].x)) * srcInvW,
+					(yScale * (static_cast<float>(y - blit.dstOffsets[0].y) + 0.5f) + static_cast<float>(blit.srcOffsets[0].y)) * srcInvH
+				);
+
+				if (!compare(pUserData, x, y, srcNormCoord))
+				{
+					errorMask.setPixel(tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y);
+					compareOk = false;
+				}
+			}
+		}
+		return compareOk;
+	}
+};
+
+tcu::Vec4 getFloatOrFixedPointFormatThreshold (const tcu::TextureFormat& format)
+{
+	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
+	const tcu::IVec4				bitDepth		= tcu::getTextureFormatBitDepth(format);
+
+	if (channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT)
+	{
+		return getFormatThreshold(format);
+	}
+	else if (channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT ||
+			 channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT)
+	{
+		const bool	isSigned	= (channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT);
+		const float	range		= isSigned ? 1.0f - (-1.0f)
+										   : 1.0f -   0.0f;
+
+		tcu::Vec4 v;
+		for (int i = 0; i < 4; ++i)
+		{
+			if (bitDepth[i] == 0)
+				v[i] = 1.0f;
+			else
+				v[i] = range / static_cast<float>((1 << bitDepth[i]) - 1);
+		}
+		return v;
+	}
+	else
+	{
+		DE_ASSERT(0);
+		return tcu::Vec4();
+	}
+}
+
+bool floatNearestBlitCompare (const tcu::ConstPixelBufferAccess&	source,
+							  const tcu::ConstPixelBufferAccess&	result,
+							  const tcu::PixelBufferAccess&			errorMask,
+							  const std::vector<CopyRegion>&		regions)
+{
+	const tcu::Sampler		sampler		(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::NEAREST, tcu::Sampler::NEAREST);
+	tcu::LookupPrecision	precision;
+
+	{
+		const tcu::IVec4	dstBitDepth	= tcu::getTextureFormatBitDepth(result.getFormat());
+		const tcu::Vec4		srcMaxDiff	= getFloatOrFixedPointFormatThreshold(source.getFormat());
+		const tcu::Vec4		dstMaxDiff	= getFloatOrFixedPointFormatThreshold(result.getFormat());
+
+		precision.colorMask		 = tcu::notEqual(dstBitDepth, tcu::IVec4(0));
+		precision.colorThreshold = tcu::max(srcMaxDiff, dstMaxDiff);
+	}
+
+	const struct Capture
+	{
+		const tcu::ConstPixelBufferAccess&	source;
+		const tcu::ConstPixelBufferAccess&	result;
+		const tcu::Sampler&					sampler;
+		const tcu::LookupPrecision&			precision;
+		const bool							isSRGB;
+	} capture =
+	{
+		source, result, sampler, precision, tcu::isSRGB(result.getFormat())
+	};
+
+	const struct Loop : CompareEachPixelInEachRegion
+	{
+		Loop (void) {}
+
+		bool compare (const void* pUserData, const int x, const int y, const tcu::Vec2& srcNormCoord) const
+		{
+			const Capture&					c					= *static_cast<const Capture*>(pUserData);
+			const tcu::TexLookupScaleMode	lookupScaleDontCare	= tcu::TEX_LOOKUP_SCALE_MINIFY;
+			tcu::Vec4						dstColor			= c.result.getPixel(x, y);
+
+			// TexLookupVerifier performs a conversion to linear space, so we have to as well
+			if (c.isSRGB)
+				dstColor = tcu::sRGBToLinear(dstColor);
+
+			return tcu::isLevel2DLookupResultValid(c.source, c.sampler, lookupScaleDontCare, c.precision, srcNormCoord, 0, dstColor);
+		}
+	} loop;
+
+	return loop.forEach(&capture, regions, source.getWidth(), source.getHeight(), errorMask);
+}
+
+bool intNearestBlitCompare (const tcu::ConstPixelBufferAccess&	source,
+							const tcu::ConstPixelBufferAccess&	result,
+							const tcu::PixelBufferAccess&		errorMask,
+							const std::vector<CopyRegion>&		regions)
+{
+	const tcu::Sampler		sampler		(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::NEAREST, tcu::Sampler::NEAREST);
+	tcu::IntLookupPrecision	precision;
+
+	{
+		const tcu::IVec4	srcBitDepth	= tcu::getTextureFormatBitDepth(source.getFormat());
+		const tcu::IVec4	dstBitDepth	= tcu::getTextureFormatBitDepth(result.getFormat());
+
+		for (deUint32 i = 0; i < 4; ++i) {
+			precision.colorThreshold[i]	= de::max(de::max(srcBitDepth[i] / 8, dstBitDepth[i] / 8), 1);
+			precision.colorMask[i]		= dstBitDepth[i] != 0;
+		}
+	}
+
+	// Prepare a source image with a matching (converted) pixel format. Ideally, we would've used a wrapper that
+	// does the conversion on the fly without wasting memory, but this approach is more straightforward.
+	tcu::TextureLevel				convertedSourceTexture	(result.getFormat(), source.getWidth(), source.getHeight());
+	const tcu::PixelBufferAccess	convertedSource			= convertedSourceTexture.getAccess();
+
+	for (int y = 0; y < source.getHeight(); ++y)
+	for (int x = 0; x < source.getWidth();  ++x)
+		convertedSource.setPixel(source.getPixelInt(x, y), x, y);	// will be clamped to max. representable value
+
+	const struct Capture
+	{
+		const tcu::ConstPixelBufferAccess&	source;
+		const tcu::ConstPixelBufferAccess&	result;
+		const tcu::Sampler&					sampler;
+		const tcu::IntLookupPrecision&		precision;
+	} capture =
+	{
+		convertedSource, result, sampler, precision
+	};
+
+	const struct Loop : CompareEachPixelInEachRegion
+	{
+		Loop (void) {}
+
+		bool compare (const void* pUserData, const int x, const int y, const tcu::Vec2& srcNormCoord) const
+		{
+			const Capture&					c					= *static_cast<const Capture*>(pUserData);
+			const tcu::TexLookupScaleMode	lookupScaleDontCare	= tcu::TEX_LOOKUP_SCALE_MINIFY;
+			const tcu::IVec4				dstColor			= c.result.getPixelInt(x, y);
+
+			return tcu::isLevel2DLookupResultValid(c.source, c.sampler, lookupScaleDontCare, c.precision, srcNormCoord, 0, dstColor);
+		}
+	} loop;
+
+	return loop.forEach(&capture, regions, source.getWidth(), source.getHeight(), errorMask);
+}
+
+bool BlittingImages::checkNearestFilteredResult (const tcu::ConstPixelBufferAccess&	result,
+												 const tcu::ConstPixelBufferAccess& source)
+{
+	tcu::TestLog&					log				(m_context.getTestContext().getLog());
+	const tcu::TextureFormat		dstFormat		= result.getFormat();
+	const tcu::TextureChannelClass	dstChannelClass = tcu::getTextureChannelClass(dstFormat.type);
+
+	tcu::TextureLevel		errorMaskStorage	(tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8), result.getWidth(), result.getHeight());
+	tcu::PixelBufferAccess	errorMask			= errorMaskStorage.getAccess();
+	tcu::Vec4				pixelBias			(0.0f, 0.0f, 0.0f, 0.0f);
+	tcu::Vec4				pixelScale			(1.0f, 1.0f, 1.0f, 1.0f);
+	bool					ok					= false;
+
+	tcu::clear(errorMask, tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0));
+
+	if (dstChannelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ||
+		dstChannelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
+	{
+		ok = intNearestBlitCompare(source, result, errorMask, m_params.regions);
+	}
+	else
+		ok = floatNearestBlitCompare(source, result, errorMask, m_params.regions);
+
+	if (result.getFormat() != tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8))
+		tcu::computePixelScaleBias(result, pixelScale, pixelBias);
+
+	if (!ok)
+	{
+		log << tcu::TestLog::ImageSet("Compare", "Result comparsion")
+			<< tcu::TestLog::Image("Result", "Result", result, pixelScale, pixelBias)
+			<< tcu::TestLog::Image("ErrorMask",	"Error mask", errorMask)
+			<< tcu::TestLog::EndImageSet;
+	}
+	else
+	{
+		log << tcu::TestLog::ImageSet("Compare", "Result comparsion")
+			<< tcu::TestLog::Image("Result", "Result", result, pixelScale, pixelBias)
+			<< tcu::TestLog::EndImageSet;
+	}
+
+	return ok;
+}
+
 tcu::TestStatus BlittingImages::checkTestResult (tcu::ConstPixelBufferAccess result)
 {
 	DE_ASSERT(m_params.filter == VK_FILTER_NEAREST || m_params.filter == VK_FILTER_LINEAR);
+	const std::string failMessage("Result image is incorrect");
 
-	if (tcu::isCombinedDepthStencilType(result.getFormat().type))
+	if (m_params.filter == VK_FILTER_LINEAR)
 	{
-		if (tcu::hasDepthComponent(result.getFormat().order))
+		if (tcu::isCombinedDepthStencilType(result.getFormat().type))
 		{
-			const tcu::Sampler::DepthStencilMode	mode				= tcu::Sampler::MODE_DEPTH;
-			const tcu::ConstPixelBufferAccess		depthResult			= tcu::getEffectiveDepthStencilAccess(result, mode);
-			const tcu::ConstPixelBufferAccess		clampedExpected		= tcu::getEffectiveDepthStencilAccess(m_expectedTextureLevel->getAccess(), mode);
-			const tcu::ConstPixelBufferAccess		unclampedExpected	= m_params.filter == VK_FILTER_LINEAR ? tcu::getEffectiveDepthStencilAccess(m_unclampedExpectedTextureLevel->getAccess(), mode) : tcu::ConstPixelBufferAccess();
-
-			if (!checkClampedAndUnclampedResult(depthResult, clampedExpected, unclampedExpected, VK_IMAGE_ASPECT_DEPTH_BIT))
+			if (tcu::hasDepthComponent(result.getFormat().order))
 			{
-				return tcu::TestStatus::fail("CopiesAndBlitting test");
+				const tcu::Sampler::DepthStencilMode	mode				= tcu::Sampler::MODE_DEPTH;
+				const tcu::ConstPixelBufferAccess		depthResult			= tcu::getEffectiveDepthStencilAccess(result, mode);
+				const tcu::ConstPixelBufferAccess		clampedExpected		= tcu::getEffectiveDepthStencilAccess(m_expectedTextureLevel->getAccess(), mode);
+				const tcu::ConstPixelBufferAccess		unclampedExpected	= tcu::getEffectiveDepthStencilAccess(m_unclampedExpectedTextureLevel->getAccess(), mode);
+				const tcu::TextureFormat				sourceFormat		= tcu::getEffectiveDepthStencilTextureFormat(mapVkFormat(m_params.src.image.format), mode);
+
+				if (!checkLinearFilteredResult(depthResult, clampedExpected, unclampedExpected, sourceFormat))
+					return tcu::TestStatus::fail(failMessage);
+			}
+
+			if (tcu::hasStencilComponent(result.getFormat().order))
+			{
+				const tcu::Sampler::DepthStencilMode	mode				= tcu::Sampler::MODE_STENCIL;
+				const tcu::ConstPixelBufferAccess		stencilResult		= tcu::getEffectiveDepthStencilAccess(result, mode);
+				const tcu::ConstPixelBufferAccess		clampedExpected		= tcu::getEffectiveDepthStencilAccess(m_expectedTextureLevel->getAccess(), mode);
+				const tcu::ConstPixelBufferAccess		unclampedExpected	= tcu::getEffectiveDepthStencilAccess(m_unclampedExpectedTextureLevel->getAccess(), mode);
+				const tcu::TextureFormat				sourceFormat		= tcu::getEffectiveDepthStencilTextureFormat(mapVkFormat(m_params.src.image.format), mode);
+
+				if (!checkLinearFilteredResult(stencilResult, clampedExpected, unclampedExpected, sourceFormat))
+					return tcu::TestStatus::fail(failMessage);
 			}
 		}
-
-		if (tcu::hasStencilComponent(result.getFormat().order))
+		else
 		{
-			const tcu::Sampler::DepthStencilMode	mode				= tcu::Sampler::MODE_STENCIL;
-			const tcu::ConstPixelBufferAccess		stencilResult		= tcu::getEffectiveDepthStencilAccess(result, mode);
-			const tcu::ConstPixelBufferAccess		clampedExpected		= tcu::getEffectiveDepthStencilAccess(m_expectedTextureLevel->getAccess(), mode);
-			const tcu::ConstPixelBufferAccess		unclampedExpected	= m_params.filter == VK_FILTER_LINEAR ? tcu::getEffectiveDepthStencilAccess(m_unclampedExpectedTextureLevel->getAccess(), mode) : tcu::ConstPixelBufferAccess();
+			const tcu::TextureFormat	sourceFormat	= mapVkFormat(m_params.src.image.format);
 
-			if (!checkClampedAndUnclampedResult(stencilResult, clampedExpected, unclampedExpected, VK_IMAGE_ASPECT_STENCIL_BIT))
-			{
-				return tcu::TestStatus::fail("CopiesAndBlitting test");
-			}
+			if (!checkLinearFilteredResult(result, m_expectedTextureLevel->getAccess(), m_unclampedExpectedTextureLevel->getAccess(), sourceFormat))
+				return tcu::TestStatus::fail(failMessage);
 		}
 	}
-	else
+	else // NEAREST filtering
 	{
-		if (!checkClampedAndUnclampedResult(result, m_expectedTextureLevel->getAccess(), m_params.filter == VK_FILTER_LINEAR ? m_unclampedExpectedTextureLevel->getAccess() : tcu::ConstPixelBufferAccess(), VK_IMAGE_ASPECT_COLOR_BIT))
+		if (tcu::isCombinedDepthStencilType(result.getFormat().type))
 		{
-			return tcu::TestStatus::fail("CopiesAndBlitting test");
+			if (tcu::hasDepthComponent(result.getFormat().order))
+			{
+				const tcu::Sampler::DepthStencilMode	mode			= tcu::Sampler::MODE_DEPTH;
+				const tcu::ConstPixelBufferAccess		depthResult		= tcu::getEffectiveDepthStencilAccess(result, mode);
+				const tcu::ConstPixelBufferAccess		depthSource		= tcu::getEffectiveDepthStencilAccess(m_sourceTextureLevel->getAccess(), mode);
+
+				if (!checkNearestFilteredResult(depthResult, depthSource))
+					return tcu::TestStatus::fail(failMessage);
+			}
+
+			if (tcu::hasStencilComponent(result.getFormat().order))
+			{
+				const tcu::Sampler::DepthStencilMode	mode			= tcu::Sampler::MODE_STENCIL;
+				const tcu::ConstPixelBufferAccess		stencilResult	= tcu::getEffectiveDepthStencilAccess(result, mode);
+				const tcu::ConstPixelBufferAccess		stencilSource	= tcu::getEffectiveDepthStencilAccess(m_sourceTextureLevel->getAccess(), mode);
+
+				if (!checkNearestFilteredResult(stencilResult, stencilSource))
+					return tcu::TestStatus::fail(failMessage);
+			}
+		}
+		else
+		{
+			if (!checkNearestFilteredResult(result, m_sourceTextureLevel->getAccess()))
+				return tcu::TestStatus::fail(failMessage);
 		}
 	}
 
-	return tcu::TestStatus::pass("CopiesAndBlitting test");
+	return tcu::TestStatus::pass("Pass");
 }
 
 tcu::Vec4 linearToSRGBIfNeeded (const tcu::TextureFormat& format, const tcu::Vec4& color)
@@ -4729,9 +4995,6 @@
 	}
 
 	{
-		const std::string	description	("Blit with scaling (partial)");
-		const std::string	testName	("scaling_partial");
-
 		// Test Color formats.
 		{
 			TestParams	params;
@@ -4796,7 +5059,7 @@
 				params.dst.image.imageType	= VK_IMAGE_TYPE_2D;
 				params.dst.image.format		= params.src.image.format;
 				std::ostringstream	oss;
-				oss << testName << "_" << getFormatCaseName(params.src.image.format) << "_" << getFormatCaseName(params.dst.image.format);
+				oss << getFormatCaseName(params.src.image.format) << "_" << getFormatCaseName(params.dst.image.format);
 
 				const VkImageSubresourceLayers	defaultDepthSourceLayer		= { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, 1u };
 				const VkImageSubresourceLayers	defaultStencilSourceLayer	= { VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u };
@@ -4868,7 +5131,7 @@
 				}
 
 				params.filter			= VK_FILTER_NEAREST;
-				blitImgAllFormatsTests->addChild(new BlittingTestCase(testCtx, oss.str() + "_nearest", description, params));
+				blitImgAllFormatsTests->addChild(new BlittingTestCase(testCtx, oss.str() + "_nearest", "Blit image between compatible depth/stencil formats", params));
 			}
 		}
 	}
@@ -5409,6 +5672,77 @@
 
 	imageToImageTests->addChild(imgToImg3dImagesTests.release());
 
+	{
+		const std::string	description	("Resolve from image to image of different size");
+		const std::string	testName	("diff_image_size");
+
+		TestParams			params;
+		params.src.image.imageType		=	VK_IMAGE_TYPE_2D;
+		params.src.image.format			=	VK_FORMAT_R8G8B8A8_UNORM;
+		params.dst.image.imageType		=	VK_IMAGE_TYPE_2D;
+		params.dst.image.format			=	VK_FORMAT_R8G8B8A8_UNORM;
+
+		{
+			const VkImageSubresourceLayers	sourceLayer	=
+			{
+				VK_IMAGE_ASPECT_COLOR_BIT,	// VkImageAspectFlags	aspectMask;
+				0u,							// uint32_t				mipLevel;
+				0u,							// uint32_t				baseArrayLayer;
+				1u							// uint32_t				layerCount;
+			};
+			const VkImageResolve			testResolve	=
+			{
+				sourceLayer,	// VkImageSubresourceLayers	srcSubresource;
+				{0, 0, 0},		// VkOffset3D				srcOffset;
+				sourceLayer,	// VkImageSubresourceLayers	dstSubresource;
+				{0, 0, 0},		// VkOffset3D				dstOffset;
+				resolveExtent,	// VkExtent3D				extent;
+			};
+
+			CopyRegion	imageResolve;
+			imageResolve.imageResolve	= testResolve;
+			params.regions.push_back(imageResolve);
+		}
+
+		const VkExtent3D imageExtents[]		=
+		{
+			{ resolveExtent.width + 10,	resolveExtent.height,		resolveExtent.depth },
+			{ resolveExtent.width,		resolveExtent.height * 2,	resolveExtent.depth },
+			{ resolveExtent.width,		resolveExtent.height,		resolveExtent.depth + 10 }
+		};
+
+		for (int srcImageExtentIndex = 0; srcImageExtentIndex < DE_LENGTH_OF_ARRAY(imageExtents); ++srcImageExtentIndex)
+		{
+			const VkExtent3D&	srcImageSize	= imageExtents[srcImageExtentIndex];
+
+			params.src.image.extent				= srcImageSize;
+			params.dst.image.extent				= resolveExtent;
+
+			for (int samplesIndex = 0; samplesIndex < DE_LENGTH_OF_ARRAY(samples); ++samplesIndex)
+			{
+				params.samples = samples[samplesIndex];
+				std::ostringstream caseName;
+				caseName << testName << "_src_" << srcImageSize.width << "_" << srcImageSize.height << "_" << srcImageSize.depth << "_" << getSampleCountCaseName(samples[samplesIndex]);
+				resolveImageTests->addChild(new ResolveImageToImageTestCase(testCtx, caseName.str(), description, params));
+			}
+		}
+
+		for (int dstImageExtentIndex = 0; dstImageExtentIndex < DE_LENGTH_OF_ARRAY(imageExtents); ++dstImageExtentIndex)
+		{
+			const VkExtent3D&	dstImageSize	= imageExtents[dstImageExtentIndex];
+			params.src.image.extent				= resolveExtent;
+			params.dst.image.extent				= dstImageSize;
+
+			for (int samplesIndex = 0; samplesIndex < DE_LENGTH_OF_ARRAY(samples); ++samplesIndex)
+			{
+				params.samples = samples[samplesIndex];
+				std::ostringstream caseName;
+				caseName << testName << "_dst_" << dstImageSize.width << "_" << dstImageSize.height << "_" << dstImageSize.depth << "_" << getSampleCountCaseName(samples[samplesIndex]);
+				resolveImageTests->addChild(new ResolveImageToImageTestCase(testCtx, caseName.str(), description, params));
+			}
+		}
+	}
+
 	copiesAndBlittingTests->addChild(imageToImageTests.release());
 	copiesAndBlittingTests->addChild(imageToBufferTests.release());
 	copiesAndBlittingTests->addChild(bufferToImageTests.release());
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
index aeabde0..ae724ca 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
@@ -2108,12 +2108,28 @@
 				results.check(imageType != VK_IMAGE_TYPE_3D || (properties.maxExtent.width >= 1 && properties.maxExtent.height >= 1 && properties.maxExtent.depth >= 1), "Invalid dimensions for 3D image");
 				results.check(imageType != VK_IMAGE_TYPE_3D || properties.maxArrayLayers == 1, "Invalid maxArrayLayers for 3D image");
 
-				if (tiling == VK_IMAGE_TILING_OPTIMAL && imageType == VK_IMAGE_TYPE_2D && !(curCreateFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
-					 ((supportedFeatures & (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) ||
-					 ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && deviceFeatures.shaderStorageImageMultisample)))
+				if (tiling == VK_IMAGE_TILING_OPTIMAL)
 				{
-					const VkSampleCountFlags	requiredSampleCounts	= getRequiredOptimalTilingSampleCounts(deviceLimits, format, curUsageFlags);
-					results.check((properties.sampleCounts & requiredSampleCounts) == requiredSampleCounts, "Required sample counts not supported");
+					// Vulkan API specification has changed since initial Android Nougat release.
+					// For NYC CTS we need to tolerate old behavior as well and issue compatibility
+					// warning instead.
+					//
+					// See spec issues 272, 282, 302, 445 and CTS issues 369, 440.
+					const bool	requiredByNewSpec	= (imageType == VK_IMAGE_TYPE_2D && !(curCreateFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
+													  ((supportedFeatures & (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) ||
+													  ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && deviceFeatures.shaderStorageImageMultisample)));
+
+					if (requiredByNewSpec)
+					{
+						const VkSampleCountFlags	requiredSampleCounts	= getRequiredOptimalTilingSampleCounts(deviceLimits, format, curUsageFlags);
+
+						results.check((properties.sampleCounts & requiredSampleCounts) == requiredSampleCounts, "Required sample counts not supported");
+					}
+					else if (properties.sampleCounts != VK_SAMPLE_COUNT_1_BIT)
+					{
+						results.addResult(QP_TEST_RESULT_COMPATIBILITY_WARNING,
+									      "Implementation supports more sample counts than allowed by the spec");
+					}
 				}
 				else
 					results.check(properties.sampleCounts == VK_SAMPLE_COUNT_1_BIT, "sampleCounts != VK_SAMPLE_COUNT_1_BIT");
diff --git a/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.cpp b/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.cpp
new file mode 100644
index 0000000..44d1a17
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.cpp
@@ -0,0 +1,788 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * 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 Memory Commitment tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktApiGetMemoryCommitment.hpp"
+
+#include "vkDeviceUtil.cpp"
+#include "vkImageUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vktTestCase.hpp"
+#include "vkTypeUtil.cpp"
+
+using namespace vk;
+using tcu::TestLog;
+
+namespace vkt
+{
+namespace api
+{
+
+struct MemoryCommitmentCaseParams
+{
+	deUint32	bufferSize;
+	deUint32	bufferViewSize;
+	deUint32	elementOffset;
+};
+
+class MemoryCommitmentTestInstance : public vkt::TestInstance
+{
+public:
+									MemoryCommitmentTestInstance	(Context& context, MemoryCommitmentCaseParams testCase);
+	tcu::TestStatus					iterate							(void);
+	deUint32						getMemoryTypeIndex				(VkMemoryPropertyFlags propertyFlag, VkPhysicalDeviceMemoryProperties pMemoryProperties);
+	Move<VkCommandPool>				createCommandPool				() const;
+	Move<VkCommandBuffer>			allocatePrimaryCommandBuffer	(VkCommandPool commandPool) const;
+	void							submitCommandsAndWait			(const DeviceInterface& vkd,
+																	 const VkDevice			device,
+																	 const VkQueue			queue,
+																	 const VkCommandBuffer& cmdBuffer);
+	bool							isDeviceMemoryCommitmentOk		(const VkMemoryRequirements memoryRequirements);
+
+private:
+	const tcu::IVec2				m_renderSize;
+};
+
+MemoryCommitmentTestInstance::MemoryCommitmentTestInstance(Context& context, MemoryCommitmentCaseParams testCase)
+	: vkt::TestInstance		(context)
+	, m_renderSize			(testCase.bufferViewSize, testCase.bufferViewSize)
+{
+}
+
+class MemoryCommitmentTestCase : public vkt::TestCase
+{
+public:
+							MemoryCommitmentTestCase	(tcu::TestContext&				testCtx,
+														const std::string&				name,
+														const std::string&				description,
+														MemoryCommitmentCaseParams		memoryCommitmentTestInfo)
+							: vkt::TestCase					(testCtx, name, description)
+							, m_memoryCommitmentTestInfo	(memoryCommitmentTestInfo)
+							{}
+	virtual					~MemoryCommitmentTestCase(void){}
+	virtual	void			initPrograms	(SourceCollections&	programCollection)	const;
+	virtual TestInstance*	createInstance	(Context&			context)			const
+							{
+								return new MemoryCommitmentTestInstance(context, m_memoryCommitmentTestInfo);
+							}
+private:
+	MemoryCommitmentCaseParams m_memoryCommitmentTestInfo;
+};
+
+tcu::TestStatus MemoryCommitmentTestInstance::iterate(void)
+{
+	const VkMemoryPropertyFlags				propertyFlag			= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
+	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
+	const InstanceInterface&				vki						= m_context.getInstanceInterface();
+	const VkPhysicalDeviceMemoryProperties	pMemoryProperties		= getPhysicalDeviceMemoryProperties(vki,physicalDevice);
+	const deUint32							memoryTypeIndex			= getMemoryTypeIndex(propertyFlag, pMemoryProperties);
+	Allocator&								memAlloc				= m_context.getDefaultAllocator();
+	bool									isMemoryAllocationOK	= false;
+	const deUint32							queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
+	const VkComponentMapping				componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
+	const DeviceInterface&					vkd						= m_context.getDeviceInterface();
+	const Move<VkCommandPool>				cmdPool					= createCommandPool();
+	const Move<VkCommandBuffer>				cmdBuffer				= allocatePrimaryCommandBuffer(*cmdPool);
+	const VkDevice							device					= m_context.getDevice();
+	Move<VkImageView>						colorAttachmentView;
+	Move<VkRenderPass>						renderPass;
+	Move<VkFramebuffer>						framebuffer;
+	Move<VkDescriptorSetLayout>				descriptorSetLayout;
+	Move<VkPipelineLayout>					pipelineLayout;
+	Move<VkShaderModule>					vertexShaderModule;
+	Move<VkShaderModule>					fragmentShaderModule;
+	Move<VkPipeline>						graphicsPipelines;
+
+	if(memoryTypeIndex == -1u)
+		TCU_THROW(NotSupportedError, "Lazily allocated bit is not supported");
+
+	const VkImageCreateInfo	imageParams			=
+	{
+		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType		sType;
+		DE_NULL,										// const void*			pNext;
+		0u,												// VkImageCreateFlags	flags;
+		VK_IMAGE_TYPE_2D,								// VkImageType			imageType;
+		VK_FORMAT_R32_UINT,								// VkFormat				format;
+		{256u, 256u, 1},								// VkExtent3D			extent;
+		1u,												// deUint32				mipLevels;
+		1u,												// deUint32				arraySize;
+		VK_SAMPLE_COUNT_1_BIT,							// deUint32				samples;
+		VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling		tiling;
+		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+			VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,	// VkImageUsageFlags	usage;
+		VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode		sharingMode;
+		1u,												// deUint32				queueFamilyCount;
+		&queueFamilyIndex,								// const deUint32*		pQueueFamilyIndices;
+		VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout		initialLayout;
+	};
+
+	Move<VkImage>				image				= createImage(vkd, device, &imageParams);
+	const VkMemoryRequirements	memoryRequirements	= getImageMemoryRequirements(vkd, device, *image);
+	de::MovePtr<Allocation>		imageAlloc			= memAlloc.allocate(memoryRequirements, MemoryRequirement::LazilyAllocated);
+
+	VK_CHECK(vkd.bindImageMemory(device, *image, imageAlloc->getMemory(), imageAlloc->getOffset()));
+
+	const VkImageViewCreateInfo colorAttachmentViewParams	=
+	{
+		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
+		DE_NULL,											// const void*				pNext;
+		0u,													// VkImageViewCreateFlags	flags;
+		*image,												// VkImage					image;
+		VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
+		VK_FORMAT_R32_UINT,									// VkFormat					format;
+		componentMappingRGBA,								// VkComponentMapping		components;
+		{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
+	};
+
+	colorAttachmentView = createImageView(vkd, device, &colorAttachmentViewParams);
+
+	// Create render pass
+	{
+		const VkAttachmentDescription colorAttachmentDescription =
+		{
+			0u,													// VkAttachmentDescriptionFlags		flags;
+			VK_FORMAT_R32_UINT,									// VkFormat							format;
+			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
+			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp				loadOp;
+			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
+			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
+			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					initialLayout;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout					finalLayout;
+		};
+
+		const VkAttachmentReference colorAttachmentReference =
+		{
+			0u,													// deUint32			attachment;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
+		};
+
+		const VkSubpassDescription subpassDescription =
+		{
+			0u,													// VkSubpassDescriptionFlags	flags;
+			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
+			0u,													// deUint32						inputAttachmentCount;
+			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
+			1u,													// deUint32						colorAttachmentCount;
+			&colorAttachmentReference,							// const VkAttachmentReference*	pColorAttachments;
+			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
+			DE_NULL,											// const VkAttachmentReference*	pDepthStencilAttachment;
+			0u,													// deUint32						preserveAttachmentCount;
+			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
+		};
+
+		const VkRenderPassCreateInfo renderPassParams =
+		{
+			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
+			DE_NULL,											// const void*						pNext;
+			0u,													// VkRenderPassCreateFlags			flags;
+			1u,													// deUint32							attachmentCount;
+			&colorAttachmentDescription,						// const VkAttachmentDescription*	pAttachments;
+			1u,													// deUint32							subpassCount;
+			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
+			0u,													// deUint32							dependencyCount;
+			DE_NULL												// const VkSubpassDependency*		pDependencies;
+		};
+
+		renderPass = createRenderPass(vkd, device, &renderPassParams);
+	}
+
+	// Create framebuffer
+	{
+		const VkImageView attachmentBindInfos[1] =
+		{
+			*colorAttachmentView,
+		};
+
+		const VkFramebufferCreateInfo framebufferParams =
+		{
+			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType				sType;
+			DE_NULL,											// const void*					pNext;
+			(VkFramebufferCreateFlags)0,
+			*renderPass,										// VkRenderPass					renderPass;
+			1u,													// deUint32						attachmentCount;
+			attachmentBindInfos,								// const VkImageView*			pAttachments;
+			(deUint32)m_renderSize.x(),							// deUint32						width;
+			(deUint32)m_renderSize.y(),							// deUint32						height;
+			1u													// deUint32						layers;
+		};
+
+		framebuffer = createFramebuffer(vkd, device, &framebufferParams);
+	}
+
+	// Create descriptors
+	{
+		const VkDescriptorSetLayoutBinding layoutBindings[1] =
+		{
+			{
+				0u,											// deUint32				binding;
+				VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,	// VkDescriptorType		descriptorType;
+				1u,											// deUint32				arraySize;
+				VK_SHADER_STAGE_ALL,						// VkShaderStageFlags	stageFlags;
+				DE_NULL										// const VkSampler*		pImmutableSamplers;
+			},
+		};
+
+		const VkDescriptorSetLayoutCreateInfo descriptorLayoutParams =
+		{
+			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,	// VkStructureType						sType;
+			DE_NULL,												// cost void*							pNex┼ž;
+			(VkDescriptorSetLayoutCreateFlags)0,
+			DE_LENGTH_OF_ARRAY(layoutBindings),						// deUint32								count;
+			layoutBindings											// const VkDescriptorSetLayoutBinding	pBinding;
+		};
+
+		descriptorSetLayout = createDescriptorSetLayout(vkd, device, &descriptorLayoutParams);
+	}
+
+	// Create pipeline layout
+	{
+		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
+			DE_NULL,											// const void*					pNext;
+			(VkPipelineLayoutCreateFlags)0,
+			1u,													// deUint32						descriptorSetCount;
+			&*descriptorSetLayout,								// const VkDescriptorSetLayout*	pSetLayouts;
+			0u,													// deUint32						pushConstantRangeCount;
+			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
+		};
+
+		pipelineLayout = createPipelineLayout(vkd, device, &pipelineLayoutParams);
+	}
+
+	// Create shaders
+	{
+		vertexShaderModule	= createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0);
+		fragmentShaderModule	= createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0);
+	}
+
+	// Create pipeline
+	{
+		const VkPipelineShaderStageCreateInfo shaderStageParams[2] =
+		{
+			{
+				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType				sType;
+				DE_NULL,													// const void*					pNext;
+				(VkPipelineShaderStageCreateFlags)0,
+				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStage				stage;
+				*vertexShaderModule,										// VkShader						shader;
+				"main",
+				DE_NULL														// const VkSpecializationInfo*	pSpecializationInfo;
+			},
+			{
+				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType				sType;
+				DE_NULL,													// const void*					pNext;
+				(VkPipelineShaderStageCreateFlags)0,
+				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStage				stage;
+				*fragmentShaderModule,									// VkShader						shader;
+				"main",
+				DE_NULL														// const VkSpecializationInfo*	pSpecializationInfo;
+			}
+		};
+
+		const VkVertexInputBindingDescription vertexInputBindingDescription =
+		{
+			0u,								// deUint32					binding;
+			sizeof(tcu::Vec4),				// deUint32					strideInBytes;
+			VK_VERTEX_INPUT_RATE_VERTEX		// VkVertexInputStepRate	stepRate;
+		};
+
+		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[1] =
+		{
+			{
+				0u,									// deUint32	location;
+				0u,									// deUint32	binding;
+				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
+				0u									// deUint32	offsetInBytes;
+			}
+		};
+
+		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
+			DE_NULL,														// const void*								pNext;
+			(VkPipelineVertexInputStateCreateFlags)0,
+			1u,																// deUint32									bindingCount;
+			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
+			1u,																// deUint32									attributeCount;
+			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
+		};
+
+		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType		sType;
+			DE_NULL,														// const void*			pNext;
+			(VkPipelineInputAssemblyStateCreateFlags)0,
+			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology	topology;
+			false															// VkBool32				primitiveRestartEnable;
+		};
+
+		const VkViewport viewport =
+		{
+			0.0f,						// float	originX;
+			0.0f,						// float	originY;
+			(float)m_renderSize.x(),	// float	width;
+			(float)m_renderSize.y(),	// float	height;
+			0.0f,						// float	minDepth;
+			1.0f						// float	maxDepth;
+		};
+
+		const VkRect2D scissor =
+		{
+			{ 0, 0 },													// VkOffset2D  offset;
+			{ (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() }	// VkExtent2D  extent;
+		};
+
+		const VkPipelineViewportStateCreateInfo viewportStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType		sType;
+			DE_NULL,														// const void*			pNext;
+			(VkPipelineViewportStateCreateFlags)0,
+			1u,																// deUint32				viewportCount;
+			&viewport,														// const VkViewport*	pViewports;
+			1u,																// deUint32				scissorCount;
+			&scissor														// const VkRect2D*		pScissors;
+		};
+
+		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType	sType;
+			DE_NULL,														// const void*		pNext;
+			(VkPipelineRasterizationStateCreateFlags)0,
+			false,															// VkBool32			depthClipEnable;
+			false,															// VkBool32			rasterizerDiscardEnable;
+			VK_POLYGON_MODE_FILL,											// VkFillMode		fillMode;
+			VK_CULL_MODE_NONE,												// VkCullMode		cullMode;
+			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace		frontFace;
+			VK_FALSE,														// VkBool32			depthBiasEnable;
+			0.0f,															// float			depthBias;
+			0.0f,															// float			depthBiasClamp;
+			0.0f,															// float			slopeScaledDepthBias;
+			1.0f,															// float			lineWidth;
+		};
+
+		const VkPipelineMultisampleStateCreateInfo		multisampleStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
+			DE_NULL,														// const void*								pNext;
+			0u,																// VkPipelineMultisampleStateCreateFlags	flags;
+			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits					rasterizationSamples;
+			VK_FALSE,														// VkBool32									sampleShadingEnable;
+			0.0f,															// float									minSampleShading;
+			DE_NULL,														// const VkSampleMask*						pSampleMask;
+			VK_FALSE,														// VkBool32									alphaToCoverageEnable;
+			VK_FALSE														// VkBool32									alphaToOneEnable;
+		};
+
+		const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+		{
+			false,														// VkBool32			blendEnable;
+			VK_BLEND_FACTOR_ONE,										// VkBlend			srcBlendColor;
+			VK_BLEND_FACTOR_ZERO,										// VkBlend			destBlendColor;
+			VK_BLEND_OP_ADD,											// VkBlendOp		blendOpColor;
+			VK_BLEND_FACTOR_ONE,										// VkBlend			srcBlendAlpha;
+			VK_BLEND_FACTOR_ZERO,										// VkBlend			destBlendAlpha;
+			VK_BLEND_OP_ADD,											// VkBlendOp		blendOpAlpha;
+			(VK_COLOR_COMPONENT_R_BIT |
+			 VK_COLOR_COMPONENT_G_BIT |
+			 VK_COLOR_COMPONENT_B_BIT |
+			 VK_COLOR_COMPONENT_A_BIT)									// VkChannelFlags	channelWriteMask;
+		};
+
+		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
+			DE_NULL,													// const void*									pNext;
+			(VkPipelineColorBlendStateCreateFlags)0,
+			false,														// VkBool32										logicOpEnable;
+			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
+			1u,															// deUint32										attachmentCount;
+			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
+			{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConst[4];
+		};
+
+		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
+		{
+			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
+			DE_NULL,											// const void*										pNext;
+			0u,													// VkPipelineCreateFlags							flags;
+			2u,													// deUint32											stageCount;
+			shaderStageParams,									// const VkPipelineShaderStageCreateInfo*			pStages;
+			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
+			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
+			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
+			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
+			&rasterStateParams,									// const VkPipelineRasterStateCreateInfo*			pRasterState;
+			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
+			DE_NULL,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
+			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
+			DE_NULL,											// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
+			*pipelineLayout,									// VkPipelineLayout									layout;
+			*renderPass,										// VkRenderPass										renderPass;
+			0u,													// deUint32											subpass;
+			0u,													// VkPipeline										basePipelineHandle;
+			0u													// deInt32											basePipelineIndex;
+		};
+
+		graphicsPipelines		= createGraphicsPipeline(vkd, device, DE_NULL, &graphicsPipelineParams);
+	}
+
+	// getMemoryCommitment
+	isMemoryAllocationOK = isDeviceMemoryCommitmentOk(memoryRequirements);
+
+	const deUint32			clearColor[4]	= { 1u, 1u, 1u, 1u };
+	const VkClearAttachment	clearAttachment	=
+	{
+		VK_IMAGE_ASPECT_COLOR_BIT,									// VkImageAspectFlags	aspectMask;
+		0u,															// deUint32				colorAttachment;
+		makeClearValueColorU32(clearColor[0],
+							   clearColor[1],
+							   clearColor[2],
+							   clearColor[3])						// VkClearValue			clearValue;
+	};
+
+	const VkOffset2D offset =
+	{
+		0,
+		0
+	};
+
+	const VkExtent2D extent =
+	{
+		256u,
+		256u
+	};
+
+	const VkRect2D rect =
+	{
+		offset,
+		extent
+	};
+
+	const VkClearRect clearRect =
+	{
+		rect,
+		1u, // baseArrayLayer
+		1u	// layerCount
+	};
+
+	const VkCommandBufferBeginInfo	commandBufferBeginInfo	=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,			// VkStructureType					sType;
+		DE_NULL,												// const void*						pNext;
+		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,			// VkCommandBufferUsageFlags		flags;
+		(const VkCommandBufferInheritanceInfo*)DE_NULL,
+	};
+
+	// beginCommandBuffer
+	VK_CHECK(vkd.beginCommandBuffer(*cmdBuffer, &commandBufferBeginInfo));
+
+	const VkExtent3D		extent3D =
+	{
+		256u,	// width
+		256u,	// height
+		1u		// depth
+	};
+
+	const VkClearValue clearValues[1] =
+	{
+		makeClearValueColorF32(0.0f, 0.0f, 1.0f, 1.0f),
+	};
+
+	const VkRenderPassBeginInfo renderPassBeginInfo =
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
+		DE_NULL,												// const void*			pNext;
+		*renderPass,											// VkRenderPass			renderPass;
+		*framebuffer,											// VkFramebuffer		framebuffer;
+		{
+			{ 0, 0 },
+			{ extent3D.width, extent3D.height }
+		},														// VkRect2D				renderArea;
+		1u,														// deUint32				clearValueCount;
+		clearValues												// const VkClearValue*	pClearValues;
+	};
+
+	const VkImageMemoryBarrier initialImageBarrier =
+	{
+		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,		// VkStructureType			sType;
+		DE_NULL,									// const void*				pNext;
+		0,											// VkMemoryOutputFlags		outputMask;
+		VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,		// VkMemoryInputFlags		inputMask;
+		VK_IMAGE_LAYOUT_UNDEFINED,					// VkImageLayout			oldLayout;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout			newLayout;
+		VK_QUEUE_FAMILY_IGNORED,					// deUint32					srcQueueFamilyIndex;
+		VK_QUEUE_FAMILY_IGNORED,					// deUint32					destQueueFamilyIndex;
+		image.get(),								// VkImage					image;
+		{											// VkImageSubresourceRange	subresourceRange;
+			VK_IMAGE_ASPECT_COLOR_BIT,				// VkImageAspectFlags	aspectMask;
+			0u,										// deUint32				baseMipLevel;
+			1u,										// deUint32				mipLevels;
+			0u,										// deUint32				baseArraySlice;
+			1u										// deUint32				arraySize;
+		}
+	};
+
+	vkd.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &initialImageBarrier);
+	vkd.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+	vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipelines);
+	// clearAttachments
+	vkd.cmdClearAttachments(*cmdBuffer, 1, &clearAttachment, 1u, &clearRect);
+	vkd.cmdEndRenderPass(*cmdBuffer);
+	vkd.endCommandBuffer(*cmdBuffer);
+
+	// queueSubmit
+	const VkQueue	queue	= m_context.getUniversalQueue();
+	submitCommandsAndWait(vkd, device, queue, *cmdBuffer);
+
+	// getMemoryCommitment
+	isMemoryAllocationOK = (isMemoryAllocationOK && isDeviceMemoryCommitmentOk(memoryRequirements)) ? true : false;
+
+	if (isMemoryAllocationOK)
+		return tcu::TestStatus::pass("Pass");
+
+	return tcu::TestStatus::fail("Fail");
+}
+
+class MemoryCommitmentAllocateOnlyTestInstance : public vkt::TestInstance
+{
+public:
+									MemoryCommitmentAllocateOnlyTestInstance	(Context& context);
+	tcu::TestStatus					iterate										(void);
+};
+
+class MemoryCommitmentAllocateOnlyTestCase : public vkt::TestCase
+{
+public:
+							MemoryCommitmentAllocateOnlyTestCase	(tcu::TestContext&				testCtx,
+																	const std::string&				name,
+																	const std::string&				description)
+							: vkt::TestCase							(testCtx, name, description)
+							{}
+	virtual					~MemoryCommitmentAllocateOnlyTestCase(void){}
+	virtual TestInstance*	createInstance	(Context&			context)			const
+							{
+								return new MemoryCommitmentAllocateOnlyTestInstance(context);
+							}
+};
+
+MemoryCommitmentAllocateOnlyTestInstance::MemoryCommitmentAllocateOnlyTestInstance(Context& context)
+	: vkt::TestInstance		(context)
+{
+}
+
+tcu::TestStatus MemoryCommitmentAllocateOnlyTestInstance::iterate(void)
+{
+	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
+	const VkDevice							device					= m_context.getDevice();
+	const InstanceInterface&				vki						= m_context.getInstanceInterface();
+	const DeviceInterface&					vkd						= m_context.getDeviceInterface();
+	const VkPhysicalDeviceMemoryProperties	pMemoryProperties		= getPhysicalDeviceMemoryProperties(vki,physicalDevice);
+	const VkMemoryPropertyFlags				propertyFlag			= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
+	const int								arrayLength				= 10;
+	VkDeviceSize							pCommittedMemoryInBytes = 0u;
+	VkDeviceSize							allocSize[arrayLength];
+
+	// generating random allocation sizes
+	for (int i = 0; i < arrayLength; ++i)
+	{
+		allocSize[i] = rand() % 1000 + 1;
+	}
+
+	for (deUint32 memoryTypeIndex = 0u; memoryTypeIndex < VK_MAX_MEMORY_TYPES; ++memoryTypeIndex) //for memoryTypes
+	{
+		if((pMemoryProperties.memoryTypes[memoryTypeIndex].propertyFlags & propertyFlag) == propertyFlag) //if supports Lazy allocation
+		{
+			for (int i = 0; i < arrayLength; ++i)
+			{
+				const VkMemoryAllocateInfo	memAllocInfo =
+				{
+					VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,	//	VkStructureType		sType
+					NULL,									//	const void*			pNext
+					allocSize[i],							//	VkDeviceSize		allocationSize
+					memoryTypeIndex							//	deUint32			memoryTypeIndex
+				};
+
+				Move<VkDeviceMemory> memory = allocateMemory(vkd, device, &memAllocInfo, (const VkAllocationCallbacks*)DE_NULL);
+
+				vkd.getDeviceMemoryCommitment(device, memory.get(), &pCommittedMemoryInBytes);
+				if(pCommittedMemoryInBytes != 0)
+				{
+					tcu::TestLog& log = m_context.getTestContext().getLog();
+					log << TestLog::Message << "Warning: Memory commitment not null before binding." << TestLog::EndMessage;
+				}
+				if(pCommittedMemoryInBytes > allocSize[i])
+					return tcu::TestStatus::fail("Fail");
+
+			}
+		}
+	}
+	return tcu::TestStatus::pass("Pass");
+}
+
+void MemoryCommitmentTestInstance::submitCommandsAndWait (const DeviceInterface& vkd, const VkDevice device, const VkQueue queue, const VkCommandBuffer& cmdBuffer)
+{
+	const VkFenceCreateInfo fenceParams =
+	{
+		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
+		DE_NULL,								// const void*			pNext;
+		0u										// VkFenceCreateFlags	flags;
+	};
+
+	Move<VkFence> fence = createFence(vkd, device, &fenceParams);
+
+	const VkSubmitInfo	submitInfo	=
+	{
+		VK_STRUCTURE_TYPE_SUBMIT_INFO,			// VkStructureType			sType;
+		DE_NULL,								// const void*				pNext;
+		0u,										// deUint32					waitSemaphoreCount;
+		DE_NULL,								// const VkSemaphore*		pWaitSemaphores;
+		(const VkPipelineStageFlags*)DE_NULL,
+		1u,										// deUint32					commandBufferCount;
+		&cmdBuffer,								// const VkCommandBuffer*	pCommandBuffers;
+		0u,										// deUint32					signalSemaphoreCount;
+		DE_NULL									// const VkSemaphore*		pSignalSemaphores;
+	};
+
+	VK_CHECK(vkd.queueSubmit(queue, 1, &submitInfo, *fence));
+	VK_CHECK(vkd.waitForFences(device, 1, &fence.get(), true, ~(0ull) /* infinity */));
+}
+
+deUint32 MemoryCommitmentTestInstance::getMemoryTypeIndex(VkMemoryPropertyFlags propertyFlag, VkPhysicalDeviceMemoryProperties pMemoryProperties)
+{
+	for (deUint32 memoryTypeIndex = 0u; memoryTypeIndex < VK_MAX_MEMORY_TYPES; ++memoryTypeIndex)
+	{
+		if((pMemoryProperties.memoryTypes[memoryTypeIndex].propertyFlags & propertyFlag) == propertyFlag)
+			return memoryTypeIndex;
+	}
+	return -1u;
+}
+
+void MemoryCommitmentTestCase::initPrograms (SourceCollections& programCollection) const
+{
+	programCollection.glslSources.add("vert") << glu::VertexSource(
+		"#version 310 es\n"
+		"layout (location = 0) in highp vec4 a_position;\n"
+		"void main()\n"
+		"{\n"
+		"	gl_Position = a_position;\n"
+		"}\n");
+
+	programCollection.glslSources.add("frag") << glu::FragmentSource(
+		"#version 310 es\n"
+		"#extension GL_EXT_texture_buffer : enable\n"
+		"layout (set=0, binding=0) uniform highp usamplerBuffer u_buffer;\n"
+		"layout (location = 0) out highp uint o_color;\n"
+		"void main()\n"
+		"{\n"
+		"	o_color = texelFetch(u_buffer, int(gl_FragCoord.x)).x;\n"
+		"}\n");
+}
+
+Move<VkCommandPool> MemoryCommitmentTestInstance::createCommandPool() const
+{
+	const VkDevice					device				= m_context.getDevice();
+	const DeviceInterface&			vkd					= m_context.getDeviceInterface();
+	const deUint32					queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
+	const VkCommandPoolCreateInfo	cmdPoolCreateInfo	=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,		// VkStructureType             sType;
+		DE_NULL,										// const void*                 pNext;
+		VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,			// VkCommandPoolCreateFlags    flags;
+		queueFamilyIndex								// deUint32                    queueFamilyIndex;
+	};
+
+	return vk::createCommandPool(vkd, device, &cmdPoolCreateInfo, DE_NULL);
+}
+
+Move<VkCommandBuffer> MemoryCommitmentTestInstance::allocatePrimaryCommandBuffer (VkCommandPool commandPool) const
+{
+	const VkDevice						device					= m_context.getDevice();
+	const DeviceInterface&				vkd						= m_context.getDeviceInterface();
+	const VkCommandBufferAllocateInfo	cmdBufferAllocateInfo	=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType             sType;
+		DE_NULL,										// const void*                 pNext;
+		commandPool,									// VkCommandPool               commandPool;
+		VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel        level;
+		1												// deUint32                    commandBufferCount;
+	};
+
+	return vk::allocateCommandBuffer(vkd, device, &cmdBufferAllocateInfo);
+}
+
+bool MemoryCommitmentTestInstance::isDeviceMemoryCommitmentOk(const VkMemoryRequirements memoryRequirements)
+{
+	const VkFormat							colorFormat			= VK_FORMAT_R32_UINT;
+	const VkPhysicalDevice					physicalDevice		= m_context.getPhysicalDevice();
+	const InstanceInterface&				vki					= m_context.getInstanceInterface();
+	const VkMemoryPropertyFlags				propertyFlag		= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
+	const VkPhysicalDeviceMemoryProperties	pMemoryProperties	= getPhysicalDeviceMemoryProperties(vki,physicalDevice);
+	const VkDeviceSize						pixelDataSize		= m_renderSize.x() * m_renderSize.y() * mapVkFormat(colorFormat).getPixelSize();
+
+	for (deUint32 memTypeNdx = 0u; memTypeNdx < VK_MAX_MEMORY_TYPES; ++memTypeNdx)
+	{
+		if((pMemoryProperties.memoryTypes[memTypeNdx].propertyFlags & propertyFlag) == propertyFlag) //if supports Lazy allocation
+		{
+			const VkMemoryAllocateInfo	memAllocInfo =
+			{
+				VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,		//	VkStructureType		sType
+				NULL,										//	const void*			pNext
+				pixelDataSize,								//	VkDeviceSize		allocationSize
+				memTypeNdx									//	deUint32			memoryTypeIndex
+			};
+			const VkDevice			device					= m_context.getDevice();
+			const DeviceInterface&	vkd						= m_context.getDeviceInterface();
+			Move<VkDeviceMemory>	memory					= allocateMemory(vkd, device, &memAllocInfo, (const VkAllocationCallbacks*)DE_NULL);
+			VkDeviceSize			pCommittedMemoryInBytes = 0u;
+			vkd.getDeviceMemoryCommitment(device, memory.get(), &pCommittedMemoryInBytes);
+			if(pCommittedMemoryInBytes <= memoryRequirements.size)
+				return true;
+		}
+	}
+	return false;
+}
+
+tcu::TestCaseGroup* createMemoryCommitmentTests (tcu::TestContext& testCtx)
+{
+	static const MemoryCommitmentCaseParams info =
+	{
+		2048u,	// deUint32	bufferSize
+		256u,	// deUint32	bufferViewSize
+		0u,		// deUint32	elementOffset
+	};
+
+	de::MovePtr<tcu::TestCaseGroup>	getMemoryCommitmentTests	(new tcu::TestCaseGroup(testCtx, "get_memory_commitment", "Memory Commitment Tests"));
+
+	{
+		getMemoryCommitmentTests->addChild(new MemoryCommitmentTestCase(testCtx, "memory_commitment", "memory_commitment_test", info));
+		getMemoryCommitmentTests->addChild(new MemoryCommitmentAllocateOnlyTestCase(testCtx, "memory_commitment_allocate_only", "memory_commitment_allocate_only_test"));
+	}
+
+	return getMemoryCommitmentTests.release();
+}
+
+} //api
+} //vkt
diff --git a/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.hpp b/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.hpp
new file mode 100644
index 0000000..5c2d69a
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/api/vktApiGetMemoryCommitment.hpp
@@ -0,0 +1,41 @@
+#ifndef _VKTAPIGETMEMORYCOMMITMENT_HPP
+#define _VKTAPIGETMEMORYCOMMITMENT_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * 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 Vulkan Memory Commitment Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+
+namespace api
+{
+
+tcu::TestCaseGroup*		createMemoryCommitmentTests	(tcu::TestContext& testCtx);
+
+} // api
+} // vkt
+
+#endif // _VKTAPIGETMEMORYCOMMITMENT_HPP
diff --git a/external/vulkancts/modules/vulkan/api/vktApiTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiTests.cpp
index d1df659..dd9e47e 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiTests.cpp
@@ -38,6 +38,7 @@
 #include "vktApiDescriptorPoolTests.hpp"
 #include "vktApiNullHandleTests.hpp"
 #include "vktApiGranularityTests.hpp"
+#include "vktApiGetMemoryCommitment.hpp"
 
 namespace vkt
 {
@@ -72,6 +73,7 @@
 	apiTests->addChild(createDescriptorPoolTests		(testCtx));
 	apiTests->addChild(createNullHandleTests			(testCtx));
 	apiTests->addChild(createGranularityQueryTests		(testCtx));
+	apiTests->addChild(createMemoryCommitmentTests		(testCtx));
 }
 
 } // anonymous
diff --git a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
index d3c7850..6b36ec2 100644
--- a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
@@ -29,8 +29,16 @@
 	vktPipelineMultisampleTestsUtil.hpp
 	vktPipelineMultisampleTests.cpp
 	vktPipelineMultisampleTests.hpp
+	vktPipelineMultisampleBase.cpp
+	vktPipelineMultisampleBase.hpp
+	vktPipelineMultisampleBaseResolve.cpp
+	vktPipelineMultisampleBaseResolve.hpp
+	vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
+	vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp
 	vktPipelineMultisampleInterpolationTests.cpp
 	vktPipelineMultisampleInterpolationTests.hpp
+	vktPipelineMultisampleShaderBuiltInTests.cpp
+	vktPipelineMultisampleShaderBuiltInTests.hpp
 	vktPipelineMultisampleImageTests.cpp
 	vktPipelineMultisampleImageTests.hpp
 	vktPipelineInputAssemblyTests.cpp
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.cpp
new file mode 100644
index 0000000..07c3729
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.cpp
@@ -0,0 +1,166 @@
+/*------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBase.cpp
+* \brief Multisample Tests Base Classes
+*//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleBase.hpp"
+#include "vkQueryUtil.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+using namespace vk;
+
+void MultisampleInstanceBase::validateImageSize	(const InstanceInterface&	instance,
+												 const VkPhysicalDevice		physicalDevice,
+												 const ImageType			imageType,
+												 const tcu::UVec3&			imageSize) const
+{
+	const VkPhysicalDeviceProperties deviceProperties = getPhysicalDeviceProperties(instance, physicalDevice);
+
+	bool isImageSizeValid = true;
+
+	switch (imageType)
+	{
+		case IMAGE_TYPE_1D:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension1D;
+			break;
+		case IMAGE_TYPE_1D_ARRAY:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension1D &&
+								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
+			break;
+		case IMAGE_TYPE_2D:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
+								imageSize.y() <= deviceProperties.limits.maxImageDimension2D;
+			break;
+		case IMAGE_TYPE_2D_ARRAY:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
+								imageSize.y() <= deviceProperties.limits.maxImageDimension2D &&
+								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
+			break;
+		case IMAGE_TYPE_CUBE:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
+								imageSize.y() <= deviceProperties.limits.maxImageDimensionCube;
+			break;
+		case IMAGE_TYPE_CUBE_ARRAY:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
+								imageSize.y() <= deviceProperties.limits.maxImageDimensionCube &&
+								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
+			break;
+		case IMAGE_TYPE_3D:
+			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension3D &&
+								imageSize.y() <= deviceProperties.limits.maxImageDimension3D &&
+								imageSize.z() <= deviceProperties.limits.maxImageDimension3D;
+			break;
+		default:
+			DE_FATAL("Unknown image type");
+	}
+
+	if (!isImageSizeValid)
+	{
+		std::ostringstream	notSupportedStream;
+
+		notSupportedStream << "Image type (" << getImageTypeName(imageType) << ") with size (" << imageSize.x() << ", " << imageSize.y() << ", " << imageSize.z() << ") not supported by device" << std::endl;
+
+		const std::string notSupportedString = notSupportedStream.str();
+
+		TCU_THROW(NotSupportedError, notSupportedString.c_str());
+	}
+}
+
+void MultisampleInstanceBase::validateImageFeatureFlags	(const InstanceInterface&	instance,
+														 const VkPhysicalDevice		physicalDevice,
+														 const VkFormat				format,
+														 const VkFormatFeatureFlags	featureFlags) const
+{
+	const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(instance, physicalDevice, format);
+
+	if ((formatProperties.optimalTilingFeatures & featureFlags) != featureFlags)
+	{
+		std::ostringstream	notSupportedStream;
+
+		notSupportedStream << "Device does not support image format " << format << " for feature flags " << featureFlags << std::endl;
+
+		const std::string notSupportedString = notSupportedStream.str();
+
+		TCU_THROW(NotSupportedError, notSupportedString.c_str());
+	}
+}
+
+void MultisampleInstanceBase::validateImageInfo	(const InstanceInterface&	instance,
+												 const VkPhysicalDevice		physicalDevice,
+												 const VkImageCreateInfo&	imageInfo) const
+{
+	VkImageFormatProperties imageFormatProps;
+	instance.getPhysicalDeviceImageFormatProperties(physicalDevice, imageInfo.format, imageInfo.imageType, imageInfo.tiling, imageInfo.usage, imageInfo.flags, &imageFormatProps);
+
+	if (imageFormatProps.maxExtent.width  < imageInfo.extent.width  ||
+		imageFormatProps.maxExtent.height < imageInfo.extent.height ||
+		imageFormatProps.maxExtent.depth  < imageInfo.extent.depth)
+	{
+		std::ostringstream	notSupportedStream;
+
+		notSupportedStream	<< "Image extent ("
+							<< imageInfo.extent.width  << ", "
+							<< imageInfo.extent.height << ", "
+							<< imageInfo.extent.depth
+							<< ") exceeds allowed maximum ("
+							<< imageFormatProps.maxExtent.width <<  ", "
+							<< imageFormatProps.maxExtent.height << ", "
+							<< imageFormatProps.maxExtent.depth
+							<< ")"
+							<< std::endl;
+
+		const std::string notSupportedString = notSupportedStream.str();
+
+		TCU_THROW(NotSupportedError, notSupportedString.c_str());
+	}
+
+	if (imageFormatProps.maxArrayLayers < imageInfo.arrayLayers)
+	{
+		std::ostringstream	notSupportedStream;
+
+		notSupportedStream << "Image layers count of " << imageInfo.arrayLayers << " exceeds allowed maximum which is " << imageFormatProps.maxArrayLayers << std::endl;
+
+		const std::string notSupportedString = notSupportedStream.str();
+
+		TCU_THROW(NotSupportedError, notSupportedString.c_str());
+	}
+
+	if (!(imageFormatProps.sampleCounts & imageInfo.samples))
+	{
+		std::ostringstream	notSupportedStream;
+
+		notSupportedStream << "Samples count of " << imageInfo.samples << " not supported for image" << std::endl;
+
+		const std::string notSupportedString = notSupportedStream.str();
+
+		TCU_THROW(NotSupportedError, notSupportedString.c_str());
+	}
+}
+
+} // multisample
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp
new file mode 100644
index 0000000..ed20661
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp
@@ -0,0 +1,146 @@
+#ifndef _VKTPIPELINEMULTISAMPLEBASE_HPP
+#define _VKTPIPELINEMULTISAMPLEBASE_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBase.hpp
+ * \brief Multisample Tests Base Classes
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleTestsUtil.hpp"
+#include "vktTestCase.hpp"
+#include "tcuVector.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+struct ImageMSParams
+{
+	ImageMSParams(const vk::VkSampleCountFlagBits samples, const tcu::UVec3& size) : numSamples(samples), imageSize(size) {}
+
+	vk::VkSampleCountFlagBits	numSamples;
+	tcu::UVec3					imageSize;
+};
+
+class MultisampleCaseBase : public TestCase
+{
+public:
+	MultisampleCaseBase	(tcu::TestContext&		testCtx,
+						 const std::string&		name,
+						 const ImageMSParams&	imageMSParams)
+		: TestCase(testCtx, name, "")
+		, m_imageMSParams(imageMSParams)
+	{}
+
+protected:
+	const ImageMSParams m_imageMSParams;
+};
+
+typedef MultisampleCaseBase* (*MultisampleCaseFuncPtr)(tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams);
+
+class MultisampleInstanceBase : public TestInstance
+{
+public:
+								MultisampleInstanceBase		(Context&							context,
+															 const ImageMSParams&				imageMSParams)
+		: TestInstance		(context)
+		, m_imageMSParams	(imageMSParams)
+		, m_imageType		(IMAGE_TYPE_2D)
+		, m_imageFormat		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8))
+	{}
+
+	typedef std::vector<vk::VkVertexInputAttributeDescription> VertexAttribDescVec;
+
+	struct VertexDataDesc
+	{
+		vk::VkPrimitiveTopology	primitiveTopology;
+		deUint32				verticesCount;
+		deUint32				dataStride;
+		vk::VkDeviceSize		dataSize;
+		VertexAttribDescVec		vertexAttribDescVec;
+	};
+
+protected:
+
+	void					validateImageSize			(const vk::InstanceInterface&	instance,
+														 const vk::VkPhysicalDevice		physicalDevice,
+														 const ImageType				imageType,
+														 const tcu::UVec3&				imageSize) const;
+
+	void					validateImageFeatureFlags	(const vk::InstanceInterface&	instance,
+														 const vk::VkPhysicalDevice		physicalDevice,
+														 const vk::VkFormat				format,
+														 const vk::VkFormatFeatureFlags	featureFlags) const;
+
+	void					validateImageInfo			(const vk::InstanceInterface&	instance,
+														 const vk::VkPhysicalDevice		physicalDevice,
+														 const vk::VkImageCreateInfo&	imageInfo) const;
+
+	virtual VertexDataDesc	getVertexDataDescripton		(void) const = 0;
+
+	virtual void			uploadVertexData			(const vk::Allocation&			vertexBufferAllocation,
+														 const VertexDataDesc&			vertexDataDescripton) const = 0;
+protected:
+	const ImageMSParams			m_imageMSParams;
+	const ImageType				m_imageType;
+	const tcu::TextureFormat	m_imageFormat;
+};
+
+} // multisample
+
+template <class CaseClass>
+tcu::TestCaseGroup* makeMSGroup	(tcu::TestContext&							testCtx,
+								 const std::string							groupName,
+								 const tcu::UVec3							imageSizes[],
+								 const deUint32								imageSizesElemCount,
+								 const vk::VkSampleCountFlagBits			imageSamples[],
+								 const deUint32								imageSamplesElemCount)
+{
+	de::MovePtr<tcu::TestCaseGroup> caseGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), ""));
+
+	for (deUint32 imageSizeNdx = 0u; imageSizeNdx < imageSizesElemCount; ++imageSizeNdx)
+	{
+		const tcu::UVec3	imageSize = imageSizes[imageSizeNdx];
+		std::ostringstream	imageSizeStream;
+
+		imageSizeStream << imageSize.x() << "_" << imageSize.y() << "_" << imageSize.z();
+
+		de::MovePtr<tcu::TestCaseGroup> sizeGroup(new tcu::TestCaseGroup(testCtx, imageSizeStream.str().c_str(), ""));
+
+		for (deUint32 imageSamplesNdx = 0u; imageSamplesNdx < imageSamplesElemCount; ++imageSamplesNdx)
+		{
+			const vk::VkSampleCountFlagBits		samples = imageSamples[imageSamplesNdx];
+			const multisample::ImageMSParams	imageMSParams = multisample::ImageMSParams(samples, imageSize);
+
+			sizeGroup->addChild(CaseClass::createCase(testCtx, "samples_" + de::toString(samples), imageMSParams));
+		}
+
+		caseGroup->addChild(sizeGroup.release());
+	}
+	return caseGroup.release();
+}
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLEBASE_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp
new file mode 100644
index 0000000..4ad1644
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp
@@ -0,0 +1,550 @@
+/*------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBaseResolve.cpp
+* \brief Base class for tests that check results of multisample resolve
+*//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleBaseResolve.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+using namespace vk;
+
+tcu::TestStatus MSInstanceBaseResolve::iterate (void)
+{
+	const InstanceInterface&	instance			= m_context.getInstanceInterface();
+	const DeviceInterface&		deviceInterface		= m_context.getDeviceInterface();
+	const VkDevice				device				= m_context.getDevice();
+	const VkPhysicalDevice		physicalDevice		= m_context.getPhysicalDevice();
+	Allocator&					allocator			= m_context.getDefaultAllocator();
+	const VkQueue				queue				= m_context.getUniversalQueue();
+	const deUint32				queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
+
+	VkImageCreateInfo			imageMSInfo;
+	VkImageCreateInfo			imageRSInfo;
+
+	// Check if image size does not exceed device limits
+	validateImageSize(instance, physicalDevice, m_imageType, m_imageMSParams.imageSize);
+
+	// Check if device supports image format as color attachment
+	validateImageFeatureFlags(instance, physicalDevice, mapTextureFormat(m_imageFormat), VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+
+	imageMSInfo.sType					= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+	imageMSInfo.pNext					= DE_NULL;
+	imageMSInfo.flags					= 0u;
+	imageMSInfo.imageType				= mapImageType(m_imageType);
+	imageMSInfo.format					= mapTextureFormat(m_imageFormat);
+	imageMSInfo.extent					= makeExtent3D(getLayerSize(m_imageType, m_imageMSParams.imageSize));
+	imageMSInfo.arrayLayers				= getNumLayers(m_imageType, m_imageMSParams.imageSize);
+	imageMSInfo.mipLevels				= 1u;
+	imageMSInfo.samples					= m_imageMSParams.numSamples;
+	imageMSInfo.tiling					= VK_IMAGE_TILING_OPTIMAL;
+	imageMSInfo.initialLayout			= VK_IMAGE_LAYOUT_UNDEFINED;
+	imageMSInfo.usage					= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+	imageMSInfo.sharingMode				= VK_SHARING_MODE_EXCLUSIVE;
+	imageMSInfo.queueFamilyIndexCount	= 0u;
+	imageMSInfo.pQueueFamilyIndices		= DE_NULL;
+
+	if (m_imageType == IMAGE_TYPE_CUBE || m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+	{
+		imageMSInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
+	}
+
+	validateImageInfo(instance, physicalDevice, imageMSInfo);
+
+	const de::UniquePtr<Image> imageMS(new Image(deviceInterface, device, allocator, imageMSInfo, MemoryRequirement::Any));
+
+	imageRSInfo			= imageMSInfo;
+	imageRSInfo.samples	= VK_SAMPLE_COUNT_1_BIT;
+
+	validateImageInfo(instance, physicalDevice, imageRSInfo);
+
+	const de::UniquePtr<Image> imageRS(new Image(deviceInterface, device, allocator, imageRSInfo, MemoryRequirement::Any));
+
+	// Create render pass
+	const VkAttachmentDescription attachmentMSDesc =
+	{
+		(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
+		imageMSInfo.format,							// VkFormat							format;
+		imageMSInfo.samples,						// VkSampleCountFlagBits			samples;
+		VK_ATTACHMENT_LOAD_OP_CLEAR,				// VkAttachmentLoadOp				loadOp;
+		VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
+		VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
+		VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout					finalLayout;
+	};
+
+	const VkAttachmentDescription attachmentRSDesc =
+	{
+		(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
+		imageRSInfo.format,							// VkFormat							format;
+		imageRSInfo.samples,						// VkSampleCountFlagBits			samples;
+		VK_ATTACHMENT_LOAD_OP_CLEAR,			// VkAttachmentLoadOp				loadOp;
+		VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
+		VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
+		VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout					finalLayout;
+	};
+
+	const VkAttachmentDescription attachments[] = { attachmentMSDesc, attachmentRSDesc };
+
+	const VkAttachmentReference attachmentMSRef =
+	{
+		0u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference attachmentRSRef =
+	{
+		1u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference* resolveAttachment = m_imageMSParams.numSamples == VK_SAMPLE_COUNT_1_BIT ? DE_NULL : &attachmentRSRef;
+
+	const VkSubpassDescription subpassDescription =
+	{
+		(VkSubpassDescriptionFlags)0u,						// VkSubpassDescriptionFlags		flags;
+		VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint				pipelineBindPoint;
+		0u,													// deUint32							inputAttachmentCount;
+		DE_NULL,											// const VkAttachmentReference*		pInputAttachments;
+		1u,													// deUint32							colorAttachmentCount;
+		&attachmentMSRef,									// const VkAttachmentReference*		pColorAttachments;
+		resolveAttachment,								// const VkAttachmentReference*		pResolveAttachments;
+		DE_NULL,											// const VkAttachmentReference*		pDepthStencilAttachment;
+		0u,													// deUint32							preserveAttachmentCount;
+		DE_NULL												// const deUint32*					pPreserveAttachments;
+	};
+
+	const VkRenderPassCreateInfo renderPassInfo =
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
+		DE_NULL,											// const void*						pNext;
+		(VkRenderPassCreateFlags)0u,						// VkRenderPassCreateFlags			flags;
+		2u,													// deUint32							attachmentCount;
+		attachments,										// const VkAttachmentDescription*	pAttachments;
+		1u,													// deUint32							subpassCount;
+		&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
+		0u,													// deUint32							dependencyCount;
+		DE_NULL												// const VkSubpassDependency*		pDependencies;
+	};
+
+	const Unique<VkRenderPass> renderPass(createRenderPass(deviceInterface, device, &renderPassInfo));
+
+	const VkImageSubresourceRange fullImageRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, imageMSInfo.mipLevels, 0u, imageMSInfo.arrayLayers);
+
+	// Create color attachments image views
+	const Unique<VkImageView> imageMSView(makeImageView(deviceInterface, device, **imageMS, mapImageViewType(m_imageType), imageMSInfo.format, fullImageRange));
+	const Unique<VkImageView> imageRSView(makeImageView(deviceInterface, device, **imageRS, mapImageViewType(m_imageType), imageMSInfo.format, fullImageRange));
+
+	const VkImageView attachmentsViews[] = { *imageMSView, *imageRSView };
+
+	// Create framebuffer
+	const VkFramebufferCreateInfo framebufferInfo =
+	{
+		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// VkStructureType                             sType;
+		DE_NULL,									// const void*                                 pNext;
+		(VkFramebufferCreateFlags)0u,				// VkFramebufferCreateFlags                    flags;
+		*renderPass,								// VkRenderPass                                renderPass;
+		2u,											// uint32_t                                    attachmentCount;
+		attachmentsViews,							// const VkImageView*                          pAttachments;
+		imageMSInfo.extent.width,					// uint32_t                                    width;
+		imageMSInfo.extent.height,					// uint32_t                                    height;
+		imageMSInfo.arrayLayers,					// uint32_t                                    layers;
+	};
+
+	const Unique<VkFramebuffer> framebuffer(createFramebuffer(deviceInterface, device, &framebufferInfo));
+
+	// Create pipeline layout
+	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
+		DE_NULL,											// const void*						pNext;
+		(VkPipelineLayoutCreateFlags)0u,					// VkPipelineLayoutCreateFlags		flags;
+		0u,													// deUint32							setLayoutCount;
+		DE_NULL,											// const VkDescriptorSetLayout*		pSetLayouts;
+		0u,													// deUint32							pushConstantRangeCount;
+		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
+	};
+
+	const Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(deviceInterface, device, &pipelineLayoutParams));
+
+	// Create vertex attributes data
+	const VertexDataDesc vertexDataDesc = getVertexDataDescripton();
+
+	de::SharedPtr<Buffer> vertexBuffer = de::SharedPtr<Buffer>(new Buffer(deviceInterface, device, allocator, makeBufferCreateInfo(vertexDataDesc.dataSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
+	const Allocation& vertexBufferAllocation = vertexBuffer->getAllocation();
+
+	uploadVertexData(vertexBufferAllocation, vertexDataDesc);
+
+	flushMappedMemoryRange(deviceInterface, device, vertexBufferAllocation.getMemory(), vertexBufferAllocation.getOffset(), VK_WHOLE_SIZE);
+
+	const VkVertexInputBindingDescription vertexBinding =
+	{
+		0u,							// deUint32				binding;
+		vertexDataDesc.dataStride,	// deUint32				stride;
+		VK_VERTEX_INPUT_RATE_VERTEX	// VkVertexInputRate	inputRate;
+	};
+
+	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,			// VkStructureType                             sType;
+		DE_NULL,															// const void*                                 pNext;
+		(VkPipelineVertexInputStateCreateFlags)0u,							// VkPipelineVertexInputStateCreateFlags       flags;
+		1u,																	// uint32_t                                    vertexBindingDescriptionCount;
+		&vertexBinding,														// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
+		static_cast<deUint32>(vertexDataDesc.vertexAttribDescVec.size()),	// uint32_t                                    vertexAttributeDescriptionCount;
+		dataPointer(vertexDataDesc.vertexAttribDescVec),					// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
+	};
+
+	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                             sType;
+		DE_NULL,														// const void*                                 pNext;
+		(VkPipelineInputAssemblyStateCreateFlags)0u,					// VkPipelineInputAssemblyStateCreateFlags     flags;
+		vertexDataDesc.primitiveTopology,								// VkPrimitiveTopology                         topology;
+		VK_FALSE,														// VkBool32                                    primitiveRestartEnable;
+	};
+
+	const VkViewport viewport =
+	{
+		0.0f, 0.0f,
+		static_cast<float>(imageMSInfo.extent.width), static_cast<float>(imageMSInfo.extent.height),
+		0.0f, 1.0f
+	};
+
+	const VkRect2D scissor =
+	{
+		makeOffset2D(0, 0),
+		makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
+	};
+
+	const VkPipelineViewportStateCreateInfo viewportStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType                             sType;
+		DE_NULL,														// const void*                                 pNext;
+		(VkPipelineViewportStateCreateFlags)0u,							// VkPipelineViewportStateCreateFlags          flags;
+		1u,																// uint32_t                                    viewportCount;
+		&viewport,														// const VkViewport*                           pViewports;
+		1u,																// uint32_t                                    scissorCount;
+		&scissor,														// const VkRect2D*                             pScissors;
+	};
+
+	const VkPipelineRasterizationStateCreateInfo rasterizationStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType                          sType;
+		DE_NULL,														// const void*                              pNext;
+		(VkPipelineRasterizationStateCreateFlags)0u,					// VkPipelineRasterizationStateCreateFlags  flags;
+		VK_FALSE,														// VkBool32                                 depthClampEnable;
+		VK_FALSE,														// VkBool32                                 rasterizerDiscardEnable;
+		VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
+		VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
+		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
+		VK_FALSE,														// VkBool32									depthBiasEnable;
+		0.0f,															// float									depthBiasConstantFactor;
+		0.0f,															// float									depthBiasClamp;
+		0.0f,															// float									depthBiasSlopeFactor;
+		1.0f,															// float									lineWidth;
+	};
+
+	const VkPipelineMultisampleStateCreateInfo multisampleStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
+		DE_NULL,														// const void*								pNext;
+		(VkPipelineMultisampleStateCreateFlags)0u,						// VkPipelineMultisampleStateCreateFlags	flags;
+		imageMSInfo.samples,											// VkSampleCountFlagBits					rasterizationSamples;
+		VK_TRUE,														// VkBool32									sampleShadingEnable;
+		1.0f,															// float									minSampleShading;
+		DE_NULL,														// const VkSampleMask*						pSampleMask;
+		VK_FALSE,														// VkBool32									alphaToCoverageEnable;
+		VK_FALSE,														// VkBool32									alphaToOneEnable;
+	};
+
+	const VkStencilOpState stencilOpState = makeStencilOpState
+	(
+		VK_STENCIL_OP_KEEP,		// stencil fail
+		VK_STENCIL_OP_KEEP,		// depth & stencil pass
+		VK_STENCIL_OP_KEEP,		// depth only fail
+		VK_COMPARE_OP_ALWAYS,	// compare op
+		0u,						// compare mask
+		0u,						// write mask
+		0u						// reference
+	);
+
+	const VkPipelineDepthStencilStateCreateInfo depthStencilStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,		// VkStructureType							sType;
+		DE_NULL,														// const void*								pNext;
+		(VkPipelineDepthStencilStateCreateFlags)0u,						// VkPipelineDepthStencilStateCreateFlags	flags;
+		VK_FALSE,														// VkBool32									depthTestEnable;
+		VK_FALSE,														// VkBool32									depthWriteEnable;
+		VK_COMPARE_OP_LESS,												// VkCompareOp								depthCompareOp;
+		VK_FALSE,														// VkBool32									depthBoundsTestEnable;
+		VK_FALSE,														// VkBool32									stencilTestEnable;
+		stencilOpState,													// VkStencilOpState							front;
+		stencilOpState,													// VkStencilOpState							back;
+		0.0f,															// float									minDepthBounds;
+		1.0f,															// float									maxDepthBounds;
+	};
+
+	const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+
+	const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+	{
+		VK_FALSE,														// VkBool32					blendEnable;
+		VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcColorBlendFactor;
+		VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstColorBlendFactor;
+		VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
+		VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcAlphaBlendFactor;
+		VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstAlphaBlendFactor;
+		VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
+		colorComponentsAll,												// VkColorComponentFlags	colorWriteMask;
+	};
+
+	const VkPipelineColorBlendStateCreateInfo colorBlendStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,		// VkStructureType								sType;
+		DE_NULL,														// const void*									pNext;
+		(VkPipelineColorBlendStateCreateFlags)0u,						// VkPipelineColorBlendStateCreateFlags			flags;
+		VK_FALSE,														// VkBool32										logicOpEnable;
+		VK_LOGIC_OP_COPY,												// VkLogicOp									logicOp;
+		1u,																// deUint32										attachmentCount;
+		&colorBlendAttachmentState,										// const VkPipelineColorBlendAttachmentState*	pAttachments;
+		{ 0.0f, 0.0f, 0.0f, 0.0f },										// float										blendConstants[4];
+	};
+
+	const Unique<VkShaderModule> vsModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("vertex_shader"), (VkShaderModuleCreateFlags)0));
+
+	const VkPipelineShaderStageCreateInfo vsShaderStageInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+		DE_NULL,														// const void*							pNext;
+		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+		VK_SHADER_STAGE_VERTEX_BIT,										// VkShaderStageFlagBits				stage;
+		*vsModule,														// VkShaderModule						module;
+		"main",															// const char*							pName;
+		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+	};
+
+	const Unique<VkShaderModule> fsModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("fragment_shader"), (VkShaderModuleCreateFlags)0));
+
+	const VkPipelineShaderStageCreateInfo fsShaderStageInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+		DE_NULL,														// const void*							pNext;
+		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+		VK_SHADER_STAGE_FRAGMENT_BIT,									// VkShaderStageFlagBits				stage;
+		*fsModule,														// VkShaderModule						module;
+		"main",															// const char*							pName;
+		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+	};
+
+	const VkPipelineShaderStageCreateInfo shaderStageInfos[] = { vsShaderStageInfo, fsShaderStageInfo };
+
+	const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
+	{
+		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,				// VkStructureType									sType;
+		DE_NULL,														// const void*										pNext;
+		(VkPipelineCreateFlags)0,										// VkPipelineCreateFlags							flags;
+		2u,																// deUint32											stageCount;
+		shaderStageInfos,												// const VkPipelineShaderStageCreateInfo*			pStages;
+		&vertexInputStateInfo,											// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
+		&inputAssemblyStateInfo,										// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
+		DE_NULL,														// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
+		&viewportStateInfo,												// const VkPipelineViewportStateCreateInfo*			pViewportState;
+		&rasterizationStateInfo,										// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
+		&multisampleStateInfo,											// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
+		&depthStencilStateInfo,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
+		&colorBlendStateInfo,											// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
+		DE_NULL,														// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
+		*pipelineLayout,												// VkPipelineLayout									layout;
+		*renderPass,													// VkRenderPass										renderPass;
+		0u,																// deUint32											subpass;
+		DE_NULL,														// VkPipeline										basePipelineHandle;
+		0u,																// deInt32											basePipelineIndex;
+	};
+
+	// Create graphics pipeline
+	const Unique<VkPipeline> graphicsPipeline(createGraphicsPipeline(deviceInterface, device, DE_NULL, &graphicsPipelineInfo));
+
+	// Create command buffer for compute and transfer oparations
+	const Unique<VkCommandPool>	  commandPool(makeCommandPool(deviceInterface, device, queueFamilyIndex));
+	const Unique<VkCommandBuffer> commandBuffer(makeCommandBuffer(deviceInterface, device, *commandPool));
+
+	// Start recording commands
+	beginCommandBuffer(deviceInterface, *commandBuffer);
+
+	{
+		VkImageMemoryBarrier imageOutputAttachmentBarriers[2];
+
+		imageOutputAttachmentBarriers[0] = makeImageMemoryBarrier
+		(
+			0u,
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_IMAGE_LAYOUT_UNDEFINED,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			**imageMS,
+			fullImageRange
+		);
+
+		imageOutputAttachmentBarriers[1] = makeImageMemoryBarrier
+		(
+			0u,
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_IMAGE_LAYOUT_UNDEFINED,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			**imageRS,
+			fullImageRange
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 2u, imageOutputAttachmentBarriers);
+	}
+
+	{
+		const VkDeviceSize vertexStartOffset = 0u;
+
+		std::vector<VkClearValue> clearValues;
+		clearValues.push_back(makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)));
+		clearValues.push_back(makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)));
+
+		const vk::VkRect2D renderArea =
+		{
+			makeOffset2D(0u, 0u),
+			makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
+		};
+
+		// Begin render pass
+		const VkRenderPassBeginInfo renderPassBeginInfo =
+		{
+			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,		// VkStructureType         sType;
+			DE_NULL,										// const void*             pNext;
+			*renderPass,										// VkRenderPass            renderPass;
+			*framebuffer,									// VkFramebuffer           framebuffer;
+			renderArea,										// VkRect2D                renderArea;
+			static_cast<deUint32>(clearValues.size()),		// deUint32                clearValueCount;
+			&clearValues[0],								// const VkClearValue*     pClearValues;
+		};
+
+		deviceInterface.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+		// Bind graphics pipeline
+		deviceInterface.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
+
+		// Bind vertex buffer
+		deviceInterface.cmdBindVertexBuffers(*commandBuffer, 0u, 1u, &vertexBuffer->get(), &vertexStartOffset);
+
+		// Draw full screen quad
+		deviceInterface.cmdDraw(*commandBuffer, vertexDataDesc.verticesCount, 1u, 0u, 0u);
+
+		// End render pass
+		deviceInterface.cmdEndRenderPass(*commandBuffer);
+	}
+
+	const VkImage sourceImage = m_imageMSParams.numSamples == VK_SAMPLE_COUNT_1_BIT ? **imageMS : **imageRS;
+
+	{
+		const VkImageMemoryBarrier imageTransferSrcBarrier = makeImageMemoryBarrier
+		(
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_ACCESS_TRANSFER_READ_BIT,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+			sourceImage,
+			fullImageRange
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &imageTransferSrcBarrier);
+	}
+
+	// Copy data from resolve image to buffer
+	const deUint32				imageRSSizeInBytes = getImageSizeInBytes(imageRSInfo.extent, imageRSInfo.arrayLayers, m_imageFormat, imageRSInfo.mipLevels);
+
+	const VkBufferCreateInfo	bufferRSInfo = makeBufferCreateInfo(imageRSSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+	const de::UniquePtr<Buffer>	bufferRS(new Buffer(deviceInterface, device, allocator, bufferRSInfo, MemoryRequirement::HostVisible));
+
+	{
+		const VkBufferImageCopy bufferImageCopy =
+		{
+			0u,																						//	VkDeviceSize				bufferOffset;
+			0u,																						//	deUint32					bufferRowLength;
+			0u,																						//	deUint32					bufferImageHeight;
+			makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, imageRSInfo.arrayLayers),	//	VkImageSubresourceLayers	imageSubresource;
+			makeOffset3D(0, 0, 0),																	//	VkOffset3D					imageOffset;
+			imageRSInfo.extent,																		//	VkExtent3D					imageExtent;
+		};
+
+		deviceInterface.cmdCopyImageToBuffer(*commandBuffer, sourceImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bufferRS->get(), 1u, &bufferImageCopy);
+	}
+
+	{
+		const VkBufferMemoryBarrier bufferRSHostReadBarrier = makeBufferMemoryBarrier
+		(
+			VK_ACCESS_TRANSFER_WRITE_BIT,
+			VK_ACCESS_HOST_READ_BIT,
+			bufferRS->get(),
+			0u,
+			imageRSSizeInBytes
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferRSHostReadBarrier, 0u, DE_NULL);
+	}
+
+	// End recording commands
+	VK_CHECK(deviceInterface.endCommandBuffer(*commandBuffer));
+
+	// Submit commands for execution and wait for completion
+	submitCommandsAndWait(deviceInterface, device, queue, *commandBuffer);
+
+	// Retrieve data from buffer to host memory
+	const Allocation& bufferRSAllocation = bufferRS->getAllocation();
+
+	invalidateMappedMemoryRange(deviceInterface, device, bufferRSAllocation.getMemory(), bufferRSAllocation.getOffset(), VK_WHOLE_SIZE);
+
+	const tcu::ConstPixelBufferAccess bufferRSData (m_imageFormat,
+													imageRSInfo.extent.width,
+													imageRSInfo.extent.height,
+													imageRSInfo.extent.depth * imageRSInfo.arrayLayers,
+													bufferRSAllocation.getHostPtr());
+
+	std::stringstream imageName;
+	imageName << getImageTypeName(m_imageType) << "_" << bufferRSData.getWidth() << "_" << bufferRSData.getHeight() << "_" << bufferRSData.getDepth() << std::endl;
+
+	m_context.getTestContext().getLog()
+		<< tcu::TestLog::Section(imageName.str(), imageName.str())
+		<< tcu::LogImage("image", "", bufferRSData)
+		<< tcu::TestLog::EndSection;
+
+	return verifyImageData(imageRSInfo, bufferRSData);
+}
+
+} // multisample
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.hpp
new file mode 100644
index 0000000..c123a15
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.hpp
@@ -0,0 +1,67 @@
+#ifndef _VKTPIPELINEMULTISAMPLEBASERESOLVE_HPP
+#define _VKTPIPELINEMULTISAMPLEBASERESOLVE_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBaseResolve.hpp
+ * \brief Base class for tests that check results of multisample resolve
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleBase.hpp"
+#include "vktTestCase.hpp"
+#include "tcuVector.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+class MSCaseBaseResolve : public MultisampleCaseBase
+{
+public:
+	MSCaseBaseResolve	(tcu::TestContext&		testCtx,
+						 const std::string&		name,
+						 const ImageMSParams&	imageMSParams)
+		: MultisampleCaseBase(testCtx, name, imageMSParams)
+	{}
+};
+
+class MSInstanceBaseResolve : public MultisampleInstanceBase
+{
+public:
+							MSInstanceBaseResolve	(Context&							context,
+													 const ImageMSParams&				imageMSParams)
+								: MultisampleInstanceBase(context, imageMSParams)
+							{}
+
+protected:
+
+	tcu::TestStatus			iterate					(void);
+
+	virtual tcu::TestStatus	verifyImageData			(const vk::VkImageCreateInfo&		imageRSInfo,
+													 const tcu::ConstPixelBufferAccess&	dataRS) const = 0;
+};
+
+} // multisample
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLEBASERESOLVE_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
new file mode 100644
index 0000000..6b670ca
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
@@ -0,0 +1,1026 @@
+/*------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
+* \brief Base class for tests that check results of multisample resolve
+*		  and/or values of individual samples
+*//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+using namespace vk;
+
+void MSCaseBaseResolveAndPerSampleFetch::initPrograms (vk::SourceCollections& programCollection) const
+{
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("per_sample_fetch_vs") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "layout(set = 0, binding = 0, input_attachment_index = 0) uniform subpassInputMS imageMS;\n"
+		<< "\n"
+		<< "layout(set = 0, binding = 1, std140) uniform SampleBlock {\n"
+		<< "    int sampleNdx;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	fs_out_color = subpassLoad(imageMS, sampleNdx);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("per_sample_fetch_fs") << glu::FragmentSource(fs.str());
+}
+
+VkPipelineMultisampleStateCreateInfo MSInstanceBaseResolveAndPerSampleFetch::getMSStateCreateInfo (const ImageMSParams& imageMSParams) const
+{
+	const VkPipelineMultisampleStateCreateInfo multisampleStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
+		DE_NULL,														// const void*								pNext;
+		(VkPipelineMultisampleStateCreateFlags)0u,						// VkPipelineMultisampleStateCreateFlags	flags;
+		imageMSParams.numSamples,										// VkSampleCountFlagBits					rasterizationSamples;
+		VK_TRUE,														// VkBool32									sampleShadingEnable;
+		1.0f,															// float									minSampleShading;
+		DE_NULL,														// const VkSampleMask*						pSampleMask;
+		VK_FALSE,														// VkBool32									alphaToCoverageEnable;
+		VK_FALSE,														// VkBool32									alphaToOneEnable;
+	};
+
+	return multisampleStateInfo;
+}
+
+const VkDescriptorSetLayout* MSInstanceBaseResolveAndPerSampleFetch::createMSPassDescSetLayout(const ImageMSParams& imageMSParams)
+{
+	DE_UNREF(imageMSParams);
+
+	return DE_NULL;
+}
+
+const VkDescriptorSet* MSInstanceBaseResolveAndPerSampleFetch::createMSPassDescSet(const ImageMSParams& imageMSParams, const VkDescriptorSetLayout* descSetLayout)
+{
+	DE_UNREF(imageMSParams);
+	DE_UNREF(descSetLayout);
+
+	return DE_NULL;
+}
+
+tcu::TestStatus MSInstanceBaseResolveAndPerSampleFetch::iterate (void)
+{
+	const InstanceInterface&	instance			= m_context.getInstanceInterface();
+	const DeviceInterface&		deviceInterface		= m_context.getDeviceInterface();
+	const VkDevice				device				= m_context.getDevice();
+	const VkPhysicalDevice		physicalDevice		= m_context.getPhysicalDevice();
+	Allocator&					allocator			= m_context.getDefaultAllocator();
+	const VkQueue				queue				= m_context.getUniversalQueue();
+	const deUint32				queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
+
+	VkImageCreateInfo			imageMSInfo;
+	VkImageCreateInfo			imageRSInfo;
+	const deUint32				firstSubpassAttachmentsCount = 2u;
+
+	// Check if image size does not exceed device limits
+	validateImageSize(instance, physicalDevice, m_imageType, m_imageMSParams.imageSize);
+
+	// Check if device supports image format as color attachment
+	validateImageFeatureFlags(instance, physicalDevice, mapTextureFormat(m_imageFormat), VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+
+	imageMSInfo.sType					= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+	imageMSInfo.pNext					= DE_NULL;
+	imageMSInfo.flags					= 0u;
+	imageMSInfo.imageType				= mapImageType(m_imageType);
+	imageMSInfo.format					= mapTextureFormat(m_imageFormat);
+	imageMSInfo.extent					= makeExtent3D(getLayerSize(m_imageType, m_imageMSParams.imageSize));
+	imageMSInfo.arrayLayers				= getNumLayers(m_imageType, m_imageMSParams.imageSize);
+	imageMSInfo.mipLevels				= 1u;
+	imageMSInfo.samples					= m_imageMSParams.numSamples;
+	imageMSInfo.tiling					= VK_IMAGE_TILING_OPTIMAL;
+	imageMSInfo.initialLayout			= VK_IMAGE_LAYOUT_UNDEFINED;
+	imageMSInfo.usage					= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+	imageMSInfo.sharingMode				= VK_SHARING_MODE_EXCLUSIVE;
+	imageMSInfo.queueFamilyIndexCount	= 0u;
+	imageMSInfo.pQueueFamilyIndices		= DE_NULL;
+
+	if (m_imageType == IMAGE_TYPE_CUBE || m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+	{
+		imageMSInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
+	}
+
+	validateImageInfo(instance, physicalDevice, imageMSInfo);
+
+	const de::UniquePtr<Image> imageMS(new Image(deviceInterface, device, allocator, imageMSInfo, MemoryRequirement::Any));
+
+	imageRSInfo			= imageMSInfo;
+	imageRSInfo.samples	= VK_SAMPLE_COUNT_1_BIT;
+	imageRSInfo.usage	= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+
+	validateImageInfo(instance, physicalDevice, imageRSInfo);
+
+	const de::UniquePtr<Image> imageRS(new Image(deviceInterface, device, allocator, imageRSInfo, MemoryRequirement::Any));
+
+	const deUint32 numSamples = static_cast<deUint32>(imageMSInfo.samples);
+
+	std::vector<de::SharedPtr<Image> > imagesPerSampleVec(numSamples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		imagesPerSampleVec[sampleNdx] = de::SharedPtr<Image>(new Image(deviceInterface, device, allocator, imageRSInfo, MemoryRequirement::Any));
+	}
+
+	// Create render pass
+	std::vector<VkAttachmentDescription> attachments(firstSubpassAttachmentsCount + numSamples);
+
+	{
+		const VkAttachmentDescription attachmentMSDesc =
+		{
+			(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
+			imageMSInfo.format,							// VkFormat							format;
+			imageMSInfo.samples,						// VkSampleCountFlagBits			samples;
+			VK_ATTACHMENT_LOAD_OP_CLEAR,				// VkAttachmentLoadOp				loadOp;
+			VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
+			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
+			VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
+			VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL	// VkImageLayout					finalLayout;
+		};
+
+		attachments[0] = attachmentMSDesc;
+
+		const VkAttachmentDescription attachmentRSDesc =
+		{
+			(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
+			imageRSInfo.format,							// VkFormat							format;
+			imageRSInfo.samples,						// VkSampleCountFlagBits			samples;
+			VK_ATTACHMENT_LOAD_OP_CLEAR,				// VkAttachmentLoadOp				loadOp;
+			VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
+			VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
+			VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout					finalLayout;
+		};
+
+		attachments[1] = attachmentRSDesc;
+
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			attachments[firstSubpassAttachmentsCount + sampleNdx] = attachmentRSDesc;
+		}
+	}
+
+	const VkAttachmentReference attachmentMSColorRef =
+	{
+		0u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference attachmentMSInputRef =
+	{
+		0u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference attachmentRSColorRef =
+	{
+		1u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	std::vector<VkAttachmentReference> perSampleAttachmentRef(numSamples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		const VkAttachmentReference attachmentRef =
+		{
+			firstSubpassAttachmentsCount + sampleNdx,	// deUint32			attachment;
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+		};
+
+		perSampleAttachmentRef[sampleNdx] = attachmentRef;
+	}
+
+	std::vector<deUint32> preserveAttachments(1u + numSamples);
+
+	for (deUint32 attachNdx = 0u; attachNdx < 1u + numSamples; ++attachNdx)
+	{
+		preserveAttachments[attachNdx] = 1u + attachNdx;
+	}
+
+	std::vector<VkSubpassDescription> subpasses(1u + numSamples);
+	std::vector<VkSubpassDependency>  subpassDependencies(numSamples);
+
+	const VkSubpassDescription firstSubpassDesc =
+	{
+		(VkSubpassDescriptionFlags)0u,		// VkSubpassDescriptionFlags		flags;
+		VK_PIPELINE_BIND_POINT_GRAPHICS,	// VkPipelineBindPoint				pipelineBindPoint;
+		0u,									// deUint32							inputAttachmentCount;
+		DE_NULL,							// const VkAttachmentReference*		pInputAttachments;
+		1u,									// deUint32							colorAttachmentCount;
+		&attachmentMSColorRef,				// const VkAttachmentReference*		pColorAttachments;
+		&attachmentRSColorRef,				// const VkAttachmentReference*		pResolveAttachments;
+		DE_NULL,							// const VkAttachmentReference*		pDepthStencilAttachment;
+		0u,									// deUint32							preserveAttachmentCount;
+		DE_NULL								// const deUint32*					pPreserveAttachments;
+	};
+
+	subpasses[0] = firstSubpassDesc;
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		const VkSubpassDescription subpassDesc =
+		{
+			(VkSubpassDescriptionFlags)0u,			// VkSubpassDescriptionFlags		flags;
+			VK_PIPELINE_BIND_POINT_GRAPHICS,		// VkPipelineBindPoint				pipelineBindPoint;
+			1u,										// deUint32							inputAttachmentCount;
+			&attachmentMSInputRef,					// const VkAttachmentReference*		pInputAttachments;
+			1u,										// deUint32							colorAttachmentCount;
+			&perSampleAttachmentRef[sampleNdx],		// const VkAttachmentReference*		pColorAttachments;
+			DE_NULL,								// const VkAttachmentReference*		pResolveAttachments;
+			DE_NULL,								// const VkAttachmentReference*		pDepthStencilAttachment;
+			1u + sampleNdx,							// deUint32							preserveAttachmentCount;
+			dataPointer(preserveAttachments)		// const deUint32*					pPreserveAttachments;
+		};
+
+		subpasses[1u + sampleNdx] = subpassDesc;
+
+		const VkSubpassDependency subpassDependency =
+		{
+			0u,												// uint32_t                srcSubpass;
+			1u + sampleNdx,									// uint32_t                dstSubpass;
+			VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,  // VkPipelineStageFlags    srcStageMask;
+			VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,			// VkPipelineStageFlags    dstStageMask;
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			// VkAccessFlags           srcAccessMask;
+			VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,			// VkAccessFlags           dstAccessMask;
+			0u,												// VkDependencyFlags       dependencyFlags;
+		};
+
+		subpassDependencies[sampleNdx] = subpassDependency;
+	}
+
+	const VkRenderPassCreateInfo renderPassInfo =
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
+		DE_NULL,											// const void*						pNext;
+		(VkRenderPassCreateFlags)0u,						// VkRenderPassCreateFlags			flags;
+		static_cast<deUint32>(attachments.size()),			// deUint32							attachmentCount;
+		dataPointer(attachments),							// const VkAttachmentDescription*	pAttachments;
+		static_cast<deUint32>(subpasses.size()),			// deUint32							subpassCount;
+		dataPointer(subpasses),								// const VkSubpassDescription*		pSubpasses;
+		static_cast<deUint32>(subpassDependencies.size()),	// deUint32							dependencyCount;
+		dataPointer(subpassDependencies)					// const VkSubpassDependency*		pDependencies;
+	};
+
+	const Unique<VkRenderPass> renderPass(createRenderPass(deviceInterface, device, &renderPassInfo));
+
+	const VkImageSubresourceRange fullImageRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, imageMSInfo.mipLevels, 0u, imageMSInfo.arrayLayers);
+
+	// Create color attachments image views
+	typedef de::SharedPtr<Unique<VkImageView> > VkImageViewSp;
+	std::vector<VkImageViewSp>	imageViewsShPtrs(firstSubpassAttachmentsCount + numSamples);
+	std::vector<VkImageView>	imageViews(firstSubpassAttachmentsCount + numSamples);
+
+	imageViewsShPtrs[0] = makeVkSharedPtr(makeImageView(deviceInterface, device, **imageMS, mapImageViewType(m_imageType), imageMSInfo.format, fullImageRange));
+	imageViewsShPtrs[1] = makeVkSharedPtr(makeImageView(deviceInterface, device, **imageRS, mapImageViewType(m_imageType), imageRSInfo.format, fullImageRange));
+
+	imageViews[0] = **imageViewsShPtrs[0];
+	imageViews[1] = **imageViewsShPtrs[1];
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		imageViewsShPtrs[firstSubpassAttachmentsCount + sampleNdx] = makeVkSharedPtr(makeImageView(deviceInterface, device, **imagesPerSampleVec[sampleNdx], mapImageViewType(m_imageType), imageRSInfo.format, fullImageRange));
+		imageViews[firstSubpassAttachmentsCount + sampleNdx] = **imageViewsShPtrs[firstSubpassAttachmentsCount + sampleNdx];
+	}
+
+	// Create framebuffer
+	const VkFramebufferCreateInfo framebufferInfo =
+	{
+		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// VkStructureType							   sType;
+		DE_NULL,									// const void*                                 pNext;
+		(VkFramebufferCreateFlags)0u,				// VkFramebufferCreateFlags                    flags;
+		*renderPass,								// VkRenderPass                                renderPass;
+		static_cast<deUint32>(imageViews.size()),	// uint32_t                                    attachmentCount;
+		dataPointer(imageViews),					// const VkImageView*                          pAttachments;
+		imageMSInfo.extent.width,					// uint32_t                                    width;
+		imageMSInfo.extent.height,					// uint32_t                                    height;
+		imageMSInfo.arrayLayers,					// uint32_t                                    layers;
+	};
+
+	const Unique<VkFramebuffer> framebuffer(createFramebuffer(deviceInterface, device, &framebufferInfo));
+
+	const VkDescriptorSetLayout* descriptorSetLayoutMSPass = createMSPassDescSetLayout(m_imageMSParams);
+
+	// Create pipeline layout
+	const VkPipelineLayoutCreateInfo pipelineLayoutMSPassParams =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,	// VkStructureType					sType;
+		DE_NULL,										// const void*						pNext;
+		(VkPipelineLayoutCreateFlags)0u,				// VkPipelineLayoutCreateFlags		flags;
+		descriptorSetLayoutMSPass ? 1u : 0u,			// deUint32							setLayoutCount;
+		descriptorSetLayoutMSPass,						// const VkDescriptorSetLayout*		pSetLayouts;
+		0u,												// deUint32							pushConstantRangeCount;
+		DE_NULL,										// const VkPushConstantRange*		pPushConstantRanges;
+	};
+
+	const Unique<VkPipelineLayout> pipelineLayoutMSPass(createPipelineLayout(deviceInterface, device, &pipelineLayoutMSPassParams));
+
+	// Create vertex attributes data
+	const VertexDataDesc vertexDataDesc = getVertexDataDescripton();
+
+	de::SharedPtr<Buffer> vertexBuffer = de::SharedPtr<Buffer>(new Buffer(deviceInterface, device, allocator, makeBufferCreateInfo(vertexDataDesc.dataSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
+	const Allocation& vertexBufferAllocation = vertexBuffer->getAllocation();
+
+	uploadVertexData(vertexBufferAllocation, vertexDataDesc);
+
+	flushMappedMemoryRange(deviceInterface, device, vertexBufferAllocation.getMemory(), vertexBufferAllocation.getOffset(), VK_WHOLE_SIZE);
+
+	const VkVertexInputBindingDescription vertexBinding =
+	{
+		0u,							// deUint32				binding;
+		vertexDataDesc.dataStride,	// deUint32				stride;
+		VK_VERTEX_INPUT_RATE_VERTEX	// VkVertexInputRate	inputRate;
+	};
+
+	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,			// VkStructureType                             sType;
+		DE_NULL,															// const void*                                 pNext;
+		(VkPipelineVertexInputStateCreateFlags)0u,							// VkPipelineVertexInputStateCreateFlags       flags;
+		1u,																	// uint32_t                                    vertexBindingDescriptionCount;
+		&vertexBinding,														// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
+		static_cast<deUint32>(vertexDataDesc.vertexAttribDescVec.size()),	// uint32_t                                    vertexAttributeDescriptionCount;
+		dataPointer(vertexDataDesc.vertexAttribDescVec),					// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
+	};
+
+	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                             sType;
+		DE_NULL,														// const void*                                 pNext;
+		(VkPipelineInputAssemblyStateCreateFlags)0u,					// VkPipelineInputAssemblyStateCreateFlags     flags;
+		vertexDataDesc.primitiveTopology,								// VkPrimitiveTopology                         topology;
+		VK_FALSE,														// VkBool32                                    primitiveRestartEnable;
+	};
+
+	const VkViewport viewport =
+	{
+		0.0f, 0.0f,
+		static_cast<float>(imageMSInfo.extent.width), static_cast<float>(imageMSInfo.extent.height),
+		0.0f, 1.0f
+	};
+
+	const VkRect2D scissor =
+	{
+		makeOffset2D(0, 0),
+		makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
+	};
+
+	const VkPipelineViewportStateCreateInfo viewportStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType                             sType;
+		DE_NULL,														// const void*                                 pNext;
+		(VkPipelineViewportStateCreateFlags)0u,							// VkPipelineViewportStateCreateFlags          flags;
+		1u,																// uint32_t                                    viewportCount;
+		&viewport,														// const VkViewport*                           pViewports;
+		1u,																// uint32_t                                    scissorCount;
+		&scissor,														// const VkRect2D*                             pScissors;
+	};
+
+	const VkPipelineRasterizationStateCreateInfo rasterizationStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType                          sType;
+		DE_NULL,														// const void*                              pNext;
+		(VkPipelineRasterizationStateCreateFlags)0u,					// VkPipelineRasterizationStateCreateFlags  flags;
+		VK_FALSE,														// VkBool32                                 depthClampEnable;
+		VK_FALSE,														// VkBool32                                 rasterizerDiscardEnable;
+		VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
+		VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
+		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
+		VK_FALSE,														// VkBool32									depthBiasEnable;
+		0.0f,															// float									depthBiasConstantFactor;
+		0.0f,															// float									depthBiasClamp;
+		0.0f,															// float									depthBiasSlopeFactor;
+		1.0f,															// float									lineWidth;
+	};
+
+	const VkPipelineMultisampleStateCreateInfo multisampleStateInfo = getMSStateCreateInfo(m_imageMSParams);
+
+	const VkStencilOpState stencilOpState = makeStencilOpState
+	(
+		VK_STENCIL_OP_KEEP,		// stencil fail
+		VK_STENCIL_OP_KEEP,		// depth & stencil pass
+		VK_STENCIL_OP_KEEP,		// depth only fail
+		VK_COMPARE_OP_ALWAYS,	// compare op
+		0u,						// compare mask
+		0u,						// write mask
+		0u						// reference
+	);
+
+	const VkPipelineDepthStencilStateCreateInfo depthStencilStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,		// VkStructureType							sType;
+		DE_NULL,														// const void*								pNext;
+		(VkPipelineDepthStencilStateCreateFlags)0u,						// VkPipelineDepthStencilStateCreateFlags	flags;
+		VK_FALSE,														// VkBool32									depthTestEnable;
+		VK_FALSE,														// VkBool32									depthWriteEnable;
+		VK_COMPARE_OP_LESS,												// VkCompareOp								depthCompareOp;
+		VK_FALSE,														// VkBool32									depthBoundsTestEnable;
+		VK_FALSE,														// VkBool32									stencilTestEnable;
+		stencilOpState,													// VkStencilOpState							front;
+		stencilOpState,													// VkStencilOpState							back;
+		0.0f,															// float									minDepthBounds;
+		1.0f,															// float									maxDepthBounds;
+	};
+
+	const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+
+	const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+	{
+		VK_FALSE,														// VkBool32					blendEnable;
+		VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcColorBlendFactor;
+		VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstColorBlendFactor;
+		VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
+		VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcAlphaBlendFactor;
+		VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstAlphaBlendFactor;
+		VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
+		colorComponentsAll,												// VkColorComponentFlags	colorWriteMask;
+	};
+
+	const VkPipelineColorBlendStateCreateInfo colorBlendStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,		// VkStructureType								sType;
+		DE_NULL,														// const void*									pNext;
+		(VkPipelineColorBlendStateCreateFlags)0u,						// VkPipelineColorBlendStateCreateFlags			flags;
+		VK_FALSE,														// VkBool32										logicOpEnable;
+		VK_LOGIC_OP_COPY,												// VkLogicOp									logicOp;
+		1u,																// deUint32										attachmentCount;
+		&colorBlendAttachmentState,										// const VkPipelineColorBlendAttachmentState*	pAttachments;
+		{ 0.0f, 0.0f, 0.0f, 0.0f },										// float										blendConstants[4];
+	};
+
+	// Create graphics pipeline for multisample pass
+	const Unique<VkShaderModule> vsMSPassModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("vertex_shader"), (VkShaderModuleCreateFlags)0u));
+
+	const VkPipelineShaderStageCreateInfo vsMSPassShaderStageInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+		DE_NULL,														// const void*							pNext;
+		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+		VK_SHADER_STAGE_VERTEX_BIT,										// VkShaderStageFlagBits				stage;
+		*vsMSPassModule,												// VkShaderModule						module;
+		"main",															// const char*							pName;
+		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+	};
+
+	const Unique<VkShaderModule> fsMSPassModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("fragment_shader"), (VkShaderModuleCreateFlags)0u));
+
+	const VkPipelineShaderStageCreateInfo fsMSPassShaderStageInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+		DE_NULL,														// const void*							pNext;
+		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+		VK_SHADER_STAGE_FRAGMENT_BIT,									// VkShaderStageFlagBits				stage;
+		*fsMSPassModule,												// VkShaderModule						module;
+		"main",															// const char*							pName;
+		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+	};
+
+	const VkPipelineShaderStageCreateInfo shaderStageInfosMSPass[] = { vsMSPassShaderStageInfo, fsMSPassShaderStageInfo };
+
+	const VkGraphicsPipelineCreateInfo graphicsPipelineInfoMSPass =
+	{
+		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,				// VkStructureType									sType;
+		DE_NULL,														// const void*										pNext;
+		(VkPipelineCreateFlags)0u,										// VkPipelineCreateFlags							flags;
+		2u,																// deUint32											stageCount;
+		shaderStageInfosMSPass,											// const VkPipelineShaderStageCreateInfo*			pStages;
+		&vertexInputStateInfo,											// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
+		&inputAssemblyStateInfo,										// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
+		DE_NULL,														// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
+		&viewportStateInfo,												// const VkPipelineViewportStateCreateInfo*			pViewportState;
+		&rasterizationStateInfo,										// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
+		&multisampleStateInfo,											// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
+		&depthStencilStateInfo,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
+		&colorBlendStateInfo,											// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
+		DE_NULL,														// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
+		*pipelineLayoutMSPass,											// VkPipelineLayout									layout;
+		*renderPass,													// VkRenderPass										renderPass;
+		0u,																// deUint32											subpass;
+		DE_NULL,														// VkPipeline										basePipelineHandle;
+		0u,																// deInt32											basePipelineIndex;
+	};
+
+	const Unique<VkPipeline> graphicsPipelineMSPass(createGraphicsPipeline(deviceInterface, device, DE_NULL, &graphicsPipelineInfoMSPass));
+
+	typedef de::SharedPtr<Unique<VkPipeline> > VkPipelineSp;
+	std::vector<VkPipelineSp> graphicsPipelinesPerSampleFetch(numSamples);
+
+	// Create descriptor set layout
+	const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+		DescriptorSetLayoutBuilder()
+		.addSingleBinding(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_SHADER_STAGE_FRAGMENT_BIT)
+		.addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, VK_SHADER_STAGE_FRAGMENT_BIT)
+		.build(deviceInterface, device));
+
+	const Unique<VkPipelineLayout> pipelineLayoutPerSampleFetchPass(makePipelineLayout(deviceInterface, device, *descriptorSetLayout));
+
+	const deUint32 bufferPerSampleFetchPassSize = 4u * (deUint32)sizeof(tcu::Vec4);
+
+	de::SharedPtr<Buffer> vertexBufferPerSampleFetchPass = de::SharedPtr<Buffer>(new Buffer(deviceInterface, device, allocator, makeBufferCreateInfo(bufferPerSampleFetchPassSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
+
+	// Create graphics pipelines for per sample texel fetch passes
+	{
+		const Unique<VkShaderModule> vsPerSampleFetchPassModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("per_sample_fetch_vs"), (VkShaderModuleCreateFlags)0u));
+
+		const VkPipelineShaderStageCreateInfo vsPerSampleFetchPassShaderStageInfo =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+			DE_NULL,														// const void*							pNext;
+			(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+			VK_SHADER_STAGE_VERTEX_BIT,										// VkShaderStageFlagBits				stage;
+			*vsPerSampleFetchPassModule,									// VkShaderModule						module;
+			"main",															// const char*							pName;
+			DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+		};
+
+		const Unique<VkShaderModule> fsPerSampleFetchPassModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("per_sample_fetch_fs"), (VkShaderModuleCreateFlags)0u));
+
+		const VkPipelineShaderStageCreateInfo fsPerSampleFetchPassShaderStageInfo =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
+			DE_NULL,														// const void*							pNext;
+			(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
+			VK_SHADER_STAGE_FRAGMENT_BIT,									// VkShaderStageFlagBits				stage;
+			*fsPerSampleFetchPassModule,									// VkShaderModule						module;
+			"main",															// const char*							pName;
+			DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
+		};
+
+		const VkPipelineShaderStageCreateInfo shaderStageInfosPerSampleFetchPass[] = { vsPerSampleFetchPassShaderStageInfo, fsPerSampleFetchPassShaderStageInfo };
+
+		std::vector<tcu::Vec4> vertices;
+
+		vertices.push_back(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
+		vertices.push_back(tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f));
+		vertices.push_back(tcu::Vec4(-1.0f,  1.0f, 0.0f, 1.0f));
+		vertices.push_back(tcu::Vec4( 1.0f,  1.0f, 0.0f, 1.0f));
+
+		const Allocation& vertexAllocPerSampleFetchPass = vertexBufferPerSampleFetchPass->getAllocation();
+
+		deMemcpy(vertexAllocPerSampleFetchPass.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(bufferPerSampleFetchPassSize));
+
+		flushMappedMemoryRange(deviceInterface, device, vertexAllocPerSampleFetchPass.getMemory(), vertexAllocPerSampleFetchPass.getOffset(), VK_WHOLE_SIZE);
+
+		const VkVertexInputBindingDescription vertexBindingPerSampleFetchPass =
+		{
+			0u,							// deUint32				binding;
+			sizeof(tcu::Vec4),			// deUint32				stride;
+			VK_VERTEX_INPUT_RATE_VERTEX	// VkVertexInputRate	inputRate;
+		};
+
+		const VkVertexInputAttributeDescription vertexAttribPositionNdc =
+		{
+			0u,											// deUint32	location;
+			0u,											// deUint32	binding;
+			VK_FORMAT_R32G32B32A32_SFLOAT,				// VkFormat	format;
+			0u,											// deUint32	offset;
+		};
+
+		const VkPipelineVertexInputStateCreateInfo vertexInputStatePerSampleFetchPass =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,			// VkStructureType                             sType;
+			DE_NULL,															// const void*                                 pNext;
+			(VkPipelineVertexInputStateCreateFlags)0u,							// VkPipelineVertexInputStateCreateFlags       flags;
+			1u,																	// uint32_t                                    vertexBindingDescriptionCount;
+			&vertexBindingPerSampleFetchPass,									// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
+			1u,																	// uint32_t                                    vertexAttributeDescriptionCount;
+			&vertexAttribPositionNdc,											// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
+		};
+
+		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStatePerSampleFetchPass =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                             sType;
+			DE_NULL,														// const void*                                 pNext;
+			(VkPipelineInputAssemblyStateCreateFlags)0u,					// VkPipelineInputAssemblyStateCreateFlags     flags;
+			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,								// VkPrimitiveTopology                         topology;
+			VK_FALSE,														// VkBool32                                    primitiveRestartEnable;
+		};
+
+		const VkPipelineMultisampleStateCreateInfo multisampleStatePerSampleFetchPass =
+		{
+			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
+			DE_NULL,														// const void*								pNext;
+			(VkPipelineMultisampleStateCreateFlags)0u,						// VkPipelineMultisampleStateCreateFlags	flags;
+			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits					rasterizationSamples;
+			VK_FALSE,														// VkBool32									sampleShadingEnable;
+			0.0f,															// float									minSampleShading;
+			DE_NULL,														// const VkSampleMask*						pSampleMask;
+			VK_FALSE,														// VkBool32									alphaToCoverageEnable;
+			VK_FALSE,														// VkBool32									alphaToOneEnable;
+		};
+
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
+			{
+				VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,				// VkStructureType									sType;
+				DE_NULL,														// const void*										pNext;
+				(VkPipelineCreateFlags)0u,										// VkPipelineCreateFlags							flags;
+				2u,																// deUint32											stageCount;
+				shaderStageInfosPerSampleFetchPass,								// const VkPipelineShaderStageCreateInfo*			pStages;
+				&vertexInputStatePerSampleFetchPass,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
+				&inputAssemblyStatePerSampleFetchPass,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
+				DE_NULL,														// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
+				&viewportStateInfo,												// const VkPipelineViewportStateCreateInfo*			pViewportState;
+				&rasterizationStateInfo,										// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
+				&multisampleStatePerSampleFetchPass,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
+				&depthStencilStateInfo,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
+				&colorBlendStateInfo,											// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
+				DE_NULL,														// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
+				*pipelineLayoutPerSampleFetchPass,								// VkPipelineLayout									layout;
+				*renderPass,													// VkRenderPass										renderPass;
+				1u + sampleNdx,													// deUint32											subpass;
+				DE_NULL,														// VkPipeline										basePipelineHandle;
+				0u,																// deInt32											basePipelineIndex;
+			};
+
+			graphicsPipelinesPerSampleFetch[sampleNdx] = makeVkSharedPtr(createGraphicsPipeline(deviceInterface, device, DE_NULL, &graphicsPipelineInfo));
+		}
+	}
+
+	// Create descriptor pool
+	const Unique<VkDescriptorPool> descriptorPool(
+		DescriptorPoolBuilder()
+		.addType(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1u)
+		.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1u)
+		.build(deviceInterface, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+	// Create descriptor set
+	const Unique<VkDescriptorSet> descriptorSet(makeDescriptorSet(deviceInterface, device, *descriptorPool, *descriptorSetLayout));
+
+	const VkPhysicalDeviceLimits deviceLimits = getPhysicalDeviceProperties(instance, physicalDevice).limits;
+
+	VkDeviceSize uboOffsetAlignment = sizeof(deInt32) < deviceLimits.minUniformBufferOffsetAlignment ? deviceLimits.minUniformBufferOffsetAlignment : sizeof(deInt32);
+
+	uboOffsetAlignment += (deviceLimits.minUniformBufferOffsetAlignment - uboOffsetAlignment % deviceLimits.minUniformBufferOffsetAlignment) % deviceLimits.minUniformBufferOffsetAlignment;
+
+	const VkBufferCreateInfo	bufferSampleIDInfo = makeBufferCreateInfo(uboOffsetAlignment * numSamples, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
+	const de::UniquePtr<Buffer>	bufferSampleID(new Buffer(deviceInterface, device, allocator, bufferSampleIDInfo, MemoryRequirement::HostVisible));
+
+	std::vector<deUint32> sampleIDsOffsets(numSamples);
+
+	{
+		deInt8* sampleIDs = new deInt8[uboOffsetAlignment * numSamples];
+
+		for (deInt32 sampleNdx = 0u; sampleNdx < static_cast<deInt32>(numSamples); ++sampleNdx)
+		{
+			sampleIDsOffsets[sampleNdx] = static_cast<deUint32>(sampleNdx * uboOffsetAlignment);
+			deInt8* samplePtr = sampleIDs + sampleIDsOffsets[sampleNdx];
+
+			deMemcpy(samplePtr, &sampleNdx, sizeof(deInt32));
+		}
+
+		deMemcpy(bufferSampleID->getAllocation().getHostPtr(), sampleIDs, static_cast<deUint32>(uboOffsetAlignment * numSamples));
+
+		flushMappedMemoryRange(deviceInterface, device, bufferSampleID->getAllocation().getMemory(), bufferSampleID->getAllocation().getOffset(), VK_WHOLE_SIZE);
+
+		delete[] sampleIDs;
+	}
+
+	{
+		const VkDescriptorImageInfo	 descImageInfo  = makeDescriptorImageInfo(DE_NULL, imageViews[0], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+		const VkDescriptorBufferInfo descBufferInfo	= makeDescriptorBufferInfo(**bufferSampleID, 0u, sizeof(deInt32));
+
+		DescriptorSetUpdateBuilder()
+			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, &descImageInfo)
+			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, &descBufferInfo)
+			.update(deviceInterface, device);
+	}
+
+	// Create command buffer for compute and transfer oparations
+	const Unique<VkCommandPool>	  commandPool(makeCommandPool(deviceInterface, device, queueFamilyIndex));
+	const Unique<VkCommandBuffer> commandBuffer(makeCommandBuffer(deviceInterface, device, *commandPool));
+
+	// Start recording commands
+	beginCommandBuffer(deviceInterface, *commandBuffer);
+
+	{
+		std::vector<VkImageMemoryBarrier> imageOutputAttachmentBarriers(firstSubpassAttachmentsCount + numSamples);
+
+		imageOutputAttachmentBarriers[0] = makeImageMemoryBarrier
+		(
+			0u,
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_IMAGE_LAYOUT_UNDEFINED,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			**imageMS,
+			fullImageRange
+		);
+
+		imageOutputAttachmentBarriers[1] = makeImageMemoryBarrier
+		(
+			0u,
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_IMAGE_LAYOUT_UNDEFINED,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			**imageRS,
+			fullImageRange
+		);
+
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			imageOutputAttachmentBarriers[firstSubpassAttachmentsCount + sampleNdx] = makeImageMemoryBarrier
+			(
+				0u,
+				VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+				VK_IMAGE_LAYOUT_UNDEFINED,
+				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+				**imagesPerSampleVec[sampleNdx],
+				fullImageRange
+			);
+		}
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL,
+			static_cast<deUint32>(imageOutputAttachmentBarriers.size()), dataPointer(imageOutputAttachmentBarriers));
+	}
+
+	{
+		const VkDeviceSize vertexStartOffset = 0u;
+
+		std::vector<VkClearValue> clearValues(firstSubpassAttachmentsCount + numSamples);
+		for (deUint32 attachmentNdx = 0u; attachmentNdx < firstSubpassAttachmentsCount + numSamples; ++attachmentNdx)
+		{
+			clearValues[attachmentNdx] = makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
+		}
+
+		const vk::VkRect2D renderArea =
+		{
+			makeOffset2D(0u, 0u),
+			makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
+		};
+
+		// Begin render pass
+		const VkRenderPassBeginInfo renderPassBeginInfo =
+		{
+			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,		// VkStructureType         sType;
+			DE_NULL,										// const void*             pNext;
+			*renderPass,									// VkRenderPass            renderPass;
+			*framebuffer,									// VkFramebuffer           framebuffer;
+			renderArea,										// VkRect2D                renderArea;
+			static_cast<deUint32>(clearValues.size()),		// deUint32                clearValueCount;
+			dataPointer(clearValues),						// const VkClearValue*     pClearValues;
+		};
+
+		deviceInterface.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+		// Bind graphics pipeline
+		deviceInterface.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipelineMSPass);
+
+		const VkDescriptorSet* descriptorSetMSPass = createMSPassDescSet(m_imageMSParams, descriptorSetLayoutMSPass);
+
+		if (descriptorSetMSPass)
+		{
+			// Bind descriptor set
+			deviceInterface.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayoutMSPass, 0u, 1u, descriptorSetMSPass, 0u, DE_NULL);
+		}
+
+		// Bind vertex buffer
+		deviceInterface.cmdBindVertexBuffers(*commandBuffer, 0u, 1u, &vertexBuffer->get(), &vertexStartOffset);
+
+		// Perform a draw
+		deviceInterface.cmdDraw(*commandBuffer, vertexDataDesc.verticesCount, 1u, 0u, 0u);
+
+		// Change imageMS layout for input attachment compatibility
+		const VkImageMemoryBarrier imageMSInputAttachmentBarrier = makeImageMemoryBarrier
+		(
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+			**imageMS,
+			fullImageRange
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &imageMSInputAttachmentBarrier);
+
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			deviceInterface.cmdNextSubpass(*commandBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+			// Bind graphics pipeline
+			deviceInterface.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **graphicsPipelinesPerSampleFetch[sampleNdx]);
+
+			// Bind descriptor set
+			deviceInterface.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayoutPerSampleFetchPass, 0u, 1u, &descriptorSet.get(), 1u, &sampleIDsOffsets[sampleNdx]);
+
+			// Bind vertex buffer
+			deviceInterface.cmdBindVertexBuffers(*commandBuffer, 0u, 1u, &vertexBufferPerSampleFetchPass->get(), &vertexStartOffset);
+
+			// Perform a draw
+			deviceInterface.cmdDraw(*commandBuffer, 4u, 1u, 0u, 0u);
+		}
+
+		// End render pass
+		deviceInterface.cmdEndRenderPass(*commandBuffer);
+	}
+
+	{
+		const VkImageMemoryBarrier imageRSTransferBarrier = makeImageMemoryBarrier
+		(
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_ACCESS_TRANSFER_READ_BIT,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+			**imageRS,
+			fullImageRange
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &imageRSTransferBarrier);
+	}
+
+	// Copy data from imageRS to buffer
+	const deUint32				imageRSSizeInBytes = getImageSizeInBytes(imageRSInfo.extent, imageRSInfo.arrayLayers, m_imageFormat, imageRSInfo.mipLevels, 1u);
+
+	const VkBufferCreateInfo	bufferRSInfo = makeBufferCreateInfo(imageRSSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+	const de::UniquePtr<Buffer>	bufferRS(new Buffer(deviceInterface, device, allocator, bufferRSInfo, MemoryRequirement::HostVisible));
+
+	{
+		const VkBufferImageCopy bufferImageCopy =
+		{
+			0u,																						//	VkDeviceSize				bufferOffset;
+			0u,																						//	deUint32					bufferRowLength;
+			0u,																						//	deUint32					bufferImageHeight;
+			makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, imageRSInfo.arrayLayers),	//	VkImageSubresourceLayers	imageSubresource;
+			makeOffset3D(0, 0, 0),																	//	VkOffset3D					imageOffset;
+			imageRSInfo.extent,																		//	VkExtent3D					imageExtent;
+		};
+
+		deviceInterface.cmdCopyImageToBuffer(*commandBuffer, **imageRS, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bufferRS->get(), 1u, &bufferImageCopy);
+	}
+
+	{
+		const VkBufferMemoryBarrier bufferRSHostReadBarrier = makeBufferMemoryBarrier
+		(
+			VK_ACCESS_TRANSFER_WRITE_BIT,
+			VK_ACCESS_HOST_READ_BIT,
+			bufferRS->get(),
+			0u,
+			imageRSSizeInBytes
+		);
+
+		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferRSHostReadBarrier, 0u, DE_NULL);
+	}
+
+	// Copy data from per sample images to buffers
+	std::vector<VkImageMemoryBarrier> imagesPerSampleTransferBarriers(numSamples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		imagesPerSampleTransferBarriers[sampleNdx] = makeImageMemoryBarrier
+		(
+			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+			VK_ACCESS_TRANSFER_READ_BIT,
+			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+			**imagesPerSampleVec[sampleNdx],
+			fullImageRange
+		);
+	}
+
+	deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL,
+		static_cast<deUint32>(imagesPerSampleTransferBarriers.size()), dataPointer(imagesPerSampleTransferBarriers));
+
+	std::vector<de::SharedPtr<Buffer> > buffersPerSample(numSamples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		buffersPerSample[sampleNdx] = de::SharedPtr<Buffer>(new Buffer(deviceInterface, device, allocator, bufferRSInfo, MemoryRequirement::HostVisible));
+
+		const VkBufferImageCopy bufferImageCopy =
+		{
+			0u,																						//	VkDeviceSize				bufferOffset;
+			0u,																						//	deUint32					bufferRowLength;
+			0u,																						//	deUint32					bufferImageHeight;
+			makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, imageRSInfo.arrayLayers),	//	VkImageSubresourceLayers	imageSubresource;
+			makeOffset3D(0, 0, 0),																	//	VkOffset3D					imageOffset;
+			imageRSInfo.extent,																		//	VkExtent3D					imageExtent;
+		};
+
+		deviceInterface.cmdCopyImageToBuffer(*commandBuffer, **imagesPerSampleVec[sampleNdx], VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **buffersPerSample[sampleNdx], 1u, &bufferImageCopy);
+	}
+
+	std::vector<VkBufferMemoryBarrier> buffersPerSampleHostReadBarriers(numSamples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		buffersPerSampleHostReadBarriers[sampleNdx] = makeBufferMemoryBarrier
+		(
+			VK_ACCESS_TRANSFER_WRITE_BIT,
+			VK_ACCESS_HOST_READ_BIT,
+			**buffersPerSample[sampleNdx],
+			0u,
+			imageRSSizeInBytes
+		);
+	}
+
+	deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL,
+		static_cast<deUint32>(buffersPerSampleHostReadBarriers.size()), dataPointer(buffersPerSampleHostReadBarriers), 0u, DE_NULL);
+
+	// End recording commands
+	VK_CHECK(deviceInterface.endCommandBuffer(*commandBuffer));
+
+	// Submit commands for execution and wait for completion
+	submitCommandsAndWait(deviceInterface, device, queue, *commandBuffer);
+
+	// Retrieve data from bufferRS to host memory
+	const Allocation& bufferRSAlloc = bufferRS->getAllocation();
+
+	invalidateMappedMemoryRange(deviceInterface, device, bufferRSAlloc.getMemory(), bufferRSAlloc.getOffset(), VK_WHOLE_SIZE);
+
+	const tcu::ConstPixelBufferAccess bufferRSData (m_imageFormat,
+													imageRSInfo.extent.width,
+													imageRSInfo.extent.height,
+													imageRSInfo.extent.depth * imageRSInfo.arrayLayers,
+													bufferRSAlloc.getHostPtr());
+
+	std::stringstream resolveName;
+	resolveName << "Resolve image " << getImageTypeName(m_imageType) << "_" << bufferRSData.getWidth() << "_" << bufferRSData.getHeight() << "_" << bufferRSData.getDepth() << std::endl;
+
+	m_context.getTestContext().getLog()
+		<< tcu::TestLog::Section(resolveName.str(), resolveName.str())
+		<< tcu::LogImage("resolve", "", bufferRSData)
+		<< tcu::TestLog::EndSection;
+
+	std::vector<tcu::ConstPixelBufferAccess> buffersPerSampleData(numSamples);
+
+	// Retrieve data from per sample buffers to host memory
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		const Allocation& bufferAlloc = buffersPerSample[sampleNdx]->getAllocation();
+
+		invalidateMappedMemoryRange(deviceInterface, device, bufferAlloc.getMemory(), bufferAlloc.getOffset(), VK_WHOLE_SIZE);
+
+		buffersPerSampleData[sampleNdx] = tcu::ConstPixelBufferAccess
+		(
+			m_imageFormat,
+			imageRSInfo.extent.width,
+			imageRSInfo.extent.height,
+			imageRSInfo.extent.depth * imageRSInfo.arrayLayers,
+			bufferAlloc.getHostPtr()
+		);
+
+		std::stringstream sampleName;
+		sampleName << "Sample " << sampleNdx << " image" << std::endl;
+
+		m_context.getTestContext().getLog()
+			<< tcu::TestLog::Section(sampleName.str(), sampleName.str())
+			<< tcu::LogImage("sample", "", buffersPerSampleData[sampleNdx])
+			<< tcu::TestLog::EndSection;
+	}
+
+	return verifyImageData(imageMSInfo, imageRSInfo, buffersPerSampleData, bufferRSData);
+}
+
+} // multisample
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp
new file mode 100644
index 0000000..158b80b
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp
@@ -0,0 +1,77 @@
+#ifndef _VKTPIPELINEMULTISAMPLEBASERESOLVEANDPERSAMPLEFETCH_HPP
+#define _VKTPIPELINEMULTISAMPLEBASERESOLVEANDPERSAMPLEFETCH_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp
+ * \brief Base class for tests that check results of multisample resolve
+ *		  and/or values of individual samples
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleBase.hpp"
+#include "vktTestCase.hpp"
+#include "tcuVector.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+class MSCaseBaseResolveAndPerSampleFetch : public MultisampleCaseBase
+{
+public:
+		MSCaseBaseResolveAndPerSampleFetch	(tcu::TestContext&		testCtx,
+											 const std::string&		name,
+											 const ImageMSParams&	imageMSParams)
+		: MultisampleCaseBase(testCtx, name, imageMSParams) {}
+
+	void initPrograms						(vk::SourceCollections&	programCollection) const;
+};
+
+class MSInstanceBaseResolveAndPerSampleFetch : public MultisampleInstanceBase
+{
+public:
+							MSInstanceBaseResolveAndPerSampleFetch					(Context&											context,
+																					 const ImageMSParams&								imageMSParams)
+							: MultisampleInstanceBase(context, imageMSParams) {}
+
+protected:
+
+	tcu::TestStatus										iterate						(void);
+
+	virtual vk::VkPipelineMultisampleStateCreateInfo	getMSStateCreateInfo		(const ImageMSParams&								imageMSParams) const;
+
+	virtual const vk::VkDescriptorSetLayout*			createMSPassDescSetLayout	(const ImageMSParams&								imageMSParams);
+
+	virtual const vk::VkDescriptorSet*					createMSPassDescSet			(const ImageMSParams&								imageMSParams,
+																					 const vk::VkDescriptorSetLayout*					descSetLayout);
+
+	virtual tcu::TestStatus								verifyImageData				(const vk::VkImageCreateInfo&						imageMSInfo,
+																					 const vk::VkImageCreateInfo&						imageRSInfo,
+																					 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																					 const tcu::ConstPixelBufferAccess&					dataRS) const = 0;
+};
+
+} // multisample
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLEBASERESOLVEANDPERSAMPLEFETCH_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
index 63a1bb1..7a6174b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
@@ -22,11 +22,11 @@
 *//*--------------------------------------------------------------------*/
 
 #include "vktPipelineMultisampleInterpolationTests.hpp"
+#include "vktPipelineMultisampleBaseResolve.hpp"
 #include "vktPipelineMultisampleTestsUtil.hpp"
 #include "vktPipelineMakeUtil.hpp"
 #include "vkQueryUtil.hpp"
-
-#include <set>
+#include <vector>
 
 namespace vkt
 {
@@ -37,745 +37,90 @@
 
 using namespace vk;
 
-struct ImageMSParams
+struct VertexDataNdc
 {
-	ImageMSParams(const VkSampleCountFlagBits samples, const tcu::UVec3& size) : numSamples(samples), imageSize(size) {}
+	VertexDataNdc (const tcu::Vec4& posNdc) : positionNdc(posNdc) {}
 
-	VkSampleCountFlagBits	numSamples;
-	tcu::UVec3				imageSize;
+	tcu::Vec4 positionNdc;
 };
 
-class MSInterpolationCaseBase : public TestCase
+struct VertexDataNdcScreen
 {
-public:
-	MSInterpolationCaseBase	(tcu::TestContext&		testCtx,
-							 const std::string&		name,
-							 const ImageMSParams&	imageMSParams)
-		: TestCase(testCtx, name, "")
-		, m_imageMSParams(imageMSParams)
-	{}
+	VertexDataNdcScreen (const tcu::Vec4& posNdc, const tcu::Vec2& posScreen) : positionNdc(posNdc), positionScreen(posScreen) {}
 
-protected:
-	const ImageMSParams m_imageMSParams;
+	tcu::Vec4 positionNdc;
+	tcu::Vec2 positionScreen;
 };
 
-typedef MSInterpolationCaseBase* (*MSInterpolationCaseFuncPtr)(tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams);
-
-class MSInterpolationInstanceBase : public TestInstance
+struct VertexDataNdcBarycentric
 {
-public:
-								MSInterpolationInstanceBase	(Context&							context,
-															 const ImageMSParams&				imageMSParams)
-		: TestInstance		(context)
-		, m_imageMSParams	(imageMSParams)
-		, m_imageType		(IMAGE_TYPE_2D)
-		, m_imageFormat		(tcu::TextureFormat(tcu::TextureFormat::RG, tcu::TextureFormat::UNORM_INT8))
-	{}
+	VertexDataNdcBarycentric (const tcu::Vec4& posNdc, const tcu::Vec3& barCoord) : positionNdc(posNdc), barycentricCoord(barCoord) {}
 
-	tcu::TestStatus				iterate						(void);
-
-protected:
-
-	typedef std::vector<VkVertexInputAttributeDescription> VertexAttribDescVec;
-
-	struct VertexDataDesc
-	{
-		VkPrimitiveTopology	primitiveTopology;
-		deUint32			verticesCount;
-		deUint32			dataStride;
-		VkDeviceSize		dataSize;
-		VertexAttribDescVec	vertexAttribDescVec;
-	};
-
-	void						validateImageSize			(const InstanceInterface&			instance,
-															 const VkPhysicalDevice				physicalDevice,
-															 const ImageType					imageType,
-															 const tcu::UVec3&					imageSize) const;
-
-	void						validateImageFeatureFlags	(const InstanceInterface&			instance,
-															 const VkPhysicalDevice				physicalDevice,
-															 const VkFormat						format,
-															 const VkFormatFeatureFlags			featureFlags) const;
-
-	void						validateImageInfo			(const InstanceInterface&			instance,
-															 const VkPhysicalDevice				physicalDevice,
-															 const VkImageCreateInfo&			imageInfo) const;
-
-	virtual VertexDataDesc		getVertexDataDescripton		(void) const = 0;
-
-	virtual void				uploadVertexData			(const Allocation&					vertexBufferAllocation,
-															 const VertexDataDesc&				vertexDataDescripton) const = 0;
-
-	virtual tcu::TestStatus		verifyResolvedImage			(const tcu::ConstPixelBufferAccess&	imageData) const = 0;
-protected:
-	const ImageMSParams			m_imageMSParams;
-	const ImageType				m_imageType;
-	const tcu::TextureFormat	m_imageFormat;
+	tcu::Vec4 positionNdc;
+	tcu::Vec3 barycentricCoord;
 };
 
-void MSInterpolationInstanceBase::validateImageSize (const InstanceInterface&	instance,
-													 const VkPhysicalDevice		physicalDevice,
-													 const ImageType			imageType,
-													 const tcu::UVec3&			imageSize) const
+bool checkForError (const vk::VkImageCreateInfo& imageRSInfo, const tcu::ConstPixelBufferAccess& dataRS, const deUint32 errorCompNdx)
 {
-	const VkPhysicalDeviceProperties deviceProperties = getPhysicalDeviceProperties(instance, physicalDevice);
-
-	bool isImageSizeValid = true;
-
-	switch (imageType)
+	for (deUint32 z = 0u; z < imageRSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageRSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageRSInfo.extent.width;  ++x)
 	{
-		case IMAGE_TYPE_1D:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension1D;
-			break;
-		case IMAGE_TYPE_1D_ARRAY:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension1D &&
-								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
-			break;
-		case IMAGE_TYPE_2D:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
-								imageSize.y() <= deviceProperties.limits.maxImageDimension2D;
-			break;
-		case IMAGE_TYPE_2D_ARRAY:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
-								imageSize.y() <= deviceProperties.limits.maxImageDimension2D &&
-								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
-			break;
-		case IMAGE_TYPE_CUBE:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
-								imageSize.y() <= deviceProperties.limits.maxImageDimensionCube;
-			break;
-		case IMAGE_TYPE_CUBE_ARRAY:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
-								imageSize.y() <= deviceProperties.limits.maxImageDimensionCube &&
-								imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
-			break;
-		case IMAGE_TYPE_3D:
-			isImageSizeValid =	imageSize.x() <= deviceProperties.limits.maxImageDimension3D &&
-								imageSize.y() <= deviceProperties.limits.maxImageDimension3D &&
-								imageSize.z() <= deviceProperties.limits.maxImageDimension3D;
-			break;
-		default:
-			DE_FATAL("Unknown image type");
+		const deUint32 errorComponent = dataRS.getPixelUint(x, y, z)[errorCompNdx];
+
+		if (errorComponent > 0)
+			return true;
 	}
 
-	if (!isImageSizeValid)
-	{
-		std::ostringstream	notSupportedStream;
-
-		notSupportedStream << "Image type (" << getImageTypeName(imageType) << ") with size (" << imageSize.x() << ", " << imageSize.y() << ", " << imageSize.z() << ") not supported by device" << std::endl;
-
-		const std::string notSupportedString = notSupportedStream.str();
-
-		TCU_THROW(NotSupportedError, notSupportedString.c_str());
-	}
+	return false;
 }
 
-void MSInterpolationInstanceBase::validateImageFeatureFlags	(const InstanceInterface&	instance,
-															 const VkPhysicalDevice		physicalDevice,
-															 const VkFormat				format,
-															 const VkFormatFeatureFlags	featureFlags) const
-{
-	const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(instance, physicalDevice, format);
-
-	if ((formatProperties.optimalTilingFeatures & featureFlags) != featureFlags)
-	{
-		std::ostringstream	notSupportedStream;
-
-		notSupportedStream << "Device does not support image format " << format << " for feature flags " << featureFlags << std::endl;
-
-		const std::string notSupportedString = notSupportedStream.str();
-
-		TCU_THROW(NotSupportedError, notSupportedString.c_str());
-	}
-}
-
-void MSInterpolationInstanceBase::validateImageInfo	(const InstanceInterface&	instance,
-													 const VkPhysicalDevice		physicalDevice,
-													 const VkImageCreateInfo&	imageInfo) const
-{
-	VkImageFormatProperties imageFormatProps;
-	instance.getPhysicalDeviceImageFormatProperties(physicalDevice, imageInfo.format, imageInfo.imageType, imageInfo.tiling, imageInfo.usage, imageInfo.flags, &imageFormatProps);
-
-	if (imageFormatProps.maxExtent.width  < imageInfo.extent.width  ||
-		imageFormatProps.maxExtent.height < imageInfo.extent.height ||
-		imageFormatProps.maxExtent.depth  < imageInfo.extent.depth)
-	{
-		std::ostringstream	notSupportedStream;
-
-		notSupportedStream	<< "Image extent ("
-							<< imageInfo.extent.width  << ", "
-							<< imageInfo.extent.height << ", "
-							<< imageInfo.extent.depth
-							<< ") exceeds allowed maximum ("
-							<< imageFormatProps.maxExtent.width <<  ", "
-							<< imageFormatProps.maxExtent.height << ", "
-							<< imageFormatProps.maxExtent.depth
-							<< ")"
-							<< std::endl;
-
-		const std::string notSupportedString = notSupportedStream.str();
-
-		TCU_THROW(NotSupportedError, notSupportedString.c_str());
-	}
-
-	if (imageFormatProps.maxArrayLayers < imageInfo.arrayLayers)
-	{
-		std::ostringstream	notSupportedStream;
-
-		notSupportedStream << "Image layers count of " << imageInfo.arrayLayers << " exceeds allowed maximum which is " << imageFormatProps.maxArrayLayers << std::endl;
-
-		const std::string notSupportedString = notSupportedStream.str();
-
-		TCU_THROW(NotSupportedError, notSupportedString.c_str());
-	}
-
-	if (!(imageFormatProps.sampleCounts & imageInfo.samples))
-	{
-		std::ostringstream	notSupportedStream;
-
-		notSupportedStream << "Samples count of " << imageInfo.samples << " not supported for image" << std::endl;
-
-		const std::string notSupportedString = notSupportedStream.str();
-
-		TCU_THROW(NotSupportedError, notSupportedString.c_str());
-	}
-}
-
-tcu::TestStatus MSInterpolationInstanceBase::iterate (void)
-{
-	const InstanceInterface&	instance			= m_context.getInstanceInterface();
-	const DeviceInterface&		deviceInterface		= m_context.getDeviceInterface();
-	const VkDevice				device				= m_context.getDevice();
-	const VkPhysicalDevice		physicalDevice		= m_context.getPhysicalDevice();
-	Allocator&					allocator			= m_context.getDefaultAllocator();
-	const VkQueue				queue				= m_context.getUniversalQueue();
-	const deUint32				queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
-
-	VkImageCreateInfo			imageMSInfo;
-	VkImageCreateInfo			imageRSInfo;
-
-	// Check if image size does not exceed device limits
-	validateImageSize(instance, physicalDevice, m_imageType, m_imageMSParams.imageSize);
-
-	// Check if device supports image format as color attachment
-	validateImageFeatureFlags(instance, physicalDevice, mapTextureFormat(m_imageFormat), VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
-
-	imageMSInfo.sType					= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
-	imageMSInfo.pNext					= DE_NULL;
-	imageMSInfo.flags					= 0u;
-	imageMSInfo.imageType				= mapImageType(m_imageType);
-	imageMSInfo.format					= mapTextureFormat(m_imageFormat);
-	imageMSInfo.extent					= makeExtent3D(getLayerSize(m_imageType, m_imageMSParams.imageSize));
-	imageMSInfo.arrayLayers				= getNumLayers(m_imageType, m_imageMSParams.imageSize);
-	imageMSInfo.mipLevels				= 1u;
-	imageMSInfo.samples					= m_imageMSParams.numSamples;
-	imageMSInfo.tiling					= VK_IMAGE_TILING_OPTIMAL;
-	imageMSInfo.initialLayout			= VK_IMAGE_LAYOUT_UNDEFINED;
-	imageMSInfo.usage					= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
-	imageMSInfo.sharingMode				= VK_SHARING_MODE_EXCLUSIVE;
-	imageMSInfo.queueFamilyIndexCount	= 0u;
-	imageMSInfo.pQueueFamilyIndices		= DE_NULL;
-
-	if (m_imageType == IMAGE_TYPE_CUBE || m_imageType == IMAGE_TYPE_CUBE_ARRAY)
-	{
-		imageMSInfo.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
-	}
-
-	validateImageInfo(instance, physicalDevice, imageMSInfo);
-
-	const de::UniquePtr<Image> imageMS(new Image(deviceInterface, device, allocator, imageMSInfo, MemoryRequirement::Any));
-
-	imageRSInfo			= imageMSInfo;
-	imageRSInfo.samples	= VK_SAMPLE_COUNT_1_BIT;
-
-	validateImageInfo(instance, physicalDevice, imageRSInfo);
-
-	const de::UniquePtr<Image> imageRS(new Image(deviceInterface, device, allocator, imageRSInfo, MemoryRequirement::Any));
-
-	// Create render pass
-	const VkAttachmentDescription attachmentMSDesc =
-	{
-		(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
-		imageMSInfo.format,							// VkFormat							format;
-		imageMSInfo.samples,						// VkSampleCountFlagBits			samples;
-		VK_ATTACHMENT_LOAD_OP_CLEAR,				// VkAttachmentLoadOp				loadOp;
-		VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
-		VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
-		VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout					finalLayout;
-	};
-
-	const VkAttachmentDescription attachmentRSDesc =
-	{
-		(VkAttachmentDescriptionFlags)0u,			// VkAttachmentDescriptionFlags		flags;
-		imageRSInfo.format,							// VkFormat							format;
-		imageRSInfo.samples,						// VkSampleCountFlagBits			samples;
-		VK_ATTACHMENT_LOAD_OP_CLEAR,			// VkAttachmentLoadOp				loadOp;
-		VK_ATTACHMENT_STORE_OP_STORE,				// VkAttachmentStoreOp				storeOp;
-		VK_ATTACHMENT_LOAD_OP_DONT_CARE,			// VkAttachmentLoadOp				stencilLoadOp;
-		VK_ATTACHMENT_STORE_OP_DONT_CARE,			// VkAttachmentStoreOp				stencilStoreOp;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,	// VkImageLayout					initialLayout;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout					finalLayout;
-	};
-
-	const VkAttachmentDescription attachments[] = { attachmentMSDesc, attachmentRSDesc };
-
-	const VkAttachmentReference attachmentMSRef =
-	{
-		0u,											// deUint32			attachment;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
-	};
-
-	const VkAttachmentReference attachmentRSRef =
-	{
-		1u,											// deUint32			attachment;
-		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
-	};
-
-	const VkAttachmentReference* resolveAttachment = m_imageMSParams.numSamples == VK_SAMPLE_COUNT_1_BIT ? DE_NULL : &attachmentRSRef;
-
-	const VkSubpassDescription subpassDescription =
-	{
-		(VkSubpassDescriptionFlags)0u,						// VkSubpassDescriptionFlags		flags;
-		VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint				pipelineBindPoint;
-		0u,													// deUint32							inputAttachmentCount;
-		DE_NULL,											// const VkAttachmentReference*		pInputAttachments;
-		1u,													// deUint32							colorAttachmentCount;
-		&attachmentMSRef,									// const VkAttachmentReference*		pColorAttachments;
-		resolveAttachment,								// const VkAttachmentReference*		pResolveAttachments;
-		DE_NULL,											// const VkAttachmentReference*		pDepthStencilAttachment;
-		0u,													// deUint32							preserveAttachmentCount;
-		DE_NULL												// const deUint32*					pPreserveAttachments;
-	};
-
-	const VkRenderPassCreateInfo renderPassInfo =
-	{
-		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
-		DE_NULL,											// const void*						pNext;
-		(VkRenderPassCreateFlags)0u,						// VkRenderPassCreateFlags			flags;
-		2u,													// deUint32							attachmentCount;
-		attachments,										// const VkAttachmentDescription*	pAttachments;
-		1u,													// deUint32							subpassCount;
-		&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
-		0u,													// deUint32							dependencyCount;
-		DE_NULL												// const VkSubpassDependency*		pDependencies;
-	};
-
-	const Unique<VkRenderPass> renderPass(createRenderPass(deviceInterface, device, &renderPassInfo));
-
-	const VkImageSubresourceRange fullImageRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, imageMSInfo.mipLevels, 0u, imageMSInfo.arrayLayers);
-
-	// Create color attachments image views
-	const Unique<VkImageView> imageMSView(makeImageView(deviceInterface, device, **imageMS, mapImageViewType(m_imageType), imageMSInfo.format, fullImageRange));
-	const Unique<VkImageView> imageRSView(makeImageView(deviceInterface, device, **imageRS, mapImageViewType(m_imageType), imageMSInfo.format, fullImageRange));
-
-	const VkImageView attachmentsViews[] = { *imageMSView, *imageRSView };
-
-	// Create framebuffer
-	const VkFramebufferCreateInfo framebufferInfo =
-	{
-		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,	// VkStructureType                             sType;
-		DE_NULL,									// const void*                                 pNext;
-		(VkFramebufferCreateFlags)0u,				// VkFramebufferCreateFlags                    flags;
-		*renderPass,								// VkRenderPass                                renderPass;
-		2u,											// uint32_t                                    attachmentCount;
-		attachmentsViews,							// const VkImageView*                          pAttachments;
-		imageMSInfo.extent.width,					// uint32_t                                    width;
-		imageMSInfo.extent.height,					// uint32_t                                    height;
-		imageMSInfo.arrayLayers,					// uint32_t                                    layers;
-	};
-
-	const Unique<VkFramebuffer> framebuffer(createFramebuffer(deviceInterface, device, &framebufferInfo));
-
-	// Create pipeline layout
-	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
-		DE_NULL,											// const void*						pNext;
-		(VkPipelineLayoutCreateFlags)0u,					// VkPipelineLayoutCreateFlags		flags;
-		0u,													// deUint32							setLayoutCount;
-		DE_NULL,											// const VkDescriptorSetLayout*		pSetLayouts;
-		0u,													// deUint32							pushConstantRangeCount;
-		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
-	};
-
-	const Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(deviceInterface, device, &pipelineLayoutParams));
-
-	// Create vertex attributes data
-	const VertexDataDesc vertexDataDesc = getVertexDataDescripton();
-
-	de::SharedPtr<Buffer> vertexBuffer = de::SharedPtr<Buffer>(new Buffer(deviceInterface, device, allocator, makeBufferCreateInfo(vertexDataDesc.dataSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
-	const Allocation& vertexBufferAllocation = vertexBuffer->getAllocation();
-
-	uploadVertexData(vertexBufferAllocation, vertexDataDesc);
-
-	flushMappedMemoryRange(deviceInterface, device, vertexBufferAllocation.getMemory(), vertexBufferAllocation.getOffset(), vertexDataDesc.dataSize);
-
-	const VkVertexInputBindingDescription vertexBinding =
-	{
-		0u,							// deUint32				binding;
-		vertexDataDesc.dataStride,	// deUint32				stride;
-		VK_VERTEX_INPUT_RATE_VERTEX	// VkVertexInputRate	inputRate;
-	};
-
-	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,			// VkStructureType                             sType;
-		DE_NULL,															// const void*                                 pNext;
-		(VkPipelineVertexInputStateCreateFlags)0u,							// VkPipelineVertexInputStateCreateFlags       flags;
-		1u,																	// uint32_t                                    vertexBindingDescriptionCount;
-		&vertexBinding,														// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
-		static_cast<deUint32>(vertexDataDesc.vertexAttribDescVec.size()),	// uint32_t                                    vertexAttributeDescriptionCount;
-		dataPointer(vertexDataDesc.vertexAttribDescVec),					// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
-	};
-
-	const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                             sType;
-		DE_NULL,														// const void*                                 pNext;
-		(VkPipelineInputAssemblyStateCreateFlags)0u,					// VkPipelineInputAssemblyStateCreateFlags     flags;
-		vertexDataDesc.primitiveTopology,								// VkPrimitiveTopology                         topology;
-		VK_FALSE,														// VkBool32                                    primitiveRestartEnable;
-	};
-
-	const VkViewport viewport =
-	{
-		0.0f, 0.0f,
-		static_cast<float>(imageMSInfo.extent.width), static_cast<float>(imageMSInfo.extent.height),
-		0.0f, 1.0f
-	};
-
-	const VkRect2D scissor =
-	{
-		makeOffset2D(0, 0),
-		makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
-	};
-
-	const VkPipelineViewportStateCreateInfo viewportStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType                             sType;
-		DE_NULL,														// const void*                                 pNext;
-		(VkPipelineViewportStateCreateFlags)0u,							// VkPipelineViewportStateCreateFlags          flags;
-		1u,																// uint32_t                                    viewportCount;
-		&viewport,														// const VkViewport*                           pViewports;
-		1u,																// uint32_t                                    scissorCount;
-		&scissor,														// const VkRect2D*                             pScissors;
-	};
-
-	const VkPipelineRasterizationStateCreateInfo rasterizationStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType                          sType;
-		DE_NULL,														// const void*                              pNext;
-		(VkPipelineRasterizationStateCreateFlags)0u,					// VkPipelineRasterizationStateCreateFlags  flags;
-		VK_FALSE,														// VkBool32                                 depthClampEnable;
-		VK_FALSE,														// VkBool32                                 rasterizerDiscardEnable;
-		VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
-		VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
-		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
-		VK_FALSE,														// VkBool32									depthBiasEnable;
-		0.0f,															// float									depthBiasConstantFactor;
-		0.0f,															// float									depthBiasClamp;
-		0.0f,															// float									depthBiasSlopeFactor;
-		1.0f,															// float									lineWidth;
-	};
-
-	const VkPipelineMultisampleStateCreateInfo multisampleStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
-		DE_NULL,														// const void*								pNext;
-		(VkPipelineMultisampleStateCreateFlags)0u,						// VkPipelineMultisampleStateCreateFlags	flags;
-		imageMSInfo.samples,											// VkSampleCountFlagBits					rasterizationSamples;
-		VK_TRUE,														// VkBool32									sampleShadingEnable;
-		1.0f,															// float									minSampleShading;
-		DE_NULL,														// const VkSampleMask*						pSampleMask;
-		VK_FALSE,														// VkBool32									alphaToCoverageEnable;
-		VK_FALSE,														// VkBool32									alphaToOneEnable;
-	};
-
-	const VkStencilOpState stencilOpState = makeStencilOpState
-	(
-		VK_STENCIL_OP_KEEP,		// stencil fail
-		VK_STENCIL_OP_KEEP,		// depth & stencil pass
-		VK_STENCIL_OP_KEEP,		// depth only fail
-		VK_COMPARE_OP_ALWAYS,	// compare op
-		0u,						// compare mask
-		0u,						// write mask
-		0u						// reference
-	);
-
-	const VkPipelineDepthStencilStateCreateInfo depthStencilStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,		// VkStructureType							sType;
-		DE_NULL,														// const void*								pNext;
-		(VkPipelineDepthStencilStateCreateFlags)0u,						// VkPipelineDepthStencilStateCreateFlags	flags;
-		VK_FALSE,														// VkBool32									depthTestEnable;
-		VK_FALSE,														// VkBool32									depthWriteEnable;
-		VK_COMPARE_OP_LESS,												// VkCompareOp								depthCompareOp;
-		VK_FALSE,														// VkBool32									depthBoundsTestEnable;
-		VK_FALSE,														// VkBool32									stencilTestEnable;
-		stencilOpState,													// VkStencilOpState							front;
-		stencilOpState,													// VkStencilOpState							back;
-		0.0f,															// float									minDepthBounds;
-		1.0f,															// float									maxDepthBounds;
-	};
-
-	const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
-
-	const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
-	{
-		VK_FALSE,														// VkBool32					blendEnable;
-		VK_BLEND_FACTOR_SRC_ALPHA,										// VkBlendFactor			srcColorBlendFactor;
-		VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,							// VkBlendFactor			dstColorBlendFactor;
-		VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
-		VK_BLEND_FACTOR_SRC_ALPHA,										// VkBlendFactor			srcAlphaBlendFactor;
-		VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,							// VkBlendFactor			dstAlphaBlendFactor;
-		VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
-		colorComponentsAll,												// VkColorComponentFlags	colorWriteMask;
-	};
-
-	const VkPipelineColorBlendStateCreateInfo colorBlendStateInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,		// VkStructureType								sType;
-		DE_NULL,														// const void*									pNext;
-		(VkPipelineColorBlendStateCreateFlags)0u,						// VkPipelineColorBlendStateCreateFlags			flags;
-		VK_FALSE,														// VkBool32										logicOpEnable;
-		VK_LOGIC_OP_COPY,												// VkLogicOp									logicOp;
-		1u,																// deUint32										attachmentCount;
-		&colorBlendAttachmentState,										// const VkPipelineColorBlendAttachmentState*	pAttachments;
-		{ 0.0f, 0.0f, 0.0f, 0.0f },										// float										blendConstants[4];
-	};
-
-	const Unique<VkShaderModule> vsModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("vertex_shader"), (VkShaderModuleCreateFlags)0));
-
-	const VkPipelineShaderStageCreateInfo vsShaderStageInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
-		DE_NULL,														// const void*							pNext;
-		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
-		VK_SHADER_STAGE_VERTEX_BIT,										// VkShaderStageFlagBits				stage;
-		*vsModule,														// VkShaderModule						module;
-		"main",															// const char*							pName;
-		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
-	};
-
-	const Unique<VkShaderModule> fsModule(createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("fragment_shader"), (VkShaderModuleCreateFlags)0));
-
-	const VkPipelineShaderStageCreateInfo fsShaderStageInfo =
-	{
-		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,			// VkStructureType						sType;
-		DE_NULL,														// const void*							pNext;
-		(VkPipelineShaderStageCreateFlags)0u,							// VkPipelineShaderStageCreateFlags		flags;
-		VK_SHADER_STAGE_FRAGMENT_BIT,									// VkShaderStageFlagBits				stage;
-		*fsModule,														// VkShaderModule						module;
-		"main",															// const char*							pName;
-		DE_NULL,														// const VkSpecializationInfo*			pSpecializationInfo;
-	};
-
-	const VkPipelineShaderStageCreateInfo shaderStageInfos[] = { vsShaderStageInfo, fsShaderStageInfo };
-
-	const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
-	{
-		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,				// VkStructureType									sType;
-		DE_NULL,														// const void*										pNext;
-		(VkPipelineCreateFlags)0,										// VkPipelineCreateFlags							flags;
-		2u,																// deUint32											stageCount;
-		shaderStageInfos,												// const VkPipelineShaderStageCreateInfo*			pStages;
-		&vertexInputStateInfo,											// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
-		&inputAssemblyStateInfo,										// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
-		DE_NULL,														// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
-		&viewportStateInfo,												// const VkPipelineViewportStateCreateInfo*			pViewportState;
-		&rasterizationStateInfo,										// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
-		&multisampleStateInfo,											// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
-		&depthStencilStateInfo,											// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
-		&colorBlendStateInfo,											// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
-		DE_NULL,														// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
-		*pipelineLayout,												// VkPipelineLayout									layout;
-		*renderPass,													// VkRenderPass										renderPass;
-		0u,																// deUint32											subpass;
-		DE_NULL,														// VkPipeline										basePipelineHandle;
-		0u,																// deInt32											basePipelineIndex;
-	};
-
-	// Create graphics pipeline
-	const Unique<VkPipeline> graphicsPipeline(createGraphicsPipeline(deviceInterface, device, DE_NULL, &graphicsPipelineInfo));
-
-	// Create command buffer for compute and transfer oparations
-	const Unique<VkCommandPool>	  commandPool(makeCommandPool(deviceInterface, device, queueFamilyIndex));
-	const Unique<VkCommandBuffer> commandBuffer(makeCommandBuffer(deviceInterface, device, *commandPool));
-
-	// Start recording commands
-	beginCommandBuffer(deviceInterface, *commandBuffer);
-
-	{
-		VkImageMemoryBarrier imageOutputAttachmentBarriers[2];
-
-		imageOutputAttachmentBarriers[0] = makeImageMemoryBarrier
-		(
-			0u,
-			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-			VK_IMAGE_LAYOUT_UNDEFINED,
-			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-			**imageMS,
-			fullImageRange
-		);
-
-		imageOutputAttachmentBarriers[1] = makeImageMemoryBarrier
-		(
-			0u,
-			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-			VK_IMAGE_LAYOUT_UNDEFINED,
-			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-			**imageRS,
-			fullImageRange
-		);
-
-		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 2u, imageOutputAttachmentBarriers);
-	}
-
-	{
-		const VkDeviceSize vertexStartOffset = 0u;
-
-		std::vector<VkClearValue> clearValues;
-		clearValues.push_back(makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)));
-		clearValues.push_back(makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)));
-
-		const vk::VkRect2D renderArea =
-		{
-			makeOffset2D(0u, 0u),
-			makeExtent2D(imageMSInfo.extent.width, imageMSInfo.extent.height),
-		};
-
-		// Begin render pass
-		const VkRenderPassBeginInfo renderPassBeginInfo =
-		{
-			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,		// VkStructureType         sType;
-			DE_NULL,										// const void*             pNext;
-			*renderPass,										// VkRenderPass            renderPass;
-			*framebuffer,									// VkFramebuffer           framebuffer;
-			renderArea,										// VkRect2D                renderArea;
-			static_cast<deUint32>(clearValues.size()),		// deUint32                clearValueCount;
-			&clearValues[0],								// const VkClearValue*     pClearValues;
-		};
-
-		deviceInterface.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
-
-		// Bind graphics pipeline
-		deviceInterface.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
-
-		// Bind vertex buffer
-		deviceInterface.cmdBindVertexBuffers(*commandBuffer, 0u, 1u, &vertexBuffer->get(), &vertexStartOffset);
-
-		// Draw full screen quad
-		deviceInterface.cmdDraw(*commandBuffer, vertexDataDesc.verticesCount, 1u, 0u, 0u);
-
-		// End render pass
-		deviceInterface.cmdEndRenderPass(*commandBuffer);
-	}
-
-	const VkImage sourceImage = m_imageMSParams.numSamples == VK_SAMPLE_COUNT_1_BIT ? **imageMS : **imageRS;
-
-	{
-		const VkImageMemoryBarrier imageTransferSrcBarrier = makeImageMemoryBarrier
-		(
-			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-			VK_ACCESS_TRANSFER_READ_BIT,
-			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-			VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-			sourceImage,
-			fullImageRange
-		);
-
-		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &imageTransferSrcBarrier);
-	}
-
-	// Copy data from resolve image to buffer
-	const deUint32				imageRSSizeInBytes = getImageSizeInBytes(imageRSInfo.extent, imageRSInfo.arrayLayers, m_imageFormat, imageRSInfo.mipLevels);
-
-	const VkBufferCreateInfo	bufferRSInfo = makeBufferCreateInfo(imageRSSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
-	const de::UniquePtr<Buffer>	bufferRS(new Buffer(deviceInterface, device, allocator, bufferRSInfo, MemoryRequirement::HostVisible));
-
-	{
-		const VkBufferImageCopy bufferImageCopy =
-		{
-			0u,																						//	VkDeviceSize				bufferOffset;
-			0u,																						//	deUint32					bufferRowLength;
-			0u,																						//	deUint32					bufferImageHeight;
-			makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, imageRSInfo.arrayLayers),	//	VkImageSubresourceLayers	imageSubresource;
-			makeOffset3D(0, 0, 0),																	//	VkOffset3D					imageOffset;
-			imageRSInfo.extent,																		//	VkExtent3D					imageExtent;
-		};
-
-		deviceInterface.cmdCopyImageToBuffer(*commandBuffer, sourceImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bufferRS->get(), 1u, &bufferImageCopy);
-	}
-
-	{
-		const VkBufferMemoryBarrier bufferRSHostReadBarrier = makeBufferMemoryBarrier
-		(
-			VK_ACCESS_TRANSFER_WRITE_BIT,
-			VK_ACCESS_HOST_READ_BIT,
-			bufferRS->get(),
-			0u,
-			imageRSSizeInBytes
-		);
-
-		deviceInterface.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, DE_NULL, 1u, &bufferRSHostReadBarrier, 0u, DE_NULL);
-	}
-
-	// End recording commands
-	VK_CHECK(deviceInterface.endCommandBuffer(*commandBuffer));
-
-	// Submit commands for execution and wait for completion
-	submitCommandsAndWait(deviceInterface, device, queue, *commandBuffer);
-
-	// Retrieve data from buffer to host memory
-	const Allocation& bufferRSAllocation = bufferRS->getAllocation();
-
-	invalidateMappedMemoryRange(deviceInterface, device, bufferRSAllocation.getMemory(), bufferRSAllocation.getOffset(), imageRSSizeInBytes);
-
-	const tcu::ConstPixelBufferAccess bufferRSData (m_imageFormat,
-													imageRSInfo.extent.width,
-													imageRSInfo.extent.height,
-													imageRSInfo.extent.depth * imageRSInfo.arrayLayers,
-													bufferRSAllocation.getHostPtr());
-
-	std::stringstream imageName;
-	imageName << getImageTypeName(m_imageType) << "_" << bufferRSData.getWidth() << "_" << bufferRSData.getHeight() << "_" << bufferRSData.getDepth() << std::endl;
-
-	m_context.getTestContext().getLog()
-		<< tcu::TestLog::Section(imageName.str(), imageName.str())
-		<< tcu::LogImage("image", "", bufferRSData)
-		<< tcu::TestLog::EndSection;
-
-	return verifyResolvedImage(bufferRSData);
-}
-
-class MSInstanceDistinctValues : public MSInterpolationInstanceBase
+template <typename CaseClassName>
+class MSCase : public MultisampleCaseBase
 {
 public:
-					MSInstanceDistinctValues(Context&				context,
-											 const ImageMSParams&	imageMSParams)
-	: MSInterpolationInstanceBase(context, imageMSParams) {}
+								MSCase			(tcu::TestContext&		testCtx,
+												 const std::string&		name,
+												 const ImageMSParams&	imageMSParams)
+								: MultisampleCaseBase(testCtx, name, imageMSParams) {}
+
+	void						init			(void);
+	void						initPrograms	(vk::SourceCollections& programCollection) const;
+	TestInstance*				createInstance	(Context&				context) const;
+	static MultisampleCaseBase*	createCase		(tcu::TestContext&		testCtx,
+												 const std::string&		name,
+												 const ImageMSParams&	imageMSParams);
+};
+
+template <typename CaseClassName>
+MultisampleCaseBase* MSCase<CaseClassName>::createCase (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
+{
+	return new MSCase<CaseClassName>(testCtx, name, imageMSParams);
+}
+
+template <typename InstanceClassName>
+class MSInstance : public MSInstanceBaseResolve
+{
+public:
+					MSInstance				(Context&							context,
+											 const ImageMSParams&				imageMSParams)
+					: MSInstanceBaseResolve(context, imageMSParams) {}
 
 	VertexDataDesc	getVertexDataDescripton	(void) const;
-	void			uploadVertexData		(const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const;
-	tcu::TestStatus	verifyResolvedImage		(const tcu::ConstPixelBufferAccess&	imageData) const;
-
-protected:
-	struct VertexData
-	{
-		VertexData(const tcu::Vec4& posNdc) : positionNdc(posNdc) {}
-
-		tcu::Vec4 positionNdc;
-	};
+	void			uploadVertexData		(const Allocation&					vertexBufferAllocation,
+											 const VertexDataDesc&				vertexDataDescripton) const;
+	tcu::TestStatus	verifyImageData			(const vk::VkImageCreateInfo&		imageRSInfo,
+											 const tcu::ConstPixelBufferAccess& dataRS) const;
 };
 
-MSInterpolationInstanceBase::VertexDataDesc MSInstanceDistinctValues::getVertexDataDescripton (void) const
+class MSInstanceDistinctValues;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceDistinctValues>::getVertexDataDescripton (void) const
 {
 	VertexDataDesc vertexDataDesc;
 
 	vertexDataDesc.verticesCount		= 3u;
-	vertexDataDesc.dataStride			= sizeof(VertexData);
+	vertexDataDesc.dataStride			= sizeof(VertexDataNdc);
 	vertexDataDesc.dataSize				= vertexDataDesc.verticesCount * vertexDataDesc.dataStride;
 	vertexDataDesc.primitiveTopology	= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
 
@@ -784,7 +129,7 @@
 		0u,										// deUint32	location;
 		0u,										// deUint32	binding;
 		VK_FORMAT_R32G32B32A32_SFLOAT,			// VkFormat	format;
-		DE_OFFSET_OF(VertexData, positionNdc),	// deUint32	offset;
+		DE_OFFSET_OF(VertexDataNdc, positionNdc),	// deUint32	offset;
 	};
 
 	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionNdc);
@@ -792,28 +137,28 @@
 	return vertexDataDesc;
 }
 
-void MSInstanceDistinctValues::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+template<> void MSInstance<MSInstanceDistinctValues>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
 {
-	std::vector<VertexData> vertices;
+	std::vector<VertexDataNdc> vertices;
 
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 0.0f, 1.0f)));
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f, 4.0f, 0.0f, 1.0f)));
-	vertices.push_back(VertexData(tcu::Vec4( 4.0f,-1.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4(-1.0f,  4.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4( 4.0f, -1.0f, 0.0f, 1.0f)));
 
 	deMemcpy(vertexBufferAllocation.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(vertexDataDescripton.dataSize));
 }
 
-tcu::TestStatus	MSInstanceDistinctValues::verifyResolvedImage (const tcu::ConstPixelBufferAccess& imageData) const
+template<> tcu::TestStatus MSInstance<MSInstanceDistinctValues>::verifyImageData (const vk::VkImageCreateInfo& imageRSInfo, const tcu::ConstPixelBufferAccess& dataRS) const
 {
 	const deUint32 distinctValuesExpected = static_cast<deUint32>(m_imageMSParams.numSamples) + 1u;
 
 	std::vector<tcu::IVec4> distinctValues;
 
-	for (deInt32 z = 0u; z < imageData.getDepth();  ++z)
-	for (deInt32 y = 0u; y < imageData.getHeight(); ++y)
-	for (deInt32 x = 0u; x < imageData.getWidth();  ++x)
+	for (deUint32 z = 0u; z < imageRSInfo.extent.depth;	 ++z)
+	for (deUint32 y = 0u; y < imageRSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageRSInfo.extent.width;	 ++x)
 	{
-		const tcu::IVec4 pixel = imageData.getPixelInt(x, y, z);
+		const tcu::IVec4 pixel = dataRS.getPixelInt(x, y, z);
 
 		if (std::find(distinctValues.begin(), distinctValues.end(), pixel) == distinctValues.end())
 			distinctValues.push_back(pixel);
@@ -822,28 +167,12 @@
 	if (distinctValues.size() >= distinctValuesExpected)
 		return tcu::TestStatus::pass("Passed");
 	else
-		return tcu::TestStatus::fail("Failed");
+		return tcu::TestStatus::fail("Expected numSamples+1 different colors in the output image");
 }
 
-class MSCaseSampleQualifierDistinctValues : public MSInterpolationCaseBase
-{
-public:
-					MSCaseSampleQualifierDistinctValues	(tcu::TestContext&		testCtx,
-														 const std::string&		name,
-														 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseSampleQualifierDistinctValues;
 
-	void			init								(void);
-	void			initPrograms						(vk::SourceCollections& programCollection) const;
-	TestInstance*	createInstance						(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseSampleQualifierDistinctValues (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseSampleQualifierDistinctValues(testCtx, name, imageMSParams);
-}
-
-void MSCaseSampleQualifierDistinctValues::init (void)
+template<> void MSCase<MSCaseSampleQualifierDistinctValues>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -852,10 +181,10 @@
 		<< "	=> Resulting image should contain n+1 different colors, where n = sample count.\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseSampleQualifierDistinctValues::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseSampleQualifierDistinctValues>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -882,43 +211,27 @@
 	fs << "#version 440\n"
 		<< "layout(location = 0) sample in vec4 fs_in_position_ndc;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
 		<< "	if(fs_in_position_ndc.y < -2.0*pow(0.5*(fs_in_position_ndc.x + 1.0), 2.0) + 1.0)\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseSampleQualifierDistinctValues::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseSampleQualifierDistinctValues>::createInstance (Context& context) const
 {
-	return new MSInstanceDistinctValues(context, m_imageMSParams);
+	return new MSInstance<MSInstanceDistinctValues>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtSampleDistinctValues : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtSampleDistinctValues	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtSampleDistinctValues;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections& programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtSampleDistinctValues (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtSampleDistinctValues(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtSampleDistinctValues::init (void)
+template<> void MSCase<MSCaseInterpolateAtSampleDistinctValues>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -927,10 +240,10 @@
 		<< "	=> Resulting image should contain n+1 different colors, where n = sample count.\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtSampleDistinctValues::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtSampleDistinctValues>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -957,61 +270,42 @@
 	fs << "#version 440\n"
 		<< "layout(location = 0) in vec4 fs_in_position_ndc;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
 		<< "	const vec4 position_ndc_at_sample = interpolateAtSample(fs_in_position_ndc, gl_SampleID);\n"
 		<< "	if(position_ndc_at_sample.y < -2.0*pow(0.5*(position_ndc_at_sample.x + 1.0), 2.0) + 1.0)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtSampleDistinctValues::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtSampleDistinctValues>::createInstance (Context& context) const
 {
-	return new MSInstanceDistinctValues(context, m_imageMSParams);
+	return new MSInstance<MSInstanceDistinctValues>(context, m_imageMSParams);
 }
 
-class MSInstanceInterpolateScreenPosition : public MSInterpolationInstanceBase
-{
-public:
-					MSInstanceInterpolateScreenPosition	(Context&				context,
-														 const ImageMSParams&	imageMSParams)
-	: MSInterpolationInstanceBase(context, imageMSParams) {}
+class MSInstanceInterpolateScreenPosition;
 
-	VertexDataDesc	getVertexDataDescripton				(void) const;
-	void			uploadVertexData					(const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const;
-	tcu::TestStatus	verifyResolvedImage					(const tcu::ConstPixelBufferAccess&	imageData) const;
-
-protected:
-	struct VertexData
-	{
-		VertexData(const tcu::Vec4& posNdc, const tcu::Vec2& posScreen) : positionNdc(posNdc), positionScreen(posScreen) {}
-
-		tcu::Vec4 positionNdc;
-		tcu::Vec2 positionScreen;
-	};
-};
-
-MSInterpolationInstanceBase::VertexDataDesc MSInstanceInterpolateScreenPosition::getVertexDataDescripton (void) const
+template<> MSInstanceBaseResolve::VertexDataDesc MSInstance<MSInstanceInterpolateScreenPosition>::getVertexDataDescripton (void) const
 {
 	VertexDataDesc vertexDataDesc;
 
 	vertexDataDesc.verticesCount		= 4u;
-	vertexDataDesc.dataStride			= sizeof(VertexData);
+	vertexDataDesc.dataStride			= sizeof(VertexDataNdcScreen);
 	vertexDataDesc.dataSize				= vertexDataDesc.verticesCount * vertexDataDesc.dataStride;
 	vertexDataDesc.primitiveTopology	= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
 
 	const VkVertexInputAttributeDescription vertexAttribPositionNdc =
 	{
-		0u,											// deUint32	location;
-		0u,											// deUint32	binding;
-		VK_FORMAT_R32G32B32A32_SFLOAT,				// VkFormat	format;
-		DE_OFFSET_OF(VertexData, positionNdc),		// deUint32	offset;
+		0u,												// deUint32	location;
+		0u,												// deUint32	binding;
+		VK_FORMAT_R32G32B32A32_SFLOAT,					// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdcScreen, positionNdc),	// deUint32	offset;
 	};
 
 	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionNdc);
@@ -1021,7 +315,7 @@
 		1u,											// deUint32	location;
 		0u,											// deUint32	binding;
 		VK_FORMAT_R32G32_SFLOAT,					// VkFormat	format;
-		DE_OFFSET_OF(VertexData, positionScreen),	// deUint32	offset;
+		DE_OFFSET_OF(VertexDataNdcScreen, positionScreen),	// deUint32	offset;
 	};
 
 	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionScreen);
@@ -1029,50 +323,33 @@
 	return vertexDataDesc;
 }
 
-void MSInstanceInterpolateScreenPosition::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+template<> void MSInstance<MSInstanceInterpolateScreenPosition>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
 {
 	const tcu::UVec3 layerSize		= getLayerSize(IMAGE_TYPE_2D, m_imageMSParams.imageSize);
 	const float		 screenSizeX	= static_cast<float>(layerSize.x());
 	const float		 screenSizeY	= static_cast<float>(layerSize.y());
 
-	std::vector<VertexData> vertices;
+	std::vector<VertexDataNdcScreen> vertices;
 
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f,		 0.0f)));
-	vertices.push_back(VertexData(tcu::Vec4( 1.0f,-1.0f, 0.0f, 1.0f), tcu::Vec2(screenSizeX, 0.0f)));
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f,		 screenSizeY)));
-	vertices.push_back(VertexData(tcu::Vec4( 1.0f, 1.0f, 0.0f, 1.0f), tcu::Vec2(screenSizeX, screenSizeY)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f, 0.0f)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec2(screenSizeX, 0.0f)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4(-1.0f,  1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f, screenSizeY)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4( 1.0f,  1.0f, 0.0f, 1.0f), tcu::Vec2(screenSizeX, screenSizeY)));
 
 	deMemcpy(vertexBufferAllocation.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(vertexDataDescripton.dataSize));
 }
 
-tcu::TestStatus	MSInstanceInterpolateScreenPosition::verifyResolvedImage (const tcu::ConstPixelBufferAccess& imageData) const
+template<> tcu::TestStatus MSInstance<MSInstanceInterpolateScreenPosition>::verifyImageData (const vk::VkImageCreateInfo& imageRSInfo, const tcu::ConstPixelBufferAccess& dataRS) const
 {
-	for (deInt32 z = 0u; z < imageData.getDepth();  ++z)
-	for (deInt32 y = 0u; y < imageData.getHeight(); ++y)
-	for (deInt32 x = 0u; x < imageData.getWidth();  ++x)
-	{
-		const deInt32 firstComponent = imageData.getPixelInt(x, y, z).x();
+	if (checkForError(imageRSInfo, dataRS, 0))
+		return tcu::TestStatus::fail("Failed");
 
-		if (firstComponent > 0)
-			return tcu::TestStatus::fail("Failed");
-	}
 	return tcu::TestStatus::pass("Passed");
 }
 
-class MSCaseInterpolateAtSampleSingleSample : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtSampleSingleSample	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 tcu::UVec3				imageSize)
-	: MSInterpolationCaseBase(testCtx, name, ImageMSParams(VK_SAMPLE_COUNT_1_BIT, imageSize)) {}
+class MSCaseInterpolateAtSampleSingleSample;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections& programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-void MSCaseInterpolateAtSampleSingleSample::init (void)
+template<> void MSCase<MSCaseInterpolateAtSampleSingleSample>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1081,10 +358,10 @@
 		<< "	=> fract(screen space location) should be (about) (0.5, 0.5)\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtSampleSingleSample::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtSampleSingleSample>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1112,7 +389,7 @@
 	fs << "#version 440\n"
 		<< "layout(location = 0) in vec2 fs_in_position_screen;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1121,38 +398,22 @@
 		<< "	const vec2  position_inside_pixel		= fract(position_screen_at_sample);\n"
 		<< "\n"
 		<< "	if (abs(position_inside_pixel.x - 0.5) <= threshold && abs(position_inside_pixel.y - 0.5) <= threshold)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtSampleSingleSample::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtSampleSingleSample>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtSampleIgnoresCentroid : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtSampleIgnoresCentroid(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtSampleIgnoresCentroid;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections& programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtSampleIgnoresCentroid (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtSampleIgnoresCentroid(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtSampleIgnoresCentroid::init (void)
+template<> void MSCase<MSCaseInterpolateAtSampleIgnoresCentroid>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1161,10 +422,10 @@
 		<< "	=> interpolateAtSample(screenSample, n) ~= interpolateAtSample(screenCentroid, n)\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtSampleIgnoresCentroid::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtSampleIgnoresCentroid>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1195,7 +456,7 @@
 		<< "layout(location = 0) centroid in vec2 fs_in_pos_screen_centroid;\n"
 		<< "layout(location = 1)		  in vec2 fs_in_pos_screen_fragment;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1206,38 +467,22 @@
 		<< "	const bool valuesEqual = all(lessThan(abs(position_a - position_b), vec2(threshold)));\n"
 		<< "\n"
 		<< "	if (valuesEqual)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtSampleIgnoresCentroid::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtSampleIgnoresCentroid>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtSampleConsistency : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtSampleConsistency	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtSampleConsistency;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections&	programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtSampleConsistency (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtSampleConsistency(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtSampleConsistency::init (void)
+template<> void MSCase<MSCaseInterpolateAtSampleConsistency>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1246,10 +491,10 @@
 		<< "	=> interpolateAtSample(screenCentroid, sampleID) = screenSample\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtSampleConsistency::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtSampleConsistency>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1280,7 +525,7 @@
 		<< "layout(location = 0) centroid in vec2 fs_in_pos_screen_centroid;\n"
 		<< "layout(location = 1) sample   in vec2 fs_in_pos_screen_sample;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1290,38 +535,22 @@
 		<< "	const bool  valuesEqual				   = all(lessThan(abs(pos_interpolated_at_sample - fs_in_pos_screen_sample), vec2(threshold)));\n"
 		<< "\n"
 		<< "	if (valuesEqual)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtSampleConsistency::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtSampleConsistency>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtCentroidConsistency : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtCentroidConsistency	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtCentroidConsistency;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections&	programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtCentroidConsistency (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtCentroidConsistency(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtCentroidConsistency::init (void)
+template<> void MSCase<MSCaseInterpolateAtCentroidConsistency>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1330,10 +559,10 @@
 		<< "	=> interpolateAtCentroid(screenSample) = screenCentroid\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtCentroidConsistency::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtCentroidConsistency>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1364,7 +593,7 @@
 		<< "layout(location = 0) sample   in vec2 fs_in_pos_screen_sample;\n"
 		<< "layout(location = 1) centroid in vec2 fs_in_pos_screen_centroid;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1374,38 +603,22 @@
 		<< "	const bool valuesEqual					= all(lessThan(abs(pos_interpolated_at_centroid - fs_in_pos_screen_centroid), vec2(threshold)));\n"
 		<< "\n"
 		<< "	if (valuesEqual)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtCentroidConsistency::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtCentroidConsistency>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtOffsetPixelCenter : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtOffsetPixelCenter(tcu::TestContext&		testCtx,
-														 const std::string&		name,
-														 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtOffsetPixelCenter;
 
-	void			init								(void);
-	void			initPrograms						(vk::SourceCollections&	programCollection) const;
-	TestInstance*	createInstance						(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtOffsetPixelCenter (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtOffsetPixelCenter(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtOffsetPixelCenter::init (void)
+template<> void MSCase<MSCaseInterpolateAtOffsetPixelCenter>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1414,10 +627,10 @@
 		<< "	=> interpolateAtOffset(screen, offset) should be \"varying value at the pixel center\" + offset"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtOffsetPixelCenter::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtOffsetPixelCenter>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1448,7 +661,7 @@
 		<< "layout(location = 0) in  vec2 fs_in_pos_screen;\n"
 		<< "layout(location = 1) in  vec2 fs_in_offset;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1465,38 +678,22 @@
 		<< "    }\n"
 		<< "\n"
 		<< "    if (valuesEqual)\n"
-		<< "        fs_out_color = vec2(0.0, 1.0);\n"
+		<< "        fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "    else\n"
-		<< "        fs_out_color = vec2(1.0, 0.0);\n"
+		<< "        fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtOffsetPixelCenter::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtOffsetPixelCenter>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSCaseInterpolateAtOffsetSamplePosition : public MSInterpolationCaseBase
-{
-public:
-					MSCaseInterpolateAtOffsetSamplePosition	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseInterpolateAtOffsetSamplePosition;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections&	programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseInterpolateAtOffsetSamplePosition (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseInterpolateAtOffsetSamplePosition(testCtx, name, imageMSParams);
-}
-
-void MSCaseInterpolateAtOffsetSamplePosition::init (void)
+template<> void MSCase<MSCaseInterpolateAtOffsetSamplePosition>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1506,10 +703,10 @@
 		<< "	=> interpolateAtOffset(screenFragment, samplePosition - (0.5,0.5)) = screenSample"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseInterpolateAtOffsetSamplePosition::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseInterpolateAtOffsetSamplePosition>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1540,7 +737,7 @@
 		<< "layout(location = 0)		in vec2 fs_in_pos_screen_fragment;\n"
 		<< "layout(location = 1) sample in vec2 fs_in_pos_screen_sample;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
@@ -1551,65 +748,46 @@
 		<< "	const bool valuesEqual				  = all(lessThan(abs(pos_interpolated_at_offset - fs_in_pos_screen_sample), vec2(threshold)));\n"
 		<< "\n"
 		<< "	if (valuesEqual)\n"
-		<< "		fs_out_color = vec2(0.0, 1.0);\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "		fs_out_color = vec2(1.0, 0.0);\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseInterpolateAtOffsetSamplePosition::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseInterpolateAtOffsetSamplePosition>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateScreenPosition(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
 }
 
-class MSInstanceInterpolateBarycentricCoordinates : public MSInterpolationInstanceBase
-{
-public:
-					MSInstanceInterpolateBarycentricCoordinates	(Context&				context,
-																 const ImageMSParams&	imageMSParams)
-	: MSInterpolationInstanceBase(context, imageMSParams) {}
+class MSInstanceInterpolateBarycentricCoordinates;
 
-	VertexDataDesc	getVertexDataDescripton						(void) const;
-	void			uploadVertexData							(const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const;
-	tcu::TestStatus	verifyResolvedImage							(const tcu::ConstPixelBufferAccess&	imageData) const;
-
-protected:
-	struct VertexData
-	{
-		VertexData(const tcu::Vec4& posNdc, const tcu::Vec3& barCoord) : positionNdc(posNdc), barycentricCoord(barCoord) {}
-
-		tcu::Vec4 positionNdc;
-		tcu::Vec3 barycentricCoord;
-	};
-};
-
-MSInterpolationInstanceBase::VertexDataDesc MSInstanceInterpolateBarycentricCoordinates::getVertexDataDescripton (void) const
+template<> MSInstanceBaseResolve::VertexDataDesc MSInstance<MSInstanceInterpolateBarycentricCoordinates>::getVertexDataDescripton (void) const
 {
 	VertexDataDesc vertexDataDesc;
 
 	vertexDataDesc.verticesCount		= 3u;
-	vertexDataDesc.dataStride			= sizeof(VertexData);
+	vertexDataDesc.dataStride			= sizeof(VertexDataNdcBarycentric);
 	vertexDataDesc.dataSize				= vertexDataDesc.verticesCount * vertexDataDesc.dataStride;
 	vertexDataDesc.primitiveTopology	= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
 
 	const VkVertexInputAttributeDescription vertexAttribPositionNdc =
 	{
-		0u,											// deUint32	location;
-		0u,											// deUint32	binding;
-		VK_FORMAT_R32G32B32A32_SFLOAT,				// VkFormat	format;
-		DE_OFFSET_OF(VertexData, positionNdc),		// deUint32	offset;
+		0u,															// deUint32	location;
+		0u,															// deUint32	binding;
+		VK_FORMAT_R32G32B32A32_SFLOAT,								// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdcBarycentric, positionNdc),		// deUint32	offset;
 	};
 
 	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionNdc);
 
 	const VkVertexInputAttributeDescription vertexAttrBarCoord =
 	{
-		1u,											// deUint32	location;
-		0u,											// deUint32	binding;
-		VK_FORMAT_R32G32B32_SFLOAT,					// VkFormat	format;
-		DE_OFFSET_OF(VertexData, barycentricCoord),	// deUint32	offset;
+		1u,															// deUint32	location;
+		0u,															// deUint32	binding;
+		VK_FORMAT_R32G32B32_SFLOAT,									// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdcBarycentric, barycentricCoord),	// deUint32	offset;
 	};
 
 	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttrBarCoord);
@@ -1617,52 +795,29 @@
 	return vertexDataDesc;
 }
 
-void MSInstanceInterpolateBarycentricCoordinates::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+template<> void MSInstance<MSInstanceInterpolateBarycentricCoordinates>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
 {
 	// Create buffer storing vertex data
-	std::vector<VertexData> vertices;
+	std::vector<VertexDataNdcBarycentric> vertices;
 
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 0.0f, 1.0f), tcu::Vec3(0.0f, 0.0f, 1.0f)));
-	vertices.push_back(VertexData(tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f), tcu::Vec3(1.0f, 0.0f, 0.0f)));
-	vertices.push_back(VertexData(tcu::Vec4( 1.0f,-1.0f, 0.0f, 1.0f), tcu::Vec3(0.0f, 1.0f, 0.0f)));
+	vertices.push_back(VertexDataNdcBarycentric(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec3(0.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdcBarycentric(tcu::Vec4(-1.0f,  1.0f, 0.0f, 1.0f), tcu::Vec3(1.0f, 0.0f, 0.0f)));
+	vertices.push_back(VertexDataNdcBarycentric(tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec3(0.0f, 1.0f, 0.0f)));
 
 	deMemcpy(vertexBufferAllocation.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(vertexDataDescripton.dataSize));
 }
 
-tcu::TestStatus MSInstanceInterpolateBarycentricCoordinates::verifyResolvedImage (const tcu::ConstPixelBufferAccess& imageData) const
+template<> tcu::TestStatus MSInstance<MSInstanceInterpolateBarycentricCoordinates>::verifyImageData (const vk::VkImageCreateInfo& imageRSInfo, const tcu::ConstPixelBufferAccess& dataRS) const
 {
-	for (deInt32 z = 0u; z < imageData.getDepth();  ++z)
-	for (deInt32 y = 0u; y < imageData.getHeight(); ++y)
-	for (deInt32 x = 0u; x < imageData.getWidth();  ++x)
-	{
-		const deInt32 firstComponent = imageData.getPixelInt(x, y, z).x();
-
-		if (firstComponent > 0)
-			return tcu::TestStatus::fail("Failed");
-	}
+	if (checkForError(imageRSInfo, dataRS, 0))
+		return tcu::TestStatus::fail("Failed");
 
 	return tcu::TestStatus::pass("Passed");
 }
 
-class MSCaseCentroidQualifierInsidePrimitive : public MSInterpolationCaseBase
-{
-public:
-					MSCaseCentroidQualifierInsidePrimitive	(tcu::TestContext&		testCtx,
-															 const std::string&		name,
-															 const ImageMSParams&	imageMSParams)
-	: MSInterpolationCaseBase(testCtx, name, imageMSParams) {}
+class MSCaseCentroidQualifierInsidePrimitive;
 
-	void			init									(void);
-	void			initPrograms							(vk::SourceCollections&	programCollection) const;
-	TestInstance*	createInstance							(Context&				context) const;
-};
-
-MSInterpolationCaseBase* createMSCaseCentroidQualifierInsidePrimitive (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
-{
-	return new MSCaseCentroidQualifierInsidePrimitive(testCtx, name, imageMSParams);
-}
-
-void MSCaseCentroidQualifierInsidePrimitive::init (void)
+template<> void MSCase<MSCaseCentroidQualifierInsidePrimitive>::init (void)
 {
 	m_testCtx.getLog()
 		<< tcu::TestLog::Message
@@ -1671,10 +826,10 @@
 		<< "	=> After interpolation we expect barycentric.xyz >= 0.0 && barycentric.xyz <= 1.0\n"
 		<< tcu::TestLog::EndMessage;
 
-	MSInterpolationCaseBase::init();
+	MultisampleCaseBase::init();
 }
 
-void MSCaseCentroidQualifierInsidePrimitive::initPrograms (vk::SourceCollections& programCollection) const
+template<> void MSCase<MSCaseCentroidQualifierInsidePrimitive>::initPrograms (vk::SourceCollections& programCollection) const
 {
 	// Create vertex shader
 	std::ostringstream vs;
@@ -1702,58 +857,26 @@
 	fs << "#version 440\n"
 		<< "layout(location = 0) centroid in vec3 fs_in_barCoord;\n"
 		<< "\n"
-		<< "layout(location = 0) out vec2 fs_out_color;\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
 		<< "\n"
 		<< "void main (void)\n"
 		<< "{\n"
 		<< "	if( all(greaterThanEqual(fs_in_barCoord, vec3(0.0))) && all(lessThanEqual(fs_in_barCoord, vec3(1.0))) )\n"
-		<< "			fs_out_color = vec2(0.0, 1.0);\n"
+		<< "			fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
 		<< "	else\n"
-		<< "			fs_out_color = vec2(1.0, 0.0);\n"
+		<< "			fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
 		<< "}\n";
 
 	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
 }
 
-TestInstance* MSCaseCentroidQualifierInsidePrimitive::createInstance (Context& context) const
+template<> TestInstance* MSCase<MSCaseCentroidQualifierInsidePrimitive>::createInstance (Context& context) const
 {
-	return new MSInstanceInterpolateBarycentricCoordinates(context, m_imageMSParams);
+	return new MSInstance<MSInstanceInterpolateBarycentricCoordinates>(context, m_imageMSParams);
 }
 
 } // multisample
 
-tcu::TestCaseGroup* makeGroup(	multisample::MSInterpolationCaseFuncPtr	createCaseFuncPtr,
-								tcu::TestContext&						testCtx,
-								const std::string						groupName,
-								const tcu::UVec3						imageSizes[],
-								const deUint32							imageSizesElemCount,
-								const vk::VkSampleCountFlagBits			imageSamples[],
-								const deUint32							imageSamplesElemCount)
-{
-	de::MovePtr<tcu::TestCaseGroup> caseGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), ""));
-
-	for (deUint32 imageSizeNdx = 0u; imageSizeNdx < imageSizesElemCount; ++imageSizeNdx)
-	{
-		const tcu::UVec3	imageSize = imageSizes[imageSizeNdx];
-		std::ostringstream	imageSizeStream;
-
-		imageSizeStream << imageSize.x() << "_" << imageSize.y() << "_" << imageSize.z();
-
-		de::MovePtr<tcu::TestCaseGroup> sizeGroup(new tcu::TestCaseGroup(testCtx, imageSizeStream.str().c_str(), ""));
-
-		for (deUint32 imageSamplesNdx = 0u; imageSamplesNdx < imageSamplesElemCount; ++imageSamplesNdx)
-		{
-			const vk::VkSampleCountFlagBits		samples			= imageSamples[imageSamplesNdx];
-			const multisample::ImageMSParams	imageMSParams	= multisample::ImageMSParams(samples, imageSize);
-
-			sizeGroup->addChild(createCaseFuncPtr(testCtx, "samples_" + de::toString(samples), imageMSParams));
-		}
-
-		caseGroup->addChild(sizeGroup.release());
-	}
-	return caseGroup.release();
-}
-
 tcu::TestCaseGroup* createMultisampleInterpolationTests (tcu::TestContext& testCtx)
 {
 	de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "multisample_interpolation", "Multisample Interpolation"));
@@ -1789,21 +912,21 @@
 
 		de::MovePtr<tcu::TestCaseGroup> sizeGroup(new tcu::TestCaseGroup(testCtx, imageSizeStream.str().c_str(), ""));
 
-		sizeGroup->addChild(new multisample::MSCaseInterpolateAtSampleSingleSample(testCtx, "samples_" + de::toString(1), imageSize));
+		sizeGroup->addChild(multisample::MSCase<multisample::MSCaseInterpolateAtSampleSingleSample>::createCase(testCtx, "samples_" + de::toString(1), multisample::ImageMSParams(vk::VK_SAMPLE_COUNT_1_BIT, imageSize)));
 
 		caseGroup->addChild(sizeGroup.release());
 	}
 
 	testGroup->addChild(caseGroup.release());
 
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtSampleDistinctValues,	testCtx, "sample_interpolate_at_distinct_values",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtSampleIgnoresCentroid,	testCtx, "sample_interpolate_at_ignores_centroid",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtSampleConsistency,		testCtx, "sample_interpolate_at_consistency",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseSampleQualifierDistinctValues,		testCtx, "sample_qualifier_distinct_values",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtCentroidConsistency,	testCtx, "centroid_interpolate_at_consistency",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseCentroidQualifierInsidePrimitive,	testCtx, "centroid_qualifier_inside_primitive",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtOffsetPixelCenter,		testCtx, "offset_interpolate_at_pixel_center",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
-	testGroup->addChild(makeGroup(multisample::createMSCaseInterpolateAtOffsetSamplePosition,	testCtx, "offset_interpolate_at_sample_position",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtSampleDistinctValues> >	(testCtx, "sample_interpolate_at_distinct_values",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtSampleIgnoresCentroid> >(testCtx, "sample_interpolate_at_ignores_centroid",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtSampleConsistency> >	(testCtx, "sample_interpolate_at_consistency",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleQualifierDistinctValues> >		(testCtx, "sample_qualifier_distinct_values",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtCentroidConsistency> >	(testCtx, "centroid_interpolate_at_consistency",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseCentroidQualifierInsidePrimitive> >	(testCtx, "centroid_qualifier_inside_primitive",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtOffsetPixelCenter> >	(testCtx, "offset_interpolate_at_pixel_center",		imageSizes, sizesElemCount, imageSamples, samplesElemCount));
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseInterpolateAtOffsetSamplePosition> >	(testCtx, "offset_interpolate_at_sample_position",	imageSizes, sizesElemCount, imageSamples, samplesElemCount));
 
 	return testGroup.release();
 }
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.hpp
index c4052ca..74ae7ca 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.hpp
@@ -4,8 +4,7 @@
  * Vulkan Conformance Tests
  * ------------------------
  *
- * Copyright (c) 2015 The Khronos Group Inc.
- * Copyright (c) 2015 Imagination Technologies Ltd.
+ * Copyright (c) 2016 The Khronos Group Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.cpp
new file mode 100644
index 0000000..344cf9e
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.cpp
@@ -0,0 +1,1077 @@
+/*------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleShaderBuiltInTests.cpp
+* \brief Multisample Shader BuiltIn Tests
+*//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleShaderBuiltInTests.hpp"
+#include "vktPipelineMultisampleBaseResolveAndPerSampleFetch.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "tcuVectorUtil.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace multisample
+{
+
+using namespace vk;
+
+struct VertexDataNdc
+{
+	VertexDataNdc (const tcu::Vec4& posNdc) : positionNdc(posNdc) {}
+
+	tcu::Vec4 positionNdc;
+};
+
+MultisampleInstanceBase::VertexDataDesc getVertexDataDescriptonNdc (void)
+{
+	MultisampleInstanceBase::VertexDataDesc vertexDataDesc;
+
+	vertexDataDesc.verticesCount	 = 4u;
+	vertexDataDesc.dataStride		 = sizeof(VertexDataNdc);
+	vertexDataDesc.dataSize			 = vertexDataDesc.verticesCount * vertexDataDesc.dataStride;
+	vertexDataDesc.primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+
+	const VkVertexInputAttributeDescription vertexAttribPositionNdc =
+	{
+		0u,											// deUint32	location;
+		0u,											// deUint32	binding;
+		VK_FORMAT_R32G32B32A32_SFLOAT,				// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdc, positionNdc),	// deUint32	offset;
+	};
+
+	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionNdc);
+
+	return vertexDataDesc;
+}
+
+void uploadVertexDataNdc (const Allocation& vertexBufferAllocation, const MultisampleInstanceBase::VertexDataDesc& vertexDataDescripton)
+{
+	std::vector<VertexDataNdc> vertices;
+
+	vertices.push_back(VertexDataNdc(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4(-1.0f,  1.0f, 0.0f, 1.0f)));
+	vertices.push_back(VertexDataNdc(tcu::Vec4( 1.0f,  1.0f, 0.0f, 1.0f)));
+
+	deMemcpy(vertexBufferAllocation.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(vertexDataDescripton.dataSize));
+}
+
+struct VertexDataNdcScreen
+{
+	VertexDataNdcScreen (const tcu::Vec4& posNdc, const tcu::Vec2& posScreen) : positionNdc(posNdc), positionScreen(posScreen) {}
+
+	tcu::Vec4 positionNdc;
+	tcu::Vec2 positionScreen;
+};
+
+MultisampleInstanceBase::VertexDataDesc getVertexDataDescriptonNdcScreen (void)
+{
+	MultisampleInstanceBase::VertexDataDesc vertexDataDesc;
+
+	vertexDataDesc.verticesCount	 = 4u;
+	vertexDataDesc.dataStride		 = sizeof(VertexDataNdcScreen);
+	vertexDataDesc.dataSize			 = vertexDataDesc.verticesCount * vertexDataDesc.dataStride;
+	vertexDataDesc.primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+
+	const VkVertexInputAttributeDescription vertexAttribPositionNdc =
+	{
+		0u,													// deUint32	location;
+		0u,													// deUint32	binding;
+		VK_FORMAT_R32G32B32A32_SFLOAT,						// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdcScreen, positionNdc),		// deUint32	offset;
+	};
+
+	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionNdc);
+
+	const VkVertexInputAttributeDescription vertexAttribPositionScreen =
+	{
+		1u,													// deUint32	location;
+		0u,													// deUint32	binding;
+		VK_FORMAT_R32G32_SFLOAT,							// VkFormat	format;
+		DE_OFFSET_OF(VertexDataNdcScreen, positionScreen),	// deUint32	offset;
+	};
+
+	vertexDataDesc.vertexAttribDescVec.push_back(vertexAttribPositionScreen);
+
+	return vertexDataDesc;
+}
+
+void uploadVertexDataNdcScreen (const Allocation& vertexBufferAllocation, const MultisampleInstanceBase::VertexDataDesc& vertexDataDescripton, const tcu::Vec2& screenSize)
+{
+	std::vector<VertexDataNdcScreen> vertices;
+
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f, 0.0f)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f), tcu::Vec2(screenSize.x(), 0.0f)));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4(-1.0f,  1.0f, 0.0f, 1.0f), tcu::Vec2(0.0f, screenSize.y())));
+	vertices.push_back(VertexDataNdcScreen(tcu::Vec4( 1.0f,  1.0f, 0.0f, 1.0f), tcu::Vec2(screenSize.x(), screenSize.y())));
+
+	deMemcpy(vertexBufferAllocation.getHostPtr(), dataPointer(vertices), static_cast<std::size_t>(vertexDataDescripton.dataSize));
+}
+
+bool checkForErrorMS (const vk::VkImageCreateInfo& imageMSInfo, const std::vector<tcu::ConstPixelBufferAccess>& dataPerSample, const deUint32 errorCompNdx)
+{
+	const deUint32 numSamples = static_cast<deUint32>(imageMSInfo.samples);
+
+	for (deUint32 z = 0u; z < imageMSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageMSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageMSInfo.extent.width;  ++x)
+	{
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			const deUint32 errorComponent = dataPerSample[sampleNdx].getPixelUint(x, y, z)[errorCompNdx];
+
+			if (errorComponent > 0)
+				return true;
+		}
+	}
+
+	return false;
+}
+
+bool checkForErrorRS (const vk::VkImageCreateInfo& imageRSInfo, const tcu::ConstPixelBufferAccess& dataRS, const deUint32 errorCompNdx)
+{
+	for (deUint32 z = 0u; z < imageRSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageRSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageRSInfo.extent.width;  ++x)
+	{
+		const deUint32 errorComponent = dataRS.getPixelUint(x, y, z)[errorCompNdx];
+
+		if (errorComponent > 0)
+			return true;
+	}
+
+	return false;
+}
+
+template <typename CaseClassName>
+class MSCase : public MSCaseBaseResolveAndPerSampleFetch
+{
+public:
+								MSCase			(tcu::TestContext&		testCtx,
+												 const std::string&		name,
+												 const ImageMSParams&	imageMSParams)
+								: MSCaseBaseResolveAndPerSampleFetch(testCtx, name, imageMSParams) {}
+
+	void						init			(void);
+	void						initPrograms	(vk::SourceCollections& programCollection) const;
+	TestInstance*				createInstance	(Context&				context) const;
+	static MultisampleCaseBase*	createCase		(tcu::TestContext&		testCtx,
+												 const std::string&		name,
+												 const ImageMSParams&	imageMSParams);
+};
+
+template <typename CaseClassName>
+MultisampleCaseBase* MSCase<CaseClassName>::createCase (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
+{
+	return new MSCase<CaseClassName>(testCtx, name, imageMSParams);
+}
+
+template <typename InstanceClassName>
+class MSInstance : public MSInstanceBaseResolveAndPerSampleFetch
+{
+public:
+					MSInstance				(Context&											context,
+											 const ImageMSParams&								imageMSParams)
+					: MSInstanceBaseResolveAndPerSampleFetch(context, imageMSParams) {}
+
+	VertexDataDesc	getVertexDataDescripton	(void) const;
+	void			uploadVertexData		(const Allocation&									vertexBufferAllocation,
+											 const VertexDataDesc&								vertexDataDescripton) const;
+
+	tcu::TestStatus	verifyImageData			(const vk::VkImageCreateInfo&						imageMSInfo,
+											 const vk::VkImageCreateInfo&						imageRSInfo,
+											 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+											 const tcu::ConstPixelBufferAccess&					dataRS) const;
+};
+
+class MSInstanceSampleID;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSampleID>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+template<> void MSInstance<MSInstanceSampleID>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSampleID>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																			 const vk::VkImageCreateInfo&						imageRSInfo,
+																			 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																			 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	DE_UNREF(imageRSInfo);
+	DE_UNREF(dataRS);
+
+	const deUint32 numSamples = static_cast<deUint32>(imageMSInfo.samples);
+
+	for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+	{
+		for (deUint32 z = 0u; z < imageMSInfo.extent.depth;  ++z)
+		for (deUint32 y = 0u; y < imageMSInfo.extent.height; ++y)
+		for (deUint32 x = 0u; x < imageMSInfo.extent.width;  ++x)
+		{
+			const deUint32 sampleID = dataPerSample[sampleNdx].getPixelUint(x, y, z).x();
+
+			if (sampleID != sampleNdx)
+				return tcu::TestStatus::fail("gl_SampleID does not have correct value");
+		}
+	}
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSampleID;
+
+template<> void MSCase<MSCaseSampleID>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Writing gl_SampleID to the red channel of the texture and verifying texture values.\n"
+		<< "Expecting value N at sample index N of a multisample texture.\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSampleID>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	fs_out_color = vec4(float(gl_SampleID) / float(255), 0.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSampleID>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSampleID>(context, m_imageMSParams);
+}
+
+class MSInstanceSamplePosDistribution;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSamplePosDistribution>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+template<> void MSInstance<MSInstanceSamplePosDistribution>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSamplePosDistribution>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																						 const vk::VkImageCreateInfo&						imageRSInfo,
+																						 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																						 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	const deUint32 numSamples = static_cast<deUint32>(imageMSInfo.samples);
+
+	// approximate Bates distribution as normal
+	const float variance = (1.0f / (12.0f * (float)numSamples));
+	const float standardDeviation = deFloatSqrt(variance);
+
+	// 95% of means of sample positions are within 2 standard deviations if
+	// they were randomly assigned. Sample patterns are expected to be more
+	// uniform than a random pattern.
+	const float distanceThreshold = 2.0f * standardDeviation;
+
+	for (deUint32 z = 0u; z < imageRSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageRSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageRSInfo.extent.width;  ++x)
+	{
+		const deUint32 errorComponent = dataRS.getPixelUint(x, y, z).z();
+
+		if (errorComponent > 0)
+			return tcu::TestStatus::fail("gl_SamplePosition is not within interval [0,1]");
+
+		if (numSamples >= VK_SAMPLE_COUNT_4_BIT)
+		{
+			const tcu::Vec2 averageSamplePos	= tcu::Vec2((float)dataRS.getPixelUint(x, y, z).x() / 255.0f, (float)dataRS.getPixelUint(x, y, z).y() / 255.0f);
+			const tcu::Vec2	distanceFromCenter	= tcu::abs(averageSamplePos - tcu::Vec2(0.5f, 0.5f));
+
+			if (distanceFromCenter.x() > distanceThreshold || distanceFromCenter.y() > distanceThreshold)
+				return tcu::TestStatus::fail("Sample positions are not uniformly distributed within the pixel");
+		}
+	}
+
+	for (deUint32 z = 0u; z < imageMSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageMSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageMSInfo.extent.width;  ++x)
+	{
+		std::vector<tcu::Vec2> samplePositions(numSamples);
+
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			const deUint32 errorComponent = dataPerSample[sampleNdx].getPixelUint(x, y, z).z();
+
+			if (errorComponent > 0)
+				return tcu::TestStatus::fail("gl_SamplePosition is not within interval [0,1]");
+
+			samplePositions[sampleNdx] = tcu::Vec2( (float)dataPerSample[sampleNdx].getPixelUint(x, y, z).x() / 255.0f,
+													(float)dataPerSample[sampleNdx].getPixelUint(x, y, z).y() / 255.0f);
+		}
+
+		for (deUint32 sampleNdxA = 0u;				sampleNdxA < numSamples; ++sampleNdxA)
+		for (deUint32 sampleNdxB = sampleNdxA + 1u; sampleNdxB < numSamples; ++sampleNdxB)
+		{
+			if (samplePositions[sampleNdxA] == samplePositions[sampleNdxB])
+				return tcu::TestStatus::fail("Two samples have the same position");
+		}
+
+		if (numSamples >= VK_SAMPLE_COUNT_4_BIT)
+		{
+			tcu::Vec2 averageSamplePos(0.0f, 0.0f);
+
+			for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+			{
+				averageSamplePos.x() += samplePositions[sampleNdx].x();
+				averageSamplePos.y() += samplePositions[sampleNdx].y();
+			}
+
+			averageSamplePos.x() /= (float)numSamples;
+			averageSamplePos.y() /= (float)numSamples;
+
+			const tcu::Vec2	distanceFromCenter = tcu::abs(averageSamplePos - tcu::Vec2(0.5f, 0.5f));
+
+			if (distanceFromCenter.x() > distanceThreshold || distanceFromCenter.y() > distanceThreshold)
+				return tcu::TestStatus::fail("Sample positions are not uniformly distributed within the pixel");
+		}
+	}
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSamplePosDistribution;
+
+template<> void MSCase<MSCaseSamplePosDistribution>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Verifying gl_SamplePosition value with multisample targets:\n"
+		<< "	a) Expect legal sample position.\n"
+		<< "	b) Sample position is unique within the set of all sample positions of a pixel.\n"
+		<< "	c) Sample position distribution is uniform or almost uniform.\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSamplePosDistribution>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	if (gl_SamplePosition.x < 0.0 || gl_SamplePosition.x > 1.0 || gl_SamplePosition.y < 0.0 || gl_SamplePosition.y > 1.0)\n"
+		"		fs_out_color = vec4(0.0, 0.0, 1.0, 1.0);\n"
+		"	else\n"
+		"		fs_out_color = vec4(gl_SamplePosition.x, gl_SamplePosition.y, 0.0, 1.0);\n"
+		"}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSamplePosDistribution>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSamplePosDistribution>(context, m_imageMSParams);
+}
+
+class MSInstanceSamplePosCorrectness;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSamplePosCorrectness>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdcScreen();
+}
+
+template<> void MSInstance<MSInstanceSamplePosCorrectness>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	const tcu::UVec3 layerSize = getLayerSize(IMAGE_TYPE_2D, m_imageMSParams.imageSize);
+
+	uploadVertexDataNdcScreen(vertexBufferAllocation, vertexDataDescripton, tcu::Vec2(static_cast<float>(layerSize.x()), static_cast<float>(layerSize.y())));
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSamplePosCorrectness>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																						 const vk::VkImageCreateInfo&						imageRSInfo,
+																						 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																						 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	if (checkForErrorMS(imageMSInfo, dataPerSample, 0))
+		return tcu::TestStatus::fail("Varying values are not sampled at gl_SamplePosition");
+
+	if (checkForErrorRS(imageRSInfo, dataRS, 0))
+		return tcu::TestStatus::fail("Varying values are not sampled at gl_SamplePosition");
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSamplePosCorrectness;
+
+template<> void MSCase<MSCaseSamplePosCorrectness>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Verifying gl_SamplePosition correctness:\n"
+		<< "	1) Varying values should be sampled at the sample position.\n"
+		<< "		=> fract(position_screen) == gl_SamplePosition\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSamplePosCorrectness>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shaders
+	std::ostringstream vs;
+
+	vs	<< "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "layout(location = 1) in vec2 vs_in_position_screen;\n"
+		<< "\n"
+		<< "layout(location = 0) sample out vec2 vs_out_position_screen;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position				= vs_in_position_ndc;\n"
+		<< "	vs_out_position_screen	= vs_in_position_screen;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs	<< "#version 440\n"
+		<< "layout(location = 0) sample in vec2 fs_in_position_screen;\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	const float threshold = 0.15625; // 4 subpixel bits. Assume 3 accurate bits + 0.03125 for other errors\n"
+		<< "	const ivec2 nearby_pixel = ivec2(floor(fs_in_position_screen));\n"
+		<< "	bool ok	= false;\n"
+		<< "\n"
+		<< "	// sample at edge + inaccuaries may cause us to round to any neighboring pixel\n"
+		<< "	// check all neighbors for any match\n"
+		<< "	for (int dy = -1; dy <= 1; ++dy)\n"
+		<< "	for (int dx = -1; dx <= 1; ++dx)\n"
+		<< "	{\n"
+		<< "		ivec2 current_pixel			= nearby_pixel + ivec2(dx, dy);\n"
+		<< "		vec2 position_inside_pixel	= vec2(current_pixel) + gl_SamplePosition;\n"
+		<< "		vec2 position_diff			= abs(position_inside_pixel - fs_in_position_screen);\n"
+		<< "\n"
+		<< "		if (all(lessThan(position_diff, vec2(threshold))))\n"
+		<< "			ok = true;\n"
+		<< "	}\n"
+		<< "\n"
+		<< "	if (ok)\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
+		<< "	else\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSamplePosCorrectness>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSamplePosCorrectness>(context, m_imageMSParams);
+}
+
+class MSInstanceSampleMaskPattern : public MSInstanceBaseResolveAndPerSampleFetch
+{
+public:
+											MSInstanceSampleMaskPattern	(Context&											context,
+																		 const ImageMSParams&								imageMSParams);
+
+	VkPipelineMultisampleStateCreateInfo	getMSStateCreateInfo		(const ImageMSParams&								imageMSParams) const;
+
+	const VkDescriptorSetLayout*			createMSPassDescSetLayout	(const ImageMSParams&								imageMSParams);
+
+	const VkDescriptorSet*					createMSPassDescSet			(const ImageMSParams&								imageMSParams,
+																		 const VkDescriptorSetLayout*						descSetLayout);
+
+	VertexDataDesc							getVertexDataDescripton		(void) const;
+
+	void									uploadVertexData			(const Allocation&									vertexBufferAllocation,
+																		 const VertexDataDesc&								vertexDataDescripton) const;
+
+	tcu::TestStatus							verifyImageData				(const vk::VkImageCreateInfo&						imageMSInfo,
+																		 const vk::VkImageCreateInfo&						imageRSInfo,
+																		 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																		 const tcu::ConstPixelBufferAccess&					dataRS) const;
+protected:
+
+	VkSampleMask				m_sampleMask;
+	Move<VkDescriptorSetLayout>	m_descriptorSetLayout;
+	Move<VkDescriptorPool>		m_descriptorPool;
+	Move<VkDescriptorSet>		m_descriptorSet;
+	de::MovePtr<Buffer>			m_buffer;
+};
+
+MSInstanceSampleMaskPattern::MSInstanceSampleMaskPattern (Context& context, const ImageMSParams& imageMSParams) : MSInstanceBaseResolveAndPerSampleFetch(context, imageMSParams)
+{
+	m_sampleMask = 0xAAAAAAAAu & ((1u << imageMSParams.numSamples) - 1u);
+}
+
+VkPipelineMultisampleStateCreateInfo MSInstanceSampleMaskPattern::getMSStateCreateInfo (const ImageMSParams& imageMSParams) const
+{
+	const VkPipelineMultisampleStateCreateInfo multisampleStateInfo =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,		// VkStructureType							sType;
+		DE_NULL,														// const void*								pNext;
+		(VkPipelineMultisampleStateCreateFlags)0u,						// VkPipelineMultisampleStateCreateFlags	flags;
+		imageMSParams.numSamples,										// VkSampleCountFlagBits					rasterizationSamples;
+		VK_TRUE,														// VkBool32									sampleShadingEnable;
+		1.0f,															// float									minSampleShading;
+		&m_sampleMask,													// const VkSampleMask*						pSampleMask;
+		VK_FALSE,														// VkBool32									alphaToCoverageEnable;
+		VK_FALSE,														// VkBool32									alphaToOneEnable;
+	};
+
+	return multisampleStateInfo;
+}
+
+const VkDescriptorSetLayout* MSInstanceSampleMaskPattern::createMSPassDescSetLayout (const ImageMSParams& imageMSParams)
+{
+	DE_UNREF(imageMSParams);
+
+	const DeviceInterface&		deviceInterface = m_context.getDeviceInterface();
+	const VkDevice				device			= m_context.getDevice();
+
+	// Create descriptor set layout
+	m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+		.addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT)
+		.build(deviceInterface, device);
+
+	return &m_descriptorSetLayout.get();
+}
+
+const VkDescriptorSet* MSInstanceSampleMaskPattern::createMSPassDescSet (const ImageMSParams& imageMSParams, const VkDescriptorSetLayout* descSetLayout)
+{
+	DE_UNREF(imageMSParams);
+
+	const DeviceInterface&		deviceInterface = m_context.getDeviceInterface();
+	const VkDevice				device			= m_context.getDevice();
+	Allocator&					allocator		= m_context.getDefaultAllocator();
+
+	// Create descriptor pool
+	m_descriptorPool = DescriptorPoolBuilder()
+		.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u)
+		.build(deviceInterface, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+
+	// Create descriptor set
+	m_descriptorSet = makeDescriptorSet(deviceInterface, device, *m_descriptorPool, *descSetLayout);
+
+	const VkBufferCreateInfo bufferSampleMaskInfo = makeBufferCreateInfo(sizeof(VkSampleMask), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
+
+	m_buffer = de::MovePtr<Buffer>(new Buffer(deviceInterface, device, allocator, bufferSampleMaskInfo, MemoryRequirement::HostVisible));
+
+	deMemcpy(m_buffer->getAllocation().getHostPtr(), &m_sampleMask, sizeof(VkSampleMask));
+
+	flushMappedMemoryRange(deviceInterface, device, m_buffer->getAllocation().getMemory(), m_buffer->getAllocation().getOffset(), VK_WHOLE_SIZE);
+
+	const VkDescriptorBufferInfo descBufferInfo = makeDescriptorBufferInfo(**m_buffer, 0u, sizeof(VkSampleMask));
+
+	DescriptorSetUpdateBuilder()
+		.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descBufferInfo)
+		.update(deviceInterface, device);
+
+	return &m_descriptorSet.get();
+}
+
+MultisampleInstanceBase::VertexDataDesc MSInstanceSampleMaskPattern::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+void MSInstanceSampleMaskPattern::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+tcu::TestStatus	MSInstanceSampleMaskPattern::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																 const vk::VkImageCreateInfo&						imageRSInfo,
+																 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	DE_UNREF(imageRSInfo);
+	DE_UNREF(dataRS);
+
+	if (checkForErrorMS(imageMSInfo, dataPerSample, 0))
+		return tcu::TestStatus::fail("gl_SampleMaskIn bits have not been killed by pSampleMask state");
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSampleMaskPattern;
+
+template<> void MSCase<MSCaseSampleMaskPattern>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Verifying gl_SampleMaskIn value with pSampleMask state. gl_SampleMaskIn does not contain any bits set that are have been killed by pSampleMask state. Expecting:\n"
+		<< "Expected result: gl_SampleMaskIn AND ~(pSampleMask) should be zero.\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSampleMaskPattern>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "layout(set = 0, binding = 0, std140) uniform SampleMaskBlock\n"
+		<< "{\n"
+		<< "	int sampleMaskPattern;\n"
+		<< "};"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	if ((gl_SampleMaskIn[0] & ~sampleMaskPattern) != 0)\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+		<< "	else\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSampleMaskPattern>::createInstance (Context& context) const
+{
+	return new MSInstanceSampleMaskPattern(context, m_imageMSParams);
+}
+
+class MSInstanceSampleMaskBitCount;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSampleMaskBitCount>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+template<> void MSInstance<MSInstanceSampleMaskBitCount>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSampleMaskBitCount>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																						 const vk::VkImageCreateInfo&						imageRSInfo,
+																						 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																						 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	DE_UNREF(imageRSInfo);
+	DE_UNREF(dataRS);
+
+	if (checkForErrorMS(imageMSInfo, dataPerSample, 0))
+		return tcu::TestStatus::fail("gl_SampleMaskIn has more than one bit set for some shader invocations");
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSampleMaskBitCount;
+
+template<> void MSCase<MSCaseSampleMaskBitCount>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Verifying gl_SampleMaskIn.\n"
+		<< "	Fragment shader will be invoked numSamples times.\n"
+		<< "	=> gl_SampleMaskIn should have only one bit set for each shader invocation.\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSampleMaskBitCount>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	uint maskBitCount = 0u;\n"
+		<< "\n"
+		<< "	for (int i = 0; i < 32; ++i)\n"
+		<< "		if (((gl_SampleMaskIn[0] >> i) & 0x01) == 0x01)\n"
+		<< "			++maskBitCount;\n"
+		<< "\n"
+		<< "	if (maskBitCount != 1u)\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+		<< "	else\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSampleMaskBitCount>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSampleMaskBitCount>(context, m_imageMSParams);
+}
+
+class MSInstanceSampleMaskCorrectBit;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSampleMaskCorrectBit>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+template<> void MSInstance<MSInstanceSampleMaskCorrectBit>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSampleMaskCorrectBit>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																						 const vk::VkImageCreateInfo&						imageRSInfo,
+																						 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																						 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	DE_UNREF(imageRSInfo);
+	DE_UNREF(dataRS);
+
+	if (checkForErrorMS(imageMSInfo, dataPerSample, 0))
+		return tcu::TestStatus::fail("The bit corresponsing to current gl_SampleID is not set in gl_SampleMaskIn");
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSampleMaskCorrectBit;
+
+template<> void MSCase<MSCaseSampleMaskCorrectBit>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Verifying gl_SampleMaskIn.\n"
+		<< "	Fragment shader will be invoked numSamples times.\n"
+		<< "	=> In each invocation gl_SampleMaskIn should have the bit set that corresponds to gl_SampleID.\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSampleMaskCorrectBit>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	if (((gl_SampleMaskIn[0] >> gl_SampleID) & 0x01) == 0x01)\n"
+		<< "		fs_out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
+		<< "	else\n"
+		<< "		fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSampleMaskCorrectBit>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSampleMaskCorrectBit>(context, m_imageMSParams);
+}
+
+class MSInstanceSampleMaskWrite;
+
+template<> MultisampleInstanceBase::VertexDataDesc MSInstance<MSInstanceSampleMaskWrite>::getVertexDataDescripton (void) const
+{
+	return getVertexDataDescriptonNdc();
+}
+
+template<> void MSInstance<MSInstanceSampleMaskWrite>::uploadVertexData (const Allocation& vertexBufferAllocation, const VertexDataDesc& vertexDataDescripton) const
+{
+	uploadVertexDataNdc(vertexBufferAllocation, vertexDataDescripton);
+}
+
+template<> tcu::TestStatus MSInstance<MSInstanceSampleMaskWrite>::verifyImageData	(const vk::VkImageCreateInfo&						imageMSInfo,
+																					 const vk::VkImageCreateInfo&						imageRSInfo,
+																					 const std::vector<tcu::ConstPixelBufferAccess>&	dataPerSample,
+																					 const tcu::ConstPixelBufferAccess&					dataRS) const
+{
+	const deUint32 numSamples = static_cast<deUint32>(imageMSInfo.samples);
+
+	for (deUint32 z = 0u; z < imageMSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageMSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageMSInfo.extent.width;  ++x)
+	{
+		for (deUint32 sampleNdx = 0u; sampleNdx < numSamples; ++sampleNdx)
+		{
+			const deUint32 firstComponent = dataPerSample[sampleNdx].getPixelUint(x, y, z)[0];
+
+			if (firstComponent != 0u && firstComponent != 255u)
+				return tcu::TestStatus::fail("Expected color to be zero or saturated on the first channel");
+		}
+	}
+
+	for (deUint32 z = 0u; z < imageRSInfo.extent.depth;  ++z)
+	for (deUint32 y = 0u; y < imageRSInfo.extent.height; ++y)
+	for (deUint32 x = 0u; x < imageRSInfo.extent.width;  ++x)
+	{
+		const float firstComponent = dataRS.getPixel(x, y, z)[0];
+
+		if (deFloatAbs(firstComponent - 0.5f) > 0.02f)
+			return tcu::TestStatus::fail("Expected resolve color to be half intensity on the first channel");
+	}
+
+	return tcu::TestStatus::pass("Passed");
+}
+
+class MSCaseSampleMaskWrite;
+
+template<> void MSCase<MSCaseSampleMaskWrite>::init (void)
+{
+	m_testCtx.getLog()
+		<< tcu::TestLog::Message
+		<< "Discarding half of the samples using gl_SampleMask."
+		<< "Expecting half intensity on multisample targets (numSamples > 1)\n"
+		<< tcu::TestLog::EndMessage;
+
+	MultisampleCaseBase::init();
+}
+
+template<> void MSCase<MSCaseSampleMaskWrite>::initPrograms (vk::SourceCollections& programCollection) const
+{
+	MSCaseBaseResolveAndPerSampleFetch::initPrograms(programCollection);
+
+	// Create vertex shader
+	std::ostringstream vs;
+
+	vs << "#version 440\n"
+		<< "layout(location = 0) in vec4 vs_in_position_ndc;\n"
+		<< "\n"
+		<< "out gl_PerVertex {\n"
+		<< "	vec4  gl_Position;\n"
+		<< "};\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_Position	= vs_in_position_ndc;\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("vertex_shader") << glu::VertexSource(vs.str());
+
+	// Create fragment shader
+	std::ostringstream fs;
+
+	fs << "#version 440\n"
+		<< "\n"
+		<< "layout(location = 0) out vec4 fs_out_color;\n"
+		<< "\n"
+		<< "void main (void)\n"
+		<< "{\n"
+		<< "	gl_SampleMask[0] = 0xAAAAAAAA;\n"
+		<< "\n"
+		<< "	fs_out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+		<< "}\n";
+
+	programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
+}
+
+template<> TestInstance* MSCase<MSCaseSampleMaskWrite>::createInstance (Context& context) const
+{
+	return new MSInstance<MSInstanceSampleMaskWrite>(context, m_imageMSParams);
+}
+
+} // multisample
+
+tcu::TestCaseGroup* createMultisampleShaderBuiltInTests (tcu::TestContext& testCtx)
+{
+	de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "multisample_shader_builtin", "Multisample Shader BuiltIn Tests"));
+
+	const tcu::UVec3 imageSizes[] =
+	{
+		tcu::UVec3(128u, 128u, 1u),
+		tcu::UVec3(137u, 191u, 1u),
+	};
+
+	const deUint32 sizesElemCount = static_cast<deUint32>(sizeof(imageSizes) / sizeof(tcu::UVec3));
+
+	const vk::VkSampleCountFlagBits samplesSetFull[] =
+	{
+		vk::VK_SAMPLE_COUNT_2_BIT,
+		vk::VK_SAMPLE_COUNT_4_BIT,
+		vk::VK_SAMPLE_COUNT_8_BIT,
+		vk::VK_SAMPLE_COUNT_16_BIT,
+		vk::VK_SAMPLE_COUNT_32_BIT,
+		vk::VK_SAMPLE_COUNT_64_BIT,
+	};
+
+	const deUint32 samplesSetFullCount = static_cast<deUint32>(sizeof(samplesSetFull) / sizeof(vk::VkSampleCountFlagBits));
+
+	testGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleID> >(testCtx, "sample_id", imageSizes, sizesElemCount, samplesSetFull, samplesSetFullCount));
+
+	de::MovePtr<tcu::TestCaseGroup> samplePositionGroup(new tcu::TestCaseGroup(testCtx, "sample_position", "Sample Position Tests"));
+
+	samplePositionGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSamplePosDistribution> >(testCtx, "distribution", imageSizes, sizesElemCount, samplesSetFull, samplesSetFullCount));
+	samplePositionGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSamplePosCorrectness> > (testCtx, "correctness",  imageSizes, sizesElemCount, samplesSetFull, samplesSetFullCount));
+
+	testGroup->addChild(samplePositionGroup.release());
+
+	const vk::VkSampleCountFlagBits samplesSetReduced[] =
+	{
+		vk::VK_SAMPLE_COUNT_2_BIT,
+		vk::VK_SAMPLE_COUNT_4_BIT,
+		vk::VK_SAMPLE_COUNT_8_BIT,
+		vk::VK_SAMPLE_COUNT_16_BIT,
+		vk::VK_SAMPLE_COUNT_32_BIT,
+	};
+
+	const deUint32 samplesSetReducedCount = static_cast<deUint32>(sizeof(samplesSetReduced) / sizeof(vk::VkSampleCountFlagBits));
+
+	de::MovePtr<tcu::TestCaseGroup> sampleMaskGroup(new tcu::TestCaseGroup(testCtx, "sample_mask", "Sample Mask Tests"));
+
+	sampleMaskGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleMaskPattern> >	(testCtx, "pattern",	imageSizes, sizesElemCount, samplesSetReduced, samplesSetReducedCount));
+	sampleMaskGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleMaskBitCount> >	(testCtx, "bit_count",	imageSizes, sizesElemCount, samplesSetReduced, samplesSetReducedCount));
+	sampleMaskGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleMaskCorrectBit> >(testCtx, "correct_bit",imageSizes, sizesElemCount, samplesSetReduced, samplesSetReducedCount));
+	sampleMaskGroup->addChild(makeMSGroup<multisample::MSCase<multisample::MSCaseSampleMaskWrite> >		(testCtx, "write",		imageSizes, sizesElemCount, samplesSetReduced, samplesSetReducedCount));
+
+	testGroup->addChild(sampleMaskGroup.release());
+
+	return testGroup.release();
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.hpp
new file mode 100644
index 0000000..607c7d9e
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.hpp
@@ -0,0 +1,38 @@
+#ifndef _VKTPIPELINEMULTISAMPLESHADERBUILTINTESTS_HPP
+#define _VKTPIPELINEMULTISAMPLESHADERBUILTINTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group 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 vktPipelineMultisampleShaderBuiltInTests.hpp
+ * \brief Multisample Shader BuiltIn Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+
+tcu::TestCaseGroup* createMultisampleShaderBuiltInTests (tcu::TestContext& testCtx);
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLESHADERBUILTINTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp
index f1493e2..792873d 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp
@@ -371,19 +371,19 @@
 	return std::min(static_cast<deUint32>(deFloatLog2(static_cast<float>(widestEdge))) + 1u, imageFormatProperties.maxMipLevels);
 }
 
-deUint32 getImageMipLevelSizeInBytes (const VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevel)
+deUint32 getImageMipLevelSizeInBytes (const VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevel, const deUint32 numSamples)
 {
 	const VkExtent3D extents = mipLevelExtents(baseExtents, mipmapLevel);
 
-	return extents.width * extents.height * extents.depth * layersCount * tcu::getPixelSize(format);
+	return extents.width * extents.height * extents.depth * layersCount * numSamples * tcu::getPixelSize(format);
 }
 
-deUint32 getImageSizeInBytes (const VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevelsCount)
+deUint32 getImageSizeInBytes (const VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevelsCount, const deUint32 numSamples)
 {
 	deUint32 imageSizeInBytes = 0;
 	for (deUint32 mipmapLevel = 0; mipmapLevel < mipmapLevelsCount; ++mipmapLevel)
 	{
-		imageSizeInBytes += getImageMipLevelSizeInBytes(baseExtents, layersCount, format, mipmapLevel);
+		imageSizeInBytes += getImageMipLevelSizeInBytes(baseExtents, layersCount, format, mipmapLevel, numSamples);
 	}
 
 	return imageSizeInBytes;
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.hpp
index 03e721e..97a5248 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.hpp
@@ -75,8 +75,8 @@
 deUint32			getLayerDimensions				(const ImageType imageType);
 vk::VkExtent3D		mipLevelExtents					(const vk::VkExtent3D& baseExtents, const deUint32 mipLevel);
 tcu::UVec3			mipLevelExtents					(const tcu::UVec3&	   baseExtents, const deUint32 mipLevel);
-deUint32			getImageMipLevelSizeInBytes		(const vk::VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevel);
-deUint32			getImageSizeInBytes				(const vk::VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevelsCount = 1u);
+deUint32			getImageMipLevelSizeInBytes		(const vk::VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevel, const deUint32 numSamples = 1u);
+deUint32			getImageSizeInBytes				(const vk::VkExtent3D& baseExtents, const deUint32 layersCount, const tcu::TextureFormat& format, const deUint32 mipmapLevelsCount = 1u, const deUint32 numSamples = 1u);
 deUint32			getImageMaxMipLevels			(const vk::VkImageFormatProperties& imageFormatProperties, const vk::VkExtent3D& extent);
 
 enum FeatureFlagBits
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
index 1cb900a..148f197 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
@@ -34,6 +34,7 @@
 #include "vktPipelineSpecConstantTests.hpp"
 #include "vktPipelineMultisampleTests.hpp"
 #include "vktPipelineMultisampleInterpolationTests.hpp"
+#include "vktPipelineMultisampleShaderBuiltInTests.hpp"
 #include "vktPipelineVertexInputTests.hpp"
 #include "vktPipelineTimestampTests.hpp"
 #include "vktPipelineCacheTests.hpp"
@@ -62,6 +63,7 @@
 	pipelineTests->addChild(createSpecConstantTests				(testCtx));
 	pipelineTests->addChild(createMultisampleTests				(testCtx));
 	pipelineTests->addChild(createMultisampleInterpolationTests	(testCtx));
+	pipelineTests->addChild(createMultisampleShaderBuiltInTests	(testCtx));
 	pipelineTests->addChild(createVertexInputTests				(testCtx));
 	pipelineTests->addChild(createInputAssemblyTests			(testCtx));
 	pipelineTests->addChild(createTimestampTests				(testCtx));
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp
index dd3c845..b11d133 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRender.cpp
@@ -58,7 +58,7 @@
 namespace
 {
 
-static const int		GRID_SIZE			= 64;
+static const int		GRID_SIZE			= 90;
 static const deUint32	MAX_RENDER_WIDTH	= 128;
 static const deUint32	MAX_RENDER_HEIGHT	= 128;
 static const tcu::Vec4	DEFAULT_CLEAR_COLOR	= tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f);
@@ -541,7 +541,7 @@
 	, m_isVertexCase		(false)
 	, m_vertexShaderName	("vert")
 	, m_fragmentShaderName	("frag")
-	, m_renderSize			(128, 128)
+	, m_renderSize			(MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
 	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
 	, m_evaluator			(DE_NULL)
 	, m_uniformSetup		(DE_NULL)
@@ -565,7 +565,7 @@
 	, m_isVertexCase		(isVertexCase)
 	, m_vertexShaderName	("vert")
 	, m_fragmentShaderName	("frag")
-	, m_renderSize			(128, 128)
+	, m_renderSize			(MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
 	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
 	, m_evaluator			(&evaluator)
 	, m_uniformSetup		(&uniformSetup)
@@ -588,7 +588,7 @@
 	, m_isVertexCase		(isVertexCase)
 	, m_vertexShaderName	("vert")
 	, m_fragmentShaderName	("frag")
-	, m_renderSize			(128, 128)
+	, m_renderSize			(MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
 	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
 	, m_evaluator			(evaluator)
 	, m_uniformSetup		(uniformSetup)
@@ -753,7 +753,7 @@
 		computeFragmentReference(refImage, *m_quadGrid);
 
 	// Compare.
-	const bool			compareOk		= compareImages(resImage, refImage, 0.1f);
+	const bool			compareOk		= compareImages(resImage, refImage, 0.2f);
 
 	if (compareOk)
 		return tcu::TestStatus::pass("Result image matches reference");
@@ -3245,7 +3245,7 @@
 
 bool ShaderRenderCaseInstance::compareImages (const tcu::Surface& resImage, const tcu::Surface& refImage, float errorThreshold)
 {
-	return tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ComparisonResult", "Image comparison result", refImage, resImage, errorThreshold, tcu::COMPARE_LOG_RESULT);
+	return tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ComparisonResult", "Image comparison result", refImage, resImage, errorThreshold, tcu::COMPARE_LOG_EVERYTHING);
 }
 
 } // sr
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
index dbd8b83..43dc78b 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
@@ -54,12 +54,15 @@
 {
 	FUNCTION_TEXTURE = 0,		//!< texture(), textureOffset()
 	FUNCTION_TEXTUREPROJ,		//!< textureProj(), textureProjOffset()
+	FUNCTION_TEXTUREPROJ2,		//!< textureProj(sampler1D, vec2)
 	FUNCTION_TEXTUREPROJ3,		//!< textureProj(sampler2D, vec3)
 	FUNCTION_TEXTURELOD,		// ...
 	FUNCTION_TEXTUREPROJLOD,
+	FUNCTION_TEXTUREPROJLOD2,	//!< textureProjLod(sampler1D, vec2)
 	FUNCTION_TEXTUREPROJLOD3,	//!< textureProjLod(sampler2D, vec3)
 	FUNCTION_TEXTUREGRAD,
 	FUNCTION_TEXTUREPROJGRAD,
+	FUNCTION_TEXTUREPROJGRAD2,	//!< textureProjGrad(sampler1D, vec2)
 	FUNCTION_TEXTUREPROJGRAD3,	//!< textureProjGrad(sampler2D, vec3)
 	FUNCTION_TEXELFETCH,
 
@@ -71,28 +74,36 @@
 	return shaderType == glu::SHADERTYPE_FRAGMENT &&
 		   (function == FUNCTION_TEXTURE		||
 			function == FUNCTION_TEXTUREPROJ	||
+			function == FUNCTION_TEXTUREPROJ2	||
 			function == FUNCTION_TEXTUREPROJ3);
 }
 
 inline bool functionHasProj (Function function)
 {
 	return function == FUNCTION_TEXTUREPROJ		||
+		   function == FUNCTION_TEXTUREPROJ2	||
 		   function == FUNCTION_TEXTUREPROJ3	||
 		   function == FUNCTION_TEXTUREPROJLOD	||
-		   function == FUNCTION_TEXTUREPROJGRAD	||
+		   function == FUNCTION_TEXTUREPROJLOD2	||
 		   function == FUNCTION_TEXTUREPROJLOD3	||
+		   function == FUNCTION_TEXTUREPROJGRAD	||
+		   function == FUNCTION_TEXTUREPROJGRAD2||
 		   function == FUNCTION_TEXTUREPROJGRAD3;
 }
 
 inline bool functionHasGrad (Function function)
 {
-	return function == FUNCTION_TEXTUREGRAD || function == FUNCTION_TEXTUREPROJGRAD || function == FUNCTION_TEXTUREPROJGRAD3;
+	return function == FUNCTION_TEXTUREGRAD		||
+		   function == FUNCTION_TEXTUREPROJGRAD	||
+		   function == FUNCTION_TEXTUREPROJGRAD2||
+		   function == FUNCTION_TEXTUREPROJGRAD3;
 }
 
 inline bool functionHasLod (Function function)
 {
 	return function == FUNCTION_TEXTURELOD		||
 		   function == FUNCTION_TEXTUREPROJLOD	||
+		   function == FUNCTION_TEXTUREPROJLOD2	||
 		   function == FUNCTION_TEXTUREPROJLOD3	||
 		   function == FUNCTION_TEXELFETCH;
 }
@@ -360,34 +371,72 @@
 	return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*s, c.in[1].y()*t, c.in[2].x()*s, c.in[2].y()*t);
 }
 
+inline float computeLodFromGrad1D (const ShaderEvalContext& c)
+{
+	float w = (float)c.textures[0].tex1D->getWidth();
+	return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*w, c.in[2].x()*w);
+}
+
+inline float computeLodFromGrad1DArray (const ShaderEvalContext& c)
+{
+	float w = (float)c.textures[0].tex1DArray->getWidth();
+	return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*w, c.in[2].x()*w);
+}
+
+inline float computeLodFromGradCubeArray (const ShaderEvalContext& c)
+{
+	// \note Major axis is always -Z or +Z
+	float m = de::abs(c.in[0].z());
+	float d = (float)c.textures[0].texCubeArray->getSize();
+	float s = d/(2.0f*m);
+	float t = d/(2.0f*m);
+	return computeLodFromDerivates(DEFAULT_LOD_MODE, c.in[1].x()*s, c.in[1].y()*t, c.in[2].x()*s, c.in[2].y()*t);
+}
+
 typedef void (*TexEvalFunc) (ShaderEvalContext& c, const TexLookupParams& lookupParams);
 
-inline Vec4 texture2D		(const ShaderEvalContext& c, float s, float t, float lod)			{ return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod);			}
-inline Vec4 textureCube		(const ShaderEvalContext& c, float s, float t, float r, float lod)	{ return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod);	}
-inline Vec4 texture2DArray	(const ShaderEvalContext& c, float s, float t, float r, float lod)	{ return c.textures[0].tex2DArray->sample(c.textures[0].sampler, s, t, r, lod);	}
-inline Vec4 texture3D		(const ShaderEvalContext& c, float s, float t, float r, float lod)	{ return c.textures[0].tex3D->sample(c.textures[0].sampler, s, t, r, lod);		}
+inline Vec4 texture2D			(const ShaderEvalContext& c, float s, float t, float lod)					{ return c.textures[0].tex2D->sample(c.textures[0].sampler, s, t, lod);					}
+inline Vec4 textureCube			(const ShaderEvalContext& c, float s, float t, float r, float lod)			{ return c.textures[0].texCube->sample(c.textures[0].sampler, s, t, r, lod);			}
+inline Vec4 texture2DArray		(const ShaderEvalContext& c, float s, float t, float r, float lod)			{ return c.textures[0].tex2DArray->sample(c.textures[0].sampler, s, t, r, lod);			}
+inline Vec4 texture3D			(const ShaderEvalContext& c, float s, float t, float r, float lod)			{ return c.textures[0].tex3D->sample(c.textures[0].sampler, s, t, r, lod);				}
+inline Vec4 texture1D			(const ShaderEvalContext& c, float s, float lod)							{ return c.textures[0].tex1D->sample(c.textures[0].sampler, s, lod);					}
+inline Vec4 texture1DArray		(const ShaderEvalContext& c, float s, float t, float lod)					{ return c.textures[0].tex1DArray->sample(c.textures[0].sampler, s, t, lod);			}
+inline Vec4 textureCubeArray	(const ShaderEvalContext& c, float s, float t, float r, float q, float lod)	{ return c.textures[0].texCubeArray->sample(c.textures[0].sampler, s, t, r, q, lod);	}
 
-inline float texture2DShadow		(const ShaderEvalContext& c, float ref, float s, float t, float lod) { return c.textures[0].tex2D->sampleCompare(c.textures[0].sampler, ref, s, t, lod); }
-inline float textureCubeShadow		(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod) { return c.textures[0].texCube->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod); }
-inline float texture2DArrayShadow	(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod) { return c.textures[0].tex2DArray->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod); }
+inline float texture2DShadow		(const ShaderEvalContext& c, float ref, float s, float t, float lod)					{ return c.textures[0].tex2D->sampleCompare(c.textures[0].sampler, ref, s, t, lod);					}
+inline float textureCubeShadow		(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod)			{ return c.textures[0].texCube->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod);			}
+inline float texture2DArrayShadow	(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod)			{ return c.textures[0].tex2DArray->sampleCompare(c.textures[0].sampler, ref, s, t, r, lod);			}
+inline float texture1DShadow		(const ShaderEvalContext& c, float ref, float s, float lod)								{ return c.textures[0].tex1D->sampleCompare(c.textures[0].sampler, ref, s, lod);					}
+inline float texture1DArrayShadow	(const ShaderEvalContext& c, float ref, float s, float t, float lod)					{ return c.textures[0].tex1DArray->sampleCompare(c.textures[0].sampler, ref, s, t, lod);			}
+inline float textureCubeArrayShadow	(const ShaderEvalContext& c, float ref, float s, float t, float r, float q, float lod)	{ return c.textures[0].texCubeArray->sampleCompare(c.textures[0].sampler, ref, s, t, r, q, lod);	}
 
-inline Vec4 texture2DOffset			(const ShaderEvalContext& c, float s, float t, float lod, IVec2 offset)			{ return c.textures[0].tex2D->sampleOffset(c.textures[0].sampler, s, t, lod, offset);			}
+inline Vec4 texture2DOffset			(const ShaderEvalContext& c, float s, float t, float lod, IVec2 offset)				{ return c.textures[0].tex2D->sampleOffset(c.textures[0].sampler, s, t, lod, offset);			}
 inline Vec4 texture2DArrayOffset	(const ShaderEvalContext& c, float s, float t, float r, float lod, IVec2 offset)	{ return c.textures[0].tex2DArray->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset);	}
 inline Vec4 texture3DOffset			(const ShaderEvalContext& c, float s, float t, float r, float lod, IVec3 offset)	{ return c.textures[0].tex3D->sampleOffset(c.textures[0].sampler, s, t, r, lod, offset);		}
+inline Vec4 texture1DOffset			(const ShaderEvalContext& c, float s, float lod, deInt32 offset)					{ return c.textures[0].tex1D->sampleOffset(c.textures[0].sampler, s, lod, offset);				}
+inline Vec4 texture1DArrayOffset	(const ShaderEvalContext& c, float s, float t, float lod, deInt32 offset)			{ return c.textures[0].tex1DArray->sampleOffset(c.textures[0].sampler, s, t, lod, offset);		}
 
-inline float texture2DShadowOffset		(const ShaderEvalContext& c, float ref, float s, float t, float lod, IVec2 offset)	{ return c.textures[0].tex2D->sampleCompareOffset(c.textures[0].sampler, ref, s, t, lod, offset); }
-inline float texture2DArrayShadowOffset	(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod, IVec2 offset) { return c.textures[0].tex2DArray->sampleCompareOffset(c.textures[0].sampler, ref, s, t, r, lod, offset); }
+inline float texture2DShadowOffset		(const ShaderEvalContext& c, float ref, float s, float t, float lod, IVec2 offset)			{ return c.textures[0].tex2D->sampleCompareOffset(c.textures[0].sampler, ref, s, t, lod, offset);			}
+inline float texture2DArrayShadowOffset	(const ShaderEvalContext& c, float ref, float s, float t, float r, float lod, IVec2 offset)	{ return c.textures[0].tex2DArray->sampleCompareOffset(c.textures[0].sampler, ref, s, t, r, lod, offset);	}
+inline float texture1DShadowOffset		(const ShaderEvalContext& c, float ref, float s, float lod, deInt32 offset)					{ return c.textures[0].tex1D->sampleCompareOffset(c.textures[0].sampler, ref, s, lod, offset);				}
+inline float texture1DArrayShadowOffset	(const ShaderEvalContext& c, float ref, float s, float t, float lod, deInt32 offset)		{ return c.textures[0].tex1DArray->sampleCompareOffset(c.textures[0].sampler, ref, s, t, lod, offset);		}
 
 // Eval functions.
 static void		evalTexture2D			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod)*p.scale + p.bias; }
 static void		evalTextureCube			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; }
 static void		evalTexture2DArray		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; }
 static void		evalTexture3D			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod)*p.scale + p.bias; }
+static void		evalTexture1D			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x(), p.lod)*p.scale + p.bias; }
+static void		evalTexture1DArray		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArray(c, c.in[0].x(), c.in[0].y(), p.lod)*p.scale + p.bias; }
+static void		evalTextureCubeArray	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCubeArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[0].w(), p.lod)*p.scale + p.bias; }
 
 static void		evalTexture2DBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x())*p.scale + p.bias; }
 static void		evalTextureCubeBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture2DArrayBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture3DBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x(), p.lod+c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DArrayBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArray(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x())*p.scale + p.bias; }
+static void		evalTextureCubeArrayBias(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCubeArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; }
 
 static void		evalTexture2DProj3		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod)*p.scale + p.bias; }
 static void		evalTexture2DProj3Bias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod+c.in[1].x())*p.scale + p.bias; }
@@ -395,29 +444,44 @@
 static void		evalTexture2DProjBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture3DProj		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod)*p.scale + p.bias; }
 static void		evalTexture3DProjBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DProj2		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].y(), p.lod)*p.scale + p.bias; }
+static void		evalTexture1DProj2Bias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].y(), p.lod+c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DProj		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].w(), p.lod)*p.scale + p.bias; }
+static void		evalTexture1DProjBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].w(), p.lod+c.in[1].x())*p.scale + p.bias; }
 
 static void		evalTexture2DLod		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x(), c.in[0].y(), c.in[1].x())*p.scale + p.bias; }
 static void		evalTextureCubeLod		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture2DArrayLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture3DLod		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DLod		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x(), c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DArrayLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArray(c, c.in[0].x(), c.in[0].y(), c.in[1].x())*p.scale + p.bias; }
+static void		evalTextureCubeArrayLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCubeArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[0].w(), c.in[1].x())*p.scale + p.bias; }
 
 static void		evalTexture2DProjLod3	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture2DProjLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x())*p.scale + p.bias; }
 static void		evalTexture3DProjLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DProjLod2	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].y(), c.in[1].x())*p.scale + p.bias; }
+static void		evalTexture1DProjLod	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].w(), c.in[1].x())*p.scale + p.bias; }
 
 // Offset variants
 
 static void		evalTexture2DOffset				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DArrayOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DOffset				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset)*p.scale + p.bias; }
+static void		evalTexture1DOffset				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x(), p.lod, p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DArrayOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArrayOffset(c, c.in[0].x(), c.in[0].y(), p.lod, p.offset.x())*p.scale + p.bias; }
 
 static void		evalTexture2DOffsetBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DArrayOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DOffsetBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x(), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DOffsetBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x(), p.lod+c.in[1].x(), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DArrayOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArrayOffset(c, c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.x())*p.scale + p.bias; }
 
 static void		evalTexture2DLodOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DArrayLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DLodOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[1].x(), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DLodOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x(), c.in[1].x(), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DArrayLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.x())*p.scale + p.bias; }
 
 static void		evalTexture2DProj3Offset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod, p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DProj3OffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
@@ -425,10 +489,16 @@
 static void		evalTexture2DProjOffsetBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DProjOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod, p.offset)*p.scale + p.bias; }
 static void		evalTexture3DProjOffsetBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), p.lod+c.in[1].x(), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DProj2Offset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].y(), p.lod, p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DProj2OffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].y(), p.lod+c.in[1].x(), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DProjOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].w(), p.lod, p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DProjOffsetBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.x())*p.scale + p.bias; }
 
 static void		evalTexture2DProjLod3Offset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DProjLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x(), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DProjLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), c.in[1].x(), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DProjLod2Offset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].y(), c.in[1].x(), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DProjLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].w(), c.in[1].x(), p.offset.x())*p.scale + p.bias; }
 
 // Shadow variants
 
@@ -439,50 +509,85 @@
 static void		evalTextureCubeShadowBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod+c.in[1].x()); }
 
 static void		evalTexture2DArrayShadow		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod); }
+static void		evalTexture1DShadow				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadow(c, c.in[0].z(), c.in[0].x(), p.lod); }
+static void		evalTexture1DShadowBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadow(c, c.in[0].z(), c.in[0].x(), p.lod+c.in[1].x()); }
+static void		evalTexture1DArrayShadow		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod); }
+static void		evalTexture1DArrayShadowBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x()); }
+static void		evalTextureCubeArrayShadow		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = textureCubeArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[0].w(), p.lod); }
 
-static void		evalTexture2DShadowLod			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x()); }
-static void		evalTexture2DShadowLodOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture2DShadowLod				(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x()); }
+static void		evalTexture2DShadowLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowLod				(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DShadow(c, c.in[0].z(), c.in[0].x(), c.in[1].x()); }
+static void		evalTexture1DShadowLodOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[1].x(), p.offset.x()); }
+static void		evalTexture1DArrayShadowLod			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DArrayShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x()); }
+static void		evalTexture1DArrayShadowLodOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), c.in[1].x(), p.offset.x()); }
 
-static void		evalTexture2DShadowProj			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod); }
-static void		evalTexture2DShadowProjBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x()); }
+static void		evalTexture2DShadowProj				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod); }
+static void		evalTexture2DShadowProjBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x()); }
+static void		evalTexture1DShadowProj				(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), p.lod); }
+static void		evalTexture1DShadowProjBias			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), p.lod+c.in[1].x()); }
 
-static void		evalTexture2DShadowProjLod		(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x()); }
-static void		evalTexture2DShadowProjLodOffset(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture2DShadowProjLod			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x()); }
+static void		evalTexture2DShadowProjLodOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowProjLod			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[1].x()); }
+static void		evalTexture1DShadowProjLodOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[1].x(), p.offset.x()); }
 
-static void		evalTexture2DShadowOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0,1)); }
-static void		evalTexture2DShadowOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture2DShadowOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod, p.offset.swizzle(0,1)); }
+static void		evalTexture2DShadowOffsetBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture2DArrayShadowOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DArrayShadowOffset(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), p.lod, p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z(), c.in[0].x(), p.lod, p.offset.x()); }
+static void		evalTexture1DShadowOffsetBias		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z(), c.in[0].x(), p.lod+c.in[1].x(), p.offset.x()); }
+static void		evalTexture1DArrayShadowOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod, p.offset.x()); }
+static void		evalTexture1DArrayShadowOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), p.lod+c.in[1].x(), p.offset.x()); }
 
 static void		evalTexture2DShadowProjOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod, p.offset.swizzle(0,1)); }
 static void		evalTexture2DShadowProjOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowProjOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), p.lod, p.offset.x()); }
+static void		evalTexture1DShadowProjOffsetBias	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), p.lod+c.in[1].x(), p.offset.x()); }
 
 // Gradient variarts
 
-static void		evalTexture2DGrad		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c))*p.scale + p.bias; }
-static void		evalTextureCubeGrad		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c))*p.scale + p.bias; }
-static void		evalTexture2DArrayGrad	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c))*p.scale + p.bias; }
-static void		evalTexture3DGrad		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c))*p.scale + p.bias; }
+static void		evalTexture2DGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c))*p.scale + p.bias; }
+static void		evalTextureCubeGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCube(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c))*p.scale + p.bias; }
+static void		evalTexture2DArrayGrad		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c))*p.scale + p.bias; }
+static void		evalTexture3DGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c))*p.scale + p.bias; }
+static void		evalTexture1DGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x(), computeLodFromGrad1D(c))*p.scale + p.bias; }
+static void		evalTexture1DArrayGrad		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArray(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad1DArray(c))*p.scale + p.bias; }
+static void		evalTextureCubeArrayGrad	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = textureCubeArray(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), c.in[0].w(), computeLodFromGradCubeArray(c))*p.scale + p.bias; }
 
 static void		evalTexture2DShadowGrad			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c)); }
 static void		evalTextureCubeShadowGrad		(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = textureCubeShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGradCube(c)); }
 static void		evalTexture2DArrayShadowGrad	(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DArrayShadow(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c)); }
+static void		evalTexture1DShadowGrad			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DShadow(c, c.in[0].z(), c.in[0].x(), computeLodFromGrad1D(c)); }
+static void		evalTexture1DArrayShadowGrad	(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DArrayShadow(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad1DArray(c)); }
 
 static void		evalTexture2DGradOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DArrayGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DArrayOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DGradOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad3D(c), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DGradOffset			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x(), computeLodFromGrad1D(c), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DArrayGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DArrayOffset(c, c.in[0].x(), c.in[0].y(), computeLodFromGrad1DArray(c), p.offset.x())*p.scale + p.bias; }
 
 static void		evalTexture2DShadowGradOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad2D(c), p.offset.swizzle(0,1)); }
 static void		evalTexture2DArrayShadowGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DArrayShadowOffset(c, c.in[0].w(), c.in[0].x(), c.in[0].y(), c.in[0].z(), computeLodFromGrad2DArray(c), p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowGradOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z(), c.in[0].x(), computeLodFromGrad1D(c), p.offset.x()); }
+static void		evalTexture1DArrayShadowGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DArrayShadowOffset(c, c.in[0].z(), c.in[0].x(), c.in[0].y(), computeLodFromGrad1DArray(c), p.offset.x()); }
 
 static void		evalTexture2DShadowProjGrad			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture2DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c)); }
 static void		evalTexture2DShadowProjGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture2DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c), p.offset.swizzle(0,1)); }
+static void		evalTexture1DShadowProjGrad			(ShaderEvalContext& c, const TexLookupParams&)		{ c.color.x() = texture1DShadow(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), computeLodFromGrad1D(c)); }
+static void		evalTexture1DShadowProjGradOffset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color.x() = texture1DShadowOffset(c, c.in[0].z()/c.in[0].w(), c.in[0].x()/c.in[0].w(), computeLodFromGrad1D(c), p.offset.x()); }
 
 static void		evalTexture2DProjGrad3			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), computeLodFromGrad2D(c))*p.scale + p.bias; }
 static void		evalTexture2DProjGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c))*p.scale + p.bias; }
 static void		evalTexture3DProjGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3D(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), computeLodFromGrad3D(c))*p.scale + p.bias; }
+static void		evalTexture1DProjGrad2			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].y(), computeLodFromGrad1D(c))*p.scale + p.bias; }
+static void		evalTexture1DProjGrad			(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1D(c, c.in[0].x()/c.in[0].w(), computeLodFromGrad1D(c))*p.scale + p.bias; }
 
 static void		evalTexture2DProjGrad3Offset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].z(), c.in[0].y()/c.in[0].z(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture2DProjGradOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture2DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), computeLodFromGrad2D(c), p.offset.swizzle(0,1))*p.scale + p.bias; }
 static void		evalTexture3DProjGradOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture3DOffset(c, c.in[0].x()/c.in[0].w(), c.in[0].y()/c.in[0].w(), c.in[0].z()/c.in[0].w(), computeLodFromGrad3D(c), p.offset)*p.scale + p.bias; }
+static void		evalTexture1DProjGrad2Offset	(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].y(), computeLodFromGrad1D(c), p.offset.x())*p.scale + p.bias; }
+static void		evalTexture1DProjGradOffset		(ShaderEvalContext& c, const TexLookupParams& p)	{ c.color = texture1DOffset(c, c.in[0].x()/c.in[0].w(), computeLodFromGrad1D(c), p.offset.x())*p.scale + p.bias; }
 
 // Texel fetch variants
 
@@ -512,6 +617,21 @@
 	c.color = c.textures[0].tex3D->getLevel(lod).getPixel(x, y, z)*p.scale + p.bias;
 }
 
+static void evalTexelFetch1D (ShaderEvalContext& c, const TexLookupParams& p)
+{
+	int	x	= deChopFloatToInt32(c.in[0].x())+p.offset.x();
+	int	lod = deChopFloatToInt32(c.in[1].x());
+	c.color = c.textures[0].tex1D->getLevel(lod).getPixel(x, 0)*p.scale + p.bias;
+}
+
+static void evalTexelFetch1DArray (ShaderEvalContext& c, const TexLookupParams& p)
+{
+	int	x	= deChopFloatToInt32(c.in[0].x())+p.offset.x();
+	int	l	= deChopFloatToInt32(c.in[0].y());
+	int	lod = deChopFloatToInt32(c.in[1].x());
+	c.color = c.textures[0].tex1DArray->getLevel(lod).getPixel(x, l)*p.scale + p.bias;
+}
+
 class TexLookupEvaluator : public ShaderEvaluator
 {
 public:
@@ -525,6 +645,17 @@
 	const TexLookupParams&	m_lookupParams;
 };
 
+static void checkDeviceFeatures (Context& context, TextureType textureType)
+{
+	if (textureType == TEXTURETYPE_CUBE_ARRAY)
+	{
+		const vk::VkPhysicalDeviceFeatures&	deviceFeatures	= context.getDeviceFeatures();
+
+		if (!deviceFeatures.imageCubeArray)
+			TCU_THROW(NotSupportedError, "Cube array is not supported");
+	}
+}
+
 class ShaderTextureFunctionInstance : public ShaderRenderCaseInstance
 {
 public:
@@ -560,6 +691,8 @@
 	, m_textureSpec				(textureSpec)
 	, m_lookupParams			(lookupParams)
 {
+	checkDeviceFeatures(m_context, m_textureSpec.type);
+
 	{
 		// Base coord scale & bias
 		Vec4 s = m_lookupSpec.maxCoord-m_lookupSpec.minCoord;
@@ -657,7 +790,7 @@
 	bool					isProj			= functionHasProj(m_lookupSpec.function);
 	bool					isAutoLod		= functionHasAutoLod(m_isVertexCase ? glu::SHADERTYPE_VERTEX : glu::SHADERTYPE_FRAGMENT,
 																 m_lookupSpec.function); // LOD can vary significantly
-	float					proj			= isProj ? 1.0f/m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f;
+	float					proj			= isProj ? 1.0f/m_lookupSpec.minCoord[m_lookupSpec.function == FUNCTION_TEXTUREPROJ2 ? 1 : m_lookupSpec.function == FUNCTION_TEXTUREPROJ3 ? 2 : 3] : 1.0f;
 	TexLookupParams			lookupParams;
 
 	switch (m_textureSpec.type)
@@ -822,6 +955,140 @@
 			break;
 		}
 
+		case TEXTURETYPE_1D:
+		{
+			float								levelStep		= isAutoLod ? 0.0f : 1.0f / (float)de::max(1, m_textureSpec.numLevels-1);
+			Vec4								cScale			= fmtInfo.valueMax-fmtInfo.valueMin;
+			Vec4								cBias			= fmtInfo.valueMin;
+			int									baseCellSize	= m_textureSpec.width/4;
+			de::MovePtr<tcu::Texture1D>			texture1D;
+
+			texture1D = de::MovePtr<tcu::Texture1D>(new tcu::Texture1D(texFmt, m_textureSpec.width));
+
+			for (int level = 0; level < m_textureSpec.numLevels; level++)
+			{
+				float	fA		= float(level)*levelStep;
+				float	fB		= 1.0f-fA;
+				Vec4	colorA	= cBias + cScale*Vec4(fA, fB, fA, fB);
+				Vec4	colorB	= cBias + cScale*Vec4(fB, fA, fB, fA);
+
+				texture1D->allocLevel(level);
+				tcu::fillWithGrid(texture1D->getLevel(level), de::max(1, baseCellSize>>level), colorA, colorB);
+			}
+
+			// Compute LOD.
+			float	dudx	= (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*(float)m_textureSpec.width	/ (float)viewportSize[0];
+			lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f);
+
+			// Append to texture list.
+			m_textures.push_back(TextureBindingSp(new TextureBinding(texture1D.release(), m_textureSpec.sampler)));
+			break;
+		}
+
+		case TEXTURETYPE_1D_ARRAY:
+		{
+			float								layerStep		= 1.0f / (float)m_textureSpec.depth;
+			float								levelStep		= isAutoLod ? 0.0f : 1.0f / (float)(de::max(1, m_textureSpec.numLevels-1)*m_textureSpec.depth);
+			Vec4								cScale			= fmtInfo.valueMax-fmtInfo.valueMin;
+			Vec4								cBias			= fmtInfo.valueMin;
+			int									baseCellSize	= m_textureSpec.width/4;
+			de::MovePtr<tcu::Texture1DArray>	texture1DArray;
+
+			texture1DArray = de::MovePtr<tcu::Texture1DArray>(new tcu::Texture1DArray(texFmt, m_textureSpec.width, m_textureSpec.depth));
+
+			for (int level = 0; level < m_textureSpec.numLevels; level++)
+			{
+				texture1DArray->allocLevel(level);
+				tcu::PixelBufferAccess levelAccess = texture1DArray->getLevel(level);
+
+				for (int layer = 0; layer < levelAccess.getHeight(); layer++)
+				{
+					float	fA		= (float)layer*layerStep + (float)level*levelStep;
+					float	fB		= 1.0f-fA;
+					Vec4	colorA	= cBias + cScale*Vec4(fA, fB, fA, fB);
+					Vec4	colorB	= cBias + cScale*Vec4(fB, fA, fB, fA);
+
+					tcu::fillWithGrid(tcu::getSubregion(levelAccess, 0, layer, 0, levelAccess.getWidth(), 1, 1), de::max(1, baseCellSize>>level), colorA, colorB);
+				}
+			}
+
+			// Compute LOD.
+			float	dudx	= (m_lookupSpec.maxCoord[0]-m_lookupSpec.minCoord[0])*proj*(float)m_textureSpec.width	/ (float)viewportSize[0];
+			lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f);
+
+			// Append to texture list.
+			m_textures.push_back(TextureBindingSp(new TextureBinding(texture1DArray.release(), m_textureSpec.sampler)));
+			break;
+		}
+
+		case TEXTURETYPE_CUBE_ARRAY:
+		{
+			float								layerStep			= 1.0f / (float)(m_textureSpec.depth/6);
+			float								levelStep			= isAutoLod ? 0.0f : 1.0f / (float)(de::max(1, m_textureSpec.numLevels-1)*(m_textureSpec.depth/6));
+			Vec4								cScale				= fmtInfo.valueMax-fmtInfo.valueMin;
+			Vec4								cBias				= fmtInfo.valueMin;
+			Vec4								cCorner				= cBias + cScale*0.5f;
+			int									baseCellSize		= de::min(m_textureSpec.width/4, m_textureSpec.height/4);
+			de::MovePtr<tcu::TextureCubeArray>	textureCubeArray;
+
+			DE_ASSERT(m_textureSpec.width == m_textureSpec.height);
+			DE_ASSERT(m_textureSpec.depth % 6 == 0);
+
+			textureCubeArray = de::MovePtr<tcu::TextureCubeArray>(new tcu::TextureCubeArray(texFmt, m_textureSpec.width, m_textureSpec.depth));
+
+			for (int level = 0; level < m_textureSpec.numLevels; level++)
+			{
+				float	fA		= float(level)*levelStep;
+				float	fB		= 1.0f-fA;
+				Vec2	f		(fA, fB);
+
+				textureCubeArray->allocLevel(level);
+				tcu::PixelBufferAccess levelAccess = textureCubeArray->getLevel(level);
+
+				for (int layer = 0; layer < m_textureSpec.depth/6; layer++)
+				{
+					float layerCorr = 1.0f-(float)layer*layerStep;
+
+					for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
+					{
+						const IVec4&	swzA	= texCubeSwz[face];
+						IVec4			swzB	= 1-swzA;
+						Vec4			colorA	= cBias + cScale*f.swizzle(swzA[0], swzA[1], swzA[2], swzA[3])*layerCorr;
+						Vec4			colorB	= cBias + cScale*f.swizzle(swzB[0], swzB[1], swzB[2], swzB[3])*layerCorr;
+
+						{
+							const tcu::PixelBufferAccess	access		= tcu::getSubregion(levelAccess, 0, 0, (layer*6)+face, levelAccess.getWidth(), levelAccess.getHeight(), 1);
+							const int						lastPix		= access.getWidth()-1;
+
+							tcu::fillWithGrid(access, de::max(1, baseCellSize>>level), colorA, colorB);
+
+							// Ensure all corners have identical colors in order to avoid dealing with ambiguous corner texel filtering
+							access.setPixel(cCorner, 0, 0);
+							access.setPixel(cCorner, 0, lastPix);
+							access.setPixel(cCorner, lastPix, 0);
+							access.setPixel(cCorner, lastPix, lastPix);
+						}
+					}
+				}
+			}
+
+			// Compute LOD \note Assumes that only single side is accessed and R is constant major axis.
+			DE_ASSERT(de::abs(m_lookupSpec.minCoord[2] - m_lookupSpec.maxCoord[2]) < 0.005);
+			DE_ASSERT(de::abs(m_lookupSpec.minCoord[0]) < de::abs(m_lookupSpec.minCoord[2]) && de::abs(m_lookupSpec.maxCoord[0]) < de::abs(m_lookupSpec.minCoord[2]));
+			DE_ASSERT(de::abs(m_lookupSpec.minCoord[1]) < de::abs(m_lookupSpec.minCoord[2]) && de::abs(m_lookupSpec.maxCoord[1]) < de::abs(m_lookupSpec.minCoord[2]));
+
+			tcu::CubeFaceFloatCoords	c00		= tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj));
+			tcu::CubeFaceFloatCoords	c10		= tcu::getCubeFaceCoords(Vec3(m_lookupSpec.maxCoord[0]*proj, m_lookupSpec.minCoord[1]*proj, m_lookupSpec.minCoord[2]*proj));
+			tcu::CubeFaceFloatCoords	c01		= tcu::getCubeFaceCoords(Vec3(m_lookupSpec.minCoord[0]*proj, m_lookupSpec.maxCoord[1]*proj, m_lookupSpec.minCoord[2]*proj));
+			float						dudx	= (c10.s - c00.s)*(float)m_textureSpec.width	/ (float)viewportSize[0];
+			float						dvdy	= (c01.t - c00.t)*(float)m_textureSpec.height	/ (float)viewportSize[1];
+			lookupParams.lod = computeLodFromDerivates(DEFAULT_LOD_MODE, dudx, 0.0f, 0.0f, dvdy);
+
+			// Append to texture list.
+			m_textures.push_back(TextureBindingSp(new TextureBinding(textureCubeArray.release(), m_textureSpec.sampler)));
+			break;
+		}
+
 		default:
 			DE_ASSERT(DE_FALSE);
 	}
@@ -890,17 +1157,24 @@
 	bool				isGrad				= functionHasGrad(function);
 	bool				isShadow			= m_textureSpec.sampler.compare != tcu::Sampler::COMPAREMODE_NONE;
 	bool				is2DProj4			= !isShadow && m_textureSpec.type == TEXTURETYPE_2D && (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD);
+	bool				is1DProj4			= !isShadow && m_textureSpec.type == TEXTURETYPE_1D && (function == FUNCTION_TEXTUREPROJ || function == FUNCTION_TEXTUREPROJLOD || function == FUNCTION_TEXTUREPROJGRAD);
 	bool				isIntCoord			= function == FUNCTION_TEXELFETCH;
 	bool				hasLodBias			= functionHasLod(m_lookupSpec.function) || m_lookupSpec.useBias;
-	int					texCoordComps		= m_textureSpec.type == TEXTURETYPE_2D ? 2 : 3;
-	int					extraCoordComps		= (isProj ? (is2DProj4 ? 2 : 1) : 0) + (isShadow ? 1 : 0);
-	glu::DataType		coordType			= glu::getDataTypeFloatVec(texCoordComps+extraCoordComps);
+	int					texCoordComps		= m_textureSpec.type == TEXTURETYPE_1D ? 1 :
+											  m_textureSpec.type == TEXTURETYPE_1D_ARRAY || m_textureSpec.type == TEXTURETYPE_2D ? 2 :
+											  m_textureSpec.type == TEXTURETYPE_CUBE_ARRAY ? 4 :
+											  3;
+	int					extraCoordComps		= (isProj ? (is2DProj4 ? 2 : (is1DProj4 ? 3 : 1)) : 0) + (isShadow ? (m_textureSpec.type == TEXTURETYPE_1D ? 2 : 1) : 0);
+	const bool			isCubeArrayShadow	= isShadow && m_textureSpec.type == TEXTURETYPE_CUBE_ARRAY;
+	glu::DataType		coordType			= glu::getDataTypeFloatVec(isCubeArrayShadow ? 4 : texCoordComps+extraCoordComps);
 	glu::Precision		coordPrec			= glu::PRECISION_HIGHP;
 	const char*			coordTypeName		= glu::getDataTypeName(coordType);
 	const char*			coordPrecName		= glu::getPrecisionName(coordPrec);
 	tcu::TextureFormat	texFmt				= glu::mapGLInternalFormat(m_textureSpec.format);
 	glu::DataType		samplerType			= glu::TYPE_LAST;
-	glu::DataType		gradType			= (m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_3D) ? glu::TYPE_FLOAT_VEC3 : glu::TYPE_FLOAT_VEC2;
+	glu::DataType		gradType			= m_textureSpec.type == TEXTURETYPE_1D || m_textureSpec.type == TEXTURETYPE_1D_ARRAY ? glu::TYPE_FLOAT :
+											  m_textureSpec.type == TEXTURETYPE_3D || m_textureSpec.type == TEXTURETYPE_CUBE_MAP || m_textureSpec.type == TEXTURETYPE_CUBE_ARRAY ? glu::TYPE_FLOAT_VEC3 :
+											  glu::TYPE_FLOAT_VEC2;
 	const char*			gradTypeName		= glu::getDataTypeName(gradType);
 	const char*			baseFuncName		= DE_NULL;
 
@@ -908,10 +1182,13 @@
 
 	switch (m_textureSpec.type)
 	{
-		case TEXTURETYPE_2D:		samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW		: glu::getSampler2DType(texFmt);		break;
-		case TEXTURETYPE_CUBE_MAP:	samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW		: glu::getSamplerCubeType(texFmt);		break;
-		case TEXTURETYPE_2D_ARRAY:	samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW	: glu::getSampler2DArrayType(texFmt);	break;
-		case TEXTURETYPE_3D:		DE_ASSERT(!isShadow); samplerType = glu::getSampler3DType(texFmt);									break;
+		case TEXTURETYPE_2D:			samplerType = isShadow ? glu::TYPE_SAMPLER_2D_SHADOW			: glu::getSampler2DType(texFmt);		break;
+		case TEXTURETYPE_CUBE_MAP:		samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_SHADOW			: glu::getSamplerCubeType(texFmt);		break;
+		case TEXTURETYPE_2D_ARRAY:		samplerType = isShadow ? glu::TYPE_SAMPLER_2D_ARRAY_SHADOW		: glu::getSampler2DArrayType(texFmt);	break;
+		case TEXTURETYPE_3D:			DE_ASSERT(!isShadow); samplerType = glu::getSampler3DType(texFmt);										break;
+		case TEXTURETYPE_1D:			samplerType = isShadow ? glu::TYPE_SAMPLER_1D_SHADOW			: glu::getSampler1DType(texFmt);		break;
+		case TEXTURETYPE_1D_ARRAY:		samplerType = isShadow ? glu::TYPE_SAMPLER_1D_ARRAY_SHADOW		: glu::getSampler1DArrayType(texFmt);	break;
+		case TEXTURETYPE_CUBE_ARRAY:	samplerType = isShadow ? glu::TYPE_SAMPLER_CUBE_ARRAY_SHADOW	: glu::getSamplerCubeArrayType(texFmt);	break;
 		default:
 			DE_ASSERT(DE_FALSE);
 	}
@@ -920,12 +1197,15 @@
 	{
 		case FUNCTION_TEXTURE:			baseFuncName = "texture";			break;
 		case FUNCTION_TEXTUREPROJ:		baseFuncName = "textureProj";		break;
+		case FUNCTION_TEXTUREPROJ2:		baseFuncName = "textureProj";		break;
 		case FUNCTION_TEXTUREPROJ3:		baseFuncName = "textureProj";		break;
 		case FUNCTION_TEXTURELOD:		baseFuncName = "textureLod";		break;
 		case FUNCTION_TEXTUREPROJLOD:	baseFuncName = "textureProjLod";	break;
+		case FUNCTION_TEXTUREPROJLOD2:	baseFuncName = "textureProjLod";	break;
 		case FUNCTION_TEXTUREPROJLOD3:	baseFuncName = "textureProjLod";	break;
 		case FUNCTION_TEXTUREGRAD:		baseFuncName = "textureGrad";		break;
 		case FUNCTION_TEXTUREPROJGRAD:	baseFuncName = "textureProjGrad";	break;
+		case FUNCTION_TEXTUREPROJGRAD2:	baseFuncName = "textureProjGrad";	break;
 		case FUNCTION_TEXTUREPROJGRAD3:	baseFuncName = "textureProjGrad";	break;
 		case FUNCTION_TEXELFETCH:		baseFuncName = "texelFetch";		break;
 		default:
@@ -935,8 +1215,29 @@
 	std::ostringstream	vert;
 	std::ostringstream	frag;
 	std::ostringstream&	op		= isVtxCase ? vert : frag;
+	glu::GLSLVersion	version	= glu::GLSL_VERSION_LAST;
 
-	vert << "#version 310 es\n"
+	switch (m_textureSpec.type)
+	{
+		case TEXTURETYPE_2D:
+		case TEXTURETYPE_3D:
+		case TEXTURETYPE_CUBE_MAP:
+		case TEXTURETYPE_2D_ARRAY:
+			version = glu::GLSL_VERSION_310_ES;
+			break;
+
+		case TEXTURETYPE_1D:
+		case TEXTURETYPE_1D_ARRAY:
+		case TEXTURETYPE_CUBE_ARRAY:
+			version = glu::GLSL_VERSION_420;
+			break;
+
+		default:
+			DE_ASSERT(DE_FALSE);
+			break;
+	}
+
+	vert << glu::getGLSLVersionDeclaration(version) << "\n"
 		 << "layout(location = 0) in highp vec4 a_position;\n"
 		 << "layout(location = 4) in " << coordPrecName << " " << coordTypeName << " a_in0;\n";
 
@@ -948,7 +1249,7 @@
 	else if (hasLodBias)
 		vert << "layout(location = 5) in " << coordPrecName << " float a_in1;\n";
 
-	frag << "#version 310 es\n"
+	frag << glu::getGLSLVersionDeclaration(version) << "\n"
 		 << "layout(location = 0) out mediump vec4 o_color;\n";
 
 	if (isVtxCase)
@@ -980,6 +1281,11 @@
 	   << "layout(set = 0, binding = 1) uniform buf0 { highp vec4 u_scale; };\n"
 	   << "layout(set = 0, binding = 2) uniform buf1 { highp vec4 u_bias; };\n";
 
+	if (version != glu::GLSL_VERSION_310_ES)
+		vert << "out gl_PerVertex {\n"
+			 << "\tvec4 gl_Position;\n"
+			 << "};\n";
+
 	vert << "\nvoid main()\n{\n"
 		 << "\tgl_Position = a_position;\n";
 	frag << "\nvoid main()\n{\n";
@@ -1002,7 +1308,7 @@
 		op << "(u_sampler, ";
 
 		if (isIntCoord)
-			op << "ivec" << (texCoordComps+extraCoordComps) << "(";
+			op << glu::getDataTypeName(glu::getDataTypeIntVec(texCoordComps+extraCoordComps)) << "(";
 
 		op << texCoord;
 
@@ -1022,9 +1328,10 @@
 
 		if (m_lookupSpec.useOffset)
 		{
-			int offsetComps = m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2;
+			int offsetComps = m_textureSpec.type == TEXTURETYPE_1D || m_textureSpec.type == TEXTURETYPE_1D_ARRAY ? 1 :
+							  m_textureSpec.type == TEXTURETYPE_3D ? 3 : 2;
 
-			op << ", ivec" << offsetComps << "(";
+			op << ", " << glu::getDataTypeName(glu::getDataTypeIntVec(offsetComps)) << "(";
 			for (int ndx = 0; ndx < offsetComps; ndx++)
 			{
 				if (ndx != 0)
@@ -1034,6 +1341,9 @@
 			op << ")";
 		}
 
+		if (isCubeArrayShadow && m_lookupSpec.function == FUNCTION_TEXTURE)
+			op << ", " << texCoord << ".w";
+
 		if (m_lookupSpec.useBias)
 			op << ", " << lodBias;
 
@@ -1079,17 +1389,6 @@
 	QUERYFUNCTION_LAST
 };
 
-static void checkDeviceFeatures (Context& context, TextureType textureType)
-{
-	if (textureType == TEXTURETYPE_CUBE_ARRAY)
-	{
-		const vk::VkPhysicalDeviceFeatures&	deviceFeatures	= context.getDeviceFeatures();
-
-		if (!deviceFeatures.imageCubeArray)
-			TCU_THROW(NotSupportedError, "Cube array is not supported");
-	}
-}
-
 class TextureQueryInstance : public ShaderRenderCaseInstance
 {
 public:
@@ -2791,18 +3090,25 @@
 
 	for (int ndx = 0; ndx < numCases; ndx++)
 	{
-		std::string name = cases[ndx].name;
+		std::string	name			= cases[ndx].name;
+		bool		sparseSupported	= !functionHasProj(cases[ndx].lookupSpec.function)		&&
+									  TEXTURETYPE_1D			!= cases[ndx].texSpec.type	&&
+									  TEXTURETYPE_1D_ARRAY		!= cases[ndx].texSpec.type	&&
+									  TEXTURETYPE_CUBE_ARRAY	!= cases[ndx].texSpec.type;
+
 		if (cases[ndx].flags & VERTEX)
 		{
-			if (!functionHasProj(cases[ndx].lookupSpec.function))
+			if (sparseSupported)
 				group->addChild(new SparseShaderTextureFunctionCase(parent->getTestContext(), ("sparse_" + name + "_vertex"),   "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, true ));
+
 			group->addChild(new ShaderTextureFunctionCase(parent->getTestContext(), (name + "_vertex"),   "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, true ));
 		}
 
 		if (cases[ndx].flags & FRAGMENT)
 		{
-			if (!functionHasProj(cases[ndx].lookupSpec.function))
+			if (sparseSupported)
 				group->addChild(new SparseShaderTextureFunctionCase(parent->getTestContext(), ("sparse_" + name + "_fragment"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, false));
+
 			group->addChild(new ShaderTextureFunctionCase(parent->getTestContext(), (name + "_fragment"), "", cases[ndx].lookupSpec, cases[ndx].texSpec, cases[ndx].evalFunc, false));
 		}
 	}
@@ -2918,6 +3224,11 @@
 	static const TextureSpec tex1DShadow			(TEXTURETYPE_1D,		GL_DEPTH_COMPONENT16,	256,	1,	1,	1,	samplerShadowNoMipmap);
 	static const TextureSpec tex1DMipmapShadow		(TEXTURETYPE_1D,		GL_DEPTH_COMPONENT16,	256,	1,	1,	9,	samplerShadowMipmap);
 
+	static const TextureSpec tex1DTexelFetchFixed	(TEXTURETYPE_1D,		GL_RGBA8,				256,	1,	1,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DTexelFetchFloat	(TEXTURETYPE_1D,		GL_RGBA16F,				256,	1,	1,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DTexelFetchInt		(TEXTURETYPE_1D,		GL_RGBA8I,				256,	1,	1,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DTexelFetchUint	(TEXTURETYPE_1D,		GL_RGBA8UI,				256,	1,	1,	9,	samplerTexelFetch);
+
 	static const TextureSpec tex1DArrayFixed		(TEXTURETYPE_1D_ARRAY,	GL_RGBA8,	256,	1,	4,	1,	samplerLinearNoMipmap);
 	static const TextureSpec tex1DArrayFloat		(TEXTURETYPE_1D_ARRAY,	GL_RGBA16F,	256,	1,	4,	1,	samplerLinearNoMipmap);
 	static const TextureSpec tex1DArrayInt			(TEXTURETYPE_1D_ARRAY,	GL_RGBA8I,	256,	1,	4,	1,	samplerNearestNoMipmap);
@@ -2930,17 +3241,22 @@
 	static const TextureSpec tex1DArrayShadow		(TEXTURETYPE_1D_ARRAY,	GL_DEPTH_COMPONENT16,	256,	1,	4,	1,	samplerShadowNoMipmap);
 	static const TextureSpec tex1DArrayMipmapShadow	(TEXTURETYPE_1D_ARRAY,	GL_DEPTH_COMPONENT16,	256,	1,	4,	9,	samplerShadowMipmap);
 
-	static const TextureSpec texCubeArrayFixed			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8,	256,	256,	12,	1,	samplerLinearNoMipmap);
-	static const TextureSpec texCubeArrayFloat			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA16F,	256,	256,	12,	1,	samplerLinearNoMipmap);
-	static const TextureSpec texCubeArrayInt			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8I,	256,	256,	12,	1,	samplerNearestNoMipmap);
-	static const TextureSpec texCubeArrayUint			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8UI,	256,	256,	12,	1,	samplerNearestNoMipmap);
-	static const TextureSpec texCubeArrayMipmapFixed	(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8,	256,	256,	12,	9,	samplerLinearMipmap);
-	static const TextureSpec texCubeArrayMipmapFloat	(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA16F,	128,	128,	12,	8,	samplerLinearMipmap);
-	static const TextureSpec texCubeArrayMipmapInt		(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8I,	256,	256,	12,	9,	samplerNearestMipmap);
-	static const TextureSpec texCubeArrayMipmapUint		(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8UI,	256,	256,	12,	9,	samplerNearestMipmap);
+	static const TextureSpec tex1DArrayTexelFetchFixed	(TEXTURETYPE_1D_ARRAY,	GL_RGBA8,	256,	1,	4,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DArrayTexelFetchFloat	(TEXTURETYPE_1D_ARRAY,	GL_RGBA16F,	256,	1,	4,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DArrayTexelFetchInt	(TEXTURETYPE_1D_ARRAY,	GL_RGBA8I,	256,	1,	4,	9,	samplerTexelFetch);
+	static const TextureSpec tex1DArrayTexelFetchUint	(TEXTURETYPE_1D_ARRAY,	GL_RGBA8UI,	256,	1,	4,	9,	samplerTexelFetch);
 
-	static const TextureSpec texCubeArrayShadow			(TEXTURETYPE_CUBE_ARRAY,	GL_DEPTH_COMPONENT16,	256,	256,	12,	1,	samplerShadowNoMipmap);
-	static const TextureSpec texCubeArrayMipmapShadow	(TEXTURETYPE_CUBE_ARRAY,	GL_DEPTH_COMPONENT16,	256,	256,	12,	9,	samplerShadowMipmap);
+	static const TextureSpec texCubeArrayFixed			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8,	64,		64,		12,	1,	samplerLinearNoMipmap);
+	static const TextureSpec texCubeArrayFloat			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA16F,	64,		64,		12,	1,	samplerLinearNoMipmap);
+	static const TextureSpec texCubeArrayInt			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8I,	64,		64,		12,	1,	samplerNearestNoMipmap);
+	static const TextureSpec texCubeArrayUint			(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8UI,	64,		64,		12,	1,	samplerNearestNoMipmap);
+	static const TextureSpec texCubeArrayMipmapFixed	(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8,	64,		64,		12,	7,	samplerLinearMipmap);
+	static const TextureSpec texCubeArrayMipmapFloat	(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA16F,	64,		64,		12,	7,	samplerLinearMipmap);
+	static const TextureSpec texCubeArrayMipmapInt		(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8I,	64,		64,		12,	7,	samplerNearestMipmap);
+	static const TextureSpec texCubeArrayMipmapUint		(TEXTURETYPE_CUBE_ARRAY,	GL_RGBA8UI,	64,		64,		12,	7,	samplerNearestMipmap);
+
+	static const TextureSpec texCubeArrayShadow			(TEXTURETYPE_CUBE_ARRAY,	GL_DEPTH_COMPONENT16,	64,		64,		12,	1,	samplerShadowNoMipmap);
+	static const TextureSpec texCubeArrayMipmapShadow	(TEXTURETYPE_CUBE_ARRAY,	GL_DEPTH_COMPONENT16,	64,		64,		12,	7,	samplerShadowMipmap);
 
 	// texture() cases
 	static const TexFuncCaseSpec textureCases[] =
@@ -3002,6 +3318,48 @@
 		CASE_SPEC(isampler3d_bias,				FUNCTION_TEXTURE,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex3DMipmapInt,			evalTexture3DBias,		FRAGMENT),
 		CASE_SPEC(usampler3d_bias,				FUNCTION_TEXTURE,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DBias,		FRAGMENT),
 
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFixed,				evalTexture1D,			VERTEX),
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1D,			FRAGMENT),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFloat,				evalTexture1D,			VERTEX),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1D,			FRAGMENT),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DInt,				evalTexture1D,			VERTEX),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1D,			FRAGMENT),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DUint,				evalTexture1D,			VERTEX),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1D,			FRAGMENT),
+
+		CASE_SPEC(sampler1d_bias_fixed,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DBias,		FRAGMENT),
+		CASE_SPEC(sampler1d_bias_float,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DBias,		FRAGMENT),
+		CASE_SPEC(isampler1d_bias,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DBias,		FRAGMENT),
+		CASE_SPEC(usampler1d_bias,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DBias,		FRAGMENT),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayFixed,		evalTexture1DArray,		VERTEX),
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayMipmapFixed,	evalTexture1DArray,		FRAGMENT),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayFloat,		evalTexture1DArray,		VERTEX),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayMipmapFloat,	evalTexture1DArray,		FRAGMENT),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayInt,			evalTexture1DArray,		VERTEX),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayMipmapInt,	evalTexture1DArray,		FRAGMENT),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayUint,			evalTexture1DArray,		VERTEX),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayMipmapUint,	evalTexture1DArray,		FRAGMENT),
+
+		CASE_SPEC(sampler1darray_bias_fixed,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayMipmapFixed,	evalTexture1DArrayBias,	FRAGMENT),
+		CASE_SPEC(sampler1darray_bias_float,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayMipmapFloat,	evalTexture1DArrayBias,	FRAGMENT),
+		CASE_SPEC(isampler1darray_bias,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayMipmapInt,	evalTexture1DArrayBias,	FRAGMENT),
+		CASE_SPEC(usampler1darray_bias,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayMipmapUint,	evalTexture1DArrayBias,	FRAGMENT),
+
+		CASE_SPEC(samplercubearray_fixed,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayFixed,			evalTextureCubeArray,		VERTEX),
+		CASE_SPEC(samplercubearray_fixed,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayMipmapFixed,	evalTextureCubeArray,		FRAGMENT),
+		CASE_SPEC(samplercubearray_float,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayFloat,			evalTextureCubeArray,		VERTEX),
+		CASE_SPEC(samplercubearray_float,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayMipmapFloat,	evalTextureCubeArray,		FRAGMENT),
+		CASE_SPEC(isamplercubearray,			FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayInt,			evalTextureCubeArray,		VERTEX),
+		CASE_SPEC(isamplercubearray,			FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayMipmapInt,		evalTextureCubeArray,		FRAGMENT),
+		CASE_SPEC(usamplercubearray,			FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayUint,			evalTextureCubeArray,		VERTEX),
+		CASE_SPEC(usamplercubearray,			FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayMipmapUint,		evalTextureCubeArray,		FRAGMENT),
+
+		CASE_SPEC(samplercubearray_bias_fixed,	FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	texCubeArrayMipmapFixed,	evalTextureCubeArrayBias,	FRAGMENT),
+		CASE_SPEC(samplercubearray_bias_float,	FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	texCubeArrayMipmapFloat,	evalTextureCubeArrayBias,	FRAGMENT),
+		CASE_SPEC(isamplercubearray_bias,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	texCubeArrayMipmapInt,		evalTextureCubeArrayBias,	FRAGMENT),
+		CASE_SPEC(usamplercubearray_bias,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	texCubeArrayMipmapUint,		evalTextureCubeArrayBias,	FRAGMENT),
+
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DShadow,			evalTexture2DShadow,			VERTEX),
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadow,			FRAGMENT),
 		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowBias,		FRAGMENT),
@@ -3011,10 +3369,17 @@
 		CASE_SPEC(samplercubeshadow_bias,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f,  0.0f),	Vec4( 1.0f,  1.0f,  1.01f,  1.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	texCubeMipmapShadow,	evalTextureCubeShadowBias,		FRAGMENT),
 
 		CASE_SPEC(sampler2darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DArrayShadow,		evalTexture2DArrayShadow,		VERTEX),
-		CASE_SPEC(sampler2darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadow,		FRAGMENT)
+		CASE_SPEC(sampler2darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadow,		FRAGMENT),
 
-		// Not in spec.
-//		CASE_SPEC(sampler2darrayshadow_bias,	(FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	true,	-2.0f,	2.0f,	Vec2(0.0f),	Vec2(0.0f), false,	IVec3(0)),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowBias,	FRAGMENT)
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DShadow,			evalTexture1DShadow,			VERTEX),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadow,			FRAGMENT),
+		CASE_SPEC(sampler1dshadow_bias,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowBias,		FRAGMENT),
+
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayShadow,		evalTexture1DArrayShadow,		VERTEX),
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadow,		FRAGMENT),
+		CASE_SPEC(sampler1darrayshadow_bias,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowBias,	FRAGMENT),
+
+		CASE_SPEC(samplercubearrayshadow,		FUNCTION_TEXTURE,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	texCubeArrayMipmapShadow,	evalTextureCubeArrayShadow,		FRAGMENT),
 	};
 	createCaseGroup(this, "texture", "texture() Tests", textureCases, DE_LENGTH_OF_ARRAY(textureCases));
 
@@ -3065,9 +3430,45 @@
 		CASE_SPEC(isampler3d_bias,				FUNCTION_TEXTURE,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(3, -8, 7),	tex3DInt,				evalTexture3DOffsetBias,		FRAGMENT),
 		CASE_SPEC(usampler3d_bias,				FUNCTION_TEXTURE,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 3),	tex3DUint,				evalTexture3DOffsetBias,		FRAGMENT),
 
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowOffset,		VERTEX),
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowOffset,		FRAGMENT),
-		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowOffsetBias,	FRAGMENT)
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DOffset,			VERTEX),
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DMipmapFixed,		evalTexture1DOffset,			FRAGMENT),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFloat,				evalTexture1DOffset,			VERTEX),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DMipmapFloat,		evalTexture1DOffset,			FRAGMENT),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DOffset,			VERTEX),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DMipmapInt,			evalTexture1DOffset,			FRAGMENT),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DUint,				evalTexture1DOffset,			VERTEX),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DMipmapUint,		evalTexture1DOffset,			FRAGMENT),
+
+		CASE_SPEC(sampler1d_bias_fixed,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DOffsetBias,		FRAGMENT),
+		CASE_SPEC(sampler1d_bias_float,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3( 7, 0, 0),	tex1DFloat,				evalTexture1DOffsetBias,		FRAGMENT),
+		CASE_SPEC(isampler1d_bias,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DOffsetBias,		FRAGMENT),
+		CASE_SPEC(usampler1d_bias,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3( 7, 0, 0),	tex1DUint,				evalTexture1DOffsetBias,		FRAGMENT),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayFixed,		evalTexture1DArrayOffset,		VERTEX),
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayMipmapFixed,	evalTexture1DArrayOffset,		FRAGMENT),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayFloat,		evalTexture1DArrayOffset,		VERTEX),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayMipmapFloat,	evalTexture1DArrayOffset,		FRAGMENT),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayInt,			evalTexture1DArrayOffset,		VERTEX),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayMipmapInt,	evalTexture1DArrayOffset,		FRAGMENT),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayUint,			evalTexture1DArrayOffset,		VERTEX),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayMipmapUint,	evalTexture1DArrayOffset,		FRAGMENT),
+
+		CASE_SPEC(sampler1darray_bias_fixed,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f, -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayFixed,		evalTexture1DArrayOffsetBias,	FRAGMENT),
+		CASE_SPEC(sampler1darray_bias_float,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayFloat,		evalTexture1DArrayOffsetBias,	FRAGMENT),
+		CASE_SPEC(isampler1darray_bias,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayInt,			evalTexture1DArrayOffsetBias,	FRAGMENT),
+		CASE_SPEC(usampler1darray_bias,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayUint,			evalTexture1DArrayOffsetBias,	FRAGMENT),
+
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowOffset,			VERTEX),
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowOffset,			FRAGMENT),
+		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTURE,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowOffsetBias,		FRAGMENT),
+		CASE_SPEC(sampler2darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 0),	tex2DArrayShadow,		evalTexture2DArrayShadowOffset,		VERTEX),
+		CASE_SPEC(sampler2darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	false,	0.0f,	0.0f,	true,	IVec3(7, -8, 0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowOffset,		FRAGMENT),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DShadow,			evalTexture1DShadowOffset,			VERTEX),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DMipmapShadow,		evalTexture1DShadowOffset,			FRAGMENT),
+		CASE_SPEC(sampler1dshadow_bias,			FUNCTION_TEXTURE,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DShadow,			evalTexture1DShadowOffsetBias,		FRAGMENT),
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayShadow,		evalTexture1DArrayShadowOffset,		VERTEX),
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3( 7, 0, 0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowOffset,		FRAGMENT),
+		CASE_SPEC(sampler1darrayshadow_bias,	FUNCTION_TEXTURE,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayShadow,		evalTexture1DArrayShadowOffsetBias,	FRAGMENT),
 	};
 	createCaseGroup(this, "textureoffset", "textureOffset() Tests", textureOffsetCases, DE_LENGTH_OF_ARRAY(textureOffsetCases));
 
@@ -3118,9 +3519,40 @@
 		CASE_SPEC(isampler3d_bias,				FUNCTION_TEXTUREPROJ,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex3DMipmapInt,			evalTexture3DProjBias,	FRAGMENT),
 		CASE_SPEC(usampler3d_bias,				FUNCTION_TEXTUREPROJ,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DProjBias,	FRAGMENT),
 
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFixed,				evalTexture1DProj2,		VERTEX),
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProj2,		FRAGMENT),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFloat,				evalTexture1DProj2,		VERTEX),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProj2,		FRAGMENT),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DInt,				evalTexture1DProj2,		VERTEX),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProj2,		FRAGMENT),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DUint,				evalTexture1DProj2,		VERTEX),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProj2,		FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec2_bias_fixed,	FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProj2Bias,	FRAGMENT),
+		CASE_SPEC(sampler1d_vec2_bias_float,	FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProj2Bias,	FRAGMENT),
+		CASE_SPEC(isampler1d_vec2_bias,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProj2Bias,	FRAGMENT),
+		CASE_SPEC(usampler1d_vec2_bias,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProj2Bias,	FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFixed,				evalTexture1DProj,		VERTEX),
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProj,		FRAGMENT),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DFloat,				evalTexture1DProj,		VERTEX),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProj,		FRAGMENT),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DInt,				evalTexture1DProj,		VERTEX),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProj,		FRAGMENT),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DUint,				evalTexture1DProj,		VERTEX),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProj,		FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec4_bias_fixed,	FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProjBias,	FRAGMENT),
+		CASE_SPEC(sampler1d_vec4_bias_float,	FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProjBias,	FRAGMENT),
+		CASE_SPEC(isampler1d_vec4_bias,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProjBias,	FRAGMENT),
+		CASE_SPEC(usampler1d_vec4_bias,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProjBias,	FRAGMENT),
+
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DShadow,			evalTexture2DShadowProj,		VERTEX),
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProj,		FRAGMENT),
-		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjBias,	FRAGMENT)
+		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjBias,	FRAGMENT),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DShadow,			evalTexture1DShadowProj,		VERTEX),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowProj,		FRAGMENT),
+		CASE_SPEC(sampler1dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowProjBias,	FRAGMENT),
 	};
 	createCaseGroup(this, "textureproj", "textureProj() Tests", textureProjCases, DE_LENGTH_OF_ARRAY(textureProjCases));
 
@@ -3171,9 +3603,40 @@
 		CASE_SPEC(isampler3d_bias,				FUNCTION_TEXTUREPROJ,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	true,	-2.0f,	2.0f,	true,	IVec3(3, -8, 7),	tex3DInt,				evalTexture3DProjOffsetBias,	FRAGMENT),
 		CASE_SPEC(usampler3d_bias,				FUNCTION_TEXTUREPROJ,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 3),	tex3DUint,				evalTexture3DProjOffsetBias,	FRAGMENT),
 
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DProj2Offset,		VERTEX),
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFixed,		evalTexture1DProj2Offset,		FRAGMENT),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFloat,				evalTexture1DProj2Offset,		VERTEX),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DProj2Offset,		FRAGMENT),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DProj2Offset,		VERTEX),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapInt,			evalTexture1DProj2Offset,		FRAGMENT),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DUint,				evalTexture1DProj2Offset,		VERTEX),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DProj2Offset,		FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec2_bias_fixed,	FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DProj2OffsetBias,	FRAGMENT),
+		CASE_SPEC(sampler1d_vec2_bias_float,	FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(7,  0, 0),	tex1DFloat,				evalTexture1DProj2OffsetBias,	FRAGMENT),
+		CASE_SPEC(isampler1d_vec2_bias,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DProj2OffsetBias,	FRAGMENT),
+		CASE_SPEC(usampler1d_vec2_bias,			FUNCTION_TEXTUREPROJ2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	true,	-2.0f,	2.0f,	true,	IVec3(7,  0, 0),	tex1DUint,				evalTexture1DProj2OffsetBias,	FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DProjOffset,		VERTEX),
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFixed,		evalTexture1DProjOffset,		FRAGMENT),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DFloat,				evalTexture1DProjOffset,		VERTEX),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DProjOffset,		FRAGMENT),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DProjOffset,		VERTEX),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapInt,			evalTexture1DProjOffset,		FRAGMENT),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DUint,				evalTexture1DProjOffset,		VERTEX),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DProjOffset,		FRAGMENT),
+
+		CASE_SPEC(sampler1d_vec4_bias_fixed,	FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DFixed,				evalTexture1DProjOffsetBias,	FRAGMENT),
+		CASE_SPEC(sampler1d_vec4_bias_float,	FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(7,  0, 0),	tex1DFloat,				evalTexture1DProjOffsetBias,	FRAGMENT),
+		CASE_SPEC(isampler1d_vec4_bias,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DInt,				evalTexture1DProjOffsetBias,	FRAGMENT),
+		CASE_SPEC(usampler1d_vec4_bias,			FUNCTION_TEXTUREPROJ,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(7,  0, 0),	tex1DUint,				evalTexture1DProjOffsetBias,	FRAGMENT),
+
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowProjOffset,		VERTEX),
 		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjOffset,		FRAGMENT),
-		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowProjOffsetBias,	FRAGMENT)
+		CASE_SPEC(sampler2dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 7, 0),	tex2DShadow,			evalTexture2DShadowProjOffsetBias,	FRAGMENT),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DShadow,			evalTexture1DShadowProjOffset,		VERTEX),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	false,	0.0f,	0.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapShadow,		evalTexture1DShadowProjOffset,		FRAGMENT),
+		CASE_SPEC(sampler1dshadow_bias,			FUNCTION_TEXTUREPROJ,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,   0.0f, 1.5f,  1.5f),	true,	-2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DShadow,			evalTexture1DShadowProjOffsetBias,	FRAGMENT),
 	};
 	createCaseGroup(this, "textureprojoffset", "textureOffsetProj() Tests", textureProjOffsetCases, DE_LENGTH_OF_ARRAY(textureProjOffsetCases));
 
@@ -3201,7 +3664,24 @@
 		CASE_SPEC(isampler3d,					FUNCTION_TEXTURELOD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	tex3DMipmapInt,			evalTexture3DLod,		BOTH),
 		CASE_SPEC(usampler3d,					FUNCTION_TEXTURELOD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DLod,		BOTH),
 
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowLod,	BOTH)
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DLod,		BOTH),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DLod,		BOTH),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DLod,		BOTH),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DLod,		BOTH),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DArrayMipmapFixed,	evalTexture1DArrayLod,	BOTH),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DArrayMipmapFloat,	evalTexture1DArrayLod,	BOTH),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DArrayMipmapInt,	evalTexture1DArrayLod,	BOTH),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DArrayMipmapUint,	evalTexture1DArrayLod,	BOTH),
+
+		CASE_SPEC(samplercubearray_fixed,		FUNCTION_TEXTURELOD,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	texCubeArrayMipmapFixed,	evalTextureCubeArrayLod,	BOTH),
+		CASE_SPEC(samplercubearray_float,		FUNCTION_TEXTURELOD,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	texCubeArrayMipmapFloat,	evalTextureCubeArrayLod,	BOTH),
+		CASE_SPEC(isamplercubearray,			FUNCTION_TEXTURELOD,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	texCubeArrayMipmapInt,		evalTextureCubeArrayLod,	BOTH),
+		CASE_SPEC(usamplercubearray,			FUNCTION_TEXTURELOD,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	texCubeArrayMipmapUint,		evalTextureCubeArrayLod,	BOTH),
+
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowLod,			BOTH),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowLod,			BOTH),
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowLod,	BOTH),
 	};
 	createCaseGroup(this, "texturelod", "textureLod() Tests", textureLodCases, DE_LENGTH_OF_ARRAY(textureLodCases));
 
@@ -3224,7 +3704,19 @@
 		CASE_SPEC(isampler3d,					FUNCTION_TEXTURELOD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	false,	-1.0f,	7.0f,	true,	IVec3(3, -8, 7),	tex3DMipmapInt,			evalTexture3DLodOffset,			BOTH),
 		CASE_SPEC(usampler3d,					FUNCTION_TEXTURELOD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	false,	-1.0f,	7.0f,	true,	IVec3(-8, 7, 3),	tex3DMipmapUint,		evalTexture3DLodOffset,			BOTH),
 
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowLodOffset,	BOTH)
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapFixed,		evalTexture1DLodOffset,			BOTH),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DLodOffset,			BOTH),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapInt,			evalTexture1DLodOffset,			BOTH),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DLodOffset,			BOTH),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayMipmapFixed,	evalTexture1DArrayLodOffset,	BOTH),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DArrayMipmapFloat,	evalTexture1DArrayLodOffset,	BOTH),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayMipmapInt,	evalTexture1DArrayLodOffset,	BOTH),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DArrayMipmapUint,	evalTexture1DArrayLodOffset,	BOTH),
+
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowLodOffset,		BOTH),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTURELOD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapShadow,		evalTexture1DShadowLodOffset,		BOTH),
+		CASE_SPEC(sampler1darrayshadow,			FUNCTION_TEXTURELOD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowLodOffset,	BOTH),
 	};
 	createCaseGroup(this, "texturelodoffset", "textureLodOffset() Tests", textureLodOffsetCases, DE_LENGTH_OF_ARRAY(textureLodOffsetCases));
 
@@ -3247,7 +3739,18 @@
 		CASE_SPEC(isampler3d,					FUNCTION_TEXTUREPROJLOD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	tex3DMipmapInt,			evalTexture3DProjLod,		BOTH),
 		CASE_SPEC(usampler3d,					FUNCTION_TEXTUREPROJLOD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	false,	-1.0f,	7.0f,	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DProjLod,		BOTH),
 
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjLod,	BOTH)
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProjLod2,		BOTH),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProjLod2,		BOTH),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProjLod2,		BOTH),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProjLod2,		BOTH),
+
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProjLod,		BOTH),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProjLod,		BOTH),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProjLod,		BOTH),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProjLod,		BOTH),
+
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjLod,	BOTH),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowProjLod,	BOTH),
 	};
 	createCaseGroup(this, "textureprojlod", "textureProjLod() Tests", textureProjLodCases, DE_LENGTH_OF_ARRAY(textureProjLodCases));
 
@@ -3270,7 +3773,18 @@
 		CASE_SPEC(isampler3d,					FUNCTION_TEXTUREPROJLOD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	false,	-1.0f,	7.0f,	true,	IVec3(3, -8, 7),	tex3DMipmapInt,			evalTexture3DProjLodOffset,		BOTH),
 		CASE_SPEC(usampler3d,					FUNCTION_TEXTUREPROJLOD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	false,	-1.0f,	7.0f,	true,	IVec3(-8, 7, 3),	tex3DMipmapUint,		evalTexture3DProjLodOffset,		BOTH),
 
-		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjLodOffset,	BOTH)
+		CASE_SPEC(sampler1d_vec2_fixed,			FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapFixed,		evalTexture1DProjLod2Offset,	BOTH),
+		CASE_SPEC(sampler1d_vec2_float,			FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DProjLod2Offset,	BOTH),
+		CASE_SPEC(isampler1d_vec2,				FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapInt,			evalTexture1DProjLod2Offset,	BOTH),
+		CASE_SPEC(usampler1d_vec2,				FUNCTION_TEXTUREPROJLOD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DProjLod2Offset,	BOTH),
+
+		CASE_SPEC(sampler1d_vec4_fixed,			FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapFixed,		evalTexture1DProjLodOffset,		BOTH),
+		CASE_SPEC(sampler1d_vec4_float,			FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DProjLodOffset,		BOTH),
+		CASE_SPEC(isampler1d_vec4,				FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 0, 0),	tex1DMipmapInt,			evalTexture1DProjLodOffset,		BOTH),
+		CASE_SPEC(usampler1d_vec4,				FUNCTION_TEXTUREPROJLOD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DProjLodOffset,		BOTH),
+
+		CASE_SPEC(sampler2dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.6f,  0.0f,  1.5f),	Vec4(-2.25f, -3.45f, 1.5f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjLodOffset,	BOTH),
+		CASE_SPEC(sampler1dshadow,				FUNCTION_TEXTUREPROJLOD,	Vec4( 0.2f, 0.0f,  0.0f,  1.5f),	Vec4(-2.25f,  0.0f,  1.5f,  1.5f),	false,	-1.0f,	9.0f,	true,	IVec3(7,  0, 0),	tex1DMipmapShadow,		evalTexture1DShadowProjLodOffset,	BOTH),
 	};
 	createCaseGroup(this, "textureprojlodoffset", "textureProjLodOffset() Tests", textureProjLodOffsetCases, DE_LENGTH_OF_ARRAY(textureProjLodOffsetCases));
 
@@ -3301,10 +3815,28 @@
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DGrad,		VERTEX),
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f, -0.2f),	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DGrad,		FRAGMENT),
 
+		GRAD_CASE_SPEC(sampler1d_fixed,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DGrad,		BOTH),
+		GRAD_CASE_SPEC(sampler1d_float,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DGrad,		BOTH),
+		GRAD_CASE_SPEC(isampler1d,				FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DGrad,		BOTH),
+		GRAD_CASE_SPEC(usampler1d,				FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DGrad,		BOTH),
+
+		GRAD_CASE_SPEC(sampler1darray_fixed,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapFixed,	evalTexture1DArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(sampler1darray_float,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapFloat,	evalTexture1DArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(isampler1darray,			FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapInt,	evalTexture1DArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(usampler1darray,			FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapUint,	evalTexture1DArrayGrad,	BOTH),
+
+		GRAD_CASE_SPEC(samplercubearray_fixed,	FUNCTION_TEXTUREGRAD,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	texCubeArrayMipmapFixed,	evalTextureCubeArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(samplercubearray_float,	FUNCTION_TEXTUREGRAD,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	texCubeArrayMipmapFloat,	evalTextureCubeArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(isamplercubearray,		FUNCTION_TEXTUREGRAD,	Vec4(-1.0f, -1.0f,  1.01f, -0.5f),	Vec4( 1.0f,  1.0f,  1.01f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	texCubeArrayMipmapInt,		evalTextureCubeArrayGrad,	BOTH),
+		GRAD_CASE_SPEC(usamplercubearray,		FUNCTION_TEXTUREGRAD,	Vec4(-1.0f, -1.0f, -1.01f, -0.5f),	Vec4( 1.0f,  1.0f, -1.01f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	false,	IVec3(0),	texCubeArrayMipmapUint,		evalTextureCubeArrayGrad,	BOTH),
+
 		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowGrad,		BOTH),
 		GRAD_CASE_SPEC(samplercubeshadow,		FUNCTION_TEXTUREGRAD,	Vec4(-1.0f, -1.0f,  1.01f,  0.0f),	Vec4( 1.0f,  1.0f,  1.01f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	texCubeMipmapShadow,	evalTextureCubeShadowGrad,		BOTH),
 		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGrad,	VERTEX),
-		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	false,	IVec3(0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGrad,	FRAGMENT)
+		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	false,	IVec3(0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGrad,	FRAGMENT),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowGrad,		BOTH),
+		GRAD_CASE_SPEC(sampler1darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowGrad,	VERTEX),
+		GRAD_CASE_SPEC(sampler1darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowGrad,	FRAGMENT),
 	};
 	createCaseGroup(this, "texturegrad", "textureGrad() Tests", textureGradCases, DE_LENGTH_OF_ARRAY(textureGradCases));
 
@@ -3329,10 +3861,24 @@
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	true,	IVec3(7, 3, -8),	tex3DMipmapUint,		evalTexture3DGradOffset,			VERTEX),
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -1.4f,  0.1f,  0.0f),	Vec4( 1.5f,  2.3f,  2.3f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f, -0.2f),	true,	IVec3(3, -8, 7),	tex3DMipmapUint,		evalTexture3DGradOffset,			FRAGMENT),
 
+		GRAD_CASE_SPEC(sampler1d_fixed,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DMipmapFixed,		evalTexture1DGradOffset,			BOTH),
+		GRAD_CASE_SPEC(sampler1d_float,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DMipmapFloat,		evalTexture1DGradOffset,			BOTH),
+		GRAD_CASE_SPEC(isampler1d,				FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DMipmapInt,			evalTexture1DGradOffset,			BOTH),
+		GRAD_CASE_SPEC(usampler1d,				FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DMipmapUint,		evalTexture1DGradOffset,			BOTH),
+
+		GRAD_CASE_SPEC(sampler1darray_fixed,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DArrayMipmapFixed,	evalTexture1DArrayGradOffset,		BOTH),
+		GRAD_CASE_SPEC(sampler1darray_float,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DArrayMipmapFloat,	evalTexture1DArrayGradOffset,		BOTH),
+		GRAD_CASE_SPEC(isampler1darray,			FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DArrayMipmapInt,	evalTexture1DArrayGradOffset,		BOTH),
+		GRAD_CASE_SPEC(usampler1darray,			FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,   0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DArrayMipmapUint,	evalTexture1DArrayGradOffset,		BOTH),
+
 		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowGradOffset,		VERTEX),
 		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f, -0.4f,  0.0f,  0.0f),	Vec4( 1.5f,  2.3f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowGradOffset,		FRAGMENT),
 		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGradOffset,	VERTEX),
-		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	true,	IVec3(7, -8, 0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGradOffset,	FRAGMENT)
+		GRAD_CASE_SPEC(sampler2darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.4f,  -0.5f,  0.0f),	Vec4( 1.5f,  2.3f,  3.5f,  1.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	true,	IVec3(7, -8, 0),	tex2DArrayMipmapShadow,	evalTexture2DArrayShadowGradOffset,	FRAGMENT),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DMipmapShadow,		evalTexture1DShadowGradOffset,		VERTEX),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREGRAD,	Vec4(-0.2f,  0.0f,  0.0f,  0.0f),	Vec4( 1.5f,  0.0f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DMipmapShadow,		evalTexture1DShadowGradOffset,		FRAGMENT),
+		GRAD_CASE_SPEC(sampler1darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 0, 0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowGradOffset,	VERTEX),
+		GRAD_CASE_SPEC(sampler1darrayshadow,	FUNCTION_TEXTUREGRAD,	Vec4(-1.2f, -0.5f,  0.0f,  0.0f),	Vec4( 1.5f,  3.5f,  1.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(7,  0, 0),	tex1DArrayMipmapShadow,	evalTexture1DArrayShadowGradOffset,	FRAGMENT),
 	};
 	createCaseGroup(this, "texturegradoffset", "textureGradOffset() Tests", textureGradOffsetCases, DE_LENGTH_OF_ARRAY(textureGradOffsetCases));
 
@@ -3357,8 +3903,20 @@
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREPROJGRAD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DProjGrad,		VERTEX),
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREPROJGRAD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f, -0.2f),	false,	IVec3(0),	tex3DMipmapUint,		evalTexture3DProjGrad,		FRAGMENT),
 
+		GRAD_CASE_SPEC(sampler1d_vec2_fixed,	FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProjGrad2,		BOTH),
+		GRAD_CASE_SPEC(sampler1d_vec2_float,	FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProjGrad2,		BOTH),
+		GRAD_CASE_SPEC(isampler1d_vec2,			FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProjGrad2,		BOTH),
+		GRAD_CASE_SPEC(usampler1d_vec2,			FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProjGrad2,		BOTH),
+
+		GRAD_CASE_SPEC(sampler1d_vec4_fixed,	FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFixed,		evalTexture1DProjGrad,		BOTH),
+		GRAD_CASE_SPEC(sampler1d_vec4_float,	FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapFloat,		evalTexture1DProjGrad,		BOTH),
+		GRAD_CASE_SPEC(isampler1d_vec4,			FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapInt,			evalTexture1DProjGrad,		BOTH),
+		GRAD_CASE_SPEC(usampler1d_vec4,			FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapUint,		evalTexture1DProjGrad,		BOTH),
+
 		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjGrad,	VERTEX),
-		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjGrad,	FRAGMENT)
+		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	false,	IVec3(0),	tex2DMipmapShadow,		evalTexture2DShadowProjGrad,	FRAGMENT),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.0f,  0.0f,  -1.5f),	Vec4(-2.25f,   0.0f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowProjGrad,	VERTEX),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.0f,  0.0f,  -1.5f),	Vec4(-2.25f,   0.0f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	false,	IVec3(0),	tex1DMipmapShadow,		evalTexture1DShadowProjGrad,	FRAGMENT),
 	};
 	createCaseGroup(this, "textureprojgrad", "textureProjGrad() Tests", textureProjGradCases, DE_LENGTH_OF_ARRAY(textureProjGradCases));
 
@@ -3383,8 +3941,20 @@
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREPROJGRAD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.2f,  0.0f),	true,	IVec3(7, 3, -8),	tex3DMipmapUint,		evalTexture3DProjGradOffset,		VERTEX),
 		GRAD_CASE_SPEC(usampler3d,				FUNCTION_TEXTUREPROJGRAD,	Vec4(0.9f, 1.05f, -0.08f, -0.75f),	Vec4(-1.13f, -1.7f, -1.7f, -0.75f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f, -0.2f),	true,	IVec3(3, -8, 7),	tex3DMipmapUint,		evalTexture3DProjGradOffset,		FRAGMENT),
 
+		GRAD_CASE_SPEC(sampler1d_vec2_fixed,	FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex1DMipmapFixed,		evalTexture1DProjGrad2Offset,		BOTH),
+		GRAD_CASE_SPEC(sampler1d_vec2_float,	FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex1DMipmapFloat,		evalTexture1DProjGrad2Offset,		BOTH),
+		GRAD_CASE_SPEC(isampler1d_vec2,			FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex1DMipmapInt,			evalTexture1DProjGrad2Offset,		BOTH),
+		GRAD_CASE_SPEC(usampler1d_vec2,			FUNCTION_TEXTUREPROJGRAD2,	Vec4(-0.3f,  1.5f,  0.0f,  0.0f),	Vec4(2.25f,  1.5f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex1DMipmapUint,		evalTexture1DProjGrad2Offset,		BOTH),
+
+		GRAD_CASE_SPEC(sampler1d_vec4_fixed,	FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex1DMipmapFixed,		evalTexture1DProjGradOffset,		BOTH),
+		GRAD_CASE_SPEC(sampler1d_vec4_float,	FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex1DMipmapFloat,		evalTexture1DProjGradOffset,		BOTH),
+		GRAD_CASE_SPEC(isampler1d_vec4,			FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex1DMipmapInt,			evalTexture1DProjGradOffset,		BOTH),
+		GRAD_CASE_SPEC(usampler1d_vec4,			FUNCTION_TEXTUREPROJGRAD,	Vec4(-0.3f,  0.0f,  0.0f,  1.5f),	Vec4(2.25f,  0.0f,  0.0f,  1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex1DMipmapUint,		evalTexture1DProjGradOffset,		BOTH),
+
 		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjGradOffset,	VERTEX),
-		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjGradOffset,	FRAGMENT)
+		GRAD_CASE_SPEC(sampler2dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.6f,  0.0f,  -1.5f),	Vec4(-2.25f, -3.45f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f, -0.2f,  0.0f),	true,	IVec3(7, -8, 0),	tex2DMipmapShadow,		evalTexture2DShadowProjGradOffset,	FRAGMENT),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.0f,  0.0f,  -1.5f),	Vec4(-2.25f,   0.0f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.2f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	true,	IVec3(-8, 7, 0),	tex1DMipmapShadow,		evalTexture1DShadowProjGradOffset,	VERTEX),
+		GRAD_CASE_SPEC(sampler1dshadow,			FUNCTION_TEXTUREPROJGRAD,	Vec4( 0.2f, 0.0f,  0.0f,  -1.5f),	Vec4(-2.25f,   0.0f, -1.5f, -1.5f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3( 0.0f,  0.0f,  0.0f),	Vec3(-0.2f,  0.0f,  0.0f),	true,	IVec3(7, -8, 0),	tex1DMipmapShadow,		evalTexture1DShadowProjGradOffset,	FRAGMENT),
 	};
 	createCaseGroup(this, "textureprojgradoffset", "textureProjGradOffset() Tests", textureProjGradOffsetCases, DE_LENGTH_OF_ARRAY(textureProjGradOffsetCases));
 
@@ -3406,7 +3976,17 @@
 		CASE_SPEC(sampler3d_fixed,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(63.9f,  31.9f,  31.9f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex3DTexelFetchFixed,		evalTexelFetch3D,		BOTH),
 		CASE_SPEC(sampler3d_float,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(31.9f,  15.9f,  15.9f,  0.0f),	false,	1.0f,	1.0f,	false,	IVec3(0),	tex3DTexelFetchFloat,		evalTexelFetch3D,		BOTH),
 		CASE_SPEC(isampler3d,					FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(15.9f,   7.9f,   7.9f,  0.0f),	false,	2.0f,	2.0f,	false,	IVec3(0),	tex3DTexelFetchInt,			evalTexelFetch3D,		BOTH),
-		CASE_SPEC(usampler3d,					FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(63.9f,  31.9f,  31.9f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex3DTexelFetchUint,		evalTexelFetch3D,		BOTH)
+		CASE_SPEC(usampler3d,					FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(63.9f,  31.9f,  31.9f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex3DTexelFetchUint,		evalTexelFetch3D,		BOTH),
+
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(255.9f,   0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DTexelFetchFixed,		evalTexelFetch1D,		BOTH),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(127.9f,   0.0f,  0.0f,  0.0f),	false,	1.0f,	1.0f,	false,	IVec3(0),	tex1DTexelFetchFloat,		evalTexelFetch1D,		BOTH),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4( 63.9f,   0.0f,  0.0f,  0.0f),	false,	2.0f,	2.0f,	false,	IVec3(0),	tex1DTexelFetchInt,			evalTexelFetch1D,		BOTH),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4( 15.9f,   0.0f,  0.0f,  0.0f),	false,	4.0f,	4.0f,	false,	IVec3(0),	tex1DTexelFetchUint,		evalTexelFetch1D,		BOTH),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(255.9f,   3.9f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	false,	IVec3(0),	tex1DArrayTexelFetchFixed,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4(127.9f,   3.9f,  0.0f,  0.0f),	false,	1.0f,	1.0f,	false,	IVec3(0),	tex1DArrayTexelFetchFloat,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4( 63.9f,   3.9f,  0.0f,  0.0f),	false,	2.0f,	2.0f,	false,	IVec3(0),	tex1DArrayTexelFetchInt,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXELFETCH,	Vec4(0.0f, 0.0f, 0.0f, 0.0f),	Vec4( 15.9f,   3.9f,  0.0f,  0.0f),	false,	4.0f,	4.0f,	false,	IVec3(0),	tex1DArrayTexelFetchUint,	evalTexelFetch1DArray,	BOTH),
 	};
 	createCaseGroup(this, "texelfetch", "texelFetch() Tests", texelFetchCases, DE_LENGTH_OF_ARRAY(texelFetchCases));
 
@@ -3427,7 +4007,17 @@
 		CASE_SPEC(sampler3d_fixed,				FUNCTION_TEXELFETCH,	Vec4( 8.0f, -7.0f, -3.0f, 0.0f),Vec4(71.9f,  24.9f,  28.9f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 3),	tex3DTexelFetchFixed,		evalTexelFetch3D,		BOTH),
 		CASE_SPEC(sampler3d_float,				FUNCTION_TEXELFETCH,	Vec4(-7.0f, -3.0f,  8.0f, 0.0f),Vec4(24.9f,  12.9f,  23.9f,  0.0f),	false,	1.0f,	1.0f,	true,	IVec3(7, 3, -8),	tex3DTexelFetchFloat,		evalTexelFetch3D,		BOTH),
 		CASE_SPEC(isampler3d,					FUNCTION_TEXELFETCH,	Vec4(-3.0f,  8.0f, -7.0f, 0.0f),Vec4(12.9f,  15.9f,   0.9f,  0.0f),	false,	2.0f,	2.0f,	true,	IVec3(3, -8, 7),	tex3DTexelFetchInt,			evalTexelFetch3D,		BOTH),
-		CASE_SPEC(usampler3d,					FUNCTION_TEXELFETCH,	Vec4( 8.0f, -7.0f, -3.0f, 0.0f),Vec4(71.9f,  24.9f,  28.9f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 3),	tex3DTexelFetchUint,		evalTexelFetch3D,		BOTH)
+		CASE_SPEC(usampler3d,					FUNCTION_TEXELFETCH,	Vec4( 8.0f, -7.0f, -3.0f, 0.0f),Vec4(71.9f,  24.9f,  28.9f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 7, 3),	tex3DTexelFetchUint,		evalTexelFetch3D,		BOTH),
+
+		CASE_SPEC(sampler1d_fixed,				FUNCTION_TEXELFETCH,	Vec4( 8.0f,  0.0f, 0.0f, 0.0f),	Vec4(263.9f,   0.0f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DTexelFetchFixed,		evalTexelFetch1D,		BOTH),
+		CASE_SPEC(sampler1d_float,				FUNCTION_TEXELFETCH,	Vec4(-7.0f,  0.0f, 0.0f, 0.0f),	Vec4(120.9f,   0.0f,  0.0f,  0.0f),	false,	1.0f,	1.0f,	true,	IVec3(7,  0, 0),	tex1DTexelFetchFloat,		evalTexelFetch1D,		BOTH),
+		CASE_SPEC(isampler1d,					FUNCTION_TEXELFETCH,	Vec4( 8.0f,  0.0f, 0.0f, 0.0f),	Vec4( 71.9f,   0.0f,  0.0f,  0.0f),	false,	2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DTexelFetchInt,			evalTexelFetch1D,		BOTH),
+		CASE_SPEC(usampler1d,					FUNCTION_TEXELFETCH,	Vec4(-7.0f,  0.0f, 0.0f, 0.0f),	Vec4(  8.9f,   0.0f,  0.0f,  0.0f),	false,	4.0f,	4.0f,	true,	IVec3(7,  0, 0),	tex1DTexelFetchUint,		evalTexelFetch1D,		BOTH),
+
+		CASE_SPEC(sampler1darray_fixed,			FUNCTION_TEXELFETCH,	Vec4( 8.0f,  0.0f, 0.0f, 0.0f),	Vec4(135.9f,   3.9f,  0.0f,  0.0f),	false,	0.0f,	0.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayTexelFetchFixed,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(sampler1darray_float,			FUNCTION_TEXELFETCH,	Vec4(-7.0f,  0.0f, 0.0f, 0.0f),	Vec4( 56.9f,   3.9f,  0.0f,  0.0f),	false,	1.0f,	1.0f,	true,	IVec3(7,  0, 0),	tex1DArrayTexelFetchFloat,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(isampler1darray,				FUNCTION_TEXELFETCH,	Vec4( 8.0f,  0.0f, 0.0f, 0.0f),	Vec4( 39.9f,   3.9f,  0.0f,  0.0f),	false,	2.0f,	2.0f,	true,	IVec3(-8, 0, 0),	tex1DArrayTexelFetchInt,	evalTexelFetch1DArray,	BOTH),
+		CASE_SPEC(usampler1darray,				FUNCTION_TEXELFETCH,	Vec4(-7.0f,  0.0f, 0.0f, 0.0f),	Vec4(  8.9f,   3.9f,  0.0f,  0.0f),	false,	3.0f,	3.0f,	true,	IVec3(7,  0, 0),	tex1DArrayTexelFetchUint,	evalTexelFetch1DArray,	BOTH),
 	};
 	createCaseGroup(this, "texelfetchoffset", "texelFetchOffset() Tests", texelFetchOffsetCases, DE_LENGTH_OF_ARRAY(texelFetchOffsetCases));
 
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
index fc9e7ee..991a528 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesBufferTests.cpp
@@ -202,12 +202,6 @@
 	return requirements;
 }
 
-inline VkDeviceSize alignSize (const VkDeviceSize val, const VkDeviceSize align)
-{
-	DE_ASSERT(deIsPowerOfTwo64(align));
-	return (val + align - 1) & ~(align - 1);
-}
-
 MovePtr<SparseAllocation> SparseAllocationBuilder::build (const DeviceInterface&	vk,
 														  const VkDevice			device,
 														  Allocator&				allocator,
@@ -220,7 +214,7 @@
 								referenceCreateInfo.size	= sizeof(deUint32);
 	const Unique<VkBuffer>		refBuffer					(createBuffer(vk, device, &referenceCreateInfo));
 	const VkMemoryRequirements	memoryRequirements			= getBufferMemoryRequirements(vk, device, *refBuffer);
-	const VkDeviceSize			chunkSize					= std::max(memoryRequirements.alignment, alignSize(minChunkSize, memoryRequirements.alignment));
+	const VkDeviceSize			chunkSize					= std::max(memoryRequirements.alignment, static_cast<VkDeviceSize>(deAlign64(minChunkSize, memoryRequirements.alignment)));
 
 	for (std::vector<deUint32>::const_iterator numChunksIter = m_chunksPerAllocation.begin(); numChunksIter != m_chunksPerAllocation.end(); ++numChunksIter)
 	{
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
index 8a560ad..b2247ca 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
@@ -404,7 +404,7 @@
 	if (m_shaderSpec.verifyIO)
 	{
 		if (!(*m_shaderSpec.verifyIO)(m_shaderSpec.inputs, outputAllocs, m_shaderSpec.outputs, m_context.getTestContext().getLog()))
-			return tcu::TestStatus::fail("Output doesn't match with expected");
+			return tcu::TestStatus(m_shaderSpec.failResult, m_shaderSpec.failMessage);
 	}
 	else
 	{
@@ -412,11 +412,11 @@
 		{
 			const BufferSp& expectedOutput = m_shaderSpec.outputs[outputNdx];
 			if (deMemCmp(expectedOutput->data(), outputAllocs[outputNdx]->getHostPtr(), expectedOutput->getNumBytes()))
-				return tcu::TestStatus::fail("Output doesn't match with expected");
+				return tcu::TestStatus(m_shaderSpec.failResult, m_shaderSpec.failMessage);
 		}
 	}
 
-	return tcu::TestStatus::pass("Ouput match with expected");
+	return tcu::TestStatus::pass("Output match with expected");
 }
 
 class ConvertTestInstance : public SpvAsmComputeShaderInstance
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
index 4c6b644..1f0551d 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderTestUtil.hpp
@@ -95,16 +95,20 @@
 	std::vector<BufferSp>	outputs;
 	tcu::IVec3				numWorkGroups;
 	std::vector<deUint32>	specConstants;
+	qpTestResult			failResult;
+	std::string				failMessage;
 	// If null, a default verification will be performed by comparing the memory pointed to by outputAllocations
 	// and the contents of expectedOutputs. Otherwise the function pointed to by verifyIO will be called.
 	// If true is returned, then the test case is assumed to have passed, if false is returned, then the test
-	// case is assumed to have failed.
+	// case is assumed to have failed. Exact meaning of failure can be customized with failResult.
 	bool					(*verifyIO)(const std::vector<BufferSp>& inputs, const std::vector<AllocationSp>& outputAllocations, const std::vector<BufferSp>& expectedOutputs, tcu::TestLog& log);
-							ComputeShaderSpec()
+
+							ComputeShaderSpec (void)
 								: entryPoint	("main")
+								, failResult	(QP_TEST_RESULT_FAIL)
+								, failMessage	("Output doesn't match with expected")
 								, verifyIO		(DE_NULL)
 							{}
-
 };
 
 } // SpirVAssembly
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
index 3887f80..dc7f831 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
@@ -3,6 +3,7 @@
  * ------------------------
  *
  * Copyright (c) 2015 Google Inc.
+ * Copyright (c) 2016 The Khronos Group Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,7 +48,6 @@
 #include "deUniquePtr.hpp"
 #include "tcuStringTemplate.hpp"
 
-#include <cmath>
 #include "vktSpvAsmComputeShaderCase.hpp"
 #include "vktSpvAsmComputeShaderTestUtil.hpp"
 #include "vktTestCaseUtil.hpp"
@@ -57,6 +57,7 @@
 #include <map>
 #include <string>
 #include <sstream>
+#include <utility>
 
 namespace vkt
 {
@@ -95,6 +96,27 @@
 		typedPtr[offset + ndx] = randomScalar<T>(rnd, minValue, maxValue);
 }
 
+// Filter is a function that returns true if a value should pass, false otherwise.
+template<typename T, typename FilterT>
+static void fillRandomScalars (de::Random& rnd, T minValue, T maxValue, void* dst, int numValues, FilterT filter, int offset = 0)
+{
+	T* const typedPtr = (T*)dst;
+	T value;
+	for (int ndx = 0; ndx < numValues; ndx++)
+	{
+		do
+			value = randomScalar<T>(rnd, minValue, maxValue);
+		while (!filter(value));
+
+		typedPtr[offset + ndx] = value;
+	}
+}
+
+inline bool filterNotZero (const deInt32 value)
+{
+	return value != 0;
+}
+
 static void floorAll (vector<float>& values)
 {
 	for (size_t i = 0; i < values.size(); i++)
@@ -840,6 +862,212 @@
 	return group.release();
 }
 
+tcu::TestCaseGroup* createOpSRemGroup (tcu::TestContext& testCtx)
+{
+	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsrem", "Test the OpSRem instruction"));
+	de::Random						rnd				(deStringHash(group->getName()));
+	const int						numElements		= 200;
+
+	const struct CaseParams
+	{
+		const char*		name;
+		const char*		failMessage;		// customized status message
+		qpTestResult	failResult;			// override status on failure
+		int				op1Min, op1Max;		// operand ranges
+		int				op2Min, op2Max;
+	} cases[] =
+	{
+		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	0,		65536,	0,		100 },
+		{ "all",		"Inconsistent results, but within specification",	QP_TEST_RESULT_PASS,	-65536,	65536,	-100,	100 },	// see below
+	};
+	// If either operand is negative the result is undefined. Some implementations may still return correct values.
+
+	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
+	{
+		const CaseParams&	params		= cases[caseNdx];
+		ComputeShaderSpec	spec;
+		vector<deInt32>		inputInts1	(numElements, 0);
+		vector<deInt32>		inputInts2	(numElements, 0);
+		vector<deInt32>		outputInts	(numElements, 0);
+
+		fillRandomScalars(rnd, params.op1Min, params.op1Max, &inputInts1[0], numElements);
+		fillRandomScalars(rnd, params.op2Min, params.op2Max, &inputInts2[0], numElements, filterNotZero);
+
+		for (int ndx = 0; ndx < numElements; ++ndx)
+		{
+			// The return value of std::fmod() has the same sign as its first operand, which is how OpFRem spec'd.
+			outputInts[ndx] = inputInts1[ndx] % inputInts2[ndx];
+		}
+
+		spec.assembly =
+			string(s_ShaderPreamble) +
+
+			"OpName %main           \"main\"\n"
+			"OpName %id             \"gl_GlobalInvocationID\"\n"
+
+			"OpDecorate %id BuiltIn GlobalInvocationId\n"
+
+			"OpDecorate %buf BufferBlock\n"
+			"OpDecorate %indata1 DescriptorSet 0\n"
+			"OpDecorate %indata1 Binding 0\n"
+			"OpDecorate %indata2 DescriptorSet 0\n"
+			"OpDecorate %indata2 Binding 1\n"
+			"OpDecorate %outdata DescriptorSet 0\n"
+			"OpDecorate %outdata Binding 2\n"
+			"OpDecorate %i32arr ArrayStride 4\n"
+			"OpMemberDecorate %buf 0 Offset 0\n"
+
+			+ string(s_CommonTypes) +
+
+			"%buf        = OpTypeStruct %i32arr\n"
+			"%bufptr     = OpTypePointer Uniform %buf\n"
+			"%indata1    = OpVariable %bufptr Uniform\n"
+			"%indata2    = OpVariable %bufptr Uniform\n"
+			"%outdata    = OpVariable %bufptr Uniform\n"
+
+			"%id        = OpVariable %uvec3ptr Input\n"
+			"%zero      = OpConstant %i32 0\n"
+
+			"%main      = OpFunction %void None %voidf\n"
+			"%label     = OpLabel\n"
+			"%idval     = OpLoad %uvec3 %id\n"
+			"%x         = OpCompositeExtract %u32 %idval 0\n"
+			"%inloc1    = OpAccessChain %i32ptr %indata1 %zero %x\n"
+			"%inval1    = OpLoad %i32 %inloc1\n"
+			"%inloc2    = OpAccessChain %i32ptr %indata2 %zero %x\n"
+			"%inval2    = OpLoad %i32 %inloc2\n"
+			"%rem       = OpSRem %i32 %inval1 %inval2\n"
+			"%outloc    = OpAccessChain %i32ptr %outdata %zero %x\n"
+			"             OpStore %outloc %rem\n"
+			"             OpReturn\n"
+			"             OpFunctionEnd\n";
+
+		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts1)));
+		spec.inputs.push_back	(BufferSp(new Int32Buffer(inputInts2)));
+		spec.outputs.push_back	(BufferSp(new Int32Buffer(outputInts)));
+		spec.numWorkGroups		= IVec3(numElements, 1, 1);
+		spec.failResult			= params.failResult;
+		spec.failMessage		= params.failMessage;
+
+		group->addChild(new SpvAsmComputeShaderCase(testCtx, params.name, "", spec));
+	}
+
+	return group.release();
+}
+
+tcu::TestCaseGroup* createOpSModGroup (tcu::TestContext& testCtx)
+{
+	de::MovePtr<tcu::TestCaseGroup>	group			(new tcu::TestCaseGroup(testCtx, "opsmod", "Test the OpSMod instruction"));
+	de::Random						rnd				(deStringHash(group->getName()));
+	const int						numElements		= 200;
+
+	const struct CaseParams
+	{
+		const char*		name;
+		const char*		failMessage;		// customized status message
+		qpTestResult	failResult;			// override status on failure
+		int				op1Min, op1Max;		// operand ranges
+		int				op2Min, op2Max;
+	} cases[] =
+	{
+		{ "positive",	"Output doesn't match with expected",				QP_TEST_RESULT_FAIL,	0,		65536,	0,		100 },
+		{ "all",		"Inconsistent results, but within specification",	QP_TEST_RESULT_PASS,	-65536,	65536,	-100,	100 },	// see below
+	};
+	// If either operand is negative the result is undefined. Some implementations may still return correct values.
+
+	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
+	{
+		const CaseParams&	params		= cases[caseNdx];
+
+		ComputeShaderSpec	spec;
+		vector<deInt32>		inputInts1	(numElements, 0);
+		vector<deInt32>		inputInts2	(numElements, 0);
+		vector<deInt32>		outputInts	(numElements, 0);
+
+		fillRandomScalars(rnd, params.op1Min, params.op1Max, &inputInts1[0], numElements);
+		fillRandomScalars(rnd, params.op2Min, params.op2Max, &inputInts2[0], numElements, filterNotZero);
+
+		for (int ndx = 0; ndx < numElements; ++ndx)
+		{
+			deInt32 rem = inputInts1[ndx] % inputInts2[ndx];
+			if (rem == 0)
+			{
+				outputInts[ndx] = 0;
+			}
+			else if ((inputInts1[ndx] >= 0) == (inputInts2[ndx] >= 0))
+			{
+				// They have the same sign
+				outputInts[ndx] = rem;
+			}
+			else
+			{
+				// They have opposite sign.  The remainder operation takes the
+				// sign inputInts1[ndx] but OpSMod is supposed to take ths sign
+				// of inputInts2[ndx].  Adding inp