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

Change-Id: I61a6ffc581f10ec14c27cb06363daf85b00c8983
diff --git a/AndroidGen.mk b/AndroidGen.mk
index 2729a63..2a85b45 100644
--- a/AndroidGen.mk
+++ b/AndroidGen.mk
@@ -130,6 +130,9 @@
 	external/vulkancts/modules/vulkan/memory/vktMemoryPipelineBarrierTests.cpp \
 	external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp \
 	external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp \
+	external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp \
+	external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp \
+	external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp \
 	external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp \
 	external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp \
 	external/vulkancts/modules/vulkan/pipeline/vktPipelineClearUtil.cpp \
@@ -976,6 +979,7 @@
 	$(deqp_dir)/external/vulkancts/modules/vulkan/geometry \
 	$(deqp_dir)/external/vulkancts/modules/vulkan/image \
 	$(deqp_dir)/external/vulkancts/modules/vulkan/memory \
+	$(deqp_dir)/external/vulkancts/modules/vulkan/multiview \
 	$(deqp_dir)/external/vulkancts/modules/vulkan/pipeline \
 	$(deqp_dir)/external/vulkancts/modules/vulkan/query_pool \
 	$(deqp_dir)/external/vulkancts/modules/vulkan/rasterization \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b46f8f..73a7296 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@
 
 if (DEFINED DEQP_TARGET_TOOLCHAIN)
 	# \note Toolchain must be included before project() command
-	include(targets/${DEQP_TARGET}/${DEQP_TARGET_TOOLCHAIN}.cmake)
+	include(targets/${DEQP_TARGET}/${DEQP_TARGET_TOOLCHAIN}.cmake NO_POLICY_SCOPE)
 endif ()
 
 project(dEQP-Core-${DEQP_TARGET})
diff --git a/android/cts/master/src/vk-excluded-tests.txt b/android/cts/master/src/vk-excluded-tests.txt
index 94cf783..6b98041 100644
--- a/android/cts/master/src/vk-excluded-tests.txt
+++ b/android/cts/master/src/vk-excluded-tests.txt
@@ -287,3 +287,6 @@
 
 # New tests from AOSP
 dEQP-VK.texture.explicit_lod.*
+
+# Issue 110: Excluded wsi android tests as they require android loader support
+dEQP-VK.wsi.android.surface.query_devgroup_*
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index a61ab53..d11d64c 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
@@ -9,6 +9,7 @@
 dEQP-VK.api.smoke.asm_triangle_no_opname
 dEQP-VK.api.smoke.unused_resolve_attachment
 dEQP-VK.api.info.instance.physical_devices
+dEQP-VK.api.info.instance.physical_device_groups
 dEQP-VK.api.info.instance.layers
 dEQP-VK.api.info.instance.extensions
 dEQP-VK.api.info.device.features
@@ -17,6 +18,7 @@
 dEQP-VK.api.info.device.memory_properties
 dEQP-VK.api.info.device.layers
 dEQP-VK.api.info.device.extensions
+dEQP-VK.api.info.device_group.peer_memory_features
 dEQP-VK.api.info.format_properties.r4g4_unorm_pack8
 dEQP-VK.api.info.format_properties.r4g4b4a4_unorm_pack16
 dEQP-VK.api.info.format_properties.b4g4r4a4_unorm_pack16
@@ -3569,6 +3571,7 @@
 dEQP-VK.api.device_init.create_device_unsupported_features
 dEQP-VK.api.object_management.single.instance
 dEQP-VK.api.object_management.single.device
+dEQP-VK.api.object_management.single.device_group
 dEQP-VK.api.object_management.single.device_memory_small
 dEQP-VK.api.object_management.single.buffer_uniform_small
 dEQP-VK.api.object_management.single.buffer_uniform_large
@@ -3611,6 +3614,7 @@
 dEQP-VK.api.object_management.single.command_buffer_secondary
 dEQP-VK.api.object_management.multiple_unique_resources.instance
 dEQP-VK.api.object_management.multiple_unique_resources.device
+dEQP-VK.api.object_management.multiple_unique_resources.device_group
 dEQP-VK.api.object_management.multiple_unique_resources.device_memory_small
 dEQP-VK.api.object_management.multiple_unique_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multiple_unique_resources.buffer_uniform_large
@@ -3652,6 +3656,7 @@
 dEQP-VK.api.object_management.multiple_unique_resources.command_buffer_primary
 dEQP-VK.api.object_management.multiple_unique_resources.command_buffer_secondary
 dEQP-VK.api.object_management.multiple_shared_resources.device
+dEQP-VK.api.object_management.multiple_shared_resources.device_group
 dEQP-VK.api.object_management.multiple_shared_resources.device_memory_small
 dEQP-VK.api.object_management.multiple_shared_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multiple_shared_resources.buffer_uniform_large
@@ -3694,6 +3699,7 @@
 dEQP-VK.api.object_management.multiple_shared_resources.command_buffer_secondary
 dEQP-VK.api.object_management.max_concurrent.instance
 dEQP-VK.api.object_management.max_concurrent.device
+dEQP-VK.api.object_management.max_concurrent.device_group
 dEQP-VK.api.object_management.max_concurrent.device_memory_small
 dEQP-VK.api.object_management.max_concurrent.buffer_uniform_small
 dEQP-VK.api.object_management.max_concurrent.buffer_uniform_large
@@ -3776,6 +3782,7 @@
 dEQP-VK.api.object_management.multithreaded_per_thread_device.command_buffer_secondary
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.instance
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.device
+dEQP-VK.api.object_management.multithreaded_per_thread_resources.device_group
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.device_memory_small
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.buffer_uniform_large
@@ -3817,6 +3824,7 @@
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.command_buffer_primary
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.command_buffer_secondary
 dEQP-VK.api.object_management.multithreaded_shared_resources.device
+dEQP-VK.api.object_management.multithreaded_shared_resources.device_group
 dEQP-VK.api.object_management.multithreaded_shared_resources.device_memory_small
 dEQP-VK.api.object_management.multithreaded_shared_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multithreaded_shared_resources.buffer_uniform_large
@@ -3856,6 +3864,7 @@
 dEQP-VK.api.object_management.multithreaded_shared_resources.command_pool_transient
 dEQP-VK.api.object_management.single_alloc_callbacks.instance
 dEQP-VK.api.object_management.single_alloc_callbacks.device
+dEQP-VK.api.object_management.single_alloc_callbacks.device_group
 dEQP-VK.api.object_management.single_alloc_callbacks.device_memory_small
 dEQP-VK.api.object_management.single_alloc_callbacks.buffer_uniform_small
 dEQP-VK.api.object_management.single_alloc_callbacks.buffer_uniform_large
@@ -3898,6 +3907,7 @@
 dEQP-VK.api.object_management.single_alloc_callbacks.command_buffer_secondary
 dEQP-VK.api.object_management.alloc_callback_fail.instance
 dEQP-VK.api.object_management.alloc_callback_fail.device
+dEQP-VK.api.object_management.alloc_callback_fail.device_group
 dEQP-VK.api.object_management.alloc_callback_fail.device_memory_small
 dEQP-VK.api.object_management.alloc_callback_fail.buffer_uniform_small
 dEQP-VK.api.object_management.alloc_callback_fail.buffer_uniform_large
@@ -65272,6 +65282,208 @@
 dEQP-VK.memory.allocation.random.97
 dEQP-VK.memory.allocation.random.98
 dEQP-VK.memory.allocation.random.99
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_50
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_50
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_50
+dEQP-VK.memory.device_group_allocation.basic.percent_1.forward.count_12
+dEQP-VK.memory.device_group_allocation.basic.percent_1.reverse.count_12
+dEQP-VK.memory.device_group_allocation.basic.percent_1.mixed.count_12
+dEQP-VK.memory.device_group_allocation.random.0
+dEQP-VK.memory.device_group_allocation.random.1
+dEQP-VK.memory.device_group_allocation.random.2
+dEQP-VK.memory.device_group_allocation.random.3
+dEQP-VK.memory.device_group_allocation.random.4
+dEQP-VK.memory.device_group_allocation.random.5
+dEQP-VK.memory.device_group_allocation.random.6
+dEQP-VK.memory.device_group_allocation.random.7
+dEQP-VK.memory.device_group_allocation.random.8
+dEQP-VK.memory.device_group_allocation.random.9
+dEQP-VK.memory.device_group_allocation.random.10
+dEQP-VK.memory.device_group_allocation.random.11
+dEQP-VK.memory.device_group_allocation.random.12
+dEQP-VK.memory.device_group_allocation.random.13
+dEQP-VK.memory.device_group_allocation.random.14
+dEQP-VK.memory.device_group_allocation.random.15
+dEQP-VK.memory.device_group_allocation.random.16
+dEQP-VK.memory.device_group_allocation.random.17
+dEQP-VK.memory.device_group_allocation.random.18
+dEQP-VK.memory.device_group_allocation.random.19
+dEQP-VK.memory.device_group_allocation.random.20
+dEQP-VK.memory.device_group_allocation.random.21
+dEQP-VK.memory.device_group_allocation.random.22
+dEQP-VK.memory.device_group_allocation.random.23
+dEQP-VK.memory.device_group_allocation.random.24
+dEQP-VK.memory.device_group_allocation.random.25
+dEQP-VK.memory.device_group_allocation.random.26
+dEQP-VK.memory.device_group_allocation.random.27
+dEQP-VK.memory.device_group_allocation.random.28
+dEQP-VK.memory.device_group_allocation.random.29
+dEQP-VK.memory.device_group_allocation.random.30
+dEQP-VK.memory.device_group_allocation.random.31
+dEQP-VK.memory.device_group_allocation.random.32
+dEQP-VK.memory.device_group_allocation.random.33
+dEQP-VK.memory.device_group_allocation.random.34
+dEQP-VK.memory.device_group_allocation.random.35
+dEQP-VK.memory.device_group_allocation.random.36
+dEQP-VK.memory.device_group_allocation.random.37
+dEQP-VK.memory.device_group_allocation.random.38
+dEQP-VK.memory.device_group_allocation.random.39
+dEQP-VK.memory.device_group_allocation.random.40
+dEQP-VK.memory.device_group_allocation.random.41
+dEQP-VK.memory.device_group_allocation.random.42
+dEQP-VK.memory.device_group_allocation.random.43
+dEQP-VK.memory.device_group_allocation.random.44
+dEQP-VK.memory.device_group_allocation.random.45
+dEQP-VK.memory.device_group_allocation.random.46
+dEQP-VK.memory.device_group_allocation.random.47
+dEQP-VK.memory.device_group_allocation.random.48
+dEQP-VK.memory.device_group_allocation.random.49
+dEQP-VK.memory.device_group_allocation.random.50
+dEQP-VK.memory.device_group_allocation.random.51
+dEQP-VK.memory.device_group_allocation.random.52
+dEQP-VK.memory.device_group_allocation.random.53
+dEQP-VK.memory.device_group_allocation.random.54
+dEQP-VK.memory.device_group_allocation.random.55
+dEQP-VK.memory.device_group_allocation.random.56
+dEQP-VK.memory.device_group_allocation.random.57
+dEQP-VK.memory.device_group_allocation.random.58
+dEQP-VK.memory.device_group_allocation.random.59
+dEQP-VK.memory.device_group_allocation.random.60
+dEQP-VK.memory.device_group_allocation.random.61
+dEQP-VK.memory.device_group_allocation.random.62
+dEQP-VK.memory.device_group_allocation.random.63
+dEQP-VK.memory.device_group_allocation.random.64
+dEQP-VK.memory.device_group_allocation.random.65
+dEQP-VK.memory.device_group_allocation.random.66
+dEQP-VK.memory.device_group_allocation.random.67
+dEQP-VK.memory.device_group_allocation.random.68
+dEQP-VK.memory.device_group_allocation.random.69
+dEQP-VK.memory.device_group_allocation.random.70
+dEQP-VK.memory.device_group_allocation.random.71
+dEQP-VK.memory.device_group_allocation.random.72
+dEQP-VK.memory.device_group_allocation.random.73
+dEQP-VK.memory.device_group_allocation.random.74
+dEQP-VK.memory.device_group_allocation.random.75
+dEQP-VK.memory.device_group_allocation.random.76
+dEQP-VK.memory.device_group_allocation.random.77
+dEQP-VK.memory.device_group_allocation.random.78
+dEQP-VK.memory.device_group_allocation.random.79
+dEQP-VK.memory.device_group_allocation.random.80
+dEQP-VK.memory.device_group_allocation.random.81
+dEQP-VK.memory.device_group_allocation.random.82
+dEQP-VK.memory.device_group_allocation.random.83
+dEQP-VK.memory.device_group_allocation.random.84
+dEQP-VK.memory.device_group_allocation.random.85
+dEQP-VK.memory.device_group_allocation.random.86
+dEQP-VK.memory.device_group_allocation.random.87
+dEQP-VK.memory.device_group_allocation.random.88
+dEQP-VK.memory.device_group_allocation.random.89
+dEQP-VK.memory.device_group_allocation.random.90
+dEQP-VK.memory.device_group_allocation.random.91
+dEQP-VK.memory.device_group_allocation.random.92
+dEQP-VK.memory.device_group_allocation.random.93
+dEQP-VK.memory.device_group_allocation.random.94
+dEQP-VK.memory.device_group_allocation.random.95
+dEQP-VK.memory.device_group_allocation.random.96
+dEQP-VK.memory.device_group_allocation.random.97
+dEQP-VK.memory.device_group_allocation.random.98
+dEQP-VK.memory.device_group_allocation.random.99
 dEQP-VK.memory.mapping.suballocation.full.33.simple
 dEQP-VK.memory.mapping.suballocation.full.33.remap
 dEQP-VK.memory.mapping.suballocation.full.33.flush
@@ -193880,425 +194092,6 @@
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.97
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.98
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.99
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_2
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_4
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_8
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_16
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_32
-dEQP-VK.renderpass.multisample.r8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_32
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_16
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_32
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_16
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_32
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_32
-dEQP-VK.renderpass.multisample.r16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.d16_unorm.samples_2
-dEQP-VK.renderpass.multisample.d16_unorm.samples_4
-dEQP-VK.renderpass.multisample.d16_unorm.samples_8
-dEQP-VK.renderpass.multisample.d16_unorm.samples_16
-dEQP-VK.renderpass.multisample.d16_unorm.samples_32
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.s8_uint.samples_2
-dEQP-VK.renderpass.multisample.s8_uint.samples_4
-dEQP-VK.renderpass.multisample.s8_uint.samples_8
-dEQP-VK.renderpass.multisample.s8_uint.samples_16
-dEQP-VK.renderpass.multisample.s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_32
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_2
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_4
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_8
 dEQP-VK.ubo.2_level_array.std140.float.vertex
 dEQP-VK.ubo.2_level_array.std140.float.fragment
 dEQP-VK.ubo.2_level_array.std140.float.both
@@ -240289,6 +240082,83 @@
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.last_index_out_of_bounds
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.indices_out_of_bounds
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.triangle_out_of_bounds
+dEQP-VK.multiview.masks.15
+dEQP-VK.multiview.masks.8
+dEQP-VK.multiview.masks.1_2_4_8
+dEQP-VK.multiview.masks.15_15_15_15
+dEQP-VK.multiview.masks.8_1_1_8
+dEQP-VK.multiview.masks.1_2_4_8_16_32
+dEQP-VK.multiview.masks.max_multi_view_view_count
+dEQP-VK.multiview.input_attachments.15
+dEQP-VK.multiview.input_attachments.8
+dEQP-VK.multiview.input_attachments.1_2_4_8
+dEQP-VK.multiview.input_attachments.15_15_15_15
+dEQP-VK.multiview.input_attachments.8_1_1_8
+dEQP-VK.multiview.input_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.input_attachments.max_multi_view_view_count
+dEQP-VK.multiview.instanced.15
+dEQP-VK.multiview.instanced.8
+dEQP-VK.multiview.instanced.1_2_4_8
+dEQP-VK.multiview.instanced.15_15_15_15
+dEQP-VK.multiview.instanced.8_1_1_8
+dEQP-VK.multiview.instanced.1_2_4_8_16_32
+dEQP-VK.multiview.instanced.max_multi_view_view_count
+dEQP-VK.multiview.input_instance.15
+dEQP-VK.multiview.input_instance.8
+dEQP-VK.multiview.input_instance.1_2_4_8
+dEQP-VK.multiview.input_instance.15_15_15_15
+dEQP-VK.multiview.input_instance.8_1_1_8
+dEQP-VK.multiview.input_instance.1_2_4_8_16_32
+dEQP-VK.multiview.input_instance.max_multi_view_view_count
+dEQP-VK.multiview.draw_indirect.15
+dEQP-VK.multiview.draw_indirect.8
+dEQP-VK.multiview.draw_indirect.1_2_4_8
+dEQP-VK.multiview.draw_indirect.15_15_15_15
+dEQP-VK.multiview.draw_indirect.8_1_1_8
+dEQP-VK.multiview.draw_indirect.1_2_4_8_16_32
+dEQP-VK.multiview.draw_indirect.max_multi_view_view_count
+dEQP-VK.multiview.clear_attachments.15
+dEQP-VK.multiview.clear_attachments.8
+dEQP-VK.multiview.clear_attachments.1_2_4_8
+dEQP-VK.multiview.clear_attachments.15_15_15_15
+dEQP-VK.multiview.clear_attachments.8_1_1_8
+dEQP-VK.multiview.clear_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.clear_attachments.max_multi_view_view_count
+dEQP-VK.multiview.secondary_cmd_buffer.15
+dEQP-VK.multiview.secondary_cmd_buffer.8
+dEQP-VK.multiview.secondary_cmd_buffer.1_2_4_8
+dEQP-VK.multiview.secondary_cmd_buffer.15_15_15_15
+dEQP-VK.multiview.secondary_cmd_buffer.8_1_1_8
+dEQP-VK.multiview.secondary_cmd_buffer.1_2_4_8_16_32
+dEQP-VK.multiview.secondary_cmd_buffer.max_multi_view_view_count
+dEQP-VK.multiview.index.vertex_shader.15
+dEQP-VK.multiview.index.vertex_shader.8
+dEQP-VK.multiview.index.vertex_shader.1_2_4_8
+dEQP-VK.multiview.index.vertex_shader.15_15_15_15
+dEQP-VK.multiview.index.vertex_shader.8_1_1_8
+dEQP-VK.multiview.index.vertex_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.vertex_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.fragment_shader.15
+dEQP-VK.multiview.index.fragment_shader.8
+dEQP-VK.multiview.index.fragment_shader.1_2_4_8
+dEQP-VK.multiview.index.fragment_shader.15_15_15_15
+dEQP-VK.multiview.index.fragment_shader.8_1_1_8
+dEQP-VK.multiview.index.fragment_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.fragment_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.geometry_shader.15
+dEQP-VK.multiview.index.geometry_shader.8
+dEQP-VK.multiview.index.geometry_shader.1_2_4_8
+dEQP-VK.multiview.index.geometry_shader.15_15_15_15
+dEQP-VK.multiview.index.geometry_shader.8_1_1_8
+dEQP-VK.multiview.index.geometry_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.geometry_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.tesellation_shader.15
+dEQP-VK.multiview.index.tesellation_shader.8
+dEQP-VK.multiview.index.tesellation_shader.1_2_4_8
+dEQP-VK.multiview.index.tesellation_shader.15_15_15_15
+dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
+dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_optimal
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear_mapped
diff --git a/external/vulkancts/framework/vulkan/vkBasicTypes.inl b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
index 864655a..5ca3df6 100644
--- a/external/vulkancts/framework/vulkan/vkBasicTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
@@ -9,6 +9,7 @@
 #define VK_MAX_MEMORY_TYPES					(static_cast<size_t>			(32))
 #define VK_MAX_MEMORY_HEAPS					(static_cast<size_t>			(16))
 #define VK_MAX_DESCRIPTION_SIZE				(static_cast<size_t>			(256))
+#define VK_MAX_DEVICE_GROUP_SIZE_KHX		(static_cast<size_t>			(32))
 #define VK_ATTACHMENT_UNUSED				(static_cast<deUint32>			((~0U)))
 #define VK_SUBPASS_EXTERNAL					(static_cast<deUint32>			((~0U)))
 #define VK_QUEUE_FAMILY_IGNORED				(static_cast<deUint32>			((~0U)))
@@ -90,142 +91,166 @@
 
 enum VkStructureType
 {
-	VK_STRUCTURE_TYPE_APPLICATION_INFO											= 0,
-	VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO										= 1,
-	VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO									= 2,
-	VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO										= 3,
-	VK_STRUCTURE_TYPE_SUBMIT_INFO												= 4,
-	VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO										= 5,
-	VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE										= 6,
-	VK_STRUCTURE_TYPE_BIND_SPARSE_INFO											= 7,
-	VK_STRUCTURE_TYPE_FENCE_CREATE_INFO											= 8,
-	VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO										= 9,
-	VK_STRUCTURE_TYPE_EVENT_CREATE_INFO											= 10,
-	VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO									= 11,
-	VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO										= 12,
-	VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO									= 13,
-	VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO											= 14,
-	VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO									= 15,
-	VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO									= 16,
-	VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO								= 17,
-	VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO							= 18,
-	VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO					= 19,
-	VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO					= 20,
-	VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO					= 21,
-	VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO						= 22,
-	VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO					= 23,
-	VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO					= 24,
-	VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO					= 25,
-	VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO					= 26,
-	VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO						= 27,
-	VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO								= 28,
-	VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO								= 29,
-	VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO								= 30,
-	VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO										= 31,
-	VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO							= 32,
-	VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO								= 33,
-	VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO								= 34,
-	VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET										= 35,
-	VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET										= 36,
-	VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO									= 37,
-	VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO									= 38,
-	VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO									= 39,
-	VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO								= 40,
-	VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO							= 41,
-	VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO									= 42,
-	VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO									= 43,
-	VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER										= 44,
-	VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER										= 45,
-	VK_STRUCTURE_TYPE_MEMORY_BARRIER											= 46,
-	VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO								= 47,
-	VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO									= 48,
-	VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR									= 1000001000,
-	VK_STRUCTURE_TYPE_PRESENT_INFO_KHR											= 1000001001,
-	VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR								= 1000002000,
-	VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR							= 1000002001,
-	VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR									= 1000003000,
-	VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR								= 1000004000,
-	VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR								= 1000005000,
-	VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR							= 1000006000,
-	VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR								= 1000007000,
-	VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR							= 1000008000,
-	VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR								= 1000009000,
-	VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT						= 1000011000,
-	VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHX						= 1000053000,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHX					= 1000053001,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHX					= 1000053002,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR							= 1000059000,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR							= 1000059001,
-	VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR									= 1000059002,
-	VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR								= 1000059003,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR					= 1000059004,
-	VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR								= 1000059005,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR					= 1000059006,
-	VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR						= 1000059007,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR			= 1000059008,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR			= 1000071000,
-	VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR						= 1000071001,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR					= 1000071002,
-	VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR							= 1000071003,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR							= 1000071004,
-	VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR					= 1000072000,
-	VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR						= 1000072001,
-	VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR							= 1000072002,
-	VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR						= 1000073000,
-	VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR						= 1000073001,
-	VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR						= 1000073002,
-	VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR							= 1000073003,
-	VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR									= 1000074000,
-	VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR									= 1000074001,
-	VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR									= 1000074002,
-	VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR				= 1000075000,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR				= 1000076000,
-	VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR							= 1000076001,
-	VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR							= 1000077000,
-	VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR					= 1000078000,
-	VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR					= 1000078001,
-	VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR								= 1000078002,
-	VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR						= 1000078003,
-	VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR								= 1000079000,
-	VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR									= 1000079001,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR			= 1000080000,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR				= 1000083000,
-	VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR										= 1000084000,
-	VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR				= 1000085000,
-	VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE									= 1000092000,
-	VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR					= 1000111000,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR					= 1000112000,
-	VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR								= 1000112001,
-	VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR								= 1000113000,
-	VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR						= 1000114000,
-	VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR						= 1000114001,
-	VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR							= 1000114002,
-	VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR									= 1000115000,
-	VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR										= 1000115001,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR				= 1000117000,
-	VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR		= 1000117001,
-	VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR							= 1000117002,
-	VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR	= 1000117003,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR						= 1000119000,
-	VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR								= 1000119001,
-	VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR										= 1000119002,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR				= 1000120000,
-	VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR							= 1000127000,
-	VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR						= 1000127001,
-	VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR						= 1000146000,
-	VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR						= 1000146001,
-	VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR							= 1000147000,
-	VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR				= 1000146002,
-	VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR									= 1000146003,
-	VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR					= 1000146004,
-	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR					= 1000156000,
-	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR							= 1000156001,
-	VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR							= 1000156002,
-	VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR					= 1000156003,
-	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR		= 1000156004,
-	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR		= 1000156005,
-	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR								= 1000157000,
-	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR								= 1000157001,
+	VK_STRUCTURE_TYPE_APPLICATION_INFO												= 0,
+	VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO											= 1,
+	VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO										= 2,
+	VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO											= 3,
+	VK_STRUCTURE_TYPE_SUBMIT_INFO													= 4,
+	VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO											= 5,
+	VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE											= 6,
+	VK_STRUCTURE_TYPE_BIND_SPARSE_INFO												= 7,
+	VK_STRUCTURE_TYPE_FENCE_CREATE_INFO												= 8,
+	VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO											= 9,
+	VK_STRUCTURE_TYPE_EVENT_CREATE_INFO												= 10,
+	VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO										= 11,
+	VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO											= 12,
+	VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO										= 13,
+	VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO												= 14,
+	VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO										= 15,
+	VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO										= 16,
+	VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO									= 17,
+	VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO								= 18,
+	VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO						= 19,
+	VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO						= 20,
+	VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO						= 21,
+	VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO							= 22,
+	VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO						= 23,
+	VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO						= 24,
+	VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO						= 25,
+	VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO						= 26,
+	VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO							= 27,
+	VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO									= 28,
+	VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO									= 29,
+	VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO									= 30,
+	VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO											= 31,
+	VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO								= 32,
+	VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO									= 33,
+	VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO									= 34,
+	VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET											= 35,
+	VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET											= 36,
+	VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO										= 37,
+	VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO										= 38,
+	VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO										= 39,
+	VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO									= 40,
+	VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO								= 41,
+	VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO										= 42,
+	VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO										= 43,
+	VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER											= 44,
+	VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER											= 45,
+	VK_STRUCTURE_TYPE_MEMORY_BARRIER												= 46,
+	VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO									= 47,
+	VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO										= 48,
+	VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR										= 1000001000,
+	VK_STRUCTURE_TYPE_PRESENT_INFO_KHR												= 1000001001,
+	VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR									= 1000002000,
+	VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR								= 1000002001,
+	VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR										= 1000003000,
+	VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR									= 1000004000,
+	VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR									= 1000005000,
+	VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR								= 1000006000,
+	VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR									= 1000007000,
+	VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR								= 1000008000,
+	VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR									= 1000009000,
+	VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT							= 1000011000,
+	VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHX							= 1000053000,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHX						= 1000053001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHX						= 1000053002,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR								= 1000059000,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR								= 1000059001,
+	VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR										= 1000059002,
+	VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR									= 1000059003,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR						= 1000059004,
+	VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR									= 1000059005,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR						= 1000059006,
+	VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR							= 1000059007,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR				= 1000059008,
+	VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX								= 1000060000,
+	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX									= 1000060001,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX									= 1000060002,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX						= 1000060003,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX					= 1000060004,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX									= 1000060005,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX								= 1000060006,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX							= 1000060007,
+	VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX								= 1000060008,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX							= 1000060009,
+	VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX									= 1000060010,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX									= 1000060011,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX						= 1000060012,
+	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX						= 1000060013,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX						= 1000060014,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX							= 1000070000,
+	VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX							= 1000070001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR				= 1000071000,
+	VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR							= 1000071001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR						= 1000071002,
+	VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR								= 1000071003,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR								= 1000071004,
+	VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR						= 1000072000,
+	VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR							= 1000072001,
+	VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR								= 1000072002,
+	VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR							= 1000073000,
+	VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR							= 1000073001,
+	VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR							= 1000073002,
+	VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR								= 1000073003,
+	VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR										= 1000074000,
+	VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR										= 1000074001,
+	VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR										= 1000074002,
+	VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR					= 1000075000,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR					= 1000076000,
+	VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR								= 1000076001,
+	VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR								= 1000077000,
+	VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR						= 1000078000,
+	VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR						= 1000078001,
+	VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR									= 1000078002,
+	VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR							= 1000078003,
+	VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR									= 1000079000,
+	VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR										= 1000079001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR				= 1000080000,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR					= 1000083000,
+	VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR											= 1000084000,
+	VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR					= 1000085000,
+	VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE										= 1000092000,
+	VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR						= 1000111000,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR						= 1000112000,
+	VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR									= 1000112001,
+	VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR									= 1000113000,
+	VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR							= 1000114000,
+	VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR							= 1000114001,
+	VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR								= 1000114002,
+	VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR										= 1000115000,
+	VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR											= 1000115001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR					= 1000117000,
+	VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR			= 1000117001,
+	VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR								= 1000117002,
+	VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR		= 1000117003,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR							= 1000119000,
+	VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR									= 1000119001,
+	VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR											= 1000119002,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR					= 1000120000,
+	VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR								= 1000127000,
+	VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR							= 1000127001,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANDROID_HARDWARE_BUFFER_INFO_ANDROID			= 1000129000,
+	VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID							= 1000129001,
+	VK_STRUCTURE_TYPE_MEMORY_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID				= 1000129002,
+	VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID					= 1000129003,
+	VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID				= 1000129004,
+	VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_EXTERNAL_FORMAT_PROPERTIES_ANDROID	= 1000129005,
+	VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID										= 1000129006,
+	VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR							= 1000146000,
+	VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR							= 1000146001,
+	VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR								= 1000147000,
+	VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR					= 1000146002,
+	VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR										= 1000146003,
+	VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR						= 1000146004,
+	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR						= 1000156000,
+	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR								= 1000156001,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR								= 1000156002,
+	VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR						= 1000156003,
+	VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR			= 1000156004,
+	VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR			= 1000156005,
+	VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR									= 1000157000,
+	VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR									= 1000157001,
 };
 
 enum VkSystemAllocationScope
@@ -1367,13 +1392,14 @@
 
 enum VkExternalMemoryHandleTypeFlagBitsKHR
 {
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR			= 0x00000001,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR			= 0x00000002,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR		= 0x00000004,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR		= 0x00000008,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR	= 0x00000010,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR			= 0x00000020,
-	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR		= 0x00000040,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR					= 0x00000001,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR					= 0x00000002,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR				= 0x00000004,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR				= 0x00000008,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR			= 0x00000010,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR					= 0x00000020,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR				= 0x00000040,
+	VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID	= 0x00000080,
 };
 typedef deUint32 VkExternalMemoryHandleTypeFlagsKHR;
 
@@ -1408,6 +1434,30 @@
 };
 typedef deUint32 VkSemaphoreImportFlagsKHR;
 
+enum VkPeerMemoryFeatureFlagBitsKHX
+{
+	VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX		= 0x00000001,
+	VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX		= 0x00000002,
+	VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX	= 0x00000004,
+	VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX	= 0x00000008,
+};
+typedef deUint32 VkPeerMemoryFeatureFlagsKHX;
+
+enum VkMemoryAllocateFlagBitsKHX
+{
+	VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX	= 0x00000001,
+};
+typedef deUint32 VkMemoryAllocateFlagsKHX;
+
+enum VkDeviceGroupPresentModeFlagBitsKHX
+{
+	VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX				= 0x00000001,
+	VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX				= 0x00000002,
+	VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX				= 0x00000004,
+	VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX	= 0x00000008,
+};
+typedef deUint32 VkDeviceGroupPresentModeFlagsKHX;
+
 typedef deUint32 VkInstanceCreateFlags;
 
 typedef deUint32 VkDeviceCreateFlags;
@@ -1495,3 +1545,4 @@
 VK_DEFINE_PLATFORM_TYPE(Win32WindowHandle,			void*);
 VK_DEFINE_PLATFORM_TYPE(Win32Handle,				void*);
 VK_DEFINE_PLATFORM_TYPE(Win32SecurityAttributesPtr,	const void*);
+VK_DEFINE_PLATFORM_TYPE(AndroidHardwareBufferPtr,	void*);
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index 14221d5..f93e725 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -1,157 +1,165 @@
 /* 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 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) 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 void		cmdPushDescriptorSetKHR					(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const;
-virtual VkResult	createDescriptorUpdateTemplateKHR		(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate) const;
-virtual void		destroyDescriptorUpdateTemplateKHR		(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const;
-virtual void		updateDescriptorSetWithTemplateKHR		(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const;
-virtual void		cmdPushDescriptorSetWithTemplateKHR		(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const;
-virtual VkResult	getSwapchainStatusKHR					(VkDevice device, VkSwapchainKHR swapchain) const;
-virtual VkResult	importFenceWin32HandleKHR				(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const;
-virtual VkResult	getFenceWin32HandleKHR					(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
-virtual VkResult	importFenceFdKHR						(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const;
-virtual VkResult	getFenceFdKHR							(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const;
-virtual void		getImageMemoryRequirements2KHR			(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
-virtual void		getBufferMemoryRequirements2KHR			(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
-virtual void		getImageSparseMemoryRequirements2KHR	(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const;
-virtual VkResult	createSamplerYcbcrConversionKHR			(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion) const;
-virtual void		destroySamplerYcbcrConversionKHR		(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult	getMemoryWin32HandleKHR					(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
-virtual VkResult	getMemoryWin32HandlePropertiesKHR		(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const;
-virtual VkResult	getMemoryFdKHR							(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) const;
-virtual VkResult	getMemoryFdPropertiesKHR				(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties) const;
-virtual VkResult	importSemaphoreWin32HandleKHR			(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const;
-virtual VkResult	getSemaphoreWin32HandleKHR				(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
-virtual VkResult	importSemaphoreFdKHR					(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) const;
-virtual VkResult	getSemaphoreFdKHR						(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const;
-virtual VkResult	getRefreshCycleDurationGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const;
-virtual VkResult	getPastPresentationTimingGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const;
-virtual VkResult	bindBufferMemory2KHR					(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const;
-virtual VkResult	bindImageMemory2KHR						(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) 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 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) 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 void		cmdPushDescriptorSetKHR							(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const;
+virtual VkResult	createDescriptorUpdateTemplateKHR				(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate) const;
+virtual void		destroyDescriptorUpdateTemplateKHR				(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const;
+virtual void		updateDescriptorSetWithTemplateKHR				(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const;
+virtual void		cmdPushDescriptorSetWithTemplateKHR				(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const;
+virtual VkResult	getSwapchainStatusKHR							(VkDevice device, VkSwapchainKHR swapchain) const;
+virtual VkResult	importFenceWin32HandleKHR						(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const;
+virtual VkResult	getFenceWin32HandleKHR							(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
+virtual VkResult	importFenceFdKHR								(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const;
+virtual VkResult	getFenceFdKHR									(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const;
+virtual void		getImageMemoryRequirements2KHR					(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
+virtual void		getBufferMemoryRequirements2KHR					(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const;
+virtual void		getImageSparseMemoryRequirements2KHR			(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const;
+virtual VkResult	createSamplerYcbcrConversionKHR					(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion) const;
+virtual void		destroySamplerYcbcrConversionKHR				(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult	getMemoryWin32HandleKHR							(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
+virtual VkResult	getMemoryWin32HandlePropertiesKHR				(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const;
+virtual VkResult	getMemoryFdKHR									(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) const;
+virtual VkResult	getMemoryFdPropertiesKHR						(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties) const;
+virtual VkResult	importSemaphoreWin32HandleKHR					(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const;
+virtual VkResult	getSemaphoreWin32HandleKHR						(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
+virtual VkResult	importSemaphoreFdKHR							(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) const;
+virtual VkResult	getSemaphoreFdKHR								(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const;
+virtual VkResult	getRefreshCycleDurationGOOGLE					(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const;
+virtual VkResult	getPastPresentationTimingGOOGLE					(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const;
+virtual void		getDeviceGroupPeerMemoryFeaturesKHX				(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const;
+virtual void		cmdSetDeviceMaskKHX								(VkCommandBuffer commandBuffer, deUint32 deviceMask) const;
+virtual VkResult	getDeviceGroupPresentCapabilitiesKHX			(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const;
+virtual VkResult	getDeviceGroupSurfacePresentModesKHX			(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const;
+virtual VkResult	acquireNextImage2KHX							(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const;
+virtual void		cmdDispatchBaseKHX								(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const;
+virtual VkResult	bindBufferMemory2KHR							(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const;
+virtual VkResult	bindImageMemory2KHR								(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) const;
+virtual VkResult	getMemoryAndroidHardwareBufferPropertiesANDROID	(VkDevice device, const pt::AndroidHardwareBufferPtr buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties) const;
+virtual VkResult	getMemoryAndroidHardwareBufferANDROID			(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, pt::AndroidHardwareBufferPtr* pBuffer) const;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
index 9b38c47..73424ab 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
@@ -52,3 +52,6 @@
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
 virtual void				getPhysicalDeviceExternalBufferPropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties) const;
 virtual void				getPhysicalDeviceExternalSemaphorePropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties) const;
+virtual VkResult			getPhysicalDevicePresentRectanglesKHX				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const;
+virtual VkResult			enumeratePhysicalDeviceGroupsKHX					(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const;
+virtual void				getPhysicalDeviceAndroidHardwareBufferUsageANDROID	(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index 5d62b30..cbd3093 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -762,6 +762,36 @@
 	return m_vk.getPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
 }
 
+void DeviceDriver::getDeviceGroupPeerMemoryFeaturesKHX (VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const
+{
+	m_vk.getDeviceGroupPeerMemoryFeaturesKHX(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+}
+
+void DeviceDriver::cmdSetDeviceMaskKHX (VkCommandBuffer commandBuffer, deUint32 deviceMask) const
+{
+	m_vk.cmdSetDeviceMaskKHX(commandBuffer, deviceMask);
+}
+
+VkResult DeviceDriver::getDeviceGroupPresentCapabilitiesKHX (VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const
+{
+	return m_vk.getDeviceGroupPresentCapabilitiesKHX(device, pDeviceGroupPresentCapabilities);
+}
+
+VkResult DeviceDriver::getDeviceGroupSurfacePresentModesKHX (VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const
+{
+	return m_vk.getDeviceGroupSurfacePresentModesKHX(device, surface, pModes);
+}
+
+VkResult DeviceDriver::acquireNextImage2KHX (VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const
+{
+	return m_vk.acquireNextImage2KHX(device, pAcquireInfo, pImageIndex);
+}
+
+void DeviceDriver::cmdDispatchBaseKHX (VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const
+{
+	m_vk.cmdDispatchBaseKHX(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+}
+
 VkResult DeviceDriver::bindBufferMemory2KHR (VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const
 {
 	return m_vk.bindBufferMemory2KHR(device, bindInfoCount, pBindInfos);
@@ -771,3 +801,13 @@
 {
 	return m_vk.bindImageMemory2KHR(device, bindInfoCount, pBindInfos);
 }
+
+VkResult DeviceDriver::getMemoryAndroidHardwareBufferPropertiesANDROID (VkDevice device, const pt::AndroidHardwareBufferPtr buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties) const
+{
+	return m_vk.getMemoryAndroidHardwareBufferPropertiesANDROID(device, buffer, pProperties);
+}
+
+VkResult DeviceDriver::getMemoryAndroidHardwareBufferANDROID (VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, pt::AndroidHardwareBufferPtr* pBuffer) const
+{
+	return m_vk.getMemoryAndroidHardwareBufferANDROID(device, pInfo, pBuffer);
+}
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index e376610..91f6993 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -1,157 +1,165 @@
 /* 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;
-CmdPushDescriptorSetKHRFunc					cmdPushDescriptorSetKHR;
-CreateDescriptorUpdateTemplateKHRFunc		createDescriptorUpdateTemplateKHR;
-DestroyDescriptorUpdateTemplateKHRFunc		destroyDescriptorUpdateTemplateKHR;
-UpdateDescriptorSetWithTemplateKHRFunc		updateDescriptorSetWithTemplateKHR;
-CmdPushDescriptorSetWithTemplateKHRFunc		cmdPushDescriptorSetWithTemplateKHR;
-GetSwapchainStatusKHRFunc					getSwapchainStatusKHR;
-ImportFenceWin32HandleKHRFunc				importFenceWin32HandleKHR;
-GetFenceWin32HandleKHRFunc					getFenceWin32HandleKHR;
-ImportFenceFdKHRFunc						importFenceFdKHR;
-GetFenceFdKHRFunc							getFenceFdKHR;
-GetImageMemoryRequirements2KHRFunc			getImageMemoryRequirements2KHR;
-GetBufferMemoryRequirements2KHRFunc			getBufferMemoryRequirements2KHR;
-GetImageSparseMemoryRequirements2KHRFunc	getImageSparseMemoryRequirements2KHR;
-CreateSamplerYcbcrConversionKHRFunc			createSamplerYcbcrConversionKHR;
-DestroySamplerYcbcrConversionKHRFunc		destroySamplerYcbcrConversionKHR;
-GetMemoryWin32HandleKHRFunc					getMemoryWin32HandleKHR;
-GetMemoryWin32HandlePropertiesKHRFunc		getMemoryWin32HandlePropertiesKHR;
-GetMemoryFdKHRFunc							getMemoryFdKHR;
-GetMemoryFdPropertiesKHRFunc				getMemoryFdPropertiesKHR;
-ImportSemaphoreWin32HandleKHRFunc			importSemaphoreWin32HandleKHR;
-GetSemaphoreWin32HandleKHRFunc				getSemaphoreWin32HandleKHR;
-ImportSemaphoreFdKHRFunc					importSemaphoreFdKHR;
-GetSemaphoreFdKHRFunc						getSemaphoreFdKHR;
-GetRefreshCycleDurationGOOGLEFunc			getRefreshCycleDurationGOOGLE;
-GetPastPresentationTimingGOOGLEFunc			getPastPresentationTimingGOOGLE;
-BindBufferMemory2KHRFunc					bindBufferMemory2KHR;
-BindImageMemory2KHRFunc						bindImageMemory2KHR;
+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;
+CmdPushDescriptorSetKHRFunc							cmdPushDescriptorSetKHR;
+CreateDescriptorUpdateTemplateKHRFunc				createDescriptorUpdateTemplateKHR;
+DestroyDescriptorUpdateTemplateKHRFunc				destroyDescriptorUpdateTemplateKHR;
+UpdateDescriptorSetWithTemplateKHRFunc				updateDescriptorSetWithTemplateKHR;
+CmdPushDescriptorSetWithTemplateKHRFunc				cmdPushDescriptorSetWithTemplateKHR;
+GetSwapchainStatusKHRFunc							getSwapchainStatusKHR;
+ImportFenceWin32HandleKHRFunc						importFenceWin32HandleKHR;
+GetFenceWin32HandleKHRFunc							getFenceWin32HandleKHR;
+ImportFenceFdKHRFunc								importFenceFdKHR;
+GetFenceFdKHRFunc									getFenceFdKHR;
+GetImageMemoryRequirements2KHRFunc					getImageMemoryRequirements2KHR;
+GetBufferMemoryRequirements2KHRFunc					getBufferMemoryRequirements2KHR;
+GetImageSparseMemoryRequirements2KHRFunc			getImageSparseMemoryRequirements2KHR;
+CreateSamplerYcbcrConversionKHRFunc					createSamplerYcbcrConversionKHR;
+DestroySamplerYcbcrConversionKHRFunc				destroySamplerYcbcrConversionKHR;
+GetMemoryWin32HandleKHRFunc							getMemoryWin32HandleKHR;
+GetMemoryWin32HandlePropertiesKHRFunc				getMemoryWin32HandlePropertiesKHR;
+GetMemoryFdKHRFunc									getMemoryFdKHR;
+GetMemoryFdPropertiesKHRFunc						getMemoryFdPropertiesKHR;
+ImportSemaphoreWin32HandleKHRFunc					importSemaphoreWin32HandleKHR;
+GetSemaphoreWin32HandleKHRFunc						getSemaphoreWin32HandleKHR;
+ImportSemaphoreFdKHRFunc							importSemaphoreFdKHR;
+GetSemaphoreFdKHRFunc								getSemaphoreFdKHR;
+GetRefreshCycleDurationGOOGLEFunc					getRefreshCycleDurationGOOGLE;
+GetPastPresentationTimingGOOGLEFunc					getPastPresentationTimingGOOGLE;
+GetDeviceGroupPeerMemoryFeaturesKHXFunc				getDeviceGroupPeerMemoryFeaturesKHX;
+CmdSetDeviceMaskKHXFunc								cmdSetDeviceMaskKHX;
+GetDeviceGroupPresentCapabilitiesKHXFunc			getDeviceGroupPresentCapabilitiesKHX;
+GetDeviceGroupSurfacePresentModesKHXFunc			getDeviceGroupSurfacePresentModesKHX;
+AcquireNextImage2KHXFunc							acquireNextImage2KHX;
+CmdDispatchBaseKHXFunc								cmdDispatchBaseKHX;
+BindBufferMemory2KHRFunc							bindBufferMemory2KHR;
+BindImageMemory2KHRFunc								bindImageMemory2KHR;
+GetMemoryAndroidHardwareBufferPropertiesANDROIDFunc	getMemoryAndroidHardwareBufferPropertiesANDROID;
+GetMemoryAndroidHardwareBufferANDROIDFunc			getMemoryAndroidHardwareBufferANDROID;
diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
index f187b2c..437fa3f 100644
--- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
@@ -1,212 +1,223 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateInstanceFunc)									(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyInstanceFunc)									(VkInstance instance, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumeratePhysicalDevicesFunc)							(VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFeaturesFunc)							(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFormatPropertiesFunc)					(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceImageFormatPropertiesFunc)			(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDevicePropertiesFunc)						(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceQueueFamilyPropertiesFunc)			(VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceMemoryPropertiesFunc)					(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);
-typedef VKAPI_ATTR PFN_vkVoidFunction	(VKAPI_CALL* GetInstanceProcAddrFunc)								(VkInstance instance, const char* pName);
-typedef VKAPI_ATTR PFN_vkVoidFunction	(VKAPI_CALL* GetDeviceProcAddrFunc)									(VkDevice device, const char* pName);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDeviceFunc)										(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDeviceFunc)										(VkDevice device, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateInstanceExtensionPropertiesFunc)				(const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateDeviceExtensionPropertiesFunc)				(VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateInstanceLayerPropertiesFunc)					(deUint32* pPropertyCount, VkLayerProperties* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateDeviceLayerPropertiesFunc)					(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceQueueFunc)									(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueSubmitFunc)										(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueWaitIdleFunc)										(VkQueue queue);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* DeviceWaitIdleFunc)									(VkDevice device);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateMemoryFunc)									(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory);
-typedef VKAPI_ATTR void					(VKAPI_CALL* FreeMemoryFunc)										(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* MapMemoryFunc)											(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);
-typedef VKAPI_ATTR void					(VKAPI_CALL* UnmapMemoryFunc)										(VkDevice device, VkDeviceMemory memory);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* FlushMappedMemoryRangesFunc)							(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* InvalidateMappedMemoryRangesFunc)						(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceMemoryCommitmentFunc)							(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindBufferMemoryFunc)									(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindImageMemoryFunc)									(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetBufferMemoryRequirementsFunc)						(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageMemoryRequirementsFunc)						(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSparseMemoryRequirementsFunc)					(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceSparseImageFormatPropertiesFunc)		(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueBindSparseFunc)									(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateFenceFunc)										(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyFenceFunc)										(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetFencesFunc)										(VkDevice device, deUint32 fenceCount, const VkFence* pFences);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceStatusFunc)									(VkDevice device, VkFence fence);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* WaitForFencesFunc)										(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSemaphoreFunc)									(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySemaphoreFunc)									(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateEventFunc)										(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyEventFunc)										(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetEventStatusFunc)									(VkDevice device, VkEvent event);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* SetEventFunc)											(VkDevice device, VkEvent event);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetEventFunc)										(VkDevice device, VkEvent event);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateQueryPoolFunc)									(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyQueryPoolFunc)									(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetQueryPoolResultsFunc)								(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateBufferFunc)										(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyBufferFunc)										(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateBufferViewFunc)									(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyBufferViewFunc)									(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateImageFunc)										(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyImageFunc)										(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSubresourceLayoutFunc)							(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateImageViewFunc)									(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyImageViewFunc)									(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateShaderModuleFunc)								(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyShaderModuleFunc)								(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreatePipelineCacheFunc)								(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineCacheFunc)								(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPipelineCacheDataFunc)								(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* MergePipelineCachesFunc)								(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateGraphicsPipelinesFunc)							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateComputePipelinesFunc)							(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineFunc)									(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreatePipelineLayoutFunc)								(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineLayoutFunc)								(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSamplerFunc)										(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySamplerFunc)									(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorSetLayoutFunc)							(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorSetLayoutFunc)						(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorPoolFunc)								(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorPoolFunc)								(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetDescriptorPoolFunc)								(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateDescriptorSetsFunc)							(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* FreeDescriptorSetsFunc)								(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets);
-typedef VKAPI_ATTR void					(VKAPI_CALL* UpdateDescriptorSetsFunc)								(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateFramebufferFunc)									(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyFramebufferFunc)								(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateRenderPassFunc)									(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyRenderPassFunc)									(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetRenderAreaGranularityFunc)							(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateCommandPoolFunc)									(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyCommandPoolFunc)								(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetCommandPoolFunc)									(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateCommandBuffersFunc)							(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers);
-typedef VKAPI_ATTR void					(VKAPI_CALL* FreeCommandBuffersFunc)								(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BeginCommandBufferFunc)								(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EndCommandBufferFunc)									(VkCommandBuffer commandBuffer);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetCommandBufferFunc)								(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindPipelineFunc)									(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetViewportFunc)									(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetScissorFunc)										(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetLineWidthFunc)									(VkCommandBuffer commandBuffer, float lineWidth);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDepthBiasFunc)									(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetBlendConstantsFunc)								(VkCommandBuffer commandBuffer, const float blendConstants[4]);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDepthBoundsFunc)									(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilCompareMaskFunc)							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilWriteMaskFunc)							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilReferenceFunc)							(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindDescriptorSetsFunc)								(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindIndexBufferFunc)								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindVertexBuffersFunc)								(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawFunc)											(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndexedFunc)									(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndirectFunc)									(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndexedIndirectFunc)							(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchFunc)										(VkCommandBuffer commandBuffer, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchIndirectFunc)								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyBufferFunc)										(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyImageFunc)										(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBlitImageFunc)										(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyBufferToImageFunc)								(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyImageToBufferFunc)								(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdUpdateBufferFunc)									(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdFillBufferFunc)										(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearColorImageFunc)								(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearDepthStencilImageFunc)							(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearAttachmentsFunc)								(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResolveImageFunc)									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetEventFunc)										(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResetEventFunc)										(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdWaitEventsFunc)										(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);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPipelineBarrierFunc)								(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBeginQueryFunc)										(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdEndQueryFunc)										(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResetQueryPoolFunc)									(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdWriteTimestampFunc)									(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyQueryPoolResultsFunc)							(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushConstantsFunc)									(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBeginRenderPassFunc)								(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdNextSubpassFunc)									(VkCommandBuffer commandBuffer, VkSubpassContents contents);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdEndRenderPassFunc)									(VkCommandBuffer commandBuffer);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdExecuteCommandsFunc)								(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySurfaceKHRFunc)									(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceSupportKHRFunc)				(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilitiesKHRFunc)			(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceFormatsKHRFunc)				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfacePresentModesKHRFunc)			(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSwapchainKHRFunc)								(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySwapchainKHRFunc)								(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSwapchainImagesKHRFunc)								(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AcquireNextImageKHRFunc)								(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueuePresentKHRFunc)									(VkQueue queue, const VkPresentInfoKHR* pPresentInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceDisplayPropertiesKHRFunc)				(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceDisplayPlanePropertiesKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayPlaneSupportedDisplaysKHRFunc)				(VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayModePropertiesKHRFunc)						(VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDisplayModeKHRFunc)								(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayPlaneCapabilitiesKHRFunc)					(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDisplayPlaneSurfaceKHRFunc)						(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSharedSwapchainsKHRFunc)							(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateXlibSurfaceKHRFunc)								(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceXlibPresentationSupportKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateXcbSurfaceKHRFunc)								(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceXcbPresentationSupportKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateWaylandSurfaceKHRFunc)							(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceWaylandPresentationSupportKHRFunc)	(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateMirSurfaceKHRFunc)								(VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceMirPresentationSupportKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateAndroidSurfaceKHRFunc)							(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateWin32SurfaceKHRFunc)								(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
-typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceWin32PresentationSupportKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFeatures2KHRFunc)						(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR* pFeatures);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceProperties2KHRFunc)					(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2KHR* pProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFormatProperties2KHRFunc)				(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2KHR* pFormatProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceImageFormatProperties2KHRFunc)		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceQueueFamilyProperties2KHRFunc)		(VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties2KHR* pQueueFamilyProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceMemoryProperties2KHRFunc)				(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2KHR* pMemoryProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceSparseImageFormatProperties2KHRFunc)	(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, deUint32* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* TrimCommandPoolKHRFunc)								(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushDescriptorSetKHRFunc)							(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorUpdateTemplateKHRFunc)					(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorUpdateTemplateKHRFunc)				(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR void					(VKAPI_CALL* UpdateDescriptorSetWithTemplateKHRFunc)				(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData);
-typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushDescriptorSetWithTemplateKHRFunc)				(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSwapchainStatusKHRFunc)								(VkDevice device, VkSwapchainKHR swapchain);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilities2KHRFunc)			(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceFormats2KHRFunc)				(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalFencePropertiesKHRFunc)		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportFenceWin32HandleKHRFunc)							(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceWin32HandleKHRFunc)							(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportFenceFdKHRFunc)									(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceFdKHRFunc)										(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageMemoryRequirements2KHRFunc)					(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetBufferMemoryRequirements2KHRFunc)					(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSparseMemoryRequirements2KHRFunc)				(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSamplerYcbcrConversionKHRFunc)					(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySamplerYcbcrConversionKHRFunc)					(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDebugReportCallbackEXTFunc)						(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDebugReportCallbackEXTFunc)						(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);
-typedef VKAPI_ATTR void					(VKAPI_CALL* DebugReportMessageEXTFunc)								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalBufferPropertiesKHRFunc)		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryWin32HandleKHRFunc)							(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryWin32HandlePropertiesKHRFunc)					(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryFdKHRFunc)									(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryFdPropertiesKHRFunc)							(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties);
-typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc)	(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportSemaphoreWin32HandleKHRFunc)						(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSemaphoreWin32HandleKHRFunc)						(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportSemaphoreFdKHRFunc)								(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSemaphoreFdKHRFunc)									(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetRefreshCycleDurationGOOGLEFunc)						(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPastPresentationTimingGOOGLEFunc)					(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindBufferMemory2KHRFunc)								(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos);
-typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindImageMemory2KHRFunc)								(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateInstanceFunc)										(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyInstanceFunc)										(VkInstance instance, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumeratePhysicalDevicesFunc)								(VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFeaturesFunc)								(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFormatPropertiesFunc)						(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceImageFormatPropertiesFunc)				(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDevicePropertiesFunc)							(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceQueueFamilyPropertiesFunc)				(VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceMemoryPropertiesFunc)						(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);
+typedef VKAPI_ATTR PFN_vkVoidFunction	(VKAPI_CALL* GetInstanceProcAddrFunc)									(VkInstance instance, const char* pName);
+typedef VKAPI_ATTR PFN_vkVoidFunction	(VKAPI_CALL* GetDeviceProcAddrFunc)										(VkDevice device, const char* pName);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDeviceFunc)											(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDeviceFunc)											(VkDevice device, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateInstanceExtensionPropertiesFunc)					(const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateDeviceExtensionPropertiesFunc)					(VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateInstanceLayerPropertiesFunc)						(deUint32* pPropertyCount, VkLayerProperties* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumerateDeviceLayerPropertiesFunc)						(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceQueueFunc)										(VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueSubmitFunc)											(VkQueue queue, deUint32 submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueWaitIdleFunc)											(VkQueue queue);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* DeviceWaitIdleFunc)										(VkDevice device);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateMemoryFunc)										(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory);
+typedef VKAPI_ATTR void					(VKAPI_CALL* FreeMemoryFunc)											(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* MapMemoryFunc)												(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);
+typedef VKAPI_ATTR void					(VKAPI_CALL* UnmapMemoryFunc)											(VkDevice device, VkDeviceMemory memory);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* FlushMappedMemoryRangesFunc)								(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* InvalidateMappedMemoryRangesFunc)							(VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceMemoryCommitmentFunc)								(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindBufferMemoryFunc)										(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindImageMemoryFunc)										(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetBufferMemoryRequirementsFunc)							(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageMemoryRequirementsFunc)							(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSparseMemoryRequirementsFunc)						(VkDevice device, VkImage image, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceSparseImageFormatPropertiesFunc)			(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueueBindSparseFunc)										(VkQueue queue, deUint32 bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateFenceFunc)											(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyFenceFunc)											(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetFencesFunc)											(VkDevice device, deUint32 fenceCount, const VkFence* pFences);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceStatusFunc)										(VkDevice device, VkFence fence);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* WaitForFencesFunc)											(VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSemaphoreFunc)										(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySemaphoreFunc)										(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateEventFunc)											(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyEventFunc)											(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetEventStatusFunc)										(VkDevice device, VkEvent event);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* SetEventFunc)												(VkDevice device, VkEvent event);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetEventFunc)											(VkDevice device, VkEvent event);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateQueryPoolFunc)										(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyQueryPoolFunc)										(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetQueryPoolResultsFunc)									(VkDevice device, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, deUintptr dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateBufferFunc)											(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyBufferFunc)											(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateBufferViewFunc)										(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyBufferViewFunc)										(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateImageFunc)											(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyImageFunc)											(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSubresourceLayoutFunc)								(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateImageViewFunc)										(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyImageViewFunc)										(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateShaderModuleFunc)									(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyShaderModuleFunc)									(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreatePipelineCacheFunc)									(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineCacheFunc)									(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPipelineCacheDataFunc)									(VkDevice device, VkPipelineCache pipelineCache, deUintptr* pDataSize, void* pData);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* MergePipelineCachesFunc)									(VkDevice device, VkPipelineCache dstCache, deUint32 srcCacheCount, const VkPipelineCache* pSrcCaches);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateGraphicsPipelinesFunc)								(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateComputePipelinesFunc)								(VkDevice device, VkPipelineCache pipelineCache, deUint32 createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineFunc)										(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreatePipelineLayoutFunc)									(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyPipelineLayoutFunc)									(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSamplerFunc)											(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySamplerFunc)										(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorSetLayoutFunc)								(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorSetLayoutFunc)							(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorPoolFunc)									(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorPoolFunc)									(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetDescriptorPoolFunc)									(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateDescriptorSetsFunc)								(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* FreeDescriptorSetsFunc)									(VkDevice device, VkDescriptorPool descriptorPool, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets);
+typedef VKAPI_ATTR void					(VKAPI_CALL* UpdateDescriptorSetsFunc)									(VkDevice device, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, deUint32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateFramebufferFunc)										(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyFramebufferFunc)									(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateRenderPassFunc)										(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyRenderPassFunc)										(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetRenderAreaGranularityFunc)								(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateCommandPoolFunc)										(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyCommandPoolFunc)									(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetCommandPoolFunc)										(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AllocateCommandBuffersFunc)								(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers);
+typedef VKAPI_ATTR void					(VKAPI_CALL* FreeCommandBuffersFunc)									(VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BeginCommandBufferFunc)									(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EndCommandBufferFunc)										(VkCommandBuffer commandBuffer);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ResetCommandBufferFunc)									(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindPipelineFunc)										(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetViewportFunc)										(VkCommandBuffer commandBuffer, deUint32 firstViewport, deUint32 viewportCount, const VkViewport* pViewports);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetScissorFunc)											(VkCommandBuffer commandBuffer, deUint32 firstScissor, deUint32 scissorCount, const VkRect2D* pScissors);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetLineWidthFunc)										(VkCommandBuffer commandBuffer, float lineWidth);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDepthBiasFunc)										(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetBlendConstantsFunc)									(VkCommandBuffer commandBuffer, const float blendConstants[4]);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDepthBoundsFunc)										(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilCompareMaskFunc)								(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 compareMask);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilWriteMaskFunc)								(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 writeMask);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetStencilReferenceFunc)								(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, deUint32 reference);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindDescriptorSetsFunc)									(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 firstSet, deUint32 descriptorSetCount, const VkDescriptorSet* pDescriptorSets, deUint32 dynamicOffsetCount, const deUint32* pDynamicOffsets);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindIndexBufferFunc)									(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBindVertexBuffersFunc)									(VkCommandBuffer commandBuffer, deUint32 firstBinding, deUint32 bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawFunc)												(VkCommandBuffer commandBuffer, deUint32 vertexCount, deUint32 instanceCount, deUint32 firstVertex, deUint32 firstInstance);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndexedFunc)										(VkCommandBuffer commandBuffer, deUint32 indexCount, deUint32 instanceCount, deUint32 firstIndex, deInt32 vertexOffset, deUint32 firstInstance);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndirectFunc)										(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDrawIndexedIndirectFunc)								(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, deUint32 drawCount, deUint32 stride);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchFunc)											(VkCommandBuffer commandBuffer, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchIndirectFunc)									(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyBufferFunc)											(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferCopy* pRegions);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyImageFunc)											(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageCopy* pRegions);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBlitImageFunc)											(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageBlit* pRegions, VkFilter filter);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyBufferToImageFunc)									(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkBufferImageCopy* pRegions);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyImageToBufferFunc)									(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, deUint32 regionCount, const VkBufferImageCopy* pRegions);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdUpdateBufferFunc)										(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdFillBufferFunc)											(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, deUint32 data);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearColorImageFunc)									(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, deUint32 rangeCount, const VkImageSubresourceRange* pRanges);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearDepthStencilImageFunc)								(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, deUint32 rangeCount, const VkImageSubresourceRange* pRanges);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdClearAttachmentsFunc)									(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkClearAttachment* pAttachments, deUint32 rectCount, const VkClearRect* pRects);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResolveImageFunc)										(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, deUint32 regionCount, const VkImageResolve* pRegions);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetEventFunc)											(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResetEventFunc)											(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdWaitEventsFunc)											(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);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPipelineBarrierFunc)									(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, deUint32 memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, deUint32 bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, deUint32 imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBeginQueryFunc)											(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query, VkQueryControlFlags flags);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdEndQueryFunc)											(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 query);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdResetQueryPoolFunc)										(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdWriteTimestampFunc)										(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, deUint32 query);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdCopyQueryPoolResultsFunc)								(VkCommandBuffer commandBuffer, VkQueryPool queryPool, deUint32 firstQuery, deUint32 queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushConstantsFunc)										(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, deUint32 offset, deUint32 size, const void* pValues);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdBeginRenderPassFunc)									(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdNextSubpassFunc)										(VkCommandBuffer commandBuffer, VkSubpassContents contents);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdEndRenderPassFunc)										(VkCommandBuffer commandBuffer);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdExecuteCommandsFunc)									(VkCommandBuffer commandBuffer, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySurfaceKHRFunc)										(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceSupportKHRFunc)					(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilitiesKHRFunc)				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceFormatsKHRFunc)					(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfacePresentModesKHRFunc)				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSwapchainKHRFunc)									(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySwapchainKHRFunc)									(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSwapchainImagesKHRFunc)									(VkDevice device, VkSwapchainKHR swapchain, deUint32* pSwapchainImageCount, VkImage* pSwapchainImages);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AcquireNextImageKHRFunc)									(VkDevice device, VkSwapchainKHR swapchain, deUint64 timeout, VkSemaphore semaphore, VkFence fence, deUint32* pImageIndex);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* QueuePresentKHRFunc)										(VkQueue queue, const VkPresentInfoKHR* pPresentInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceDisplayPropertiesKHRFunc)					(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceDisplayPlanePropertiesKHRFunc)			(VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayPlaneSupportedDisplaysKHRFunc)					(VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayModePropertiesKHRFunc)							(VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDisplayModeKHRFunc)									(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDisplayPlaneCapabilitiesKHRFunc)						(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDisplayPlaneSurfaceKHRFunc)							(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSharedSwapchainsKHRFunc)								(VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateXlibSurfaceKHRFunc)									(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceXlibPresentationSupportKHRFunc)			(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateXcbSurfaceKHRFunc)									(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceXcbPresentationSupportKHRFunc)			(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateWaylandSurfaceKHRFunc)								(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceWaylandPresentationSupportKHRFunc)		(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateMirSurfaceKHRFunc)									(VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceMirPresentationSupportKHRFunc)			(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateAndroidSurfaceKHRFunc)								(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateWin32SurfaceKHRFunc)									(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkBool32				(VKAPI_CALL* GetPhysicalDeviceWin32PresentationSupportKHRFunc)			(VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFeatures2KHRFunc)							(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR* pFeatures);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceProperties2KHRFunc)						(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2KHR* pProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceFormatProperties2KHRFunc)					(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2KHR* pFormatProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceImageFormatProperties2KHRFunc)			(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceQueueFamilyProperties2KHRFunc)			(VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties2KHR* pQueueFamilyProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceMemoryProperties2KHRFunc)					(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2KHR* pMemoryProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceSparseImageFormatProperties2KHRFunc)		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, deUint32* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* TrimCommandPoolKHRFunc)									(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushDescriptorSetKHRFunc)								(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDescriptorUpdateTemplateKHRFunc)						(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDescriptorUpdateTemplateKHRFunc)					(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR void					(VKAPI_CALL* UpdateDescriptorSetWithTemplateKHRFunc)					(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdPushDescriptorSetWithTemplateKHRFunc)					(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSwapchainStatusKHRFunc)									(VkDevice device, VkSwapchainKHR swapchain);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceCapabilities2KHRFunc)				(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDeviceSurfaceFormats2KHRFunc)					(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, deUint32* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalFencePropertiesKHRFunc)			(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfoKHR* pExternalFenceInfo, VkExternalFencePropertiesKHR* pExternalFenceProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportFenceWin32HandleKHRFunc)								(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceWin32HandleKHRFunc)								(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportFenceFdKHRFunc)										(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetFenceFdKHRFunc)											(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageMemoryRequirements2KHRFunc)						(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetBufferMemoryRequirements2KHRFunc)						(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetImageSparseMemoryRequirements2KHRFunc)					(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateSamplerYcbcrConversionKHRFunc)						(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroySamplerYcbcrConversionKHRFunc)						(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* CreateDebugReportCallbackEXTFunc)							(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DestroyDebugReportCallbackEXTFunc)							(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR void					(VKAPI_CALL* DebugReportMessageEXTFunc)									(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalBufferPropertiesKHRFunc)			(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryWin32HandleKHRFunc)								(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryWin32HandlePropertiesKHRFunc)						(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryFdKHRFunc)										(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryFdPropertiesKHRFunc)								(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc)		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportSemaphoreWin32HandleKHRFunc)							(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSemaphoreWin32HandleKHRFunc)							(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* ImportSemaphoreFdKHRFunc)									(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetSemaphoreFdKHRFunc)										(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetRefreshCycleDurationGOOGLEFunc)							(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPastPresentationTimingGOOGLEFunc)						(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetDeviceGroupPeerMemoryFeaturesKHXFunc)					(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdSetDeviceMaskKHXFunc)									(VkCommandBuffer commandBuffer, deUint32 deviceMask);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDeviceGroupPresentCapabilitiesKHXFunc)					(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetDeviceGroupSurfacePresentModesKHXFunc)					(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* AcquireNextImage2KHXFunc)									(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex);
+typedef VKAPI_ATTR void					(VKAPI_CALL* CmdDispatchBaseKHXFunc)									(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetPhysicalDevicePresentRectanglesKHXFunc)					(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* EnumeratePhysicalDeviceGroupsKHXFunc)						(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindBufferMemory2KHRFunc)									(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* BindImageMemory2KHRFunc)									(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos);
+typedef VKAPI_ATTR void					(VKAPI_CALL* GetPhysicalDeviceAndroidHardwareBufferUsageANDROIDFunc)	(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryAndroidHardwareBufferPropertiesANDROIDFunc)		(VkDevice device, const pt::AndroidHardwareBufferPtr buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties);
+typedef VKAPI_ATTR VkResult				(VKAPI_CALL* GetMemoryAndroidHardwareBufferANDROIDFunc)					(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, pt::AndroidHardwareBufferPtr* pBuffer);
diff --git a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
index dd146b6..3592255 100644
--- a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
@@ -661,6 +661,81 @@
 	return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR;
 }
 
+template<> VkStructureType getStructureType<VkMemoryAllocateFlagsInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupRenderPassBeginInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupCommandBufferBeginInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupSubmitInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupBindSparseInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupPresentCapabilitiesKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX;
+}
+
+template<> VkStructureType getStructureType<VkImageSwapchainCreateInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkBindBufferMemoryDeviceGroupInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkBindImageMemoryDeviceGroupInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkBindImageMemorySwapchainInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkAcquireNextImageInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupPresentInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupSwapchainCreateInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceGroupPropertiesKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX;
+}
+
+template<> VkStructureType getStructureType<VkDeviceGroupDeviceCreateInfoKHX> (void)
+{
+	return VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX;
+}
+
 template<> VkStructureType getStructureType<VkBindBufferMemoryInfoKHR> (void)
 {
 	return VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR;
@@ -671,3 +746,38 @@
 	return VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR;
 }
 
+template<> VkStructureType getStructureType<VkPhysicalDeviceAndroidHardwareBufferInfoANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkAndroidHardwareBufferUsageANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkMemoryAndroidHardwareBufferPropertiesANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_MEMORY_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkImportAndroidHardwareBufferInfoANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkMemoryGetAndroidHardwareBufferInfoANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkAndroidHardwareBufferExternalFormatPropertiesANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_EXTERNAL_FORMAT_PROPERTIES_ANDROID;
+}
+
+template<> VkStructureType getStructureType<VkExternalFormatANDROID> (void)
+{
+	return VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
+}
+
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index 6c943c9..bfac3d9 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -1,157 +1,165 @@
 /* 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.cmdPushDescriptorSetKHR				= (CmdPushDescriptorSetKHRFunc)					GET_PROC_ADDR("vkCmdPushDescriptorSetKHR");
-m_vk.createDescriptorUpdateTemplateKHR		= (CreateDescriptorUpdateTemplateKHRFunc)		GET_PROC_ADDR("vkCreateDescriptorUpdateTemplateKHR");
-m_vk.destroyDescriptorUpdateTemplateKHR		= (DestroyDescriptorUpdateTemplateKHRFunc)		GET_PROC_ADDR("vkDestroyDescriptorUpdateTemplateKHR");
-m_vk.updateDescriptorSetWithTemplateKHR		= (UpdateDescriptorSetWithTemplateKHRFunc)		GET_PROC_ADDR("vkUpdateDescriptorSetWithTemplateKHR");
-m_vk.cmdPushDescriptorSetWithTemplateKHR	= (CmdPushDescriptorSetWithTemplateKHRFunc)		GET_PROC_ADDR("vkCmdPushDescriptorSetWithTemplateKHR");
-m_vk.getSwapchainStatusKHR					= (GetSwapchainStatusKHRFunc)					GET_PROC_ADDR("vkGetSwapchainStatusKHR");
-m_vk.importFenceWin32HandleKHR				= (ImportFenceWin32HandleKHRFunc)				GET_PROC_ADDR("vkImportFenceWin32HandleKHR");
-m_vk.getFenceWin32HandleKHR					= (GetFenceWin32HandleKHRFunc)					GET_PROC_ADDR("vkGetFenceWin32HandleKHR");
-m_vk.importFenceFdKHR						= (ImportFenceFdKHRFunc)						GET_PROC_ADDR("vkImportFenceFdKHR");
-m_vk.getFenceFdKHR							= (GetFenceFdKHRFunc)							GET_PROC_ADDR("vkGetFenceFdKHR");
-m_vk.getImageMemoryRequirements2KHR			= (GetImageMemoryRequirements2KHRFunc)			GET_PROC_ADDR("vkGetImageMemoryRequirements2KHR");
-m_vk.getBufferMemoryRequirements2KHR		= (GetBufferMemoryRequirements2KHRFunc)			GET_PROC_ADDR("vkGetBufferMemoryRequirements2KHR");
-m_vk.getImageSparseMemoryRequirements2KHR	= (GetImageSparseMemoryRequirements2KHRFunc)	GET_PROC_ADDR("vkGetImageSparseMemoryRequirements2KHR");
-m_vk.createSamplerYcbcrConversionKHR		= (CreateSamplerYcbcrConversionKHRFunc)			GET_PROC_ADDR("vkCreateSamplerYcbcrConversionKHR");
-m_vk.destroySamplerYcbcrConversionKHR		= (DestroySamplerYcbcrConversionKHRFunc)		GET_PROC_ADDR("vkDestroySamplerYcbcrConversionKHR");
-m_vk.getMemoryWin32HandleKHR				= (GetMemoryWin32HandleKHRFunc)					GET_PROC_ADDR("vkGetMemoryWin32HandleKHR");
-m_vk.getMemoryWin32HandlePropertiesKHR		= (GetMemoryWin32HandlePropertiesKHRFunc)		GET_PROC_ADDR("vkGetMemoryWin32HandlePropertiesKHR");
-m_vk.getMemoryFdKHR							= (GetMemoryFdKHRFunc)							GET_PROC_ADDR("vkGetMemoryFdKHR");
-m_vk.getMemoryFdPropertiesKHR				= (GetMemoryFdPropertiesKHRFunc)				GET_PROC_ADDR("vkGetMemoryFdPropertiesKHR");
-m_vk.importSemaphoreWin32HandleKHR			= (ImportSemaphoreWin32HandleKHRFunc)			GET_PROC_ADDR("vkImportSemaphoreWin32HandleKHR");
-m_vk.getSemaphoreWin32HandleKHR				= (GetSemaphoreWin32HandleKHRFunc)				GET_PROC_ADDR("vkGetSemaphoreWin32HandleKHR");
-m_vk.importSemaphoreFdKHR					= (ImportSemaphoreFdKHRFunc)					GET_PROC_ADDR("vkImportSemaphoreFdKHR");
-m_vk.getSemaphoreFdKHR						= (GetSemaphoreFdKHRFunc)						GET_PROC_ADDR("vkGetSemaphoreFdKHR");
-m_vk.getRefreshCycleDurationGOOGLE			= (GetRefreshCycleDurationGOOGLEFunc)			GET_PROC_ADDR("vkGetRefreshCycleDurationGOOGLE");
-m_vk.getPastPresentationTimingGOOGLE		= (GetPastPresentationTimingGOOGLEFunc)			GET_PROC_ADDR("vkGetPastPresentationTimingGOOGLE");
-m_vk.bindBufferMemory2KHR					= (BindBufferMemory2KHRFunc)					GET_PROC_ADDR("vkBindBufferMemory2KHR");
-m_vk.bindImageMemory2KHR					= (BindImageMemory2KHRFunc)						GET_PROC_ADDR("vkBindImageMemory2KHR");
+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.cmdPushDescriptorSetKHR							= (CmdPushDescriptorSetKHRFunc)							GET_PROC_ADDR("vkCmdPushDescriptorSetKHR");
+m_vk.createDescriptorUpdateTemplateKHR					= (CreateDescriptorUpdateTemplateKHRFunc)				GET_PROC_ADDR("vkCreateDescriptorUpdateTemplateKHR");
+m_vk.destroyDescriptorUpdateTemplateKHR					= (DestroyDescriptorUpdateTemplateKHRFunc)				GET_PROC_ADDR("vkDestroyDescriptorUpdateTemplateKHR");
+m_vk.updateDescriptorSetWithTemplateKHR					= (UpdateDescriptorSetWithTemplateKHRFunc)				GET_PROC_ADDR("vkUpdateDescriptorSetWithTemplateKHR");
+m_vk.cmdPushDescriptorSetWithTemplateKHR				= (CmdPushDescriptorSetWithTemplateKHRFunc)				GET_PROC_ADDR("vkCmdPushDescriptorSetWithTemplateKHR");
+m_vk.getSwapchainStatusKHR								= (GetSwapchainStatusKHRFunc)							GET_PROC_ADDR("vkGetSwapchainStatusKHR");
+m_vk.importFenceWin32HandleKHR							= (ImportFenceWin32HandleKHRFunc)						GET_PROC_ADDR("vkImportFenceWin32HandleKHR");
+m_vk.getFenceWin32HandleKHR								= (GetFenceWin32HandleKHRFunc)							GET_PROC_ADDR("vkGetFenceWin32HandleKHR");
+m_vk.importFenceFdKHR									= (ImportFenceFdKHRFunc)								GET_PROC_ADDR("vkImportFenceFdKHR");
+m_vk.getFenceFdKHR										= (GetFenceFdKHRFunc)									GET_PROC_ADDR("vkGetFenceFdKHR");
+m_vk.getImageMemoryRequirements2KHR						= (GetImageMemoryRequirements2KHRFunc)					GET_PROC_ADDR("vkGetImageMemoryRequirements2KHR");
+m_vk.getBufferMemoryRequirements2KHR					= (GetBufferMemoryRequirements2KHRFunc)					GET_PROC_ADDR("vkGetBufferMemoryRequirements2KHR");
+m_vk.getImageSparseMemoryRequirements2KHR				= (GetImageSparseMemoryRequirements2KHRFunc)			GET_PROC_ADDR("vkGetImageSparseMemoryRequirements2KHR");
+m_vk.createSamplerYcbcrConversionKHR					= (CreateSamplerYcbcrConversionKHRFunc)					GET_PROC_ADDR("vkCreateSamplerYcbcrConversionKHR");
+m_vk.destroySamplerYcbcrConversionKHR					= (DestroySamplerYcbcrConversionKHRFunc)				GET_PROC_ADDR("vkDestroySamplerYcbcrConversionKHR");
+m_vk.getMemoryWin32HandleKHR							= (GetMemoryWin32HandleKHRFunc)							GET_PROC_ADDR("vkGetMemoryWin32HandleKHR");
+m_vk.getMemoryWin32HandlePropertiesKHR					= (GetMemoryWin32HandlePropertiesKHRFunc)				GET_PROC_ADDR("vkGetMemoryWin32HandlePropertiesKHR");
+m_vk.getMemoryFdKHR										= (GetMemoryFdKHRFunc)									GET_PROC_ADDR("vkGetMemoryFdKHR");
+m_vk.getMemoryFdPropertiesKHR							= (GetMemoryFdPropertiesKHRFunc)						GET_PROC_ADDR("vkGetMemoryFdPropertiesKHR");
+m_vk.importSemaphoreWin32HandleKHR						= (ImportSemaphoreWin32HandleKHRFunc)					GET_PROC_ADDR("vkImportSemaphoreWin32HandleKHR");
+m_vk.getSemaphoreWin32HandleKHR							= (GetSemaphoreWin32HandleKHRFunc)						GET_PROC_ADDR("vkGetSemaphoreWin32HandleKHR");
+m_vk.importSemaphoreFdKHR								= (ImportSemaphoreFdKHRFunc)							GET_PROC_ADDR("vkImportSemaphoreFdKHR");
+m_vk.getSemaphoreFdKHR									= (GetSemaphoreFdKHRFunc)								GET_PROC_ADDR("vkGetSemaphoreFdKHR");
+m_vk.getRefreshCycleDurationGOOGLE						= (GetRefreshCycleDurationGOOGLEFunc)					GET_PROC_ADDR("vkGetRefreshCycleDurationGOOGLE");
+m_vk.getPastPresentationTimingGOOGLE					= (GetPastPresentationTimingGOOGLEFunc)					GET_PROC_ADDR("vkGetPastPresentationTimingGOOGLE");
+m_vk.getDeviceGroupPeerMemoryFeaturesKHX				= (GetDeviceGroupPeerMemoryFeaturesKHXFunc)				GET_PROC_ADDR("vkGetDeviceGroupPeerMemoryFeaturesKHX");
+m_vk.cmdSetDeviceMaskKHX								= (CmdSetDeviceMaskKHXFunc)								GET_PROC_ADDR("vkCmdSetDeviceMaskKHX");
+m_vk.getDeviceGroupPresentCapabilitiesKHX				= (GetDeviceGroupPresentCapabilitiesKHXFunc)			GET_PROC_ADDR("vkGetDeviceGroupPresentCapabilitiesKHX");
+m_vk.getDeviceGroupSurfacePresentModesKHX				= (GetDeviceGroupSurfacePresentModesKHXFunc)			GET_PROC_ADDR("vkGetDeviceGroupSurfacePresentModesKHX");
+m_vk.acquireNextImage2KHX								= (AcquireNextImage2KHXFunc)							GET_PROC_ADDR("vkAcquireNextImage2KHX");
+m_vk.cmdDispatchBaseKHX									= (CmdDispatchBaseKHXFunc)								GET_PROC_ADDR("vkCmdDispatchBaseKHX");
+m_vk.bindBufferMemory2KHR								= (BindBufferMemory2KHRFunc)							GET_PROC_ADDR("vkBindBufferMemory2KHR");
+m_vk.bindImageMemory2KHR								= (BindImageMemory2KHRFunc)								GET_PROC_ADDR("vkBindImageMemory2KHR");
+m_vk.getMemoryAndroidHardwareBufferPropertiesANDROID	= (GetMemoryAndroidHardwareBufferPropertiesANDROIDFunc)	GET_PROC_ADDR("vkGetMemoryAndroidHardwareBufferPropertiesANDROID");
+m_vk.getMemoryAndroidHardwareBufferANDROID				= (GetMemoryAndroidHardwareBufferANDROIDFunc)			GET_PROC_ADDR("vkGetMemoryAndroidHardwareBufferANDROID");
diff --git a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
index 34ece9c..2d77eaa 100644
--- a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
@@ -52,3 +52,6 @@
 m_vk.debugReportMessageEXT								= (DebugReportMessageEXTFunc)								GET_PROC_ADDR("vkDebugReportMessageEXT");
 m_vk.getPhysicalDeviceExternalBufferPropertiesKHR		= (GetPhysicalDeviceExternalBufferPropertiesKHRFunc)		GET_PROC_ADDR("vkGetPhysicalDeviceExternalBufferPropertiesKHR");
 m_vk.getPhysicalDeviceExternalSemaphorePropertiesKHR	= (GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc)		GET_PROC_ADDR("vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
+m_vk.getPhysicalDevicePresentRectanglesKHX				= (GetPhysicalDevicePresentRectanglesKHXFunc)				GET_PROC_ADDR("vkGetPhysicalDevicePresentRectanglesKHX");
+m_vk.enumeratePhysicalDeviceGroupsKHX					= (EnumeratePhysicalDeviceGroupsKHXFunc)					GET_PROC_ADDR("vkEnumeratePhysicalDeviceGroupsKHX");
+m_vk.getPhysicalDeviceAndroidHardwareBufferUsageANDROID	= (GetPhysicalDeviceAndroidHardwareBufferUsageANDROIDFunc)	GET_PROC_ADDR("vkGetPhysicalDeviceAndroidHardwareBufferUsageANDROID");
diff --git a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
index c7e210e..bc515a0 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
@@ -256,3 +256,18 @@
 {
 	m_vk.getPhysicalDeviceExternalSemaphorePropertiesKHR(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
 }
+
+VkResult InstanceDriver::getPhysicalDevicePresentRectanglesKHX (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const
+{
+	return m_vk.getPhysicalDevicePresentRectanglesKHX(physicalDevice, surface, pRectCount, pRects);
+}
+
+VkResult InstanceDriver::enumeratePhysicalDeviceGroupsKHX (VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const
+{
+	return m_vk.enumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+}
+
+void InstanceDriver::getPhysicalDeviceAndroidHardwareBufferUsageANDROID (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage) const
+{
+	m_vk.getPhysicalDeviceAndroidHardwareBufferUsageANDROID(physicalDevice, pInfo, pUsage);
+}
diff --git a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
index e0c5ef0..36285db 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
@@ -52,3 +52,6 @@
 DebugReportMessageEXTFunc								debugReportMessageEXT;
 GetPhysicalDeviceExternalBufferPropertiesKHRFunc		getPhysicalDeviceExternalBufferPropertiesKHR;
 GetPhysicalDeviceExternalSemaphorePropertiesKHRFunc		getPhysicalDeviceExternalSemaphorePropertiesKHR;
+GetPhysicalDevicePresentRectanglesKHXFunc				getPhysicalDevicePresentRectanglesKHX;
+EnumeratePhysicalDeviceGroupsKHXFunc					enumeratePhysicalDeviceGroupsKHX;
+GetPhysicalDeviceAndroidHardwareBufferUsageANDROIDFunc	getPhysicalDeviceAndroidHardwareBufferUsageANDROID;
diff --git a/external/vulkancts/framework/vulkan/vkMemUtil.hpp b/external/vulkancts/framework/vulkan/vkMemUtil.hpp
index 3222b50..91b1b83 100644
--- a/external/vulkancts/framework/vulkan/vkMemUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkMemUtil.hpp
@@ -139,6 +139,7 @@
 void*					mapMemory					(const DeviceInterface& vkd, VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags);
 void					flushMappedMemoryRange		(const DeviceInterface& vkd, VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size);
 void					invalidateMappedMemoryRange	(const DeviceInterface& vkd, VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size);
+
 deUint32				getCompatibleMemoryTypes	(const VkPhysicalDeviceMemoryProperties& deviceMemProps, MemoryRequirement requirement);
 void					bindImagePlaneMemory		(const DeviceInterface&	vkd, VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset, VkImageAspectFlagBits planeAspect);
 
diff --git a/external/vulkancts/framework/vulkan/vkNullDriver.cpp b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
index ccffd8e..aec50e3 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriver.cpp
+++ b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
@@ -28,6 +28,13 @@
 #include "tcuFunctionLibrary.hpp"
 #include "deMemory.h"
 
+#if (DE_OS == DE_OS_ANDROID) && defined(__ANDROID_API_O__) && (__ANDROID_API__ >= __ANDROID_API_O__)
+#	define USE_ANDROID_O_HARDWARE_BUFFER
+#endif
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+#	include <android/hardware_buffer.h>
+#endif
+
 #include <stdexcept>
 #include <algorithm>
 
@@ -119,11 +126,17 @@
 		delete obj;
 }
 
-template<typename Object, typename Handle, typename Parent, typename CreateInfo>
+template<typename Object, typename BaseObject, typename Handle, typename Parent, typename CreateInfo>
 Handle allocateNonDispHandle (Parent parent, const CreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
 {
 	Object* const	obj		= allocateHandle<Object, Object*>(parent, pCreateInfo, pAllocator);
-	return Handle((deUint64)(deUintptr)obj);
+	return Handle((deUint64)(deUintptr)static_cast<BaseObject*>(obj));
+}
+
+template<typename Object, typename Handle, typename Parent, typename CreateInfo>
+Handle allocateNonDispHandle (Parent parent, const CreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
+{
+	return allocateNonDispHandle<Object, Object, Handle, Parent, CreateInfo>(parent, pCreateInfo, pAllocator);
 }
 
 template<typename Object, typename Handle>
@@ -240,6 +253,62 @@
 	SamplerYcbcrConversionKHR (VkDevice, const VkSamplerYcbcrConversionCreateInfoKHR*) {}
 };
 
+class Buffer
+{
+public:
+						Buffer		(VkDevice, const VkBufferCreateInfo* pCreateInfo)
+		: m_size (pCreateInfo->size)
+	{
+	}
+
+	VkDeviceSize		getSize		(void) const { return m_size;	}
+
+private:
+	const VkDeviceSize	m_size;
+};
+
+VkExternalMemoryHandleTypeFlagsKHR getExternalTypesHandle (const VkImageCreateInfo* pCreateInfo)
+{
+	const VkExternalMemoryImageCreateInfoKHR* const	externalInfo	= findStructure<VkExternalMemoryImageCreateInfoKHR>	(pCreateInfo->pNext);
+
+	return externalInfo ? externalInfo->handleTypes : 0u;
+}
+
+class Image
+{
+public:
+												Image					(VkDevice, const VkImageCreateInfo* pCreateInfo)
+		: m_imageType			(pCreateInfo->imageType)
+		, m_format				(pCreateInfo->format)
+		, m_extent				(pCreateInfo->extent)
+		, m_arrayLayers			(pCreateInfo->arrayLayers)
+		, m_samples				(pCreateInfo->samples)
+		, m_usage				(pCreateInfo->usage)
+		, m_flags				(pCreateInfo->flags)
+		, m_externalHandleTypes	(getExternalTypesHandle(pCreateInfo))
+	{
+	}
+
+	VkImageType									getImageType			(void) const { return m_imageType;				}
+	VkFormat									getFormat				(void) const { return m_format;					}
+	VkExtent3D									getExtent				(void) const { return m_extent;					}
+	deUint32									getArrayLayers			(void) const { return m_arrayLayers;			}
+	VkSampleCountFlagBits						getSamples				(void) const { return m_samples;				}
+	VkImageUsageFlags							getUsage				(void) const { return m_usage;					}
+	VkImageCreateFlags							getFlags				(void) const { return m_flags;					}
+	VkExternalMemoryHandleTypeFlagsKHR			getExternalHandleTypes	(void) const { return m_externalHandleTypes;	}
+
+private:
+	const VkImageType							m_imageType;
+	const VkFormat								m_format;
+	const VkExtent3D							m_extent;
+	const deUint32								m_arrayLayers;
+	const VkSampleCountFlagBits					m_samples;
+	const VkImageUsageFlags						m_usage;
+	const VkImageCreateFlags					m_flags;
+	const VkExternalMemoryHandleTypeFlagsKHR	m_externalHandleTypes;
+};
+
 void* allocateHeap (const VkMemoryAllocateInfo* pAllocInfo)
 {
 	// \todo [2015-12-03 pyry] Alignment requirements?
@@ -263,59 +332,137 @@
 class DeviceMemory
 {
 public:
-						DeviceMemory	(VkDevice, const VkMemoryAllocateInfo* pAllocInfo)
-							: m_memory(allocateHeap(pAllocInfo))
-						{
-							// \todo [2016-08-03 pyry] In some cases leaving data unintialized would help valgrind analysis,
-							//						   but currently it mostly hinders it.
-							if (m_memory)
-								deMemset(m_memory, 0xcd, (size_t)pAllocInfo->allocationSize);
-						}
-						~DeviceMemory	(void)
-						{
-							freeHeap(m_memory);
-						}
+	virtual			~DeviceMemory	(void) {}
+	virtual void*	map				(void) = 0;
+	virtual void	unmap			(void) = 0;
+};
 
-	void*				getPtr			(void) const { return m_memory; }
+class PrivateDeviceMemory : public DeviceMemory
+{
+public:
+						PrivateDeviceMemory		(VkDevice, const VkMemoryAllocateInfo* pAllocInfo)
+		: m_memory(allocateHeap(pAllocInfo))
+	{
+		// \todo [2016-08-03 pyry] In some cases leaving data unintialized would help valgrind analysis,
+		//						   but currently it mostly hinders it.
+		if (m_memory)
+			deMemset(m_memory, 0xcd, (size_t)pAllocInfo->allocationSize);
+	}
+	virtual				~PrivateDeviceMemory	(void)
+	{
+		freeHeap(m_memory);
+	}
+
+	virtual void*		map						(void) /*override*/ { return m_memory; }
+	virtual void		unmap					(void) /*override*/ {}
 
 private:
 	void* const			m_memory;
 };
 
-class Buffer
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+AHardwareBuffer* findOrCreateHwBuffer (const VkMemoryAllocateInfo* pAllocInfo)
+{
+	const VkExportMemoryAllocateInfoKHR* const				exportInfo		= findStructure<VkExportMemoryAllocateInfoKHR>(pAllocInfo->pNext);
+	const VkImportAndroidHardwareBufferInfoANDROID* const	importInfo		= findStructure<VkImportAndroidHardwareBufferInfoANDROID>(pAllocInfo->pNext);
+	const VkMemoryDedicatedAllocateInfoKHR* const			dedicatedInfo	= findStructure<VkMemoryDedicatedAllocateInfoKHR>(pAllocInfo->pNext);
+	const Image* const										image			= dedicatedInfo && !!dedicatedInfo->image ? reinterpret_cast<const Image*>(dedicatedInfo->image.getInternal()) : DE_NULL;
+	AHardwareBuffer*										hwbuffer		= DE_NULL;
+
+	// Import and export aren't mutually exclusive; we can have both simultaneously.
+	DE_ASSERT((importInfo && importInfo->buffer.internal) ||
+		(exportInfo && (exportInfo->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) != 0));
+
+	if (importInfo && importInfo->buffer.internal)
+	{
+		hwbuffer = (AHardwareBuffer*)importInfo->buffer.internal;
+		AHardwareBuffer_acquire(hwbuffer);
+	}
+	else if (exportInfo && (exportInfo->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) != 0)
+	{
+		AHardwareBuffer_Desc hwbufferDesc;
+		deMemset(&hwbufferDesc, 0, sizeof(hwbufferDesc));
+
+		if (image)
+		{
+			hwbufferDesc.width	= image->getExtent().width;
+			hwbufferDesc.height	= image->getExtent().height;
+			hwbufferDesc.layers = image->getArrayLayers();
+			switch (image->getFormat())
+			{
+				case VK_FORMAT_R8G8B8A8_UNORM:
+					hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
+					break;
+				case VK_FORMAT_R8G8B8_UNORM:
+					hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
+					break;
+				case VK_FORMAT_R5G6B5_UNORM_PACK16:
+					hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
+					break;
+				case VK_FORMAT_R16G16B16A16_SFLOAT:
+					hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
+					break;
+				case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+					hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
+					break;
+				default:
+					DE_FATAL("Unsupported image format for Android hardware buffer export");
+					break;
+			}
+			if ((image->getUsage() & VK_IMAGE_USAGE_SAMPLED_BIT) != 0)
+				hwbufferDesc.usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
+			if ((image->getUsage() & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0)
+				hwbufferDesc.usage |= AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
+			// if ((image->getFlags() & VK_IMAGE_CREATE_PROTECTED_BIT_KHR) != 0)
+			//	hwbufferDesc.usage |= AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
+
+			// Make sure we have at least one AHB GPU usage, even if the image doesn't have any
+			// Vulkan usages with corresponding to AHB GPU usages.
+			if ((image->getUsage() & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) == 0)
+				hwbufferDesc.usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
+		}
+		else
+		{
+			hwbufferDesc.width = static_cast<deUint32>(pAllocInfo->allocationSize);
+			hwbufferDesc.height = 1,
+			hwbufferDesc.layers = 1,
+			hwbufferDesc.format = AHARDWAREBUFFER_FORMAT_BLOB,
+			hwbufferDesc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
+		}
+
+		AHardwareBuffer_allocate(&hwbufferDesc, &hwbuffer);
+	}
+
+	return hwbuffer;
+}
+
+class ExternalDeviceMemoryAndroid : public DeviceMemory
 {
 public:
-						Buffer		(VkDevice, const VkBufferCreateInfo* pCreateInfo)
-							: m_size(pCreateInfo->size)
-						{}
+						ExternalDeviceMemoryAndroid		(VkDevice, const VkMemoryAllocateInfo* pAllocInfo)
+		: m_hwbuffer(findOrCreateHwBuffer(pAllocInfo))
+	{}
+	virtual				~ExternalDeviceMemoryAndroid	(void)
+	{
+		if (m_hwbuffer)
+			AHardwareBuffer_release(m_hwbuffer);
+	}
 
-	VkDeviceSize		getSize		(void) const { return m_size;	}
+	virtual void*		map								(void) /*override*/
+	{
+		void* p;
+		AHardwareBuffer_lock(m_hwbuffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, NULL, &p);
+		return p;
+	}
+
+	virtual void		unmap							(void) /*override*/ { AHardwareBuffer_unlock(m_hwbuffer, NULL); }
+
+	AHardwareBuffer*	getHwBuffer						(void)				{ return m_hwbuffer;						}
 
 private:
-	const VkDeviceSize	m_size;
+	AHardwareBuffer* const	m_hwbuffer;
 };
-
-class Image
-{
-public:
-								Image			(VkDevice, const VkImageCreateInfo* pCreateInfo)
-									: m_imageType	(pCreateInfo->imageType)
-									, m_format		(pCreateInfo->format)
-									, m_extent		(pCreateInfo->extent)
-									, m_samples		(pCreateInfo->samples)
-								{}
-
-	VkImageType					getImageType	(void) const { return m_imageType;	}
-	VkFormat					getFormat		(void) const { return m_format;		}
-	VkExtent3D					getExtent		(void) const { return m_extent;		}
-	VkSampleCountFlagBits		getSamples		(void) const { return m_samples;	}
-
-private:
-	const VkImageType			m_imageType;
-	const VkFormat				m_format;
-	const VkExtent3D			m_extent;
-	const VkSampleCountFlagBits	m_samples;
-};
+#endif // defined(USE_ANDROID_O_HARDWARE_BUFFER)
 
 class CommandBuffer
 {
@@ -559,7 +706,8 @@
 {
 	static const VkExtensionProperties	s_extensions[]	=
 	{
-		{ "VK_KHR_get_physical_device_properties2", 1u }
+		{ "VK_KHR_get_physical_device_properties2", 1u },
+		{ "VK_KHR_external_memory_capabilities",	1u },
 	};
 
 	if (!pLayerName)
@@ -574,9 +722,14 @@
 
 	static const VkExtensionProperties	s_extensions[]	=
 	{
-		{ "VK_KHR_get_memory_requirements2",	1u },
-		{ "VK_KHR_bind_memory2",				1u },
-		{ "VK_KHR_sampler_ycbcr_conversion",	1u },
+		{ "VK_KHR_bind_memory2",								1u },
+		{ "VK_KHR_external_memory",							    1u },
+		{ "VK_KHR_get_memory_requirements2",					1u },
+		{ "VK_KHR_maintenance1",								1u },
+		{ "VK_KHR_sampler_ycbcr_conversion",					1u },
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+		{ "VK_ANDROID_external_memory_android_hardware_buffer",	1u },
+#endif
 	};
 
 	if (!pLayerName)
@@ -961,21 +1114,22 @@
 
 VKAPI_ATTR void VKAPI_CALL getImageMemoryRequirements2KHR (VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements)
 {
-	const VkImagePlaneMemoryRequirementsInfoKHR*	planeReqs	= findStructure<VkImagePlaneMemoryRequirementsInfoKHR>(pInfo->pNext);
+	const VkImagePlaneMemoryRequirementsInfoKHR* const	planeReqs		= findStructure<VkImagePlaneMemoryRequirementsInfoKHR>(pInfo->pNext);
+	VkMemoryDedicatedRequirementsKHR* const				dedicatedReqs	= findStructure<VkMemoryDedicatedRequirementsKHR>(pMemoryRequirements->pNext);
 
 	if (planeReqs)
 	{
-		const deUint32					planeNdx	= getAspectPlaneNdx(planeReqs->planeAspect);
-		const Image*					image		= reinterpret_cast<const Image*>(pInfo->image.getInternal());
-		const VkFormat					format		= image->getFormat();
-		const PlanarFormatDescription	formatDesc	= getPlanarFormatDescription(format);
+		const deUint32						planeNdx			= getAspectPlaneNdx(planeReqs->planeAspect);
+		const Image* const					image				= reinterpret_cast<const Image*>(pInfo->image.getInternal());
+		const VkFormat						format				= image->getFormat();
+		const PlanarFormatDescription		formatDesc			= getPlanarFormatDescription(format);
 
 		DE_ASSERT(de::inBounds<deUint32>(planeNdx, 0u, formatDesc.numPlanes));
 
-		const VkExtent3D				extent		= image->getExtent();
-		const deUint32					planeW		= extent.width / formatDesc.planes[planeNdx].widthDivisor;
-		const deUint32					planeH		= extent.height / formatDesc.planes[planeNdx].heightDivisor;
-		const deUint32					elementSize	= formatDesc.planes[planeNdx].elementSizeBytes;
+		const VkExtent3D					extent				= image->getExtent();
+		const deUint32						planeW				= extent.width / formatDesc.planes[planeNdx].widthDivisor;
+		const deUint32						planeH				= extent.height / formatDesc.planes[planeNdx].heightDivisor;
+		const deUint32						elementSize			= formatDesc.planes[planeNdx].elementSizeBytes;
 
 		pMemoryRequirements->memoryRequirements.memoryTypeBits	= 1u;
 		pMemoryRequirements->memoryRequirements.alignment		= 16u;
@@ -983,16 +1137,77 @@
 	}
 	else
 		getImageMemoryRequirements(device, pInfo->image, &pMemoryRequirements->memoryRequirements);
+
+	if (dedicatedReqs)
+	{
+		const Image* const					image				= reinterpret_cast<const Image*>(pInfo->image.getInternal());
+		VkExternalMemoryHandleTypeFlagsKHR	externalHandleTypes	= image->getExternalHandleTypes();
+
+		dedicatedReqs->prefersDedicatedAllocation		= VK_FALSE;
+
+		if ((externalHandleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) != 0)
+			dedicatedReqs->requiresDedicatedAllocation	= VK_TRUE;
+		else
+			dedicatedReqs->requiresDedicatedAllocation	= VK_FALSE;
+	}
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL allocateMemory (VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory)
+{
+	const VkExportMemoryAllocateInfoKHR* const				exportInfo	= findStructure<VkExportMemoryAllocateInfoKHR>(pAllocateInfo->pNext);
+	const VkImportAndroidHardwareBufferInfoANDROID* const	importInfo	= findStructure<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo->pNext);
+
+	if ((exportInfo && (exportInfo->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) != 0)
+		|| (importInfo && importInfo->buffer.internal))
+	{
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+		VK_NULL_RETURN((*pMemory = allocateNonDispHandle<ExternalDeviceMemoryAndroid, DeviceMemory, VkDeviceMemory>(device, pAllocateInfo, pAllocator)));
+#else
+		return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR;
+#endif
+	}
+	else
+	{
+		VK_NULL_RETURN((*pMemory = allocateNonDispHandle<PrivateDeviceMemory, DeviceMemory, VkDeviceMemory>(device, pAllocateInfo, pAllocator)));
+	}
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL mapMemory (VkDevice, VkDeviceMemory memHandle, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData)
 {
-	const DeviceMemory*	memory	= reinterpret_cast<DeviceMemory*>(memHandle.getInternal());
+	DeviceMemory* const	memory	= reinterpret_cast<DeviceMemory*>(memHandle.getInternal());
 
 	DE_UNREF(size);
 	DE_UNREF(flags);
 
-	*ppData = (deUint8*)memory->getPtr() + offset;
+	*ppData = (deUint8*)memory->map() + offset;
+
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL unmapMemory (VkDevice device, VkDeviceMemory memHandle)
+{
+	DeviceMemory* const	memory	= reinterpret_cast<DeviceMemory*>(memHandle.getInternal());
+
+	DE_UNREF(device);
+
+	memory->unmap();
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getMemoryAndroidHardwareBufferANDROID (VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, pt::AndroidHardwareBufferPtr* pBuffer)
+{
+	DE_UNREF(device);
+
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+	DeviceMemory* const					memory			= reinterpret_cast<ExternalDeviceMemoryAndroid*>(pInfo->memory.getInternal());
+	ExternalDeviceMemoryAndroid* const	androidMemory	= static_cast<ExternalDeviceMemoryAndroid*>(memory);
+
+	AHardwareBuffer* hwbuffer = androidMemory->getHwBuffer();
+	AHardwareBuffer_acquire(hwbuffer);
+	pBuffer->internal = hwbuffer;
+#else
+	DE_UNREF(pInfo);
+	DE_UNREF(pBuffer);
+#endif
 
 	return VK_SUCCESS;
 }
@@ -1085,6 +1300,87 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceExternalBufferPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties)
+{
+	DE_UNREF(physicalDevice);
+	DE_UNREF(pExternalBufferInfo);
+
+	pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = 0;
+	pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes = 0;
+	pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes = 0;
+
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+	if (pExternalBufferInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+	{
+		pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
+		pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+		pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+	}
+#endif
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceImageFormatProperties2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties)
+{
+	const VkPhysicalDeviceExternalImageFormatInfoKHR* const	externalInfo		= findStructure<VkPhysicalDeviceExternalImageFormatInfoKHR>(pImageFormatInfo->pNext);
+	VkExternalImageFormatPropertiesKHR*	const				externalProperties	= findStructure<VkExternalImageFormatPropertiesKHR>(pImageFormatProperties->pNext);
+	VkResult												result;
+
+	result = getPhysicalDeviceImageFormatProperties(physicalDevice, pImageFormatInfo->format, pImageFormatInfo->type, pImageFormatInfo->tiling, pImageFormatInfo->usage, pImageFormatInfo->flags, &pImageFormatProperties->imageFormatProperties);
+	if (result != VK_SUCCESS)
+		return result;
+
+	if (externalInfo && externalInfo->handleType != 0)
+	{
+#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
+		if (externalInfo->handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+			return VK_ERROR_FORMAT_NOT_SUPPORTED;
+
+		if (!(pImageFormatInfo->format == VK_FORMAT_R8G8B8A8_UNORM
+			  || pImageFormatInfo->format == VK_FORMAT_R8G8B8_UNORM
+			  || pImageFormatInfo->format == VK_FORMAT_R5G6B5_UNORM_PACK16
+			  || pImageFormatInfo->format == VK_FORMAT_R16G16B16A16_SFLOAT
+			  || pImageFormatInfo->format == VK_FORMAT_A2R10G10B10_UNORM_PACK32))
+		{
+			return VK_ERROR_FORMAT_NOT_SUPPORTED;
+		}
+
+		if (pImageFormatInfo->type != VK_IMAGE_TYPE_2D)
+			return VK_ERROR_FORMAT_NOT_SUPPORTED;
+
+		if ((pImageFormatInfo->usage & ~(VK_IMAGE_USAGE_TRANSFER_SRC_BIT
+										| VK_IMAGE_USAGE_TRANSFER_DST_BIT
+										| VK_IMAGE_USAGE_SAMPLED_BIT
+										| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT))
+			!= 0)
+		{
+			return VK_ERROR_FORMAT_NOT_SUPPORTED;
+		}
+
+		if ((pImageFormatInfo->flags & ~(VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
+										/*| VK_IMAGE_CREATE_PROTECTED_BIT_KHR*/
+										/*| VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR*/))
+			!= 0)
+		{
+			return VK_ERROR_FORMAT_NOT_SUPPORTED;
+		}
+
+		if (externalProperties)
+		{
+			externalProperties->externalMemoryProperties.externalMemoryFeatures			= VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR
+																						| VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR
+																						| VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
+			externalProperties->externalMemoryProperties.exportFromImportedHandleTypes	= VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+			externalProperties->externalMemoryProperties.compatibleHandleTypes			= VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+		}
+#else
+		DE_UNREF(externalProperties);
+		return VK_ERROR_FORMAT_NOT_SUPPORTED;
+#endif
+	}
+
+	return VK_SUCCESS;
+}
+
 // \note getInstanceProcAddr is a little bit special:
 // vkNullDriverImpl.inl needs it to define s_platformFunctions but
 // getInstanceProcAddr() implementation needs other entry points from
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index 6f068ee..4428768 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -13,12 +13,6 @@
 	VK_NULL_RETURN((*pDevice = allocateHandle<Device, VkDevice>(physicalDevice, pCreateInfo, pAllocator)));
 }
 
-VKAPI_ATTR VkResult VKAPI_CALL allocateMemory (VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory)
-{
-	DE_UNREF(pAllocator);
-	VK_NULL_RETURN((*pMemory = allocateNonDispHandle<DeviceMemory, VkDeviceMemory>(device, pAllocateInfo, pAllocator)));
-}
-
 VKAPI_ATTR VkResult VKAPI_CALL createFence (VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence)
 {
 	DE_UNREF(pAllocator);
@@ -377,12 +371,6 @@
 	return VK_SUCCESS;
 }
 
-VKAPI_ATTR void VKAPI_CALL unmapMemory (VkDevice device, VkDeviceMemory memory)
-{
-	DE_UNREF(device);
-	DE_UNREF(memory);
-}
-
 VKAPI_ATTR VkResult VKAPI_CALL flushMappedMemoryRanges (VkDevice device, deUint32 memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges)
 {
 	DE_UNREF(device);
@@ -1118,14 +1106,6 @@
 	DE_UNREF(pFormatProperties);
 }
 
-VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceImageFormatProperties2KHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties)
-{
-	DE_UNREF(physicalDevice);
-	DE_UNREF(pImageFormatInfo);
-	DE_UNREF(pImageFormatProperties);
-	return VK_SUCCESS;
-}
-
 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceQueueFamilyProperties2KHR (VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties2KHR* pQueueFamilyProperties)
 {
 	DE_UNREF(physicalDevice);
@@ -1262,13 +1242,6 @@
 	DE_UNREF(pMessage);
 }
 
-VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceExternalBufferPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties)
-{
-	DE_UNREF(physicalDevice);
-	DE_UNREF(pExternalBufferInfo);
-	DE_UNREF(pExternalBufferProperties);
-}
-
 VKAPI_ATTR VkResult VKAPI_CALL getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle)
 {
 	DE_UNREF(device);
@@ -1357,6 +1330,72 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR void VKAPI_CALL getDeviceGroupPeerMemoryFeaturesKHX (VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures)
+{
+	DE_UNREF(device);
+	DE_UNREF(heapIndex);
+	DE_UNREF(localDeviceIndex);
+	DE_UNREF(remoteDeviceIndex);
+	DE_UNREF(pPeerMemoryFeatures);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetDeviceMaskKHX (VkCommandBuffer commandBuffer, deUint32 deviceMask)
+{
+	DE_UNREF(commandBuffer);
+	DE_UNREF(deviceMask);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getDeviceGroupPresentCapabilitiesKHX (VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities)
+{
+	DE_UNREF(device);
+	DE_UNREF(pDeviceGroupPresentCapabilities);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getDeviceGroupSurfacePresentModesKHX (VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes)
+{
+	DE_UNREF(device);
+	DE_UNREF(surface);
+	DE_UNREF(pModes);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL acquireNextImage2KHX (VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex)
+{
+	DE_UNREF(device);
+	DE_UNREF(pAcquireInfo);
+	DE_UNREF(pImageIndex);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdDispatchBaseKHX (VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ)
+{
+	DE_UNREF(commandBuffer);
+	DE_UNREF(baseGroupX);
+	DE_UNREF(baseGroupY);
+	DE_UNREF(baseGroupZ);
+	DE_UNREF(groupCountX);
+	DE_UNREF(groupCountY);
+	DE_UNREF(groupCountZ);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDevicePresentRectanglesKHX (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects)
+{
+	DE_UNREF(physicalDevice);
+	DE_UNREF(surface);
+	DE_UNREF(pRectCount);
+	DE_UNREF(pRects);
+	return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL enumeratePhysicalDeviceGroupsKHX (VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties)
+{
+	DE_UNREF(instance);
+	DE_UNREF(pPhysicalDeviceGroupCount);
+	DE_UNREF(pPhysicalDeviceGroupProperties);
+	return VK_SUCCESS;
+}
+
 VKAPI_ATTR VkResult VKAPI_CALL bindBufferMemory2KHR (VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos)
 {
 	DE_UNREF(device);
@@ -1373,6 +1412,21 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceAndroidHardwareBufferUsageANDROID (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage)
+{
+	DE_UNREF(physicalDevice);
+	DE_UNREF(pInfo);
+	DE_UNREF(pUsage);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getMemoryAndroidHardwareBufferPropertiesANDROID (VkDevice device, const pt::AndroidHardwareBufferPtr buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties)
+{
+	DE_UNREF(device);
+	DE_UNREF(buffer);
+	DE_UNREF(pProperties);
+	return VK_SUCCESS;
+}
+
 static const tcu::StaticFunctionLibrary::Entry s_platformFunctions[] =
 {
 	VK_NULL_FUNC_ENTRY(vkCreateInstance,						createInstance),
@@ -1383,214 +1437,225 @@
 
 static const tcu::StaticFunctionLibrary::Entry s_instanceFunctions[] =
 {
-	VK_NULL_FUNC_ENTRY(vkDestroyInstance,									destroyInstance),
-	VK_NULL_FUNC_ENTRY(vkEnumeratePhysicalDevices,							enumeratePhysicalDevices),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFeatures,							getPhysicalDeviceFeatures),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFormatProperties,					getPhysicalDeviceFormatProperties),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceImageFormatProperties,			getPhysicalDeviceImageFormatProperties),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceProperties,						getPhysicalDeviceProperties),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties,			getPhysicalDeviceQueueFamilyProperties),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMemoryProperties,					getPhysicalDeviceMemoryProperties),
-	VK_NULL_FUNC_ENTRY(vkGetDeviceProcAddr,									getDeviceProcAddr),
-	VK_NULL_FUNC_ENTRY(vkCreateDevice,										createDevice),
-	VK_NULL_FUNC_ENTRY(vkEnumerateDeviceExtensionProperties,				enumerateDeviceExtensionProperties),
-	VK_NULL_FUNC_ENTRY(vkEnumerateDeviceLayerProperties,					enumerateDeviceLayerProperties),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties,		getPhysicalDeviceSparseImageFormatProperties),
-	VK_NULL_FUNC_ENTRY(vkDestroySurfaceKHR,									destroySurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR,				getPhysicalDeviceSurfaceSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR,			getPhysicalDeviceSurfaceCapabilitiesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR,				getPhysicalDeviceSurfaceFormatsKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR,			getPhysicalDeviceSurfacePresentModesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR,				getPhysicalDeviceDisplayPropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR,		getPhysicalDeviceDisplayPlanePropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR,				getDisplayPlaneSupportedDisplaysKHR),
-	VK_NULL_FUNC_ENTRY(vkGetDisplayModePropertiesKHR,						getDisplayModePropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateDisplayModeKHR,								createDisplayModeKHR),
-	VK_NULL_FUNC_ENTRY(vkGetDisplayPlaneCapabilitiesKHR,					getDisplayPlaneCapabilitiesKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateDisplayPlaneSurfaceKHR,						createDisplayPlaneSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateXlibSurfaceKHR,								createXlibSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceXlibPresentationSupportKHR,		getPhysicalDeviceXlibPresentationSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateXcbSurfaceKHR,								createXcbSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR,		getPhysicalDeviceXcbPresentationSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateWaylandSurfaceKHR,							createWaylandSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR,	getPhysicalDeviceWaylandPresentationSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateMirSurfaceKHR,								createMirSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMirPresentationSupportKHR,		getPhysicalDeviceMirPresentationSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateAndroidSurfaceKHR,							createAndroidSurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateWin32SurfaceKHR,								createWin32SurfaceKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR,		getPhysicalDeviceWin32PresentationSupportKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFeatures2KHR,						getPhysicalDeviceFeatures2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceProperties2KHR,					getPhysicalDeviceProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR,				getPhysicalDeviceFormatProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR,		getPhysicalDeviceImageFormatProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR,		getPhysicalDeviceQueueFamilyProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR,				getPhysicalDeviceMemoryProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR,	getPhysicalDeviceSparseImageFormatProperties2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR,			getPhysicalDeviceSurfaceCapabilities2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR,				getPhysicalDeviceSurfaceFormats2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR,		getPhysicalDeviceExternalFencePropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateDebugReportCallbackEXT,						createDebugReportCallbackEXT),
-	VK_NULL_FUNC_ENTRY(vkDestroyDebugReportCallbackEXT,						destroyDebugReportCallbackEXT),
-	VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,								debugReportMessageEXT),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR,		getPhysicalDeviceExternalBufferPropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR,	getPhysicalDeviceExternalSemaphorePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkDestroyInstance,										destroyInstance),
+	VK_NULL_FUNC_ENTRY(vkEnumeratePhysicalDevices,								enumeratePhysicalDevices),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFeatures,								getPhysicalDeviceFeatures),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFormatProperties,						getPhysicalDeviceFormatProperties),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceImageFormatProperties,				getPhysicalDeviceImageFormatProperties),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceProperties,							getPhysicalDeviceProperties),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties,				getPhysicalDeviceQueueFamilyProperties),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMemoryProperties,						getPhysicalDeviceMemoryProperties),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceProcAddr,										getDeviceProcAddr),
+	VK_NULL_FUNC_ENTRY(vkCreateDevice,											createDevice),
+	VK_NULL_FUNC_ENTRY(vkEnumerateDeviceExtensionProperties,					enumerateDeviceExtensionProperties),
+	VK_NULL_FUNC_ENTRY(vkEnumerateDeviceLayerProperties,						enumerateDeviceLayerProperties),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties,			getPhysicalDeviceSparseImageFormatProperties),
+	VK_NULL_FUNC_ENTRY(vkDestroySurfaceKHR,										destroySurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR,					getPhysicalDeviceSurfaceSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR,				getPhysicalDeviceSurfaceCapabilitiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR,					getPhysicalDeviceSurfaceFormatsKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR,				getPhysicalDeviceSurfacePresentModesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR,					getPhysicalDeviceDisplayPropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR,			getPhysicalDeviceDisplayPlanePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR,					getDisplayPlaneSupportedDisplaysKHR),
+	VK_NULL_FUNC_ENTRY(vkGetDisplayModePropertiesKHR,							getDisplayModePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateDisplayModeKHR,									createDisplayModeKHR),
+	VK_NULL_FUNC_ENTRY(vkGetDisplayPlaneCapabilitiesKHR,						getDisplayPlaneCapabilitiesKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateDisplayPlaneSurfaceKHR,							createDisplayPlaneSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateXlibSurfaceKHR,									createXlibSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceXlibPresentationSupportKHR,			getPhysicalDeviceXlibPresentationSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateXcbSurfaceKHR,									createXcbSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR,			getPhysicalDeviceXcbPresentationSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateWaylandSurfaceKHR,								createWaylandSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR,		getPhysicalDeviceWaylandPresentationSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateMirSurfaceKHR,									createMirSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMirPresentationSupportKHR,			getPhysicalDeviceMirPresentationSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateAndroidSurfaceKHR,								createAndroidSurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateWin32SurfaceKHR,									createWin32SurfaceKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR,			getPhysicalDeviceWin32PresentationSupportKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFeatures2KHR,							getPhysicalDeviceFeatures2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceProperties2KHR,						getPhysicalDeviceProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR,					getPhysicalDeviceFormatProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR,			getPhysicalDeviceImageFormatProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR,			getPhysicalDeviceQueueFamilyProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR,					getPhysicalDeviceMemoryProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR,		getPhysicalDeviceSparseImageFormatProperties2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR,				getPhysicalDeviceSurfaceCapabilities2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR,					getPhysicalDeviceSurfaceFormats2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR,			getPhysicalDeviceExternalFencePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateDebugReportCallbackEXT,							createDebugReportCallbackEXT),
+	VK_NULL_FUNC_ENTRY(vkDestroyDebugReportCallbackEXT,							destroyDebugReportCallbackEXT),
+	VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,									debugReportMessageEXT),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR,			getPhysicalDeviceExternalBufferPropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR,		getPhysicalDeviceExternalSemaphorePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDevicePresentRectanglesKHX,					getPhysicalDevicePresentRectanglesKHX),
+	VK_NULL_FUNC_ENTRY(vkEnumeratePhysicalDeviceGroupsKHX,						enumeratePhysicalDeviceGroupsKHX),
+	VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceAndroidHardwareBufferUsageANDROID,	getPhysicalDeviceAndroidHardwareBufferUsageANDROID),
 };
 
 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(vkCmdPushDescriptorSetKHR,				cmdPushDescriptorSetKHR),
-	VK_NULL_FUNC_ENTRY(vkCreateDescriptorUpdateTemplateKHR,		createDescriptorUpdateTemplateKHR),
-	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorUpdateTemplateKHR,	destroyDescriptorUpdateTemplateKHR),
-	VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSetWithTemplateKHR,	updateDescriptorSetWithTemplateKHR),
-	VK_NULL_FUNC_ENTRY(vkCmdPushDescriptorSetWithTemplateKHR,	cmdPushDescriptorSetWithTemplateKHR),
-	VK_NULL_FUNC_ENTRY(vkGetSwapchainStatusKHR,					getSwapchainStatusKHR),
-	VK_NULL_FUNC_ENTRY(vkImportFenceWin32HandleKHR,				importFenceWin32HandleKHR),
-	VK_NULL_FUNC_ENTRY(vkGetFenceWin32HandleKHR,				getFenceWin32HandleKHR),
-	VK_NULL_FUNC_ENTRY(vkImportFenceFdKHR,						importFenceFdKHR),
-	VK_NULL_FUNC_ENTRY(vkGetFenceFdKHR,							getFenceFdKHR),
-	VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements2KHR,		getImageMemoryRequirements2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements2KHR,		getBufferMemoryRequirements2KHR),
-	VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements2KHR,	getImageSparseMemoryRequirements2KHR),
-	VK_NULL_FUNC_ENTRY(vkCreateSamplerYcbcrConversionKHR,		createSamplerYcbcrConversionKHR),
-	VK_NULL_FUNC_ENTRY(vkDestroySamplerYcbcrConversionKHR,		destroySamplerYcbcrConversionKHR),
-	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleKHR,				getMemoryWin32HandleKHR),
-	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandlePropertiesKHR,		getMemoryWin32HandlePropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkGetMemoryFdKHR,						getMemoryFdKHR),
-	VK_NULL_FUNC_ENTRY(vkGetMemoryFdPropertiesKHR,				getMemoryFdPropertiesKHR),
-	VK_NULL_FUNC_ENTRY(vkImportSemaphoreWin32HandleKHR,			importSemaphoreWin32HandleKHR),
-	VK_NULL_FUNC_ENTRY(vkGetSemaphoreWin32HandleKHR,			getSemaphoreWin32HandleKHR),
-	VK_NULL_FUNC_ENTRY(vkImportSemaphoreFdKHR,					importSemaphoreFdKHR),
-	VK_NULL_FUNC_ENTRY(vkGetSemaphoreFdKHR,						getSemaphoreFdKHR),
-	VK_NULL_FUNC_ENTRY(vkGetRefreshCycleDurationGOOGLE,			getRefreshCycleDurationGOOGLE),
-	VK_NULL_FUNC_ENTRY(vkGetPastPresentationTimingGOOGLE,		getPastPresentationTimingGOOGLE),
-	VK_NULL_FUNC_ENTRY(vkBindBufferMemory2KHR,					bindBufferMemory2KHR),
-	VK_NULL_FUNC_ENTRY(vkBindImageMemory2KHR,					bindImageMemory2KHR),
+	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(vkCmdPushDescriptorSetKHR,							cmdPushDescriptorSetKHR),
+	VK_NULL_FUNC_ENTRY(vkCreateDescriptorUpdateTemplateKHR,					createDescriptorUpdateTemplateKHR),
+	VK_NULL_FUNC_ENTRY(vkDestroyDescriptorUpdateTemplateKHR,				destroyDescriptorUpdateTemplateKHR),
+	VK_NULL_FUNC_ENTRY(vkUpdateDescriptorSetWithTemplateKHR,				updateDescriptorSetWithTemplateKHR),
+	VK_NULL_FUNC_ENTRY(vkCmdPushDescriptorSetWithTemplateKHR,				cmdPushDescriptorSetWithTemplateKHR),
+	VK_NULL_FUNC_ENTRY(vkGetSwapchainStatusKHR,								getSwapchainStatusKHR),
+	VK_NULL_FUNC_ENTRY(vkImportFenceWin32HandleKHR,							importFenceWin32HandleKHR),
+	VK_NULL_FUNC_ENTRY(vkGetFenceWin32HandleKHR,							getFenceWin32HandleKHR),
+	VK_NULL_FUNC_ENTRY(vkImportFenceFdKHR,									importFenceFdKHR),
+	VK_NULL_FUNC_ENTRY(vkGetFenceFdKHR,										getFenceFdKHR),
+	VK_NULL_FUNC_ENTRY(vkGetImageMemoryRequirements2KHR,					getImageMemoryRequirements2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetBufferMemoryRequirements2KHR,					getBufferMemoryRequirements2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetImageSparseMemoryRequirements2KHR,				getImageSparseMemoryRequirements2KHR),
+	VK_NULL_FUNC_ENTRY(vkCreateSamplerYcbcrConversionKHR,					createSamplerYcbcrConversionKHR),
+	VK_NULL_FUNC_ENTRY(vkDestroySamplerYcbcrConversionKHR,					destroySamplerYcbcrConversionKHR),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleKHR,							getMemoryWin32HandleKHR),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandlePropertiesKHR,					getMemoryWin32HandlePropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryFdKHR,									getMemoryFdKHR),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryFdPropertiesKHR,							getMemoryFdPropertiesKHR),
+	VK_NULL_FUNC_ENTRY(vkImportSemaphoreWin32HandleKHR,						importSemaphoreWin32HandleKHR),
+	VK_NULL_FUNC_ENTRY(vkGetSemaphoreWin32HandleKHR,						getSemaphoreWin32HandleKHR),
+	VK_NULL_FUNC_ENTRY(vkImportSemaphoreFdKHR,								importSemaphoreFdKHR),
+	VK_NULL_FUNC_ENTRY(vkGetSemaphoreFdKHR,									getSemaphoreFdKHR),
+	VK_NULL_FUNC_ENTRY(vkGetRefreshCycleDurationGOOGLE,						getRefreshCycleDurationGOOGLE),
+	VK_NULL_FUNC_ENTRY(vkGetPastPresentationTimingGOOGLE,					getPastPresentationTimingGOOGLE),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHX,				getDeviceGroupPeerMemoryFeaturesKHX),
+	VK_NULL_FUNC_ENTRY(vkCmdSetDeviceMaskKHX,								cmdSetDeviceMaskKHX),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHX,				getDeviceGroupPresentCapabilitiesKHX),
+	VK_NULL_FUNC_ENTRY(vkGetDeviceGroupSurfacePresentModesKHX,				getDeviceGroupSurfacePresentModesKHX),
+	VK_NULL_FUNC_ENTRY(vkAcquireNextImage2KHX,								acquireNextImage2KHX),
+	VK_NULL_FUNC_ENTRY(vkCmdDispatchBaseKHX,								cmdDispatchBaseKHX),
+	VK_NULL_FUNC_ENTRY(vkBindBufferMemory2KHR,								bindBufferMemory2KHR),
+	VK_NULL_FUNC_ENTRY(vkBindImageMemory2KHR,								bindImageMemory2KHR),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryAndroidHardwareBufferPropertiesANDROID,	getMemoryAndroidHardwareBufferPropertiesANDROID),
+	VK_NULL_FUNC_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID,				getMemoryAndroidHardwareBufferANDROID),
 };
 
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
index 15e838d..75313a6 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
@@ -48,6 +48,29 @@
 	return devices;
 }
 
+vector<VkPhysicalDeviceGroupPropertiesKHX> enumeratePhysicalDeviceGroupsKHX(const InstanceInterface& vk, VkInstance instance)
+{
+	deUint32									numDeviceGroups = 0;
+	vector<VkPhysicalDeviceGroupPropertiesKHX>	properties;
+
+	VK_CHECK(vk.enumeratePhysicalDeviceGroupsKHX(instance, &numDeviceGroups, DE_NULL));
+
+	if (numDeviceGroups > 0)
+	{
+		properties.resize(numDeviceGroups);
+		for (deUint32 i = 0; i < numDeviceGroups; i++)
+		{
+			properties[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX;
+			properties[i].pNext = DE_NULL;
+		}
+		VK_CHECK(vk.enumeratePhysicalDeviceGroupsKHX(instance, &numDeviceGroups, &properties[0]));
+
+		if ((size_t)numDeviceGroups != properties.size())
+			TCU_FAIL("Returned device group count changed between queries");
+	}
+	return properties;
+}
+
 vector<VkQueueFamilyProperties> getPhysicalDeviceQueueFamilyProperties (const InstanceInterface& vk, VkPhysicalDevice physicalDevice)
 {
 	deUint32						numQueues	= 0;
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
index b10bf91..0aa0ecd 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
@@ -35,6 +35,7 @@
 // API queries
 
 std::vector<VkPhysicalDevice>					enumeratePhysicalDevices						(const InstanceInterface& vk, VkInstance instance);
+std::vector<VkPhysicalDeviceGroupPropertiesKHX>	enumeratePhysicalDeviceGroupsKHX				(const InstanceInterface& vk, VkInstance instance);
 std::vector<VkQueueFamilyProperties>			getPhysicalDeviceQueueFamilyProperties			(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
 VkPhysicalDeviceFeatures						getPhysicalDeviceFeatures						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
 VkPhysicalDeviceProperties						getPhysicalDeviceProperties						(const InstanceInterface& vk, VkPhysicalDevice physicalDevice);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtil.inl b/external/vulkancts/framework/vulkan/vkStrUtil.inl
index 43180be..29f8044 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtil.inl
@@ -187,6 +187,9 @@
 tcu::Format::Bitfield<32>	getExternalSemaphoreHandleTypeFlagsKHRStr		(VkExternalSemaphoreHandleTypeFlagsKHR value);
 tcu::Format::Bitfield<32>	getExternalSemaphoreFeatureFlagsKHRStr			(VkExternalSemaphoreFeatureFlagsKHR value);
 tcu::Format::Bitfield<32>	getSemaphoreImportFlagsKHRStr					(VkSemaphoreImportFlagsKHR value);
+tcu::Format::Bitfield<32>	getPeerMemoryFeatureFlagsKHXStr					(VkPeerMemoryFeatureFlagsKHX value);
+tcu::Format::Bitfield<32>	getMemoryAllocateFlagsKHXStr					(VkMemoryAllocateFlagsKHX value);
+tcu::Format::Bitfield<32>	getDeviceGroupPresentModeFlagsKHXStr			(VkDeviceGroupPresentModeFlagsKHX value);
 tcu::Format::Bitfield<32>	getInstanceCreateFlagsStr						(VkInstanceCreateFlags value);
 tcu::Format::Bitfield<32>	getDeviceCreateFlagsStr							(VkDeviceCreateFlags value);
 tcu::Format::Bitfield<32>	getDeviceQueueCreateFlagsStr					(VkDeviceQueueCreateFlags value);
@@ -431,5 +434,27 @@
 std::ostream&	operator<<	(std::ostream& s, const VkPresentTimeGOOGLE& value);
 std::ostream&	operator<<	(std::ostream& s, const VkPresentTimesInfoGOOGLE& value);
 std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceVariablePointerFeaturesKHR& value);
+std::ostream&	operator<<	(std::ostream& s, const VkMemoryAllocateFlagsInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupRenderPassBeginInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupCommandBufferBeginInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupSubmitInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupBindSparseInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupPresentCapabilitiesKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkImageSwapchainCreateInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindBufferMemoryDeviceGroupInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemoryDeviceGroupInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemorySwapchainInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkAcquireNextImageInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupPresentInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupSwapchainCreateInfoKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceGroupPropertiesKHX& value);
+std::ostream&	operator<<	(std::ostream& s, const VkDeviceGroupDeviceCreateInfoKHX& value);
 std::ostream&	operator<<	(std::ostream& s, const VkBindBufferMemoryInfoKHR& value);
 std::ostream&	operator<<	(std::ostream& s, const VkBindImageMemoryInfoKHR& value);
+std::ostream&	operator<<	(std::ostream& s, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkAndroidHardwareBufferUsageANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkMemoryAndroidHardwareBufferPropertiesANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkImportAndroidHardwareBufferInfoANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkMemoryGetAndroidHardwareBufferInfoANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkAndroidHardwareBufferExternalFormatPropertiesANDROID& value);
+std::ostream&	operator<<	(std::ostream& s, const VkExternalFormatANDROID& value);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
index afb00e5..41e52fa 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
@@ -51,6 +51,7 @@
 std::ostream& operator<< (std::ostream& s, Win32WindowHandle			v) { return s << tcu::toHex(v.internal); }
 std::ostream& operator<< (std::ostream& s, Win32Handle					v) { return s << tcu::toHex(v.internal); }
 std::ostream& operator<< (std::ostream& s, Win32SecurityAttributesPtr	v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, AndroidHardwareBufferPtr		v) { return s << tcu::toHex(v.internal); }
 }
 
 const char* getPipelineCacheHeaderVersionName (VkPipelineCacheHeaderVersion value)
@@ -174,6 +175,23 @@
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR:						return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR";
 		case VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR:						return "VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR:				return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR";
+		case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX:								return "VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX:									return "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX:									return "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX:					return "VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX:								return "VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX:							return "VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX";
+		case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX:								return "VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX:						return "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX";
+		case VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX:									return "VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX:								return "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX:						return "VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX:					return "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX";
+		case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX:						return "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX";
+		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX:						return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX";
+		case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX:							return "VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR:				return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR";
 		case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR:						return "VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR";
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR:					return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR";
@@ -223,6 +241,13 @@
 		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR:				return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR";
 		case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR:							return "VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR";
 		case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR:							return "VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR";
+		case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:		return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANDROID_HARDWARE_BUFFER_INFO_ANDROID";
+		case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:						return "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID";
+		case VK_STRUCTURE_TYPE_MEMORY_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID:			return "VK_STRUCTURE_TYPE_MEMORY_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID";
+		case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:					return "VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID";
+		case VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:				return "VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID";
+		case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_EXTERNAL_FORMAT_PROPERTIES_ANDROID:	return "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_EXTERNAL_FORMAT_PROPERTIES_ANDROID";
+		case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:										return "VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID";
 		case VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR:						return "VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR";
 		case VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR:						return "VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR";
 		case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR:							return "VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR";
@@ -1600,13 +1625,14 @@
 {
 	static const tcu::Format::BitDesc s_desc[] =
 	{
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,			"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR,		"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR,	"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR,		"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR,	"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR,			"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR"),
-		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR,		"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,						"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR,					"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR,				"VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR,					"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR,				"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR,						"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR,					"VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR"),
+		tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,	"VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID"),
 	};
 	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
@@ -1654,6 +1680,39 @@
 	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
 
+tcu::Format::Bitfield<32> getPeerMemoryFeatureFlagsKHXStr (VkPeerMemoryFeatureFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX,		"VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX,		"VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX,	"VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX"),
+		tcu::Format::BitDesc(VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX,	"VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getMemoryAllocateFlagsKHXStr (VkMemoryAllocateFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX,	"VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getDeviceGroupPresentModeFlagsKHXStr (VkDeviceGroupPresentModeFlagsKHX value)
+{
+	static const tcu::Format::BitDesc s_desc[] =
+	{
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX,				"VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX,				"VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX,					"VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX"),
+		tcu::Format::BitDesc(VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX,	"VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX"),
+	};
+	return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
 tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value)
 {
 	return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -4482,6 +4541,180 @@
 	return s;
 }
 
+std::ostream& operator<< (std::ostream& s, const VkMemoryAllocateFlagsInfoKHX& value)
+{
+	s << "VkMemoryAllocateFlagsInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tflags = " << getMemoryAllocateFlagsKHXStr(value.flags) << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupRenderPassBeginInfoKHX& value)
+{
+	s << "VkDeviceGroupRenderPassBeginInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << "\tdeviceRenderAreaCount = " << value.deviceRenderAreaCount << '\n';
+	s << "\tpDeviceRenderAreas = " << value.pDeviceRenderAreas << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupCommandBufferBeginInfoKHX& value)
+{
+	s << "VkDeviceGroupCommandBufferBeginInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupSubmitInfoKHX& value)
+{
+	s << "VkDeviceGroupSubmitInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\twaitSemaphoreCount = " << value.waitSemaphoreCount << '\n';
+	s << "\tpWaitSemaphoreDeviceIndices = " << value.pWaitSemaphoreDeviceIndices << '\n';
+	s << "\tcommandBufferCount = " << value.commandBufferCount << '\n';
+	s << "\tpCommandBufferDeviceMasks = " << value.pCommandBufferDeviceMasks << '\n';
+	s << "\tsignalSemaphoreCount = " << value.signalSemaphoreCount << '\n';
+	s << "\tpSignalSemaphoreDeviceIndices = " << value.pSignalSemaphoreDeviceIndices << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupBindSparseInfoKHX& value)
+{
+	s << "VkDeviceGroupBindSparseInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tresourceDeviceIndex = " << value.resourceDeviceIndex << '\n';
+	s << "\tmemoryDeviceIndex = " << value.memoryDeviceIndex << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupPresentCapabilitiesKHX& value)
+{
+	s << "VkDeviceGroupPresentCapabilitiesKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tpresentMask = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.presentMask), DE_ARRAY_END(value.presentMask)) << '\n';
+	s << "\tmodes = " << getDeviceGroupPresentModeFlagsKHXStr(value.modes) << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImageSwapchainCreateInfoKHX& value)
+{
+	s << "VkImageSwapchainCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindBufferMemoryDeviceGroupInfoKHX& value)
+{
+	s << "VkBindBufferMemoryDeviceGroupInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceIndexCount = " << value.deviceIndexCount << '\n';
+	s << "\tpDeviceIndices = " << value.pDeviceIndices << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindImageMemoryDeviceGroupInfoKHX& value)
+{
+	s << "VkBindImageMemoryDeviceGroupInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tdeviceIndexCount = " << value.deviceIndexCount << '\n';
+	s << "\tpDeviceIndices = " << value.pDeviceIndices << '\n';
+	s << "\tSFRRectCount = " << value.SFRRectCount << '\n';
+	s << "\tpSFRRects = " << value.pSFRRects << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkBindImageMemorySwapchainInfoKHX& value)
+{
+	s << "VkBindImageMemorySwapchainInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << "\timageIndex = " << value.imageIndex << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAcquireNextImageInfoKHX& value)
+{
+	s << "VkAcquireNextImageInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchain = " << value.swapchain << '\n';
+	s << "\ttimeout = " << value.timeout << '\n';
+	s << "\tsemaphore = " << value.semaphore << '\n';
+	s << "\tfence = " << value.fence << '\n';
+	s << "\tdeviceMask = " << value.deviceMask << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupPresentInfoKHX& value)
+{
+	s << "VkDeviceGroupPresentInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tswapchainCount = " << value.swapchainCount << '\n';
+	s << "\tpDeviceMasks = " << value.pDeviceMasks << '\n';
+	s << "\tmode = " << value.mode << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupSwapchainCreateInfoKHX& value)
+{
+	s << "VkDeviceGroupSwapchainCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tmodes = " << getDeviceGroupPresentModeFlagsKHXStr(value.modes) << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceGroupPropertiesKHX& value)
+{
+	s << "VkPhysicalDeviceGroupPropertiesKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tphysicalDeviceCount = " << value.physicalDeviceCount << '\n';
+	s << "\tphysicalDevices = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.physicalDevices), DE_ARRAY_END(value.physicalDevices)) << '\n';
+	s << "\tsubsetAllocation = " << value.subsetAllocation << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkDeviceGroupDeviceCreateInfoKHX& value)
+{
+	s << "VkDeviceGroupDeviceCreateInfoKHX = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tphysicalDeviceCount = " << value.physicalDeviceCount << '\n';
+	s << "\tpPhysicalDevices = " << value.pPhysicalDevices << '\n';
+	s << '}';
+	return s;
+}
+
 std::ostream& operator<< (std::ostream& s, const VkBindBufferMemoryInfoKHR& value)
 {
 	s << "VkBindBufferMemoryInfoKHR = {\n";
@@ -4505,3 +4738,82 @@
 	s << '}';
 	return s;
 }
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID& value)
+{
+	s << "VkPhysicalDeviceAndroidHardwareBufferInfoANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tformat = " << value.format << '\n';
+	s << "\ttiling = " << value.tiling << '\n';
+	s << "\timageUsage = " << getImageUsageFlagsStr(value.imageUsage) << '\n';
+	s << "\timageFlags = " << getImageCreateFlagsStr(value.imageFlags) << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAndroidHardwareBufferUsageANDROID& value)
+{
+	s << "VkAndroidHardwareBufferUsageANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tandroidHardwareBufferUsage = " << value.androidHardwareBufferUsage << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkMemoryAndroidHardwareBufferPropertiesANDROID& value)
+{
+	s << "VkMemoryAndroidHardwareBufferPropertiesANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tallocationSize = " << value.allocationSize << '\n';
+	s << "\tmemoryTypeBits = " << value.memoryTypeBits << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImportAndroidHardwareBufferInfoANDROID& value)
+{
+	s << "VkImportAndroidHardwareBufferInfoANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tbuffer = " << value.buffer << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkMemoryGetAndroidHardwareBufferInfoANDROID& value)
+{
+	s << "VkMemoryGetAndroidHardwareBufferInfoANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\tmemory = " << value.memory << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkAndroidHardwareBufferExternalFormatPropertiesANDROID& value)
+{
+	s << "VkAndroidHardwareBufferExternalFormatPropertiesANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\texternalFormat = " << value.externalFormat << '\n';
+	s << "\tformatFeatures = " << getFormatFeatureFlagsStr(value.formatFeatures) << '\n';
+	s << "\tsuggestedYcbcrModel = " << value.suggestedYcbcrModel << '\n';
+	s << "\tsuggestedYcbcrRange = " << value.suggestedYcbcrRange << '\n';
+	s << "\tsuggestedXChromaOffset = " << value.suggestedXChromaOffset << '\n';
+	s << "\tsuggestedYChromaOffset = " << value.suggestedYChromaOffset << '\n';
+	s << '}';
+	return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExternalFormatANDROID& value)
+{
+	s << "VkExternalFormatANDROID = {\n";
+	s << "\tsType = " << value.sType << '\n';
+	s << "\tpNext = " << value.pNext << '\n';
+	s << "\texternalFormat = " << value.externalFormat << '\n';
+	s << '}';
+	return s;
+}
diff --git a/external/vulkancts/framework/vulkan/vkStructTypes.inl b/external/vulkancts/framework/vulkan/vkStructTypes.inl
index d51a304..8f8278a 100644
--- a/external/vulkancts/framework/vulkan/vkStructTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkStructTypes.inl
@@ -2028,6 +2028,135 @@
 	VkBool32		variablePointers;
 };
 
+struct VkMemoryAllocateFlagsInfoKHX
+{
+	VkStructureType				sType;
+	const void*					pNext;
+	VkMemoryAllocateFlagsKHX	flags;
+	deUint32					deviceMask;
+};
+
+struct VkDeviceGroupRenderPassBeginInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceMask;
+	deUint32		deviceRenderAreaCount;
+	const VkRect2D*	pDeviceRenderAreas;
+};
+
+struct VkDeviceGroupCommandBufferBeginInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceMask;
+};
+
+struct VkDeviceGroupSubmitInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		waitSemaphoreCount;
+	const deUint32*	pWaitSemaphoreDeviceIndices;
+	deUint32		commandBufferCount;
+	const deUint32*	pCommandBufferDeviceMasks;
+	deUint32		signalSemaphoreCount;
+	const deUint32*	pSignalSemaphoreDeviceIndices;
+};
+
+struct VkDeviceGroupBindSparseInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		resourceDeviceIndex;
+	deUint32		memoryDeviceIndex;
+};
+
+struct VkDeviceGroupPresentCapabilitiesKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	deUint32							presentMask[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+	VkDeviceGroupPresentModeFlagsKHX	modes;
+};
+
+struct VkImageSwapchainCreateInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+};
+
+struct VkBindBufferMemoryDeviceGroupInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceIndexCount;
+	const deUint32*	pDeviceIndices;
+};
+
+struct VkBindImageMemoryDeviceGroupInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	deUint32		deviceIndexCount;
+	const deUint32*	pDeviceIndices;
+	deUint32		SFRRectCount;
+	const VkRect2D*	pSFRRects;
+};
+
+struct VkBindImageMemorySwapchainInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+	deUint32		imageIndex;
+};
+
+struct VkAcquireNextImageInfoKHX
+{
+	VkStructureType	sType;
+	const void*		pNext;
+	VkSwapchainKHR	swapchain;
+	deUint64		timeout;
+	VkSemaphore		semaphore;
+	VkFence			fence;
+	deUint32		deviceMask;
+};
+
+struct VkDeviceGroupPresentInfoKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	deUint32							swapchainCount;
+	const deUint32*						pDeviceMasks;
+	VkDeviceGroupPresentModeFlagBitsKHX	mode;
+};
+
+struct VkDeviceGroupSwapchainCreateInfoKHX
+{
+	VkStructureType						sType;
+	const void*							pNext;
+	VkDeviceGroupPresentModeFlagsKHX	modes;
+};
+
+struct VkPhysicalDeviceGroupPropertiesKHX
+{
+	VkStructureType		sType;
+	void*				pNext;
+	deUint32			physicalDeviceCount;
+	VkPhysicalDevice	physicalDevices[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+	VkBool32			subsetAllocation;
+};
+
+struct VkDeviceGroupDeviceCreateInfoKHX
+{
+	VkStructureType			sType;
+	const void*				pNext;
+	deUint32				physicalDeviceCount;
+	const VkPhysicalDevice*	pPhysicalDevices;
+};
+
 struct VkBindBufferMemoryInfoKHR
 {
 	VkStructureType	sType;
@@ -2046,3 +2175,61 @@
 	VkDeviceSize	memoryOffset;
 };
 
+struct VkPhysicalDeviceAndroidHardwareBufferInfoANDROID
+{
+	VkStructureType		sType;
+	void*				pNext;
+	VkFormat			format;
+	VkImageTiling		tiling;
+	VkImageUsageFlags	imageUsage;
+	VkImageCreateFlags	imageFlags;
+};
+
+struct VkAndroidHardwareBufferUsageANDROID
+{
+	VkStructureType	sType;
+	void*			pNext;
+	deUint64		androidHardwareBufferUsage;
+};
+
+struct VkMemoryAndroidHardwareBufferPropertiesANDROID
+{
+	VkStructureType	sType;
+	void*			pNext;
+	VkDeviceSize	allocationSize;
+	deUint32		memoryTypeBits;
+};
+
+struct VkImportAndroidHardwareBufferInfoANDROID
+{
+	VkStructureType					sType;
+	const void*						pNext;
+	pt::AndroidHardwareBufferPtr	buffer;
+};
+
+struct VkMemoryGetAndroidHardwareBufferInfoANDROID
+{
+	VkStructureType	sType;
+	void*			pNext;
+	VkDeviceMemory	memory;
+};
+
+struct VkAndroidHardwareBufferExternalFormatPropertiesANDROID
+{
+	VkStructureType						sType;
+	void*								pNext;
+	deUint32							externalFormat;
+	VkFormatFeatureFlags				formatFeatures;
+	VkSamplerYcbcrModelConversionKHR	suggestedYcbcrModel;
+	VkSamplerYcbcrRangeKHR				suggestedYcbcrRange;
+	VkChromaLocationKHR					suggestedXChromaOffset;
+	VkChromaLocationKHR					suggestedYChromaOffset;
+};
+
+struct VkExternalFormatANDROID
+{
+	VkStructureType	sType;
+	void*			pNext;
+	deUint32		externalFormat;
+};
+
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index 3f6246d..d390918 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -1,157 +1,165 @@
 /* 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 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) 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 void		cmdPushDescriptorSetKHR					(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const = 0;
-virtual VkResult	createDescriptorUpdateTemplateKHR		(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate) const = 0;
-virtual void		destroyDescriptorUpdateTemplateKHR		(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual void		updateDescriptorSetWithTemplateKHR		(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const = 0;
-virtual void		cmdPushDescriptorSetWithTemplateKHR		(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const = 0;
-virtual VkResult	getSwapchainStatusKHR					(VkDevice device, VkSwapchainKHR swapchain) const = 0;
-virtual VkResult	importFenceWin32HandleKHR				(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const = 0;
-virtual VkResult	getFenceWin32HandleKHR					(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
-virtual VkResult	importFenceFdKHR						(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const = 0;
-virtual VkResult	getFenceFdKHR							(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
-virtual void		getImageMemoryRequirements2KHR			(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
-virtual void		getBufferMemoryRequirements2KHR			(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
-virtual void		getImageSparseMemoryRequirements2KHR	(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const = 0;
-virtual VkResult	createSamplerYcbcrConversionKHR			(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion) const = 0;
-virtual void		destroySamplerYcbcrConversionKHR		(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult	getMemoryWin32HandleKHR					(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
-virtual VkResult	getMemoryWin32HandlePropertiesKHR		(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const = 0;
-virtual VkResult	getMemoryFdKHR							(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
-virtual VkResult	getMemoryFdPropertiesKHR				(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties) const = 0;
-virtual VkResult	importSemaphoreWin32HandleKHR			(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const = 0;
-virtual VkResult	getSemaphoreWin32HandleKHR				(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
-virtual VkResult	importSemaphoreFdKHR					(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) const = 0;
-virtual VkResult	getSemaphoreFdKHR						(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
-virtual VkResult	getRefreshCycleDurationGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const = 0;
-virtual VkResult	getPastPresentationTimingGOOGLE			(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const = 0;
-virtual VkResult	bindBufferMemory2KHR					(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const = 0;
-virtual VkResult	bindImageMemory2KHR						(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) 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 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) 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 void		cmdPushDescriptorSetKHR							(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, deUint32 set, deUint32 descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites) const = 0;
+virtual VkResult	createDescriptorUpdateTemplateKHR				(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplateKHR* pDescriptorUpdateTemplate) const = 0;
+virtual void		destroyDescriptorUpdateTemplateKHR				(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void		updateDescriptorSetWithTemplateKHR				(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void* pData) const = 0;
+virtual void		cmdPushDescriptorSetWithTemplateKHR				(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, VkPipelineLayout layout, deUint32 set, const void* pData) const = 0;
+virtual VkResult	getSwapchainStatusKHR							(VkDevice device, VkSwapchainKHR swapchain) const = 0;
+virtual VkResult	importFenceWin32HandleKHR						(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo) const = 0;
+virtual VkResult	getFenceWin32HandleKHR							(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
+virtual VkResult	importFenceFdKHR								(VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo) const = 0;
+virtual VkResult	getFenceFdKHR									(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
+virtual void		getImageMemoryRequirements2KHR					(VkDevice device, const VkImageMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
+virtual void		getBufferMemoryRequirements2KHR					(VkDevice device, const VkBufferMemoryRequirementsInfo2KHR* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements) const = 0;
+virtual void		getImageSparseMemoryRequirements2KHR			(VkDevice device, const VkImageSparseMemoryRequirementsInfo2KHR* pInfo, deUint32* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2KHR* pSparseMemoryRequirements) const = 0;
+virtual VkResult	createSamplerYcbcrConversionKHR					(VkDevice device, const VkSamplerYcbcrConversionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversionKHR* pYcbcrConversion) const = 0;
+virtual void		destroySamplerYcbcrConversionKHR				(VkDevice device, VkSamplerYcbcrConversionKHR YcbcrConversion, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult	getMemoryWin32HandleKHR							(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
+virtual VkResult	getMemoryWin32HandlePropertiesKHR				(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const = 0;
+virtual VkResult	getMemoryFdKHR									(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
+virtual VkResult	getMemoryFdPropertiesKHR						(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHR handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties) const = 0;
+virtual VkResult	importSemaphoreWin32HandleKHR					(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const = 0;
+virtual VkResult	getSemaphoreWin32HandleKHR						(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
+virtual VkResult	importSemaphoreFdKHR							(VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo) const = 0;
+virtual VkResult	getSemaphoreFdKHR								(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd) const = 0;
+virtual VkResult	getRefreshCycleDurationGOOGLE					(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties) const = 0;
+virtual VkResult	getPastPresentationTimingGOOGLE					(VkDevice device, VkSwapchainKHR swapchain, deUint32* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings) const = 0;
+virtual void		getDeviceGroupPeerMemoryFeaturesKHX				(VkDevice device, deUint32 heapIndex, deUint32 localDeviceIndex, deUint32 remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures) const = 0;
+virtual void		cmdSetDeviceMaskKHX								(VkCommandBuffer commandBuffer, deUint32 deviceMask) const = 0;
+virtual VkResult	getDeviceGroupPresentCapabilitiesKHX			(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities) const = 0;
+virtual VkResult	getDeviceGroupSurfacePresentModesKHX			(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes) const = 0;
+virtual VkResult	acquireNextImage2KHX							(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, deUint32* pImageIndex) const = 0;
+virtual void		cmdDispatchBaseKHX								(VkCommandBuffer commandBuffer, deUint32 baseGroupX, deUint32 baseGroupY, deUint32 baseGroupZ, deUint32 groupCountX, deUint32 groupCountY, deUint32 groupCountZ) const = 0;
+virtual VkResult	bindBufferMemory2KHR							(VkDevice device, deUint32 bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos) const = 0;
+virtual VkResult	bindImageMemory2KHR								(VkDevice device, deUint32 bindInfoCount, const VkBindImageMemoryInfoKHR* pBindInfos) const = 0;
+virtual VkResult	getMemoryAndroidHardwareBufferPropertiesANDROID	(VkDevice device, const pt::AndroidHardwareBufferPtr buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties) const = 0;
+virtual VkResult	getMemoryAndroidHardwareBufferANDROID			(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, pt::AndroidHardwareBufferPtr* pBuffer) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
index 2923961..af412d5 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
@@ -52,3 +52,6 @@
 virtual void				debugReportMessageEXT								(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
 virtual void				getPhysicalDeviceExternalBufferPropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHR* pExternalBufferInfo, VkExternalBufferPropertiesKHR* pExternalBufferProperties) const = 0;
 virtual void				getPhysicalDeviceExternalSemaphorePropertiesKHR		(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR* pExternalSemaphoreInfo, VkExternalSemaphorePropertiesKHR* pExternalSemaphoreProperties) const = 0;
+virtual VkResult			getPhysicalDevicePresentRectanglesKHX				(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pRectCount, VkRect2D* pRects) const = 0;
+virtual VkResult			enumeratePhysicalDeviceGroupsKHX					(VkInstance instance, deUint32* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties) const = 0;
+virtual void				getPhysicalDeviceAndroidHardwareBufferUsageANDROID	(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage) const = 0;
diff --git a/external/vulkancts/modules/vulkan/CMakeLists.txt b/external/vulkancts/modules/vulkan/CMakeLists.txt
index 8dd4224..39506d3 100644
--- a/external/vulkancts/modules/vulkan/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/CMakeLists.txt
@@ -25,6 +25,7 @@
 add_subdirectory(texture)
 add_subdirectory(robustness)
 add_subdirectory(renderpass)
+add_subdirectory(multiview)
 add_subdirectory(ycbcr)
 
 include_directories(
@@ -53,6 +54,7 @@
 	geometry
 	robustness
 	renderpass
+	multiview
 	ycbcr
 	)
 
@@ -106,6 +108,7 @@
 	deqp-vk-geometry
 	deqp-vk-robustness
 	deqp-vk-render-pass
+	deqp-vk-multiview
 	deqp-vk-ycbcr
 	)
 
diff --git a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
index 13dffec..acf99a1 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
@@ -3463,8 +3463,10 @@
 	getMemoryNative(vkd, *device, *memoryA, config.externalType, handle);
 
 	{
-		const vk::Unique<vk::VkDeviceMemory>	memoryB	(importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 		const vk::Unique<vk::VkImage>			imageB	(createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+		const vk::Unique<vk::VkDeviceMemory>	memoryB	(config.dedicated
+														 ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
+														 : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 
 		VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
 	}
@@ -3500,8 +3502,10 @@
 	VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
 
 	{
-		const vk::Unique<vk::VkDeviceMemory>	memoryB	(importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 		const vk::Unique<vk::VkImage>			imageB	(createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+		const vk::Unique<vk::VkDeviceMemory>	memoryB	(config.dedicated
+														 ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
+														 : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 
 		VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
 	}
@@ -3537,8 +3541,10 @@
 	getMemoryNative(vkd, *device, *memoryA, config.externalType, handle);
 
 	{
-		const vk::Unique<vk::VkDeviceMemory>	memoryB	(importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 		const vk::Unique<vk::VkImage>			imageB	(createExternalImage(vkd, *device, queueFamilyIndex, config.externalType, format, width, height, tiling, 0u, usage));
+		const vk::Unique<vk::VkDeviceMemory>	memoryB	(config.dedicated
+														 ? importDedicatedMemory(vkd, *device, *imageB, requirements, config.externalType, exportedMemoryTypeIndex, handle)
+														 : importMemory(vkd, *device, requirements, config.externalType, exportedMemoryTypeIndex, handle));
 
 		VK_CHECK(vkd.bindImageMemory(*device, *imageA, *memoryA, 0u));
 		VK_CHECK(vkd.bindImageMemory(*device, *imageB, *memoryB, 0u));
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
index 26098eb..c051f37 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
@@ -29,6 +29,7 @@
 #include "vkPlatform.hpp"
 #include "vkStrUtil.hpp"
 #include "vkRef.hpp"
+#include "vkRefUtil.hpp"
 #include "vkDeviceUtil.hpp"
 #include "vkQueryUtil.hpp"
 #include "vkImageUtil.hpp"
@@ -38,6 +39,7 @@
 #include "tcuFormatUtil.hpp"
 #include "tcuTextureUtil.hpp"
 #include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deUniquePtr.hpp"
 #include "deString.h"
@@ -527,6 +529,14 @@
 	}
 };
 
+struct CheckEnumeratePhysicalDeviceGroupsIncompleteResult : public CheckIncompleteResult<VkPhysicalDeviceGroupPropertiesKHX>
+{
+	void getResult (Context& context, VkPhysicalDeviceGroupPropertiesKHX* data)
+	{
+		m_result = context.getInstanceInterface().enumeratePhysicalDeviceGroupsKHX(context.getInstance(), &m_count, data);
+	}
+};
+
 struct CheckEnumerateInstanceLayerPropertiesIncompleteResult : public CheckIncompleteResult<VkLayerProperties>
 {
 	void getResult (Context& context, VkLayerProperties* data)
@@ -587,6 +597,38 @@
 	return tcu::TestStatus(results.getResult(), results.getMessage());
 }
 
+Move<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp, const char* extensionName)
+{
+	const vector<VkExtensionProperties>	instanceExts = enumerateInstanceExtensionProperties(vkp, DE_NULL);
+	vector<string>						enabledExts;
+
+	if (!isExtensionSupported(instanceExts, RequiredExtension(extensionName)))
+		TCU_THROW(NotSupportedError, (string(extensionName) + " is not supported").c_str());
+
+	enabledExts.push_back(extensionName);
+
+	return createDefaultInstance(vkp, vector<string>() /* layers */, enabledExts);
+}
+
+tcu::TestStatus enumeratePhysicalDeviceGroupsKHX (Context& context)
+{
+	TestLog&											log				= context.getTestContext().getLog();
+	tcu::ResultCollector								results			(log);
+	const PlatformInterface&							vkp				= context.getPlatformInterface();
+	const Unique<VkInstance>							instance		(createInstanceWithExtension(vkp, "VK_KHX_device_group_creation"));
+	const InstanceDriver								vki				(vkp, *instance);
+	const vector<VkPhysicalDeviceGroupPropertiesKHX>	devicegroups	= enumeratePhysicalDeviceGroupsKHX(vki, *instance);
+
+	log << TestLog::Integer("NumDevices", "Number of device groups", "", QP_KEY_TAG_NONE, deInt64(devicegroups.size()));
+
+	for (size_t ndx = 0; ndx < devicegroups.size(); ndx++)
+		log << TestLog::Message << ndx << ": " << devicegroups[ndx] << TestLog::EndMessage;
+
+	CheckEnumeratePhysicalDeviceGroupsIncompleteResult()(context, results, devicegroups.size());
+
+	return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
 template<typename T>
 void collectDuplicates (set<T>& duplicates, const vector<T>& values)
 {
@@ -1258,6 +1300,117 @@
 	return tcu::TestStatus::pass("Querying memory properties succeeded");
 }
 
+tcu::TestStatus deviceGroupPeerMemoryFeatures (Context& context)
+{
+	TestLog&							log						= context.getTestContext().getLog();
+	const PlatformInterface&			vkp						= context.getPlatformInterface();
+	const Unique<VkInstance>			instance				(createInstanceWithExtension(vkp, "VK_KHX_device_group_creation"));
+	const InstanceDriver				vki						(vkp, *instance);
+	const tcu::CommandLine&				cmdLine					= context.getTestContext().getCommandLine();
+	const deUint32						devGroupIdx				= cmdLine.getVKDeviceGroupId() - 1;
+	const deUint32						deviceIdx				= context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
+	const float							queuePriority			= 1.0f;
+	VkPhysicalDeviceMemoryProperties	memProps;
+	VkPeerMemoryFeatureFlagsKHX*		peerMemFeatures;
+	deUint8								buffer					[sizeof(VkPeerMemoryFeatureFlagsKHX) + GUARD_SIZE];
+	deUint32							numPhysicalDevices		= 0;
+	deUint32							queueFamilyIndex		= 0;
+
+	const vector<VkPhysicalDeviceGroupPropertiesKHX>		deviceGroupProps = enumeratePhysicalDeviceGroupsKHX(vki, *instance);
+	std::vector<const char*>								deviceExtensions;
+	deviceExtensions.push_back("VK_KHX_device_group");
+	deviceExtensions.push_back("VK_KHR_swapchain");
+
+	const std::vector<VkQueueFamilyProperties>	queueProps		= getPhysicalDeviceQueueFamilyProperties(vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
+	for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
+	{
+		if (queueProps[queueNdx].queueFlags & VK_QUEUE_GRAPHICS_BIT)
+			queueFamilyIndex = (deUint32)queueNdx;
+	}
+	const VkDeviceQueueCreateInfo		deviceQueueCreateInfo	=
+	{
+		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,			//type
+		DE_NULL,											//pNext
+		(VkDeviceQueueCreateFlags)0u,						//flags
+		queueFamilyIndex,									//queueFamilyIndex;
+		1u,													//queueCount;
+		&queuePriority,										//pQueuePriorities;
+	};
+
+	// Need atleast 2 devices for peer memory features
+	numPhysicalDevices = deviceGroupProps[devGroupIdx].physicalDeviceCount;
+	if (numPhysicalDevices < 2)
+		TCU_THROW(NotSupportedError, "Need a device Group with atleast 2 physical devices.");
+
+	// Create device groups
+	const VkDeviceGroupDeviceCreateInfoKHX					deviceGroupInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX,	//stype
+		DE_NULL,												//pNext
+		deviceGroupProps[devGroupIdx].physicalDeviceCount,		//physicalDeviceCount
+		deviceGroupProps[devGroupIdx].physicalDevices			//physicalDevices
+	};
+	const VkDeviceCreateInfo								deviceCreateInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,				//sType;
+		&deviceGroupInfo,									//pNext;
+		(VkDeviceCreateFlags)0u,							//flags
+		1,													//queueRecordCount;
+		&deviceQueueCreateInfo,								//pRequestedQueues;
+		0,													//layerCount;
+		DE_NULL,											//ppEnabledLayerNames;
+		deUint32(deviceExtensions.size()),					//extensionCount;
+		&deviceExtensions[0],								//ppEnabledExtensionNames;
+		DE_NULL,											//pEnabledFeatures;
+	};
+
+	Move<VkDevice>		deviceGroup = createDevice(vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+	const DeviceDriver	vk	(vki, *deviceGroup);
+	context.getInstanceInterface().getPhysicalDeviceMemoryProperties(deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &memProps);
+
+	peerMemFeatures = reinterpret_cast<VkPeerMemoryFeatureFlagsKHX*>(buffer);
+	deMemset(buffer, GUARD_VALUE, sizeof(buffer));
+
+	for (deUint32 heapIndex = 0; heapIndex < memProps.memoryHeapCount; heapIndex++)
+	{
+		for (deUint32 localDeviceIndex = 0; localDeviceIndex < numPhysicalDevices; localDeviceIndex++)
+		{
+			for (deUint32 remoteDeviceIndex = 0; remoteDeviceIndex < numPhysicalDevices; remoteDeviceIndex++)
+			{
+				if (localDeviceIndex != remoteDeviceIndex)
+				{
+					vk.getDeviceGroupPeerMemoryFeaturesKHX(deviceGroup.get(), heapIndex, localDeviceIndex, remoteDeviceIndex, peerMemFeatures);
+
+					// Check guard
+					for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++)
+					{
+						if (buffer[ndx + sizeof(VkPeerMemoryFeatureFlagsKHX)] != GUARD_VALUE)
+						{
+							log << TestLog::Message << "deviceGroupPeerMemoryFeatures - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
+							return tcu::TestStatus::fail("deviceGroupPeerMemoryFeatures buffer overflow");
+						}
+					}
+
+					VkPeerMemoryFeatureFlagsKHX requiredFlag = VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX;
+					VkPeerMemoryFeatureFlagsKHX maxValidFlag = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX|VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX |
+																VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX|VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX;
+					if ((!(*peerMemFeatures & requiredFlag)) ||
+						*peerMemFeatures > maxValidFlag)
+						return tcu::TestStatus::fail("deviceGroupPeerMemoryFeatures invalid flag");
+
+					log << TestLog::Message << "deviceGroup = " << deviceGroup.get() << TestLog::EndMessage
+						<< TestLog::Message << "heapIndex = " << heapIndex << TestLog::EndMessage
+						<< TestLog::Message << "localDeviceIndex = " << localDeviceIndex << TestLog::EndMessage
+						<< TestLog::Message << "remoteDeviceIndex = " << remoteDeviceIndex << TestLog::EndMessage
+						<< TestLog::Message << "PeerMemoryFeatureFlags = " << *peerMemFeatures << TestLog::EndMessage;
+				}
+			} // remote device
+		} // local device
+	} // heap Index
+
+	return tcu::TestStatus::pass("Querying deviceGroup peer memory features succeeded");
+}
+
 // \todo [2016-01-22 pyry] Optimize by doing format -> flags mapping instead
 
 VkFormatFeatureFlags getRequiredOptimalTilingFeatures (VkFormat format)
@@ -1620,7 +1773,7 @@
 		if ((supported & required) != required)
 		{
 			log << TestLog::Message << "ERROR in " << fieldName << ":\n"
-								    << "  required: " << getFormatFeatureFlagsStr(required) << "\n  "
+									<< "  required: " << getFormatFeatureFlagsStr(required) << "\n  "
 									<< "  missing: " << getFormatFeatureFlagsStr(~supported & required)
 				<< TestLog::EndMessage;
 			allOk = false;
@@ -2255,7 +2408,7 @@
 
 	if (hasKhrMaintenance1 && (supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0)
 	{
-		results.check((supportedFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR)) != 0,
+		results.check((supportedFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR|VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR)) != 0,
 					  "A sampled image format must have VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR and VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR format feature flags set");
 	}
 
@@ -2314,7 +2467,7 @@
 				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_DEPTH_STENCIL_ATTACHMENT_BIT|VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) ||
 					 ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && deviceFeatures.shaderStorageImageMultisample)))
 				{
 					const VkSampleCountFlags	requiredSampleCounts	= getRequiredOptimalTilingSampleCounts(deviceLimits, format, curUsageFlags);
@@ -2375,19 +2528,6 @@
 
 // VK_KHR_get_physical_device_properties2
 
-Move<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp, const char* extensionName)
-{
-	const vector<VkExtensionProperties>	instanceExts	= enumerateInstanceExtensionProperties(vkp, DE_NULL);
-	vector<string>						enabledExts;
-
-	if (!isExtensionSupported(instanceExts, RequiredExtension(extensionName)))
-		TCU_THROW(NotSupportedError, (string(extensionName) + " is not supported").c_str());
-
-	enabledExts.push_back(extensionName);
-
-	return createDefaultInstance(vkp, vector<string>() /* layers */, enabledExts);
-}
-
 tcu::TestStatus deviceFeatures2 (Context& context)
 {
 	const PlatformInterface&		vkp			= context.getPlatformInterface();
@@ -2884,6 +3024,7 @@
 		de::MovePtr<tcu::TestCaseGroup> instanceInfoTests	(new tcu::TestCaseGroup(testCtx, "instance", "Instance Information Tests"));
 
 		addFunctionCase(instanceInfoTests.get(), "physical_devices",		"Physical devices",			enumeratePhysicalDevices);
+		addFunctionCase(instanceInfoTests.get(), "physical_device_groups",	"Physical devices Groups",	enumeratePhysicalDeviceGroupsKHX);
 		addFunctionCase(instanceInfoTests.get(), "layers",					"Layers",					enumerateInstanceLayers);
 		addFunctionCase(instanceInfoTests.get(), "extensions",				"Extensions",				enumerateInstanceExtensions);
 
@@ -2903,6 +3044,14 @@
 		infoTests->addChild(deviceInfoTests.release());
 	}
 
+	{
+		de::MovePtr<tcu::TestCaseGroup> deviceGroupInfoTests (new tcu::TestCaseGroup(testCtx, "device_group", "Device Group Information Tests"));
+
+		addFunctionCase(deviceGroupInfoTests.get(), "peer_memory_features",	"Device Group peer memory features",				deviceGroupPeerMemoryFeatures);
+
+		infoTests->addChild(deviceGroupInfoTests.release());
+	}
+
 	infoTests->addChild(createTestGroup(testCtx, "format_properties",		"VkGetPhysicalDeviceFormatProperties() Tests",		createFormatTests));
 	infoTests->addChild(createTestGroup(testCtx, "image_format_properties",	"VkGetPhysicalDeviceImageFormatProperties() Tests",	createImageFormatTests,	imageFormatProperties));
 	// \todo [2017-05-16 pyry] Extend image_format_properties to cover ycbcr formats
diff --git a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
index 04945a7..c1b189e 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
@@ -429,7 +429,13 @@
 
 	struct Parameters
 	{
+		const vector<string>	instanceExtensions;
+
 		Parameters (void) {}
+
+		Parameters (vector<string>& extensions)
+			: instanceExtensions	(extensions)
+		{}
 	};
 
 	struct Resources
@@ -442,8 +448,17 @@
 		return getSafeObjectCount<Instance>(context, params, MAX_CONCURRENT_INSTANCES);
 	}
 
-	static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters&)
+	static Move<VkInstance> create (const Environment& env, const Resources&, const Parameters& params)
 	{
+		vector<const char*>					extensionNamePtrs(params.instanceExtensions.size());
+		const vector<VkExtensionProperties>	instanceExts = enumerateInstanceExtensionProperties(env.vkp, DE_NULL);
+		for (size_t extensionID = 0; extensionID < params.instanceExtensions.size(); extensionID++)
+		{
+			if (!isExtensionSupported(instanceExts, RequiredExtension(params.instanceExtensions[extensionID])))
+				TCU_THROW(NotSupportedError, (params.instanceExtensions[extensionID] + " is not supported").c_str());
+			extensionNamePtrs[extensionID] = params.instanceExtensions[extensionID].c_str();
+		}
+
 		const VkApplicationInfo		appInfo			=
 		{
 			VK_STRUCTURE_TYPE_APPLICATION_INFO,
@@ -454,16 +469,17 @@
 			0u,									// engineVersion
 			VK_MAKE_VERSION(1,0,0)
 		};
+
 		const VkInstanceCreateInfo	instanceInfo	=
 		{
 			VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
 			DE_NULL,
 			(VkInstanceCreateFlags)0,
 			&appInfo,
-			0u,									// enabledLayerNameCount
-			DE_NULL,							// ppEnabledLayerNames
-			0u,									// enabledExtensionNameCount
-			DE_NULL,							// ppEnabledExtensionNames
+			0u,																// enabledLayerNameCount
+			DE_NULL,														// ppEnabledLayerNames
+			(deUint32)extensionNamePtrs.size(),								// enabledExtensionNameCount
+			extensionNamePtrs.empty() ? DE_NULL : &extensionNamePtrs[0],	// ppEnabledExtensionNames
 		};
 
 		return createInstance(env.vkp, &instanceInfo, env.allocationCallbacks);
@@ -564,6 +580,119 @@
 	}
 };
 
+
+struct DeviceGroup
+{
+	typedef VkDevice Type;
+
+	struct Parameters
+	{
+		deUint32		deviceGroupIndex;
+		deUint32		deviceIndex;
+		VkQueueFlags	queueFlags;
+
+		Parameters (deUint32 deviceGroupIndex_, deUint32 deviceIndex_, VkQueueFlags queueFlags_)
+			: deviceGroupIndex	(deviceGroupIndex_)
+			, deviceIndex		(deviceIndex_)
+			, queueFlags		(queueFlags_)
+		{}
+	};
+
+	struct Resources
+	{
+		vector<string>				extensions;
+		Dependency<Instance>		instance;
+		InstanceDriver				vki;
+		vector<VkPhysicalDevice>	physicalDevices;
+		deUint32					physicalDeviceCount;
+		deUint32					queueFamilyIndex;
+
+		Resources (const Environment& env, const Parameters& params)
+			: extensions			(1, "VK_KHX_device_group_creation")
+			, instance				(env, Instance::Parameters(extensions))
+			, vki					(env.vkp, *instance.object)
+			, physicalDeviceCount	(0)
+			, queueFamilyIndex		(~0u)
+		{
+			{
+				const vector<VkPhysicalDeviceGroupPropertiesKHX> devGroupProperties = enumeratePhysicalDeviceGroupsKHX(vki, *instance.object);
+
+				if (devGroupProperties.size() <= (size_t)params.deviceGroupIndex)
+					TCU_THROW(NotSupportedError, "Device Group not found");
+
+				physicalDeviceCount	= devGroupProperties[params.deviceGroupIndex].physicalDeviceCount;
+				physicalDevices.resize(physicalDeviceCount);
+
+				for (deUint32 physicalDeviceIdx = 0; physicalDeviceIdx < physicalDeviceCount; physicalDeviceIdx++)
+					physicalDevices[physicalDeviceIdx] = devGroupProperties[params.deviceGroupIndex].physicalDevices[physicalDeviceIdx];
+			}
+
+			{
+				const vector<VkQueueFamilyProperties>	queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevices[params.deviceIndex]);
+				bool									foundMatching = false;
+
+				for (size_t curQueueNdx = 0; curQueueNdx < queueProps.size(); curQueueNdx++)
+				{
+					if ((queueProps[curQueueNdx].queueFlags & params.queueFlags) == params.queueFlags)
+					{
+						queueFamilyIndex = (deUint32)curQueueNdx;
+						foundMatching = true;
+					}
+				}
+
+				if (!foundMatching)
+					TCU_THROW(NotSupportedError, "Matching queue not found");
+			}
+		}
+	};
+
+	static deUint32 getMaxConcurrent (Context& context, const Parameters& params)
+	{
+		return getSafeObjectCount<DeviceGroup>(context, params, MAX_CONCURRENT_DEVICES);
+	}
+
+	static Move<VkDevice> create (const Environment& env, const Resources& res, const Parameters& params)
+	{
+		const float	queuePriority = 1.0;
+
+		const VkDeviceQueueCreateInfo	queues[] =
+		{
+			{
+				VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+				DE_NULL,							// pNext
+				(VkDeviceQueueCreateFlags)0,		// flags
+				res.queueFamilyIndex,				// queueFamilyIndex
+				1u,									// queueCount
+				&queuePriority,						// pQueuePriorities
+			}
+		};
+
+		const VkDeviceGroupDeviceCreateInfoKHX deviceGroupInfo =
+		{
+			VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX,	//stype
+			DE_NULL,												//pNext
+			res.physicalDeviceCount,								//physicalDeviceCount
+			res.physicalDevices.data()								//physicalDevices
+		};
+
+		const VkDeviceCreateInfo		deviceGroupCreateInfo =
+		{
+			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
+			&deviceGroupInfo,
+			(VkDeviceCreateFlags)0,
+			DE_LENGTH_OF_ARRAY(queues),
+			queues,
+			0u,										// enabledLayerNameCount
+			DE_NULL,								// ppEnabledLayerNames
+			0u,										// enabledExtensionNameCount
+			DE_NULL,								// ppEnabledExtensionNames
+			DE_NULL,								// pEnabledFeatures
+		};
+
+		return createDevice(res.vki, res.physicalDevices[params.deviceIndex], &deviceGroupCreateInfo, env.allocationCallbacks);
+	}
+};
+
 struct DeviceMemory
 {
 	typedef VkDeviceMemory Type;
@@ -2651,6 +2780,7 @@
 {
 	CaseDescription<Instance>				instance;
 	CaseDescription<Device>					device;
+	CaseDescription<DeviceGroup>			deviceGroup;
 	CaseDescription<DeviceMemory>			deviceMemory;
 	CaseDescription<Buffer>					buffer;
 	CaseDescription<BufferView>				bufferView;
@@ -2695,6 +2825,7 @@
 
 	addCases			(group, cases.instance);
 	addCases			(group, cases.device);
+	addCases			(group, cases.deviceGroup);
 	addCases			(group, cases.deviceMemory);
 	addCases			(group, cases.buffer);
 	addCases			(group, cases.bufferView);
@@ -2741,15 +2872,19 @@
 
 	const DescriptorSetLayout::Parameters	singleUboDescLayout	= DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT);
 
-	static NamedParameters<Instance>				s_instanceCases[]			=
+	static NamedParameters<Instance>					s_instanceCases[]				=
 	{
 		{ "instance",					Instance::Parameters() },
 	};
 	// \note Device index may change - must not be static
-	const NamedParameters<Device>					s_deviceCases[]				=
+	const NamedParameters<Device>						s_deviceCases[]					=
 	{
 		{ "device",						Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT)	},
 	};
+	const NamedParameters<DeviceGroup>					s_deviceGroupCases[]			=
+	{
+		{ "device_group",				DeviceGroup::Parameters(testCtx.getCommandLine().getVKDeviceGroupId() - 1u, testCtx.getCommandLine().getVKDeviceId() - 1u, VK_QUEUE_GRAPHICS_BIT) },
+	};
 	static const NamedParameters<DeviceMemory>			s_deviceMemCases[]				=
 	{
 		{ "device_memory_small",		DeviceMemory::Parameters(1024, 0u)	},
@@ -2861,6 +2996,7 @@
 	{
 		CASE_DESC(createSingleTest	<Instance>,					s_instanceCases),
 		CASE_DESC(createSingleTest	<Device>,					s_deviceCases),
+		CASE_DESC(createSingleTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(createSingleTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(createSingleTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(createSingleTest	<BufferView>,				s_bufferViewCases),
@@ -2890,6 +3026,7 @@
 	{
 		CASE_DESC(createMultipleUniqueResourcesTest	<Instance>,					s_instanceCases),
 		CASE_DESC(createMultipleUniqueResourcesTest	<Device>,					s_deviceCases),
+		CASE_DESC(createMultipleUniqueResourcesTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(createMultipleUniqueResourcesTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(createMultipleUniqueResourcesTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(createMultipleUniqueResourcesTest	<BufferView>,				s_bufferViewCases),
@@ -2919,6 +3056,7 @@
 	{
 		EMPTY_CASE_DESC(Instance), // No resources used
 		CASE_DESC(createMultipleSharedResourcesTest	<Device>,					s_deviceCases),
+		CASE_DESC(createMultipleSharedResourcesTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(createMultipleSharedResourcesTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(createMultipleSharedResourcesTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(createMultipleSharedResourcesTest	<BufferView>,				s_bufferViewCases),
@@ -2948,6 +3086,7 @@
 	{
 		CASE_DESC(createMaxConcurrentTest	<Instance>,					s_instanceCases),
 		CASE_DESC(createMaxConcurrentTest	<Device>,					s_deviceCases),
+		CASE_DESC(createMaxConcurrentTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(createMaxConcurrentTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(createMaxConcurrentTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(createMaxConcurrentTest	<BufferView>,				s_bufferViewCases),
@@ -2975,8 +3114,9 @@
 
 	static const CaseDescriptions	s_multithreadedCreatePerThreadDeviceGroup	=
 	{
-		EMPTY_CASE_DESC(Instance),	// Does not make sense
-		EMPTY_CASE_DESC(Device),	// Does not make sense
+		EMPTY_CASE_DESC(Instance),		// Does not make sense
+		EMPTY_CASE_DESC(Device),		// Does not make sense
+		EMPTY_CASE_DESC(DeviceGroup),	// Does not make sense
 		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(multithreadedCreatePerThreadDeviceTest	<BufferView>,				s_bufferViewCases),
@@ -3006,6 +3146,7 @@
 	{
 		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Instance>,					s_instanceCases),
 		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Device>,					s_deviceCases),
+		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(multithreadedCreatePerThreadResourcesTest	<BufferView>,				s_bufferViewCases),
@@ -3035,6 +3176,7 @@
 	{
 		EMPTY_CASE_DESC(Instance),
 		CASE_DESC(multithreadedCreateSharedResourcesTest	<Device>,					s_deviceCases),
+		CASE_DESC(multithreadedCreateSharedResourcesTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(multithreadedCreateSharedResourcesTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(multithreadedCreateSharedResourcesTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(multithreadedCreateSharedResourcesTest	<BufferView>,				s_bufferViewCases),
@@ -3064,6 +3206,7 @@
 	{
 		CASE_DESC(createSingleAllocCallbacksTest	<Instance>,					s_instanceCases),
 		CASE_DESC(createSingleAllocCallbacksTest	<Device>,					s_deviceCases),
+		CASE_DESC(createSingleAllocCallbacksTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(createSingleAllocCallbacksTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(createSingleAllocCallbacksTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(createSingleAllocCallbacksTest	<BufferView>,				s_bufferViewCases),
@@ -3094,6 +3237,7 @@
 	{
 		CASE_DESC(allocCallbackFailTest	<Instance>,					s_instanceCases),
 		CASE_DESC(allocCallbackFailTest	<Device>,					s_deviceCases),
+		CASE_DESC(allocCallbackFailTest	<DeviceGroup>,				s_deviceGroupCases),
 		CASE_DESC(allocCallbackFailTest	<DeviceMemory>,				s_deviceMemCases),
 		CASE_DESC(allocCallbackFailTest	<Buffer>,					s_bufferCases),
 		CASE_DESC(allocCallbackFailTest	<BufferView>,				s_bufferViewCases),
@@ -3124,6 +3268,7 @@
 	{
 		EMPTY_CASE_DESC(Instance),			// most objects can be created one at a time only
 		EMPTY_CASE_DESC(Device),
+		EMPTY_CASE_DESC(DeviceGroup),
 		EMPTY_CASE_DESC(DeviceMemory),
 		EMPTY_CASE_DESC(Buffer),
 		EMPTY_CASE_DESC(BufferView),
diff --git a/external/vulkancts/modules/vulkan/api/vktApiSmokeTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiSmokeTests.cpp
index 41bdd3e..5db79ef 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiSmokeTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiSmokeTests.cpp
@@ -102,7 +102,7 @@
 {
 	dst.glslSources.add("test") << glu::VertexSource(
 		"#version 310 es\n"
-		"in highp vec4 a_position;\n"
+		"layout(location = 0) in highp vec4 a_position;\n"
 		"void main (void) { gl_Position = a_position; }\n");
 }
 
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
index a2a2302..df6fe54 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
@@ -29,6 +29,7 @@
 #include "tcuResultCollector.hpp"
 #include "tcuTestLog.hpp"
 #include "tcuPlatform.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "vkPlatform.hpp"
 #include "vkStrUtil.hpp"
@@ -78,23 +79,144 @@
 	Maybe<float>		memoryPercentage;
 	deUint32			memoryAllocationCount;
 	Order				order;
+	bool				useDeviceGroups;
 
 	TestConfig (void)
 		: memoryAllocationCount	((deUint32)-1)
 		, order					(ORDER_LAST)
+		, useDeviceGroups		(false)
 	{
 	}
 };
 
-class AllocateFreeTestInstance : public TestInstance
+struct TestConfigRandom
+{
+	const deUint32		seed;
+	const bool			useDeviceGroups;
+
+	TestConfigRandom (const deUint32 _seed, const bool _useDeviceGroups)
+		: seed				(_seed)
+		, useDeviceGroups	(_useDeviceGroups)
+	{
+	}
+};
+
+vk::Move<VkInstance> createInstanceWithExtensions(const vk::PlatformInterface& vkp, const std::vector<std::string>   enableExtensions)
+{
+	std::vector<std::string>					enableExtensionPtrs	 (enableExtensions.size());
+	const std::vector<VkExtensionProperties>	availableExtensions	 = enumerateInstanceExtensionProperties(vkp, DE_NULL);
+	for (size_t extensionID = 0; extensionID < enableExtensions.size(); extensionID++)
+	{
+		if (!isExtensionSupported(availableExtensions, RequiredExtension(enableExtensions[extensionID])))
+			TCU_THROW(NotSupportedError, (enableExtensions[extensionID] + " is not supported").c_str());
+		enableExtensionPtrs[extensionID] = enableExtensions[extensionID];
+	}
+	return createDefaultInstance(vkp, std::vector<std::string>() /* layers */, enableExtensionPtrs);
+}
+
+class BaseAllocateTestInstance : public TestInstance
+{
+public:
+						BaseAllocateTestInstance		(Context& context, bool useDeviceGroups)
+		: TestInstance				(context)
+		, m_useDeviceGroups			(useDeviceGroups)
+		, m_subsetAllocationAllowed	(false)
+		, m_numPhysDevices			(1)
+		, m_memoryProperties		(getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()))
+	{
+		if (m_useDeviceGroups)
+			createDeviceGroup();
+		m_allocFlagsInfo.sType		= VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX;
+		m_allocFlagsInfo.pNext		= DE_NULL;
+		m_allocFlagsInfo.flags		= VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX;
+		m_allocFlagsInfo.deviceMask	= 0;
+	}
+
+	void						createDeviceGroup	(void);
+	const vk::DeviceInterface&	getDeviceInterface	(void) { return m_useDeviceGroups ? *m_deviceDriver : m_context.getDeviceInterface(); }
+	vk::VkDevice				getDevice			(void) { return m_useDeviceGroups ? m_logicalDevice.get() : m_context.getDevice(); }
+
+protected:
+	bool									m_useDeviceGroups;
+	bool									m_subsetAllocationAllowed;
+	VkMemoryAllocateFlagsInfoKHX			m_allocFlagsInfo;
+	deUint32								m_numPhysDevices;
+	VkPhysicalDeviceMemoryProperties		m_memoryProperties;
+
+private:
+	vk::Move<vk::VkInstance>		m_deviceGroupInstance;
+	vk::Move<vk::VkDevice>			m_logicalDevice;
+	de::MovePtr<vk::DeviceDriver>	m_deviceDriver;
+};
+
+void BaseAllocateTestInstance::createDeviceGroup (void)
+{
+	const tcu::CommandLine&							cmdLine					= m_context.getTestContext().getCommandLine();
+	const deUint32									devGroupIdx				= cmdLine.getVKDeviceGroupId() - 1;
+	const deUint32									physDeviceIdx			= cmdLine.getVKDeviceId() - 1;
+	const float										queuePriority			= 1.0f;
+	deUint32										queueFamilyIndex		= 0;
+	const std::vector<std::string>					requiredExtensions		(1, "VK_KHX_device_group_creation");
+	m_deviceGroupInstance													= createInstanceWithExtensions(m_context.getPlatformInterface(), requiredExtensions);
+	std::vector<VkPhysicalDeviceGroupPropertiesKHX>	devGroupProperties		= enumeratePhysicalDeviceGroupsKHX(m_context.getInstanceInterface(), m_deviceGroupInstance.get());
+	m_numPhysDevices														= devGroupProperties[devGroupIdx].physicalDeviceCount;
+	m_subsetAllocationAllowed												= devGroupProperties[devGroupIdx].subsetAllocation;
+	if (m_numPhysDevices < 2)
+		TCU_THROW(NotSupportedError, "Device group allocation tests not supported with 1 physical device");
+	std::vector<const char*>						deviceExtensions		(1, "VK_KHX_device_group");
+	VkDeviceGroupDeviceCreateInfoKHX				deviceGroupInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX,								//stype
+		DE_NULL,																			//pNext
+		devGroupProperties[devGroupIdx].physicalDeviceCount,								//physicalDeviceCount
+		devGroupProperties[devGroupIdx].physicalDevices										//physicalDevices
+	};
+	InstanceDriver									instance				(m_context.getPlatformInterface(), m_useDeviceGroups ? m_deviceGroupInstance.get() : m_context.getInstance());
+	const VkPhysicalDeviceFeatures					deviceFeatures	=		getPhysicalDeviceFeatures(instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
+
+	const std::vector<VkQueueFamilyProperties>		queueProps		=		getPhysicalDeviceQueueFamilyProperties(instance, devGroupProperties[devGroupIdx].physicalDevices[physDeviceIdx]);
+	for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
+	{
+		if (queueProps[queueNdx].queueFlags & VK_QUEUE_COMPUTE_BIT)
+			queueFamilyIndex = (deUint32)queueNdx;
+	}
+
+	VkDeviceQueueCreateInfo							queueInfo		=
+	{
+		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,		// VkStructureType					sType;
+		DE_NULL,										// const void*						pNext;
+		(VkDeviceQueueCreateFlags)0u,					// VkDeviceQueueCreateFlags			flags;
+		queueFamilyIndex,								// deUint32							queueFamilyIndex;
+		1u,												// deUint32							queueCount;
+		&queuePriority									// const float*						pQueuePriorities;
+	};
+
+	const VkDeviceCreateInfo						deviceInfo		=
+	{
+		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,			// VkStructureType					sType;
+		m_useDeviceGroups ? &deviceGroupInfo : DE_NULL,	// const void*						pNext;
+		(VkDeviceCreateFlags)0,							// VkDeviceCreateFlags				flags;
+		1u	,											// uint32_t							queueCreateInfoCount;
+		&queueInfo,										// const VkDeviceQueueCreateInfo*	pQueueCreateInfos;
+		0u,												// uint32_t							enabledLayerCount;
+		DE_NULL,										// const char* const*				ppEnabledLayerNames;
+		deUint32(deviceExtensions.size()),												// uint32_t                           enabledExtensionCount;
+		&deviceExtensions[0],										// const char* const*                 ppEnabledExtensionNames;
+		&deviceFeatures,								// const VkPhysicalDeviceFeatures*	pEnabledFeatures;
+	};
+	m_logicalDevice		= createDevice(instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx], &deviceInfo);
+	m_deviceDriver		= de::MovePtr<DeviceDriver>(new DeviceDriver(instance, *m_logicalDevice));
+	m_memoryProperties	= getPhysicalDeviceMemoryProperties(instance, deviceGroupInfo.pPhysicalDevices[physDeviceIdx]);
+}
+
+class AllocateFreeTestInstance : public BaseAllocateTestInstance
 {
 public:
 						AllocateFreeTestInstance		(Context& context, const TestConfig config)
-		: TestInstance			(context)
+		: BaseAllocateTestInstance			(context, config.useDeviceGroups)
 		, m_config				(config)
 		, m_result				(m_context.getTestContext().getLog())
 		, m_memoryTypeIndex		(0)
-		, m_memoryProperties	(getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()))
 	{
 		DE_ASSERT(!!m_config.memorySize != !!m_config.memoryPercentage);
 	}
@@ -105,14 +227,14 @@
 	const TestConfig						m_config;
 	tcu::ResultCollector					m_result;
 	deUint32								m_memoryTypeIndex;
-	const VkPhysicalDeviceMemoryProperties	m_memoryProperties;
 };
 
+
 tcu::TestStatus AllocateFreeTestInstance::iterate (void)
 {
 	TestLog&								log					= m_context.getTestContext().getLog();
-	const VkDevice							device				= m_context.getDevice();
-	const DeviceInterface&					vkd					= m_context.getDeviceInterface();
+	const VkDevice							device				= getDevice();
+	const DeviceInterface&					vkd					= getDeviceInterface();
 
 	DE_ASSERT(m_config.memoryAllocationCount <= MAX_ALLOCATION_COUNT);
 
@@ -153,63 +275,72 @@
 
 			try
 			{
-				if (m_config.order == TestConfig::ALLOC_FREE || m_config.order == TestConfig::ALLOC_REVERSE_FREE)
+				const deUint32 totalDeviceMaskCombinations = m_subsetAllocationAllowed ? (1 << m_numPhysDevices) - 1 : 1;
+				for (deUint32 deviceMask = 1; deviceMask <= totalDeviceMaskCombinations; deviceMask++)
 				{
-					for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
-					{
-						const VkMemoryAllocateInfo alloc =
-						{
-							VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,	// sType
-							DE_NULL,								// pNext
-							allocationSize,							// allocationSize
-							m_memoryTypeIndex						// memoryTypeIndex;
-						};
+					// Allocate on all physical devices if subset allocation is not allowed, do only once.
+					if (!m_subsetAllocationAllowed)
+						deviceMask = (1 << m_numPhysDevices) - 1;
+					m_allocFlagsInfo.deviceMask = deviceMask;
 
-						VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &memoryObjects[ndx]));
-
-						TCU_CHECK(!!memoryObjects[ndx]);
-					}
-
-					if (m_config.order == TestConfig::ALLOC_FREE)
+					if (m_config.order == TestConfig::ALLOC_FREE || m_config.order == TestConfig::ALLOC_REVERSE_FREE)
 					{
 						for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
 						{
-							const VkDeviceMemory mem = memoryObjects[memoryObjects.size() - 1 - ndx];
+							VkMemoryAllocateInfo alloc =
+							{
+								VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,				// sType
+								m_useDeviceGroups ? &m_allocFlagsInfo : DE_NULL,	// pNext
+								allocationSize,										// allocationSize
+								m_memoryTypeIndex									// memoryTypeIndex;
+							};
 
-							vkd.freeMemory(device, mem, (const VkAllocationCallbacks*)DE_NULL);
-							memoryObjects[memoryObjects.size() - 1 - ndx] = (VkDeviceMemory)0;
+							VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &memoryObjects[ndx]));
+
+							TCU_CHECK(!!memoryObjects[ndx]);
+						}
+
+						if (m_config.order == TestConfig::ALLOC_FREE)
+						{
+							for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
+							{
+								const VkDeviceMemory mem = memoryObjects[memoryObjects.size() - 1 - ndx];
+
+								vkd.freeMemory(device, mem, (const VkAllocationCallbacks*)DE_NULL);
+								memoryObjects[memoryObjects.size() - 1 - ndx] = (VkDeviceMemory)0;
+							}
+						}
+						else
+						{
+							for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
+							{
+								const VkDeviceMemory mem = memoryObjects[ndx];
+
+								vkd.freeMemory(device, mem, (const VkAllocationCallbacks*)DE_NULL);
+								memoryObjects[ndx] = (VkDeviceMemory)0;
+							}
 						}
 					}
 					else
 					{
 						for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
 						{
-							const VkDeviceMemory mem = memoryObjects[ndx];
+							const VkMemoryAllocateInfo alloc =
+							{
+								VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,				// sType
+								m_useDeviceGroups ? &m_allocFlagsInfo : DE_NULL,	// pNext
+								allocationSize,										// allocationSize
+								m_memoryTypeIndex									// memoryTypeIndex;
+							};
 
-							vkd.freeMemory(device, mem, (const VkAllocationCallbacks*)DE_NULL);
+							VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &memoryObjects[ndx]));
+							TCU_CHECK(!!memoryObjects[ndx]);
+
+							vkd.freeMemory(device, memoryObjects[ndx], (const VkAllocationCallbacks*)DE_NULL);
 							memoryObjects[ndx] = (VkDeviceMemory)0;
 						}
 					}
 				}
-				else
-				{
-					for (size_t ndx = 0; ndx < m_config.memoryAllocationCount; ndx++)
-					{
-						const VkMemoryAllocateInfo alloc =
-						{
-							VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,	// sType
-							DE_NULL,								// pNext
-							allocationSize,							// allocationSize
-							m_memoryTypeIndex						// memoryTypeIndex;
-						};
-
-						VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &memoryObjects[ndx]));
-						TCU_CHECK(!!memoryObjects[ndx]);
-
-						vkd.freeMemory(device, memoryObjects[ndx], (const VkAllocationCallbacks*)DE_NULL);
-						memoryObjects[ndx] = (VkDeviceMemory)0;
-					}
-				}
 			}
 			catch (...)
 			{
@@ -287,10 +418,10 @@
 	vector<MemoryObject>	objects;
 };
 
-class RandomAllocFreeTestInstance : public TestInstance
+class RandomAllocFreeTestInstance : public BaseAllocateTestInstance
 {
 public:
-								RandomAllocFreeTestInstance		(Context& context, deUint32 seed);
+								RandomAllocFreeTestInstance		(Context& context, TestConfigRandom config);
 								~RandomAllocFreeTestInstance	(void);
 
 	tcu::TestStatus				iterate							(void);
@@ -299,8 +430,10 @@
 	const size_t				m_opCount;
 	const size_t				m_allocSysMemSize;
 	const PlatformMemoryLimits	m_memoryLimits;
+	const deUint32				m_totalDeviceMaskCombinations;
 
 	deUint32					m_memoryObjectCount;
+	deUint32					m_currentDeviceMask;
 	size_t						m_opNdx;
 	de::Random					m_rng;
 	vector<Heap>				m_heaps;
@@ -308,45 +441,43 @@
 	VkDeviceSize				m_totalDeviceMem;
 };
 
-RandomAllocFreeTestInstance::RandomAllocFreeTestInstance (Context& context, deUint32 seed)
-	: TestInstance			(context)
-	, m_opCount				(128)
-	, m_allocSysMemSize		(computeDeviceMemorySystemMemFootprint(context.getDeviceInterface(), context.getDevice())
-							 + sizeof(MemoryObject))
-	, m_memoryLimits		(getMemoryLimits(context.getTestContext().getPlatform().getVulkanPlatform()))
-	, m_memoryObjectCount	(0)
-	, m_opNdx				(0)
-	, m_rng					(seed)
-	, m_totalSystemMem		(0)
-	, m_totalDeviceMem		(0)
+RandomAllocFreeTestInstance::RandomAllocFreeTestInstance (Context& context, TestConfigRandom config)
+	: BaseAllocateTestInstance	(context, config.useDeviceGroups)
+	, m_opCount						(128)
+	, m_allocSysMemSize				(computeDeviceMemorySystemMemFootprint(getDeviceInterface(), context.getDevice())
+									 + sizeof(MemoryObject))
+	, m_memoryLimits				(getMemoryLimits(context.getTestContext().getPlatform().getVulkanPlatform()))
+	, m_totalDeviceMaskCombinations	(m_subsetAllocationAllowed ? (1 << m_numPhysDevices) - 1 : 1)
+	, m_memoryObjectCount			(0)
+	, m_currentDeviceMask			(m_subsetAllocationAllowed ? 1 : (1 << m_numPhysDevices) - 1)
+	, m_opNdx						(0)
+	, m_rng							(config.seed)
+	, m_totalSystemMem				(0)
+	, m_totalDeviceMem				(0)
 {
-	const VkPhysicalDevice					physicalDevice		= context.getPhysicalDevice();
-	const InstanceInterface&				vki					= context.getInstanceInterface();
-	const VkPhysicalDeviceMemoryProperties	memoryProperties	= getPhysicalDeviceMemoryProperties(vki, physicalDevice);
+	TCU_CHECK(m_memoryProperties.memoryHeapCount <= 32);
+	TCU_CHECK(m_memoryProperties.memoryTypeCount <= 32);
 
-	TCU_CHECK(memoryProperties.memoryHeapCount <= 32);
-	TCU_CHECK(memoryProperties.memoryTypeCount <= 32);
+	m_heaps.resize(m_memoryProperties.memoryHeapCount);
 
-	m_heaps.resize(memoryProperties.memoryHeapCount);
-
-	for (deUint32 heapNdx = 0; heapNdx < memoryProperties.memoryHeapCount; heapNdx++)
+	for (deUint32 heapNdx = 0; heapNdx < m_memoryProperties.memoryHeapCount; heapNdx++)
 	{
-		m_heaps[heapNdx].heap			= memoryProperties.memoryHeaps[heapNdx];
+		m_heaps[heapNdx].heap			= m_memoryProperties.memoryHeaps[heapNdx];
 		m_heaps[heapNdx].memoryUsage	= 0;
 		m_heaps[heapNdx].maxMemoryUsage	= m_heaps[heapNdx].heap.size / 2; /* Use at maximum 50% of heap */
 
 		m_heaps[heapNdx].objects.reserve(100);
 	}
 
-	for (deUint32 memoryTypeNdx = 0; memoryTypeNdx < memoryProperties.memoryTypeCount; memoryTypeNdx++)
+	for (deUint32 memoryTypeNdx = 0; memoryTypeNdx < m_memoryProperties.memoryTypeCount; memoryTypeNdx++)
 	{
 		const MemoryType type =
 		{
 			memoryTypeNdx,
-			memoryProperties.memoryTypes[memoryTypeNdx]
+			m_memoryProperties.memoryTypes[memoryTypeNdx]
 		};
 
-		TCU_CHECK(type.type.heapIndex < memoryProperties.memoryHeapCount);
+		TCU_CHECK(type.type.heapIndex < m_memoryProperties.memoryHeapCount);
 
 		m_heaps[type.type.heapIndex].types.push_back(type);
 	}
@@ -354,8 +485,8 @@
 
 RandomAllocFreeTestInstance::~RandomAllocFreeTestInstance (void)
 {
-	const VkDevice							device				= m_context.getDevice();
-	const DeviceInterface&					vkd					= m_context.getDeviceInterface();
+	const VkDevice							device				= getDevice();
+	const DeviceInterface&					vkd					= getDeviceInterface();
 
 	for (deUint32 heapNdx = 0; heapNdx < (deUint32)m_heaps.size(); heapNdx++)
 	{
@@ -371,8 +502,8 @@
 
 tcu::TestStatus RandomAllocFreeTestInstance::iterate (void)
 {
-	const VkDevice			device			= m_context.getDevice();
-	const DeviceInterface&	vkd				= m_context.getDeviceInterface();
+	const VkDevice			device			= getDevice();
+	const DeviceInterface&	vkd				= getDeviceInterface();
 	TestLog&				log				= m_context.getTestContext().getLog();
 	const bool				isUMA			= m_memoryLimits.totalDeviceLocalMemory == 0;
 	const VkDeviceSize		usedSysMem		= isUMA ? (m_totalDeviceMem+m_totalSystemMem) : m_totalSystemMem;
@@ -407,7 +538,16 @@
 	if (m_opNdx >= m_opCount)
 	{
 		if (nonEmptyHeaps.empty())
-			return tcu::TestStatus::pass("Pass");
+		{
+			m_currentDeviceMask++;
+			if (m_currentDeviceMask > m_totalDeviceMaskCombinations)
+				return tcu::TestStatus::pass("Pass");
+			else
+			{
+				m_opNdx = 0;
+				return tcu::TestStatus::incomplete();
+			}
+		}
 		else
 			allocateMore = false;
 	}
@@ -452,12 +592,13 @@
 
 		heap.objects.push_back(object);
 
+		m_allocFlagsInfo.deviceMask = m_currentDeviceMask;
 		const VkMemoryAllocateInfo alloc =
 		{
-			VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,	// sType
-			DE_NULL,								// pNext
-			object.size,							// allocationSize
-			memoryType.index						// memoryTypeIndex;
+			VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,				// sType
+			m_useDeviceGroups ? &m_allocFlagsInfo : DE_NULL,	// pNext
+			object.size,										// allocationSize
+			memoryType.index									// memoryTypeIndex;
 		};
 
 		VK_CHECK(vkd.allocateMemory(device, &alloc, (const VkAllocationCallbacks*)DE_NULL, &heap.objects.back().memory));
@@ -498,9 +639,10 @@
 
 } // anonymous
 
-tcu::TestCaseGroup* createAllocationTests (tcu::TestContext& testCtx)
+tcu::TestCaseGroup* createAllocationTestsCommon (tcu::TestContext& testCtx, bool useDeviceGroups)
 {
-	de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "allocation", "Memory allocation tests."));
+	const char* name = useDeviceGroups ? "device_group_allocation" : "allocation";
+	de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, name, "Memory allocation tests."));
 
 	const VkDeviceSize	KiB	= 1024;
 	const VkDeviceSize	MiB	= 1024 * KiB;
@@ -543,7 +685,7 @@
 	};
 
 	{
-		de::MovePtr<tcu::TestCaseGroup>	basicGroup	(new tcu::TestCaseGroup(testCtx, "basic", "Basic memory allocation and free tests"));
+		de::MovePtr<tcu::TestCaseGroup>	basicGroup(new tcu::TestCaseGroup(testCtx, "basic", "Basic memory allocation and free tests"));
 
 		for (size_t allocationSizeNdx = 0; allocationSizeNdx < DE_LENGTH_OF_ARRAY(allocationSizes); allocationSizeNdx++)
 		{
@@ -569,7 +711,7 @@
 
 					config.memorySize				= allocationSize;
 					config.order					= order;
-
+					config.useDeviceGroups			= useDeviceGroups;
 					if (allocationCount == -1)
 					{
 						if (allocationSize < 4096)
@@ -619,6 +761,7 @@
 
 					config.memoryPercentage			= (float)allocationPercent / 100.0f;
 					config.order					= order;
+					config.useDeviceGroups			= useDeviceGroups;
 
 					if (allocationCount == -1)
 					{
@@ -652,9 +795,9 @@
 
 		for (deUint32 caseNdx = 0; caseNdx < caseCount; caseNdx++)
 		{
-			const deUint32 seed = deInt32Hash(caseNdx ^ 32480);
+			TestConfigRandom config(deInt32Hash(caseNdx ^ 32480), useDeviceGroups);
 
-			randomGroup->addChild(new InstanceFactory1<RandomAllocFreeTestInstance, deUint32>(testCtx, tcu::NODETYPE_SELF_VALIDATE, de::toString(caseNdx), "Random case", seed));
+			randomGroup->addChild(new InstanceFactory1<RandomAllocFreeTestInstance, TestConfigRandom>(testCtx, tcu::NODETYPE_SELF_VALIDATE, de::toString(caseNdx), "Random case", config));
 		}
 
 		group->addChild(randomGroup.release());
@@ -663,5 +806,15 @@
 	return group.release();
 }
 
+tcu::TestCaseGroup* createAllocationTests (tcu::TestContext& testCtx)
+{
+	return createAllocationTestsCommon(testCtx, false);
+}
+
+tcu::TestCaseGroup* createDeviceGroupAllocationTests (tcu::TestContext& testCtx)
+{
+	return createAllocationTestsCommon(testCtx, true);
+}
+
 } // memory
 } // vkt
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.hpp b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.hpp
index 19b9fee..b8903b4 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.hpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.hpp
@@ -31,7 +31,8 @@
 namespace memory
 {
 
-tcu::TestCaseGroup* createAllocationTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createAllocationTests				(tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createDeviceGroupAllocationTests	(tcu::TestContext& testCtx);
 
 } // memory
 } // vkt
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp
index e3ba1c0..d06258e 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp
@@ -42,11 +42,12 @@
 {
 	tcu::TestContext&	testCtx		= memoryTests->getTestContext();
 
-	memoryTests->addChild(createAllocationTests			(testCtx));
-	memoryTests->addChild(createMappingTests			(testCtx));
-	memoryTests->addChild(createPipelineBarrierTests	(testCtx));
-	memoryTests->addChild(createRequirementsTests		(testCtx));
-	memoryTests->addChild(createMemoryBindingTests		(testCtx));
+	memoryTests->addChild(createAllocationTests				(testCtx));
+	memoryTests->addChild(createDeviceGroupAllocationTests	(testCtx));
+	memoryTests->addChild(createMappingTests				(testCtx));
+	memoryTests->addChild(createPipelineBarrierTests		(testCtx));
+	memoryTests->addChild(createRequirementsTests			(testCtx));
+	memoryTests->addChild(createMemoryBindingTests			(testCtx));
 }
 
 } // anonymous
diff --git a/external/vulkancts/modules/vulkan/multiview/CMakeLists.txt b/external/vulkancts/modules/vulkan/multiview/CMakeLists.txt
new file mode 100644
index 0000000..95344dc
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/CMakeLists.txt
@@ -0,0 +1,18 @@
+include_directories(..)
+
+set(DEQP_VK_MULTI_VIEW_SRCS
+	vktMultiViewTests.hpp
+	vktMultiViewTests.cpp
+	vktMultiViewRenderTests.hpp
+	vktMultiViewRenderTests.cpp
+	vktMultiViewRenderUtil.hpp
+	vktMultiViewRenderUtil.cpp
+)
+
+set(DEQP_VK_MULTI_VIEW_LIBS
+	tcutil
+	vkutil
+)
+
+add_library(deqp-vk-multiview STATIC ${DEQP_VK_MULTI_VIEW_SRCS})
+target_link_libraries(deqp-vk-multiview ${DEQP_VK_MULTI_VIEW_LIBS})
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
new file mode 100644
index 0000000..e96f4b5
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
@@ -0,0 +1,1975 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief Vulkan Multi View Render Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktMultiViewRenderTests.hpp"
+#include "vktMultiViewRenderUtil.hpp"
+
+#include "vktTestCase.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkPlatform.hpp"
+#include "vkMemUtil.hpp"
+#include "vkImageUtil.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuResource.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuRGBA.hpp"
+
+#include "deSharedPtr.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+namespace
+{
+
+using namespace vk;
+using de::MovePtr;
+using de::UniquePtr;
+using std::vector;
+using std::map;
+using std::string;
+
+enum TestType
+{
+	TEST_TYPE_VIEW_MASK,
+	TEST_TYPE_VIEW_INDEX_IN_VERTEX,
+	TEST_TYPE_VIEW_INDEX_IN_FRAGMENT,
+	TEST_TYPE_VIEW_INDEX_IN_GEOMETRY,
+	TEST_TYPE_VIEW_INDEX_IN_TESELLATION,
+	TEST_TYPE_INPUT_ATTACHMENTS,
+	TEST_TYPE_INSTANCED_RENDERING,
+	TEST_TYPE_INPUT_RATE_INSTANCE,
+	TEST_TYPE_DRAW_INDIRECT,
+	TEST_TYPE_CLEAR_ATTACHMENTS,
+	TEST_TYPE_SECONDARY_CMD_BUFFER,
+	TEST_TYPE_LAST
+};
+
+struct TestParameters
+{
+	VkExtent3D			extent;
+	vector<deUint32>	viewMasks;
+	TestType			viewIndex;
+};
+
+class ImageAttachment
+{
+public:
+				ImageAttachment	(VkDevice logicalDevice, DeviceInterface& device, Allocator& allocator, const VkExtent3D extent, VkFormat colorFormat);
+	VkImageView	getImageView	(void) const
+	{
+		return *m_imageView;
+	}
+	VkImage		getImage		(void) const
+	{
+		return *m_image;
+	}
+private:
+	Move<VkImage>			m_image;
+	MovePtr<Allocation>		m_allocationImage;
+	Move<VkImageView>		m_imageView;
+};
+
+ImageAttachment::ImageAttachment (VkDevice logicalDevice, DeviceInterface& device, Allocator& allocator, const VkExtent3D extent, VkFormat colorFormat)
+{
+	const VkImageSubresourceRange	colorImageSubresourceRange	= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, extent.depth);
+	const VkImageCreateInfo			colorAttachmentImageInfo	= makeImageCreateInfo(VK_IMAGE_TYPE_2D, extent, colorFormat,
+																VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+	m_image							= createImage(device, logicalDevice, &colorAttachmentImageInfo);
+	m_allocationImage				= allocator.allocate(getImageMemoryRequirements(device, logicalDevice, *m_image), MemoryRequirement::Any);
+	VK_CHECK(device.bindImageMemory(logicalDevice, *m_image, m_allocationImage->getMemory(), m_allocationImage->getOffset()));
+	m_imageView						= makeImageView(device, logicalDevice, *m_image, VK_IMAGE_VIEW_TYPE_2D_ARRAY, colorFormat, colorImageSubresourceRange);
+}
+
+class MultiViewRenderTestInstance : public TestInstance
+{
+public:
+									MultiViewRenderTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	typedef de::SharedPtr<Unique<VkPipeline> >		PipelineSp;
+	typedef de::SharedPtr<Unique<VkShaderModule> >	ShaderModuleSP;
+
+	struct VertexData
+	{
+		VertexData (const tcu::Vec4 position_, const tcu::Vec4 color_)
+			: position	(position_)
+			, color		(color_)
+		{}
+		tcu::Vec4	position;
+		tcu::Vec4	color;
+	};
+
+	virtual tcu::TestStatus			iterate					(void);
+	virtual void					beforeDraw				(void);
+	virtual void					afterDraw				(void);
+	virtual void					draw					(const deUint32			subpassCount,
+															 VkRenderPass			renderPass,
+															 VkFramebuffer			frameBuffer,
+															 vector<PipelineSp>&	pipelines);
+	virtual void					createVertexData		(void);
+	TestParameters					fillMissingParameters	(const TestParameters&	parameters);
+	void							createVertexBuffer		(void);
+	void							createMultiViewDevices	(void);
+	void							createCommandBuffer		(void);
+	void							madeShaderModule		(map<VkShaderStageFlagBits,ShaderModuleSP>& shaderModule, vector<VkPipelineShaderStageCreateInfo>& shaderStageParams);
+	Move<VkPipeline>				makeGraphicsPipeline	(const VkRenderPass							renderPass,
+															 const VkPipelineLayout						pipelineLayout,
+															 const deUint32								pipelineShaderStageCount,
+															 const VkPipelineShaderStageCreateInfo*		pipelineShaderStageCreate,
+															 const deUint32								subpass,
+															 const VkVertexInputRate					vertexInputRate = VK_VERTEX_INPUT_RATE_VERTEX);
+	void							readImage				(VkImage image, const tcu::PixelBufferAccess& dst);
+	bool							checkImage				(tcu::ConstPixelBufferAccess& dst);
+	MovePtr<tcu::Texture2DArray>	imageData				(void);
+
+	const TestParameters			m_parameters;
+	VkFormat						m_colorFormat;
+	const deUint32					m_squareCount;
+	Move<VkDevice>					m_logicalDevice;
+	MovePtr<DeviceInterface>		m_device;
+	MovePtr<Allocator>				m_allocator;
+	deUint32						m_queueFamilyIndex;
+	VkQueue							m_queue;
+	vector<VertexData>				m_data;
+	Move<VkBuffer>					m_vertexBuffer;
+	MovePtr<Allocation>				m_allocationBuffer;
+	Move<VkCommandPool>				m_cmdPool;
+	Move<VkCommandBuffer>			m_cmdBuffer;
+	de::SharedPtr<ImageAttachment>	m_colorAttachment;
+	VkBool32						m_hasMultiDrawIndirect;
+};
+
+MultiViewRenderTestInstance::MultiViewRenderTestInstance (Context& context, const TestParameters& parameters)
+	: TestInstance		(context)
+	, m_parameters		(fillMissingParameters(parameters))
+	, m_colorFormat		(VK_FORMAT_R8G8B8A8_UNORM)
+	, m_squareCount		(4u)
+	,m_queueFamilyIndex	(0u)
+{
+	if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHX_multiview"))
+		throw tcu::NotSupportedError("VK_KHX_multiview is not supported");
+
+	createMultiViewDevices();
+
+	// Color attachment
+	m_colorAttachment = de::SharedPtr<ImageAttachment>(new ImageAttachment(*m_logicalDevice, *m_device, *m_allocator, m_parameters.extent, m_colorFormat));
+}
+
+tcu::TestStatus MultiViewRenderTestInstance::iterate (void)
+{
+	const deUint32								subpassCount				= static_cast<deUint32>(m_parameters.viewMasks.size());
+
+	// FrameBuffer & renderPass
+	Unique<VkRenderPass>						renderPass					(makeRenderPass (*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks));
+
+	vector<VkImageView>							attachments;
+	attachments.push_back(m_colorAttachment->getImageView());
+	Unique<VkFramebuffer>						frameBuffer					(makeFramebuffer(*m_device, *m_logicalDevice, *renderPass, attachments, m_parameters.extent.width, m_parameters.extent.height, 1u));
+
+	// pipelineLayout
+	Unique<VkPipelineLayout>					pipelineLayout				(makePipelineLayout(*m_device, *m_logicalDevice));
+
+	// pipelines
+	map<VkShaderStageFlagBits, ShaderModuleSP>	shaderModule;
+	vector<PipelineSp>							pipelines(subpassCount);
+	const VkVertexInputRate						vertexInputRate				= (TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex) ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX;
+
+	{
+		vector<VkPipelineShaderStageCreateInfo>	shaderStageParams;
+		madeShaderModule(shaderModule, shaderStageParams);
+		for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
+			pipelines[subpassNdx] = (PipelineSp(new Unique<VkPipeline>(makeGraphicsPipeline(*renderPass, *pipelineLayout, static_cast<deUint32>(shaderStageParams.size()), shaderStageParams.data(), subpassNdx, vertexInputRate))));
+	}
+
+	createCommandBuffer();
+	createVertexData();
+	createVertexBuffer();
+
+	draw(subpassCount, *renderPass, *frameBuffer, pipelines);
+
+	{
+		vector<deUint8>			pixelAccessData	(m_parameters.extent.width * m_parameters.extent.height * m_parameters.extent.depth * mapVkFormat(m_colorFormat).getPixelSize());
+		tcu::PixelBufferAccess	dst				(mapVkFormat(m_colorFormat), m_parameters.extent.width, m_parameters.extent.height, m_parameters.extent.depth, pixelAccessData.data());
+
+		readImage(m_colorAttachment->getImage(), dst);
+		if (!checkImage(dst))
+			return tcu::TestStatus::fail("Fail");
+	}
+
+	return tcu::TestStatus::pass("Pass");
+}
+
+void MultiViewRenderTestInstance::beforeDraw (void)
+{
+	const VkImageSubresourceRange	subresourceRange		=
+	{
+		VK_IMAGE_ASPECT_COLOR_BIT,	//VkImageAspectFlags	aspectMask;
+		0u,							//deUint32				baseMipLevel;
+		1u,							//deUint32				levelCount;
+		0u,							//deUint32				baseArrayLayer;
+		m_parameters.extent.depth,	//deUint32				layerCount;
+	};
+	imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(), subresourceRange, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT);
+
+	const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
+	m_device->cmdClearColorImage(*m_cmdBuffer, m_colorAttachment->getImage(),  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &renderPassClearValue.color, 1, &subresourceRange);
+
+	imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(), subresourceRange, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
+
+}
+
+void MultiViewRenderTestInstance::afterDraw (void)
+{
+	const VkImageSubresourceRange	subresourceRange		=
+	{
+		VK_IMAGE_ASPECT_COLOR_BIT,	//VkImageAspectFlags	aspectMask;
+		0u,							//deUint32				baseMipLevel;
+		1u,							//deUint32				levelCount;
+		0u,							//deUint32				baseArrayLayer;
+		m_parameters.extent.depth,	//deUint32				layerCount;
+	};
+
+	imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(),
+		subresourceRange, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
+}
+
+void MultiViewRenderTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue				renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize				vertexBufferOffset		= 0u;
+	const deUint32					drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+	m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		m_device->cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		for (deUint32 drawNdx = 0u; drawNdx < drawCountPerSubpass; ++drawNdx)
+			m_device->cmdDraw(*m_cmdBuffer, 4u, 1u, (drawNdx + subpassNdx % m_squareCount) * 4u, 0u);
+
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+void MultiViewRenderTestInstance::createVertexData (void)
+{
+	tcu::Vec4 color = tcu::Vec4(0.2f, 0.0f, 0.1f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.3f, 0.0f, 0.2f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 1.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.4f, 0.2f, 0.3f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 1.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 1.0f, 0.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.5f, 0.0f, 0.4f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 1.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 1.0f, 1.0f, 1.0f, 1.0f), color));
+}
+
+TestParameters MultiViewRenderTestInstance::fillMissingParameters (const TestParameters& parameters)
+{
+	if (!parameters.viewMasks.empty())
+		return parameters;
+	else
+	{
+		if (!de::contains(m_context.getDeviceExtensions().begin(), m_context.getDeviceExtensions().end(), "VK_KHX_multiview"))
+			throw tcu::NotSupportedError("VK_KHX_multiview is not supported");
+
+		const InstanceInterface&	instance		= m_context.getInstanceInterface();
+		const VkPhysicalDevice		physicalDevice	= m_context.getPhysicalDevice();
+
+		VkPhysicalDeviceMultiviewPropertiesKHX multiviewProperties =
+		{
+			VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHX,	// VkStructureType	sType;
+			DE_NULL,													// void*			pNext;
+			0u,															// deUint32			maxMultiviewViewCount;
+			0u															// deUint32			maxMultiviewInstanceIndex;
+		};
+
+		VkPhysicalDeviceProperties2KHR deviceProperties2;
+		deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
+		deviceProperties2.pNext = &multiviewProperties;
+
+		instance.getPhysicalDeviceProperties2KHR(physicalDevice, &deviceProperties2);
+
+		TestParameters newParameters = parameters;
+		newParameters.extent.depth = multiviewProperties.maxMultiviewViewCount;
+
+		vector<deUint32> viewMasks(multiviewProperties.maxMultiviewViewCount);
+		for (deUint32 i = 0; i < multiviewProperties.maxMultiviewViewCount; i++)
+			viewMasks[i] = 1 << i;
+		newParameters.viewMasks = viewMasks;
+
+		return newParameters;
+	}
+}
+
+void MultiViewRenderTestInstance::createVertexBuffer (void)
+{
+	const VkDeviceSize						vertexDataSize	= static_cast<VkDeviceSize>(deAlignSize(static_cast<size_t>( m_data.size() * sizeof(VertexData)),
+															static_cast<size_t>(m_context.getDeviceProperties().limits.nonCoherentAtomSize)));
+	const VkBufferCreateInfo				bufferInfo		= makeBufferCreateInfo(vertexDataSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+
+	m_vertexBuffer		= createBuffer(*m_device, *m_logicalDevice, &bufferInfo);
+	m_allocationBuffer	= m_allocator->allocate(getBufferMemoryRequirements(*m_device, *m_logicalDevice, *m_vertexBuffer),  MemoryRequirement::HostVisible);
+
+	// Init host buffer data
+	VK_CHECK(m_device->bindBufferMemory(*m_logicalDevice, *m_vertexBuffer, m_allocationBuffer->getMemory(), m_allocationBuffer->getOffset()));
+	deMemcpy(m_allocationBuffer->getHostPtr(), m_data.data(), static_cast<size_t>(vertexDataSize));
+	flushMappedMemoryRange(*m_device, *m_logicalDevice, m_allocationBuffer->getMemory(), m_allocationBuffer->getOffset(), static_cast<size_t>(vertexDataSize));
+}
+
+void MultiViewRenderTestInstance::createMultiViewDevices (void)
+{
+	const InstanceInterface&				instance				= m_context.getInstanceInterface();
+	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
+	const vector<VkQueueFamilyProperties>	queueFamilyProperties	= getPhysicalDeviceQueueFamilyProperties(instance, physicalDevice);
+
+	for (; m_queueFamilyIndex < queueFamilyProperties.size(); ++m_queueFamilyIndex)
+	{
+		if (queueFamilyProperties[m_queueFamilyIndex].queueFlags | VK_QUEUE_GRAPHICS_BIT )
+			break;
+	}
+
+	const float								queuePriorities			= 1.0f;
+	const VkDeviceQueueCreateInfo			queueInfo				=
+	{
+		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,	//VkStructureType			sType;
+		DE_NULL,									//const void*				pNext;
+		(VkDeviceQueueCreateFlags)0u,				//VkDeviceQueueCreateFlags	flags;
+		m_queueFamilyIndex,							//deUint32					queueFamilyIndex;
+		1u,											//deUint32					queueCount;
+		&queuePriorities							//const float*				pQueuePriorities;
+	};
+
+	VkPhysicalDeviceMultiviewFeaturesKHX	multiviewFeatures		=
+	{
+		VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHX,	// VkStructureType	sType;
+		DE_NULL,													// void*			pNext;
+		DE_FALSE,													// VkBool32			multiview;
+		DE_FALSE,													// VkBool32			multiviewGeometryShader;
+		DE_FALSE,													// VkBool32			multiviewTessellationShader;
+	};
+
+	VkPhysicalDeviceFeatures2KHR			enabledFeatures;
+	enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR;
+	enabledFeatures.pNext = &multiviewFeatures;
+
+	instance.getPhysicalDeviceFeatures2KHR(physicalDevice, &enabledFeatures);
+
+	if (!multiviewFeatures.multiview)
+		TCU_THROW(NotSupportedError, "MultiView not supported");
+
+	bool requiresGeomShader = (TEST_TYPE_VIEW_INDEX_IN_GEOMETRY == m_parameters.viewIndex) ||
+								(TEST_TYPE_INPUT_ATTACHMENTS == m_parameters.viewIndex) ||
+								(TEST_TYPE_SECONDARY_CMD_BUFFER == m_parameters.viewIndex) ||
+								(TEST_TYPE_CLEAR_ATTACHMENTS == m_parameters.viewIndex);
+
+	if (requiresGeomShader && !multiviewFeatures.multiviewGeometryShader)
+		TCU_THROW(NotSupportedError, "Geometry shader is not supported");
+
+	if (TEST_TYPE_VIEW_INDEX_IN_TESELLATION == m_parameters.viewIndex && !multiviewFeatures.multiviewTessellationShader)
+		TCU_THROW(NotSupportedError, "Tessellation shader is not supported");
+
+	VkPhysicalDeviceMultiviewPropertiesKHX	multiviewProperties		=
+	{
+		VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHX,	//VkStructureType	sType;
+		DE_NULL,													//void*				pNext;
+		0u,															//deUint32			maxMultiviewViewCount;
+		0u															//deUint32			maxMultiviewInstanceIndex;
+	};
+
+	VkPhysicalDeviceProperties2KHR			propertiesDeviceProperties2;
+	propertiesDeviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR;
+	propertiesDeviceProperties2.pNext = &multiviewProperties;
+
+	instance.getPhysicalDeviceProperties2KHR(physicalDevice, &propertiesDeviceProperties2);
+
+	if (multiviewProperties.maxMultiviewViewCount < 6u)
+		TCU_FAIL("maxMultiviewViewCount below min value");
+
+	if (multiviewProperties.maxMultiviewInstanceIndex < 134217727u) //134217727u = 2^27 -1
+		TCU_FAIL("maxMultiviewInstanceIndex below min value");
+
+	if (multiviewProperties.maxMultiviewViewCount <m_parameters.extent.depth)
+		TCU_THROW(NotSupportedError, "Limit MaxMultiviewViewCount to small to run this test");
+
+	m_hasMultiDrawIndirect = enabledFeatures.features.multiDrawIndirect;
+
+	{
+		const vector<string>&			deviceExtensions	= m_context.getDeviceExtensions();
+		vector<const char*>				charDevExtensions;
+
+		for (std::size_t ndx = 0; ndx < deviceExtensions.size(); ++ndx)
+			charDevExtensions.push_back(deviceExtensions[ndx].c_str());
+
+		const VkDeviceCreateInfo		deviceInfo			=
+		{
+			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,							//VkStructureType					sType;
+			&enabledFeatures,												//const void*						pNext;
+			0u,																//VkDeviceCreateFlags				flags;
+			1u,																//deUint32							queueCreateInfoCount;
+			&queueInfo,														//const VkDeviceQueueCreateInfo*	pQueueCreateInfos;
+			0u,																//deUint32							enabledLayerCount;
+			DE_NULL,														//const char* const*				ppEnabledLayerNames;
+			static_cast<deUint32>(deviceExtensions.size()),					//deUint32							enabledExtensionCount;
+			charDevExtensions.empty() ? DE_NULL : &charDevExtensions[0],	//const char* const*				pEnabledExtensionNames;
+			DE_NULL															//const VkPhysicalDeviceFeatures*	pEnabledFeatures;
+		};
+
+		m_logicalDevice	= createDevice(instance, physicalDevice, &deviceInfo);
+		m_device	= MovePtr<DeviceDriver>(new DeviceDriver(instance, *m_logicalDevice));
+		m_allocator		= MovePtr<Allocator>(new SimpleAllocator(*m_device, *m_logicalDevice, getPhysicalDeviceMemoryProperties(instance, physicalDevice)));
+		m_device->getDeviceQueue(*m_logicalDevice, m_queueFamilyIndex, 0u, &m_queue);
+	}
+}
+
+void MultiViewRenderTestInstance::createCommandBuffer (void)
+{
+	// cmdPool
+	{
+		const VkCommandPoolCreateInfo cmdPoolParams =
+		{
+			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,			// VkStructureType		sType;
+			DE_NULL,											// const void*			pNext;
+			VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,	// VkCmdPoolCreateFlags	flags;
+			m_queueFamilyIndex,									// deUint32				queueFamilyIndex;
+		};
+		m_cmdPool = createCommandPool(*m_device, *m_logicalDevice, &cmdPoolParams);
+	}
+
+	// cmdBuffer
+	{
+		const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
+		{
+			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
+			DE_NULL,										// const void*				pNext;
+			*m_cmdPool,										// VkCommandPool			commandPool;
+			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel		level;
+			1u,												// deUint32					bufferCount;
+		};
+		m_cmdBuffer	= allocateCommandBuffer(*m_device, *m_logicalDevice, &cmdBufferAllocateInfo);
+	}
+}
+
+void MultiViewRenderTestInstance::madeShaderModule (map<VkShaderStageFlagBits, ShaderModuleSP>& shaderModule, vector<VkPipelineShaderStageCreateInfo>& shaderStageParams)
+{
+	// create shaders modules
+	switch (m_parameters.viewIndex)
+	{
+		case TEST_TYPE_VIEW_MASK:
+		case TEST_TYPE_VIEW_INDEX_IN_VERTEX:
+		case TEST_TYPE_VIEW_INDEX_IN_FRAGMENT:
+		case TEST_TYPE_INSTANCED_RENDERING:
+		case TEST_TYPE_INPUT_RATE_INSTANCE:
+		case TEST_TYPE_DRAW_INDIRECT:
+			shaderModule[VK_SHADER_STAGE_VERTEX_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("vertex"), 0))));
+			shaderModule[VK_SHADER_STAGE_FRAGMENT_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("fragment"), 0))));
+			break;
+		case TEST_TYPE_VIEW_INDEX_IN_GEOMETRY:
+		case TEST_TYPE_INPUT_ATTACHMENTS:
+		case TEST_TYPE_CLEAR_ATTACHMENTS:
+		case TEST_TYPE_SECONDARY_CMD_BUFFER:
+			shaderModule[VK_SHADER_STAGE_VERTEX_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("vertex"), 0))));
+			shaderModule[VK_SHADER_STAGE_GEOMETRY_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("geometry"), 0))));
+			shaderModule[VK_SHADER_STAGE_FRAGMENT_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("fragment"), 0))));
+			break;
+		case TEST_TYPE_VIEW_INDEX_IN_TESELLATION:
+			shaderModule[VK_SHADER_STAGE_VERTEX_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("vertex"), 0))));
+			shaderModule[VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT]		= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("tessellation_control"), 0))));
+			shaderModule[VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT]	= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("tessellation_evaluation"), 0))));
+			shaderModule[VK_SHADER_STAGE_FRAGMENT_BIT]					= (ShaderModuleSP(new Unique<VkShaderModule>(createShaderModule(*m_device, *m_logicalDevice, m_context.getBinaryCollection().get("fragment"), 0))));
+			break;
+		default:
+			DE_ASSERT(0);
+		break;
+	};
+
+	VkPipelineShaderStageCreateInfo	pipelineShaderStage	=
+	{
+			VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
+			DE_NULL,												// const void*							pNext;
+			(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags		flags;
+			(VkShaderStageFlagBits)0,								// VkShaderStageFlagBits				stage;
+			(VkShaderModule)0,										// VkShaderModule						module;
+			"main",													// const char*							pName;
+			(const VkSpecializationInfo*)DE_NULL,					// const VkSpecializationInfo*			pSpecializationInfo;
+	};
+
+	for (map<VkShaderStageFlagBits, ShaderModuleSP>::iterator it=shaderModule.begin(); it!=shaderModule.end(); ++it)
+	{
+		pipelineShaderStage.stage	= it->first;
+		pipelineShaderStage.module	= **it->second;
+		shaderStageParams.push_back(pipelineShaderStage);
+	}
+}
+
+Move<VkPipeline> MultiViewRenderTestInstance::makeGraphicsPipeline (const VkRenderPass							renderPass,
+																	const VkPipelineLayout						pipelineLayout,
+																	const deUint32								pipelineShaderStageCount,
+																	const VkPipelineShaderStageCreateInfo*		pipelineShaderStageCreate,
+																	const deUint32								subpass,
+																	const VkVertexInputRate						vertexInputRate)
+{
+	const VkVertexInputBindingDescription			vertexInputBindingDescription		=
+	{
+		0u,											// binding;
+		static_cast<deUint32>(sizeof(VertexData)),	// stride;
+		vertexInputRate								// inputRate
+	};
+
+	const VkVertexInputAttributeDescription			vertexInputAttributeDescriptions[]	=
+	{
+		{
+			0u,
+			0u,
+			VK_FORMAT_R32G32B32A32_SFLOAT,
+			0u
+		},	// VertexElementData::position
+		{
+			1u,
+			0u,
+			VK_FORMAT_R32G32B32A32_SFLOAT,
+			static_cast<deUint32>(sizeof(tcu::Vec4))
+		},	// VertexElementData::color
+	};
+
+	const VkPipelineVertexInputStateCreateInfo		vertexInputStateParams				=
+	{																	// sType;
+		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// pNext;
+		NULL,															// flags;
+		0u,																// vertexBindingDescriptionCount;
+		1u,																// pVertexBindingDescriptions;
+		&vertexInputBindingDescription,									// vertexAttributeDescriptionCount;
+		2u,																// pVertexAttributeDescriptions;
+		vertexInputAttributeDescriptions
+	};
+
+
+	const VkPipelineInputAssemblyStateCreateInfo	inputAssemblyStateParams			=
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,																				// VkStructureType							sType;
+		DE_NULL,																																	// const void*								pNext;
+		0u,																																			// VkPipelineInputAssemblyStateCreateFlags	flags;
+		(TEST_TYPE_VIEW_INDEX_IN_TESELLATION == m_parameters.viewIndex) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,	// VkPrimitiveTopology						topology;
+		VK_FALSE,																																	// VkBool32									primitiveRestartEnable;
+	};
+
+	const VkViewport								viewport						=
+	{
+		0.0f,								// float	originX;
+		0.0f,								// float	originY;
+		(float)m_parameters.extent.width,	// float	width;
+		(float)m_parameters.extent.height,	// float	height;
+		0.0f,								// float	minDepth;
+		1.0f								// float	maxDepth;
+	};
+
+	const VkRect2D									scissor							=
+	{
+		{ 0, 0 },													// VkOffset2D	offset;
+		{ m_parameters.extent.width, m_parameters.extent.height }	// VkExtent2D	extent;
+	};
+
+	const VkPipelineViewportStateCreateInfo		viewportStateParams						=
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,	// VkStructureType						sType;
+		DE_NULL,												// const void*							pNext;
+		0u,														// VkPipelineViewportStateCreateFlags	flags;
+		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;
+		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		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;
+	};
+
+	VkPipelineDepthStencilStateCreateInfo			depthStencilStateParams				=
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
+		DE_NULL,													// const void*								pNext;
+		0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
+		VK_TRUE,													// VkBool32									depthTestEnable;
+		VK_TRUE,													// VkBool32									depthWriteEnable;
+		VK_COMPARE_OP_LESS_OR_EQUAL,								// VkCompareOp								depthCompareOp;
+		VK_FALSE,													// VkBool32									depthBoundsTestEnable;
+		VK_FALSE,													// VkBool32									stencilTestEnable;
+		// VkStencilOpState front;
+		{
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	failOp;
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	passOp;
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	depthFailOp;
+			VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
+			0u,						// deUint32		compareMask;
+			0u,						// deUint32		writeMask;
+			0u,						// deUint32		reference;
+		},
+		// VkStencilOpState back;
+		{
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	failOp;
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	passOp;
+			VK_STENCIL_OP_KEEP,		// VkStencilOp	depthFailOp;
+			VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
+			0u,						// deUint32		compareMask;
+			0u,						// deUint32		writeMask;
+			0u,						// deUint32		reference;
+		},
+		0.0f,	// float	minDepthBounds;
+		1.0f,	// float	maxDepthBounds;
+	};
+
+	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_ONE,					// VkBlendFactor			srcAlphaBlendFactor;
+		VK_BLEND_FACTOR_ONE,					// VkBlendFactor			dstAlphaBlendFactor;
+		VK_BLEND_OP_ADD,						// VkBlendOp				alphaBlendOp;
+		VK_COLOR_COMPONENT_R_BIT |				// VkColorComponentFlags	colorWriteMask;
+		VK_COLOR_COMPONENT_G_BIT |
+		VK_COLOR_COMPONENT_B_BIT |
+		VK_COLOR_COMPONENT_A_BIT
+	};
+
+	const VkPipelineColorBlendStateCreateInfo		colorBlendStateParams				=
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
+		DE_NULL,													// const void*									pNext;
+		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										blendConst[4];
+	};
+
+	VkPipelineTessellationStateCreateInfo			TessellationState					=
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,	// VkStructureType							sType;
+		DE_NULL,													// const void*								pNext;
+		(VkPipelineTessellationStateCreateFlags)0,					// VkPipelineTessellationStateCreateFlags	flags;
+		4u															// deUint32									patchControlPoints;
+	};
+
+	const VkGraphicsPipelineCreateInfo				graphicsPipelineParams				=
+	{
+		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,												// VkStructureType									sType;
+		DE_NULL,																						// const void*										pNext;
+		(VkPipelineCreateFlags)0u,																		// VkPipelineCreateFlags							flags;
+		pipelineShaderStageCount,																		// deUint32											stageCount;
+		pipelineShaderStageCreate,																		// const VkPipelineShaderStageCreateInfo*			pStages;
+		&vertexInputStateParams,																		// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
+		&inputAssemblyStateParams,																		// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
+		(TEST_TYPE_VIEW_INDEX_IN_TESELLATION == m_parameters.viewIndex)? &TessellationState : DE_NULL,	// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
+		&viewportStateParams,																			// const VkPipelineViewportStateCreateInfo*			pViewportState;
+		&rasterStateParams,																				// const VkPipelineRasterizationStateCreateInfo*	pRasterState;
+		&multisampleStateParams,																		// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
+		&depthStencilStateParams,																		// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
+		&colorBlendStateParams,																			// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
+		(const VkPipelineDynamicStateCreateInfo*)DE_NULL,												// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
+		pipelineLayout,																					// VkPipelineLayout									layout;
+		renderPass,																						// VkRenderPass										renderPass;
+		subpass,																						// deUint32											subpass;
+		0u,																								// VkPipeline										basePipelineHandle;
+		0,																								// deInt32											basePipelineIndex;
+	};
+
+	return createGraphicsPipeline(*m_device, *m_logicalDevice, DE_NULL, &graphicsPipelineParams);
+}
+
+void MultiViewRenderTestInstance::readImage (VkImage image, const tcu::PixelBufferAccess& dst)
+{
+	Move<VkBuffer>				buffer;
+	MovePtr<Allocation>			bufferAlloc;
+	const VkDeviceSize			pixelDataSize	= dst.getWidth() * dst.getHeight() * dst.getDepth() * mapVkFormat(m_colorFormat).getPixelSize();
+
+	// Create destination buffer
+	{
+		const VkBufferCreateInfo bufferParams =
+		{
+			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType		sType;
+			DE_NULL,								// const void*			pNext;
+			0u,										// VkBufferCreateFlags	flags;
+			pixelDataSize,							// VkDeviceSize			size;
+			VK_BUFFER_USAGE_TRANSFER_DST_BIT,		// VkBufferUsageFlags	usage;
+			VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode		sharingMode;
+			1u,										// deUint32				queueFamilyIndexCount;
+			&m_queueFamilyIndex,					// const deUint32*		pQueueFamilyIndices;
+		};
+
+		buffer		= createBuffer(*m_device, *m_logicalDevice, &bufferParams);
+		bufferAlloc	= m_allocator->allocate(getBufferMemoryRequirements(*m_device, *m_logicalDevice, *buffer), MemoryRequirement::HostVisible);
+		VK_CHECK(m_device->bindBufferMemory(*m_logicalDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
+
+		deMemset(bufferAlloc->getHostPtr(), 0, static_cast<size_t>(pixelDataSize));
+		flushMappedMemoryRange(*m_device, *m_logicalDevice, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
+	}
+
+	const VkBufferMemoryBarrier	bufferBarrier	=
+	{
+		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
+		DE_NULL,									// const void*		pNext;
+		VK_ACCESS_TRANSFER_WRITE_BIT,				// VkAccessFlags	srcAccessMask;
+		VK_ACCESS_HOST_READ_BIT,					// VkAccessFlags	dstAccessMask;
+		VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
+		VK_QUEUE_FAMILY_IGNORED,					// deUint32			dstQueueFamilyIndex;
+		*buffer,									// VkBuffer			buffer;
+		0u,											// VkDeviceSize		offset;
+		pixelDataSize								// VkDeviceSize		size;
+	};
+
+	// Copy image to buffer
+	const VkImageAspectFlags	aspect			= getAspectFlags(dst.getFormat());
+	const VkBufferImageCopy		copyRegion		=
+	{
+		0u,										// VkDeviceSize				bufferOffset;
+		(deUint32)dst.getWidth(),				// deUint32					bufferRowLength;
+		(deUint32)dst.getHeight(),				// deUint32					bufferImageHeight;
+		{
+			aspect,								// VkImageAspectFlags		aspect;
+			0u,									// deUint32					mipLevel;
+			0u,									// deUint32					baseArrayLayer;
+			m_parameters.extent.depth,			// deUint32					layerCount;
+		},										// VkImageSubresourceLayers	imageSubresource;
+		{ 0, 0, 0 },							// VkOffset3D				imageOffset;
+		{ m_parameters.extent.width, m_parameters.extent.height, 1u }	// VkExtent3D				imageExtent;
+	};
+
+	beginCommandBuffer (*m_device, *m_cmdBuffer);
+	{
+		VkImageSubresourceRange	subresourceRange	=
+		{
+			aspect,						// VkImageAspectFlags	aspectMask;
+			0u,							// deUint32				baseMipLevel;
+			1u,							// deUint32				mipLevels;
+			0u,							// deUint32				baseArraySlice;
+			m_parameters.extent.depth,	// deUint32				arraySize;
+		};
+
+		imageBarrier (*m_device, *m_cmdBuffer, image, subresourceRange, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+						VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+
+		m_device->cmdCopyImageToBuffer(*m_cmdBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1u, &copyRegion);
+		m_device->cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0u, DE_NULL);
+	}
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+
+	// Read buffer data
+	invalidateMappedMemoryRange(*m_device, *m_logicalDevice, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
+	tcu::copy(dst, tcu::ConstPixelBufferAccess(dst.getFormat(), dst.getSize(), bufferAlloc->getHostPtr()));
+}
+
+bool MultiViewRenderTestInstance::checkImage (tcu::ConstPixelBufferAccess& renderedFrame)
+{
+	const MovePtr<tcu::Texture2DArray>	referenceFrame	= imageData();
+
+	if (tcu::floatThresholdCompare(m_context.getTestContext().getLog(), "Result", "Image comparison result", referenceFrame->getLevel(0), renderedFrame, tcu::Vec4(0.01f), tcu::COMPARE_LOG_ON_ERROR))
+		return true;
+
+	for (deUint32 layerNdx = 0u; layerNdx < m_parameters.extent.depth; layerNdx++)
+	{
+		tcu::ConstPixelBufferAccess ref (mapVkFormat(m_colorFormat), m_parameters.extent.width, m_parameters.extent.height, 1u, referenceFrame->getLevel(0).getPixelPtr(0, 0, layerNdx));
+		tcu::ConstPixelBufferAccess dst (mapVkFormat(m_colorFormat), m_parameters.extent.width, m_parameters.extent.height, 1u, renderedFrame.getPixelPtr(0 ,0, layerNdx));
+		tcu::floatThresholdCompare(m_context.getTestContext().getLog(), "Result", "Image comparison result", ref, dst, tcu::Vec4(0.01f), tcu::COMPARE_LOG_EVERYTHING);
+	}
+
+	return false;
+}
+
+MovePtr<tcu::Texture2DArray> MultiViewRenderTestInstance::imageData (void)
+{
+	MovePtr<tcu::Texture2DArray>	referenceFrame	= MovePtr<tcu::Texture2DArray>(new tcu::Texture2DArray(mapVkFormat(m_colorFormat), m_parameters.extent.width, m_parameters.extent.height, m_parameters.extent.depth));
+	const deUint32					subpassCount	= static_cast<deUint32>(m_parameters.viewMasks.size());
+	referenceFrame->allocLevel(0);
+
+	deMemset (referenceFrame->getLevel(0).getDataPtr(), 0, m_parameters.extent.width * m_parameters.extent.height * m_parameters.extent.depth* mapVkFormat(m_colorFormat).getPixelSize());
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		int			layerNdx	= 0;
+		deUint32	mask		= m_parameters.viewMasks[subpassNdx];
+
+		while (mask > 0u)
+		{
+			int colorNdx	= 0;
+			if (mask & 1u)
+			{
+				if (TEST_TYPE_CLEAR_ATTACHMENTS == m_parameters.viewIndex)
+				{
+					struct ColorDataRGBA
+					{
+						deUint8	r;
+						deUint8	g;
+						deUint8	b;
+						deUint8	a;
+					};
+
+					ColorDataRGBA	clear		=
+					{
+						tcu::floatToU8 (1.0f),
+						tcu::floatToU8 (0.0f),
+						tcu::floatToU8 (0.0f),
+						tcu::floatToU8 (1.0f)
+					};
+
+					ColorDataRGBA*	dataSrc		= (ColorDataRGBA*)referenceFrame->getLevel(0).getPixelPtr(0, 0, layerNdx);
+					ColorDataRGBA*	dataDes		= dataSrc + 1;
+					deUint32		copySize	= 1u;
+					deUint32		layerSize	= m_parameters.extent.width * m_parameters.extent.height - copySize;
+					deMemcpy(dataSrc, &clear, sizeof(ColorDataRGBA));
+
+					while (layerSize > 0)
+					{
+						deMemcpy(dataDes, dataSrc, copySize * sizeof(ColorDataRGBA));
+						dataDes = dataDes + copySize;
+						layerSize = layerSize - copySize;
+						copySize = 2u * copySize;
+						if (copySize >= layerSize)
+							copySize = layerSize;
+					}
+				}
+
+				const deUint32 subpassQuarterNdx = subpassNdx % m_squareCount;
+				if (subpassQuarterNdx == 0u || TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+				{
+					const tcu::Vec4 color = (TEST_TYPE_VIEW_MASK == m_parameters.viewIndex) ? m_data[colorNdx].color :
+											(TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex) ? m_data[0].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.10f, 0.0) :
+											(TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex) ? m_data[colorNdx / 4].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.10f, 0.0) :
+											m_data[colorNdx].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.0, 0.0);
+					for (deUint32 y = 0u; y < m_parameters.extent.height/2u; ++y)
+					for (deUint32 x = 0u; x < m_parameters.extent.width/2u; ++x)
+							referenceFrame->getLevel(0).setPixel(color, x, y, layerNdx);
+				}
+
+				colorNdx += 4;
+				if (subpassQuarterNdx == 1u || subpassCount == 1u || TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+				{
+					const tcu::Vec4 color = (TEST_TYPE_VIEW_MASK == m_parameters.viewIndex) ? m_data[colorNdx].color :
+											(TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex) ? m_data[0].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.20f, 0.0) :
+											(TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex) ? m_data[colorNdx / 4].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.20f, 0.0) :
+											m_data[colorNdx].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.0, 0.0);
+					for (deUint32 y = m_parameters.extent.height/2u; y < m_parameters.extent.height; ++y)
+					for (deUint32 x = 0u; x < m_parameters.extent.width/2u; ++x)
+						referenceFrame->getLevel(0).setPixel(color , x, y, layerNdx);
+				}
+
+				colorNdx += 4;
+				if (subpassQuarterNdx == 2u || subpassCount == 1u || TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+				{
+					const tcu::Vec4 color = (TEST_TYPE_VIEW_MASK == m_parameters.viewIndex) ? m_data[colorNdx].color :
+											(TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex) ? m_data[0].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.30f, 0.0) :
+											(TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex) ? m_data[colorNdx / 4].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.30f, 0.0) :
+											m_data[colorNdx].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.0, 0.0);
+					for (deUint32 y = 0u; y < m_parameters.extent.height/2u; ++y)
+					for (deUint32 x =  m_parameters.extent.width/2u; x < m_parameters.extent.width; ++x)
+							referenceFrame->getLevel(0).setPixel(color, x, y, layerNdx);
+				}
+
+				colorNdx += 4;
+				if (subpassQuarterNdx == 3u || subpassCount == 1u || TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+				{
+					const tcu::Vec4 color = (TEST_TYPE_VIEW_MASK == m_parameters.viewIndex) ? m_data[colorNdx].color :
+											(TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex) ? m_data[0].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f,  0.40f, 0.0) :
+											(TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex) ? m_data[colorNdx / 4].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.40f, 0.0) :
+											m_data[colorNdx].color + tcu::Vec4(0.0, static_cast<float>(layerNdx) * 0.10f, 0.0, 0.0);
+					for (deUint32 y =  m_parameters.extent.height/2u; y < m_parameters.extent.height; ++y)
+					for (deUint32 x =  m_parameters.extent.width/2u; x < m_parameters.extent.width; ++x)
+							referenceFrame->getLevel(0).setPixel(color, x, y, layerNdx);
+				}
+
+				if (TEST_TYPE_CLEAR_ATTACHMENTS == m_parameters.viewIndex)
+				{
+					const tcu::Vec4	color	(0.0f, 0.0f, 1.0f, 1.0f);
+					const int		maxY	= static_cast<int>(static_cast<float>(m_parameters.extent.height) * 0.75f);
+					const int		maxX	= static_cast<int>(static_cast<float>(m_parameters.extent.width) * 0.75f);
+					for (int y = static_cast<int>(m_parameters.extent.height / 4u); y < maxY; ++y)
+					for (int x = static_cast<int>(m_parameters.extent.width / 4u); x < maxX; ++x)
+						referenceFrame->getLevel(0).setPixel(color, x, y, layerNdx);
+				}
+			}
+
+			mask = mask >> 1;
+			++layerNdx;
+		}
+	}
+	return referenceFrame;
+}
+
+class MultiViewAttachmentsTestInstance : public MultiViewRenderTestInstance
+{
+public:
+						MultiViewAttachmentsTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	tcu::TestStatus		iterate								(void);
+	void				beforeDraw							(void);
+	void				setImageData						(VkImage image);
+	de::SharedPtr<ImageAttachment>	m_inputAttachment;
+	Move<VkDescriptorPool>			m_descriptorPool;
+	Move<VkDescriptorSet>			m_descriptorSet;
+	Move<VkDescriptorSetLayout>		m_descriptorSetLayout;
+	Move<VkPipelineLayout>			m_pipelineLayout;
+
+};
+
+MultiViewAttachmentsTestInstance::MultiViewAttachmentsTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+
+tcu::TestStatus MultiViewAttachmentsTestInstance::iterate (void)
+{
+	const deUint32								subpassCount			= static_cast<deUint32>(m_parameters.viewMasks.size());
+	// All color attachment
+	m_colorAttachment	= de::SharedPtr<ImageAttachment>(new ImageAttachment(*m_logicalDevice, *m_device, *m_allocator, m_parameters.extent, m_colorFormat));
+	m_inputAttachment	= de::SharedPtr<ImageAttachment>(new ImageAttachment(*m_logicalDevice, *m_device, *m_allocator, m_parameters.extent, m_colorFormat));
+
+	// FrameBuffer & renderPass
+	Unique<VkRenderPass>						renderPass				(makeRenderPassWithAttachments(*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks));
+
+	vector<VkImageView>							attachments;
+	attachments.push_back(m_colorAttachment->getImageView());
+	attachments.push_back(m_inputAttachment->getImageView());
+	Unique<VkFramebuffer>						frameBuffer				(makeFramebuffer(*m_device, *m_logicalDevice, *renderPass, attachments, m_parameters.extent.width, m_parameters.extent.height, 1u));
+
+	// pipelineLayout
+	m_descriptorSetLayout	= makeDescriptorSetLayout(*m_device, *m_logicalDevice);
+	m_pipelineLayout		= makePipelineLayout(*m_device, *m_logicalDevice, &m_descriptorSetLayout.get());
+
+	// pipelines
+	map<VkShaderStageFlagBits, ShaderModuleSP>	shaderModule;
+	vector<PipelineSp>							pipelines(subpassCount);
+
+	{
+		vector<VkPipelineShaderStageCreateInfo>	shaderStageParams;
+		madeShaderModule(shaderModule, shaderStageParams);
+		for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
+			pipelines[subpassNdx] = (PipelineSp(new Unique<VkPipeline>(makeGraphicsPipeline(*renderPass, *m_pipelineLayout, static_cast<deUint32>(shaderStageParams.size()), shaderStageParams.data(), subpassNdx))));
+	}
+
+	createVertexData();
+	createVertexBuffer();
+
+	createCommandBuffer();
+	setImageData(m_inputAttachment->getImage());
+	draw(subpassCount, *renderPass, *frameBuffer, pipelines);
+
+	{
+		vector<deUint8>			pixelAccessData	(m_parameters.extent.width * m_parameters.extent.height * m_parameters.extent.depth * mapVkFormat(m_colorFormat).getPixelSize());
+		tcu::PixelBufferAccess	dst				(mapVkFormat(m_colorFormat), m_parameters.extent.width, m_parameters.extent.height, m_parameters.extent.depth, pixelAccessData.data());
+
+		readImage (m_colorAttachment->getImage(), dst);
+		if (!checkImage(dst))
+			return tcu::TestStatus::fail("Fail");
+	}
+
+	return tcu::TestStatus::pass("Pass");
+}
+
+void MultiViewAttachmentsTestInstance::beforeDraw (void)
+{
+	const VkDescriptorPoolSize poolSize =
+	{
+		vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
+		1u
+	};
+
+	const VkDescriptorPoolCreateInfo createInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
+		DE_NULL,
+		VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
+		1u,
+		1u,
+		&poolSize
+	};
+
+	m_descriptorPool = createDescriptorPool(*m_device, *m_logicalDevice, &createInfo);
+
+	const VkDescriptorSetAllocateInfo	allocateInfo =
+	{
+		vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
+		DE_NULL,
+		*m_descriptorPool,
+		1u,
+		&m_descriptorSetLayout.get()
+	};
+
+	m_descriptorSet	= vk::allocateDescriptorSet(*m_device, *m_logicalDevice, &allocateInfo);
+
+	const VkDescriptorImageInfo	imageInfo =
+	{
+		(VkSampler)0,
+		m_inputAttachment->getImageView(),
+		VK_IMAGE_LAYOUT_GENERAL
+	};
+
+	const VkWriteDescriptorSet	write =
+	{
+		VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,	//VkStructureType				sType;
+		DE_NULL,								//const void*					pNext;
+		*m_descriptorSet,						//VkDescriptorSet				dstSet;
+		0u,										//deUint32						dstBinding;
+		0u,										//deUint32						dstArrayElement;
+		1u,										//deUint32						descriptorCount;
+		VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,	//VkDescriptorType				descriptorType;
+		&imageInfo,								//const VkDescriptorImageInfo*	pImageInfo;
+		DE_NULL,								//const VkDescriptorBufferInfo*	pBufferInfo;
+		DE_NULL,								//const VkBufferView*			pTexelBufferView;
+	};
+
+	m_device->updateDescriptorSets(*m_logicalDevice, (deUint32)1u, &write, 0u, DE_NULL);
+
+	const VkImageSubresourceRange	subresourceRange	=
+	{
+		VK_IMAGE_ASPECT_COLOR_BIT,	//VkImageAspectFlags	aspectMask;
+		0u,							//deUint32				baseMipLevel;
+		1u,							//deUint32				levelCount;
+		0u,							//deUint32				baseArrayLayer;
+		m_parameters.extent.depth,	//deUint32				layerCount;
+	};
+	m_device->cmdBindDescriptorSets(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1u, &(*m_descriptorSet), 0u, NULL);
+
+	imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(), subresourceRange, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT);
+
+	const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
+	m_device->cmdClearColorImage(*m_cmdBuffer, m_colorAttachment->getImage(),  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &renderPassClearValue.color, 1, &subresourceRange);
+
+	imageBarrier(*m_device, *m_cmdBuffer, m_colorAttachment->getImage(), subresourceRange, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
+
+	imageBarrier(*m_device, *m_cmdBuffer,  m_inputAttachment->getImage(), subresourceRange, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, 0, VK_ACCESS_INPUT_ATTACHMENT_READ_BIT);
+}
+
+void MultiViewAttachmentsTestInstance::setImageData (VkImage image)
+{
+	const MovePtr<tcu::Texture2DArray>		data		= imageData();
+	Move<VkBuffer>					buffer;
+	const deUint32					bufferSize	= m_parameters.extent.width * m_parameters.extent.height * m_parameters.extent.depth * tcu::getPixelSize(mapVkFormat(m_colorFormat));
+	MovePtr<Allocation>				bufferAlloc;
+
+	// Create source buffer
+	{
+		const VkBufferCreateInfo		bufferParams			=
+		{
+			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
+			DE_NULL,									// const void*			pNext;
+			0u,											// VkBufferCreateFlags	flags;
+			bufferSize,									// VkDeviceSize			size;
+			VK_BUFFER_USAGE_TRANSFER_SRC_BIT,			// VkBufferUsageFlags	usage;
+			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
+			1u,											// deUint32				queueFamilyIndexCount;
+			&m_queueFamilyIndex,						// const deUint32*		pQueueFamilyIndices;
+		};
+
+		buffer		= createBuffer(*m_device, *m_logicalDevice, &bufferParams);
+		bufferAlloc = m_allocator->allocate(getBufferMemoryRequirements(*m_device, *m_logicalDevice, *buffer), MemoryRequirement::HostVisible);
+		VK_CHECK(m_device->bindBufferMemory(*m_logicalDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
+	}
+
+	// Barriers for copying buffer to image
+	const VkBufferMemoryBarrier				preBufferBarrier		=
+	{
+		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,		// VkStructureType	sType;
+		DE_NULL,										// const void*		pNext;
+		VK_ACCESS_HOST_WRITE_BIT,						// VkAccessFlags	srcAccessMask;
+		VK_ACCESS_TRANSFER_READ_BIT,					// VkAccessFlags	dstAccessMask;
+		VK_QUEUE_FAMILY_IGNORED,						// deUint32			srcQueueFamilyIndex;
+		VK_QUEUE_FAMILY_IGNORED,						// deUint32			dstQueueFamilyIndex;
+		*buffer,										// VkBuffer			buffer;
+		0u,												// VkDeviceSize		offset;
+		bufferSize										// VkDeviceSize		size;
+	};
+
+	const VkImageAspectFlags				formatAspect			= getAspectFlags(mapVkFormat(m_colorFormat));
+	VkImageSubresourceRange					subresourceRange		=
+	{												// VkImageSubresourceRange	subresourceRange;
+		formatAspect,				// VkImageAspectFlags	aspect;
+		0u,							// deUint32				baseMipLevel;
+		1u,							// deUint32				mipLevels;
+		0u,							// deUint32				baseArraySlice;
+		m_parameters.extent.depth,	// deUint32				arraySize;
+	};
+
+	const VkBufferImageCopy					copyRegion				=
+	{
+		0u,															// VkDeviceSize				bufferOffset;
+		(deUint32)data->getLevel(0).getWidth(),						// deUint32					bufferRowLength;
+		(deUint32)data->getLevel(0).getHeight(),					// deUint32					bufferImageHeight;
+		{
+			VK_IMAGE_ASPECT_COLOR_BIT,								// VkImageAspectFlags		aspect;
+			0u,														// deUint32					mipLevel;
+			0u,														// deUint32					baseArrayLayer;
+			m_parameters.extent.depth,								// deUint32					layerCount;
+		},															// VkImageSubresourceLayers	imageSubresource;
+		{ 0, 0, 0 },												// VkOffset3D				imageOffset;
+		{m_parameters.extent.width, m_parameters.extent.height, 1u}	// VkExtent3D				imageExtent;
+	};
+
+	// Write buffer data
+	deMemcpy(bufferAlloc->getHostPtr(), data->getLevel(0).getDataPtr(), bufferSize);
+	flushMappedMemoryRange(*m_device, *m_logicalDevice, bufferAlloc->getMemory(), bufferAlloc->getOffset(), bufferSize);
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	m_device->cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &preBufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
+	imageBarrier(*m_device, *m_cmdBuffer, image, subresourceRange,
+		VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
+	m_device->cmdCopyBufferToImage(*m_cmdBuffer, *buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &copyRegion);
+	imageBarrier(*m_device, *m_cmdBuffer, image, subresourceRange,
+		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+class MultiViewInstancedTestInstance : public MultiViewRenderTestInstance
+{
+public:
+						MultiViewInstancedTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	void				createVertexData				(void);
+	void				draw							(const deUint32			subpassCount,
+														 VkRenderPass			renderPass,
+														 VkFramebuffer			frameBuffer,
+														 vector<PipelineSp>&	pipelines);
+};
+
+MultiViewInstancedTestInstance::MultiViewInstancedTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+void MultiViewInstancedTestInstance::createVertexData (void)
+{
+	tcu::Vec4 color = tcu::Vec4(0.2f, 0.0f, 0.1f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f, 0.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f,-1.0f, 1.0f, 1.0f), color));
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+}
+
+void MultiViewInstancedTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue				renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize				vertexBufferOffset		= 0u;
+	const deUint32					drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+	m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		m_device->cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		m_device->cmdDraw(*m_cmdBuffer, 4u, drawCountPerSubpass, 0u, subpassNdx % m_squareCount);
+
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+class MultiViewInputRateInstanceTestInstance : public MultiViewRenderTestInstance
+{
+public:
+				MultiViewInputRateInstanceTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	void		createVertexData						(void);
+	void		draw									(const deUint32			subpassCount,
+														 VkRenderPass			renderPass,
+														 VkFramebuffer			frameBuffer,
+														 vector<PipelineSp>&	pipelines);
+};
+
+MultiViewInputRateInstanceTestInstance::MultiViewInputRateInstanceTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+
+void MultiViewInputRateInstanceTestInstance::createVertexData (void)
+{
+	tcu::Vec4 color = tcu::Vec4(0.2f, 0.0f, 0.1f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f,-1.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.3f, 0.0f, 0.2f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4(-1.0f, 0.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.4f, 0.2f, 0.3f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f,-1.0f, 1.0f, 1.0f), color));
+
+	color = tcu::Vec4(0.5f, 0.0f, 0.4f, 1.0f);
+	m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
+}
+
+void MultiViewInputRateInstanceTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue				renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize				vertexBufferOffset		= 0u;
+	const deUint32					drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+	m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		m_device->cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		for (deUint32 drawNdx = 0u; drawNdx < drawCountPerSubpass; ++drawNdx)
+			m_device->cmdDraw(*m_cmdBuffer, 4u, 4u, 0u, 0u);
+
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+class MultiViewIDrawIndirectTestInstance : public MultiViewRenderTestInstance
+{
+public:
+				MultiViewIDrawIndirectTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	void		draw									(const deUint32			subpassCount,
+														 VkRenderPass			renderPass,
+														 VkFramebuffer			frameBuffer,
+														 vector<PipelineSp>&	pipelines);
+};
+
+MultiViewIDrawIndirectTestInstance::MultiViewIDrawIndirectTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+
+void MultiViewIDrawIndirectTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	typedef de::SharedPtr<Unique<VkBuffer> >		BufferSP;
+	typedef de::SharedPtr<UniquePtr<Allocation> >	AllocationSP;
+
+	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue				renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize				vertexBufferOffset		= 0u;
+	const deUint32					drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+	vector< BufferSP >				indirectBuffers(subpassCount);
+	vector< AllocationSP >			indirectAllocations(subpassCount);
+	deUint32						strideInBuffer = (deUint32)sizeof(vk::VkDrawIndirectCommand);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		vector<VkDrawIndirectCommand>	drawCommands;
+		for (deUint32 drawNdx = 0u; drawNdx < drawCountPerSubpass; ++drawNdx)
+		{
+			const VkDrawIndirectCommand	drawCommand =
+			{
+				4u,												//deUint32	vertexCount;
+				1u,												//deUint32	instanceCount;
+				(drawNdx + subpassNdx % m_squareCount) * 4u,	//deUint32	firstVertex;
+				0u												//deUint32	firstInstance;
+			};
+			drawCommands.push_back(drawCommand);
+		}
+
+		const VkDeviceSize			bufferSize			=	static_cast<VkDeviceSize>(deAlignSize(static_cast<size_t>(drawCommands.size() * strideInBuffer),
+															static_cast<size_t>(m_context.getDeviceProperties().limits.nonCoherentAtomSize)));
+		const VkBufferCreateInfo	bufferInfo			= makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+		Move<VkBuffer>				indirectBuffer		= createBuffer(*m_device, *m_logicalDevice, &bufferInfo);
+		MovePtr<Allocation>			allocationBuffer	= m_allocator->allocate(getBufferMemoryRequirements(*m_device, *m_logicalDevice, *m_vertexBuffer),  MemoryRequirement::HostVisible);
+		VK_CHECK(m_device->bindBufferMemory(*m_logicalDevice, *indirectBuffer, allocationBuffer->getMemory(), allocationBuffer->getOffset()));
+
+		deMemcpy(allocationBuffer->getHostPtr(), &drawCommands[0], static_cast<size_t>(bufferSize));
+
+		flushMappedMemoryRange(*m_device, *m_logicalDevice, allocationBuffer->getMemory(), allocationBuffer->getOffset(), static_cast<size_t>(bufferSize));
+		indirectBuffers[subpassNdx] = (BufferSP(new Unique<VkBuffer>(indirectBuffer)));
+		indirectAllocations[subpassNdx] = (AllocationSP(new UniquePtr<Allocation>(allocationBuffer)));
+	}
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+	m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		m_device->cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		if (m_hasMultiDrawIndirect)
+		{
+			m_device->cmdDrawIndirect(*m_cmdBuffer, **indirectBuffers[subpassNdx], 0u, drawCountPerSubpass, strideInBuffer);
+		}
+		else
+		{
+			for (deUint32 drawNdx = 0; drawNdx < drawCountPerSubpass; drawNdx++)
+			{
+				m_device->cmdDrawIndirect(*m_cmdBuffer, **indirectBuffers[subpassNdx], drawNdx * strideInBuffer, 1, strideInBuffer);
+			}
+		}
+
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+class MultiViewClearAttachmentsTestInstance : public MultiViewRenderTestInstance
+{
+public:
+				MultiViewClearAttachmentsTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	void		draw									(const deUint32			subpassCount,
+														 VkRenderPass			renderPass,
+														 VkFramebuffer			frameBuffer,
+														 vector<PipelineSp>&	pipelines);
+};
+
+MultiViewClearAttachmentsTestInstance::MultiViewClearAttachmentsTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+
+void MultiViewClearAttachmentsTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	const VkRect2D					renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue				renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize				vertexBufferOffset		= 0u;
+	const deUint32					drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+	m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		VkClearAttachment	clearAttachment	=
+		{
+			VK_IMAGE_ASPECT_COLOR_BIT,								// VkImageAspectFlags	aspectMask
+			0u,														// deUint32				colorAttachment
+			makeClearValueColor(tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f))	// VkClearValue			clearValue
+		};
+
+		const VkOffset2D	offset[2]		=
+		{
+			{0, 0},
+			{static_cast<deInt32>(static_cast<float>(m_parameters.extent.width) * 0.25f), static_cast<deInt32>(static_cast<float>(m_parameters.extent.height) * 0.25f)}
+		};
+
+		const VkExtent2D	extent[2]		=
+		{
+			{m_parameters.extent.width, m_parameters.extent.height},
+			{static_cast<deUint32>(static_cast<float>(m_parameters.extent.width) * 0.5f), static_cast<deUint32>(static_cast<float>(m_parameters.extent.height) * 0.5f)}
+		};
+
+		const VkRect2D		rect2D[2]		=
+		{
+			{offset[0], extent[0]},
+			{offset[1], extent[1]}
+		};
+
+		VkClearRect			clearRect		=
+		{
+			rect2D[0],	// VkRect2D	rect
+			0u,			// deUint32	baseArrayLayer
+			1u,			// deUint32	layerCount
+		};
+
+		m_device->cmdClearAttachments(*m_cmdBuffer, 1u, &clearAttachment, 1u, &clearRect);
+		m_device->cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		for (deUint32 drawNdx = 0u; drawNdx < drawCountPerSubpass; ++drawNdx)
+			m_device->cmdDraw(*m_cmdBuffer, 4u, 1u, (drawNdx + subpassNdx % m_squareCount) * 4u, 0u);
+
+		clearRect.rect = rect2D[1];
+		clearAttachment.clearValue = makeClearValueColor(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
+		m_device->cmdClearAttachments(*m_cmdBuffer, 1u, &clearAttachment, 1u, &clearRect);
+
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+
+class MultiViewSecondaryCommandBufferTestInstance : public MultiViewRenderTestInstance
+{
+public:
+				MultiViewSecondaryCommandBufferTestInstance	(Context& context, const TestParameters& parameters);
+protected:
+	void		draw										(const deUint32			subpassCount,
+															 VkRenderPass			renderPass,
+															 VkFramebuffer			frameBuffer,
+															 vector<PipelineSp>&	pipelines);
+};
+
+MultiViewSecondaryCommandBufferTestInstance::MultiViewSecondaryCommandBufferTestInstance (Context& context, const TestParameters& parameters)
+	: MultiViewRenderTestInstance	(context, parameters)
+{
+}
+
+void MultiViewSecondaryCommandBufferTestInstance::draw (const deUint32 subpassCount, VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+{
+	typedef de::SharedPtr<Unique<VkCommandBuffer> >	VkCommandBufferSp;
+
+	const VkRect2D						renderArea				= { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
+	const VkClearValue					renderPassClearValue	= makeClearValueColor(tcu::Vec4(0.0f));
+	const VkDeviceSize					vertexBufferOffset		= 0u;
+	const deUint32						drawCountPerSubpass		= (subpassCount == 1) ? m_squareCount : 1u;
+
+	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;
+		1u,											// uint32_t				clearValueCount;
+		&renderPassClearValue,						// const VkClearValue*	pClearValues;
+	};
+
+	beginCommandBuffer(*m_device, *m_cmdBuffer);
+
+	beforeDraw();
+
+	m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+
+	//Create secondary buffer
+	const VkCommandBufferAllocateInfo	cmdBufferAllocateInfo	=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
+		DE_NULL,										// const void*				pNext;
+		*m_cmdPool,										// VkCommandPool			commandPool;
+		VK_COMMAND_BUFFER_LEVEL_SECONDARY,				// VkCommandBufferLevel		level;
+		1u,												// deUint32					bufferCount;
+	};
+	vector<VkCommandBufferSp>	cmdBufferSecondary;
+
+	for (deUint32 subpassNdx = 0u; subpassNdx < subpassCount; subpassNdx++)
+	{
+		cmdBufferSecondary.push_back(VkCommandBufferSp(new Unique<VkCommandBuffer>(allocateCommandBuffer(*m_device, *m_logicalDevice, &cmdBufferAllocateInfo))));
+
+		beginSecondaryCommandBuffer(*m_device, cmdBufferSecondary.back().get()->get(), renderPass, subpassNdx, frameBuffer);
+		m_device->cmdBindVertexBuffers(cmdBufferSecondary.back().get()->get(), 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
+		m_device->cmdBindPipeline(cmdBufferSecondary.back().get()->get(), VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+		for (deUint32 drawNdx = 0u; drawNdx < drawCountPerSubpass; ++drawNdx)
+			m_device->cmdDraw(cmdBufferSecondary.back().get()->get(), 4u, 1u, (drawNdx + subpassNdx % m_squareCount) * 4u, 0u);
+
+		VK_CHECK(m_device->endCommandBuffer(cmdBufferSecondary.back().get()->get()));
+
+		m_device->cmdExecuteCommands(*m_cmdBuffer, 1u, &cmdBufferSecondary.back().get()->get());
+		if (subpassNdx < subpassCount - 1u)
+			m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+	}
+
+	m_device->cmdEndRenderPass(*m_cmdBuffer);
+
+	afterDraw();
+
+	VK_CHECK(m_device->endCommandBuffer(*m_cmdBuffer));
+	submitCommandsAndWait(*m_device, *m_logicalDevice, m_queue, *m_cmdBuffer);
+}
+
+class MultiViewRenderTestsCase : public vkt::TestCase
+{
+public:
+	MultiViewRenderTestsCase (tcu::TestContext &context, const char *name, const char *description, const TestParameters& parameters)
+		: TestCase			(context, name, description)
+		, m_parameters		(parameters)
+	{
+	}
+private:
+	const TestParameters	m_parameters;
+
+	vkt::TestInstance*	createInstance		(vkt::Context& context) const
+	{
+		if (TEST_TYPE_INPUT_ATTACHMENTS == m_parameters.viewIndex)
+			return new MultiViewAttachmentsTestInstance(context, m_parameters);
+
+		if (TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex)
+			return new MultiViewInstancedTestInstance(context, m_parameters);
+
+		if (TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+			return new MultiViewInputRateInstanceTestInstance(context, m_parameters);
+
+		if (TEST_TYPE_DRAW_INDIRECT == m_parameters.viewIndex)
+			return new	MultiViewIDrawIndirectTestInstance(context, m_parameters);
+
+		if (TEST_TYPE_CLEAR_ATTACHMENTS == m_parameters.viewIndex)
+			return new	MultiViewClearAttachmentsTestInstance(context, m_parameters);
+
+		if (TEST_TYPE_SECONDARY_CMD_BUFFER == m_parameters.viewIndex)
+			return new	MultiViewSecondaryCommandBufferTestInstance(context, m_parameters);
+
+		return new MultiViewRenderTestInstance(context, m_parameters);
+	}
+
+	void				initPrograms		(SourceCollections& programCollection) const
+	{
+		// Create vertex shader
+		if (TEST_TYPE_INSTANCED_RENDERING == m_parameters.viewIndex)
+		{
+			std::ostringstream source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(location = 0) in highp vec4 in_position;\n"
+					<< "layout(location = 1) in vec4 in_color;\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "void main (void)\n"
+					<< "{\n"
+					<< "	int modInstance = gl_InstanceIndex % 4;\n"
+					<< "	int instance    = gl_InstanceIndex + 1;\n"
+					<< "	gl_Position = in_position;\n"
+					<< "	if (modInstance == 1)\n"
+					<< "		gl_Position = in_position + vec4(0.0f, 1.0f, 0.0f, 0.0f);\n"
+					<< "	if (modInstance == 2)\n"
+					<< "		gl_Position = in_position + vec4(1.0f, 0.0f, 0.0f, 0.0f);\n"
+					<< "	if (modInstance == 3)\n"
+					<< "		gl_Position =  in_position + vec4(1.0f, 1.0f, 0.0f, 0.0f);\n"
+					<< "	out_color = in_color + vec4(0.0f, gl_ViewIndex * 0.10f, instance * 0.10f, 0.0f);\n"
+					<< "}\n";
+			programCollection.glslSources.add("vertex") << glu::VertexSource(source.str());
+		}
+		else if (TEST_TYPE_INPUT_RATE_INSTANCE == m_parameters.viewIndex)
+		{
+			std::ostringstream source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(location = 0) in highp vec4 in_position;\n"
+					<< "layout(location = 1) in vec4 in_color;\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "void main (void)\n"
+					<< "{\n"
+					<< "	int instance = gl_InstanceIndex + 1;\n"
+					<< "	gl_Position = in_position;\n"
+					<< "	if (gl_VertexIndex == 1)\n"
+					<< "		gl_Position.y += 1.0f;\n"
+					<< "	else if (gl_VertexIndex == 2)\n"
+					<< "		gl_Position.x += 1.0f;\n"
+					<< "	else if (gl_VertexIndex == 3)\n"
+					<< "	{\n"
+					<< "		gl_Position.x += 1.0f;\n"
+					<< "		gl_Position.y += 1.0f;\n"
+					<< "	}\n"
+					<< "	out_color = in_color + vec4(0.0f, gl_ViewIndex * 0.10f, instance * 0.10f, 0.0f);\n"
+					<< "}\n";
+			programCollection.glslSources.add("vertex") << glu::VertexSource(source.str());
+		}
+		else
+		{
+			std::ostringstream source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(location = 0) in highp vec4 in_position;\n"
+					<< "layout(location = 1) in vec4 in_color;\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "void main (void)\n"
+					<< "{\n"
+					<< "	gl_Position = in_position;\n";
+				if (TEST_TYPE_VIEW_INDEX_IN_VERTEX == m_parameters.viewIndex || TEST_TYPE_DRAW_INDIRECT == m_parameters.viewIndex)
+					source << "	out_color = in_color + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n";
+				else
+					source << "	out_color = in_color;\n";
+			source	<< "}\n";
+			programCollection.glslSources.add("vertex") << glu::VertexSource(source.str());
+		}
+
+		if (TEST_TYPE_VIEW_INDEX_IN_TESELLATION == m_parameters.viewIndex)
+		{// Tessellation control & evaluation
+			std::ostringstream source_tc;
+			source_tc	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+						<< "#extension GL_EXT_multiview : enable\n"
+						<< "#extension GL_EXT_tessellation_shader : require\n"
+						<< "layout(vertices = 4) out;\n"
+						<< "layout(location = 0) in vec4 in_color[];\n"
+						<< "layout(location = 0) out vec4 out_color[];\n"
+						<< "\n"
+						<< "void main (void)\n"
+						<< "{\n"
+						<< "	if ( gl_InvocationID == 0 )\n"
+						<< "	{\n"
+						<< "		gl_TessLevelInner[0] = 4.0f;\n"
+						<< "		gl_TessLevelInner[1] = 4.0f;\n"
+						<< "		gl_TessLevelOuter[0] = 4.0f;\n"
+						<< "		gl_TessLevelOuter[1] = 4.0f;\n"
+						<< "		gl_TessLevelOuter[2] = 4.0f;\n"
+						<< "		gl_TessLevelOuter[3] = 4.0f;\n"
+						<< "	}\n"
+						<< "	out_color[gl_InvocationID] = in_color[gl_InvocationID];\n"
+						<< "	gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+						<< "}\n";
+			programCollection.glslSources.add("tessellation_control") << glu::TessellationControlSource(source_tc.str());
+
+			std::ostringstream source_te;
+			source_te	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+						<< "#extension GL_EXT_multiview : enable\n"
+						<< "#extension GL_EXT_tessellation_shader : require\n"
+						<< "layout( quads, equal_spacing, ccw ) in;\n"
+						<< "layout(location = 0) in vec4 in_color[];\n"
+						<< "layout(location = 0) out vec4 out_color;\n"
+						<< "void main (void)\n"
+						<< "{\n"
+						<< "	const float u = gl_TessCoord.x;\n"
+						<< "	const float v = gl_TessCoord.y;\n"
+						<< "	const float w = gl_TessCoord.z;\n"
+						<< "	gl_Position = (1 - u) * (1 - v) * gl_in[0].gl_Position +(1 - u) * v * gl_in[1].gl_Position + u * (1 - v) * gl_in[2].gl_Position + u * v * gl_in[3].gl_Position;\n"
+						<< "	out_color = in_color[0]+ vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n"
+						<< "}\n";
+			programCollection.glslSources.add("tessellation_evaluation") << glu::TessellationEvaluationSource(source_te.str());
+		}
+
+		if (TEST_TYPE_VIEW_INDEX_IN_GEOMETRY	== m_parameters.viewIndex ||
+			TEST_TYPE_INPUT_ATTACHMENTS			== m_parameters.viewIndex ||
+			TEST_TYPE_CLEAR_ATTACHMENTS			== m_parameters.viewIndex ||
+			TEST_TYPE_SECONDARY_CMD_BUFFER		== m_parameters.viewIndex)
+		{// Geometry Shader
+			std::ostringstream	source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(triangles) in;\n"
+					<< "layout(triangle_strip, max_vertices = 16) out;\n"
+					<< "layout(location = 0) in vec4 in_color[];\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "void main (void)\n"
+					<< "{\n"
+					<< "	out_color = in_color[0] + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n"
+					<< "	gl_Position = gl_in[0].gl_Position;\n"
+					<< "	EmitVertex();\n"
+					<< "	out_color = in_color[0] + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n"
+					<< "	gl_Position = gl_in[1].gl_Position;\n"
+					<< "	EmitVertex();\n"
+					<< "	out_color = in_color[0] + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n"
+					<< "	gl_Position = gl_in[2].gl_Position;\n"
+					<< "	EmitVertex();\n"
+					<< "	out_color = in_color[0] + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n"
+					<< "	gl_Position = vec4(gl_in[2].gl_Position.x, gl_in[1].gl_Position.y, 1.0, 1.0);\n"
+					<< "	EmitVertex();\n"
+					<< "	EndPrimitive();\n"
+					<< "}\n";
+			programCollection.glslSources.add("geometry") << glu::GeometrySource(source.str());
+		}
+
+		if (TEST_TYPE_INPUT_ATTACHMENTS == m_parameters.viewIndex)
+		{// Create fragment shader read/write attachment
+			std::ostringstream source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(location = 0) in vec4 in_color;\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "layout(input_attachment_index = 0, set=0, binding=0) uniform highp subpassInput in_color_attachment;\n"
+					<< "void main()\n"
+					<<"{\n"
+					<< "	out_color = vec4(subpassLoad(in_color_attachment));\n"
+					<< "}\n";
+			programCollection.glslSources.add("fragment") << glu::FragmentSource(source.str());
+		}
+		else
+		{// Create fragment shader
+			std::ostringstream source;
+			source	<< glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+					<< "#extension GL_EXT_multiview : enable\n"
+					<< "layout(location = 0) in vec4 in_color;\n"
+					<< "layout(location = 0) out vec4 out_color;\n"
+					<< "void main()\n"
+					<<"{\n";
+				if (TEST_TYPE_VIEW_INDEX_IN_FRAGMENT == m_parameters.viewIndex)
+					source << "	out_color = in_color + vec4(0.0, gl_ViewIndex * 0.10f, 0.0, 0.0);\n";
+				else
+					source << "	out_color = in_color;\n";
+			source	<< "}\n";
+			programCollection.glslSources.add("fragment") << glu::FragmentSource(source.str());
+		}
+	}
+};
+} //anonymous
+
+void multiViewRenderCreateTests (tcu::TestCaseGroup* group)
+{
+	tcu::TestContext&			testCtx						= group->getTestContext();
+	const deUint32				testCaseCount				= 6u;
+	MovePtr<tcu::TestCaseGroup>	groupViewIndex				(new tcu::TestCaseGroup(testCtx, "index", "ViewIndex rendering tests."));
+	const string				shaderName[TEST_TYPE_LAST]	=
+	{
+		"masks",
+		"vertex_shader",
+		"fragment_shader",
+		"geometry_shader",
+		"tesellation_shader",
+		"input_attachments",
+		"instanced",
+		"input_instance",
+		"draw_indirect",
+		"clear_attachments",
+		"secondary_cmd_buffer"
+	};
+	const VkExtent3D			extent3D[testCaseCount]		=
+	{
+		{16u,	16u,	4u},
+		{64u,	64u,	8u},
+		{128u,	128u,	4u},
+		{32u,	32u,	5u},
+		{64u,	64u,	6u},
+		{16u,	16u,	10u},
+	};
+	vector<deUint32>			viewMasks[testCaseCount];
+
+	viewMasks[0].push_back(15u);	//1111
+
+	viewMasks[1].push_back(8u);		//1000
+
+	viewMasks[2].push_back(1u);		//0001
+	viewMasks[2].push_back(2u);		//0010
+	viewMasks[2].push_back(4u);		//0100
+	viewMasks[2].push_back(8u);		//1000
+
+	viewMasks[3].push_back(15u);	//1111
+	viewMasks[3].push_back(15u);	//1111
+	viewMasks[3].push_back(15u);	//1111
+	viewMasks[3].push_back(15u);	//1111
+
+	viewMasks[4].push_back(8u);		//1000
+	viewMasks[4].push_back(1u);		//0001
+	viewMasks[4].push_back(1u);		//0001
+	viewMasks[4].push_back(8u);		//1000
+
+	const deUint32 minSupportedMultiviewViewCount	= 6u;
+	const deUint32 maxViewMask						= (1u << minSupportedMultiviewViewCount) - 1u;
+
+	for (deUint32 mask = 1u; mask <= maxViewMask; mask = mask << 1u)
+		viewMasks[5].push_back(mask);
+
+	for (int testTypeNdx = TEST_TYPE_VIEW_MASK; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
+	{
+		MovePtr<tcu::TestCaseGroup>	groupShader	(new tcu::TestCaseGroup(testCtx, shaderName[testTypeNdx].c_str(), ""));
+		for (deUint32 testCaseNdx = 0u; testCaseNdx < testCaseCount; ++testCaseNdx)
+		{
+			const TestParameters	parameters		=	{extent3D[testCaseNdx], viewMasks[testCaseNdx], (TestType)testTypeNdx};
+			std::ostringstream		masks;
+			const deUint32			viewMaksSize	=	static_cast<deUint32>(viewMasks[testCaseNdx].size());
+
+			for (deUint32 ndx = 0u; ndx < viewMaksSize; ++ndx)
+			{
+				masks<<viewMasks[testCaseNdx][ndx];
+				if (viewMaksSize - 1 != ndx)
+					masks<<"_";
+			}
+			groupShader->addChild(new MultiViewRenderTestsCase(testCtx, masks.str().c_str(), "", parameters));
+		}
+
+		// maxMultiviewViewCount case
+		{
+			const VkExtent3D		incompleteExtent3D	= { 16u, 16u, 0u };
+			const vector<deUint32>	dummyMasks;
+			const TestParameters	parameters			= { incompleteExtent3D, dummyMasks, (TestType)testTypeNdx };
+
+			groupShader->addChild(new MultiViewRenderTestsCase(testCtx, "max_multi_view_view_count", "", parameters));
+		}
+
+		switch (testTypeNdx)
+		{
+			case TEST_TYPE_VIEW_MASK:
+			case TEST_TYPE_INPUT_ATTACHMENTS:
+			case TEST_TYPE_INSTANCED_RENDERING:
+			case TEST_TYPE_INPUT_RATE_INSTANCE:
+			case TEST_TYPE_DRAW_INDIRECT:
+			case TEST_TYPE_CLEAR_ATTACHMENTS:
+			case TEST_TYPE_SECONDARY_CMD_BUFFER:
+				group->addChild(groupShader.release());
+				break;
+			case TEST_TYPE_VIEW_INDEX_IN_VERTEX:
+			case TEST_TYPE_VIEW_INDEX_IN_FRAGMENT:
+			case TEST_TYPE_VIEW_INDEX_IN_GEOMETRY:
+			case TEST_TYPE_VIEW_INDEX_IN_TESELLATION:
+				groupViewIndex->addChild(groupShader.release());
+				break;
+			default:
+				DE_ASSERT(0);
+				break;
+		};
+	}
+
+	group->addChild(groupViewIndex.release());
+}
+
+} //MultiView
+} //vkt
+
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.hpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.hpp
new file mode 100644
index 0000000..3584b97
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.hpp
@@ -0,0 +1,39 @@
+#ifndef _VKTMULTIVIEWRENDERTESTS_HPP
+#define _VKTMULTIVIEWRENDERTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief Vulkan Multi View Render Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+
+void multiViewRenderCreateTests (tcu::TestCaseGroup* group);
+
+} // MultiView
+} // vkt
+
+#endif // _VKTMULTIVIEWRENDERTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp
new file mode 100644
index 0000000..03b1fe4
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp
@@ -0,0 +1,491 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief Vulkan Multi View Render Util
+ *//*--------------------------------------------------------------------*/
+
+#include "vktMultiViewRenderUtil.hpp"
+
+#include "vktTestCase.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkPlatform.hpp"
+#include "vkMemUtil.hpp"
+#include "vkImageUtil.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuResource.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuRGBA.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+using namespace vk;
+using de::MovePtr;
+using de::UniquePtr;
+using std::vector;
+
+VkImageAspectFlags getAspectFlags (tcu::TextureFormat format)
+{
+	VkImageAspectFlags	aspectFlag	= 0;
+	aspectFlag |= (tcu::hasDepthComponent(format.order)? VK_IMAGE_ASPECT_DEPTH_BIT : 0);
+	aspectFlag |= (tcu::hasStencilComponent(format.order)? VK_IMAGE_ASPECT_STENCIL_BIT : 0);
+
+	if (!aspectFlag)
+		aspectFlag = VK_IMAGE_ASPECT_COLOR_BIT;
+
+	return aspectFlag;
+}
+
+VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
+{
+	const VkBufferCreateInfo bufferCreateInfo	=
+	{
+		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType		sType;
+		DE_NULL,								// const void*			pNext;
+		(VkBufferCreateFlags)0,					// VkBufferCreateFlags	flags;
+		bufferSize,								// VkDeviceSize			size;
+		usage,									// VkBufferUsageFlags	usage;
+		VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode		sharingMode;
+		0u,										// deUint32				queueFamilyIndexCount;
+		DE_NULL,								// const deUint32*		pQueueFamilyIndices;
+	};
+	return bufferCreateInfo;
+}
+
+VkImageCreateInfo makeImageCreateInfo (const VkImageType imageType, const VkExtent3D& extent, const VkFormat format, const VkImageUsageFlags usage)
+{
+	const VkImageCreateInfo imageInfo	=
+	{
+		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType			sType;
+		DE_NULL,									// const void*				pNext;
+		(VkImageCreateFlags)0,						// VkImageCreateFlags		flags;
+		imageType,									// VkImageType				imageType;
+		format,										// VkFormat					format;
+		{extent.width, extent.height, 1u},			// VkExtent3D				extent;
+		1u,											// uint32_t					mipLevels;
+		extent.depth,								// uint32_t					arrayLayers;
+		VK_SAMPLE_COUNT_1_BIT,						// VkSampleCountFlagBits	samples;
+		VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling			tiling;
+		usage,										// VkImageUsageFlags		usage;
+		VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode			sharingMode;
+		0u,											// uint32_t					queueFamilyIndexCount;
+		DE_NULL,									// const uint32_t*			pQueueFamilyIndices;
+		VK_IMAGE_LAYOUT_UNDEFINED,					// VkImageLayout			initialLayout;
+	};
+	return imageInfo;
+}
+
+Move<VkImageView> makeImageView (const DeviceInterface&			vk,
+								 const VkDevice					device,
+								 const VkImage					image,
+								 const VkImageViewType			viewType,
+								 const VkFormat					format,
+								 const VkImageSubresourceRange	subresourceRange)
+{
+	const VkImageViewCreateInfo imageViewParams =
+	{
+		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// VkStructureType			sType;
+		DE_NULL,										// const void*				pNext;
+		(VkImageViewCreateFlags)0,						// VkImageViewCreateFlags	flags;
+		image,											// VkImage					image;
+		viewType,										// VkImageViewType			viewType;
+		format,											// VkFormat					format;
+		makeComponentMappingRGBA(),						// VkComponentMapping		components;
+		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
+	};
+	return createImageView(vk, device, &imageViewParams);
+}
+
+Move<VkFramebuffer> makeFramebuffer (const DeviceInterface&		vk,
+									 const VkDevice				device,
+									 const VkRenderPass			renderPass,
+									 const vector<VkImageView>&	attachments,
+									 const deUint32				width,
+									 const deUint32				height,
+									 const deUint32				layers)
+{
+	const VkFramebufferCreateInfo framebufferInfo =
+	{
+		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,		// VkStructureType			sType;
+		DE_NULL,										// const void*				pNext;
+		(VkFramebufferCreateFlags)0,					// VkFramebufferCreateFlags	flags;
+		renderPass,										// VkRenderPass				renderPass;
+		static_cast<deUint32>(attachments.size()),		// uint32_t					attachmentCount;
+		&attachments[0],								// const VkImageView*		pAttachments;
+		width,											// uint32_t					width;
+		height,											// uint32_t					height;
+		layers,											// uint32_t					layers;
+	};
+	return createFramebuffer(vk, device, &framebufferInfo);
+}
+
+Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
+										   const VkDevice				device,
+										   const VkDescriptorSetLayout*	pSetLayouts)
+{
+	const VkPipelineLayoutCreateInfo info =
+	{
+		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,	// VkStructureType				sType;
+		DE_NULL,										// const void*					pNext;
+		(VkPipelineLayoutCreateFlags)0,					// VkPipelineLayoutCreateFlags	flags;
+		(DE_NULL == pSetLayouts)? 0u : 1u,				// deUint32						setLayoutCount;
+		pSetLayouts,									// const VkDescriptorSetLayout*	pSetLayouts;
+		0u,												// deUint32						pushConstantRangeCount;
+		DE_NULL,										// const VkPushConstantRange*	pPushConstantRanges;
+	};
+	return createPipelineLayout(vk, device, &info);
+}
+
+Move<VkDescriptorSetLayout> makeDescriptorSetLayout (const DeviceInterface&		vk,
+													const VkDevice				device)
+{
+	const VkDescriptorSetLayoutBinding		binding		=
+	{
+		0u,											//deUint32				binding;
+		vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,	//VkDescriptorType		descriptorType;
+		1u,											//deUint32				descriptorCount;
+		vk::VK_SHADER_STAGE_FRAGMENT_BIT,			//VkShaderStageFlags	stageFlags;
+		DE_NULL										//const VkSampler*		pImmutableSamplers;
+	};
+
+	const VkDescriptorSetLayoutCreateInfo	createInfo	=
+	{
+		vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,	//VkStructureType						sType;
+		DE_NULL,													//const void*							pNext;
+		0u,															//VkDescriptorSetLayoutCreateFlags		flags;
+		1u,															//deUint32								bindingCount;
+		&binding													//const VkDescriptorSetLayoutBinding*	pBindings;
+	};
+	return vk::createDescriptorSetLayout(vk, device, &createInfo);
+}
+
+Move<VkRenderPass> makeRenderPass (const DeviceInterface&	vk,
+								   const VkDevice			device,
+								   const VkFormat			colorFormat,
+								   const vector<deUint32>&	viewMasks)
+{
+	const deUint32								subpassCount				= static_cast<deUint32>(viewMasks.size());
+	const VkAttachmentDescription				colorAttachmentDescription	=
+	{
+		(VkAttachmentDescriptionFlags)0,			// VkAttachmentDescriptionFlags		flags;
+		colorFormat,								// 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 VkAttachmentReference					depthAttachmentReference	=
+	{
+		VK_ATTACHMENT_UNUSED,		// deUint32			attachment;
+		VK_IMAGE_LAYOUT_UNDEFINED	// VkImageLayout	layout;
+	};
+
+	const VkSubpassDescription					subpassDescription			=
+	{
+		(VkSubpassDescriptionFlags)0,		// 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;
+		&depthAttachmentReference,			// const VkAttachmentReference*		pDepthStencilAttachment;
+		0u,									// deUint32							preserveAttachmentCount;
+		DE_NULL								// const deUint32*					pPreserveAttachments;
+	};
+	vector <VkSubpassDescription>				subpassDescriptions			(subpassCount, subpassDescription);
+
+	const VkRenderPassMultiviewCreateInfoKHX	renderPassMultiviewInfo		=
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHX,	//VkStructureType	sType;
+		DE_NULL,													//const void*		pNext;
+		subpassCount,												//uint32_t			subpassCount;
+		&viewMasks[0],												//const uint32_t*	pViewMasks;
+		0u,															//uint32_t			dependencyCount;
+		DE_NULL,													//const int32_t*	pViewOffsets;
+		0u,															//uint32_t			correlationMaskCount;
+		DE_NULL,													//const uint32_t*	pCorrelationMasks;
+	};
+
+	vector <VkSubpassDependency>				subpassDependencies;
+	for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
+	{
+		const VkSubpassDependency subpassDependency =
+		{
+			subpassNdx,														// deUint32				srcSubpass;
+			(subpassNdx ==subpassCount - 1u) ? subpassNdx : subpassNdx+1u,	// deUint32				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;
+			VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX,								// VkDependencyFlags	dependencyFlags;
+		};
+		subpassDependencies.push_back(subpassDependency);
+	}
+
+	const VkRenderPassCreateInfo				renderPassInfo		=
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,	// VkStructureType					sType;
+		&renderPassMultiviewInfo,					// const void*						pNext;
+		(VkRenderPassCreateFlags)0,					// VkRenderPassCreateFlags			flags;
+		1u,											// deUint32							attachmentCount;
+		&colorAttachmentDescription,				// const VkAttachmentDescription*	pAttachments;
+		subpassCount,								// deUint32							subpassCount;
+		&subpassDescriptions[0],					// const VkSubpassDescription*		pSubpasses;
+		subpassCount,								// deUint32							dependencyCount;
+		&subpassDependencies[0]						// const VkSubpassDependency*		pDependencies;
+	};
+
+	return createRenderPass(vk, device, &renderPassInfo);
+}
+
+Move<VkRenderPass> makeRenderPassWithAttachments (const DeviceInterface&	vk,
+												  const VkDevice			device,
+												  const VkFormat			colorFormat,
+												  const vector<deUint32>&	viewMasks)
+{
+	const deUint32								subpassCount				= static_cast<deUint32>(viewMasks.size());
+
+	const VkAttachmentDescription				colorAttachmentDescription	=
+	{
+		(VkAttachmentDescriptionFlags)0,			// VkAttachmentDescriptionFlags		flags;
+		colorFormat,								// 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 VkAttachmentDescription				inputAttachmentDescription	=
+	{
+		(VkAttachmentDescriptionFlags)0,			// VkAttachmentDescriptionFlags		flags;
+		colorFormat,								// VkFormat							format;
+		VK_SAMPLE_COUNT_1_BIT,						// VkSampleCountFlagBits			samples;
+		VK_ATTACHMENT_LOAD_OP_LOAD,					// 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_GENERAL,					// VkImageLayout					initialLayout;
+		VK_IMAGE_LAYOUT_GENERAL						// VkImageLayout					finalLayout;
+	};
+
+	vector<VkAttachmentDescription>				attachments;
+	attachments.push_back(colorAttachmentDescription);
+	attachments.push_back(inputAttachmentDescription);
+
+	const VkAttachmentReference					colorAttachmentReference	=
+	{
+		0u,											// deUint32			attachment;
+		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference					inputAttachmentReference	=
+	{
+		1u,						// deUint32			attachment;
+		VK_IMAGE_LAYOUT_GENERAL	// VkImageLayout	layout;
+	};
+
+	const VkAttachmentReference					depthAttachmentReference	=
+	{
+		VK_ATTACHMENT_UNUSED,		// deUint32			attachment;
+		VK_IMAGE_LAYOUT_UNDEFINED	// VkImageLayout	layout;
+	};
+
+	const VkSubpassDescription					subpassDescription			=
+	{
+		(VkSubpassDescriptionFlags)0,		// VkSubpassDescriptionFlags		flags;
+		VK_PIPELINE_BIND_POINT_GRAPHICS,	// VkPipelineBindPoint				pipelineBindPoint;
+		1u,									// deUint32							inputAttachmentCount;
+		&inputAttachmentReference,			// const VkAttachmentReference*		pInputAttachments;
+		1u,									// deUint32							colorAttachmentCount;
+		&colorAttachmentReference,			// const VkAttachmentReference*		pColorAttachments;
+		DE_NULL,							// const VkAttachmentReference*		pResolveAttachments;
+		&depthAttachmentReference,			// const VkAttachmentReference*		pDepthStencilAttachment;
+		0u,									// deUint32							preserveAttachmentCount;
+		DE_NULL								// const deUint32*					pPreserveAttachments;
+	};
+	vector <VkSubpassDescription>				subpassDescriptions			(subpassCount, subpassDescription);
+
+	const VkRenderPassMultiviewCreateInfoKHX	renderPassMultiviewInfo		=
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHX,	//VkStructureType	sType;
+		DE_NULL,													//const void*		pNext;
+		subpassCount,												//uint32_t			subpassCount;
+		&viewMasks[0],												//const uint32_t*	pViewMasks;
+		0u,															//uint32_t			dependencyCount;
+		DE_NULL,													//const int32_t*	pViewOffsets;
+		0u,															//uint32_t			correlationMaskCount;
+		DE_NULL,													//const uint32_t*	pCorrelationMasks;
+	};
+
+	vector <VkSubpassDependency>				subpassDependencies;
+	for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
+	{
+		const VkSubpassDependency subpassDependency =
+		{
+			subpassNdx,														// deUint32				srcSubpass;
+			(subpassNdx ==subpassCount - 1u) ? subpassNdx : subpassNdx+1u,	// deUint32				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;
+			VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX,								// VkDependencyFlags	dependencyFlags;
+		};
+		subpassDependencies.push_back(subpassDependency);
+	}
+
+	const VkRenderPassCreateInfo				renderPassInfo		=
+	{
+		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,	// VkStructureType					sType;
+		&renderPassMultiviewInfo,					// const void*						pNext;
+		(VkRenderPassCreateFlags)0,					// VkRenderPassCreateFlags			flags;
+		2u,											// deUint32							attachmentCount;
+		&attachments[0],							// const VkAttachmentDescription*	pAttachments;
+		subpassCount,								// deUint32							subpassCount;
+		&subpassDescriptions[0],					// const VkSubpassDescription*		pSubpasses;
+		subpassCount,								// deUint32							dependencyCount;
+		&subpassDependencies[0]						// const VkSubpassDependency*		pDependencies;
+	};
+
+	return createRenderPass(vk, device, &renderPassInfo);
+}
+
+void beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
+{
+	const VkCommandBufferBeginInfo info =
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,		// VkStructureType							sType;
+		DE_NULL,											// const void*								pNext;
+		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,		// VkCommandBufferUsageFlags				flags;
+		DE_NULL,											// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
+	};
+	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
+}
+
+void beginSecondaryCommandBuffer (const DeviceInterface&				vk,
+								   const VkCommandBuffer				commandBuffer,
+								   const VkRenderPass					renderPass,
+								   const deUint32						subpass,
+								   const VkFramebuffer					framebuffer)
+{
+	const VkCommandBufferInheritanceInfo	secCmdBufInheritInfo	=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,	//VkStructureType				sType;
+		DE_NULL,											//const void*					pNext;
+		renderPass,											//VkRenderPass					renderPass;
+		subpass,											//deUint32						subpass;
+		framebuffer,										//VkFramebuffer					framebuffer;
+		VK_FALSE,											//VkBool32						occlusionQueryEnable;
+		(VkQueryControlFlags)0u,							//VkQueryControlFlags			queryFlags;
+		(VkQueryPipelineStatisticFlags)0u,					//VkQueryPipelineStatisticFlags	pipelineStatistics;
+	};
+
+	const VkCommandBufferBeginInfo			info					=
+	{
+		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,		// VkStructureType							sType;
+		DE_NULL,											// const void*								pNext;
+		VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,	// VkCommandBufferUsageFlags				flags;
+		&secCmdBufInheritInfo,							// const VkCommandBufferInheritanceInfo*	pInheritanceInfo;
+	};
+	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
+}
+
+void imageBarrier (const DeviceInterface&			vk,
+				   const VkCommandBuffer			cmdBuffer,
+				   const VkImage					image,
+				   const VkImageSubresourceRange	subresourceRange,
+				   const VkImageLayout				oldLayout,
+				   const VkImageLayout				newLayout,
+				   const VkAccessFlags				srcAccessMask,
+				   const VkAccessFlags				dstAccessMask,
+				   const VkPipelineStageFlags		srcStageMask,
+				   const VkPipelineStageFlags		dstStageMask)
+{
+	const VkImageMemoryBarrier		barrier				=
+	{
+		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,	// VkStructureType			sType;
+		DE_NULL,								// const void*				pNext;
+		srcAccessMask,							// VkAccessFlags			srcAccessMask;
+		dstAccessMask,							// VkAccessFlags			dstAccessMask;
+		oldLayout,								// VkImageLayout			oldLayout;
+		newLayout,								// VkImageLayout			newLayout;
+		VK_QUEUE_FAMILY_IGNORED,				// deUint32					srcQueueFamilyIndex;
+		VK_QUEUE_FAMILY_IGNORED,				// deUint32					dstQueueFamilyIndex;
+		image,									// VkImage					image;
+		subresourceRange,						// VkImageSubresourceRange	subresourceRange;
+	};
+
+	vk.cmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL,
+		0u, (const VkBufferMemoryBarrier*)DE_NULL,
+		1u, &barrier);
+}
+
+void submitCommandsAndWait (const DeviceInterface&	vk,
+							const VkDevice			device,
+							const VkQueue			queue,
+							const VkCommandBuffer	commandBuffer)
+{
+	const VkFenceCreateInfo	fenceInfo	=
+	{
+		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
+		DE_NULL,								// const void*			pNext;
+		(VkFenceCreateFlags)0,					// VkFenceCreateFlags	flags;
+	};
+	const Unique<VkFence>	fence		(createFence(vk, device, &fenceInfo));
+
+	const VkSubmitInfo		submitInfo	=
+	{
+		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType				sType;
+		DE_NULL,						// const void*					pNext;
+		0u,								// uint32_t						waitSemaphoreCount;
+		DE_NULL,						// const VkSemaphore*			pWaitSemaphores;
+		DE_NULL,						// const VkPipelineStageFlags*	pWaitDstStageMask;
+		1u,								// uint32_t						commandBufferCount;
+		&commandBuffer,					// const VkCommandBuffer*		pCommandBuffers;
+		0u,								// uint32_t						signalSemaphoreCount;
+		DE_NULL,						// const VkSemaphore*			pSignalSemaphores;
+	};
+	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
+	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+}
+
+} // MultiView
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.hpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.hpp
new file mode 100644
index 0000000..931c88a
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.hpp
@@ -0,0 +1,52 @@
+#ifndef _VKTMULTIVIEWRENDERUTIL_HPP
+#define _VKTMULTIVIEWRENDERUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief Vulkan Multi View Render Util
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vkRefUtil.hpp"
+#include "tcuTexture.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+
+vk::VkImageAspectFlags				getAspectFlags					(tcu::TextureFormat format);
+vk::VkBufferCreateInfo				makeBufferCreateInfo			(const vk::VkDeviceSize bufferSize, const vk::VkBufferUsageFlags usage);
+vk::VkImageCreateInfo				makeImageCreateInfo				(const vk::VkImageType imageType, const vk::VkExtent3D& extent, const vk::VkFormat format, const vk::VkImageUsageFlags usage);
+vk::Move<vk::VkImageView>			makeImageView					(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImage image, const vk::VkImageViewType viewType, const vk::VkFormat format, const vk::VkImageSubresourceRange subresourceRange);
+vk::Move<vk::VkFramebuffer>			makeFramebuffer					(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkRenderPass renderPass, const std::vector<vk::VkImageView>& attachments, const deUint32 width, const deUint32 height, const deUint32 layers);
+vk::Move<vk::VkPipelineLayout>		makePipelineLayout				(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorSetLayout* pSetLayouts = DE_NULL);
+vk::Move<vk::VkDescriptorSetLayout>	makeDescriptorSetLayout			(const vk::DeviceInterface& vk, const vk::VkDevice device);
+vk::Move<vk::VkRenderPass>			makeRenderPass					(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat, const std::vector<deUint32>& viewMasks);
+vk::Move<vk::VkRenderPass>			makeRenderPassWithAttachments	(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat, const std::vector<deUint32>& viewMasks);
+void								beginCommandBuffer				(const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer);
+void								beginSecondaryCommandBuffer		(const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer, const vk::VkRenderPass renderPass, const deUint32 subpass, const vk::VkFramebuffer framebuffer);
+void								imageBarrier					(const vk::DeviceInterface& vk, const vk::VkCommandBuffer cmdBuffer, const vk::VkImage image, const vk::VkImageSubresourceRange subresourceRange, const vk::VkImageLayout oldLayout, const vk::VkImageLayout newLayout, const vk::VkAccessFlags srcAccessMask, const vk::VkAccessFlags dstAccessMask, const vk::VkPipelineStageFlags srcStageMask = vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, const vk::VkPipelineStageFlags dstStageMas = vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+void								submitCommandsAndWait			(const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkQueue queue, const vk::VkCommandBuffer commandBuffer);
+
+} // MultiView
+} // vkt
+
+#endif // _VKTMULTIVIEWRENDERUTIL_HPP
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp
new file mode 100644
index 0000000..e819fe8
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp
@@ -0,0 +1,40 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief  Vulkan Multi View Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktMultiViewTests.hpp"
+#include "vktMultiViewRenderTests.hpp"
+
+#include "vktTestGroupUtil.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+
+tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
+{
+	return createTestGroup(testCtx, "multiview", "MultiView render tests", multiViewRenderCreateTests);
+}
+
+} // MultiView
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.hpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.hpp
new file mode 100644
index 0000000..a6f9b91
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.hpp
@@ -0,0 +1,39 @@
+#ifndef _VKTMULTIVIEWTESTS_HPP
+#define _VKTMULTIVIEWTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017 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
+ * \brief Vulkan Multi View Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+
+tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx);
+
+} // MultiView
+} // vkt
+
+#endif // _VKTMULTIVIEWTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
index 0436ded..68faea6 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
@@ -6380,9 +6380,6 @@
 	renderpassTests->addChild(suballocationTestGroup.release());
 	renderpassTests->addChild(dedicatedAllocationTestGroup.release());
 
-	renderpassTests->addChild(createRenderPassMultisampleTests(testCtx));
-	renderpassTests->addChild(createRenderPassMultisampleResolveTests(testCtx));
-
 	return renderpassTests.release();
 }
 
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
index 03cf2af..c0575a3 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
@@ -314,6 +314,9 @@
 
 		if ((formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) == 0)
 			throw tcu::NotSupportedError("MarkerImage format not supported as storage image");
+
+		if (m_largeDepthEnable && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_EXT_depth_range_unrestricted"))
+			throw tcu::NotSupportedError("large_depth test variants require the VK_EXT_depth_range_unrestricted extension");
 	}
 	catch (const vk::Error& e)
 	{
@@ -805,7 +808,6 @@
 										vulkanDrawContext.getColorPixels().getHeight(),
 										1,
 										vulkanDrawContext.getColorPixels().getDataPtr()));
-
 	}
 
 	// Barrier to transition between first and second pass
@@ -1185,12 +1187,6 @@
 			if (m_largeDepthEnable)
 				expectedValue += m_largeDepthBase;
 
-			if (expectedValue > 1.0f)
-				expectedValue = 1.0f;
-
-			if (expectedValue < 0.0f)
-				expectedValue = 0.0f;
-
 			for (deUint32 sampleNdx = 0; sampleNdx < (deUint32)m_samples; sampleNdx++)
 			{
 				const float	actualValue		= validationBuffer.getPixel(sampleNdx + m_samples * colNdx, rowNdx).x();
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
index 54c5889..12f837b 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmComputeShaderCase.cpp
@@ -317,17 +317,6 @@
 tcu::TestStatus SpvAsmComputeShaderInstance::iterate (void)
 {
 	const VkPhysicalDeviceFeatures&		features			= m_context.getDeviceFeatures();
-	const vector<std::string>&			extensions			= m_context.getDeviceExtensions();
-
-	for (deUint32 extNdx = 0; extNdx < m_shaderSpec.extensions.size(); ++extNdx)
-	{
-		const std::string&				ext					= m_shaderSpec.extensions[extNdx];
-
-		if (!de::contains(extensions.begin(), extensions.end(), ext))
-		{
-			TCU_THROW(NotSupportedError, (std::string("Device extension not supported: ") + ext).c_str());
-		}
-	}
 
 	if ((m_features == COMPUTE_TEST_USES_INT16 || m_features == COMPUTE_TEST_USES_INT16_INT64) && !features.shaderInt16)
 	{
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
index 7f3b201..f039e4a 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
@@ -2186,6 +2186,7 @@
 	const bool									needInterface			= !instance.interfaces.empty();
 	const VkPhysicalDeviceFeatures&				features				= context.getDeviceFeatures();
 
+
 	supportsGeometry		= features.geometryShader == VK_TRUE;
 	supportsTessellation	= features.tessellationShader == VK_TRUE;
 	hasTessellation			= (instance.requiredStages & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ||
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
index 171a3e6..b7b3f77 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
@@ -4347,7 +4347,6 @@
 
 		return group.release();
 }
-
 } // anonymous
 
 tcu::TestCaseGroup* createOpSourceTests (tcu::TestContext& testCtx)
@@ -6752,10 +6751,10 @@
 
 		createTestsForAllStages(params.name, inputColors, outputColors, fragments, testGroup.get(), params.failResult, params.failMessageTemplate);
 	}
-
 	return testGroup.release();
 }
 
+
 enum IntegerType
 {
 	INTEGER_TYPE_SIGNED_16,
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
index 758e7e5..926a6da 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
@@ -99,17 +99,12 @@
 //
 // This method finds the correct offset from the base of a vector<float32> given the indexes into the structure.
 // Returns the index in the inclusive range of 0 and 63. Each unit of the offset represents offset by the size of a 32-bit float.
-deUint32 getBaseOffset(	deUint32 indexOuterStruct,
-						deUint32 indexMatrixRow,
+deUint32 getBaseOffset (deUint32 indexMatrixRow,
 						deUint32 indexMatrixCol,
 						deUint32 indexInnerStruct,
 						deUint32 indexVec4Array,
 						deUint32 indexVec4)
 {
-	// index into the outer structure must be zero since the outer structure has only 1 member.
-	if(indexOuterStruct != 0)
-		DE_ASSERT(indexOuterStruct == 0);
-
 	DE_ASSERT(indexMatrixRow < 2);
 	DE_ASSERT(indexMatrixCol < 2);
 	DE_ASSERT(indexInnerStruct < 2);
@@ -154,7 +149,7 @@
 //
 // This method finds the correct offset from the base of a vector<float32> given the indexes into the structure.
 // Returns the index in the inclusive range of 0 and 127.
-deUint32 getBaseOffsetForSingleInputBuffer(	deUint32 indexOuterStruct,
+deUint32 getBaseOffsetForSingleInputBuffer (deUint32 indexOuterStruct,
 											deUint32 indexMatrixRow,
 											deUint32 indexMatrixCol,
 											deUint32 indexInnerStruct,
@@ -168,8 +163,8 @@
 	DE_ASSERT(indexVec4Array < 2);
 	DE_ASSERT(indexVec4 < 4);
 
-	// Get the offset assuming you have only one outer_struct. (use index 0 for outer_struct)
-	deUint32 offset = getBaseOffset(0, indexMatrixRow, indexMatrixCol, indexInnerStruct, indexVec4Array, indexVec4);
+	// Get the offset assuming you have only one outer_struct.
+	deUint32 offset = getBaseOffset(indexMatrixRow, indexMatrixCol, indexInnerStruct, indexVec4Array, indexVec4);
 
 	// If the second outer structure (b) is chosen in the input_buffer, we need to add an offset of 64 since
 	// each outer_struct contains 64 floats.
@@ -1845,8 +1840,10 @@
 
 		for (int indexLevel = 0; indexLevel < numLevels; ++indexLevel)
 		{
-			baseOffset						= getBaseOffset(indexesForLevel[indexLevel][0],
-															indexesForLevel[indexLevel][1],
+			// index into the outer structure must be zero since the outer structure has only 1 member.
+			DE_ASSERT(indexesForLevel[indexLevel][0] == 0);
+
+			baseOffset						= getBaseOffset(indexesForLevel[indexLevel][1],
 															indexesForLevel[indexLevel][2],
 															indexesForLevel[indexLevel][3],
 															indexesForLevel[indexLevel][4],
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
index 365e6eb..555832c 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp
@@ -332,9 +332,6 @@
 
 tcu::TestStatus WindingTestInstance::iterate (void)
 {
-	if (m_yFlip && !de::contains(m_context.getDeviceExtensions().begin(), m_context.getDeviceExtensions().end(), "VK_KHR_maintenance1"))
-		TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
-
 	const DeviceInterface&	vk					= m_context.getDeviceInterface();
 	const VkDevice			device				= m_context.getDevice();
 	const VkQueue			queue				= m_context.getUniversalQueue();
diff --git a/external/vulkancts/modules/vulkan/vktTestPackage.cpp b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
index 55f9a72..4c58553 100644
--- a/external/vulkancts/modules/vulkan/vktTestPackage.cpp
+++ b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
@@ -78,6 +78,7 @@
 #include "vktTextureTests.hpp"
 #include "vktGeometryTests.hpp"
 #include "vktRobustnessTests.hpp"
+#include "vktMultiViewTests.hpp"
 #include "vktYCbCrTests.hpp"
 
 #include <vector>
@@ -403,6 +404,7 @@
 	addChild(texture::createTests			(m_testCtx));
 	addChild(geometry::createTests			(m_testCtx));
 	addChild(robustness::createTests		(m_testCtx));
+	addChild(MultiView::createTests			(m_testCtx));
 	addChild(ycbcr::createTests				(m_testCtx));
 }
 
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
index 87de704..4e9787c 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSurfaceTests.cpp
@@ -44,6 +44,7 @@
 #include "tcuFormatUtil.hpp"
 #include "tcuPlatform.hpp"
 #include "tcuResultCollector.hpp"
+#include "tcuCommandLine.hpp"
 
 #include "deUniquePtr.hpp"
 #include "deStringUtil.hpp"
@@ -109,6 +110,12 @@
 	SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC	= 0xffffffff
 };
 
+enum
+{
+	GUARD_SIZE										= 0x20,			//!< Number of bytes to check
+	GUARD_VALUE										= 0xcd,			//!< Data pattern
+};
+
 template<typename T>
 class CheckIncompleteResult
 {
@@ -748,6 +755,237 @@
 	return tcu::TestStatus(results.getResult(), results.getMessage());
 }
 
+tcu::TestStatus queryDevGroupSurfacePresentCapabilitiesTest (Context& context, Type wsiType)
+{
+	tcu::TestLog&							log					= context.getTestContext().getLog();
+	const InstanceHelper					instHelper			(context, wsiType, vector<string>(1, string("VK_KHX_device_group_creation")));
+	const float								queuePriority		= 1.0f;
+	const tcu::CommandLine&					cmdLine				= context.getTestContext().getCommandLine();
+	const deUint32							devGroupIdx			= cmdLine.getVKDeviceGroupId() - 1;
+	const deUint32							deviceIdx			= context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
+	const VkDeviceGroupPresentModeFlagsKHX	requiredFlag		= VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX;
+	const VkDeviceGroupPresentModeFlagsKHX	maxValidFlag		= VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX|VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX |
+																	VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX|VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX;
+	deUint8									buffer				[sizeof(VkDeviceGroupPresentCapabilitiesKHX) + GUARD_SIZE];
+	deUint32								queueFamilyIndex	= 0;
+	VkDeviceGroupPresentCapabilitiesKHX*	presentCapabilities;
+	std::vector<const char*>				deviceExtensions;
+	deviceExtensions.push_back("VK_KHX_device_group");
+	deviceExtensions.push_back("VK_KHR_swapchain");
+
+	const vector<VkPhysicalDeviceGroupPropertiesKHX>	deviceGroupProps = enumeratePhysicalDeviceGroupsKHX(instHelper.vki, *instHelper.instance);
+
+	const std::vector<VkQueueFamilyProperties>	queueProps		= getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
+	for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
+	{
+		if (queueProps[queueNdx].queueFlags & VK_QUEUE_GRAPHICS_BIT)
+			queueFamilyIndex = (deUint32)queueNdx;
+	}
+	const VkDeviceQueueCreateInfo			deviceQueueCreateInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,				//type
+		DE_NULL,												//pNext
+		(VkDeviceQueueCreateFlags)0u,							//flags
+		queueFamilyIndex,										//queueFamilyIndex;
+		1u,														//queueCount;
+		&queuePriority,											//pQueuePriorities;
+	};
+	const VkDeviceGroupDeviceCreateInfoKHX				deviceGroupInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX,	//stype
+		DE_NULL,												//pNext
+		deviceGroupProps[devGroupIdx].physicalDeviceCount,		//physicalDeviceCount
+		deviceGroupProps[devGroupIdx].physicalDevices			//physicalDevices
+	};
+	const VkDeviceCreateInfo							deviceCreateInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,					//sType;
+		&deviceGroupInfo,										//pNext;
+		(VkDeviceCreateFlags)0u,								//flags
+		1,														//queueRecordCount;
+		&deviceQueueCreateInfo,									//pRequestedQueues;
+		0,														//layerCount;
+		DE_NULL,												//ppEnabledLayerNames;
+		deUint32(deviceExtensions.size()),						//enabledExtensionCount;
+		&deviceExtensions[0],									//ppEnabledExtensionNames;
+		DE_NULL,												//pEnabledFeatures;
+	};
+	Move<VkDevice>		deviceGroup = createDevice(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+	const DeviceDriver	vk	(instHelper.vki, *deviceGroup);
+
+
+	presentCapabilities = reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHX*>(buffer);
+	deMemset(buffer, GUARD_VALUE, sizeof(buffer));
+	presentCapabilities->sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX;
+	presentCapabilities->pNext = DE_NULL;
+	VK_CHECK(vk.getDeviceGroupPresentCapabilitiesKHX(deviceGroup.get(), presentCapabilities));
+
+	// Guard check
+	for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++)
+	{
+		if (buffer[ndx + sizeof(VkDeviceGroupPresentCapabilitiesKHX)] != GUARD_VALUE)
+		{
+			log << TestLog::Message << "deviceGroupPresentCapabilities - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
+			return tcu::TestStatus::fail("deviceGroupPresentCapabilities buffer overflow");
+		}
+	}
+
+	// Check each physical device can present on itself
+	for (size_t physDevIdx = 0; physDevIdx < VK_MAX_DEVICE_GROUP_SIZE_KHX; physDevIdx++)
+	{
+		if (presentCapabilities->presentMask[physDevIdx])
+			if (!((1 << physDevIdx) & (presentCapabilities->presentMask[physDevIdx])))
+				return tcu::TestStatus::fail("deviceGroupPresentCapabilities, device can not present on itself, invalid present mask");
+	}
+
+	// Check if flags are valid
+	if ((!(presentCapabilities->modes & requiredFlag)) ||
+		presentCapabilities->modes > maxValidFlag)
+		return tcu::TestStatus::fail("deviceGroupPresentCapabilities flag not valid");
+
+	return tcu::TestStatus::pass("Querying deviceGroup present capabilities succeeded");
+}
+
+tcu::TestStatus queryDevGroupSurfacePresentModesTest (Context& context, Type wsiType)
+{
+	tcu::TestLog&							log					= context.getTestContext().getLog();
+	tcu::ResultCollector					results				(log);
+	const InstanceHelper					instHelper			(context, wsiType, vector<string>(1, string("VK_KHX_device_group_creation")));
+	const NativeObjects						native				(context, instHelper.supportedExtensions, wsiType);
+	const Unique<VkSurfaceKHR>				surface				(createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window));
+	const float								queuePriority		= 1.0f;
+	const tcu::CommandLine&					cmdLine				= context.getTestContext().getCommandLine();
+	const deUint32							devGroupIdx			= cmdLine.getVKDeviceGroupId() - 1;
+	const deUint32							deviceIdx			= context.getTestContext().getCommandLine().getVKDeviceId() - 1u;
+	const VkDeviceGroupPresentModeFlagsKHX	requiredFlag		= VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX;
+	const VkDeviceGroupPresentModeFlagsKHX	maxValidFlag		= VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX|VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX |
+																	VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX|VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX;
+	VkResult								result				= VK_SUCCESS;
+	deUint8									buffer				[sizeof(VkDeviceGroupPresentModeFlagsKHX) + GUARD_SIZE];
+	deUint32								rectCount			= 0;
+	deUint32								incompleteRectCount	= 0;
+	deUint32								queueFamilyIndex	= 0;
+	VkRect2D*								presentRectangles;
+	VkDeviceGroupPresentModeFlagsKHX*		presentModeFlags;
+	vector<deUint8>							rectanglesBuffer;
+	std::vector<const char*>				deviceExtensions;
+	deviceExtensions.push_back("VK_KHX_device_group");
+	deviceExtensions.push_back("VK_KHR_swapchain");
+
+	const vector<VkPhysicalDeviceGroupPropertiesKHX>	deviceGroupProps = enumeratePhysicalDeviceGroupsKHX(instHelper.vki, *instHelper.instance);
+	const std::vector<VkQueueFamilyProperties>	queueProps		= getPhysicalDeviceQueueFamilyProperties(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx]);
+	for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
+	{
+		if (queueProps[queueNdx].queueFlags & VK_QUEUE_GRAPHICS_BIT)
+			queueFamilyIndex = (deUint32)queueNdx;
+	}
+	const VkDeviceQueueCreateInfo			deviceQueueCreateInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,					//type
+		DE_NULL,													//pNext
+		(VkDeviceQueueCreateFlags)0u,								//flags
+		queueFamilyIndex,											//queueFamilyIndex;
+		1u,															//queueCount;
+		&queuePriority,												//pQueuePriorities;
+	};
+	const VkDeviceGroupDeviceCreateInfoKHX			deviceGroupInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX,	//stype
+		DE_NULL,												//pNext
+		deviceGroupProps[devGroupIdx].physicalDeviceCount,		//physicalDeviceCount
+		deviceGroupProps[devGroupIdx].physicalDevices			//physicalDevices
+	};
+	const VkDeviceCreateInfo						deviceCreateInfo =
+	{
+		VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,					//sType;
+		&deviceGroupInfo,										//pNext;
+		(VkDeviceCreateFlags)0u,								//flags
+		1,														//queueRecordCount;
+		&deviceQueueCreateInfo,									//pRequestedQueues;
+		0,														//layerCount;
+		DE_NULL,												//ppEnabledLayerNames;
+		deUint32(deviceExtensions.size()),						//enabledExtensionCount;
+		&deviceExtensions[0],									//ppEnabledExtensionNames;
+		DE_NULL,												//pEnabledFeatures;
+	};
+
+	Move<VkDevice>		deviceGroup = createDevice(instHelper.vki, deviceGroupProps[devGroupIdx].physicalDevices[deviceIdx], &deviceCreateInfo);
+	const DeviceDriver	vk	(instHelper.vki, *deviceGroup);
+	presentModeFlags = reinterpret_cast<VkDeviceGroupPresentModeFlagsKHX*>(buffer);
+	deMemset(buffer, GUARD_VALUE, sizeof(buffer));
+
+	VK_CHECK(vk.getDeviceGroupSurfacePresentModesKHX(deviceGroup.get(), *surface, presentModeFlags));
+
+	// Guard check
+	for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++)
+	{
+		if (buffer[ndx + sizeof(VkDeviceGroupPresentModeFlagsKHX)] != GUARD_VALUE)
+		{
+			log << TestLog::Message << "queryDevGroupSurfacePresentModesTest - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
+			return tcu::TestStatus::fail("queryDevGroupSurfacePresentModesTest buffer overflow");
+		}
+	}
+
+	// Check if flags are valid
+	if ((!(*presentModeFlags & requiredFlag)) ||
+		*presentModeFlags > maxValidFlag)
+		return tcu::TestStatus::fail("queryDevGroupSurfacePresentModesTest flag not valid");
+
+	// Check presentation rectangles
+	if (*presentModeFlags == VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX)
+	{
+		for (size_t physDevIdx = 0; physDevIdx < deviceGroupProps[devGroupIdx].physicalDeviceCount; physDevIdx++)
+		{
+			VK_CHECK(instHelper.vki.getPhysicalDevicePresentRectanglesKHX(deviceGroupProps[devGroupIdx].physicalDevices[physDevIdx], *surface, &rectCount, DE_NULL));
+			rectanglesBuffer.resize(sizeof(VkRect2D) * rectCount + GUARD_SIZE);
+			presentRectangles = reinterpret_cast<VkRect2D*>(rectanglesBuffer.data());
+			deMemset(rectanglesBuffer.data(), GUARD_VALUE, rectanglesBuffer.size());
+
+			VK_CHECK(instHelper.vki.getPhysicalDevicePresentRectanglesKHX(deviceGroupProps[devGroupIdx].physicalDevices[physDevIdx], *surface, &rectCount, presentRectangles));
+
+			// Guard check
+			for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++)
+			{
+				if (rectanglesBuffer[ndx + sizeof(VkRect2D) * rectCount] != GUARD_VALUE)
+				{
+					log << TestLog::Message << "getPhysicalDevicePresentRectanglesKHX - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
+					return tcu::TestStatus::fail("getPhysicalDevicePresentRectanglesKHX buffer overflow");
+				}
+			}
+
+			// Check rectangles do not overlap
+			for (size_t rectIdx1 = 0; rectIdx1 < rectCount; rectIdx1++)
+			{
+				for (size_t rectIdx2 = 0; rectIdx2 < rectCount; rectIdx2++)
+				{
+					if (rectIdx1 != rectIdx2)
+					{
+						deUint32 rectATop		= presentRectangles[rectIdx1].offset.y;
+						deUint32 rectALeft		= presentRectangles[rectIdx1].offset.x;
+						deUint32 rectABottom	= presentRectangles[rectIdx1].offset.y + presentRectangles[rectIdx1].extent.height;
+						deUint32 rectARight		= presentRectangles[rectIdx1].offset.x + presentRectangles[rectIdx1].extent.width;
+
+						deUint32 rectBTop		= presentRectangles[rectIdx2].offset.y;
+						deUint32 rectBLeft		= presentRectangles[rectIdx2].offset.x;
+						deUint32 rectBBottom	= presentRectangles[rectIdx2].offset.y + presentRectangles[rectIdx2].extent.height;
+						deUint32 rectBRight		= presentRectangles[rectIdx2].offset.x + presentRectangles[rectIdx2].extent.width;
+
+						if (rectALeft < rectBRight && rectARight > rectBLeft &&
+							rectATop < rectBBottom && rectABottom > rectBTop)
+							return tcu::TestStatus::fail("getPhysicalDevicePresentRectanglesKHX rectangles overlap");
+					}
+				}
+			}
+
+			// Check incomplete
+			incompleteRectCount = rectCount / 2;
+			result = instHelper.vki.getPhysicalDevicePresentRectanglesKHX(deviceGroupProps[devGroupIdx].physicalDevices[physDevIdx], *surface, &incompleteRectCount, presentRectangles);
+			results.check(result == VK_INCOMPLETE, "Expected VK_INCOMPLETE");
+		}
+	}
+	return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
 tcu::TestStatus createSurfaceInitialSizeTest (Context& context, Type wsiType)
 {
 	tcu::TestLog&					log				= context.getTestContext().getLog();
@@ -874,16 +1112,18 @@
 {
 	const PlatformProperties&	platformProperties	= getPlatformProperties(wsiType);
 
-	addFunctionCase(testGroup, "create",					"Create surface",						createSurfaceTest,					wsiType);
-	addFunctionCase(testGroup, "create_custom_allocator",	"Create surface with custom allocator",	createSurfaceCustomAllocatorTest,	wsiType);
-	addFunctionCase(testGroup, "create_simulate_oom",		"Create surface with simulating OOM",	createSurfaceSimulateOOMTest,		wsiType);
-	addFunctionCase(testGroup, "query_support",				"Query surface support",				querySurfaceSupportTest,			wsiType);
-	addFunctionCase(testGroup, "query_capabilities",		"Query surface capabilities",			querySurfaceCapabilitiesTest,		wsiType);
-	addFunctionCase(testGroup, "query_capabilities2",		"Query extended surface capabilities",	querySurfaceCapabilities2Test,		wsiType);
-	addFunctionCase(testGroup, "query_formats",				"Query surface formats",				querySurfaceFormatsTest,			wsiType);
-	addFunctionCase(testGroup, "query_formats2",			"Query extended surface formats",		querySurfaceFormats2Test,			wsiType);
-	addFunctionCase(testGroup, "query_present_modes",		"Query surface present modes",			querySurfacePresentModesTest,		wsiType);
-	addFunctionCase(testGroup, "destroy_null_handle",		"Destroy VK_NULL_HANDLE surface",		destroyNullHandleSurfaceTest,		wsiType);
+	addFunctionCase(testGroup, "create",								"Create surface",											createSurfaceTest,							wsiType);
+	addFunctionCase(testGroup, "create_custom_allocator",				"Create surface with custom allocator",						createSurfaceCustomAllocatorTest,			wsiType);
+	addFunctionCase(testGroup, "create_simulate_oom",					"Create surface with simulating OOM",						createSurfaceSimulateOOMTest,				wsiType);
+	addFunctionCase(testGroup, "query_support",							"Query surface support",									querySurfaceSupportTest,					wsiType);
+	addFunctionCase(testGroup, "query_capabilities",					"Query surface capabilities",								querySurfaceCapabilitiesTest,				wsiType);
+	addFunctionCase(testGroup, "query_capabilities2",					"Query extended surface capabilities",						querySurfaceCapabilities2Test,				wsiType);
+	addFunctionCase(testGroup, "query_formats",							"Query surface formats",									querySurfaceFormatsTest,					wsiType);
+	addFunctionCase(testGroup, "query_formats2",						"Query extended surface formats",							querySurfaceFormats2Test,					wsiType);
+	addFunctionCase(testGroup, "query_present_modes",					"Query surface present modes",								querySurfacePresentModesTest,				wsiType);
+	addFunctionCase(testGroup, "query_devgroup_present_capabilities",	"Query surface present modes capabilities in device groups",queryDevGroupSurfacePresentCapabilitiesTest,wsiType);
+	addFunctionCase(testGroup, "query_devgroup_present_modes",			"Query surface present modes for device groups",			queryDevGroupSurfacePresentModesTest,		wsiType);
+	addFunctionCase(testGroup, "destroy_null_handle",					"Destroy VK_NULL_HANDLE surface",							destroyNullHandleSurfaceTest,				wsiType);
 
 	if ((platformProperties.features & PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE) != 0)
 		addFunctionCase(testGroup, "initial_size",	"Create surface with initial window size set",	createSurfaceInitialSizeTest,	wsiType);
diff --git a/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt b/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt
index f8b53e8..fc78a7d 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt
@@ -24,6 +24,7 @@
 
 set(DEQP_VK_YCBCR_LIBS
 	deqp-vk-shaderexecutor
+	deqp-vk-package
 	tcutil
 	vkutil
 	)
diff --git a/external/vulkancts/mustpass/1.0.3/vk-default.txt b/external/vulkancts/mustpass/1.0.3/vk-default.txt
index c736972..edc6656 100644
--- a/external/vulkancts/mustpass/1.0.3/vk-default.txt
+++ b/external/vulkancts/mustpass/1.0.3/vk-default.txt
@@ -9,6 +9,7 @@
 dEQP-VK.api.smoke.asm_triangle_no_opname
 dEQP-VK.api.smoke.unused_resolve_attachment
 dEQP-VK.api.info.instance.physical_devices
+dEQP-VK.api.info.instance.physical_device_groups
 dEQP-VK.api.info.instance.layers
 dEQP-VK.api.info.instance.extensions
 dEQP-VK.api.info.device.features
@@ -17,6 +18,7 @@
 dEQP-VK.api.info.device.memory_properties
 dEQP-VK.api.info.device.layers
 dEQP-VK.api.info.device.extensions
+dEQP-VK.api.info.device_group.peer_memory_features
 dEQP-VK.api.info.format_properties.r4g4_unorm_pack8
 dEQP-VK.api.info.format_properties.r4g4b4a4_unorm_pack16
 dEQP-VK.api.info.format_properties.b4g4r4a4_unorm_pack16
@@ -3566,6 +3568,7 @@
 dEQP-VK.api.device_init.create_device_unsupported_features
 dEQP-VK.api.object_management.single.instance
 dEQP-VK.api.object_management.single.device
+dEQP-VK.api.object_management.single.device_group
 dEQP-VK.api.object_management.single.device_memory_small
 dEQP-VK.api.object_management.single.buffer_uniform_small
 dEQP-VK.api.object_management.single.buffer_uniform_large
@@ -3608,6 +3611,7 @@
 dEQP-VK.api.object_management.single.command_buffer_secondary
 dEQP-VK.api.object_management.multiple_unique_resources.instance
 dEQP-VK.api.object_management.multiple_unique_resources.device
+dEQP-VK.api.object_management.multiple_unique_resources.device_group
 dEQP-VK.api.object_management.multiple_unique_resources.device_memory_small
 dEQP-VK.api.object_management.multiple_unique_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multiple_unique_resources.buffer_uniform_large
@@ -3649,6 +3653,7 @@
 dEQP-VK.api.object_management.multiple_unique_resources.command_buffer_primary
 dEQP-VK.api.object_management.multiple_unique_resources.command_buffer_secondary
 dEQP-VK.api.object_management.multiple_shared_resources.device
+dEQP-VK.api.object_management.multiple_shared_resources.device_group
 dEQP-VK.api.object_management.multiple_shared_resources.device_memory_small
 dEQP-VK.api.object_management.multiple_shared_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multiple_shared_resources.buffer_uniform_large
@@ -3691,6 +3696,7 @@
 dEQP-VK.api.object_management.multiple_shared_resources.command_buffer_secondary
 dEQP-VK.api.object_management.max_concurrent.instance
 dEQP-VK.api.object_management.max_concurrent.device
+dEQP-VK.api.object_management.max_concurrent.device_group
 dEQP-VK.api.object_management.max_concurrent.device_memory_small
 dEQP-VK.api.object_management.max_concurrent.buffer_uniform_small
 dEQP-VK.api.object_management.max_concurrent.buffer_uniform_large
@@ -3773,6 +3779,7 @@
 dEQP-VK.api.object_management.multithreaded_per_thread_device.command_buffer_secondary
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.instance
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.device
+dEQP-VK.api.object_management.multithreaded_per_thread_resources.device_group
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.device_memory_small
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.buffer_uniform_large
@@ -3814,6 +3821,7 @@
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.command_buffer_primary
 dEQP-VK.api.object_management.multithreaded_per_thread_resources.command_buffer_secondary
 dEQP-VK.api.object_management.multithreaded_shared_resources.device
+dEQP-VK.api.object_management.multithreaded_shared_resources.device_group
 dEQP-VK.api.object_management.multithreaded_shared_resources.device_memory_small
 dEQP-VK.api.object_management.multithreaded_shared_resources.buffer_uniform_small
 dEQP-VK.api.object_management.multithreaded_shared_resources.buffer_uniform_large
@@ -3853,6 +3861,7 @@
 dEQP-VK.api.object_management.multithreaded_shared_resources.command_pool_transient
 dEQP-VK.api.object_management.single_alloc_callbacks.instance
 dEQP-VK.api.object_management.single_alloc_callbacks.device
+dEQP-VK.api.object_management.single_alloc_callbacks.device_group
 dEQP-VK.api.object_management.single_alloc_callbacks.device_memory_small
 dEQP-VK.api.object_management.single_alloc_callbacks.buffer_uniform_small
 dEQP-VK.api.object_management.single_alloc_callbacks.buffer_uniform_large
@@ -3895,6 +3904,7 @@
 dEQP-VK.api.object_management.single_alloc_callbacks.command_buffer_secondary
 dEQP-VK.api.object_management.alloc_callback_fail.instance
 dEQP-VK.api.object_management.alloc_callback_fail.device
+dEQP-VK.api.object_management.alloc_callback_fail.device_group
 dEQP-VK.api.object_management.alloc_callback_fail.device_memory_small
 dEQP-VK.api.object_management.alloc_callback_fail.buffer_uniform_small
 dEQP-VK.api.object_management.alloc_callback_fail.buffer_uniform_large
@@ -65269,6 +65279,208 @@
 dEQP-VK.memory.allocation.random.97
 dEQP-VK.memory.allocation.random.98
 dEQP-VK.memory.allocation.random.99
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_64.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_128.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_256.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_512.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_1KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.forward.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.reverse.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_4KiB.mixed.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.forward.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.reverse.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_100
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_1000
+dEQP-VK.memory.device_group_allocation.basic.size_8KiB.mixed.count_4000
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.forward.count_50
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.reverse.count_50
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_1
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_10
+dEQP-VK.memory.device_group_allocation.basic.size_1MiB.mixed.count_50
+dEQP-VK.memory.device_group_allocation.basic.percent_1.forward.count_12
+dEQP-VK.memory.device_group_allocation.basic.percent_1.reverse.count_12
+dEQP-VK.memory.device_group_allocation.basic.percent_1.mixed.count_12
+dEQP-VK.memory.device_group_allocation.random.0
+dEQP-VK.memory.device_group_allocation.random.1
+dEQP-VK.memory.device_group_allocation.random.2
+dEQP-VK.memory.device_group_allocation.random.3
+dEQP-VK.memory.device_group_allocation.random.4
+dEQP-VK.memory.device_group_allocation.random.5
+dEQP-VK.memory.device_group_allocation.random.6
+dEQP-VK.memory.device_group_allocation.random.7
+dEQP-VK.memory.device_group_allocation.random.8
+dEQP-VK.memory.device_group_allocation.random.9
+dEQP-VK.memory.device_group_allocation.random.10
+dEQP-VK.memory.device_group_allocation.random.11
+dEQP-VK.memory.device_group_allocation.random.12
+dEQP-VK.memory.device_group_allocation.random.13
+dEQP-VK.memory.device_group_allocation.random.14
+dEQP-VK.memory.device_group_allocation.random.15
+dEQP-VK.memory.device_group_allocation.random.16
+dEQP-VK.memory.device_group_allocation.random.17
+dEQP-VK.memory.device_group_allocation.random.18
+dEQP-VK.memory.device_group_allocation.random.19
+dEQP-VK.memory.device_group_allocation.random.20
+dEQP-VK.memory.device_group_allocation.random.21
+dEQP-VK.memory.device_group_allocation.random.22
+dEQP-VK.memory.device_group_allocation.random.23
+dEQP-VK.memory.device_group_allocation.random.24
+dEQP-VK.memory.device_group_allocation.random.25
+dEQP-VK.memory.device_group_allocation.random.26
+dEQP-VK.memory.device_group_allocation.random.27
+dEQP-VK.memory.device_group_allocation.random.28
+dEQP-VK.memory.device_group_allocation.random.29
+dEQP-VK.memory.device_group_allocation.random.30
+dEQP-VK.memory.device_group_allocation.random.31
+dEQP-VK.memory.device_group_allocation.random.32
+dEQP-VK.memory.device_group_allocation.random.33
+dEQP-VK.memory.device_group_allocation.random.34
+dEQP-VK.memory.device_group_allocation.random.35
+dEQP-VK.memory.device_group_allocation.random.36
+dEQP-VK.memory.device_group_allocation.random.37
+dEQP-VK.memory.device_group_allocation.random.38
+dEQP-VK.memory.device_group_allocation.random.39
+dEQP-VK.memory.device_group_allocation.random.40
+dEQP-VK.memory.device_group_allocation.random.41
+dEQP-VK.memory.device_group_allocation.random.42
+dEQP-VK.memory.device_group_allocation.random.43
+dEQP-VK.memory.device_group_allocation.random.44
+dEQP-VK.memory.device_group_allocation.random.45
+dEQP-VK.memory.device_group_allocation.random.46
+dEQP-VK.memory.device_group_allocation.random.47
+dEQP-VK.memory.device_group_allocation.random.48
+dEQP-VK.memory.device_group_allocation.random.49
+dEQP-VK.memory.device_group_allocation.random.50
+dEQP-VK.memory.device_group_allocation.random.51
+dEQP-VK.memory.device_group_allocation.random.52
+dEQP-VK.memory.device_group_allocation.random.53
+dEQP-VK.memory.device_group_allocation.random.54
+dEQP-VK.memory.device_group_allocation.random.55
+dEQP-VK.memory.device_group_allocation.random.56
+dEQP-VK.memory.device_group_allocation.random.57
+dEQP-VK.memory.device_group_allocation.random.58
+dEQP-VK.memory.device_group_allocation.random.59
+dEQP-VK.memory.device_group_allocation.random.60
+dEQP-VK.memory.device_group_allocation.random.61
+dEQP-VK.memory.device_group_allocation.random.62
+dEQP-VK.memory.device_group_allocation.random.63
+dEQP-VK.memory.device_group_allocation.random.64
+dEQP-VK.memory.device_group_allocation.random.65
+dEQP-VK.memory.device_group_allocation.random.66
+dEQP-VK.memory.device_group_allocation.random.67
+dEQP-VK.memory.device_group_allocation.random.68
+dEQP-VK.memory.device_group_allocation.random.69
+dEQP-VK.memory.device_group_allocation.random.70
+dEQP-VK.memory.device_group_allocation.random.71
+dEQP-VK.memory.device_group_allocation.random.72
+dEQP-VK.memory.device_group_allocation.random.73
+dEQP-VK.memory.device_group_allocation.random.74
+dEQP-VK.memory.device_group_allocation.random.75
+dEQP-VK.memory.device_group_allocation.random.76
+dEQP-VK.memory.device_group_allocation.random.77
+dEQP-VK.memory.device_group_allocation.random.78
+dEQP-VK.memory.device_group_allocation.random.79
+dEQP-VK.memory.device_group_allocation.random.80
+dEQP-VK.memory.device_group_allocation.random.81
+dEQP-VK.memory.device_group_allocation.random.82
+dEQP-VK.memory.device_group_allocation.random.83
+dEQP-VK.memory.device_group_allocation.random.84
+dEQP-VK.memory.device_group_allocation.random.85
+dEQP-VK.memory.device_group_allocation.random.86
+dEQP-VK.memory.device_group_allocation.random.87
+dEQP-VK.memory.device_group_allocation.random.88
+dEQP-VK.memory.device_group_allocation.random.89
+dEQP-VK.memory.device_group_allocation.random.90
+dEQP-VK.memory.device_group_allocation.random.91
+dEQP-VK.memory.device_group_allocation.random.92
+dEQP-VK.memory.device_group_allocation.random.93
+dEQP-VK.memory.device_group_allocation.random.94
+dEQP-VK.memory.device_group_allocation.random.95
+dEQP-VK.memory.device_group_allocation.random.96
+dEQP-VK.memory.device_group_allocation.random.97
+dEQP-VK.memory.device_group_allocation.random.98
+dEQP-VK.memory.device_group_allocation.random.99
 dEQP-VK.memory.mapping.suballocation.full.33.simple
 dEQP-VK.memory.mapping.suballocation.full.33.remap
 dEQP-VK.memory.mapping.suballocation.full.33.flush
@@ -193865,425 +194077,6 @@
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.97
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.98
 dEQP-VK.renderpass.dedicated_allocation.attachment_allocation.input_output.99
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_2
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_4
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_8
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_16
-dEQP-VK.renderpass.multisample.r5g6b5_unorm_pack16.samples_32
-dEQP-VK.renderpass.multisample.r8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8g8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8g8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_unorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_snorm.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_uint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_sint.samples_32
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_16
-dEQP-VK.renderpass.multisample.r8g8b8a8_srgb.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_snorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_uint_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_sint_pack32.samples_32
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_2
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_4
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_8
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_16
-dEQP-VK.renderpass.multisample.a8b8g8r8_srgb_pack32.samples_32
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_16
-dEQP-VK.renderpass.multisample.b8g8r8a8_unorm.samples_32
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_16
-dEQP-VK.renderpass.multisample.b8g8r8a8_srgb.samples_32
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2r10g10b10_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2b10g10r10_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_16
-dEQP-VK.renderpass.multisample.a2b10g10r10_uint_pack32.samples_32
-dEQP-VK.renderpass.multisample.r16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16g16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16g16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16g16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_unorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_snorm.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_uint.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_sint.samples_32
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r16g16b16a16_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32g32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32g32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32g32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_uint.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_sint.samples_32
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.r32g32b32a32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.d16_unorm.samples_2
-dEQP-VK.renderpass.multisample.d16_unorm.samples_4
-dEQP-VK.renderpass.multisample.d16_unorm.samples_8
-dEQP-VK.renderpass.multisample.d16_unorm.samples_16
-dEQP-VK.renderpass.multisample.d16_unorm.samples_32
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_16
-dEQP-VK.renderpass.multisample.x8_d24_unorm_pack32.samples_32
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_2
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_4
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_8
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_16
-dEQP-VK.renderpass.multisample.d32_sfloat.samples_32
-dEQP-VK.renderpass.multisample.s8_uint.samples_2
-dEQP-VK.renderpass.multisample.s8_uint.samples_4
-dEQP-VK.renderpass.multisample.s8_uint.samples_8
-dEQP-VK.renderpass.multisample.s8_uint.samples_16
-dEQP-VK.renderpass.multisample.s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d16_unorm_s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d24_unorm_s8_uint.samples_32
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_2
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_4
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_8
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_16
-dEQP-VK.renderpass.multisample.d32_sfloat_s8_uint.samples_32
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_2
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_4
-dEQP-VK.renderpass.multisample_resolve.r5g6b5_unorm_pack16.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample_resolve.r8g8b8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_snorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_sint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a8b8g8r8_srgb_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_2
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_4
-dEQP-VK.renderpass.multisample_resolve.b8g8r8a8_srgb.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2r10g10b10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_unorm_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_2
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_4
-dEQP-VK.renderpass.multisample_resolve.a2b10g10r10_uint_pack32.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_unorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_snorm.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r16g16b16a16_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32_sfloat.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_uint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sint.samples_8
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_2
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_4
-dEQP-VK.renderpass.multisample_resolve.r32g32b32a32_sfloat.samples_8
 dEQP-VK.ubo.2_level_array.std140.float.vertex
 dEQP-VK.ubo.2_level_array.std140.float.fragment
 dEQP-VK.ubo.2_level_array.std140.float.both
@@ -210752,6 +210545,8 @@
 dEQP-VK.wsi.xlib.surface.query_formats
 dEQP-VK.wsi.xlib.surface.query_formats2
 dEQP-VK.wsi.xlib.surface.query_present_modes
+dEQP-VK.wsi.xlib.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.xlib.surface.query_devgroup_present_modes
 dEQP-VK.wsi.xlib.surface.destroy_null_handle
 dEQP-VK.wsi.xlib.surface.initial_size
 dEQP-VK.wsi.xlib.surface.resize
@@ -210805,6 +210600,8 @@
 dEQP-VK.wsi.xcb.surface.query_formats
 dEQP-VK.wsi.xcb.surface.query_formats2
 dEQP-VK.wsi.xcb.surface.query_present_modes
+dEQP-VK.wsi.xcb.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.xcb.surface.query_devgroup_present_modes
 dEQP-VK.wsi.xcb.surface.destroy_null_handle
 dEQP-VK.wsi.xcb.surface.initial_size
 dEQP-VK.wsi.xcb.surface.resize
@@ -210858,6 +210655,8 @@
 dEQP-VK.wsi.wayland.surface.query_formats
 dEQP-VK.wsi.wayland.surface.query_formats2
 dEQP-VK.wsi.wayland.surface.query_present_modes
+dEQP-VK.wsi.wayland.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.wayland.surface.query_devgroup_present_modes
 dEQP-VK.wsi.wayland.surface.destroy_null_handle
 dEQP-VK.wsi.wayland.swapchain.create.min_image_count
 dEQP-VK.wsi.wayland.swapchain.create.image_format
@@ -210910,6 +210709,8 @@
 dEQP-VK.wsi.mir.surface.query_formats
 dEQP-VK.wsi.mir.surface.query_formats2
 dEQP-VK.wsi.mir.surface.query_present_modes
+dEQP-VK.wsi.mir.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.mir.surface.query_devgroup_present_modes
 dEQP-VK.wsi.mir.surface.destroy_null_handle
 dEQP-VK.wsi.mir.surface.initial_size
 dEQP-VK.wsi.mir.surface.resize
@@ -210984,6 +210785,8 @@
 dEQP-VK.wsi.android.surface.query_formats
 dEQP-VK.wsi.android.surface.query_formats2
 dEQP-VK.wsi.android.surface.query_present_modes
+dEQP-VK.wsi.android.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.android.surface.query_devgroup_present_modes
 dEQP-VK.wsi.android.surface.destroy_null_handle
 dEQP-VK.wsi.android.surface.initial_size
 dEQP-VK.wsi.android.swapchain.create.min_image_count
@@ -211057,6 +210860,8 @@
 dEQP-VK.wsi.win32.surface.query_formats
 dEQP-VK.wsi.win32.surface.query_formats2
 dEQP-VK.wsi.win32.surface.query_present_modes
+dEQP-VK.wsi.win32.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.win32.surface.query_devgroup_present_modes
 dEQP-VK.wsi.win32.surface.destroy_null_handle
 dEQP-VK.wsi.win32.surface.initial_size
 dEQP-VK.wsi.win32.surface.resize
@@ -240559,6 +240364,83 @@
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.last_index_out_of_bounds
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.indices_out_of_bounds
 dEQP-VK.robustness.vertex_access.a2b10g10r10_unorm_pack32.draw_indexed.triangle_out_of_bounds
+dEQP-VK.multiview.masks.15
+dEQP-VK.multiview.masks.8
+dEQP-VK.multiview.masks.1_2_4_8
+dEQP-VK.multiview.masks.15_15_15_15
+dEQP-VK.multiview.masks.8_1_1_8
+dEQP-VK.multiview.masks.1_2_4_8_16_32
+dEQP-VK.multiview.masks.max_multi_view_view_count
+dEQP-VK.multiview.input_attachments.15
+dEQP-VK.multiview.input_attachments.8
+dEQP-VK.multiview.input_attachments.1_2_4_8
+dEQP-VK.multiview.input_attachments.15_15_15_15
+dEQP-VK.multiview.input_attachments.8_1_1_8
+dEQP-VK.multiview.input_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.input_attachments.max_multi_view_view_count
+dEQP-VK.multiview.instanced.15
+dEQP-VK.multiview.instanced.8
+dEQP-VK.multiview.instanced.1_2_4_8
+dEQP-VK.multiview.instanced.15_15_15_15
+dEQP-VK.multiview.instanced.8_1_1_8
+dEQP-VK.multiview.instanced.1_2_4_8_16_32
+dEQP-VK.multiview.instanced.max_multi_view_view_count
+dEQP-VK.multiview.input_instance.15
+dEQP-VK.multiview.input_instance.8
+dEQP-VK.multiview.input_instance.1_2_4_8
+dEQP-VK.multiview.input_instance.15_15_15_15
+dEQP-VK.multiview.input_instance.8_1_1_8
+dEQP-VK.multiview.input_instance.1_2_4_8_16_32
+dEQP-VK.multiview.input_instance.max_multi_view_view_count
+dEQP-VK.multiview.draw_indirect.15
+dEQP-VK.multiview.draw_indirect.8
+dEQP-VK.multiview.draw_indirect.1_2_4_8
+dEQP-VK.multiview.draw_indirect.15_15_15_15
+dEQP-VK.multiview.draw_indirect.8_1_1_8
+dEQP-VK.multiview.draw_indirect.1_2_4_8_16_32
+dEQP-VK.multiview.draw_indirect.max_multi_view_view_count
+dEQP-VK.multiview.clear_attachments.15
+dEQP-VK.multiview.clear_attachments.8
+dEQP-VK.multiview.clear_attachments.1_2_4_8
+dEQP-VK.multiview.clear_attachments.15_15_15_15
+dEQP-VK.multiview.clear_attachments.8_1_1_8
+dEQP-VK.multiview.clear_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.clear_attachments.max_multi_view_view_count
+dEQP-VK.multiview.secondary_cmd_buffer.15
+dEQP-VK.multiview.secondary_cmd_buffer.8
+dEQP-VK.multiview.secondary_cmd_buffer.1_2_4_8
+dEQP-VK.multiview.secondary_cmd_buffer.15_15_15_15
+dEQP-VK.multiview.secondary_cmd_buffer.8_1_1_8
+dEQP-VK.multiview.secondary_cmd_buffer.1_2_4_8_16_32
+dEQP-VK.multiview.secondary_cmd_buffer.max_multi_view_view_count
+dEQP-VK.multiview.index.vertex_shader.15
+dEQP-VK.multiview.index.vertex_shader.8
+dEQP-VK.multiview.index.vertex_shader.1_2_4_8
+dEQP-VK.multiview.index.vertex_shader.15_15_15_15
+dEQP-VK.multiview.index.vertex_shader.8_1_1_8
+dEQP-VK.multiview.index.vertex_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.vertex_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.fragment_shader.15
+dEQP-VK.multiview.index.fragment_shader.8
+dEQP-VK.multiview.index.fragment_shader.1_2_4_8
+dEQP-VK.multiview.index.fragment_shader.15_15_15_15
+dEQP-VK.multiview.index.fragment_shader.8_1_1_8
+dEQP-VK.multiview.index.fragment_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.fragment_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.geometry_shader.15
+dEQP-VK.multiview.index.geometry_shader.8
+dEQP-VK.multiview.index.geometry_shader.1_2_4_8
+dEQP-VK.multiview.index.geometry_shader.15_15_15_15
+dEQP-VK.multiview.index.geometry_shader.8_1_1_8
+dEQP-VK.multiview.index.geometry_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.geometry_shader.max_multi_view_view_count
+dEQP-VK.multiview.index.tesellation_shader.15
+dEQP-VK.multiview.index.tesellation_shader.8
+dEQP-VK.multiview.index.tesellation_shader.1_2_4_8
+dEQP-VK.multiview.index.tesellation_shader.15_15_15_15
+dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
+dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
+dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_optimal
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear
 dEQP-VK.ycbcr.format.g8b8g8r8_422_unorm_khr.vertex_linear_mapped
diff --git a/external/vulkancts/scripts/gen_framework.py b/external/vulkancts/scripts/gen_framework.py
index d3b045b..7dee952 100644
--- a/external/vulkancts/scripts/gen_framework.py
+++ b/external/vulkancts/scripts/gen_framework.py
@@ -47,6 +47,7 @@
 	("VK_MAX_MEMORY_TYPES",					"size_t"),
 	("VK_MAX_MEMORY_HEAPS",					"size_t"),
 	("VK_MAX_DESCRIPTION_SIZE",				"size_t"),
+	("VK_MAX_DEVICE_GROUP_SIZE_KHX",		"size_t"),
 	("VK_ATTACHMENT_UNUSED",				"deUint32"),
 	("VK_SUBPASS_EXTERNAL",					"deUint32"),
 	("VK_QUEUE_FAMILY_IGNORED",				"deUint32"),
@@ -85,6 +86,9 @@
 	("HWND",						"Win32WindowHandle",			"void*"),
 	("HANDLE",						"Win32Handle",					"void*"),
 	("const SECURITY_ATTRIBUTES*",	"Win32SecurityAttributesPtr",	"const void*"),
+
+	# VK_ANDROID_external_memory_android_hardware_buffer
+	("AHardwareBuffer*",			"AndroidHardwareBufferPtr",		"void*"),
 ]
 PLATFORM_TYPE_NAMESPACE	= "pt"
 TYPE_SUBSTITUTIONS		= [
@@ -214,8 +218,17 @@
 
 def fixupType (type):
 	for platformType, substitute, compat in PLATFORM_TYPES:
-		if type == platformType:
-			return PLATFORM_TYPE_NAMESPACE + "::" + substitute
+		baseType = type
+		const = ''
+		indirections = 0
+		if baseType.startswith('const') and not platformType.startswith('const'):
+			baseType = baseType[5:].strip()
+			const = "const "
+		while baseType[-1] == '*' and baseType != platformType:
+			indirections += 1
+			baseType = baseType[:-1]
+		if baseType == platformType:
+			return const + PLATFORM_TYPE_NAMESPACE + "::" + substitute + (indirections * '*')
 
 	for src, dst in TYPE_SUBSTITUTIONS:
 		type = type.replace(src, dst)
@@ -736,7 +749,9 @@
 				"vkGetBufferMemoryRequirements2KHR",
 				"vkGetImageMemoryRequirements",
 				"vkGetImageMemoryRequirements2KHR",
+				"vkAllocateMemory",
 				"vkMapMemory",
+				"vkUnmapMemory",
 				"vkAllocateDescriptorSets",
 				"vkFreeDescriptorSets",
 				"vkResetDescriptorPool",
@@ -744,6 +759,9 @@
 				"vkFreeCommandBuffers",
 				"vkCreateDisplayModeKHR",
 				"vkCreateSharedSwapchainsKHR",
+				"vkGetPhysicalDeviceExternalBufferPropertiesKHR",
+				"vkGetPhysicalDeviceImageFormatProperties2KHR",
+				"vkGetMemoryAndroidHardwareBufferANDROID",
 			]
 		specialFuncs		= [f for f in api.functions if f.name in specialFuncNames]
 		createFuncs			= [f for f in api.functions if (f.name[:8] == "vkCreate" or f.name == "vkAllocateMemory") and not f in specialFuncs]
diff --git a/external/vulkancts/scripts/src/vulkan.h.in b/external/vulkancts/scripts/src/vulkan.h.in
index b8e204a..69865ff 100644
--- a/external/vulkancts/scripts/src/vulkan.h.in
+++ b/external/vulkancts/scripts/src/vulkan.h.in
@@ -227,6 +227,23 @@
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = 1000059006,
     VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059007,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = 1000059008,
+    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHX = 1000060000,
+    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHX = 1000060001,
+    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHX = 1000060002,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHX = 1000060003,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHX = 1000060004,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHX = 1000060005,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHX = 1000060006,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHX = 1000060007,
+    VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHX = 1000060008,
+    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHX = 1000060009,
+    VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHX = 1000060010,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHX = 1000060011,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHX = 1000060012,
+    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHX = 1000060013,
+    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHX = 1000060014,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHX = 1000070000,
+    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHX = 1000070001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = 1000071000,
     VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = 1000071001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = 1000071002,
@@ -276,6 +293,13 @@
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = 1000120000,
     VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = 1000127000,
     VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = 1000127001,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129000,
+    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129001,
+    VK_STRUCTURE_TYPE_MEMORY_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129002,
+    VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,
+    VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
+    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_EXTERNAL_FORMAT_PROPERTIES_ANDROID = 1000129005,
+    VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129006,
     VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146000,
     VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = 1000146001,
     VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = 1000147000,
@@ -4293,7 +4317,6 @@
     VkSurfaceFormat2KHR*                        pSurfaceFormats);
 #endif
 
-<<<<<<< HEAD
 #define VK_KHR_external_fence_capabilities 1
 #define VK_LUID_SIZE_KHR                  8
 #define VK_KHR_EXTERNAL_FENCE_CAPABILITIES_SPEC_VERSION 1
@@ -4439,8 +4462,6 @@
     int*                                        pFd);
 #endif
 
-=======
->>>>>>> 6c472cc5... Test VK_KHR_dedicated_allocation mem requirement queries
 #define VK_KHR_dedicated_allocation 1
 #define VK_KHR_DEDICATED_ALLOCATION_SPEC_VERSION 1
 #define VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME "VK_KHR_dedicated_allocation"
@@ -4459,10 +4480,7 @@
     VkBuffer           buffer;
 } VkMemoryDedicatedAllocateInfoKHR;
 
-<<<<<<< HEAD
 
-=======
->>>>>>> 6c472cc5... Test VK_KHR_dedicated_allocation mem requirement queries
 #define VK_KHR_get_memory_requirements2 1
 #define VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION 1
 #define VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME "VK_KHR_get_memory_requirements2"
@@ -4788,6 +4806,7 @@
     VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR = 0x00000010,
     VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR = 0x00000020,
     VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR = 0x00000040,
+    VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000080,
     VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
 } VkExternalMemoryHandleTypeFlagBitsKHR;
 typedef VkFlags VkExternalMemoryHandleTypeFlagsKHR;
@@ -5205,6 +5224,214 @@
     VkBool32           variablePointers;
 } VkPhysicalDeviceVariablePointerFeaturesKHR;
 
+#define VK_KHX_device_group 1
+#define VK_MAX_DEVICE_GROUP_SIZE_KHX      32
+#define VK_KHX_DEVICE_GROUP_SPEC_VERSION  2
+#define VK_KHX_DEVICE_GROUP_EXTENSION_NAME "VK_KHX_device_group"
+
+typedef enum VkPeerMemoryFeatureFlagBitsKHX {
+    VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHX = 0x00000001,
+    VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHX = 0x00000002,
+    VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHX = 0x00000004,
+    VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHX = 0x00000008,
+    VK_PEER_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkPeerMemoryFeatureFlagBitsKHX;
+typedef VkFlags VkPeerMemoryFeatureFlagsKHX;
+
+typedef enum VkMemoryAllocateFlagBitsKHX {
+    VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHX = 0x00000001,
+    VK_MEMORY_ALLOCATE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkMemoryAllocateFlagBitsKHX;
+typedef VkFlags VkMemoryAllocateFlagsKHX;
+
+typedef enum VkDeviceGroupPresentModeFlagBitsKHX {
+    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHX = 0x00000001,
+    VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHX = 0x00000002,
+    VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHX = 0x00000004,
+    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHX = 0x00000008,
+    VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHX = 0x7FFFFFFF
+} VkDeviceGroupPresentModeFlagBitsKHX;
+typedef VkFlags VkDeviceGroupPresentModeFlagsKHX;
+
+typedef struct VkMemoryAllocateFlagsInfoKHX {
+    VkStructureType             sType;
+    const void*                 pNext;
+    VkMemoryAllocateFlagsKHX    flags;
+    uint32_t                    deviceMask;
+} VkMemoryAllocateFlagsInfoKHX;
+
+typedef struct VkDeviceGroupRenderPassBeginInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceMask;
+    uint32_t           deviceRenderAreaCount;
+    const VkRect2D*    pDeviceRenderAreas;
+} VkDeviceGroupRenderPassBeginInfoKHX;
+
+typedef struct VkDeviceGroupCommandBufferBeginInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceMask;
+} VkDeviceGroupCommandBufferBeginInfoKHX;
+
+typedef struct VkDeviceGroupSubmitInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           waitSemaphoreCount;
+    const uint32_t*    pWaitSemaphoreDeviceIndices;
+    uint32_t           commandBufferCount;
+    const uint32_t*    pCommandBufferDeviceMasks;
+    uint32_t           signalSemaphoreCount;
+    const uint32_t*    pSignalSemaphoreDeviceIndices;
+} VkDeviceGroupSubmitInfoKHX;
+
+typedef struct VkDeviceGroupBindSparseInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           resourceDeviceIndex;
+    uint32_t           memoryDeviceIndex;
+} VkDeviceGroupBindSparseInfoKHX;
+
+typedef struct VkDeviceGroupPresentCapabilitiesKHX {
+    VkStructureType                     sType;
+    const void*                         pNext;
+    uint32_t                            presentMask[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+    VkDeviceGroupPresentModeFlagsKHX    modes;
+} VkDeviceGroupPresentCapabilitiesKHX;
+
+typedef struct VkImageSwapchainCreateInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+} VkImageSwapchainCreateInfoKHX;
+
+typedef struct VkBindBufferMemoryDeviceGroupInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceIndexCount;
+    const uint32_t*    pDeviceIndices;
+} VkBindBufferMemoryDeviceGroupInfoKHX;
+
+typedef struct VkBindImageMemoryDeviceGroupInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           deviceIndexCount;
+    const uint32_t*    pDeviceIndices;
+    uint32_t           SFRRectCount;
+    const VkRect2D*    pSFRRects;
+} VkBindImageMemoryDeviceGroupInfoKHX;
+
+typedef struct VkBindImageMemorySwapchainInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+    uint32_t           imageIndex;
+} VkBindImageMemorySwapchainInfoKHX;
+
+typedef struct VkAcquireNextImageInfoKHX {
+    VkStructureType    sType;
+    const void*        pNext;
+    VkSwapchainKHR     swapchain;
+    uint64_t           timeout;
+    VkSemaphore        semaphore;
+    VkFence            fence;
+    uint32_t           deviceMask;
+} VkAcquireNextImageInfoKHX;
+
+typedef struct VkDeviceGroupPresentInfoKHX {
+    VkStructureType                        sType;
+    const void*                            pNext;
+    uint32_t                               swapchainCount;
+    const uint32_t*                        pDeviceMasks;
+    VkDeviceGroupPresentModeFlagBitsKHX    mode;
+} VkDeviceGroupPresentInfoKHX;
+
+typedef struct VkDeviceGroupSwapchainCreateInfoKHX {
+    VkStructureType                     sType;
+    const void*                         pNext;
+    VkDeviceGroupPresentModeFlagsKHX    modes;
+} VkDeviceGroupSwapchainCreateInfoKHX;
+
+
+typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeaturesKHX)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlagsKHX* pPeerMemoryFeatures);
+typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHX)(VkCommandBuffer commandBuffer, uint32_t deviceMask);
+typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHX)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX* pDeviceGroupPresentCapabilities);
+typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHX)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHX* pModes);
+typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHX)(VkDevice device, const VkAcquireNextImageInfoKHX* pAcquireInfo, uint32_t* pImageIndex);
+typedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHX)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHX)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHX(
+    VkDevice                                    device,
+    uint32_t                                    heapIndex,
+    uint32_t                                    localDeviceIndex,
+    uint32_t                                    remoteDeviceIndex,
+    VkPeerMemoryFeatureFlagsKHX*                pPeerMemoryFeatures);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHX(
+    VkCommandBuffer                             commandBuffer,
+    uint32_t                                    deviceMask);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHX(
+    VkDevice                                    device,
+    VkDeviceGroupPresentCapabilitiesKHX*        pDeviceGroupPresentCapabilities);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHX(
+    VkDevice                                    device,
+    VkSurfaceKHR                                surface,
+    VkDeviceGroupPresentModeFlagsKHX*           pModes);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHX(
+    VkDevice                                    device,
+    const VkAcquireNextImageInfoKHX*            pAcquireInfo,
+    uint32_t*                                   pImageIndex);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHX(
+    VkCommandBuffer                             commandBuffer,
+    uint32_t                                    baseGroupX,
+    uint32_t                                    baseGroupY,
+    uint32_t                                    baseGroupZ,
+    uint32_t                                    groupCountX,
+    uint32_t                                    groupCountY,
+    uint32_t                                    groupCountZ);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHX(
+    VkPhysicalDevice                            physicalDevice,
+    VkSurfaceKHR                                surface,
+    uint32_t*                                   pRectCount,
+    VkRect2D*                                   pRects);
+#endif
+
+#define VK_KHX_device_group_creation 1
+#define VK_KHX_DEVICE_GROUP_CREATION_SPEC_VERSION 1
+#define VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME "VK_KHX_device_group_creation"
+
+typedef struct VkPhysicalDeviceGroupPropertiesKHX {
+    VkStructureType     sType;
+    void*               pNext;
+    uint32_t            physicalDeviceCount;
+    VkPhysicalDevice    physicalDevices[VK_MAX_DEVICE_GROUP_SIZE_KHX];
+    VkBool32            subsetAllocation;
+} VkPhysicalDeviceGroupPropertiesKHX;
+
+typedef struct VkDeviceGroupDeviceCreateInfoKHX {
+    VkStructureType            sType;
+    const void*                pNext;
+    uint32_t                   physicalDeviceCount;
+    const VkPhysicalDevice*    pPhysicalDevices;
+} VkDeviceGroupDeviceCreateInfoKHX;
+
+
+typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHX)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX* pPhysicalDeviceGroupProperties);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHX(
+    VkInstance                                  instance,
+    uint32_t*                                   pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupPropertiesKHX*         pPhysicalDeviceGroupProperties);
+#endif
+
 #define VK_KHR_bind_memory2 1
 #define VK_KHR_BIND_MEMORY_2_SPEC_VERSION 1
 #define VK_KHR_BIND_MEMORY_2_EXTENSION_NAME "VK_KHR_bind_memory2"
@@ -5241,6 +5468,83 @@
     const VkBindImageMemoryInfoKHR*             pBindInfos);
 #endif
 
+#define VK_ANDROID_external_memory_android_hardware_buffer 1
+#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 1
+#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer"
+
+typedef struct VkPhysicalDeviceAndroidHardwareBufferInfoANDROID {
+    VkStructureType       sType;
+    void*                 pNext;
+    VkFormat              format;
+    VkImageTiling         tiling;
+    VkImageUsageFlags     imageUsage;
+    VkImageCreateFlags    imageFlags;
+} VkPhysicalDeviceAndroidHardwareBufferInfoANDROID;
+
+typedef struct VkAndroidHardwareBufferUsageANDROID {
+    VkStructureType    sType;
+    void*              pNext;
+    uint64_t           androidHardwareBufferUsage;
+} VkAndroidHardwareBufferUsageANDROID;
+
+typedef struct VkMemoryAndroidHardwareBufferPropertiesANDROID {
+    VkStructureType    sType;
+    void*              pNext;
+    VkDeviceSize       allocationSize;
+    uint32_t           memoryTypeBits;
+} VkMemoryAndroidHardwareBufferPropertiesANDROID;
+
+typedef struct VkImportAndroidHardwareBufferInfoANDROID {
+    VkStructureType     sType;
+    const void*         pNext;
+    AHardwareBuffer*    buffer;
+} VkImportAndroidHardwareBufferInfoANDROID;
+
+typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID {
+    VkStructureType    sType;
+    void*              pNext;
+    VkDeviceMemory     memory;
+} VkMemoryGetAndroidHardwareBufferInfoANDROID;
+
+typedef struct VkAndroidHardwareBufferExternalFormatPropertiesANDROID {
+    VkStructureType                     sType;
+    void*                               pNext;
+    uint32_t                            externalFormat;
+    VkFormatFeatureFlags                formatFeatures;
+    VkSamplerYcbcrModelConversionKHR    suggestedYcbcrModel;
+    VkSamplerYcbcrRangeKHR              suggestedYcbcrRange;
+    VkChromaLocationKHR                 suggestedXChromaOffset;
+    VkChromaLocationKHR                 suggestedYChromaOffset;
+} VkAndroidHardwareBufferExternalFormatPropertiesANDROID;
+
+typedef struct VkExternalFormatANDROID {
+    VkStructureType    sType;
+    void*              pNext;
+    uint32_t           externalFormat;
+} VkExternalFormatANDROID;
+
+
+typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceAndroidHardwareBufferUsageANDROID)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo, VkAndroidHardwareBufferUsageANDROID* pUsage);
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const AHardwareBuffer* buffer, VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties);
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, AHardwareBuffer** pBuffer);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceAndroidHardwareBufferUsageANDROID(
+    VkPhysicalDevice                            physicalDevice,
+    const VkPhysicalDeviceAndroidHardwareBufferInfoANDROID* pInfo,
+    VkAndroidHardwareBufferUsageANDROID*        pUsage);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferPropertiesANDROID(
+    VkDevice                                    device,
+    const AHardwareBuffer*                      buffer,
+    VkMemoryAndroidHardwareBufferPropertiesANDROID* pProperties);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID(
+    VkDevice                                    device,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
+    AHardwareBuffer**                           pBuffer);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/framework/common/tcuCommandLine.cpp b/framework/common/tcuCommandLine.cpp
index 99c6faa..e6d4b32 100644
--- a/framework/common/tcuCommandLine.cpp
+++ b/framework/common/tcuCommandLine.cpp
@@ -86,6 +86,7 @@
 DE_DECLARE_COMMAND_LINE_OPT(LogShaderSources,			bool);
 DE_DECLARE_COMMAND_LINE_OPT(TestOOM,					bool);
 DE_DECLARE_COMMAND_LINE_OPT(VKDeviceID,					int);
+DE_DECLARE_COMMAND_LINE_OPT(VKDeviceGroupID,			int);
 DE_DECLARE_COMMAND_LINE_OPT(LogFlush,					bool);
 DE_DECLARE_COMMAND_LINE_OPT(Validation,					bool);
 
@@ -171,6 +172,7 @@
 		<< Option<EGLWindowType>		(DE_NULL,	"deqp-egl-window-type",			"EGL native window type")
 		<< Option<EGLPixmapType>		(DE_NULL,	"deqp-egl-pixmap-type",			"EGL native pixmap type")
 		<< Option<VKDeviceID>			(DE_NULL,	"deqp-vk-device-id",			"Vulkan device ID (IDs start from 1)",									"1")
+		<< Option<VKDeviceGroupID>		(DE_NULL,	"deqp-vk-device-group-id",		"Vulkan device Group ID (IDs start from 1)",							"1")
 		<< Option<LogImages>			(DE_NULL,	"deqp-log-images",				"Enable or disable logging of result images",		s_enableNames,		"enable")
 		<< Option<LogShaderSources>		(DE_NULL,	"deqp-log-shader-sources",		"Enable or disable logging of shader sources",		s_enableNames,		"enable")
 		<< Option<TestOOM>				(DE_NULL,	"deqp-test-oom",				"Run tests that exhaust memory on purpose",			s_enableNames,		TEST_OOM_DEFAULT)
@@ -786,6 +788,7 @@
 int						CommandLine::getCLPlatformId			(void) const	{ return m_cmdLine.getOption<opt::CLPlatformID>();					}
 const std::vector<int>&	CommandLine::getCLDeviceIds				(void) const	{ return m_cmdLine.getOption<opt::CLDeviceIDs>();					}
 int						CommandLine::getVKDeviceId				(void) const	{ return m_cmdLine.getOption<opt::VKDeviceID>();					}
+int						CommandLine::getVKDeviceGroupId			(void) const	{ return m_cmdLine.getOption<opt::VKDeviceGroupID>();				}
 bool					CommandLine::isValidationEnabled		(void) const	{ return m_cmdLine.getOption<opt::Validation>();					}
 bool					CommandLine::isOutOfMemoryTestEnabled	(void) const	{ return m_cmdLine.getOption<opt::TestOOM>();						}
 
diff --git a/framework/common/tcuCommandLine.hpp b/framework/common/tcuCommandLine.hpp
index 65388a2..c25951d 100644
--- a/framework/common/tcuCommandLine.hpp
+++ b/framework/common/tcuCommandLine.hpp
@@ -202,6 +202,9 @@
 	//! Get Vulkan device ID (--deqp-vk-device-id)
 	int								getVKDeviceId				(void) const;
 
+	//! Get Vulkan device group ID (--deqp-vk-device-group-id)
+	int								getVKDeviceGroupId			(void) const;
+
 	//! Enable development-time test case validation checks
 	bool							isValidationEnabled			(void) const;
 
diff --git a/scripts/android/build_apk.py b/scripts/android/build_apk.py
index 796dbee..2f86bd8 100644
--- a/scripts/android/build_apk.py
+++ b/scripts/android/build_apk.py
@@ -168,12 +168,12 @@
 		self.ndk		= ndk
 
 class Configuration:
-	def __init__(self, env, buildPath, abis, nativeBuildType, gtfTarget, verbose):
+	def __init__(self, env, buildPath, abis, nativeApi, nativeBuildType, gtfTarget, verbose):
 		self.env				= env
 		self.sourcePath			= DEQP_DIR
 		self.buildPath			= buildPath
 		self.abis				= abis
-		self.nativeApi			= 21
+		self.nativeApi			= nativeApi
 		self.javaApi			= 22
 		self.nativeBuildType	= nativeBuildType
 		self.gtfTarget			= gtfTarget
@@ -190,9 +190,9 @@
 		if not NDKEnv.isHostOsSupported(self.env.ndk.hostOsName):
 			raise Exception("NDK '%s' is not supported on this machine" % self.env.ndk.hostOsName)
 
-		supportedNDKVersion = 11
-		if self.env.ndk.version[0] != supportedNDKVersion:
-			raise Exception("Android NDK version %d is not supported; build requires NDK version %d" % (self.env.ndk.version[0], supportedNDKVersion))
+		supportedNDKVersion = [11, 15]
+		if self.env.ndk.version[0] not in supportedNDKVersion:
+			raise Exception("Android NDK version %d is not supported; build requires NDK version %s" % (self.env.ndk.version[0], supportedNDKVersion))
 
 		if self.env.sdk.buildToolsVersion == (0,0,0):
 			raise Exception("No build tools directory found at %s" % os.path.join(self.env.sdk.path, "build-tools"))
@@ -856,6 +856,11 @@
 		dest='abis',
 		default=",".join(NDKEnv.getKnownAbis()),
 		help="ABIs to build")
+	parser.add_argument('--native-api',
+		type=int,
+		dest='nativeApi',
+		default=21,
+		help="Android API level to target in native code")
 	parser.add_argument('--sdk',
 		dest='sdkPath',
 		default=defaultSDKPath,
@@ -915,7 +920,7 @@
 	sdk			= SDKEnv(os.path.realpath(args.sdkPath))
 	buildPath	= os.path.realpath(args.buildRoot)
 	env			= Environment(sdk, ndk)
-	config		= Configuration(env, buildPath, abis=args.abis, nativeBuildType=args.nativeBuildType, gtfTarget=args.gtfTarget, verbose=args.verbose)
+	config		= Configuration(env, buildPath, abis=args.abis, nativeApi=args.nativeApi, nativeBuildType=args.nativeBuildType, gtfTarget=args.gtfTarget, verbose=args.verbose)
 
 	try:
 		config.check()
diff --git a/targets/android/ndk-r15.cmake b/targets/android/ndk-r15.cmake
new file mode 100644
index 0000000..bcbbb8f
--- /dev/null
+++ b/targets/android/ndk-r15.cmake
@@ -0,0 +1,199 @@
+#-------------------------------------------------------------------------
+# drawElements CMake utilities
+# ----------------------------
+#
+# Copyright 2016 The Android Open Source Project
+#
+# 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.
+#
+#-------------------------------------------------------------------------
+
+# CMake 3.2 fixed a bug [1] that prevents using different --sysroot arguments
+# for compile and link steps in the built-in try_compile() that cmake does.
+# Since NDK r15 has separate header and library sysroots, that's necessary.
+# We could use -isysroot for headers and --sysroot= for libs, except that
+# clang's -isysroot appears to be broken (Google internal b/64158294).
+#
+# [1] https://cmake.org/cmake/help/v3.2/policy/CMP0056.html
+cmake_minimum_required(VERSION 3.2)
+
+# Platform defines.
+set(CMAKE_SYSTEM_NAME Linux)
+
+set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
+
+set(CMAKE_CROSSCOMPILING 1)
+
+# NDK installation path
+if (NOT DEFINED ANDROID_NDK_PATH)
+	message(FATAL_ERROR "Please provide ANDROID_NDK_PATH")
+endif ()
+
+# Host os (for toolchain binaries)
+if (NOT DEFINED ANDROID_NDK_HOST_OS)
+	message(FATAL_ERROR "Please provide ANDROID_NDK_HOST_OS")
+endif ()
+
+# Compile target
+set(ANDROID_ABI			"armeabi-v7a"			CACHE STRING "Android ABI")
+set(ANDROID_NDK_TARGET	"android-${DE_ANDROID_API}")
+
+# dE defines
+set(DE_OS "DE_OS_ANDROID")
+
+if (NOT DEFINED DE_COMPILER)
+	set(DE_COMPILER	"DE_COMPILER_CLANG")
+endif ()
+
+if (NOT DEFINED DE_ANDROID_API)
+	set(DE_ANDROID_API 9)
+endif ()
+
+# ABI-dependent bits
+if (ANDROID_ABI STREQUAL "x86")
+	set(DE_CPU					"DE_CPU_X86")
+	set(CMAKE_SYSTEM_PROCESSOR	i686-linux-android)
+
+	set(ANDROID_CC_PATH			"${ANDROID_NDK_PATH}/toolchains/x86-4.9/prebuilt/${ANDROID_NDK_HOST_OS}/")
+	set(CROSS_COMPILE			"${ANDROID_CC_PATH}bin/i686-linux-android-")
+	set(ANDROID_LIB_SYSROOT		"${ANDROID_NDK_PATH}/platforms/${ANDROID_NDK_TARGET}/arch-x86")
+
+	set(CMAKE_FIND_ROOT_PATH
+		"${ANDROID_CC_PATH}i686-linux-android"
+		"${ANDROID_CC_PATH}lib/gcc/i686-linux-android/4.9"
+		)
+
+	set(TARGET_C_FLAGS			"-march=i686 -msse3 -mstackrealign -mfpmath=sse")
+	set(TARGET_LINKER_FLAGS		"")
+	set(LLVM_TRIPLE				"i686-none-linux-android")
+
+elseif (ANDROID_ABI STREQUAL "armeabi" OR
+		ANDROID_ABI STREQUAL "armeabi-v7a")
+	set(DE_CPU					"DE_CPU_ARM")
+	set(CMAKE_SYSTEM_PROCESSOR	arm-linux-androideabi)
+
+	set(ANDROID_CC_PATH		"${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/${ANDROID_NDK_HOST_OS}/")
+	set(CROSS_COMPILE		"${ANDROID_CC_PATH}bin/arm-linux-androideabi-")
+	set(ANDROID_LIB_SYSROOT	"${ANDROID_NDK_PATH}/platforms/${ANDROID_NDK_TARGET}/arch-arm")
+	set(ARM_C_FLAGS			"-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ ")
+
+	if (ANDROID_ABI STREQUAL "armeabi-v7a")
+		set(TARGET_C_FLAGS		"${ARM_C_FLAGS} -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp")
+		set(TARGET_LINKER_FLAGS	"-Wl,--fix-cortex-a8 -march=armv7-a")
+		set(LLVM_TRIPLE			"armv7-none-linux-androideabi")
+
+	else () # armeabi
+		set(TARGET_C_FLAGS		"${ARM_C_FLAGS} -march=armv5te -mfloat-abi=softfp")
+		set(TARGET_LINKER_FLAGS	"-Wl,--fix-cortex-a8 -march=armv5te")
+		set(LLVM_TRIPLE			"armv5te-none-linux-androideabi")
+	endif ()
+
+	set(CMAKE_FIND_ROOT_PATH
+		"${ANDROID_CC_PATH}arm-linux-androideabi"
+		)
+
+elseif (ANDROID_ABI STREQUAL "arm64-v8a")
+	set(DE_CPU					"DE_CPU_ARM_64")
+	set(CMAKE_SYSTEM_PROCESSOR	aarch64-linux-android)
+	set(CMAKE_SIZEOF_VOID_P		8)
+
+	set(ANDROID_CC_PATH		"${ANDROID_NDK_PATH}/toolchains/aarch64-linux-android-4.9/prebuilt/${ANDROID_NDK_HOST_OS}/")
+	set(CROSS_COMPILE		"${ANDROID_CC_PATH}bin/aarch64-linux-android-")
+	set(ANDROID_LIB_SYSROOT	"${ANDROID_NDK_PATH}/platforms/${ANDROID_NDK_TARGET}/arch-arm64")
+
+	set(CMAKE_FIND_ROOT_PATH
+		"${ANDROID_CC_PATH}arm-linux-androideabi"
+		)
+
+	set(TARGET_C_FLAGS		"-march=armv8-a")
+	set(TARGET_LINKER_FLAGS	"-Wl,--fix-cortex-a53-835769 -Wl,--fix-cortex-a53-835769 -march=armv8-a")
+	set(LLVM_TRIPLE			"aarch64-none-linux-android")
+
+	if (DE_COMPILER STREQUAL "DE_COMPILER_GCC")
+		set(TARGET_C_FLAGS "${TARGET_C_FLAGS} -mabi=lp64")
+	endif ()
+
+elseif (ANDROID_ABI STREQUAL "x86_64")
+	set(DE_CPU					"DE_CPU_X86_64")
+	set(CMAKE_SYSTEM_PROCESSOR	x86_64-linux-android)
+	set(CMAKE_SIZEOF_VOID_P		8)
+
+	set(CMAKE_LIBRARY_PATH "/usr/lib64")
+
+	set(ANDROID_CC_PATH		"${ANDROID_NDK_PATH}/toolchains/x86_64-4.9/prebuilt/${ANDROID_NDK_HOST_OS}/")
+	set(CROSS_COMPILE		"${ANDROID_CC_PATH}bin/x86_64-linux-android-")
+	set(ANDROID_LIB_SYSROOT	"${ANDROID_NDK_PATH}/platforms/${ANDROID_NDK_TARGET}/arch-x86_64")
+
+	set(CMAKE_FIND_ROOT_PATH
+		"${ANDROID_CC_PATH}x86_64-linux-android"
+		)
+
+	set(LLVM_TRIPLE			"x86_64-none-linux-android")
+
+else ()
+	message(FATAL_ERROR "Unknown ABI \"${ANDROID_ABI}\"")
+endif ()
+
+set(ANDROID_HEADER_SYSROOT "${ANDROID_NDK_PATH}/sysroot")
+
+set(COMMON_C_FLAGS		"-D__STDC_INT64__ -D__ANDROID_API__=${DE_ANDROID_API} -isystem ${ANDROID_HEADER_SYSROOT}/usr/include/${CMAKE_SYSTEM_PROCESSOR} --sysroot=${ANDROID_HEADER_SYSROOT}")
+set(COMMON_CXX_FLAGS	"${COMMON_C_FLAGS} -frtti -fexceptions")
+set(COMMON_LINKER_FLAGS	"--sysroot=${ANDROID_LIB_SYSROOT}")
+
+# Use LLVM libc++ for full C++11 support
+set(ANDROID_CXX_PATH    "${ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++")
+set(ANDROID_CXX_LIBRARY	"-L${ANDROID_CXX_PATH}/libs/${ANDROID_ABI} ${ANDROID_CXX_PATH}/libs/${ANDROID_ABI}/libc++_static.a" "${ANDROID_CXX_PATH}/libs/${ANDROID_ABI}/libc++abi.a" "${ANDROID_CXX_PATH}/libs/${ANDROID_ABI}/libandroid_support.a")
+set(CXX_INCLUDES		"-I${ANDROID_CXX_PATH}/include")
+
+set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ANDROID_HEADER_SYSROOT} ${ANDROID_LIB_SYSROOT})
+
+include(CMakeForceCompiler)
+
+if (ANDROID_NDK_HOST_OS STREQUAL "windows" OR
+	ANDROID_NDK_HOST_OS STREQUAL "windows-x86_64")
+	set(BIN_EXT ".exe")
+else ()
+	set(BIN_EXT "")
+endif ()
+
+if (DE_COMPILER STREQUAL "DE_COMPILER_GCC")
+	set(CMAKE_C_COMPILER	"${CROSS_COMPILE}gcc${BIN_EXT}"		CACHE FILEPATH "C Compiler")
+	set(CMAKE_CXX_COMPILER	"${CROSS_COMPILE}g++${BIN_EXT}"		CACHE FILEPATH "C++ Compiler")
+
+	set(TARGET_C_FLAGS		"-mandroid ${TARGET_C_FLAGS}")
+
+elseif (DE_COMPILER STREQUAL "DE_COMPILER_CLANG")
+	set(LLVM_PATH "${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/${ANDROID_NDK_HOST_OS}/")
+
+	set(CMAKE_C_COMPILER	"${LLVM_PATH}bin/clang${BIN_EXT}"	CACHE FILEPATH "C Compiler")
+	set(CMAKE_CXX_COMPILER	"${LLVM_PATH}bin/clang++${BIN_EXT}"	CACHE FILEPATH "C++ Compiler")
+	set(CMAKE_AR			"${CROSS_COMPILE}ar${BIN_EXT}"		CACHE FILEPATH "Archiver")
+	set(CMAKE_RANLIB		"${CROSS_COMPILE}ranlib${BIN_EXT}"	CACHE FILEPATH "Indexer")
+
+	set(TARGET_C_FLAGS		"-target ${LLVM_TRIPLE} -gcc-toolchain ${ANDROID_CC_PATH} ${TARGET_C_FLAGS}")
+	set(TARGET_LINKER_FLAGS	"-target ${LLVM_TRIPLE} -gcc-toolchain ${ANDROID_CC_PATH} ${TARGET_LINKER_FLAGS}")
+
+endif ()
+
+set(CMAKE_SHARED_LIBRARY_C_FLAGS	"")
+set(CMAKE_SHARED_LIBRARY_CXX_FLAGS	"")
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# \note Without CACHE STRING FORCE cmake ignores these.
+set(CMAKE_C_FLAGS				"${CMAKE_C_FLAGS} ${COMMON_C_FLAGS} ${TARGET_C_FLAGS}" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS				"${CMAKE_CXX_FLAGS} ${COMMON_CXX_FLAGS} ${TARGET_C_FLAGS} ${CXX_INCLUDES} -I${ANDROID_NDK_PATH}/sources/android/support/include" CACHE STRING "" FORCE)
+set(CMAKE_SHARED_LINKER_FLAGS	"-Wl,-shared,-Bsymbolic -Wl,--no-undefined ${COMMON_LINKER_FLAGS} ${TARGET_LINKER_FLAGS}" CACHE STRING "" FORCE)
+set(CMAKE_EXE_LINKER_FLAGS		"${COMMON_LINKER_FLAGS} ${TARGET_LINKER_FLAGS}" CACHE STRING "" FORCE)