Log unsupported extensions used in pNext structs

The Vulkan spec states that if an implementation does not support an
extension, then it must ignore all fields other than pNext and pType and
continue on without processing any further information contained in the
extension's structure. We've been using asserts to log these situations
so we can tell which extension structs people are trying to use.

This CL changes our behavior so we silently log these unsupported extensions,
and warn a user once if they're debugging.

Retrying this after updating build files to include added VkStringify.*pp files.

Bug: b/139528538
Change-Id: Icd4ea3f53bf2eec5c2c81079b2ebbaa1b9a855db
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38568
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Sean Risser <srisser@google.com>
Presubmit-Ready: Sean Risser <srisser@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/BUILD.gn b/src/Vulkan/BUILD.gn
index bd7d521..94f067f 100644
--- a/src/Vulkan/BUILD.gn
+++ b/src/Vulkan/BUILD.gn
@@ -87,6 +87,7 @@
     "VkSampler.hpp",
     "VkSemaphore.hpp",
     "VkShaderModule.hpp",
+	"VkStringify.hpp",
     "VulkanPlatform.h",
   ]
   if (is_linux || is_android) {
@@ -135,6 +136,7 @@
     "VkSampler.cpp",
     "VkSemaphore.cpp",
     "VkShaderModule.cpp",
+	"VkStringify.cpp",
     "Vulkan.rc",
     "libVulkan.cpp",
     "main.cpp",
diff --git a/src/Vulkan/VkDebug.cpp b/src/Vulkan/VkDebug.cpp
index 262f700..37beb7a 100644
--- a/src/Vulkan/VkDebug.cpp
+++ b/src/Vulkan/VkDebug.cpp
@@ -15,8 +15,76 @@
 #include "VkDebug.hpp"
 
 #include <string>
+#include <atomic>
 #include <stdarg.h>
 
+#if defined(__unix__)
+#define PTRACE
+#include <sys/types.h>
+#include <sys/ptrace.h>
+#elif defined(_WIN32) || defined(_WIN64)
+#include <windows.h>
+#elif defined(__APPLE__) || defined(__MACH__)
+#include <unistd.h>
+#include <sys/sysctl.h>
+#endif
+
+namespace {
+
+bool IsUnderDebugger()
+{
+#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__)
+	static bool checked = false;
+	static bool res = false;
+
+	if (!checked)
+	{
+		// If a debugger is attached then we're already being ptraced and ptrace
+		// will return a non-zero value.
+		checked = true;
+		if (ptrace(PTRACE_TRACEME, 0, 1, 0) != 0)
+		{
+			res = true;
+		}
+		else
+		{
+			ptrace(PTRACE_DETACH, 0, 1, 0);
+		}
+	}
+
+	return res;
+#elif defined(_WIN32) || defined(_WIN64)
+	return IsDebuggerPresent() != 0;
+#elif defined(__APPLE__) || defined(__MACH__)
+	// Code comes from the Apple Technical Q&A QA1361
+
+	// Tell sysctl what info we're requestion. Specifically we're asking for
+	// info about this our PID.
+	int res = 0;
+	int request[4] = {
+		CTL_KERN,
+		KERN_PROC,
+		KERN_PROC_PID,
+		getpid()
+	};
+	struct kinfo_proc info;
+	size_t size = sizeof(info);
+
+	info.kp_proc.p_flag = 0;
+
+	// Get the info we're requesting, if sysctl fails then info.kp_proc.p_flag will remain 0.
+	res = sysctl(request, sizeof(request) / sizeof(*request), &info, &size, NULL, 0);
+	ASSERT_MSG(res == 0, "syscl returned %d", res);
+
+	// We're being debugged if the P_TRACED flag is set
+	return ((info.kp_proc.p_flag & P_TRACED) != 0);
+#else
+	return false;
+#endif
+}
+
+}
+
 namespace vk
 {
 
@@ -71,4 +139,29 @@
 	::abort();
 }
 
+void trace_assert(const char *format, ...)
+{
+	static std::atomic<bool> asserted = {false};
+	va_list vararg;
+	va_start(vararg, format);
+
+	if (IsUnderDebugger() && !asserted.exchange(true))
+	{
+		// Abort after tracing and printing to stderr
+		tracev(format, vararg);
+		va_end(vararg);
+
+		va_start(vararg, format);
+		vfprintf(stderr, format, vararg);
+		va_end(vararg);
+
+		::abort();
+	}
+	else if (!asserted)
+	{
+		tracev(format, vararg);
+		va_end(vararg);
+	}
+}
+
 }
diff --git a/src/Vulkan/VkDebug.hpp b/src/Vulkan/VkDebug.hpp
index 31d62b2..95b4ff9 100644
--- a/src/Vulkan/VkDebug.hpp
+++ b/src/Vulkan/VkDebug.hpp
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <stdio.h>
+#include <string>
 
 #if !defined(TRACE_OUTPUT_FILE)
 #define TRACE_OUTPUT_FILE "debug.txt"
@@ -43,14 +44,19 @@
 
 	// Outputs the message to the debugging log and stderr, and calls abort().
 	void abort(const char *format, ...) CHECK_PRINTF_ARGS;
+
+	// Outputs text to the debugging log, and asserts once if a debugger is attached.
+	void trace_assert(const char *format, ...) CHECK_PRINTF_ARGS;
 }
 
 // A macro to output a trace of a function call and its arguments to the
 // debugging log. Disabled if SWIFTSHADER_DISABLE_TRACE is defined.
 #if defined(SWIFTSHADER_DISABLE_TRACE)
 #define TRACE(message, ...) (void(0))
+#define TRACE_ASSERT(message, ...) (void(0))
 #else
 #define TRACE(message, ...) vk::trace("%s:%d TRACE: " message "\n", __FILE__, __LINE__, ##__VA_ARGS__)
+#define TRACE_ASSERT(message, ...) vk::trace_assert("%s:%d %s TRACE_ASSERT: " message "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
 #endif
 
 // A macro to print a warning message to the debugging log and stderr to denote
diff --git a/src/Vulkan/VkStringify.cpp b/src/Vulkan/VkStringify.cpp
new file mode 100644
index 0000000..5fb4a2b
--- /dev/null
+++ b/src/Vulkan/VkStringify.cpp
@@ -0,0 +1,474 @@
+// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
+//
+// 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.
+#include "VkStringify.hpp"
+#include "VkDebug.hpp"
+#include "vulkan/vk_ext_provoking_vertex.h"
+
+#include <iostream>
+#include <map>
+#include <string>
+
+namespace vk {
+
+const char *Stringify(VkStructureType value)
+{
+#ifndef NDEBUG
+	// Since C++ hasn't given us introspection on enums, we can't just "get" an
+	// enum name from an enum value (at least not without some crazy header
+	// file hacks). So I copied the entire list of VK_STRUCTURE_TYPE defined in
+	// vulkan/vulkan_core.h.
+	//
+	// If vulkan_core.h is updated to include new structure types, and this list
+	// becomes out of date, then this function will throw a warning if someone
+	// tries to stringify that enum value.
+	static const std::map<VkStructureType, const char *> strings = {
+#define INSERT_ELEMENT(p) std::make_pair(p, #p)
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_APPLICATION_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBMIT_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_SPARSE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EVENT_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_BARRIER),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_HDR_METADATA_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_GEOMETRY_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_BEGIN_RANGE),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_END_RANGE),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_RANGE_SIZE),
+		INSERT_ELEMENT(VK_STRUCTURE_TYPE_MAX_ENUM)
+#undef INSERT_ELEMENT
+	};
+	auto it = strings.find(value);
+	if (it != strings.end())
+	{
+		return it->second;
+	}
+	else
+	{
+		WARN("Stringify(VkStructureType v) is out of date. Please update it to match vulkan/vulkan_core.h");
+		return std::to_string(value).c_str();
+	}
+#else // if not debug:
+	return std::to_string(value).c_str();
+#endif
+}
+
+}
diff --git a/src/Vulkan/VkStringify.hpp b/src/Vulkan/VkStringify.hpp
new file mode 100644
index 0000000..247310f
--- /dev/null
+++ b/src/Vulkan/VkStringify.hpp
@@ -0,0 +1,29 @@
+// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
+//
+// 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.
+
+// VkStringify.hpp: Utilities to turn Vulkan enums into strings
+
+#ifndef VK_STRINGIFY_HPP_
+#define VK_STRINGIFY_HPP_
+
+#include <vulkan/vulkan.h>
+#include <string>
+
+namespace vk {
+
+const char *Stringify(VkStructureType value);
+
+}
+
+#endif
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 4d58cbb..c8980f9 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -40,6 +40,7 @@
 #include "VkSampler.hpp"
 #include "VkSemaphore.hpp"
 #include "VkShaderModule.hpp"
+#include "VkStringify.hpp"
 #include "VkRenderPass.hpp"
 
 #if defined(VK_USE_PLATFORM_METAL_EXT) || defined(VK_USE_PLATFORM_MACOS_MVK)
@@ -637,7 +638,7 @@
 			break;
 		default:
 			// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
-			UNIMPLEMENTED("extensionCreateInfo->sType %d", int(extensionCreateInfo->sType));   // TODO(b/119321052): UNIMPLEMENTED() should be used only for features that must still be implemented. Use a more informational macro here.
+			TRACE_ASSERT("Unimplemented extensionCreateInfo->sType = %s", vk::Stringify(extensionCreateInfo->sType));
 			break;
 		}
 
@@ -822,7 +823,7 @@
 		}
 #endif
 		default:
-			UNIMPLEMENTED("allocationInfo->sType %u", allocationInfo->sType);
+			TRACE_ASSERT("Unimplemented allocationInfo->sType = %s", vk::Stringify(allocationInfo->sType));
 			break;
 		}
 
diff --git a/src/Vulkan/vulkan.vcxproj b/src/Vulkan/vulkan.vcxproj
index 42376b2..7ee6982 100644
--- a/src/Vulkan/vulkan.vcxproj
+++ b/src/Vulkan/vulkan.vcxproj
@@ -141,6 +141,7 @@
     <ClCompile Include="VkRenderPass.cpp" />

     <ClCompile Include="VkSampler.cpp" />

     <ClCompile Include="VkShaderModule.cpp" />

+    <ClCompile Include="VkStringify.cpp" />

     <ClCompile Include="..\Device\Blitter.cpp" />

     <ClCompile Include="..\Device\Clipper.cpp" />

     <ClCompile Include="..\Device\Color.cpp" />

@@ -227,6 +228,7 @@
     <ClInclude Include="VkSampler.hpp" />

     <ClInclude Include="VkSemaphore.hpp" />

     <ClInclude Include="VkShaderModule.hpp" />

+    <ClInclude Include="VkStringify.hpp" />

     <ClInclude Include="VulkanPlatform.h" />

     <ClInclude Include="..\Device\Blitter.hpp" />

     <ClInclude Include="..\Device\Clipper.hpp" />

@@ -311,4 +313,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

   <ImportGroup Label="ExtensionTargets">

   </ImportGroup>

-</Project>
\ No newline at end of file
+</Project>

diff --git a/src/Vulkan/vulkan.vcxproj.filters b/src/Vulkan/vulkan.vcxproj.filters
index 6de2a26..34ed4c7 100644
--- a/src/Vulkan/vulkan.vcxproj.filters
+++ b/src/Vulkan/vulkan.vcxproj.filters
@@ -171,9 +171,9 @@
     <ClCompile Include="VkCommandPool.cpp">

       <Filter>Source Files\Vulkan</Filter>

     </ClCompile>

-    <ClCompile Include="VkDebug.cpp">

-      <Filter>Source Files\Vulkan</Filter>

-    </ClCompile>

+    <clcompile include="vkdebug.cpp">

+      <filter>source files\vulkan</filter>

+    </clcompile>

     <ClCompile Include="VkDescriptorPool.cpp">

       <Filter>Source Files\Vulkan</Filter>

     </ClCompile>

@@ -240,6 +240,9 @@
     <ClCompile Include="VkShaderModule.cpp">

       <Filter>Source Files\Vulkan</Filter>

     </ClCompile>

+    <ClCompile Include="VkStringify.cpp">

+      <Filter>Source Files\Vulkan</Filter>

+    </ClCompile>

     <ClCompile Include="..\Pipeline\SpirvShader.cpp">

       <Filter>Source Files\Pipeline</Filter>

     </ClCompile>

@@ -503,15 +506,18 @@
     <ClInclude Include="..\System\Types.hpp">

       <Filter>Header Files\System</Filter>

     </ClInclude>

-    <ClInclude Include="VkDebug.hpp">

-      <Filter>Header Files\Vulkan</Filter>

-    </ClInclude>

+    <clinclude include="vkdebug.hpp">

+      <filter>header files\vulkan</filter>

+    </clinclude>

     <ClInclude Include="VkDestroy.h">

       <Filter>Header Files\Vulkan</Filter>

     </ClInclude>

     <ClInclude Include="VulkanPlatform.h">

       <Filter>Header Files\Vulkan</Filter>

     </ClInclude>

+    <ClInclude Include="VkStringify.hpp">

+      <Filter>Header Files\Vulkan</Filter>

+    </ClInclude>

     <ClInclude Include="Version.h" />

     <ClInclude Include="..\Pipeline\SpirvShader.hpp">

       <Filter>Header Files\Pipeline</Filter>

@@ -531,4 +537,4 @@
       <Filter>Resource Files</Filter>

     </ResourceCompile>

   </ItemGroup>

-</Project>
\ No newline at end of file
+</Project>

diff --git a/tests/VulkanUnitTests/Device.hpp b/tests/VulkanUnitTests/Device.hpp
index ec582a7..96b91dc 100644
--- a/tests/VulkanUnitTests/Device.hpp
+++ b/tests/VulkanUnitTests/Device.hpp
@@ -136,9 +136,6 @@
 	// complete.
 	VkResult QueueSubmitAndWait(VkCommandBuffer commandBuffer) const;
 
-private:
-	Device(Driver const *driver, VkDevice device, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
-
 	static VkResult GetPhysicalDevices(
 			Driver const *driver, VkInstance instance,
 			std::vector<VkPhysicalDevice> &out);
@@ -146,6 +143,10 @@
 	static int GetComputeQueueFamilyIndex(
 			Driver const *driver, VkPhysicalDevice device);
 
+private:
+	Device(Driver const *driver, VkDevice device, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
+
+
 	static std::vector<VkQueueFamilyProperties>
 		GetPhysicalDeviceQueueFamilyProperties(
 			Driver const *driver, VkPhysicalDevice device);
diff --git a/tests/VulkanUnitTests/unittests.cpp b/tests/VulkanUnitTests/unittests.cpp
index 1203a50..64eadbb 100644
--- a/tests/VulkanUnitTests/unittests.cpp
+++ b/tests/VulkanUnitTests/unittests.cpp
@@ -117,6 +117,79 @@
 	driver.vkDestroyInstance(instance, nullptr);

 }

 

+TEST_F(SwiftShaderVulkanTest, UnsupportedDeviceExtension)

+{

+    Driver driver;

+    ASSERT_TRUE(driver.loadSwiftShader());

+

+    uint32_t apiVersion = 0;

+    VkResult result = driver.vkEnumerateInstanceVersion(&apiVersion);

+    EXPECT_EQ(apiVersion, (uint32_t)VK_API_VERSION_1_1);

+

+    const VkInstanceCreateInfo createInfo = {

+        VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,  // sType

+        nullptr,                                 // pNext

+        0,                                       // flags

+        nullptr,                                 // pApplicationInfo

+        0,                                       // enabledLayerCount

+        nullptr,                                 // ppEnabledLayerNames

+        0,                                       // enabledExtensionCount

+        nullptr,                                 // ppEnabledExtensionNames

+    };

+    VkInstance instance = VK_NULL_HANDLE;

+    result = driver.vkCreateInstance(&createInfo, nullptr, &instance);

+    EXPECT_EQ(result, VK_SUCCESS);

+

+    ASSERT_TRUE(driver.resolve(instance));

+

+	VkBaseInStructure unsupportedExt = { VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, nullptr };

+

+    // Gather all physical devices

+    std::vector<VkPhysicalDevice> physicalDevices;

+    result = Device::GetPhysicalDevices(&driver, instance, physicalDevices);

+	EXPECT_EQ(result, VK_SUCCESS);

+

+    // Inspect each physical device's queue families for compute support.

+    for (auto physicalDevice : physicalDevices)

+    {

+        int queueFamilyIndex = Device::GetComputeQueueFamilyIndex(&driver, physicalDevice);

+        if (queueFamilyIndex < 0)

+        {

+            continue;

+        }

+

+        const float queuePrioritory = 1.0f;

+        const VkDeviceQueueCreateInfo deviceQueueCreateInfo = {

+            VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,  // sType

+            nullptr,                                     // pNext

+            0,                                           // flags

+            (uint32_t)queueFamilyIndex,                  // queueFamilyIndex

+            1,                                           // queueCount

+            &queuePrioritory,                            // pQueuePriorities

+        };

+

+        const VkDeviceCreateInfo deviceCreateInfo = {

+            VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,  // sType

+            &unsupportedExt,                        // pNext

+            0,                                     // flags

+            1,                                     // queueCreateInfoCount

+            &deviceQueueCreateInfo,                // pQueueCreateInfos

+            0,                                     // enabledLayerCount

+            nullptr,                               // ppEnabledLayerNames

+            0,                                     // enabledExtensionCount

+            nullptr,                               // ppEnabledExtensionNames

+            nullptr,                               // pEnabledFeatures

+        };

+

+        VkDevice device;

+        result = driver.vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device);

+		EXPECT_EQ(result, VK_SUCCESS);

+		driver.vkDestroyDevice(device, nullptr);

+    }

+

+    driver.vkDestroyInstance(instance, nullptr);

+}

+

 std::vector<uint32_t> compileSpirv(const char* assembly)

 {

     spvtools::SpirvTools core(SPV_ENV_VULKAN_1_0);