diff options
| -rw-r--r-- | Makefile | 12 | ||||
| -rw-r--r-- | app.cpp | 94 | ||||
| -rw-r--r-- | app.hpp | 24 | ||||
| -rw-r--r-- | c2.cpp | 50 | ||||
| -rw-r--r-- | glad_vk.h | 4178 | ||||
| -rw-r--r-- | pipeline.cpp | 29 | ||||
| -rw-r--r-- | sc/sc.cpp | 15 | ||||
| -rw-r--r-- | video.cpp | 1238 | ||||
| -rw-r--r-- | video.hpp | 104 | 
9 files changed, 5707 insertions, 37 deletions
| @@ -4,7 +4,7 @@ target = c2  data_dir = data  shaders = data/triangle.csh  tools = qstd cfg sc -objects = app.o c2.o +objects = app.o c2.o video.o pipeline.o  includes = -Iqstd  defines = -Dplat_x86 -Dplat_posix -Dplat_x11 -Dallocation_default_alignment=8  cflags = $(includes) $(defines) $(DEBUG_COMPILE_FLAG) @@ -26,10 +26,16 @@ sc: qstd cfg  data/triangle.csh: intermediate/triangle.glsl | $(data_dir) sc  	./sc/sc intermediate/triangle.glsl data/triangle.csh -app.o: app.cpp app.hpp +app.o: app.cpp app.hpp qstd/memory.h qstd/plat.h  	$(CXX) -c $(cflags) app.cpp -o app.o -c2.o: c2.cpp app.hpp +video.o: video.cpp video.hpp app.hpp qstd/memory.h qstd/plat.h qstd/str.h sc/sh_enums.h +	$(CXX) -c $(cflags) video.cpp -o video.o + +pipeline.o: pipeline.cpp video.hpp qstd/memory.h qstd/plat.h +	$(CXX) -c $(cflags) pipeline.cpp -o pipeline.o + +c2.o: c2.cpp app.hpp video.hpp qstd/memory.h qstd/plat.h  	$(CXX) -c $(cflags) c2.cpp -o c2.o  $(target): $(objects) qstd/libqstd.a @@ -2,6 +2,7 @@  extern "C" {  #include "memory.h" +#include "plat.h"  }  #ifdef plat_x11 @@ -98,15 +99,15 @@ struct App_Internal {  		const int default_w = 1920;  		const int default_h = 1080;  		XWindowAttributes wa; -		XSetWindowAttributes attribs = { -			.event_mask = -				ExposureMask | -				KeyPressMask | -				KeyReleaseMask | -				ButtonPressMask | -				ButtonReleaseMask | -				PointerMotionMask -		}; +		XSetWindowAttributes attribs{}; +		attribs.event_mask = +			ExposureMask | +			KeyPressMask | +			KeyReleaseMask | +			ButtonPressMask | +			ButtonReleaseMask | +			PointerMotionMask +			;  		Window root;  		Visual* v;  		d = XOpenDisplay(0); @@ -142,6 +143,7 @@ struct App_Internal {  	void begin(App* app) {  		while (XPending(d)) {  			XEvent e; +			XWindowAttributes wa;  			KeySym sym;  			Key key;  			int btn; @@ -155,6 +157,14 @@ struct App_Internal {  						app->running = 0;  					}  					break; +				case Expose: +					XGetWindowAttributes(d, wi, &wa); +					if (app->w != wa.width || app->h != wa.height) { +						app->w = wa.width; +						app->h = wa.height; +						app->on_resize(); +					} +					break;  				case MotionNotify:  					app->mx = e.xmotion.x;  					app->my = e.xmotion.y; @@ -229,19 +239,20 @@ struct App_Internal {  #endif -App* App::create(const char* name) { -	App* app; -	App_Internal* i; +void App::init(const char* name) { +	internal = (App_Internal*)arena_alloc( +		arena, +		sizeof *internal +	); +	internal->init(this, name); +} + +void* App::alloc(int size, Arena*& arena) {  	char* mem = (char*)malloc(app_memory_size); -	Arena* a = (Arena*)mem; -	mem += sizeof *a; -	init_arena(a, mem, app_memory_size - sizeof *a); -	app = (App*)arena_alloc(a, sizeof *app + sizeof *i); -	app->running = 0; -	app->arena = a; -	i = (App_Internal*)&app[1]; -	i->init(app, name); -	return app; +	arena = (Arena*)mem; +	mem += sizeof *arena; +	init_arena(arena, mem, app_memory_size - sizeof *arena); +	return arena_alloc(arena, size);  }  void App::destroy() { @@ -250,7 +261,6 @@ void App::destroy() {  void App::begin() {  	int j; -	App_Internal* i = (App_Internal*)&this[1];  	for (j = 0; j < key_count; j++)  		key_states[j] &= ~(  			key_state_just_pressed | key_state_just_released @@ -259,12 +269,11 @@ void App::begin() {  		mbtn_states[j] &= ~(  			key_state_just_pressed | key_state_just_released  		); -	i->begin(this); +	internal->begin(this);  }  void App::end() { -	App_Internal* i = (App_Internal*)&this[1]; -	i->end(this); +	internal->end(this);  }  Key_State App::ks(Key k) { @@ -298,3 +307,38 @@ bool App::mjp(Mbtn b) {  bool App::mjr(Mbtn b) {  	return mbtn_states[b] & key_state_just_released;  } + +void App::get_vk_exts(const char** exts, int& count) { +	exts[count++] = "VK_KHR_surface"; +	exts[count++] = "VK_KHR_xlib_surface"; +} + +extern "C" { +#define VK_USE_PLATFORM_XLIB_KHR +#include "glad_vk.h" +VkSurfaceKHR app_create_vk_surface(App* app, VkInstance inst) { +	App_Internal* i; +	VkSurfaceKHR s; +	VkXlibSurfaceCreateInfoKHR ci{}; +	VkResult r; +	i = app->internal; +	ci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; +	ci.dpy = i->d; +	ci.window = i->wi; +	r = vkCreateXlibSurfaceKHR(inst, &ci, 0, &s); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a Vulkan surface."); +		pbreak(r); +	} +	return s; +} + +void app_destroy_vk_surface( +	App* app, +	VkInstance inst, +	VkSurfaceKHR surf +) { +	(void)app; +	vkDestroySurfaceKHR(inst, surf, 0); +} +} @@ -1,7 +1,9 @@  #ifndef app_hpp  #define app_hpp -#define app_memory_size (4096 * 16) +#define app_memory_size (1024 * 1024 * 32) + +#include <new>  struct Arena; @@ -96,6 +98,8 @@ enum Key_State {  	key_state_just_released = 1 << 2  }; +struct App_Internal; +  struct App {  	Arena* arena;  	int running, w, h; @@ -103,8 +107,20 @@ struct App {  	int scrollx, scrolly;  	unsigned char key_states[key_count];  	unsigned char mbtn_states[mbtn_count]; +	App_Internal* internal; -	static App* create(const char* name); +	template <typename T> +	static T* create(const char* name) { +		Arena* arena; +		T* app = (T*)alloc(sizeof(T), arena); +		app = new(app) T(); +		app->arena = arena; +		app->running = 0; +		app->init(name); +		return app; +	} +	static void* alloc(int size, Arena*& arena); +	void init(const char* name);  	void destroy();  	void begin(); @@ -118,6 +134,10 @@ struct App {  	bool mp(Mbtn k);  	bool mjp(Mbtn k);  	bool mjr(Mbtn k); + +	void get_vk_exts(const char** exts, int& count); + +	virtual void on_resize() = 0;  };  #endif @@ -1,16 +1,60 @@  #include "app.hpp" +#include "video.hpp"  extern "C" {  #include "plat.h" +#include "memory.h"  } +#define video_arena_size (1024 * 1024 * 16) +#define per_frame_memory_size (1024 * 1024) + +struct C2 : public App { +	Device* dev; +	void on_resize() override { +		dev->on_resize(); +	} +}; +  int main() { -	App* app = App::create("c2"); +	Arena video_arena; +	Device* dev; +	Shader* shader; +	C2* app = App::create<C2>("c2"); +	void* per_frame;  	app->running = 1; +	init_arena( +		&video_arena, +		arena_alloc(app->arena, video_arena_size), +		video_arena_size +	); +	dev = Device::create(&video_arena, app);  +	app->dev = dev; +	shader = dev->load_shader("data/triangle.csh"); + +	per_frame = heap_alloc( +		dev->heap, +		per_frame_memory_size +	); +	uint8_t r = 0;  	while (app->running) { +		Arena frame_arena; +		init_arena(&frame_arena, per_frame, per_frame_memory_size); +  		app->begin(); -		if (app->mp(mbtn_left)) -			print("%d, %d, %d\n", app->mx, app->my, app->scrolly); +		dev->begin_frame(); + +		Pipeline_Builder pb(&frame_arena); +		pb.begin_rp(); +		pb.rp_target(dev->get_backbuffer(), { r, 0x00, 0xff, 0xff }); +		Render_Pass& pass = pb.build_rp(); + +		dev->get_ctx().submit(*dev, pass); + +		r += 10; +		dev->present();  		app->end();  	} +	shader->destroy(dev); +	dev->destroy();  	app->destroy();  } diff --git a/glad_vk.h b/glad_vk.h new file mode 100644 index 0000000..88a2e87 --- /dev/null +++ b/glad_vk.h @@ -0,0 +1,4178 @@ +/** + * Loader generated by glad 2.0.4 on Tue Aug 15 10:57:41 2023 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: vk + * Extensions: 5 + * + * APIs: + *  - vulkan=1.0 + * + * Options: + *  - ALIAS = False + *  - DEBUG = False + *  - HEADER_ONLY = True + *  - LOADER = True + *  - MX = False + *  - ON_DEMAND = False + * + * Commandline: + *    --api='vulkan=1.0' --extensions='VK_EXT_debug_utils,VK_KHR_surface,VK_KHR_swapchain,VK_KHR_win32_surface,VK_KHR_xlib_surface' c --header-only --loader + * + * Online: + *    http://glad.sh/#api=vulkan%3D1.0&extensions=VK_EXT_debug_utils%2CVK_KHR_surface%2CVK_KHR_swapchain%2CVK_KHR_win32_surface%2CVK_KHR_xlib_surface&generator=c&options=HEADER_ONLY%2CLOADER + * + */ + +#ifndef GLAD_VULKAN_H_ +#define GLAD_VULKAN_H_ + +#ifdef VULKAN_H_ +  #error  header already included (API: vulkan), remove previous include! +#endif +#define VULKAN_H_ 1 + +#ifdef VULKAN_CORE_H_ +  #error  header already included (API: vulkan), remove previous include! +#endif +#define VULKAN_CORE_H_ 1 + + +#define GLAD_VULKAN +#define GLAD_OPTION_VULKAN_HEADER_ONLY +#define GLAD_OPTION_VULKAN_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 +  #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) +    #define GLAD_PLATFORM_WIN32 1 +  #else +    #define GLAD_PLATFORM_WIN32 0 +  #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE +  #ifdef __APPLE__ +    #define GLAD_PLATFORM_APPLE 1 +  #else +    #define GLAD_PLATFORM_APPLE 0 +  #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN +  #ifdef __EMSCRIPTEN__ +    #define GLAD_PLATFORM_EMSCRIPTEN 1 +  #else +    #define GLAD_PLATFORM_EMSCRIPTEN 0 +  #endif +#endif + +#ifndef GLAD_PLATFORM_UWP +  #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) +    #ifdef __has_include +      #if __has_include(<winapifamily.h>) +        #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 +      #endif +    #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ +      #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 +    #endif +  #endif + +  #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY +    #include <winapifamily.h> +    #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) +      #define GLAD_PLATFORM_UWP 1 +    #endif +  #endif + +  #ifndef GLAD_PLATFORM_UWP +    #define GLAD_PLATFORM_UWP 0 +  #endif +#endif + +#ifdef __GNUC__ +  #define GLAD_GNUC_EXTENSION __extension__ +#else +  #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL +  #if defined(GLAD_API_CALL_EXPORT) +    #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) +      #if defined(GLAD_API_CALL_EXPORT_BUILD) +        #if defined(__GNUC__) +          #define GLAD_API_CALL __attribute__ ((dllexport)) extern +        #else +          #define GLAD_API_CALL __declspec(dllexport) extern +        #endif +      #else +        #if defined(__GNUC__) +          #define GLAD_API_CALL __attribute__ ((dllimport)) extern +        #else +          #define GLAD_API_CALL __declspec(dllimport) extern +        #endif +      #endif +    #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) +      #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern +    #else +      #define GLAD_API_CALL extern +    #endif +  #else +    #define GLAD_API_CALL extern +  #endif +#endif + +#ifdef APIENTRY +  #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 +  #define GLAD_API_PTR __stdcall +#else +  #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.4" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define VK_ATTACHMENT_UNUSED (~0U) +#define VK_EXT_DEBUG_UTILS_EXTENSION_NAME "VK_EXT_debug_utils" +#define VK_EXT_DEBUG_UTILS_SPEC_VERSION 2 +#define VK_FALSE 0 +#define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface" +#define VK_KHR_SURFACE_SPEC_VERSION 25 +#define VK_KHR_SWAPCHAIN_EXTENSION_NAME "VK_KHR_swapchain" +#define VK_KHR_SWAPCHAIN_SPEC_VERSION 70 +#if defined(VK_USE_PLATFORM_WIN32_KHR) +#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface" + +#endif +#if defined(VK_USE_PLATFORM_WIN32_KHR) +#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6 + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface" + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6 + +#endif +#define VK_LOD_CLAMP_NONE 1000.0F +#define VK_MAX_DESCRIPTION_SIZE 256 +#define VK_MAX_DEVICE_GROUP_SIZE 32 +#define VK_MAX_EXTENSION_NAME_SIZE 256 +#define VK_MAX_MEMORY_HEAPS 16 +#define VK_MAX_MEMORY_TYPES 32 +#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256 +#define VK_QUEUE_FAMILY_IGNORED (~0U) +#define VK_REMAINING_ARRAY_LAYERS (~0U) +#define VK_REMAINING_MIP_LEVELS (~0U) +#define VK_SUBPASS_EXTERNAL (~0U) +#define VK_TRUE 1 +#define VK_UUID_SIZE 16 +#define VK_WHOLE_SIZE (~0ULL) + + +/* */ +/* File: vk_platform.h */ +/* */ +/* +** Copyright 2014-2023 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + + +#ifndef VK_PLATFORM_H_ +#define VK_PLATFORM_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* +*************************************************************************************************** +*   Platform-specific directives and type declarations +*************************************************************************************************** +*/ + +/* Platform-specific calling convention macros. + * + * Platforms should define these so that Vulkan clients call Vulkan commands + * with the same calling conventions that the Vulkan implementation expects. + * + * VKAPI_ATTR - Placed before the return type in function declarations. + *              Useful for C++11 and GCC/Clang-style function attribute syntax. + * VKAPI_CALL - Placed after the return type in function declarations. + *              Useful for MSVC-style calling convention syntax. + * VKAPI_PTR  - Placed between the '(' and '*' in function pointer types. + * + * Function declaration:  VKAPI_ATTR void VKAPI_CALL vkCommand(void); + * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void); + */ +#if defined(_WIN32) +    /* On Windows, Vulkan commands use the stdcall convention */ +    #define VKAPI_ATTR +    #define VKAPI_CALL __stdcall +    #define VKAPI_PTR  VKAPI_CALL +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 +    #error "Vulkan is not supported for the 'armeabi' NDK ABI" +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) +    /* On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" */ +    /* calling convention, i.e. float parameters are passed in registers. This */ +    /* is true even if the rest of the application passes floats on the stack, */ +    /* as it does by default when compiling for the armeabi-v7a NDK ABI. */ +    #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp"))) +    #define VKAPI_CALL +    #define VKAPI_PTR  VKAPI_ATTR +#else +    /* On other platforms, use the default calling convention */ +    #define VKAPI_ATTR +    #define VKAPI_CALL +    #define VKAPI_PTR +#endif + +#if !defined(VK_NO_STDDEF_H) +    #include <stddef.h> +#endif /* !defined(VK_NO_STDDEF_H) */ + +#if !defined(VK_NO_STDINT_H) +    #if defined(_MSC_VER) && (_MSC_VER < 1600) +        typedef signed   __int8  int8_t; +        typedef unsigned __int8  uint8_t; +        typedef signed   __int16 int16_t; +        typedef unsigned __int16 uint16_t; +        typedef signed   __int32 int32_t; +        typedef unsigned __int32 uint32_t; +        typedef signed   __int64 int64_t; +        typedef unsigned __int64 uint64_t; +    #else +        #include <stdint.h> +    #endif +#endif /* !defined(VK_NO_STDINT_H) */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +#include <X11/Xlib.h> +#endif + +#if defined(VK_USE_PLATFORM_WIN32_KHR) +#include <windows.h> +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + +#endif + +#if defined(VK_USE_PLATFORM_WIN32_KHR) + +#endif + +#if defined(VK_USE_PLATFORM_WIN32_KHR) + +#endif + +/* DEPRECATED: This define is deprecated. VK_MAKE_API_VERSION should be used instead. */ +#define VK_MAKE_VERSION(major, minor, patch) \ +    ((((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch))) +/* DEPRECATED: This define is deprecated. VK_API_VERSION_MAJOR should be used instead. */ +#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22U) +/* DEPRECATED: This define is deprecated. VK_API_VERSION_MINOR should be used instead. */ +#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU) +/* DEPRECATED: This define is deprecated. VK_API_VERSION_PATCH should be used instead. */ +#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU) +#define VK_MAKE_API_VERSION(variant, major, minor, patch) \ +    ((((uint32_t)(variant)) << 29U) | (((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch))) +#define VK_API_VERSION_VARIANT(version) ((uint32_t)(version) >> 29U) +#define VK_API_VERSION_MAJOR(version) (((uint32_t)(version) >> 22U) & 0x7FU) +#define VK_API_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU) +#define VK_API_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU) +/* DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead. */ +/*#define VK_API_VERSION VK_MAKE_API_VERSION(0, 1, 0, 0) // Patch version should always be set to 0 */ +/* Vulkan 1.0 version number */ +#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)/* Patch version should always be set to 0 */ +/* Version of this file */ +#define VK_HEADER_VERSION 261 +#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; +#ifndef VK_USE_64_BIT_PTR_DEFINES +    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +        #define VK_USE_64_BIT_PTR_DEFINES 1 +    #else +        #define VK_USE_64_BIT_PTR_DEFINES 0 +    #endif +#endif +#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE +    #if (VK_USE_64_BIT_PTR_DEFINES==1) +        #if (defined(__cplusplus) && (__cplusplus >= 201103L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L)) +            #define VK_NULL_HANDLE nullptr +        #else +            #define VK_NULL_HANDLE ((void*)0) +        #endif +    #else +        #define VK_NULL_HANDLE 0ULL +    #endif +#endif +#ifndef VK_NULL_HANDLE +    #define VK_NULL_HANDLE 0 +#endif +#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE +    #if (VK_USE_64_BIT_PTR_DEFINES==1) +        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object; +    #else +        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object; +    #endif +#endif + + + + + + + + +VK_DEFINE_HANDLE(VkInstance) +VK_DEFINE_HANDLE(VkPhysicalDevice) +VK_DEFINE_HANDLE(VkDevice) +VK_DEFINE_HANDLE(VkQueue) +VK_DEFINE_HANDLE(VkCommandBuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugUtilsMessengerEXT) +typedef enum VkAttachmentLoadOp { +    VK_ATTACHMENT_LOAD_OP_LOAD = 0, +    VK_ATTACHMENT_LOAD_OP_CLEAR = 1, +    VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2, +    VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentLoadOp; +typedef enum VkAttachmentStoreOp { +    VK_ATTACHMENT_STORE_OP_STORE = 0, +    VK_ATTACHMENT_STORE_OP_DONT_CARE = 1, +    VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentStoreOp; +typedef enum VkBlendFactor { +    VK_BLEND_FACTOR_ZERO = 0, +    VK_BLEND_FACTOR_ONE = 1, +    VK_BLEND_FACTOR_SRC_COLOR = 2, +    VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3, +    VK_BLEND_FACTOR_DST_COLOR = 4, +    VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 5, +    VK_BLEND_FACTOR_SRC_ALPHA = 6, +    VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 7, +    VK_BLEND_FACTOR_DST_ALPHA = 8, +    VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 9, +    VK_BLEND_FACTOR_CONSTANT_COLOR = 10, +    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 11, +    VK_BLEND_FACTOR_CONSTANT_ALPHA = 12, +    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 13, +    VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = 14, +    VK_BLEND_FACTOR_SRC1_COLOR = 15, +    VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = 16, +    VK_BLEND_FACTOR_SRC1_ALPHA = 17, +    VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = 18, +    VK_BLEND_FACTOR_MAX_ENUM = 0x7FFFFFFF +} VkBlendFactor; +typedef enum VkBlendOp { +    VK_BLEND_OP_ADD = 0, +    VK_BLEND_OP_SUBTRACT = 1, +    VK_BLEND_OP_REVERSE_SUBTRACT = 2, +    VK_BLEND_OP_MIN = 3, +    VK_BLEND_OP_MAX = 4, +    VK_BLEND_OP_MAX_ENUM = 0x7FFFFFFF +} VkBlendOp; +typedef enum VkBorderColor { +    VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0, +    VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1, +    VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2, +    VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3, +    VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4, +    VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5, +    VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF +} VkBorderColor; +typedef enum VkPipelineCacheHeaderVersion { +    VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, +    VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCacheHeaderVersion; +typedef enum VkBufferCreateFlagBits { +    VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 1, +    VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 2, +    VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 4, +    VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkBufferCreateFlagBits; +typedef enum VkBufferUsageFlagBits { +    VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 1, +    VK_BUFFER_USAGE_TRANSFER_DST_BIT = 2, +    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 4, +    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 8, +    VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 16, +    VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 32, +    VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 64, +    VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 128, +    VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 256, +    VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkBufferUsageFlagBits; +typedef enum VkColorComponentFlagBits { +    VK_COLOR_COMPONENT_R_BIT = 1, +    VK_COLOR_COMPONENT_G_BIT = 2, +    VK_COLOR_COMPONENT_B_BIT = 4, +    VK_COLOR_COMPONENT_A_BIT = 8, +    VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkColorComponentFlagBits; +typedef enum VkComponentSwizzle { +    VK_COMPONENT_SWIZZLE_IDENTITY = 0, +    VK_COMPONENT_SWIZZLE_ZERO = 1, +    VK_COMPONENT_SWIZZLE_ONE = 2, +    VK_COMPONENT_SWIZZLE_R = 3, +    VK_COMPONENT_SWIZZLE_G = 4, +    VK_COMPONENT_SWIZZLE_B = 5, +    VK_COMPONENT_SWIZZLE_A = 6, +    VK_COMPONENT_SWIZZLE_MAX_ENUM = 0x7FFFFFFF +} VkComponentSwizzle; +typedef enum VkCommandPoolCreateFlagBits { +    VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 1, +    VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 2, +    VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolCreateFlagBits; +typedef enum VkCommandPoolResetFlagBits { +    VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 1, +    VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolResetFlagBits; +typedef enum VkCommandBufferResetFlagBits { +    VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 1, +    VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferResetFlagBits; +typedef enum VkCommandBufferLevel { +    VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0, +    VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1, +    VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferLevel; +typedef enum VkCommandBufferUsageFlagBits { +    VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 1, +    VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 2, +    VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 4, +    VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferUsageFlagBits; +typedef enum VkCompareOp { +    VK_COMPARE_OP_NEVER = 0, +    VK_COMPARE_OP_LESS = 1, +    VK_COMPARE_OP_EQUAL = 2, +    VK_COMPARE_OP_LESS_OR_EQUAL = 3, +    VK_COMPARE_OP_GREATER = 4, +    VK_COMPARE_OP_NOT_EQUAL = 5, +    VK_COMPARE_OP_GREATER_OR_EQUAL = 6, +    VK_COMPARE_OP_ALWAYS = 7, +    VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF +} VkCompareOp; +typedef enum VkCullModeFlagBits { +    VK_CULL_MODE_NONE = 0, +    VK_CULL_MODE_FRONT_BIT = 1, +    VK_CULL_MODE_BACK_BIT = 2, +    VK_CULL_MODE_FRONT_AND_BACK = 0x00000003, +    VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCullModeFlagBits; +typedef enum VkDescriptorType { +    VK_DESCRIPTOR_TYPE_SAMPLER = 0, +    VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1, +    VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2, +    VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3, +    VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4, +    VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5, +    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6, +    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7, +    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8, +    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9, +    VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10, +    VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorType; +typedef enum VkDynamicState { +    VK_DYNAMIC_STATE_VIEWPORT = 0, +    VK_DYNAMIC_STATE_SCISSOR = 1, +    VK_DYNAMIC_STATE_LINE_WIDTH = 2, +    VK_DYNAMIC_STATE_DEPTH_BIAS = 3, +    VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4, +    VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5, +    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6, +    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7, +    VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8, +    VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF +} VkDynamicState; +typedef enum VkFenceCreateFlagBits { +    VK_FENCE_CREATE_SIGNALED_BIT = 1, +    VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkFenceCreateFlagBits; +typedef enum VkPolygonMode { +    VK_POLYGON_MODE_FILL = 0, +    VK_POLYGON_MODE_LINE = 1, +    VK_POLYGON_MODE_POINT = 2, +    VK_POLYGON_MODE_MAX_ENUM = 0x7FFFFFFF +} VkPolygonMode; +typedef enum VkFormat { +    VK_FORMAT_UNDEFINED = 0, +    VK_FORMAT_R4G4_UNORM_PACK8 = 1, +    VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2, +    VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3, +    VK_FORMAT_R5G6B5_UNORM_PACK16 = 4, +    VK_FORMAT_B5G6R5_UNORM_PACK16 = 5, +    VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6, +    VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7, +    VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8, +    VK_FORMAT_R8_UNORM = 9, +    VK_FORMAT_R8_SNORM = 10, +    VK_FORMAT_R8_USCALED = 11, +    VK_FORMAT_R8_SSCALED = 12, +    VK_FORMAT_R8_UINT = 13, +    VK_FORMAT_R8_SINT = 14, +    VK_FORMAT_R8_SRGB = 15, +    VK_FORMAT_R8G8_UNORM = 16, +    VK_FORMAT_R8G8_SNORM = 17, +    VK_FORMAT_R8G8_USCALED = 18, +    VK_FORMAT_R8G8_SSCALED = 19, +    VK_FORMAT_R8G8_UINT = 20, +    VK_FORMAT_R8G8_SINT = 21, +    VK_FORMAT_R8G8_SRGB = 22, +    VK_FORMAT_R8G8B8_UNORM = 23, +    VK_FORMAT_R8G8B8_SNORM = 24, +    VK_FORMAT_R8G8B8_USCALED = 25, +    VK_FORMAT_R8G8B8_SSCALED = 26, +    VK_FORMAT_R8G8B8_UINT = 27, +    VK_FORMAT_R8G8B8_SINT = 28, +    VK_FORMAT_R8G8B8_SRGB = 29, +    VK_FORMAT_B8G8R8_UNORM = 30, +    VK_FORMAT_B8G8R8_SNORM = 31, +    VK_FORMAT_B8G8R8_USCALED = 32, +    VK_FORMAT_B8G8R8_SSCALED = 33, +    VK_FORMAT_B8G8R8_UINT = 34, +    VK_FORMAT_B8G8R8_SINT = 35, +    VK_FORMAT_B8G8R8_SRGB = 36, +    VK_FORMAT_R8G8B8A8_UNORM = 37, +    VK_FORMAT_R8G8B8A8_SNORM = 38, +    VK_FORMAT_R8G8B8A8_USCALED = 39, +    VK_FORMAT_R8G8B8A8_SSCALED = 40, +    VK_FORMAT_R8G8B8A8_UINT = 41, +    VK_FORMAT_R8G8B8A8_SINT = 42, +    VK_FORMAT_R8G8B8A8_SRGB = 43, +    VK_FORMAT_B8G8R8A8_UNORM = 44, +    VK_FORMAT_B8G8R8A8_SNORM = 45, +    VK_FORMAT_B8G8R8A8_USCALED = 46, +    VK_FORMAT_B8G8R8A8_SSCALED = 47, +    VK_FORMAT_B8G8R8A8_UINT = 48, +    VK_FORMAT_B8G8R8A8_SINT = 49, +    VK_FORMAT_B8G8R8A8_SRGB = 50, +    VK_FORMAT_A8B8G8R8_UNORM_PACK32 = 51, +    VK_FORMAT_A8B8G8R8_SNORM_PACK32 = 52, +    VK_FORMAT_A8B8G8R8_USCALED_PACK32 = 53, +    VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = 54, +    VK_FORMAT_A8B8G8R8_UINT_PACK32 = 55, +    VK_FORMAT_A8B8G8R8_SINT_PACK32 = 56, +    VK_FORMAT_A8B8G8R8_SRGB_PACK32 = 57, +    VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58, +    VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59, +    VK_FORMAT_A2R10G10B10_USCALED_PACK32 = 60, +    VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = 61, +    VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62, +    VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63, +    VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64, +    VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65, +    VK_FORMAT_A2B10G10R10_USCALED_PACK32 = 66, +    VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = 67, +    VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68, +    VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69, +    VK_FORMAT_R16_UNORM = 70, +    VK_FORMAT_R16_SNORM = 71, +    VK_FORMAT_R16_USCALED = 72, +    VK_FORMAT_R16_SSCALED = 73, +    VK_FORMAT_R16_UINT = 74, +    VK_FORMAT_R16_SINT = 75, +    VK_FORMAT_R16_SFLOAT = 76, +    VK_FORMAT_R16G16_UNORM = 77, +    VK_FORMAT_R16G16_SNORM = 78, +    VK_FORMAT_R16G16_USCALED = 79, +    VK_FORMAT_R16G16_SSCALED = 80, +    VK_FORMAT_R16G16_UINT = 81, +    VK_FORMAT_R16G16_SINT = 82, +    VK_FORMAT_R16G16_SFLOAT = 83, +    VK_FORMAT_R16G16B16_UNORM = 84, +    VK_FORMAT_R16G16B16_SNORM = 85, +    VK_FORMAT_R16G16B16_USCALED = 86, +    VK_FORMAT_R16G16B16_SSCALED = 87, +    VK_FORMAT_R16G16B16_UINT = 88, +    VK_FORMAT_R16G16B16_SINT = 89, +    VK_FORMAT_R16G16B16_SFLOAT = 90, +    VK_FORMAT_R16G16B16A16_UNORM = 91, +    VK_FORMAT_R16G16B16A16_SNORM = 92, +    VK_FORMAT_R16G16B16A16_USCALED = 93, +    VK_FORMAT_R16G16B16A16_SSCALED = 94, +    VK_FORMAT_R16G16B16A16_UINT = 95, +    VK_FORMAT_R16G16B16A16_SINT = 96, +    VK_FORMAT_R16G16B16A16_SFLOAT = 97, +    VK_FORMAT_R32_UINT = 98, +    VK_FORMAT_R32_SINT = 99, +    VK_FORMAT_R32_SFLOAT = 100, +    VK_FORMAT_R32G32_UINT = 101, +    VK_FORMAT_R32G32_SINT = 102, +    VK_FORMAT_R32G32_SFLOAT = 103, +    VK_FORMAT_R32G32B32_UINT = 104, +    VK_FORMAT_R32G32B32_SINT = 105, +    VK_FORMAT_R32G32B32_SFLOAT = 106, +    VK_FORMAT_R32G32B32A32_UINT = 107, +    VK_FORMAT_R32G32B32A32_SINT = 108, +    VK_FORMAT_R32G32B32A32_SFLOAT = 109, +    VK_FORMAT_R64_UINT = 110, +    VK_FORMAT_R64_SINT = 111, +    VK_FORMAT_R64_SFLOAT = 112, +    VK_FORMAT_R64G64_UINT = 113, +    VK_FORMAT_R64G64_SINT = 114, +    VK_FORMAT_R64G64_SFLOAT = 115, +    VK_FORMAT_R64G64B64_UINT = 116, +    VK_FORMAT_R64G64B64_SINT = 117, +    VK_FORMAT_R64G64B64_SFLOAT = 118, +    VK_FORMAT_R64G64B64A64_UINT = 119, +    VK_FORMAT_R64G64B64A64_SINT = 120, +    VK_FORMAT_R64G64B64A64_SFLOAT = 121, +    VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122, +    VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123, +    VK_FORMAT_D16_UNORM = 124, +    VK_FORMAT_X8_D24_UNORM_PACK32 = 125, +    VK_FORMAT_D32_SFLOAT = 126, +    VK_FORMAT_S8_UINT = 127, +    VK_FORMAT_D16_UNORM_S8_UINT = 128, +    VK_FORMAT_D24_UNORM_S8_UINT = 129, +    VK_FORMAT_D32_SFLOAT_S8_UINT = 130, +    VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131, +    VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132, +    VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133, +    VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134, +    VK_FORMAT_BC2_UNORM_BLOCK = 135, +    VK_FORMAT_BC2_SRGB_BLOCK = 136, +    VK_FORMAT_BC3_UNORM_BLOCK = 137, +    VK_FORMAT_BC3_SRGB_BLOCK = 138, +    VK_FORMAT_BC4_UNORM_BLOCK = 139, +    VK_FORMAT_BC4_SNORM_BLOCK = 140, +    VK_FORMAT_BC5_UNORM_BLOCK = 141, +    VK_FORMAT_BC5_SNORM_BLOCK = 142, +    VK_FORMAT_BC6H_UFLOAT_BLOCK = 143, +    VK_FORMAT_BC6H_SFLOAT_BLOCK = 144, +    VK_FORMAT_BC7_UNORM_BLOCK = 145, +    VK_FORMAT_BC7_SRGB_BLOCK = 146, +    VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147, +    VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148, +    VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149, +    VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150, +    VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151, +    VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152, +    VK_FORMAT_EAC_R11_UNORM_BLOCK = 153, +    VK_FORMAT_EAC_R11_SNORM_BLOCK = 154, +    VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155, +    VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156, +    VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157, +    VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158, +    VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159, +    VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160, +    VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161, +    VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162, +    VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163, +    VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164, +    VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165, +    VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166, +    VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167, +    VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168, +    VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169, +    VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170, +    VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171, +    VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172, +    VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173, +    VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174, +    VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175, +    VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176, +    VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177, +    VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178, +    VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179, +    VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180, +    VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181, +    VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182, +    VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183, +    VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184, +    VK_FORMAT_MAX_ENUM = 0x7FFFFFFF +} VkFormat; +typedef enum VkFormatFeatureFlagBits { +    VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 1, +    VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 2, +    VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 4, +    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 8, +    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 16, +    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 32, +    VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 64, +    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 128, +    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 256, +    VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 512, +    VK_FORMAT_FEATURE_BLIT_SRC_BIT = 1024, +    VK_FORMAT_FEATURE_BLIT_DST_BIT = 2048, +    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 4096, +    VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkFormatFeatureFlagBits; +typedef enum VkFrontFace { +    VK_FRONT_FACE_COUNTER_CLOCKWISE = 0, +    VK_FRONT_FACE_CLOCKWISE = 1, +    VK_FRONT_FACE_MAX_ENUM = 0x7FFFFFFF +} VkFrontFace; +typedef enum VkImageAspectFlagBits { +    VK_IMAGE_ASPECT_COLOR_BIT = 1, +    VK_IMAGE_ASPECT_DEPTH_BIT = 2, +    VK_IMAGE_ASPECT_STENCIL_BIT = 4, +    VK_IMAGE_ASPECT_METADATA_BIT = 8, +    VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageAspectFlagBits; +typedef enum VkImageCreateFlagBits { +    VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 1, +    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 2, +    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 4, +    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 8, +    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 16, +    VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageCreateFlagBits; +typedef enum VkImageLayout { +    VK_IMAGE_LAYOUT_UNDEFINED = 0, +    VK_IMAGE_LAYOUT_GENERAL = 1, +    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2, +    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3, +    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4, +    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5, +    VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6, +    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7, +    VK_IMAGE_LAYOUT_PREINITIALIZED = 8, +    VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, +    VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF +} VkImageLayout; +typedef enum VkImageTiling { +    VK_IMAGE_TILING_OPTIMAL = 0, +    VK_IMAGE_TILING_LINEAR = 1, +    VK_IMAGE_TILING_MAX_ENUM = 0x7FFFFFFF +} VkImageTiling; +typedef enum VkImageType { +    VK_IMAGE_TYPE_1D = 0, +    VK_IMAGE_TYPE_2D = 1, +    VK_IMAGE_TYPE_3D = 2, +    VK_IMAGE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkImageType; +typedef enum VkImageUsageFlagBits { +    VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 1, +    VK_IMAGE_USAGE_TRANSFER_DST_BIT = 2, +    VK_IMAGE_USAGE_SAMPLED_BIT = 4, +    VK_IMAGE_USAGE_STORAGE_BIT = 8, +    VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 16, +    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 32, +    VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 64, +    VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 128, +    VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageUsageFlagBits; +typedef enum VkImageViewType { +    VK_IMAGE_VIEW_TYPE_1D = 0, +    VK_IMAGE_VIEW_TYPE_2D = 1, +    VK_IMAGE_VIEW_TYPE_3D = 2, +    VK_IMAGE_VIEW_TYPE_CUBE = 3, +    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4, +    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5, +    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6, +    VK_IMAGE_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkImageViewType; +typedef enum VkSharingMode { +    VK_SHARING_MODE_EXCLUSIVE = 0, +    VK_SHARING_MODE_CONCURRENT = 1, +    VK_SHARING_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSharingMode; +typedef enum VkIndexType { +    VK_INDEX_TYPE_UINT16 = 0, +    VK_INDEX_TYPE_UINT32 = 1, +    VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkIndexType; +typedef enum VkLogicOp { +    VK_LOGIC_OP_CLEAR = 0, +    VK_LOGIC_OP_AND = 1, +    VK_LOGIC_OP_AND_REVERSE = 2, +    VK_LOGIC_OP_COPY = 3, +    VK_LOGIC_OP_AND_INVERTED = 4, +    VK_LOGIC_OP_NO_OP = 5, +    VK_LOGIC_OP_XOR = 6, +    VK_LOGIC_OP_OR = 7, +    VK_LOGIC_OP_NOR = 8, +    VK_LOGIC_OP_EQUIVALENT = 9, +    VK_LOGIC_OP_INVERT = 10, +    VK_LOGIC_OP_OR_REVERSE = 11, +    VK_LOGIC_OP_COPY_INVERTED = 12, +    VK_LOGIC_OP_OR_INVERTED = 13, +    VK_LOGIC_OP_NAND = 14, +    VK_LOGIC_OP_SET = 15, +    VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF +} VkLogicOp; +typedef enum VkMemoryHeapFlagBits { +    VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 1, +    VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryHeapFlagBits; +typedef enum VkAccessFlagBits { +    VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 1, +    VK_ACCESS_INDEX_READ_BIT = 2, +    VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 4, +    VK_ACCESS_UNIFORM_READ_BIT = 8, +    VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 16, +    VK_ACCESS_SHADER_READ_BIT = 32, +    VK_ACCESS_SHADER_WRITE_BIT = 64, +    VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 128, +    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 256, +    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 512, +    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 1024, +    VK_ACCESS_TRANSFER_READ_BIT = 2048, +    VK_ACCESS_TRANSFER_WRITE_BIT = 4096, +    VK_ACCESS_HOST_READ_BIT = 8192, +    VK_ACCESS_HOST_WRITE_BIT = 16384, +    VK_ACCESS_MEMORY_READ_BIT = 32768, +    VK_ACCESS_MEMORY_WRITE_BIT = 65536, +    VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkAccessFlagBits; +typedef enum VkMemoryPropertyFlagBits { +    VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 1, +    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 2, +    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 4, +    VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 8, +    VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 16, +    VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryPropertyFlagBits; +typedef enum VkPhysicalDeviceType { +    VK_PHYSICAL_DEVICE_TYPE_OTHER = 0, +    VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1, +    VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2, +    VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3, +    VK_PHYSICAL_DEVICE_TYPE_CPU = 4, +    VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkPhysicalDeviceType; +typedef enum VkPipelineBindPoint { +    VK_PIPELINE_BIND_POINT_GRAPHICS = 0, +    VK_PIPELINE_BIND_POINT_COMPUTE = 1, +    VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF +} VkPipelineBindPoint; +typedef enum VkPipelineCreateFlagBits { +    VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 1, +    VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 2, +    VK_PIPELINE_CREATE_DERIVATIVE_BIT = 4, +    VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCreateFlagBits; +typedef enum VkPrimitiveTopology { +    VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0, +    VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1, +    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2, +    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3, +    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4, +    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5, +    VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6, +    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7, +    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8, +    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9, +    VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10, +    VK_PRIMITIVE_TOPOLOGY_MAX_ENUM = 0x7FFFFFFF +} VkPrimitiveTopology; +typedef enum VkQueryControlFlagBits { +    VK_QUERY_CONTROL_PRECISE_BIT = 1, +    VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryControlFlagBits; +typedef enum VkQueryPipelineStatisticFlagBits { +    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 1, +    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 2, +    VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 4, +    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 8, +    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 16, +    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 32, +    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 64, +    VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 128, +    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 256, +    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 512, +    VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 1024, +    VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryPipelineStatisticFlagBits; +typedef enum VkQueryResultFlagBits { +    VK_QUERY_RESULT_64_BIT = 1, +    VK_QUERY_RESULT_WAIT_BIT = 2, +    VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 4, +    VK_QUERY_RESULT_PARTIAL_BIT = 8, +    VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryResultFlagBits; +typedef enum VkQueryType { +    VK_QUERY_TYPE_OCCLUSION = 0, +    VK_QUERY_TYPE_PIPELINE_STATISTICS = 1, +    VK_QUERY_TYPE_TIMESTAMP = 2, +    VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkQueryType; +typedef enum VkQueueFlagBits { +    VK_QUEUE_GRAPHICS_BIT = 1, +    VK_QUEUE_COMPUTE_BIT = 2, +    VK_QUEUE_TRANSFER_BIT = 4, +    VK_QUEUE_SPARSE_BINDING_BIT = 8, +    VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueueFlagBits; +typedef enum VkSubpassContents { +    VK_SUBPASS_CONTENTS_INLINE = 0, +    VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1, +    VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF +} VkSubpassContents; +typedef enum VkResult { +    VK_SUCCESS = 0, +    VK_NOT_READY = 1, +    VK_TIMEOUT = 2, +    VK_EVENT_SET = 3, +    VK_EVENT_RESET = 4, +    VK_INCOMPLETE = 5, +    VK_ERROR_OUT_OF_HOST_MEMORY = -1, +    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2, +    VK_ERROR_INITIALIZATION_FAILED = -3, +    VK_ERROR_DEVICE_LOST = -4, +    VK_ERROR_MEMORY_MAP_FAILED = -5, +    VK_ERROR_LAYER_NOT_PRESENT = -6, +    VK_ERROR_EXTENSION_NOT_PRESENT = -7, +    VK_ERROR_FEATURE_NOT_PRESENT = -8, +    VK_ERROR_INCOMPATIBLE_DRIVER = -9, +    VK_ERROR_TOO_MANY_OBJECTS = -10, +    VK_ERROR_FORMAT_NOT_SUPPORTED = -11, +    VK_ERROR_FRAGMENTED_POOL = -12, +    VK_ERROR_UNKNOWN = -13, +    VK_ERROR_SURFACE_LOST_KHR = -1000000000, +    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, +    VK_SUBOPTIMAL_KHR = 1000001003, +    VK_ERROR_OUT_OF_DATE_KHR = -1000001004, +    VK_RESULT_MAX_ENUM = 0x7FFFFFFF +} VkResult; +typedef enum VkShaderStageFlagBits { +    VK_SHADER_STAGE_VERTEX_BIT = 1, +    VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 2, +    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 4, +    VK_SHADER_STAGE_GEOMETRY_BIT = 8, +    VK_SHADER_STAGE_FRAGMENT_BIT = 16, +    VK_SHADER_STAGE_COMPUTE_BIT = 32, +    VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F, +    VK_SHADER_STAGE_ALL = 0x7FFFFFFF, +    VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkShaderStageFlagBits; +typedef enum VkSparseMemoryBindFlagBits { +    VK_SPARSE_MEMORY_BIND_METADATA_BIT = 1, +    VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSparseMemoryBindFlagBits; +typedef enum VkStencilFaceFlagBits { +    VK_STENCIL_FACE_FRONT_BIT = 1, +    VK_STENCIL_FACE_BACK_BIT = 2, +    VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003, +    VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK, +    VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkStencilFaceFlagBits; +typedef enum VkStencilOp { +    VK_STENCIL_OP_KEEP = 0, +    VK_STENCIL_OP_ZERO = 1, +    VK_STENCIL_OP_REPLACE = 2, +    VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3, +    VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4, +    VK_STENCIL_OP_INVERT = 5, +    VK_STENCIL_OP_INCREMENT_AND_WRAP = 6, +    VK_STENCIL_OP_DECREMENT_AND_WRAP = 7, +    VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF +} VkStencilOp; +typedef 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_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007, +    VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008, +    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009, +    VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010, +    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011, +    VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012, +    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, +    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, +    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000, +    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001, +    VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002, +    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003, +    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, +    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkStructureType; +typedef enum VkSystemAllocationScope { +    VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = 0, +    VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = 1, +    VK_SYSTEM_ALLOCATION_SCOPE_CACHE = 2, +    VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = 3, +    VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = 4, +    VK_SYSTEM_ALLOCATION_SCOPE_MAX_ENUM = 0x7FFFFFFF +} VkSystemAllocationScope; +typedef enum VkInternalAllocationType { +    VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0, +    VK_INTERNAL_ALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkInternalAllocationType; +typedef enum VkSamplerAddressMode { +    VK_SAMPLER_ADDRESS_MODE_REPEAT = 0, +    VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1, +    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2, +    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3, +    VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerAddressMode; +typedef enum VkFilter { +    VK_FILTER_NEAREST = 0, +    VK_FILTER_LINEAR = 1, +    VK_FILTER_MAX_ENUM = 0x7FFFFFFF +} VkFilter; +typedef enum VkSamplerMipmapMode { +    VK_SAMPLER_MIPMAP_MODE_NEAREST = 0, +    VK_SAMPLER_MIPMAP_MODE_LINEAR = 1, +    VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerMipmapMode; +typedef enum VkVertexInputRate { +    VK_VERTEX_INPUT_RATE_VERTEX = 0, +    VK_VERTEX_INPUT_RATE_INSTANCE = 1, +    VK_VERTEX_INPUT_RATE_MAX_ENUM = 0x7FFFFFFF +} VkVertexInputRate; +typedef enum VkPipelineStageFlagBits { +    VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 1, +    VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 2, +    VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 4, +    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 8, +    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 16, +    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 32, +    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 64, +    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 128, +    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 256, +    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 512, +    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 1024, +    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 2048, +    VK_PIPELINE_STAGE_TRANSFER_BIT = 4096, +    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 8192, +    VK_PIPELINE_STAGE_HOST_BIT = 16384, +    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 32768, +    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 65536, +    VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineStageFlagBits; +typedef enum VkSparseImageFormatFlagBits { +    VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 1, +    VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 2, +    VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 4, +    VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSparseImageFormatFlagBits; +typedef enum VkSampleCountFlagBits { +    VK_SAMPLE_COUNT_1_BIT = 1, +    VK_SAMPLE_COUNT_2_BIT = 2, +    VK_SAMPLE_COUNT_4_BIT = 4, +    VK_SAMPLE_COUNT_8_BIT = 8, +    VK_SAMPLE_COUNT_16_BIT = 16, +    VK_SAMPLE_COUNT_32_BIT = 32, +    VK_SAMPLE_COUNT_64_BIT = 64, +    VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSampleCountFlagBits; +typedef enum VkAttachmentDescriptionFlagBits { +    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 1, +    VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkAttachmentDescriptionFlagBits; +typedef enum VkDescriptorPoolCreateFlagBits { +    VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 1, +    VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorPoolCreateFlagBits; +typedef enum VkDependencyFlagBits { +    VK_DEPENDENCY_BY_REGION_BIT = 1, +    VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDependencyFlagBits; +typedef enum VkObjectType { +    VK_OBJECT_TYPE_UNKNOWN = 0, +    VK_OBJECT_TYPE_INSTANCE = 1, +    VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2, +    VK_OBJECT_TYPE_DEVICE = 3, +    VK_OBJECT_TYPE_QUEUE = 4, +    VK_OBJECT_TYPE_SEMAPHORE = 5, +    VK_OBJECT_TYPE_COMMAND_BUFFER = 6, +    VK_OBJECT_TYPE_FENCE = 7, +    VK_OBJECT_TYPE_DEVICE_MEMORY = 8, +    VK_OBJECT_TYPE_BUFFER = 9, +    VK_OBJECT_TYPE_IMAGE = 10, +    VK_OBJECT_TYPE_EVENT = 11, +    VK_OBJECT_TYPE_QUERY_POOL = 12, +    VK_OBJECT_TYPE_BUFFER_VIEW = 13, +    VK_OBJECT_TYPE_IMAGE_VIEW = 14, +    VK_OBJECT_TYPE_SHADER_MODULE = 15, +    VK_OBJECT_TYPE_PIPELINE_CACHE = 16, +    VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17, +    VK_OBJECT_TYPE_RENDER_PASS = 18, +    VK_OBJECT_TYPE_PIPELINE = 19, +    VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20, +    VK_OBJECT_TYPE_SAMPLER = 21, +    VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22, +    VK_OBJECT_TYPE_DESCRIPTOR_SET = 23, +    VK_OBJECT_TYPE_FRAMEBUFFER = 24, +    VK_OBJECT_TYPE_COMMAND_POOL = 25, +    VK_OBJECT_TYPE_SURFACE_KHR = 1000000000, +    VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000, +    VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000, +    VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkObjectType; +typedef enum VkColorSpaceKHR { +    VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0, +    VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, +    VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkColorSpaceKHR; +typedef enum VkCompositeAlphaFlagBitsKHR { +    VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 1, +    VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 2, +    VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 4, +    VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 8, +    VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkCompositeAlphaFlagBitsKHR; +typedef enum VkPresentModeKHR { +    VK_PRESENT_MODE_IMMEDIATE_KHR = 0, +    VK_PRESENT_MODE_MAILBOX_KHR = 1, +    VK_PRESENT_MODE_FIFO_KHR = 2, +    VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3, +    VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkPresentModeKHR; +typedef enum VkSurfaceTransformFlagBitsKHR { +    VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 1, +    VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 2, +    VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 4, +    VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 8, +    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 16, +    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 32, +    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 64, +    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 128, +    VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 256, +    VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSurfaceTransformFlagBitsKHR; +typedef enum VkDeviceGroupPresentModeFlagBitsKHR { +    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR = 1, +    VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR = 2, +    VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR = 4, +    VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR = 8, +    VK_DEVICE_GROUP_PRESENT_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDeviceGroupPresentModeFlagBitsKHR; +typedef enum VkSwapchainCreateFlagBitsKHR { +    VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 1, +    VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 2, +    VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkSwapchainCreateFlagBitsKHR; +typedef enum VkDebugUtilsMessageSeverityFlagBitsEXT { +    VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 1, +    VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 16, +    VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 256, +    VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 4096, +    VK_DEBUG_UTILS_MESSAGE_SEVERITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugUtilsMessageSeverityFlagBitsEXT; +typedef enum VkDebugUtilsMessageTypeFlagBitsEXT { +    VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 1, +    VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 2, +    VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 4, +    VK_DEBUG_UTILS_MESSAGE_TYPE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDebugUtilsMessageTypeFlagBitsEXT; +typedef enum VkVendorId { +    VK_VENDOR_ID_VIV = 0x10001, +    VK_VENDOR_ID_VSI = 0x10002, +    VK_VENDOR_ID_KAZAN = 0x10003, +    VK_VENDOR_ID_CODEPLAY = 0x10004, +    VK_VENDOR_ID_MESA = 0x10005, +    VK_VENDOR_ID_POCL = 0x10006, +    VK_VENDOR_ID_MOBILEYE = 0x10007, +    VK_VENDOR_ID_MAX_ENUM = 0x7FFFFFFF +} VkVendorId; +typedef void (VKAPI_PTR *PFN_vkInternalAllocationNotification)( +    void*                                       pUserData, +    size_t                                      size, +    VkInternalAllocationType                    allocationType, +    VkSystemAllocationScope                     allocationScope); +typedef void (VKAPI_PTR *PFN_vkInternalFreeNotification)( +    void*                                       pUserData, +    size_t                                      size, +    VkInternalAllocationType                    allocationType, +    VkSystemAllocationScope                     allocationScope); +typedef void* (VKAPI_PTR *PFN_vkReallocationFunction)( +    void*                                       pUserData, +    void*                                       pOriginal, +    size_t                                      size, +    size_t                                      alignment, +    VkSystemAllocationScope                     allocationScope); +typedef void* (VKAPI_PTR *PFN_vkAllocationFunction)( +    void*                                       pUserData, +    size_t                                      size, +    size_t                                      alignment, +    VkSystemAllocationScope                     allocationScope); +typedef void (VKAPI_PTR *PFN_vkFreeFunction)( +    void*                                       pUserData, +    void*                                       pMemory); +typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void); +typedef struct VkBaseOutStructure { +    VkStructureType   sType; +    struct  VkBaseOutStructure *  pNext; +} VkBaseOutStructure; + +typedef struct VkBaseInStructure { +    VkStructureType   sType; +    const struct  VkBaseInStructure *  pNext; +} VkBaseInStructure; + +typedef struct VkOffset2D { +    int32_t          x; +    int32_t          y; +} VkOffset2D; + +typedef struct VkOffset3D { +    int32_t          x; +    int32_t          y; +    int32_t          z; +} VkOffset3D; + +typedef struct VkExtent2D { +    uint32_t          width; +    uint32_t          height; +} VkExtent2D; + +typedef struct VkExtent3D { +    uint32_t          width; +    uint32_t          height; +    uint32_t          depth; +} VkExtent3D; + +typedef struct VkViewport { +    float   x; +    float   y; +    float   width; +    float   height; +    float                         minDepth; +    float                         maxDepth; +} VkViewport; + +typedef struct VkRect2D { +    VkOffset2D       offset; +    VkExtent2D       extent; +} VkRect2D; + +typedef struct VkClearRect { +    VkRect2D         rect; +    uint32_t         baseArrayLayer; +    uint32_t         layerCount; +} VkClearRect; + +typedef struct VkComponentMapping { +    VkComponentSwizzle   r; +    VkComponentSwizzle   g; +    VkComponentSwizzle   b; +    VkComponentSwizzle   a; +} VkComponentMapping; + +typedef struct VkExtensionProperties { +    char              extensionName [ VK_MAX_EXTENSION_NAME_SIZE ]; +    uint32_t          specVersion; +} VkExtensionProperties; + +typedef struct VkLayerProperties { +    char              layerName [ VK_MAX_EXTENSION_NAME_SIZE ]; +    uint32_t          specVersion; +    uint32_t          implementationVersion; +    char              description [ VK_MAX_DESCRIPTION_SIZE ]; +} VkLayerProperties; + +typedef struct VkApplicationInfo { +    VkStructureType   sType; +    const  void *      pNext; +    const  char *      pApplicationName; +    uint32_t          applicationVersion; +    const  char *      pEngineName; +    uint32_t          engineVersion; +    uint32_t          apiVersion; +} VkApplicationInfo; + +typedef struct VkAllocationCallbacks { +    void *            pUserData; +    PFN_vkAllocationFunction     pfnAllocation; +    PFN_vkReallocationFunction   pfnReallocation; +    PFN_vkFreeFunction      pfnFree; +    PFN_vkInternalAllocationNotification   pfnInternalAllocation; +    PFN_vkInternalFreeNotification   pfnInternalFree; +} VkAllocationCallbacks; + +typedef struct VkDescriptorImageInfo { +    VkSampler         sampler; +    VkImageView       imageView; +    VkImageLayout     imageLayout; +} VkDescriptorImageInfo; + +typedef struct VkCopyDescriptorSet { +    VkStructureType   sType; +    const  void *             pNext; +    VkDescriptorSet          srcSet; +    uint32_t                 srcBinding; +    uint32_t                 srcArrayElement; +    VkDescriptorSet          dstSet; +    uint32_t                 dstBinding; +    uint32_t                 dstArrayElement; +    uint32_t                 descriptorCount; +} VkCopyDescriptorSet; + +typedef struct VkDescriptorPoolSize { +    VkDescriptorType         type; +    uint32_t                 descriptorCount; +} VkDescriptorPoolSize; + +typedef struct VkDescriptorSetAllocateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkDescriptorPool         descriptorPool; +    uint32_t                 descriptorSetCount; +    const  VkDescriptorSetLayout *  pSetLayouts; +} VkDescriptorSetAllocateInfo; + +typedef struct VkSpecializationMapEntry { +    uint32_t                       constantID; +    uint32_t                       offset; +    size_t   size; +} VkSpecializationMapEntry; + +typedef struct VkSpecializationInfo { +    uint32_t                 mapEntryCount; +    const  VkSpecializationMapEntry *  pMapEntries; +    size_t                   dataSize; +    const  void *             pData; +} VkSpecializationInfo; + +typedef struct VkVertexInputBindingDescription { +    uint32_t                 binding; +    uint32_t                 stride; +    VkVertexInputRate        inputRate; +} VkVertexInputBindingDescription; + +typedef struct VkVertexInputAttributeDescription { +    uint32_t                 location; +    uint32_t                 binding; +    VkFormat                 format; +    uint32_t                 offset; +} VkVertexInputAttributeDescription; + +typedef struct VkStencilOpState { +    VkStencilOp              failOp; +    VkStencilOp              passOp; +    VkStencilOp              depthFailOp; +    VkCompareOp              compareOp; +    uint32_t                 compareMask; +    uint32_t                 writeMask; +    uint32_t                 reference; +} VkStencilOpState; + +typedef struct VkPipelineCacheHeaderVersionOne { +    uint32_t                 headerSize; +    VkPipelineCacheHeaderVersion   headerVersion; +    uint32_t                 vendorID; +    uint32_t                 deviceID; +    uint8_t                  pipelineCacheUUID [ VK_UUID_SIZE ]; +} VkPipelineCacheHeaderVersionOne; + +typedef struct VkCommandBufferAllocateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkCommandPool            commandPool; +    VkCommandBufferLevel     level; +    uint32_t                 commandBufferCount; +} VkCommandBufferAllocateInfo; + +typedef union VkClearColorValue { +    float                    float32 [4]; +    int32_t                  int32 [4]; +    uint32_t                 uint32 [4]; +} VkClearColorValue; + +typedef struct VkClearDepthStencilValue { +    float                    depth; +    uint32_t                 stencil; +} VkClearDepthStencilValue; + +typedef union VkClearValue { +    VkClearColorValue        color; +    VkClearDepthStencilValue   depthStencil; +} VkClearValue; + +typedef struct VkAttachmentReference { +    uint32_t                 attachment; +    VkImageLayout            layout; +} VkAttachmentReference; + +typedef struct VkDrawIndirectCommand { +    uint32_t                         vertexCount; +    uint32_t                         instanceCount; +    uint32_t                         firstVertex; +    uint32_t   firstInstance; +} VkDrawIndirectCommand; + +typedef struct VkDrawIndexedIndirectCommand { +    uint32_t                         indexCount; +    uint32_t                         instanceCount; +    uint32_t                         firstIndex; +    int32_t                          vertexOffset; +    uint32_t   firstInstance; +} VkDrawIndexedIndirectCommand; + +typedef struct VkDispatchIndirectCommand { +    uint32_t   x; +    uint32_t   y; +    uint32_t   z; +} VkDispatchIndirectCommand; + +typedef struct VkSurfaceFormatKHR { +    VkFormat                           format; +    VkColorSpaceKHR                    colorSpace; +} VkSurfaceFormatKHR; + +typedef struct VkPresentInfoKHR { +    VkStructureType   sType; +    const  void *   pNext; +    uint32_t           waitSemaphoreCount; +    const  VkSemaphore *  pWaitSemaphores; +    uint32_t                           swapchainCount; +    const  VkSwapchainKHR *  pSwapchains; +    const  uint32_t *  pImageIndices; +    VkResult *  pResults; +} VkPresentInfoKHR; + +typedef struct VkImageSwapchainCreateInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkSwapchainKHR     swapchain; +} VkImageSwapchainCreateInfoKHR; + +typedef struct VkBindImageMemorySwapchainInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkSwapchainKHR   swapchain; +    uint32_t                           imageIndex; +} VkBindImageMemorySwapchainInfoKHR; + +typedef struct VkAcquireNextImageInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkSwapchainKHR   swapchain; +    uint64_t                           timeout; +    VkSemaphore   semaphore; +    VkFence   fence; +    uint32_t                           deviceMask; +} VkAcquireNextImageInfoKHR; + +typedef struct VkDeviceGroupPresentInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    uint32_t           swapchainCount; +    const  uint32_t *  pDeviceMasks; +    VkDeviceGroupPresentModeFlagBitsKHR   mode; +} VkDeviceGroupPresentInfoKHR; + +typedef struct VkDebugUtilsObjectNameInfoEXT { +    VkStructureType   sType; +    const  void *                                             pNext; +    VkObjectType                                             objectType; +    uint64_t                                                 objectHandle; +    const  char *       pObjectName; +} VkDebugUtilsObjectNameInfoEXT; + +typedef struct VkDebugUtilsObjectTagInfoEXT { +    VkStructureType   sType; +    const  void *                             pNext; +    VkObjectType                             objectType; +    uint64_t                                 objectHandle; +    uint64_t                                 tagName; +    size_t                                   tagSize; +    const  void *               pTag; +} VkDebugUtilsObjectTagInfoEXT; + +typedef struct VkDebugUtilsLabelEXT { +    VkStructureType   sType; +    const  void *                             pNext; +    const  char *       pLabelName; +    float                    color [4]; +} VkDebugUtilsLabelEXT; + +/* Complete version of this file */ +#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) +typedef uint32_t VkSampleMask; +typedef uint32_t VkBool32; +typedef uint32_t VkFlags; +typedef uint64_t VkDeviceSize; +typedef uint64_t VkDeviceAddress; +typedef VkFlags VkFramebufferCreateFlags; +typedef VkFlags VkQueryPoolCreateFlags; +typedef VkFlags VkRenderPassCreateFlags; +typedef VkFlags VkSamplerCreateFlags; +typedef VkFlags VkPipelineLayoutCreateFlags; +typedef VkFlags VkPipelineCacheCreateFlags; +typedef VkFlags VkPipelineDepthStencilStateCreateFlags; +typedef VkFlags VkPipelineDynamicStateCreateFlags; +typedef VkFlags VkPipelineColorBlendStateCreateFlags; +typedef VkFlags VkPipelineMultisampleStateCreateFlags; +typedef VkFlags VkPipelineRasterizationStateCreateFlags; +typedef VkFlags VkPipelineViewportStateCreateFlags; +typedef VkFlags VkPipelineTessellationStateCreateFlags; +typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; +typedef VkFlags VkPipelineVertexInputStateCreateFlags; +typedef VkFlags VkPipelineShaderStageCreateFlags; +typedef VkFlags VkDescriptorSetLayoutCreateFlags; +typedef VkFlags VkBufferViewCreateFlags; +typedef VkFlags VkInstanceCreateFlags; +typedef VkFlags VkDeviceCreateFlags; +typedef VkFlags VkDeviceQueueCreateFlags; +typedef VkFlags VkQueueFlags; +typedef VkFlags VkMemoryPropertyFlags; +typedef VkFlags VkMemoryHeapFlags; +typedef VkFlags VkAccessFlags; +typedef VkFlags VkBufferUsageFlags; +typedef VkFlags VkBufferCreateFlags; +typedef VkFlags VkShaderStageFlags; +typedef VkFlags VkImageUsageFlags; +typedef VkFlags VkImageCreateFlags; +typedef VkFlags VkImageViewCreateFlags; +typedef VkFlags VkPipelineCreateFlags; +typedef VkFlags VkColorComponentFlags; +typedef VkFlags VkFenceCreateFlags; +typedef VkFlags VkSemaphoreCreateFlags; +typedef VkFlags VkFormatFeatureFlags; +typedef VkFlags VkQueryControlFlags; +typedef VkFlags VkQueryResultFlags; +typedef VkFlags VkShaderModuleCreateFlags; +typedef VkFlags VkEventCreateFlags; +typedef VkFlags VkCommandPoolCreateFlags; +typedef VkFlags VkCommandPoolResetFlags; +typedef VkFlags VkCommandBufferResetFlags; +typedef VkFlags VkCommandBufferUsageFlags; +typedef VkFlags VkQueryPipelineStatisticFlags; +typedef VkFlags VkMemoryMapFlags; +typedef VkFlags VkImageAspectFlags; +typedef VkFlags VkSparseMemoryBindFlags; +typedef VkFlags VkSparseImageFormatFlags; +typedef VkFlags VkSubpassDescriptionFlags; +typedef VkFlags VkPipelineStageFlags; +typedef VkFlags VkSampleCountFlags; +typedef VkFlags VkAttachmentDescriptionFlags; +typedef VkFlags VkStencilFaceFlags; +typedef VkFlags VkCullModeFlags; +typedef VkFlags VkDescriptorPoolCreateFlags; +typedef VkFlags VkDescriptorPoolResetFlags; +typedef VkFlags VkDependencyFlags; +typedef VkFlags VkCompositeAlphaFlagsKHR; +typedef VkFlags VkSurfaceTransformFlagsKHR; +typedef VkFlags VkSwapchainCreateFlagsKHR; +#if defined(VK_USE_PLATFORM_WIN32_KHR) +typedef VkFlags VkWin32SurfaceCreateFlagsKHR; +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) +typedef VkFlags VkXlibSurfaceCreateFlagsKHR; +#endif + +typedef VkFlags VkDeviceGroupPresentModeFlagsKHR; +typedef VkFlags VkDebugUtilsMessageSeverityFlagsEXT; +typedef VkFlags VkDebugUtilsMessageTypeFlagsEXT; +typedef VkFlags VkDebugUtilsMessengerCreateFlagsEXT; +typedef VkFlags VkDebugUtilsMessengerCallbackDataFlagsEXT; +typedef struct VkDeviceQueueCreateInfo { +    VkStructureType   sType; +    const  void *      pNext; +    VkDeviceQueueCreateFlags      flags; +    uint32_t          queueFamilyIndex; +    uint32_t          queueCount; +    const  float *     pQueuePriorities; +} VkDeviceQueueCreateInfo; + +typedef struct VkInstanceCreateInfo { +    VkStructureType   sType; +    const  void *      pNext; +    VkInstanceCreateFlags    flags; +    const  VkApplicationInfo *  pApplicationInfo; +    uint32_t                 enabledLayerCount; +    const  char * const*       ppEnabledLayerNames; +    uint32_t                 enabledExtensionCount; +    const  char * const*       ppEnabledExtensionNames; +} VkInstanceCreateInfo; + +typedef struct VkQueueFamilyProperties { +    VkQueueFlags             queueFlags; +    uint32_t                 queueCount; +    uint32_t                 timestampValidBits; +    VkExtent3D               minImageTransferGranularity; +} VkQueueFamilyProperties; + +typedef struct VkMemoryAllocateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkDeviceSize             allocationSize; +    uint32_t                 memoryTypeIndex; +} VkMemoryAllocateInfo; + +typedef struct VkMemoryRequirements { +    VkDeviceSize             size; +    VkDeviceSize             alignment; +    uint32_t                 memoryTypeBits; +} VkMemoryRequirements; + +typedef struct VkSparseImageFormatProperties { +    VkImageAspectFlags         aspectMask; +    VkExtent3D                                  imageGranularity; +    VkSparseImageFormatFlags   flags; +} VkSparseImageFormatProperties; + +typedef struct VkSparseImageMemoryRequirements { +    VkSparseImageFormatProperties   formatProperties; +    uint32_t                 imageMipTailFirstLod; +    VkDeviceSize             imageMipTailSize; +    VkDeviceSize             imageMipTailOffset; +    VkDeviceSize             imageMipTailStride; +} VkSparseImageMemoryRequirements; + +typedef struct VkMemoryType { +    VkMemoryPropertyFlags    propertyFlags; +    uint32_t                 heapIndex; +} VkMemoryType; + +typedef struct VkMemoryHeap { +    VkDeviceSize             size; +    VkMemoryHeapFlags        flags; +} VkMemoryHeap; + +typedef struct VkMappedMemoryRange { +    VkStructureType   sType; +    const  void *             pNext; +    VkDeviceMemory           memory; +    VkDeviceSize             offset; +    VkDeviceSize             size; +} VkMappedMemoryRange; + +typedef struct VkFormatProperties { +    VkFormatFeatureFlags     linearTilingFeatures; +    VkFormatFeatureFlags     optimalTilingFeatures; +    VkFormatFeatureFlags     bufferFeatures; +} VkFormatProperties; + +typedef struct VkImageFormatProperties { +    VkExtent3D               maxExtent; +    uint32_t                 maxMipLevels; +    uint32_t                 maxArrayLayers; +    VkSampleCountFlags       sampleCounts; +    VkDeviceSize             maxResourceSize; +} VkImageFormatProperties; + +typedef struct VkDescriptorBufferInfo { +    VkBuffer                 buffer; +    VkDeviceSize             offset; +    VkDeviceSize             range; +} VkDescriptorBufferInfo; + +typedef struct VkWriteDescriptorSet { +    VkStructureType   sType; +    const  void *             pNext; +    VkDescriptorSet          dstSet; +    uint32_t                 dstBinding; +    uint32_t                 dstArrayElement; +    uint32_t                 descriptorCount; +    VkDescriptorType         descriptorType; +    const  VkDescriptorImageInfo *  pImageInfo; +    const  VkDescriptorBufferInfo *  pBufferInfo; +    const  VkBufferView *     pTexelBufferView; +} VkWriteDescriptorSet; + +typedef struct VkBufferCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkBufferCreateFlags      flags; +    VkDeviceSize             size; +    VkBufferUsageFlags       usage; +    VkSharingMode            sharingMode; +    uint32_t                 queueFamilyIndexCount; +    const  uint32_t *         pQueueFamilyIndices; +} VkBufferCreateInfo; + +typedef struct VkBufferViewCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkBufferViewCreateFlags   flags; +    VkBuffer                 buffer; +    VkFormat                 format; +    VkDeviceSize             offset; +    VkDeviceSize             range; +} VkBufferViewCreateInfo; + +typedef struct VkImageSubresource { +    VkImageAspectFlags       aspectMask; +    uint32_t                 mipLevel; +    uint32_t                 arrayLayer; +} VkImageSubresource; + +typedef struct VkImageSubresourceLayers { +    VkImageAspectFlags       aspectMask; +    uint32_t                 mipLevel; +    uint32_t                 baseArrayLayer; +    uint32_t                 layerCount; +} VkImageSubresourceLayers; + +typedef struct VkImageSubresourceRange { +    VkImageAspectFlags       aspectMask; +    uint32_t                 baseMipLevel; +    uint32_t                 levelCount; +    uint32_t                 baseArrayLayer; +    uint32_t                 layerCount; +} VkImageSubresourceRange; + +typedef struct VkMemoryBarrier { +    VkStructureType   sType; +    const  void *             pNext; +    VkAccessFlags            srcAccessMask; +    VkAccessFlags            dstAccessMask; +} VkMemoryBarrier; + +typedef struct VkBufferMemoryBarrier { +    VkStructureType   sType; +    const  void *             pNext; +    VkAccessFlags            srcAccessMask; +    VkAccessFlags            dstAccessMask; +    uint32_t                 srcQueueFamilyIndex; +    uint32_t                 dstQueueFamilyIndex; +    VkBuffer                 buffer; +    VkDeviceSize             offset; +    VkDeviceSize             size; +} VkBufferMemoryBarrier; + +typedef struct VkImageMemoryBarrier { +    VkStructureType   sType; +    const  void *             pNext; +    VkAccessFlags            srcAccessMask; +    VkAccessFlags            dstAccessMask; +    VkImageLayout            oldLayout; +    VkImageLayout            newLayout; +    uint32_t                 srcQueueFamilyIndex; +    uint32_t                 dstQueueFamilyIndex; +    VkImage                  image; +    VkImageSubresourceRange   subresourceRange; +} VkImageMemoryBarrier; + +typedef struct VkImageCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkImageCreateFlags       flags; +    VkImageType              imageType; +    VkFormat                 format; +    VkExtent3D               extent; +    uint32_t                 mipLevels; +    uint32_t                 arrayLayers; +    VkSampleCountFlagBits    samples; +    VkImageTiling            tiling; +    VkImageUsageFlags        usage; +    VkSharingMode            sharingMode; +    uint32_t                 queueFamilyIndexCount; +    const  uint32_t *         pQueueFamilyIndices; +    VkImageLayout            initialLayout; +} VkImageCreateInfo; + +typedef struct VkSubresourceLayout { +    VkDeviceSize             offset; +    VkDeviceSize             size; +    VkDeviceSize             rowPitch; +    VkDeviceSize             arrayPitch; +    VkDeviceSize             depthPitch; +} VkSubresourceLayout; + +typedef struct VkImageViewCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkImageViewCreateFlags   flags; +    VkImage                  image; +    VkImageViewType          viewType; +    VkFormat                 format; +    VkComponentMapping       components; +    VkImageSubresourceRange   subresourceRange; +} VkImageViewCreateInfo; + +typedef struct VkBufferCopy { +    VkDeviceSize                         srcOffset; +    VkDeviceSize                         dstOffset; +    VkDeviceSize   size; +} VkBufferCopy; + +typedef struct VkSparseMemoryBind { +    VkDeviceSize             resourceOffset; +    VkDeviceSize             size; +    VkDeviceMemory           memory; +    VkDeviceSize             memoryOffset; +    VkSparseMemoryBindFlags   flags; +} VkSparseMemoryBind; + +typedef struct VkSparseImageMemoryBind { +    VkImageSubresource       subresource; +    VkOffset3D               offset; +    VkExtent3D               extent; +    VkDeviceMemory           memory; +    VkDeviceSize             memoryOffset; +    VkSparseMemoryBindFlags   flags; +} VkSparseImageMemoryBind; + +typedef struct VkSparseBufferMemoryBindInfo { +    VkBuffer   buffer; +    uint32_t                 bindCount; +    const  VkSparseMemoryBind *  pBinds; +} VkSparseBufferMemoryBindInfo; + +typedef struct VkSparseImageOpaqueMemoryBindInfo { +    VkImage   image; +    uint32_t                 bindCount; +    const  VkSparseMemoryBind *  pBinds; +} VkSparseImageOpaqueMemoryBindInfo; + +typedef struct VkSparseImageMemoryBindInfo { +    VkImage   image; +    uint32_t                 bindCount; +    const  VkSparseImageMemoryBind *  pBinds; +} VkSparseImageMemoryBindInfo; + +typedef struct VkBindSparseInfo { +    VkStructureType   sType; +    const  void *             pNext; +    uint32_t                 waitSemaphoreCount; +    const  VkSemaphore *      pWaitSemaphores; +    uint32_t                 bufferBindCount; +    const  VkSparseBufferMemoryBindInfo *  pBufferBinds; +    uint32_t                 imageOpaqueBindCount; +    const  VkSparseImageOpaqueMemoryBindInfo *  pImageOpaqueBinds; +    uint32_t                 imageBindCount; +    const  VkSparseImageMemoryBindInfo *  pImageBinds; +    uint32_t                 signalSemaphoreCount; +    const  VkSemaphore *      pSignalSemaphores; +} VkBindSparseInfo; + +typedef struct VkImageCopy { +    VkImageSubresourceLayers   srcSubresource; +    VkOffset3D               srcOffset; +    VkImageSubresourceLayers   dstSubresource; +    VkOffset3D               dstOffset; +    VkExtent3D               extent; +} VkImageCopy; + +typedef struct VkImageBlit { +    VkImageSubresourceLayers   srcSubresource; +    VkOffset3D               srcOffsets [2]; +    VkImageSubresourceLayers   dstSubresource; +    VkOffset3D               dstOffsets [2]; +} VkImageBlit; + +typedef struct VkBufferImageCopy { +    VkDeviceSize             bufferOffset; +    uint32_t                 bufferRowLength; +    uint32_t                 bufferImageHeight; +    VkImageSubresourceLayers   imageSubresource; +    VkOffset3D               imageOffset; +    VkExtent3D               imageExtent; +} VkBufferImageCopy; + +typedef struct VkImageResolve { +    VkImageSubresourceLayers   srcSubresource; +    VkOffset3D               srcOffset; +    VkImageSubresourceLayers   dstSubresource; +    VkOffset3D               dstOffset; +    VkExtent3D               extent; +} VkImageResolve; + +typedef struct VkShaderModuleCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkShaderModuleCreateFlags   flags; +    size_t                   codeSize; +    const  uint32_t *             pCode; +} VkShaderModuleCreateInfo; + +typedef struct VkDescriptorSetLayoutBinding { +    uint32_t                 binding; +    VkDescriptorType         descriptorType; +    uint32_t   descriptorCount; +    VkShaderStageFlags       stageFlags; +    const  VkSampler *        pImmutableSamplers; +} VkDescriptorSetLayoutBinding; + +typedef struct VkDescriptorSetLayoutCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkDescriptorSetLayoutCreateFlags      flags; +    uint32_t                 bindingCount; +    const  VkDescriptorSetLayoutBinding *  pBindings; +} VkDescriptorSetLayoutCreateInfo; + +typedef struct VkDescriptorPoolCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkDescriptorPoolCreateFlags    flags; +    uint32_t                 maxSets; +    uint32_t                 poolSizeCount; +    const  VkDescriptorPoolSize *  pPoolSizes; +} VkDescriptorPoolCreateInfo; + +typedef struct VkPipelineShaderStageCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineShaderStageCreateFlags      flags; +    VkShaderStageFlagBits    stage; +    VkShaderModule   module; +    const  char *  pName; +    const  VkSpecializationInfo *  pSpecializationInfo; +} VkPipelineShaderStageCreateInfo; + +typedef struct VkComputePipelineCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineCreateFlags    flags; +    VkPipelineShaderStageCreateInfo   stage; +    VkPipelineLayout         layout; +    VkPipeline        basePipelineHandle; +    int32_t                  basePipelineIndex; +} VkComputePipelineCreateInfo; + +typedef struct VkPipelineVertexInputStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineVertexInputStateCreateFlags      flags; +    uint32_t                 vertexBindingDescriptionCount; +    const  VkVertexInputBindingDescription *  pVertexBindingDescriptions; +    uint32_t                 vertexAttributeDescriptionCount; +    const  VkVertexInputAttributeDescription *  pVertexAttributeDescriptions; +} VkPipelineVertexInputStateCreateInfo; + +typedef struct VkPipelineInputAssemblyStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineInputAssemblyStateCreateFlags      flags; +    VkPrimitiveTopology      topology; +    VkBool32                 primitiveRestartEnable; +} VkPipelineInputAssemblyStateCreateInfo; + +typedef struct VkPipelineTessellationStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineTessellationStateCreateFlags      flags; +    uint32_t                 patchControlPoints; +} VkPipelineTessellationStateCreateInfo; + +typedef struct VkPipelineViewportStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineViewportStateCreateFlags      flags; +    uint32_t                 viewportCount; +    const  VkViewport *       pViewports; +    uint32_t                 scissorCount; +    const  VkRect2D *         pScissors; +} VkPipelineViewportStateCreateInfo; + +typedef struct VkPipelineRasterizationStateCreateInfo { +    VkStructureType   sType; +    const  void *  pNext; +    VkPipelineRasterizationStateCreateFlags      flags; +    VkBool32                 depthClampEnable; +    VkBool32                 rasterizerDiscardEnable; +    VkPolygonMode            polygonMode; +    VkCullModeFlags          cullMode; +    VkFrontFace              frontFace; +    VkBool32                 depthBiasEnable; +    float                    depthBiasConstantFactor; +    float                    depthBiasClamp; +    float                    depthBiasSlopeFactor; +    float                    lineWidth; +} VkPipelineRasterizationStateCreateInfo; + +typedef struct VkPipelineMultisampleStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineMultisampleStateCreateFlags      flags; +    VkSampleCountFlagBits    rasterizationSamples; +    VkBool32                 sampleShadingEnable; +    float                    minSampleShading; +    const  VkSampleMask *     pSampleMask; +    VkBool32                 alphaToCoverageEnable; +    VkBool32                 alphaToOneEnable; +} VkPipelineMultisampleStateCreateInfo; + +typedef struct VkPipelineColorBlendAttachmentState { +    VkBool32                 blendEnable; +    VkBlendFactor            srcColorBlendFactor; +    VkBlendFactor            dstColorBlendFactor; +    VkBlendOp                colorBlendOp; +    VkBlendFactor            srcAlphaBlendFactor; +    VkBlendFactor            dstAlphaBlendFactor; +    VkBlendOp                alphaBlendOp; +    VkColorComponentFlags    colorWriteMask; +} VkPipelineColorBlendAttachmentState; + +typedef struct VkPipelineColorBlendStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineColorBlendStateCreateFlags      flags; +    VkBool32                 logicOpEnable; +    VkLogicOp                logicOp; +    uint32_t                 attachmentCount; +    const  VkPipelineColorBlendAttachmentState *  pAttachments; +    float                    blendConstants [4]; +} VkPipelineColorBlendStateCreateInfo; + +typedef struct VkPipelineDynamicStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineDynamicStateCreateFlags      flags; +    uint32_t                 dynamicStateCount; +    const  VkDynamicState *   pDynamicStates; +} VkPipelineDynamicStateCreateInfo; + +typedef struct VkPipelineDepthStencilStateCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineDepthStencilStateCreateFlags      flags; +    VkBool32                 depthTestEnable; +    VkBool32                 depthWriteEnable; +    VkCompareOp              depthCompareOp; +    VkBool32                 depthBoundsTestEnable; +    VkBool32                 stencilTestEnable; +    VkStencilOpState         front; +    VkStencilOpState         back; +    float                    minDepthBounds; +    float                    maxDepthBounds; +} VkPipelineDepthStencilStateCreateInfo; + +typedef struct VkGraphicsPipelineCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineCreateFlags    flags; +    uint32_t   stageCount; +    const  VkPipelineShaderStageCreateInfo *  pStages; +    const  VkPipelineVertexInputStateCreateInfo *  pVertexInputState; +    const  VkPipelineInputAssemblyStateCreateInfo *  pInputAssemblyState; +    const  VkPipelineTessellationStateCreateInfo *  pTessellationState; +    const  VkPipelineViewportStateCreateInfo *  pViewportState; +    const  VkPipelineRasterizationStateCreateInfo *  pRasterizationState; +    const  VkPipelineMultisampleStateCreateInfo *  pMultisampleState; +    const  VkPipelineDepthStencilStateCreateInfo *  pDepthStencilState; +    const  VkPipelineColorBlendStateCreateInfo *  pColorBlendState; +    const  VkPipelineDynamicStateCreateInfo *  pDynamicState; +    VkPipelineLayout         layout; +    VkRenderPass             renderPass; +    uint32_t                 subpass; +    VkPipeline        basePipelineHandle; +    int32_t                  basePipelineIndex; +} VkGraphicsPipelineCreateInfo; + +typedef struct VkPipelineCacheCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineCacheCreateFlags      flags; +    size_t             initialDataSize; +    const  void *             pInitialData; +} VkPipelineCacheCreateInfo; + +typedef struct VkPushConstantRange { +    VkShaderStageFlags       stageFlags; +    uint32_t                 offset; +    uint32_t                 size; +} VkPushConstantRange; + +typedef struct VkPipelineLayoutCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkPipelineLayoutCreateFlags      flags; +    uint32_t                 setLayoutCount; +    const  VkDescriptorSetLayout *  pSetLayouts; +    uint32_t                 pushConstantRangeCount; +    const  VkPushConstantRange *  pPushConstantRanges; +} VkPipelineLayoutCreateInfo; + +typedef struct VkSamplerCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkSamplerCreateFlags     flags; +    VkFilter                 magFilter; +    VkFilter                 minFilter; +    VkSamplerMipmapMode      mipmapMode; +    VkSamplerAddressMode     addressModeU; +    VkSamplerAddressMode     addressModeV; +    VkSamplerAddressMode     addressModeW; +    float                    mipLodBias; +    VkBool32                 anisotropyEnable; +    float                    maxAnisotropy; +    VkBool32                 compareEnable; +    VkCompareOp              compareOp; +    float                    minLod; +    float                    maxLod; +    VkBorderColor            borderColor; +    VkBool32                 unnormalizedCoordinates; +} VkSamplerCreateInfo; + +typedef struct VkCommandPoolCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkCommandPoolCreateFlags     flags; +    uint32_t                 queueFamilyIndex; +} VkCommandPoolCreateInfo; + +typedef struct VkCommandBufferInheritanceInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkRenderPass      renderPass; +    uint32_t                 subpass; +    VkFramebuffer     framebuffer; +    VkBool32                 occlusionQueryEnable; +    VkQueryControlFlags      queryFlags; +    VkQueryPipelineStatisticFlags   pipelineStatistics; +} VkCommandBufferInheritanceInfo; + +typedef struct VkCommandBufferBeginInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkCommandBufferUsageFlags    flags; +    const  VkCommandBufferInheritanceInfo *        pInheritanceInfo; +} VkCommandBufferBeginInfo; + +typedef struct VkRenderPassBeginInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkRenderPass             renderPass; +    VkFramebuffer            framebuffer; +    VkRect2D                 renderArea; +    uint32_t                 clearValueCount; +    const  VkClearValue *     pClearValues; +} VkRenderPassBeginInfo; + +typedef struct VkClearAttachment { +    VkImageAspectFlags       aspectMask; +    uint32_t                 colorAttachment; +    VkClearValue             clearValue; +} VkClearAttachment; + +typedef struct VkAttachmentDescription { +    VkAttachmentDescriptionFlags   flags; +    VkFormat                 format; +    VkSampleCountFlagBits    samples; +    VkAttachmentLoadOp       loadOp; +    VkAttachmentStoreOp      storeOp; +    VkAttachmentLoadOp       stencilLoadOp; +    VkAttachmentStoreOp      stencilStoreOp; +    VkImageLayout            initialLayout; +    VkImageLayout            finalLayout; +} VkAttachmentDescription; + +typedef struct VkSubpassDescription { +    VkSubpassDescriptionFlags   flags; +    VkPipelineBindPoint      pipelineBindPoint; +    uint32_t                 inputAttachmentCount; +    const  VkAttachmentReference *  pInputAttachments; +    uint32_t                 colorAttachmentCount; +    const  VkAttachmentReference *  pColorAttachments; +    const  VkAttachmentReference *  pResolveAttachments; +    const  VkAttachmentReference *  pDepthStencilAttachment; +    uint32_t                 preserveAttachmentCount; +    const  uint32_t *  pPreserveAttachments; +} VkSubpassDescription; + +typedef struct VkSubpassDependency { +    uint32_t                 srcSubpass; +    uint32_t                 dstSubpass; +    VkPipelineStageFlags     srcStageMask; +    VkPipelineStageFlags     dstStageMask; +    VkAccessFlags            srcAccessMask; +    VkAccessFlags            dstAccessMask; +    VkDependencyFlags        dependencyFlags; +} VkSubpassDependency; + +typedef struct VkRenderPassCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkRenderPassCreateFlags   flags; +    uint32_t     attachmentCount; +    const  VkAttachmentDescription *  pAttachments; +    uint32_t                 subpassCount; +    const  VkSubpassDescription *  pSubpasses; +    uint32_t         dependencyCount; +    const  VkSubpassDependency *  pDependencies; +} VkRenderPassCreateInfo; + +typedef struct VkEventCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkEventCreateFlags       flags; +} VkEventCreateInfo; + +typedef struct VkFenceCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkFenceCreateFlags       flags; +} VkFenceCreateInfo; + +typedef struct VkPhysicalDeviceFeatures { +    VkBool32                 robustBufferAccess; +    VkBool32                 fullDrawIndexUint32; +    VkBool32                 imageCubeArray; +    VkBool32                 independentBlend; +    VkBool32                 geometryShader; +    VkBool32                 tessellationShader; +    VkBool32                 sampleRateShading; +    VkBool32                 dualSrcBlend; +    VkBool32                 logicOp; +    VkBool32                 multiDrawIndirect; +    VkBool32                 drawIndirectFirstInstance; +    VkBool32                 depthClamp; +    VkBool32                 depthBiasClamp; +    VkBool32                 fillModeNonSolid; +    VkBool32                 depthBounds; +    VkBool32                 wideLines; +    VkBool32                 largePoints; +    VkBool32                 alphaToOne; +    VkBool32                 multiViewport; +    VkBool32                 samplerAnisotropy; +    VkBool32                 textureCompressionETC2; +    VkBool32                 textureCompressionASTC_LDR; +    VkBool32                 textureCompressionBC; +    VkBool32                 occlusionQueryPrecise; +    VkBool32                 pipelineStatisticsQuery; +    VkBool32                 vertexPipelineStoresAndAtomics; +    VkBool32                 fragmentStoresAndAtomics; +    VkBool32                 shaderTessellationAndGeometryPointSize; +    VkBool32                 shaderImageGatherExtended; +    VkBool32                 shaderStorageImageExtendedFormats; +    VkBool32                 shaderStorageImageMultisample; +    VkBool32                 shaderStorageImageReadWithoutFormat; +    VkBool32                 shaderStorageImageWriteWithoutFormat; +    VkBool32                 shaderUniformBufferArrayDynamicIndexing; +    VkBool32                 shaderSampledImageArrayDynamicIndexing; +    VkBool32                 shaderStorageBufferArrayDynamicIndexing; +    VkBool32                 shaderStorageImageArrayDynamicIndexing; +    VkBool32                 shaderClipDistance; +    VkBool32                 shaderCullDistance; +    VkBool32                 shaderFloat64; +    VkBool32                 shaderInt64; +    VkBool32                 shaderInt16; +    VkBool32                 shaderResourceResidency; +    VkBool32                 shaderResourceMinLod; +    VkBool32                 sparseBinding; +    VkBool32                 sparseResidencyBuffer; +    VkBool32                 sparseResidencyImage2D; +    VkBool32                 sparseResidencyImage3D; +    VkBool32                 sparseResidency2Samples; +    VkBool32                 sparseResidency4Samples; +    VkBool32                 sparseResidency8Samples; +    VkBool32                 sparseResidency16Samples; +    VkBool32                 sparseResidencyAliased; +    VkBool32                 variableMultisampleRate; +    VkBool32                 inheritedQueries; +} VkPhysicalDeviceFeatures; + +typedef struct VkPhysicalDeviceSparseProperties { +    VkBool32             residencyStandard2DBlockShape; +    VkBool32             residencyStandard2DMultisampleBlockShape; +    VkBool32             residencyStandard3DBlockShape; +    VkBool32             residencyAlignedMipSize; +    VkBool32             residencyNonResidentStrict; +} VkPhysicalDeviceSparseProperties; + +typedef struct VkPhysicalDeviceLimits { +    uint32_t                 maxImageDimension1D; +    uint32_t                 maxImageDimension2D; +    uint32_t                 maxImageDimension3D; +    uint32_t                 maxImageDimensionCube; +    uint32_t                 maxImageArrayLayers; +    uint32_t                 maxTexelBufferElements; +    uint32_t                 maxUniformBufferRange; +    uint32_t                 maxStorageBufferRange; +    uint32_t                 maxPushConstantsSize; +    uint32_t                 maxMemoryAllocationCount; +    uint32_t                 maxSamplerAllocationCount; +    VkDeviceSize             bufferImageGranularity; +    VkDeviceSize             sparseAddressSpaceSize; +    uint32_t                 maxBoundDescriptorSets; +    uint32_t                 maxPerStageDescriptorSamplers; +    uint32_t                 maxPerStageDescriptorUniformBuffers; +    uint32_t                 maxPerStageDescriptorStorageBuffers; +    uint32_t                 maxPerStageDescriptorSampledImages; +    uint32_t                 maxPerStageDescriptorStorageImages; +    uint32_t                 maxPerStageDescriptorInputAttachments; +    uint32_t                 maxPerStageResources; +    uint32_t                 maxDescriptorSetSamplers; +    uint32_t                 maxDescriptorSetUniformBuffers; +    uint32_t                 maxDescriptorSetUniformBuffersDynamic; +    uint32_t                 maxDescriptorSetStorageBuffers; +    uint32_t                 maxDescriptorSetStorageBuffersDynamic; +    uint32_t                 maxDescriptorSetSampledImages; +    uint32_t                 maxDescriptorSetStorageImages; +    uint32_t                 maxDescriptorSetInputAttachments; +    uint32_t                 maxVertexInputAttributes; +    uint32_t                 maxVertexInputBindings; +    uint32_t                 maxVertexInputAttributeOffset; +    uint32_t                 maxVertexInputBindingStride; +    uint32_t                 maxVertexOutputComponents; +    uint32_t                 maxTessellationGenerationLevel; +    uint32_t                 maxTessellationPatchSize; +    uint32_t                 maxTessellationControlPerVertexInputComponents; +    uint32_t                 maxTessellationControlPerVertexOutputComponents; +    uint32_t                 maxTessellationControlPerPatchOutputComponents; +    uint32_t                 maxTessellationControlTotalOutputComponents; +    uint32_t                 maxTessellationEvaluationInputComponents; +    uint32_t                 maxTessellationEvaluationOutputComponents; +    uint32_t                 maxGeometryShaderInvocations; +    uint32_t                 maxGeometryInputComponents; +    uint32_t                 maxGeometryOutputComponents; +    uint32_t                 maxGeometryOutputVertices; +    uint32_t                 maxGeometryTotalOutputComponents; +    uint32_t                 maxFragmentInputComponents; +    uint32_t                 maxFragmentOutputAttachments; +    uint32_t                 maxFragmentDualSrcAttachments; +    uint32_t                 maxFragmentCombinedOutputResources; +    uint32_t                 maxComputeSharedMemorySize; +    uint32_t                 maxComputeWorkGroupCount [3]; +    uint32_t                 maxComputeWorkGroupInvocations; +    uint32_t                 maxComputeWorkGroupSize [3]; +    uint32_t                subPixelPrecisionBits; +    uint32_t                subTexelPrecisionBits; +    uint32_t                mipmapPrecisionBits; +    uint32_t                 maxDrawIndexedIndexValue; +    uint32_t                 maxDrawIndirectCount; +    float                    maxSamplerLodBias; +    float                    maxSamplerAnisotropy; +    uint32_t                 maxViewports; +    uint32_t                 maxViewportDimensions [2]; +    float                  viewportBoundsRange [2]; +    uint32_t                viewportSubPixelBits; +    size_t               minMemoryMapAlignment; +    VkDeviceSize         minTexelBufferOffsetAlignment; +    VkDeviceSize         minUniformBufferOffsetAlignment; +    VkDeviceSize         minStorageBufferOffsetAlignment; +    int32_t                  minTexelOffset; +    uint32_t                 maxTexelOffset; +    int32_t                  minTexelGatherOffset; +    uint32_t                 maxTexelGatherOffset; +    float                    minInterpolationOffset; +    float                    maxInterpolationOffset; +    uint32_t                subPixelInterpolationOffsetBits; +    uint32_t                 maxFramebufferWidth; +    uint32_t                 maxFramebufferHeight; +    uint32_t                 maxFramebufferLayers; +    VkSampleCountFlags       framebufferColorSampleCounts; +    VkSampleCountFlags       framebufferDepthSampleCounts; +    VkSampleCountFlags       framebufferStencilSampleCounts; +    VkSampleCountFlags       framebufferNoAttachmentsSampleCounts; +    uint32_t                 maxColorAttachments; +    VkSampleCountFlags       sampledImageColorSampleCounts; +    VkSampleCountFlags       sampledImageIntegerSampleCounts; +    VkSampleCountFlags       sampledImageDepthSampleCounts; +    VkSampleCountFlags       sampledImageStencilSampleCounts; +    VkSampleCountFlags       storageImageSampleCounts; +    uint32_t                 maxSampleMaskWords; +    VkBool32             timestampComputeAndGraphics; +    float                timestampPeriod; +    uint32_t                 maxClipDistances; +    uint32_t                 maxCullDistances; +    uint32_t                 maxCombinedClipAndCullDistances; +    uint32_t                 discreteQueuePriorities; +    float                  pointSizeRange [2]; +    float                  lineWidthRange [2]; +    float                pointSizeGranularity; +    float                lineWidthGranularity; +    VkBool32             strictLines; +    VkBool32             standardSampleLocations; +    VkDeviceSize         optimalBufferCopyOffsetAlignment; +    VkDeviceSize         optimalBufferCopyRowPitchAlignment; +    VkDeviceSize         nonCoherentAtomSize; +} VkPhysicalDeviceLimits; + +typedef struct VkSemaphoreCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkSemaphoreCreateFlags   flags; +} VkSemaphoreCreateInfo; + +typedef struct VkQueryPoolCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkQueryPoolCreateFlags   flags; +    VkQueryType              queryType; +    uint32_t                 queryCount; +    VkQueryPipelineStatisticFlags   pipelineStatistics; +} VkQueryPoolCreateInfo; + +typedef struct VkFramebufferCreateInfo { +    VkStructureType   sType; +    const  void *             pNext; +    VkFramebufferCreateFlags      flags; +    VkRenderPass                             renderPass; +    uint32_t                 attachmentCount; +    const  VkImageView *      pAttachments; +    uint32_t                 width; +    uint32_t                 height; +    uint32_t                 layers; +} VkFramebufferCreateInfo; + +typedef struct VkSubmitInfo { +    VkStructureType   sType; +    const  void *  pNext; +    uint32_t         waitSemaphoreCount; +    const  VkSemaphore *      pWaitSemaphores; +    const  VkPipelineStageFlags *            pWaitDstStageMask; +    uint32_t         commandBufferCount; +    const  VkCommandBuffer *      pCommandBuffers; +    uint32_t         signalSemaphoreCount; +    const  VkSemaphore *      pSignalSemaphores; +} VkSubmitInfo; + +typedef struct VkSurfaceCapabilitiesKHR { +    uint32_t                           minImageCount; +    uint32_t                           maxImageCount; +    VkExtent2D                         currentExtent; +    VkExtent2D                         minImageExtent; +    VkExtent2D                         maxImageExtent; +    uint32_t                           maxImageArrayLayers; +    VkSurfaceTransformFlagsKHR         supportedTransforms; +    VkSurfaceTransformFlagBitsKHR      currentTransform; +    VkCompositeAlphaFlagsKHR           supportedCompositeAlpha; +    VkImageUsageFlags                  supportedUsageFlags; +} VkSurfaceCapabilitiesKHR; + +#if defined(VK_USE_PLATFORM_WIN32_KHR) +typedef struct VkWin32SurfaceCreateInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkWin32SurfaceCreateFlagsKHR     flags; +    HINSTANCE                          hinstance; +    HWND                               hwnd; +} VkWin32SurfaceCreateInfoKHR; + +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) +typedef struct VkXlibSurfaceCreateInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkXlibSurfaceCreateFlagsKHR     flags; +    Display *                          dpy; +    Window                             window; +} VkXlibSurfaceCreateInfoKHR; + +#endif + +typedef struct VkSwapchainCreateInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkSwapchainCreateFlagsKHR          flags; +    VkSurfaceKHR                       surface; +    uint32_t                           minImageCount; +    VkFormat                           imageFormat; +    VkColorSpaceKHR                    imageColorSpace; +    VkExtent2D                         imageExtent; +    uint32_t                           imageArrayLayers; +    VkImageUsageFlags                  imageUsage; +    VkSharingMode                      imageSharingMode; +    uint32_t           queueFamilyIndexCount; +    const  uint32_t *                   pQueueFamilyIndices; +    VkSurfaceTransformFlagBitsKHR      preTransform; +    VkCompositeAlphaFlagBitsKHR        compositeAlpha; +    VkPresentModeKHR                   presentMode; +    VkBool32                           clipped; +    VkSwapchainKHR                           oldSwapchain; +} VkSwapchainCreateInfoKHR; + +typedef struct VkDeviceGroupPresentCapabilitiesKHR { +    VkStructureType   sType; +    void *             pNext; +    uint32_t                           presentMask [ VK_MAX_DEVICE_GROUP_SIZE ]; +    VkDeviceGroupPresentModeFlagsKHR   modes; +} VkDeviceGroupPresentCapabilitiesKHR; + +typedef struct VkDeviceGroupSwapchainCreateInfoKHR { +    VkStructureType   sType; +    const  void *                       pNext; +    VkDeviceGroupPresentModeFlagsKHR                           modes; +} VkDeviceGroupSwapchainCreateInfoKHR; + +typedef struct VkDebugUtilsMessengerCallbackDataEXT { +    VkStructureType   sType; +    const  void *                                                         pNext; +    VkDebugUtilsMessengerCallbackDataFlagsEXT                            flags; +    const  char *                                   pMessageIdName; +    int32_t                                                              messageIdNumber; +    const  char *                                                   pMessage; +    uint32_t                                                             queueLabelCount; +    const  VkDebugUtilsLabelEXT *                   pQueueLabels; +    uint32_t                                                             cmdBufLabelCount; +    const  VkDebugUtilsLabelEXT *                  pCmdBufLabels; +    uint32_t                                                             objectCount; +    const  VkDebugUtilsObjectNameInfoEXT *              pObjects; +} VkDebugUtilsMessengerCallbackDataEXT; + +typedef VkBool32 (VKAPI_PTR *PFN_vkDebugUtilsMessengerCallbackEXT)( +    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity, +    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes, +    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData, +    void*                                            pUserData); +typedef struct VkPhysicalDeviceProperties { +    uint32_t         apiVersion; +    uint32_t         driverVersion; +    uint32_t         vendorID; +    uint32_t         deviceID; +    VkPhysicalDeviceType   deviceType; +    char             deviceName [ VK_MAX_PHYSICAL_DEVICE_NAME_SIZE ]; +    uint8_t          pipelineCacheUUID [ VK_UUID_SIZE ]; +    VkPhysicalDeviceLimits   limits; +    VkPhysicalDeviceSparseProperties   sparseProperties; +} VkPhysicalDeviceProperties; + +typedef struct VkDeviceCreateInfo { +    VkStructureType   sType; +    const  void *      pNext; +    VkDeviceCreateFlags      flags; +    uint32_t          queueCreateInfoCount; +    const  VkDeviceQueueCreateInfo *  pQueueCreateInfos; +    uint32_t                 enabledLayerCount; +    const  char * const*       ppEnabledLayerNames; +    uint32_t                 enabledExtensionCount; +    const  char * const*       ppEnabledExtensionNames; +    const  VkPhysicalDeviceFeatures *  pEnabledFeatures; +} VkDeviceCreateInfo; + +typedef struct VkPhysicalDeviceMemoryProperties { +    uint32_t                 memoryTypeCount; +    VkMemoryType             memoryTypes [ VK_MAX_MEMORY_TYPES ]; +    uint32_t                 memoryHeapCount; +    VkMemoryHeap             memoryHeaps [ VK_MAX_MEMORY_HEAPS ]; +} VkPhysicalDeviceMemoryProperties; + +typedef struct VkDebugUtilsMessengerCreateInfoEXT { +    VkStructureType   sType; +    const  void *                                           pNext; +    VkDebugUtilsMessengerCreateFlagsEXT    flags; +    VkDebugUtilsMessageSeverityFlagsEXT                    messageSeverity; +    VkDebugUtilsMessageTypeFlagsEXT                        messageType; +    PFN_vkDebugUtilsMessengerCallbackEXT                   pfnUserCallback; +    void *                                 pUserData; +} VkDebugUtilsMessengerCreateInfoEXT; + + + +#define VK_VERSION_1_0 1 +GLAD_API_CALL int GLAD_VK_VERSION_1_0; +#define VK_EXT_debug_utils 1 +GLAD_API_CALL int GLAD_VK_EXT_debug_utils; +#define VK_KHR_surface 1 +GLAD_API_CALL int GLAD_VK_KHR_surface; +#define VK_KHR_swapchain 1 +GLAD_API_CALL int GLAD_VK_KHR_swapchain; +#if defined(VK_USE_PLATFORM_WIN32_KHR) +#define VK_KHR_win32_surface 1 +GLAD_API_CALL int GLAD_VK_KHR_win32_surface; + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +#define VK_KHR_xlib_surface 1 +GLAD_API_CALL int GLAD_VK_KHR_xlib_surface; + +#endif + + +typedef VkResult (GLAD_API_PTR *PFN_vkAcquireNextImage2KHR)(VkDevice device, const VkAcquireNextImageInfoKHR * pAcquireInfo, uint32_t * pImageIndex); +typedef VkResult (GLAD_API_PTR *PFN_vkAcquireNextImageKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t * pImageIndex); +typedef VkResult (GLAD_API_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo * pAllocateInfo, VkCommandBuffer * pCommandBuffers); +typedef VkResult (GLAD_API_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo * pAllocateInfo, VkDescriptorSet * pDescriptorSets); +typedef VkResult (GLAD_API_PTR *PFN_vkAllocateMemory)(VkDevice device, const VkMemoryAllocateInfo * pAllocateInfo, const VkAllocationCallbacks * pAllocator, VkDeviceMemory * pMemory); +typedef VkResult (GLAD_API_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo * pBeginInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset); +typedef VkResult (GLAD_API_PTR *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset); +typedef void (GLAD_API_PTR *PFN_vkCmdBeginDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT * pLabelInfo); +typedef void (GLAD_API_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags); +typedef void (GLAD_API_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo * pRenderPassBegin, VkSubpassContents contents); +typedef void (GLAD_API_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet * pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t * pDynamicOffsets); +typedef void (GLAD_API_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType); +typedef void (GLAD_API_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline); +typedef void (GLAD_API_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer * pBuffers, const VkDeviceSize * pOffsets); +typedef void (GLAD_API_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit * pRegions, VkFilter filter); +typedef void (GLAD_API_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment * pAttachments, uint32_t rectCount, const VkClearRect * pRects); +typedef void (GLAD_API_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue * pColor, uint32_t rangeCount, const VkImageSubresourceRange * pRanges); +typedef void (GLAD_API_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue * pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange * pRanges); +typedef void (GLAD_API_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy * pRegions); +typedef void (GLAD_API_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy * pRegions); +typedef void (GLAD_API_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy * pRegions); +typedef void (GLAD_API_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy * pRegions); +typedef void (GLAD_API_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags); +typedef void (GLAD_API_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef void (GLAD_API_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); +typedef void (GLAD_API_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance); +typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance); +typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +typedef void (GLAD_API_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +typedef void (GLAD_API_PTR *PFN_vkCmdEndDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer); +typedef void (GLAD_API_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query); +typedef void (GLAD_API_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer); +typedef void (GLAD_API_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer * pCommandBuffers); +typedef void (GLAD_API_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data); +typedef void (GLAD_API_PTR *PFN_vkCmdInsertDebugUtilsLabelEXT)(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT * pLabelInfo); +typedef void (GLAD_API_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents); +typedef void (GLAD_API_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier * pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier * pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier * pImageMemoryBarriers); +typedef void (GLAD_API_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void * pValues); +typedef void (GLAD_API_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (GLAD_API_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); +typedef void (GLAD_API_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve * pRegions); +typedef void (GLAD_API_PTR *PFN_vkCmdSetBlendConstants)(VkCommandBuffer commandBuffer, const float blendConstants [4]); +typedef void (GLAD_API_PTR *PFN_vkCmdSetDepthBias)(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor); +typedef void (GLAD_API_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds); +typedef void (GLAD_API_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (GLAD_API_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth); +typedef void (GLAD_API_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D * pScissors); +typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask); +typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference); +typedef void (GLAD_API_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask); +typedef void (GLAD_API_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport * pViewports); +typedef void (GLAD_API_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void * pData); +typedef void (GLAD_API_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent * pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier * pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier * pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier * pImageMemoryBarriers); +typedef void (GLAD_API_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkBuffer * pBuffer); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkBufferView * pView); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkCommandPool * pCommandPool); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo * pCreateInfos, const VkAllocationCallbacks * pAllocator, VkPipeline * pPipelines); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateDebugUtilsMessengerEXT)(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDebugUtilsMessengerEXT * pMessenger); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDescriptorPool * pDescriptorPool); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDescriptorSetLayout * pSetLayout); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkDevice * pDevice); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkEvent * pEvent); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkFence * pFence); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkFramebuffer * pFramebuffer); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo * pCreateInfos, const VkAllocationCallbacks * pAllocator, VkPipeline * pPipelines); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkImage * pImage); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkImageView * pView); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkInstance * pInstance); +typedef VkResult (GLAD_API_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkPipelineCache * pPipelineCache); +typedef VkResult (GLAD_API_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkPipelineLayout * pPipelineLayout); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkQueryPool * pQueryPool); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkRenderPass * pRenderPass); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSampler * pSampler); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSemaphore * pSemaphore); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkShaderModule * pShaderModule); +typedef VkResult (GLAD_API_PTR *PFN_vkCreateSwapchainKHR)(VkDevice device, const VkSwapchainCreateInfoKHR * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSwapchainKHR * pSwapchain); +#if defined(VK_USE_PLATFORM_WIN32_KHR) +typedef VkResult (GLAD_API_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSurfaceKHR * pSurface); + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +typedef VkResult (GLAD_API_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR * pCreateInfo, const VkAllocationCallbacks * pAllocator, VkSurfaceKHR * pSurface); + +#endif +typedef void (GLAD_API_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyDebugUtilsMessengerEXT)(VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyDevice)(VkDevice device, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyFence)(VkDevice device, VkFence fence, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroySurfaceKHR)(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkDestroySwapchainKHR)(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks * pAllocator); +typedef VkResult (GLAD_API_PTR *PFN_vkDeviceWaitIdle)(VkDevice device); +typedef VkResult (GLAD_API_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer); +typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char * pLayerName, uint32_t * pPropertyCount, VkExtensionProperties * pProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t * pPropertyCount, VkLayerProperties * pProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateInstanceExtensionProperties)(const char * pLayerName, uint32_t * pPropertyCount, VkExtensionProperties * pProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkEnumerateInstanceLayerProperties)(uint32_t * pPropertyCount, VkLayerProperties * pProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t * pPhysicalDeviceCount, VkPhysicalDevice * pPhysicalDevices); +typedef VkResult (GLAD_API_PTR *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges); +typedef void (GLAD_API_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer * pCommandBuffers); +typedef VkResult (GLAD_API_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet * pDescriptorSets); +typedef void (GLAD_API_PTR *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks * pAllocator); +typedef void (GLAD_API_PTR *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements * pMemoryRequirements); +typedef VkResult (GLAD_API_PTR *PFN_vkGetDeviceGroupPresentCapabilitiesKHR)(VkDevice device, VkDeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities); +typedef VkResult (GLAD_API_PTR *PFN_vkGetDeviceGroupSurfacePresentModesKHR)(VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR * pModes); +typedef void (GLAD_API_PTR *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize * pCommittedMemoryInBytes); +typedef PFN_vkVoidFunction (GLAD_API_PTR *PFN_vkGetDeviceProcAddr)(VkDevice device, const char * pName); +typedef void (GLAD_API_PTR *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue * pQueue); +typedef VkResult (GLAD_API_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event); +typedef VkResult (GLAD_API_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence); +typedef void (GLAD_API_PTR *PFN_vkGetImageMemoryRequirements)(VkDevice device, VkImage image, VkMemoryRequirements * pMemoryRequirements); +typedef void (GLAD_API_PTR *PFN_vkGetImageSparseMemoryRequirements)(VkDevice device, VkImage image, uint32_t * pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements * pSparseMemoryRequirements); +typedef void (GLAD_API_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource * pSubresource, VkSubresourceLayout * pLayout); +typedef PFN_vkVoidFunction (GLAD_API_PTR *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char * pName); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures * pFeatures); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties * pFormatProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties * pImageFormatProperties); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties * pMemoryProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pRectCount, VkRect2D * pRects); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties * pProperties); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t * pQueueFamilyPropertyCount, VkQueueFamilyProperties * pQueueFamilyProperties); +typedef void (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t * pPropertyCount, VkSparseImageFormatProperties * pProperties); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR * pSurfaceCapabilities); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pSurfaceFormatCount, VkSurfaceFormatKHR * pSurfaceFormats); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t * pPresentModeCount, VkPresentModeKHR * pPresentModes); +typedef VkResult (GLAD_API_PTR *PFN_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 * pSupported); +#if defined(VK_USE_PLATFORM_WIN32_KHR) +typedef VkBool32 (GLAD_API_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +typedef VkBool32 (GLAD_API_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display * dpy, VisualID visualID); + +#endif +typedef VkResult (GLAD_API_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t * pDataSize, void * pData); +typedef VkResult (GLAD_API_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void * pData, VkDeviceSize stride, VkQueryResultFlags flags); +typedef void (GLAD_API_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D * pGranularity); +typedef VkResult (GLAD_API_PTR *PFN_vkGetSwapchainImagesKHR)(VkDevice device, VkSwapchainKHR swapchain, uint32_t * pSwapchainImageCount, VkImage * pSwapchainImages); +typedef VkResult (GLAD_API_PTR *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange * pMemoryRanges); +typedef VkResult (GLAD_API_PTR *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void ** ppData); +typedef VkResult (GLAD_API_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache * pSrcCaches); +typedef void (GLAD_API_PTR *PFN_vkQueueBeginDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT * pLabelInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkQueueBindSparse)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo * pBindInfo, VkFence fence); +typedef void (GLAD_API_PTR *PFN_vkQueueEndDebugUtilsLabelEXT)(VkQueue queue); +typedef void (GLAD_API_PTR *PFN_vkQueueInsertDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT * pLabelInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkQueuePresentKHR)(VkQueue queue, const VkPresentInfoKHR * pPresentInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkQueueSubmit)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo * pSubmits, VkFence fence); +typedef VkResult (GLAD_API_PTR *PFN_vkQueueWaitIdle)(VkQueue queue); +typedef VkResult (GLAD_API_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags); +typedef VkResult (GLAD_API_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags); +typedef VkResult (GLAD_API_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags); +typedef VkResult (GLAD_API_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event); +typedef VkResult (GLAD_API_PTR *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence * pFences); +typedef VkResult (GLAD_API_PTR *PFN_vkSetDebugUtilsObjectNameEXT)(VkDevice device, const VkDebugUtilsObjectNameInfoEXT * pNameInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkSetDebugUtilsObjectTagEXT)(VkDevice device, const VkDebugUtilsObjectTagInfoEXT * pTagInfo); +typedef VkResult (GLAD_API_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event); +typedef void (GLAD_API_PTR *PFN_vkSubmitDebugUtilsMessageEXT)(VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT * pCallbackData); +typedef void (GLAD_API_PTR *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory memory); +typedef void (GLAD_API_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet * pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet * pDescriptorCopies); +typedef VkResult (GLAD_API_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence * pFences, VkBool32 waitAll, uint64_t timeout); + +GLAD_API_CALL PFN_vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR; +#define vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR +GLAD_API_CALL PFN_vkAcquireNextImageKHR glad_vkAcquireNextImageKHR; +#define vkAcquireNextImageKHR glad_vkAcquireNextImageKHR +GLAD_API_CALL PFN_vkAllocateCommandBuffers glad_vkAllocateCommandBuffers; +#define vkAllocateCommandBuffers glad_vkAllocateCommandBuffers +GLAD_API_CALL PFN_vkAllocateDescriptorSets glad_vkAllocateDescriptorSets; +#define vkAllocateDescriptorSets glad_vkAllocateDescriptorSets +GLAD_API_CALL PFN_vkAllocateMemory glad_vkAllocateMemory; +#define vkAllocateMemory glad_vkAllocateMemory +GLAD_API_CALL PFN_vkBeginCommandBuffer glad_vkBeginCommandBuffer; +#define vkBeginCommandBuffer glad_vkBeginCommandBuffer +GLAD_API_CALL PFN_vkBindBufferMemory glad_vkBindBufferMemory; +#define vkBindBufferMemory glad_vkBindBufferMemory +GLAD_API_CALL PFN_vkBindImageMemory glad_vkBindImageMemory; +#define vkBindImageMemory glad_vkBindImageMemory +GLAD_API_CALL PFN_vkCmdBeginDebugUtilsLabelEXT glad_vkCmdBeginDebugUtilsLabelEXT; +#define vkCmdBeginDebugUtilsLabelEXT glad_vkCmdBeginDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkCmdBeginQuery glad_vkCmdBeginQuery; +#define vkCmdBeginQuery glad_vkCmdBeginQuery +GLAD_API_CALL PFN_vkCmdBeginRenderPass glad_vkCmdBeginRenderPass; +#define vkCmdBeginRenderPass glad_vkCmdBeginRenderPass +GLAD_API_CALL PFN_vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets; +#define vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets +GLAD_API_CALL PFN_vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer; +#define vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer +GLAD_API_CALL PFN_vkCmdBindPipeline glad_vkCmdBindPipeline; +#define vkCmdBindPipeline glad_vkCmdBindPipeline +GLAD_API_CALL PFN_vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers; +#define vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers +GLAD_API_CALL PFN_vkCmdBlitImage glad_vkCmdBlitImage; +#define vkCmdBlitImage glad_vkCmdBlitImage +GLAD_API_CALL PFN_vkCmdClearAttachments glad_vkCmdClearAttachments; +#define vkCmdClearAttachments glad_vkCmdClearAttachments +GLAD_API_CALL PFN_vkCmdClearColorImage glad_vkCmdClearColorImage; +#define vkCmdClearColorImage glad_vkCmdClearColorImage +GLAD_API_CALL PFN_vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage; +#define vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage +GLAD_API_CALL PFN_vkCmdCopyBuffer glad_vkCmdCopyBuffer; +#define vkCmdCopyBuffer glad_vkCmdCopyBuffer +GLAD_API_CALL PFN_vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage; +#define vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage +GLAD_API_CALL PFN_vkCmdCopyImage glad_vkCmdCopyImage; +#define vkCmdCopyImage glad_vkCmdCopyImage +GLAD_API_CALL PFN_vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer; +#define vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer +GLAD_API_CALL PFN_vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults; +#define vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults +GLAD_API_CALL PFN_vkCmdDispatch glad_vkCmdDispatch; +#define vkCmdDispatch glad_vkCmdDispatch +GLAD_API_CALL PFN_vkCmdDispatchIndirect glad_vkCmdDispatchIndirect; +#define vkCmdDispatchIndirect glad_vkCmdDispatchIndirect +GLAD_API_CALL PFN_vkCmdDraw glad_vkCmdDraw; +#define vkCmdDraw glad_vkCmdDraw +GLAD_API_CALL PFN_vkCmdDrawIndexed glad_vkCmdDrawIndexed; +#define vkCmdDrawIndexed glad_vkCmdDrawIndexed +GLAD_API_CALL PFN_vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect; +#define vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect +GLAD_API_CALL PFN_vkCmdDrawIndirect glad_vkCmdDrawIndirect; +#define vkCmdDrawIndirect glad_vkCmdDrawIndirect +GLAD_API_CALL PFN_vkCmdEndDebugUtilsLabelEXT glad_vkCmdEndDebugUtilsLabelEXT; +#define vkCmdEndDebugUtilsLabelEXT glad_vkCmdEndDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkCmdEndQuery glad_vkCmdEndQuery; +#define vkCmdEndQuery glad_vkCmdEndQuery +GLAD_API_CALL PFN_vkCmdEndRenderPass glad_vkCmdEndRenderPass; +#define vkCmdEndRenderPass glad_vkCmdEndRenderPass +GLAD_API_CALL PFN_vkCmdExecuteCommands glad_vkCmdExecuteCommands; +#define vkCmdExecuteCommands glad_vkCmdExecuteCommands +GLAD_API_CALL PFN_vkCmdFillBuffer glad_vkCmdFillBuffer; +#define vkCmdFillBuffer glad_vkCmdFillBuffer +GLAD_API_CALL PFN_vkCmdInsertDebugUtilsLabelEXT glad_vkCmdInsertDebugUtilsLabelEXT; +#define vkCmdInsertDebugUtilsLabelEXT glad_vkCmdInsertDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkCmdNextSubpass glad_vkCmdNextSubpass; +#define vkCmdNextSubpass glad_vkCmdNextSubpass +GLAD_API_CALL PFN_vkCmdPipelineBarrier glad_vkCmdPipelineBarrier; +#define vkCmdPipelineBarrier glad_vkCmdPipelineBarrier +GLAD_API_CALL PFN_vkCmdPushConstants glad_vkCmdPushConstants; +#define vkCmdPushConstants glad_vkCmdPushConstants +GLAD_API_CALL PFN_vkCmdResetEvent glad_vkCmdResetEvent; +#define vkCmdResetEvent glad_vkCmdResetEvent +GLAD_API_CALL PFN_vkCmdResetQueryPool glad_vkCmdResetQueryPool; +#define vkCmdResetQueryPool glad_vkCmdResetQueryPool +GLAD_API_CALL PFN_vkCmdResolveImage glad_vkCmdResolveImage; +#define vkCmdResolveImage glad_vkCmdResolveImage +GLAD_API_CALL PFN_vkCmdSetBlendConstants glad_vkCmdSetBlendConstants; +#define vkCmdSetBlendConstants glad_vkCmdSetBlendConstants +GLAD_API_CALL PFN_vkCmdSetDepthBias glad_vkCmdSetDepthBias; +#define vkCmdSetDepthBias glad_vkCmdSetDepthBias +GLAD_API_CALL PFN_vkCmdSetDepthBounds glad_vkCmdSetDepthBounds; +#define vkCmdSetDepthBounds glad_vkCmdSetDepthBounds +GLAD_API_CALL PFN_vkCmdSetEvent glad_vkCmdSetEvent; +#define vkCmdSetEvent glad_vkCmdSetEvent +GLAD_API_CALL PFN_vkCmdSetLineWidth glad_vkCmdSetLineWidth; +#define vkCmdSetLineWidth glad_vkCmdSetLineWidth +GLAD_API_CALL PFN_vkCmdSetScissor glad_vkCmdSetScissor; +#define vkCmdSetScissor glad_vkCmdSetScissor +GLAD_API_CALL PFN_vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask; +#define vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask +GLAD_API_CALL PFN_vkCmdSetStencilReference glad_vkCmdSetStencilReference; +#define vkCmdSetStencilReference glad_vkCmdSetStencilReference +GLAD_API_CALL PFN_vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask; +#define vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask +GLAD_API_CALL PFN_vkCmdSetViewport glad_vkCmdSetViewport; +#define vkCmdSetViewport glad_vkCmdSetViewport +GLAD_API_CALL PFN_vkCmdUpdateBuffer glad_vkCmdUpdateBuffer; +#define vkCmdUpdateBuffer glad_vkCmdUpdateBuffer +GLAD_API_CALL PFN_vkCmdWaitEvents glad_vkCmdWaitEvents; +#define vkCmdWaitEvents glad_vkCmdWaitEvents +GLAD_API_CALL PFN_vkCmdWriteTimestamp glad_vkCmdWriteTimestamp; +#define vkCmdWriteTimestamp glad_vkCmdWriteTimestamp +GLAD_API_CALL PFN_vkCreateBuffer glad_vkCreateBuffer; +#define vkCreateBuffer glad_vkCreateBuffer +GLAD_API_CALL PFN_vkCreateBufferView glad_vkCreateBufferView; +#define vkCreateBufferView glad_vkCreateBufferView +GLAD_API_CALL PFN_vkCreateCommandPool glad_vkCreateCommandPool; +#define vkCreateCommandPool glad_vkCreateCommandPool +GLAD_API_CALL PFN_vkCreateComputePipelines glad_vkCreateComputePipelines; +#define vkCreateComputePipelines glad_vkCreateComputePipelines +GLAD_API_CALL PFN_vkCreateDebugUtilsMessengerEXT glad_vkCreateDebugUtilsMessengerEXT; +#define vkCreateDebugUtilsMessengerEXT glad_vkCreateDebugUtilsMessengerEXT +GLAD_API_CALL PFN_vkCreateDescriptorPool glad_vkCreateDescriptorPool; +#define vkCreateDescriptorPool glad_vkCreateDescriptorPool +GLAD_API_CALL PFN_vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout; +#define vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout +GLAD_API_CALL PFN_vkCreateDevice glad_vkCreateDevice; +#define vkCreateDevice glad_vkCreateDevice +GLAD_API_CALL PFN_vkCreateEvent glad_vkCreateEvent; +#define vkCreateEvent glad_vkCreateEvent +GLAD_API_CALL PFN_vkCreateFence glad_vkCreateFence; +#define vkCreateFence glad_vkCreateFence +GLAD_API_CALL PFN_vkCreateFramebuffer glad_vkCreateFramebuffer; +#define vkCreateFramebuffer glad_vkCreateFramebuffer +GLAD_API_CALL PFN_vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines; +#define vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines +GLAD_API_CALL PFN_vkCreateImage glad_vkCreateImage; +#define vkCreateImage glad_vkCreateImage +GLAD_API_CALL PFN_vkCreateImageView glad_vkCreateImageView; +#define vkCreateImageView glad_vkCreateImageView +GLAD_API_CALL PFN_vkCreateInstance glad_vkCreateInstance; +#define vkCreateInstance glad_vkCreateInstance +GLAD_API_CALL PFN_vkCreatePipelineCache glad_vkCreatePipelineCache; +#define vkCreatePipelineCache glad_vkCreatePipelineCache +GLAD_API_CALL PFN_vkCreatePipelineLayout glad_vkCreatePipelineLayout; +#define vkCreatePipelineLayout glad_vkCreatePipelineLayout +GLAD_API_CALL PFN_vkCreateQueryPool glad_vkCreateQueryPool; +#define vkCreateQueryPool glad_vkCreateQueryPool +GLAD_API_CALL PFN_vkCreateRenderPass glad_vkCreateRenderPass; +#define vkCreateRenderPass glad_vkCreateRenderPass +GLAD_API_CALL PFN_vkCreateSampler glad_vkCreateSampler; +#define vkCreateSampler glad_vkCreateSampler +GLAD_API_CALL PFN_vkCreateSemaphore glad_vkCreateSemaphore; +#define vkCreateSemaphore glad_vkCreateSemaphore +GLAD_API_CALL PFN_vkCreateShaderModule glad_vkCreateShaderModule; +#define vkCreateShaderModule glad_vkCreateShaderModule +GLAD_API_CALL PFN_vkCreateSwapchainKHR glad_vkCreateSwapchainKHR; +#define vkCreateSwapchainKHR glad_vkCreateSwapchainKHR +#if defined(VK_USE_PLATFORM_WIN32_KHR) +GLAD_API_CALL PFN_vkCreateWin32SurfaceKHR glad_vkCreateWin32SurfaceKHR; +#define vkCreateWin32SurfaceKHR glad_vkCreateWin32SurfaceKHR + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +GLAD_API_CALL PFN_vkCreateXlibSurfaceKHR glad_vkCreateXlibSurfaceKHR; +#define vkCreateXlibSurfaceKHR glad_vkCreateXlibSurfaceKHR + +#endif +GLAD_API_CALL PFN_vkDestroyBuffer glad_vkDestroyBuffer; +#define vkDestroyBuffer glad_vkDestroyBuffer +GLAD_API_CALL PFN_vkDestroyBufferView glad_vkDestroyBufferView; +#define vkDestroyBufferView glad_vkDestroyBufferView +GLAD_API_CALL PFN_vkDestroyCommandPool glad_vkDestroyCommandPool; +#define vkDestroyCommandPool glad_vkDestroyCommandPool +GLAD_API_CALL PFN_vkDestroyDebugUtilsMessengerEXT glad_vkDestroyDebugUtilsMessengerEXT; +#define vkDestroyDebugUtilsMessengerEXT glad_vkDestroyDebugUtilsMessengerEXT +GLAD_API_CALL PFN_vkDestroyDescriptorPool glad_vkDestroyDescriptorPool; +#define vkDestroyDescriptorPool glad_vkDestroyDescriptorPool +GLAD_API_CALL PFN_vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout; +#define vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout +GLAD_API_CALL PFN_vkDestroyDevice glad_vkDestroyDevice; +#define vkDestroyDevice glad_vkDestroyDevice +GLAD_API_CALL PFN_vkDestroyEvent glad_vkDestroyEvent; +#define vkDestroyEvent glad_vkDestroyEvent +GLAD_API_CALL PFN_vkDestroyFence glad_vkDestroyFence; +#define vkDestroyFence glad_vkDestroyFence +GLAD_API_CALL PFN_vkDestroyFramebuffer glad_vkDestroyFramebuffer; +#define vkDestroyFramebuffer glad_vkDestroyFramebuffer +GLAD_API_CALL PFN_vkDestroyImage glad_vkDestroyImage; +#define vkDestroyImage glad_vkDestroyImage +GLAD_API_CALL PFN_vkDestroyImageView glad_vkDestroyImageView; +#define vkDestroyImageView glad_vkDestroyImageView +GLAD_API_CALL PFN_vkDestroyInstance glad_vkDestroyInstance; +#define vkDestroyInstance glad_vkDestroyInstance +GLAD_API_CALL PFN_vkDestroyPipeline glad_vkDestroyPipeline; +#define vkDestroyPipeline glad_vkDestroyPipeline +GLAD_API_CALL PFN_vkDestroyPipelineCache glad_vkDestroyPipelineCache; +#define vkDestroyPipelineCache glad_vkDestroyPipelineCache +GLAD_API_CALL PFN_vkDestroyPipelineLayout glad_vkDestroyPipelineLayout; +#define vkDestroyPipelineLayout glad_vkDestroyPipelineLayout +GLAD_API_CALL PFN_vkDestroyQueryPool glad_vkDestroyQueryPool; +#define vkDestroyQueryPool glad_vkDestroyQueryPool +GLAD_API_CALL PFN_vkDestroyRenderPass glad_vkDestroyRenderPass; +#define vkDestroyRenderPass glad_vkDestroyRenderPass +GLAD_API_CALL PFN_vkDestroySampler glad_vkDestroySampler; +#define vkDestroySampler glad_vkDestroySampler +GLAD_API_CALL PFN_vkDestroySemaphore glad_vkDestroySemaphore; +#define vkDestroySemaphore glad_vkDestroySemaphore +GLAD_API_CALL PFN_vkDestroyShaderModule glad_vkDestroyShaderModule; +#define vkDestroyShaderModule glad_vkDestroyShaderModule +GLAD_API_CALL PFN_vkDestroySurfaceKHR glad_vkDestroySurfaceKHR; +#define vkDestroySurfaceKHR glad_vkDestroySurfaceKHR +GLAD_API_CALL PFN_vkDestroySwapchainKHR glad_vkDestroySwapchainKHR; +#define vkDestroySwapchainKHR glad_vkDestroySwapchainKHR +GLAD_API_CALL PFN_vkDeviceWaitIdle glad_vkDeviceWaitIdle; +#define vkDeviceWaitIdle glad_vkDeviceWaitIdle +GLAD_API_CALL PFN_vkEndCommandBuffer glad_vkEndCommandBuffer; +#define vkEndCommandBuffer glad_vkEndCommandBuffer +GLAD_API_CALL PFN_vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties; +#define vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties +GLAD_API_CALL PFN_vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties; +#define vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties +GLAD_API_CALL PFN_vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties; +#define vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties +GLAD_API_CALL PFN_vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties; +#define vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties +GLAD_API_CALL PFN_vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices; +#define vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices +GLAD_API_CALL PFN_vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges; +#define vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges +GLAD_API_CALL PFN_vkFreeCommandBuffers glad_vkFreeCommandBuffers; +#define vkFreeCommandBuffers glad_vkFreeCommandBuffers +GLAD_API_CALL PFN_vkFreeDescriptorSets glad_vkFreeDescriptorSets; +#define vkFreeDescriptorSets glad_vkFreeDescriptorSets +GLAD_API_CALL PFN_vkFreeMemory glad_vkFreeMemory; +#define vkFreeMemory glad_vkFreeMemory +GLAD_API_CALL PFN_vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements; +#define vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements +GLAD_API_CALL PFN_vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR; +#define vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR +GLAD_API_CALL PFN_vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR; +#define vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR +GLAD_API_CALL PFN_vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment; +#define vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment +GLAD_API_CALL PFN_vkGetDeviceProcAddr glad_vkGetDeviceProcAddr; +#define vkGetDeviceProcAddr glad_vkGetDeviceProcAddr +GLAD_API_CALL PFN_vkGetDeviceQueue glad_vkGetDeviceQueue; +#define vkGetDeviceQueue glad_vkGetDeviceQueue +GLAD_API_CALL PFN_vkGetEventStatus glad_vkGetEventStatus; +#define vkGetEventStatus glad_vkGetEventStatus +GLAD_API_CALL PFN_vkGetFenceStatus glad_vkGetFenceStatus; +#define vkGetFenceStatus glad_vkGetFenceStatus +GLAD_API_CALL PFN_vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements; +#define vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements +GLAD_API_CALL PFN_vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements; +#define vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements +GLAD_API_CALL PFN_vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout; +#define vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout +GLAD_API_CALL PFN_vkGetInstanceProcAddr glad_vkGetInstanceProcAddr; +#define vkGetInstanceProcAddr glad_vkGetInstanceProcAddr +GLAD_API_CALL PFN_vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures; +#define vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures +GLAD_API_CALL PFN_vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties; +#define vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties +GLAD_API_CALL PFN_vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties; +#define vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties +GLAD_API_CALL PFN_vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties; +#define vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties +GLAD_API_CALL PFN_vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR; +#define vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR +GLAD_API_CALL PFN_vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties; +#define vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties +GLAD_API_CALL PFN_vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties; +#define vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties +GLAD_API_CALL PFN_vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties; +#define vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties +GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +#define vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR +GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR; +#define vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR +GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR; +#define vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR +GLAD_API_CALL PFN_vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR; +#define vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR +#if defined(VK_USE_PLATFORM_WIN32_KHR) +GLAD_API_CALL PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR glad_vkGetPhysicalDeviceWin32PresentationSupportKHR; +#define vkGetPhysicalDeviceWin32PresentationSupportKHR glad_vkGetPhysicalDeviceWin32PresentationSupportKHR + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +GLAD_API_CALL PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR glad_vkGetPhysicalDeviceXlibPresentationSupportKHR; +#define vkGetPhysicalDeviceXlibPresentationSupportKHR glad_vkGetPhysicalDeviceXlibPresentationSupportKHR + +#endif +GLAD_API_CALL PFN_vkGetPipelineCacheData glad_vkGetPipelineCacheData; +#define vkGetPipelineCacheData glad_vkGetPipelineCacheData +GLAD_API_CALL PFN_vkGetQueryPoolResults glad_vkGetQueryPoolResults; +#define vkGetQueryPoolResults glad_vkGetQueryPoolResults +GLAD_API_CALL PFN_vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity; +#define vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity +GLAD_API_CALL PFN_vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR; +#define vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR +GLAD_API_CALL PFN_vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges; +#define vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges +GLAD_API_CALL PFN_vkMapMemory glad_vkMapMemory; +#define vkMapMemory glad_vkMapMemory +GLAD_API_CALL PFN_vkMergePipelineCaches glad_vkMergePipelineCaches; +#define vkMergePipelineCaches glad_vkMergePipelineCaches +GLAD_API_CALL PFN_vkQueueBeginDebugUtilsLabelEXT glad_vkQueueBeginDebugUtilsLabelEXT; +#define vkQueueBeginDebugUtilsLabelEXT glad_vkQueueBeginDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkQueueBindSparse glad_vkQueueBindSparse; +#define vkQueueBindSparse glad_vkQueueBindSparse +GLAD_API_CALL PFN_vkQueueEndDebugUtilsLabelEXT glad_vkQueueEndDebugUtilsLabelEXT; +#define vkQueueEndDebugUtilsLabelEXT glad_vkQueueEndDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkQueueInsertDebugUtilsLabelEXT glad_vkQueueInsertDebugUtilsLabelEXT; +#define vkQueueInsertDebugUtilsLabelEXT glad_vkQueueInsertDebugUtilsLabelEXT +GLAD_API_CALL PFN_vkQueuePresentKHR glad_vkQueuePresentKHR; +#define vkQueuePresentKHR glad_vkQueuePresentKHR +GLAD_API_CALL PFN_vkQueueSubmit glad_vkQueueSubmit; +#define vkQueueSubmit glad_vkQueueSubmit +GLAD_API_CALL PFN_vkQueueWaitIdle glad_vkQueueWaitIdle; +#define vkQueueWaitIdle glad_vkQueueWaitIdle +GLAD_API_CALL PFN_vkResetCommandBuffer glad_vkResetCommandBuffer; +#define vkResetCommandBuffer glad_vkResetCommandBuffer +GLAD_API_CALL PFN_vkResetCommandPool glad_vkResetCommandPool; +#define vkResetCommandPool glad_vkResetCommandPool +GLAD_API_CALL PFN_vkResetDescriptorPool glad_vkResetDescriptorPool; +#define vkResetDescriptorPool glad_vkResetDescriptorPool +GLAD_API_CALL PFN_vkResetEvent glad_vkResetEvent; +#define vkResetEvent glad_vkResetEvent +GLAD_API_CALL PFN_vkResetFences glad_vkResetFences; +#define vkResetFences glad_vkResetFences +GLAD_API_CALL PFN_vkSetDebugUtilsObjectNameEXT glad_vkSetDebugUtilsObjectNameEXT; +#define vkSetDebugUtilsObjectNameEXT glad_vkSetDebugUtilsObjectNameEXT +GLAD_API_CALL PFN_vkSetDebugUtilsObjectTagEXT glad_vkSetDebugUtilsObjectTagEXT; +#define vkSetDebugUtilsObjectTagEXT glad_vkSetDebugUtilsObjectTagEXT +GLAD_API_CALL PFN_vkSetEvent glad_vkSetEvent; +#define vkSetEvent glad_vkSetEvent +GLAD_API_CALL PFN_vkSubmitDebugUtilsMessageEXT glad_vkSubmitDebugUtilsMessageEXT; +#define vkSubmitDebugUtilsMessageEXT glad_vkSubmitDebugUtilsMessageEXT +GLAD_API_CALL PFN_vkUnmapMemory glad_vkUnmapMemory; +#define vkUnmapMemory glad_vkUnmapMemory +GLAD_API_CALL PFN_vkUpdateDescriptorSets glad_vkUpdateDescriptorSets; +#define vkUpdateDescriptorSets glad_vkUpdateDescriptorSets +GLAD_API_CALL PFN_vkWaitForFences glad_vkWaitForFences; +#define vkWaitForFences glad_vkWaitForFences + + + + + +GLAD_API_CALL int gladLoadVulkanUserPtr( VkPhysicalDevice physical_device, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadVulkan( VkPhysicalDevice physical_device, GLADloadfunc load); + + +#ifdef GLAD_VULKAN + +GLAD_API_CALL int gladLoaderLoadVulkan( VkInstance instance, VkPhysicalDevice physical_device, VkDevice device); +GLAD_API_CALL void gladLoaderUnloadVulkan(void); + + + +#endif + +#ifdef __cplusplus +} +#endif +#endif + +/* Source */ +#ifdef GLAD_VULKAN_IMPLEMENTATION +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_VK_VERSION_1_0 = 0; +int GLAD_VK_EXT_debug_utils = 0; +int GLAD_VK_KHR_surface = 0; +int GLAD_VK_KHR_swapchain = 0; +#if defined(VK_USE_PLATFORM_WIN32_KHR) +int GLAD_VK_KHR_win32_surface = 0; + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +int GLAD_VK_KHR_xlib_surface = 0; + +#endif + + + +PFN_vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR = NULL; +PFN_vkAcquireNextImageKHR glad_vkAcquireNextImageKHR = NULL; +PFN_vkAllocateCommandBuffers glad_vkAllocateCommandBuffers = NULL; +PFN_vkAllocateDescriptorSets glad_vkAllocateDescriptorSets = NULL; +PFN_vkAllocateMemory glad_vkAllocateMemory = NULL; +PFN_vkBeginCommandBuffer glad_vkBeginCommandBuffer = NULL; +PFN_vkBindBufferMemory glad_vkBindBufferMemory = NULL; +PFN_vkBindImageMemory glad_vkBindImageMemory = NULL; +PFN_vkCmdBeginDebugUtilsLabelEXT glad_vkCmdBeginDebugUtilsLabelEXT = NULL; +PFN_vkCmdBeginQuery glad_vkCmdBeginQuery = NULL; +PFN_vkCmdBeginRenderPass glad_vkCmdBeginRenderPass = NULL; +PFN_vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets = NULL; +PFN_vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer = NULL; +PFN_vkCmdBindPipeline glad_vkCmdBindPipeline = NULL; +PFN_vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers = NULL; +PFN_vkCmdBlitImage glad_vkCmdBlitImage = NULL; +PFN_vkCmdClearAttachments glad_vkCmdClearAttachments = NULL; +PFN_vkCmdClearColorImage glad_vkCmdClearColorImage = NULL; +PFN_vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage = NULL; +PFN_vkCmdCopyBuffer glad_vkCmdCopyBuffer = NULL; +PFN_vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage = NULL; +PFN_vkCmdCopyImage glad_vkCmdCopyImage = NULL; +PFN_vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer = NULL; +PFN_vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults = NULL; +PFN_vkCmdDispatch glad_vkCmdDispatch = NULL; +PFN_vkCmdDispatchIndirect glad_vkCmdDispatchIndirect = NULL; +PFN_vkCmdDraw glad_vkCmdDraw = NULL; +PFN_vkCmdDrawIndexed glad_vkCmdDrawIndexed = NULL; +PFN_vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect = NULL; +PFN_vkCmdDrawIndirect glad_vkCmdDrawIndirect = NULL; +PFN_vkCmdEndDebugUtilsLabelEXT glad_vkCmdEndDebugUtilsLabelEXT = NULL; +PFN_vkCmdEndQuery glad_vkCmdEndQuery = NULL; +PFN_vkCmdEndRenderPass glad_vkCmdEndRenderPass = NULL; +PFN_vkCmdExecuteCommands glad_vkCmdExecuteCommands = NULL; +PFN_vkCmdFillBuffer glad_vkCmdFillBuffer = NULL; +PFN_vkCmdInsertDebugUtilsLabelEXT glad_vkCmdInsertDebugUtilsLabelEXT = NULL; +PFN_vkCmdNextSubpass glad_vkCmdNextSubpass = NULL; +PFN_vkCmdPipelineBarrier glad_vkCmdPipelineBarrier = NULL; +PFN_vkCmdPushConstants glad_vkCmdPushConstants = NULL; +PFN_vkCmdResetEvent glad_vkCmdResetEvent = NULL; +PFN_vkCmdResetQueryPool glad_vkCmdResetQueryPool = NULL; +PFN_vkCmdResolveImage glad_vkCmdResolveImage = NULL; +PFN_vkCmdSetBlendConstants glad_vkCmdSetBlendConstants = NULL; +PFN_vkCmdSetDepthBias glad_vkCmdSetDepthBias = NULL; +PFN_vkCmdSetDepthBounds glad_vkCmdSetDepthBounds = NULL; +PFN_vkCmdSetEvent glad_vkCmdSetEvent = NULL; +PFN_vkCmdSetLineWidth glad_vkCmdSetLineWidth = NULL; +PFN_vkCmdSetScissor glad_vkCmdSetScissor = NULL; +PFN_vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask = NULL; +PFN_vkCmdSetStencilReference glad_vkCmdSetStencilReference = NULL; +PFN_vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask = NULL; +PFN_vkCmdSetViewport glad_vkCmdSetViewport = NULL; +PFN_vkCmdUpdateBuffer glad_vkCmdUpdateBuffer = NULL; +PFN_vkCmdWaitEvents glad_vkCmdWaitEvents = NULL; +PFN_vkCmdWriteTimestamp glad_vkCmdWriteTimestamp = NULL; +PFN_vkCreateBuffer glad_vkCreateBuffer = NULL; +PFN_vkCreateBufferView glad_vkCreateBufferView = NULL; +PFN_vkCreateCommandPool glad_vkCreateCommandPool = NULL; +PFN_vkCreateComputePipelines glad_vkCreateComputePipelines = NULL; +PFN_vkCreateDebugUtilsMessengerEXT glad_vkCreateDebugUtilsMessengerEXT = NULL; +PFN_vkCreateDescriptorPool glad_vkCreateDescriptorPool = NULL; +PFN_vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout = NULL; +PFN_vkCreateDevice glad_vkCreateDevice = NULL; +PFN_vkCreateEvent glad_vkCreateEvent = NULL; +PFN_vkCreateFence glad_vkCreateFence = NULL; +PFN_vkCreateFramebuffer glad_vkCreateFramebuffer = NULL; +PFN_vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines = NULL; +PFN_vkCreateImage glad_vkCreateImage = NULL; +PFN_vkCreateImageView glad_vkCreateImageView = NULL; +PFN_vkCreateInstance glad_vkCreateInstance = NULL; +PFN_vkCreatePipelineCache glad_vkCreatePipelineCache = NULL; +PFN_vkCreatePipelineLayout glad_vkCreatePipelineLayout = NULL; +PFN_vkCreateQueryPool glad_vkCreateQueryPool = NULL; +PFN_vkCreateRenderPass glad_vkCreateRenderPass = NULL; +PFN_vkCreateSampler glad_vkCreateSampler = NULL; +PFN_vkCreateSemaphore glad_vkCreateSemaphore = NULL; +PFN_vkCreateShaderModule glad_vkCreateShaderModule = NULL; +PFN_vkCreateSwapchainKHR glad_vkCreateSwapchainKHR = NULL; +#if defined(VK_USE_PLATFORM_WIN32_KHR) +PFN_vkCreateWin32SurfaceKHR glad_vkCreateWin32SurfaceKHR = NULL; + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +PFN_vkCreateXlibSurfaceKHR glad_vkCreateXlibSurfaceKHR = NULL; + +#endif +PFN_vkDestroyBuffer glad_vkDestroyBuffer = NULL; +PFN_vkDestroyBufferView glad_vkDestroyBufferView = NULL; +PFN_vkDestroyCommandPool glad_vkDestroyCommandPool = NULL; +PFN_vkDestroyDebugUtilsMessengerEXT glad_vkDestroyDebugUtilsMessengerEXT = NULL; +PFN_vkDestroyDescriptorPool glad_vkDestroyDescriptorPool = NULL; +PFN_vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout = NULL; +PFN_vkDestroyDevice glad_vkDestroyDevice = NULL; +PFN_vkDestroyEvent glad_vkDestroyEvent = NULL; +PFN_vkDestroyFence glad_vkDestroyFence = NULL; +PFN_vkDestroyFramebuffer glad_vkDestroyFramebuffer = NULL; +PFN_vkDestroyImage glad_vkDestroyImage = NULL; +PFN_vkDestroyImageView glad_vkDestroyImageView = NULL; +PFN_vkDestroyInstance glad_vkDestroyInstance = NULL; +PFN_vkDestroyPipeline glad_vkDestroyPipeline = NULL; +PFN_vkDestroyPipelineCache glad_vkDestroyPipelineCache = NULL; +PFN_vkDestroyPipelineLayout glad_vkDestroyPipelineLayout = NULL; +PFN_vkDestroyQueryPool glad_vkDestroyQueryPool = NULL; +PFN_vkDestroyRenderPass glad_vkDestroyRenderPass = NULL; +PFN_vkDestroySampler glad_vkDestroySampler = NULL; +PFN_vkDestroySemaphore glad_vkDestroySemaphore = NULL; +PFN_vkDestroyShaderModule glad_vkDestroyShaderModule = NULL; +PFN_vkDestroySurfaceKHR glad_vkDestroySurfaceKHR = NULL; +PFN_vkDestroySwapchainKHR glad_vkDestroySwapchainKHR = NULL; +PFN_vkDeviceWaitIdle glad_vkDeviceWaitIdle = NULL; +PFN_vkEndCommandBuffer glad_vkEndCommandBuffer = NULL; +PFN_vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties = NULL; +PFN_vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties = NULL; +PFN_vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties = NULL; +PFN_vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties = NULL; +PFN_vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices = NULL; +PFN_vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges = NULL; +PFN_vkFreeCommandBuffers glad_vkFreeCommandBuffers = NULL; +PFN_vkFreeDescriptorSets glad_vkFreeDescriptorSets = NULL; +PFN_vkFreeMemory glad_vkFreeMemory = NULL; +PFN_vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements = NULL; +PFN_vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR = NULL; +PFN_vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR = NULL; +PFN_vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment = NULL; +PFN_vkGetDeviceProcAddr glad_vkGetDeviceProcAddr = NULL; +PFN_vkGetDeviceQueue glad_vkGetDeviceQueue = NULL; +PFN_vkGetEventStatus glad_vkGetEventStatus = NULL; +PFN_vkGetFenceStatus glad_vkGetFenceStatus = NULL; +PFN_vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements = NULL; +PFN_vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements = NULL; +PFN_vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout = NULL; +PFN_vkGetInstanceProcAddr glad_vkGetInstanceProcAddr = NULL; +PFN_vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures = NULL; +PFN_vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties = NULL; +PFN_vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties = NULL; +PFN_vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties = NULL; +PFN_vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR = NULL; +PFN_vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties = NULL; +PFN_vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties = NULL; +PFN_vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties = NULL; +PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = NULL; +PFN_vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR = NULL; +PFN_vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR = NULL; +PFN_vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR = NULL; +#if defined(VK_USE_PLATFORM_WIN32_KHR) +PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR glad_vkGetPhysicalDeviceWin32PresentationSupportKHR = NULL; + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR glad_vkGetPhysicalDeviceXlibPresentationSupportKHR = NULL; + +#endif +PFN_vkGetPipelineCacheData glad_vkGetPipelineCacheData = NULL; +PFN_vkGetQueryPoolResults glad_vkGetQueryPoolResults = NULL; +PFN_vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity = NULL; +PFN_vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR = NULL; +PFN_vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges = NULL; +PFN_vkMapMemory glad_vkMapMemory = NULL; +PFN_vkMergePipelineCaches glad_vkMergePipelineCaches = NULL; +PFN_vkQueueBeginDebugUtilsLabelEXT glad_vkQueueBeginDebugUtilsLabelEXT = NULL; +PFN_vkQueueBindSparse glad_vkQueueBindSparse = NULL; +PFN_vkQueueEndDebugUtilsLabelEXT glad_vkQueueEndDebugUtilsLabelEXT = NULL; +PFN_vkQueueInsertDebugUtilsLabelEXT glad_vkQueueInsertDebugUtilsLabelEXT = NULL; +PFN_vkQueuePresentKHR glad_vkQueuePresentKHR = NULL; +PFN_vkQueueSubmit glad_vkQueueSubmit = NULL; +PFN_vkQueueWaitIdle glad_vkQueueWaitIdle = NULL; +PFN_vkResetCommandBuffer glad_vkResetCommandBuffer = NULL; +PFN_vkResetCommandPool glad_vkResetCommandPool = NULL; +PFN_vkResetDescriptorPool glad_vkResetDescriptorPool = NULL; +PFN_vkResetEvent glad_vkResetEvent = NULL; +PFN_vkResetFences glad_vkResetFences = NULL; +PFN_vkSetDebugUtilsObjectNameEXT glad_vkSetDebugUtilsObjectNameEXT = NULL; +PFN_vkSetDebugUtilsObjectTagEXT glad_vkSetDebugUtilsObjectTagEXT = NULL; +PFN_vkSetEvent glad_vkSetEvent = NULL; +PFN_vkSubmitDebugUtilsMessageEXT glad_vkSubmitDebugUtilsMessageEXT = NULL; +PFN_vkUnmapMemory glad_vkUnmapMemory = NULL; +PFN_vkUpdateDescriptorSets glad_vkUpdateDescriptorSets = NULL; +PFN_vkWaitForFences glad_vkWaitForFences = NULL; + + +static void glad_vk_load_VK_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_VERSION_1_0) return; +    glad_vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers) load(userptr, "vkAllocateCommandBuffers"); +    glad_vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets) load(userptr, "vkAllocateDescriptorSets"); +    glad_vkAllocateMemory = (PFN_vkAllocateMemory) load(userptr, "vkAllocateMemory"); +    glad_vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer) load(userptr, "vkBeginCommandBuffer"); +    glad_vkBindBufferMemory = (PFN_vkBindBufferMemory) load(userptr, "vkBindBufferMemory"); +    glad_vkBindImageMemory = (PFN_vkBindImageMemory) load(userptr, "vkBindImageMemory"); +    glad_vkCmdBeginQuery = (PFN_vkCmdBeginQuery) load(userptr, "vkCmdBeginQuery"); +    glad_vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass) load(userptr, "vkCmdBeginRenderPass"); +    glad_vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets) load(userptr, "vkCmdBindDescriptorSets"); +    glad_vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer) load(userptr, "vkCmdBindIndexBuffer"); +    glad_vkCmdBindPipeline = (PFN_vkCmdBindPipeline) load(userptr, "vkCmdBindPipeline"); +    glad_vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers) load(userptr, "vkCmdBindVertexBuffers"); +    glad_vkCmdBlitImage = (PFN_vkCmdBlitImage) load(userptr, "vkCmdBlitImage"); +    glad_vkCmdClearAttachments = (PFN_vkCmdClearAttachments) load(userptr, "vkCmdClearAttachments"); +    glad_vkCmdClearColorImage = (PFN_vkCmdClearColorImage) load(userptr, "vkCmdClearColorImage"); +    glad_vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage) load(userptr, "vkCmdClearDepthStencilImage"); +    glad_vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer) load(userptr, "vkCmdCopyBuffer"); +    glad_vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage) load(userptr, "vkCmdCopyBufferToImage"); +    glad_vkCmdCopyImage = (PFN_vkCmdCopyImage) load(userptr, "vkCmdCopyImage"); +    glad_vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer) load(userptr, "vkCmdCopyImageToBuffer"); +    glad_vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults) load(userptr, "vkCmdCopyQueryPoolResults"); +    glad_vkCmdDispatch = (PFN_vkCmdDispatch) load(userptr, "vkCmdDispatch"); +    glad_vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect) load(userptr, "vkCmdDispatchIndirect"); +    glad_vkCmdDraw = (PFN_vkCmdDraw) load(userptr, "vkCmdDraw"); +    glad_vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed) load(userptr, "vkCmdDrawIndexed"); +    glad_vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect) load(userptr, "vkCmdDrawIndexedIndirect"); +    glad_vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect) load(userptr, "vkCmdDrawIndirect"); +    glad_vkCmdEndQuery = (PFN_vkCmdEndQuery) load(userptr, "vkCmdEndQuery"); +    glad_vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass) load(userptr, "vkCmdEndRenderPass"); +    glad_vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands) load(userptr, "vkCmdExecuteCommands"); +    glad_vkCmdFillBuffer = (PFN_vkCmdFillBuffer) load(userptr, "vkCmdFillBuffer"); +    glad_vkCmdNextSubpass = (PFN_vkCmdNextSubpass) load(userptr, "vkCmdNextSubpass"); +    glad_vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) load(userptr, "vkCmdPipelineBarrier"); +    glad_vkCmdPushConstants = (PFN_vkCmdPushConstants) load(userptr, "vkCmdPushConstants"); +    glad_vkCmdResetEvent = (PFN_vkCmdResetEvent) load(userptr, "vkCmdResetEvent"); +    glad_vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool) load(userptr, "vkCmdResetQueryPool"); +    glad_vkCmdResolveImage = (PFN_vkCmdResolveImage) load(userptr, "vkCmdResolveImage"); +    glad_vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants) load(userptr, "vkCmdSetBlendConstants"); +    glad_vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias) load(userptr, "vkCmdSetDepthBias"); +    glad_vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds) load(userptr, "vkCmdSetDepthBounds"); +    glad_vkCmdSetEvent = (PFN_vkCmdSetEvent) load(userptr, "vkCmdSetEvent"); +    glad_vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth) load(userptr, "vkCmdSetLineWidth"); +    glad_vkCmdSetScissor = (PFN_vkCmdSetScissor) load(userptr, "vkCmdSetScissor"); +    glad_vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask) load(userptr, "vkCmdSetStencilCompareMask"); +    glad_vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference) load(userptr, "vkCmdSetStencilReference"); +    glad_vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask) load(userptr, "vkCmdSetStencilWriteMask"); +    glad_vkCmdSetViewport = (PFN_vkCmdSetViewport) load(userptr, "vkCmdSetViewport"); +    glad_vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer) load(userptr, "vkCmdUpdateBuffer"); +    glad_vkCmdWaitEvents = (PFN_vkCmdWaitEvents) load(userptr, "vkCmdWaitEvents"); +    glad_vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp) load(userptr, "vkCmdWriteTimestamp"); +    glad_vkCreateBuffer = (PFN_vkCreateBuffer) load(userptr, "vkCreateBuffer"); +    glad_vkCreateBufferView = (PFN_vkCreateBufferView) load(userptr, "vkCreateBufferView"); +    glad_vkCreateCommandPool = (PFN_vkCreateCommandPool) load(userptr, "vkCreateCommandPool"); +    glad_vkCreateComputePipelines = (PFN_vkCreateComputePipelines) load(userptr, "vkCreateComputePipelines"); +    glad_vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool) load(userptr, "vkCreateDescriptorPool"); +    glad_vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout) load(userptr, "vkCreateDescriptorSetLayout"); +    glad_vkCreateDevice = (PFN_vkCreateDevice) load(userptr, "vkCreateDevice"); +    glad_vkCreateEvent = (PFN_vkCreateEvent) load(userptr, "vkCreateEvent"); +    glad_vkCreateFence = (PFN_vkCreateFence) load(userptr, "vkCreateFence"); +    glad_vkCreateFramebuffer = (PFN_vkCreateFramebuffer) load(userptr, "vkCreateFramebuffer"); +    glad_vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines) load(userptr, "vkCreateGraphicsPipelines"); +    glad_vkCreateImage = (PFN_vkCreateImage) load(userptr, "vkCreateImage"); +    glad_vkCreateImageView = (PFN_vkCreateImageView) load(userptr, "vkCreateImageView"); +    glad_vkCreateInstance = (PFN_vkCreateInstance) load(userptr, "vkCreateInstance"); +    glad_vkCreatePipelineCache = (PFN_vkCreatePipelineCache) load(userptr, "vkCreatePipelineCache"); +    glad_vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout) load(userptr, "vkCreatePipelineLayout"); +    glad_vkCreateQueryPool = (PFN_vkCreateQueryPool) load(userptr, "vkCreateQueryPool"); +    glad_vkCreateRenderPass = (PFN_vkCreateRenderPass) load(userptr, "vkCreateRenderPass"); +    glad_vkCreateSampler = (PFN_vkCreateSampler) load(userptr, "vkCreateSampler"); +    glad_vkCreateSemaphore = (PFN_vkCreateSemaphore) load(userptr, "vkCreateSemaphore"); +    glad_vkCreateShaderModule = (PFN_vkCreateShaderModule) load(userptr, "vkCreateShaderModule"); +    glad_vkDestroyBuffer = (PFN_vkDestroyBuffer) load(userptr, "vkDestroyBuffer"); +    glad_vkDestroyBufferView = (PFN_vkDestroyBufferView) load(userptr, "vkDestroyBufferView"); +    glad_vkDestroyCommandPool = (PFN_vkDestroyCommandPool) load(userptr, "vkDestroyCommandPool"); +    glad_vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool) load(userptr, "vkDestroyDescriptorPool"); +    glad_vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout) load(userptr, "vkDestroyDescriptorSetLayout"); +    glad_vkDestroyDevice = (PFN_vkDestroyDevice) load(userptr, "vkDestroyDevice"); +    glad_vkDestroyEvent = (PFN_vkDestroyEvent) load(userptr, "vkDestroyEvent"); +    glad_vkDestroyFence = (PFN_vkDestroyFence) load(userptr, "vkDestroyFence"); +    glad_vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer) load(userptr, "vkDestroyFramebuffer"); +    glad_vkDestroyImage = (PFN_vkDestroyImage) load(userptr, "vkDestroyImage"); +    glad_vkDestroyImageView = (PFN_vkDestroyImageView) load(userptr, "vkDestroyImageView"); +    glad_vkDestroyInstance = (PFN_vkDestroyInstance) load(userptr, "vkDestroyInstance"); +    glad_vkDestroyPipeline = (PFN_vkDestroyPipeline) load(userptr, "vkDestroyPipeline"); +    glad_vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache) load(userptr, "vkDestroyPipelineCache"); +    glad_vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout) load(userptr, "vkDestroyPipelineLayout"); +    glad_vkDestroyQueryPool = (PFN_vkDestroyQueryPool) load(userptr, "vkDestroyQueryPool"); +    glad_vkDestroyRenderPass = (PFN_vkDestroyRenderPass) load(userptr, "vkDestroyRenderPass"); +    glad_vkDestroySampler = (PFN_vkDestroySampler) load(userptr, "vkDestroySampler"); +    glad_vkDestroySemaphore = (PFN_vkDestroySemaphore) load(userptr, "vkDestroySemaphore"); +    glad_vkDestroyShaderModule = (PFN_vkDestroyShaderModule) load(userptr, "vkDestroyShaderModule"); +    glad_vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle) load(userptr, "vkDeviceWaitIdle"); +    glad_vkEndCommandBuffer = (PFN_vkEndCommandBuffer) load(userptr, "vkEndCommandBuffer"); +    glad_vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties) load(userptr, "vkEnumerateDeviceExtensionProperties"); +    glad_vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties) load(userptr, "vkEnumerateDeviceLayerProperties"); +    glad_vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties) load(userptr, "vkEnumerateInstanceExtensionProperties"); +    glad_vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties) load(userptr, "vkEnumerateInstanceLayerProperties"); +    glad_vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices) load(userptr, "vkEnumeratePhysicalDevices"); +    glad_vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) load(userptr, "vkFlushMappedMemoryRanges"); +    glad_vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers) load(userptr, "vkFreeCommandBuffers"); +    glad_vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets) load(userptr, "vkFreeDescriptorSets"); +    glad_vkFreeMemory = (PFN_vkFreeMemory) load(userptr, "vkFreeMemory"); +    glad_vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements) load(userptr, "vkGetBufferMemoryRequirements"); +    glad_vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment) load(userptr, "vkGetDeviceMemoryCommitment"); +    glad_vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) load(userptr, "vkGetDeviceProcAddr"); +    glad_vkGetDeviceQueue = (PFN_vkGetDeviceQueue) load(userptr, "vkGetDeviceQueue"); +    glad_vkGetEventStatus = (PFN_vkGetEventStatus) load(userptr, "vkGetEventStatus"); +    glad_vkGetFenceStatus = (PFN_vkGetFenceStatus) load(userptr, "vkGetFenceStatus"); +    glad_vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements) load(userptr, "vkGetImageMemoryRequirements"); +    glad_vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements) load(userptr, "vkGetImageSparseMemoryRequirements"); +    glad_vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout) load(userptr, "vkGetImageSubresourceLayout"); +    glad_vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) load(userptr, "vkGetInstanceProcAddr"); +    glad_vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures) load(userptr, "vkGetPhysicalDeviceFeatures"); +    glad_vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties) load(userptr, "vkGetPhysicalDeviceFormatProperties"); +    glad_vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties) load(userptr, "vkGetPhysicalDeviceImageFormatProperties"); +    glad_vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties) load(userptr, "vkGetPhysicalDeviceMemoryProperties"); +    glad_vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties) load(userptr, "vkGetPhysicalDeviceProperties"); +    glad_vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties) load(userptr, "vkGetPhysicalDeviceQueueFamilyProperties"); +    glad_vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties) load(userptr, "vkGetPhysicalDeviceSparseImageFormatProperties"); +    glad_vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData) load(userptr, "vkGetPipelineCacheData"); +    glad_vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults) load(userptr, "vkGetQueryPoolResults"); +    glad_vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity) load(userptr, "vkGetRenderAreaGranularity"); +    glad_vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) load(userptr, "vkInvalidateMappedMemoryRanges"); +    glad_vkMapMemory = (PFN_vkMapMemory) load(userptr, "vkMapMemory"); +    glad_vkMergePipelineCaches = (PFN_vkMergePipelineCaches) load(userptr, "vkMergePipelineCaches"); +    glad_vkQueueBindSparse = (PFN_vkQueueBindSparse) load(userptr, "vkQueueBindSparse"); +    glad_vkQueueSubmit = (PFN_vkQueueSubmit) load(userptr, "vkQueueSubmit"); +    glad_vkQueueWaitIdle = (PFN_vkQueueWaitIdle) load(userptr, "vkQueueWaitIdle"); +    glad_vkResetCommandBuffer = (PFN_vkResetCommandBuffer) load(userptr, "vkResetCommandBuffer"); +    glad_vkResetCommandPool = (PFN_vkResetCommandPool) load(userptr, "vkResetCommandPool"); +    glad_vkResetDescriptorPool = (PFN_vkResetDescriptorPool) load(userptr, "vkResetDescriptorPool"); +    glad_vkResetEvent = (PFN_vkResetEvent) load(userptr, "vkResetEvent"); +    glad_vkResetFences = (PFN_vkResetFences) load(userptr, "vkResetFences"); +    glad_vkSetEvent = (PFN_vkSetEvent) load(userptr, "vkSetEvent"); +    glad_vkUnmapMemory = (PFN_vkUnmapMemory) load(userptr, "vkUnmapMemory"); +    glad_vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets) load(userptr, "vkUpdateDescriptorSets"); +    glad_vkWaitForFences = (PFN_vkWaitForFences) load(userptr, "vkWaitForFences"); +} +static void glad_vk_load_VK_EXT_debug_utils( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_EXT_debug_utils) return; +    glad_vkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT) load(userptr, "vkCmdBeginDebugUtilsLabelEXT"); +    glad_vkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT) load(userptr, "vkCmdEndDebugUtilsLabelEXT"); +    glad_vkCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT) load(userptr, "vkCmdInsertDebugUtilsLabelEXT"); +    glad_vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) load(userptr, "vkCreateDebugUtilsMessengerEXT"); +    glad_vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT) load(userptr, "vkDestroyDebugUtilsMessengerEXT"); +    glad_vkQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT) load(userptr, "vkQueueBeginDebugUtilsLabelEXT"); +    glad_vkQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT) load(userptr, "vkQueueEndDebugUtilsLabelEXT"); +    glad_vkQueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT) load(userptr, "vkQueueInsertDebugUtilsLabelEXT"); +    glad_vkSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT) load(userptr, "vkSetDebugUtilsObjectNameEXT"); +    glad_vkSetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT) load(userptr, "vkSetDebugUtilsObjectTagEXT"); +    glad_vkSubmitDebugUtilsMessageEXT = (PFN_vkSubmitDebugUtilsMessageEXT) load(userptr, "vkSubmitDebugUtilsMessageEXT"); +} +static void glad_vk_load_VK_KHR_surface( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_KHR_surface) return; +    glad_vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR) load(userptr, "vkDestroySurfaceKHR"); +    glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) load(userptr, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); +    glad_vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) load(userptr, "vkGetPhysicalDeviceSurfaceFormatsKHR"); +    glad_vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) load(userptr, "vkGetPhysicalDeviceSurfacePresentModesKHR"); +    glad_vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) load(userptr, "vkGetPhysicalDeviceSurfaceSupportKHR"); +} +static void glad_vk_load_VK_KHR_swapchain( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_KHR_swapchain) return; +    glad_vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR) load(userptr, "vkAcquireNextImage2KHR"); +    glad_vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) load(userptr, "vkAcquireNextImageKHR"); +    glad_vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) load(userptr, "vkCreateSwapchainKHR"); +    glad_vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) load(userptr, "vkDestroySwapchainKHR"); +    glad_vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR) load(userptr, "vkGetDeviceGroupPresentCapabilitiesKHR"); +    glad_vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR) load(userptr, "vkGetDeviceGroupSurfacePresentModesKHR"); +    glad_vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR) load(userptr, "vkGetPhysicalDevicePresentRectanglesKHR"); +    glad_vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR) load(userptr, "vkGetSwapchainImagesKHR"); +    glad_vkQueuePresentKHR = (PFN_vkQueuePresentKHR) load(userptr, "vkQueuePresentKHR"); +} +#if defined(VK_USE_PLATFORM_WIN32_KHR) +static void glad_vk_load_VK_KHR_win32_surface( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_KHR_win32_surface) return; +    glad_vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR) load(userptr, "vkCreateWin32SurfaceKHR"); +    glad_vkGetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR) load(userptr, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); +} + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +static void glad_vk_load_VK_KHR_xlib_surface( GLADuserptrloadfunc load, void* userptr) { +    if(!GLAD_VK_KHR_xlib_surface) return; +    glad_vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR) load(userptr, "vkCreateXlibSurfaceKHR"); +    glad_vkGetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR) load(userptr, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); +} + +#endif + + + +static int glad_vk_get_extensions( VkPhysicalDevice physical_device, uint32_t *out_extension_count, char ***out_extensions) { +    uint32_t i; +    uint32_t instance_extension_count = 0; +    uint32_t device_extension_count = 0; +    uint32_t max_extension_count = 0; +    uint32_t total_extension_count = 0; +    char **extensions = NULL; +    VkExtensionProperties *ext_properties = NULL; +    VkResult result; + +    if (glad_vkEnumerateInstanceExtensionProperties == NULL || (physical_device != NULL && glad_vkEnumerateDeviceExtensionProperties == NULL)) { +        return 0; +    } + +    result = glad_vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL); +    if (result != VK_SUCCESS) { +        return 0; +    } + +    if (physical_device != NULL) { +        result = glad_vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, NULL); +        if (result != VK_SUCCESS) { +            return 0; +        } +    } + +    total_extension_count = instance_extension_count + device_extension_count; +    if (total_extension_count <= 0) { +        return 0; +    } + +    max_extension_count = instance_extension_count > device_extension_count +        ? instance_extension_count : device_extension_count; + +    ext_properties = (VkExtensionProperties*) malloc(max_extension_count * sizeof(VkExtensionProperties)); +    if (ext_properties == NULL) { +        goto glad_vk_get_extensions_error; +    } + +    result = glad_vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, ext_properties); +    if (result != VK_SUCCESS) { +        goto glad_vk_get_extensions_error; +    } + +    extensions = (char**) calloc(total_extension_count, sizeof(char*)); +    if (extensions == NULL) { +        goto glad_vk_get_extensions_error; +    } + +    for (i = 0; i < instance_extension_count; ++i) { +        VkExtensionProperties ext = ext_properties[i]; + +        size_t extension_name_length = strlen(ext.extensionName) + 1; +        extensions[i] = (char*) malloc(extension_name_length * sizeof(char)); +        if (extensions[i] == NULL) { +            goto glad_vk_get_extensions_error; +        } +        memcpy(extensions[i], ext.extensionName, extension_name_length * sizeof(char)); +    } + +    if (physical_device != NULL) { +        result = glad_vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, ext_properties); +        if (result != VK_SUCCESS) { +            goto glad_vk_get_extensions_error; +        } + +        for (i = 0; i < device_extension_count; ++i) { +            VkExtensionProperties ext = ext_properties[i]; + +            size_t extension_name_length = strlen(ext.extensionName) + 1; +            extensions[instance_extension_count + i] = (char*) malloc(extension_name_length * sizeof(char)); +            if (extensions[instance_extension_count + i] == NULL) { +                goto glad_vk_get_extensions_error; +            } +            memcpy(extensions[instance_extension_count + i], ext.extensionName, extension_name_length * sizeof(char)); +        } +    } + +    free((void*) ext_properties); + +    *out_extension_count = total_extension_count; +    *out_extensions = extensions; + +    return 1; + +glad_vk_get_extensions_error: +    free((void*) ext_properties); +    if (extensions != NULL) { +        for (i = 0; i < total_extension_count; ++i) { +            free((void*) extensions[i]); +        } +        free(extensions); +    } +    return 0; +} + +static void glad_vk_free_extensions(uint32_t extension_count, char **extensions) { +    uint32_t i; + +    for(i = 0; i < extension_count ; ++i) { +        free((void*) (extensions[i])); +    } + +    free((void*) extensions); +} + +static int glad_vk_has_extension(const char *name, uint32_t extension_count, char **extensions) { +    uint32_t i; + +    for (i = 0; i < extension_count; ++i) { +        if(extensions[i] != NULL && strcmp(name, extensions[i]) == 0) { +            return 1; +        } +    } + +    return 0; +} + +static GLADapiproc glad_vk_get_proc_from_userptr(void *userptr, const char* name) { +    return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_vk_find_extensions_vulkan( VkPhysicalDevice physical_device) { +    uint32_t extension_count = 0; +    char **extensions = NULL; +    if (!glad_vk_get_extensions(physical_device, &extension_count, &extensions)) return 0; + +    GLAD_VK_EXT_debug_utils = glad_vk_has_extension("VK_EXT_debug_utils", extension_count, extensions); +    GLAD_VK_KHR_surface = glad_vk_has_extension("VK_KHR_surface", extension_count, extensions); +    GLAD_VK_KHR_swapchain = glad_vk_has_extension("VK_KHR_swapchain", extension_count, extensions); +#if defined(VK_USE_PLATFORM_WIN32_KHR) +    GLAD_VK_KHR_win32_surface = glad_vk_has_extension("VK_KHR_win32_surface", extension_count, extensions); + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +    GLAD_VK_KHR_xlib_surface = glad_vk_has_extension("VK_KHR_xlib_surface", extension_count, extensions); + +#endif + +    GLAD_UNUSED(glad_vk_has_extension); + +    glad_vk_free_extensions(extension_count, extensions); + +    return 1; +} + +static int glad_vk_find_core_vulkan( VkPhysicalDevice physical_device) { +    int major = 1; +    int minor = 0; + +#ifdef VK_VERSION_1_1 +    if (glad_vkEnumerateInstanceVersion != NULL) { +        uint32_t version; +        VkResult result; + +        result = glad_vkEnumerateInstanceVersion(&version); +        if (result == VK_SUCCESS) { +            major = (int) VK_VERSION_MAJOR(version); +            minor = (int) VK_VERSION_MINOR(version); +        } +    } +#endif + +    if (physical_device != NULL && glad_vkGetPhysicalDeviceProperties != NULL) { +        VkPhysicalDeviceProperties properties; +        glad_vkGetPhysicalDeviceProperties(physical_device, &properties); + +        major = (int) VK_VERSION_MAJOR(properties.apiVersion); +        minor = (int) VK_VERSION_MINOR(properties.apiVersion); +    } + +    GLAD_VK_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + +    return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadVulkanUserPtr( VkPhysicalDevice physical_device, GLADuserptrloadfunc load, void *userptr) { +    int version; + +#ifdef VK_VERSION_1_1 +    glad_vkEnumerateInstanceVersion  = (PFN_vkEnumerateInstanceVersion) load(userptr, "vkEnumerateInstanceVersion"); +#endif +    version = glad_vk_find_core_vulkan( physical_device); +    if (!version) { +        return 0; +    } + +    glad_vk_load_VK_VERSION_1_0(load, userptr); + +    if (!glad_vk_find_extensions_vulkan( physical_device)) return 0; +    glad_vk_load_VK_EXT_debug_utils(load, userptr); +    glad_vk_load_VK_KHR_surface(load, userptr); +    glad_vk_load_VK_KHR_swapchain(load, userptr); +#if defined(VK_USE_PLATFORM_WIN32_KHR) +    glad_vk_load_VK_KHR_win32_surface(load, userptr); + +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) +    glad_vk_load_VK_KHR_xlib_surface(load, userptr); + +#endif + + +    return version; +} + + +int gladLoadVulkan( VkPhysicalDevice physical_device, GLADloadfunc load) { +    return gladLoadVulkanUserPtr( physical_device, glad_vk_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + +  + +#ifdef GLAD_VULKAN + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include <stddef.h> +#include <stdlib.h> + +#if GLAD_PLATFORM_WIN32 +#include <windows.h> +#else +#include <dlfcn.h> +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { +    void *handle = NULL; +    int i; + +    for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 +  #if GLAD_PLATFORM_UWP +        size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); +        LPWSTR buffer = (LPWSTR) malloc(buffer_size); +        if (buffer != NULL) { +            int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); +            if (ret != 0) { +                handle = (void*) LoadPackagedLibrary(buffer, 0); +            } +            free((void*) buffer); +        } +  #else +        handle = (void*) LoadLibraryA(lib_names[i]); +  #endif +#else +        handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif +        if (handle != NULL) { +            return handle; +        } +    } + +    return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { +    if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 +        FreeLibrary((HMODULE) handle); +#else +        dlclose(handle); +#endif +    } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { +    if (handle == NULL) { +        return NULL; +    } + +#if GLAD_PLATFORM_WIN32 +    return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else +    return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + + +static const char* DEVICE_FUNCTIONS[] = { +    "vkAcquireNextImage2KHR", +    "vkAcquireNextImageKHR", +    "vkAllocateCommandBuffers", +    "vkAllocateDescriptorSets", +    "vkAllocateMemory", +    "vkBeginCommandBuffer", +    "vkBindBufferMemory", +    "vkBindImageMemory", +    "vkCmdBeginDebugUtilsLabelEXT", +    "vkCmdBeginQuery", +    "vkCmdBeginRenderPass", +    "vkCmdBindDescriptorSets", +    "vkCmdBindIndexBuffer", +    "vkCmdBindPipeline", +    "vkCmdBindVertexBuffers", +    "vkCmdBlitImage", +    "vkCmdClearAttachments", +    "vkCmdClearColorImage", +    "vkCmdClearDepthStencilImage", +    "vkCmdCopyBuffer", +    "vkCmdCopyBufferToImage", +    "vkCmdCopyImage", +    "vkCmdCopyImageToBuffer", +    "vkCmdCopyQueryPoolResults", +    "vkCmdDispatch", +    "vkCmdDispatchIndirect", +    "vkCmdDraw", +    "vkCmdDrawIndexed", +    "vkCmdDrawIndexedIndirect", +    "vkCmdDrawIndirect", +    "vkCmdEndDebugUtilsLabelEXT", +    "vkCmdEndQuery", +    "vkCmdEndRenderPass", +    "vkCmdExecuteCommands", +    "vkCmdFillBuffer", +    "vkCmdInsertDebugUtilsLabelEXT", +    "vkCmdNextSubpass", +    "vkCmdPipelineBarrier", +    "vkCmdPushConstants", +    "vkCmdResetEvent", +    "vkCmdResetQueryPool", +    "vkCmdResolveImage", +    "vkCmdSetBlendConstants", +    "vkCmdSetDepthBias", +    "vkCmdSetDepthBounds", +    "vkCmdSetEvent", +    "vkCmdSetLineWidth", +    "vkCmdSetScissor", +    "vkCmdSetStencilCompareMask", +    "vkCmdSetStencilReference", +    "vkCmdSetStencilWriteMask", +    "vkCmdSetViewport", +    "vkCmdUpdateBuffer", +    "vkCmdWaitEvents", +    "vkCmdWriteTimestamp", +    "vkCreateBuffer", +    "vkCreateBufferView", +    "vkCreateCommandPool", +    "vkCreateComputePipelines", +    "vkCreateDescriptorPool", +    "vkCreateDescriptorSetLayout", +    "vkCreateEvent", +    "vkCreateFence", +    "vkCreateFramebuffer", +    "vkCreateGraphicsPipelines", +    "vkCreateImage", +    "vkCreateImageView", +    "vkCreatePipelineCache", +    "vkCreatePipelineLayout", +    "vkCreateQueryPool", +    "vkCreateRenderPass", +    "vkCreateSampler", +    "vkCreateSemaphore", +    "vkCreateShaderModule", +    "vkCreateSwapchainKHR", +    "vkDestroyBuffer", +    "vkDestroyBufferView", +    "vkDestroyCommandPool", +    "vkDestroyDescriptorPool", +    "vkDestroyDescriptorSetLayout", +    "vkDestroyDevice", +    "vkDestroyEvent", +    "vkDestroyFence", +    "vkDestroyFramebuffer", +    "vkDestroyImage", +    "vkDestroyImageView", +    "vkDestroyPipeline", +    "vkDestroyPipelineCache", +    "vkDestroyPipelineLayout", +    "vkDestroyQueryPool", +    "vkDestroyRenderPass", +    "vkDestroySampler", +    "vkDestroySemaphore", +    "vkDestroyShaderModule", +    "vkDestroySwapchainKHR", +    "vkDeviceWaitIdle", +    "vkEndCommandBuffer", +    "vkFlushMappedMemoryRanges", +    "vkFreeCommandBuffers", +    "vkFreeDescriptorSets", +    "vkFreeMemory", +    "vkGetBufferMemoryRequirements", +    "vkGetDeviceGroupPresentCapabilitiesKHR", +    "vkGetDeviceGroupSurfacePresentModesKHR", +    "vkGetDeviceMemoryCommitment", +    "vkGetDeviceProcAddr", +    "vkGetDeviceQueue", +    "vkGetEventStatus", +    "vkGetFenceStatus", +    "vkGetImageMemoryRequirements", +    "vkGetImageSparseMemoryRequirements", +    "vkGetImageSubresourceLayout", +    "vkGetPipelineCacheData", +    "vkGetQueryPoolResults", +    "vkGetRenderAreaGranularity", +    "vkGetSwapchainImagesKHR", +    "vkInvalidateMappedMemoryRanges", +    "vkMapMemory", +    "vkMergePipelineCaches", +    "vkQueueBeginDebugUtilsLabelEXT", +    "vkQueueBindSparse", +    "vkQueueEndDebugUtilsLabelEXT", +    "vkQueueInsertDebugUtilsLabelEXT", +    "vkQueuePresentKHR", +    "vkQueueSubmit", +    "vkQueueWaitIdle", +    "vkResetCommandBuffer", +    "vkResetCommandPool", +    "vkResetDescriptorPool", +    "vkResetEvent", +    "vkResetFences", +    "vkSetDebugUtilsObjectNameEXT", +    "vkSetDebugUtilsObjectTagEXT", +    "vkSetEvent", +    "vkUnmapMemory", +    "vkUpdateDescriptorSets", +    "vkWaitForFences", +}; + +static int glad_vulkan_is_device_function(const char *name) { +    /* Exists as a workaround for: +     * https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/2323 +     * +     * `vkGetDeviceProcAddr` does not return NULL for non-device functions. +     */ +    int i; +    int length = sizeof(DEVICE_FUNCTIONS) / sizeof(DEVICE_FUNCTIONS[0]); + +    for (i=0; i < length; ++i) { +        if (strcmp(DEVICE_FUNCTIONS[i], name) == 0) { +            return 1; +        } +    } + +    return 0; +} + +struct _glad_vulkan_userptr { +    void *vk_handle; +    VkInstance vk_instance; +    VkDevice vk_device; +    PFN_vkGetInstanceProcAddr get_instance_proc_addr; +    PFN_vkGetDeviceProcAddr get_device_proc_addr; +}; + +static GLADapiproc glad_vulkan_get_proc(void *vuserptr, const char *name) { +    struct _glad_vulkan_userptr userptr = *(struct _glad_vulkan_userptr*) vuserptr; +    PFN_vkVoidFunction result = NULL; + +    if (userptr.vk_device != NULL && glad_vulkan_is_device_function(name)) { +        result = userptr.get_device_proc_addr(userptr.vk_device, name); +    } + +    if (result == NULL && userptr.vk_instance != NULL) { +        result = userptr.get_instance_proc_addr(userptr.vk_instance, name); +    } + +    if(result == NULL) { +        result = (PFN_vkVoidFunction) glad_dlsym_handle(userptr.vk_handle, name); +    } + +    return (GLADapiproc) result; +} + + +static void* _glad_Vulkan_loader_handle = NULL; + +static void* glad_vulkan_dlopen_handle(void) { +    static const char *NAMES[] = { +#if GLAD_PLATFORM_APPLE +        "libvulkan.1.dylib", +#elif GLAD_PLATFORM_WIN32 +        "vulkan-1.dll", +        "vulkan.dll", +#else +        "libvulkan.so.1", +        "libvulkan.so", +#endif +    }; + +    if (_glad_Vulkan_loader_handle == NULL) { +        _glad_Vulkan_loader_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); +    } + +    return _glad_Vulkan_loader_handle; +} + +static struct _glad_vulkan_userptr glad_vulkan_build_userptr(void *handle, VkInstance instance, VkDevice device) { +    struct _glad_vulkan_userptr userptr; +    userptr.vk_handle = handle; +    userptr.vk_instance = instance; +    userptr.vk_device = device; +    userptr.get_instance_proc_addr = (PFN_vkGetInstanceProcAddr) glad_dlsym_handle(handle, "vkGetInstanceProcAddr"); +    userptr.get_device_proc_addr = (PFN_vkGetDeviceProcAddr) glad_dlsym_handle(handle, "vkGetDeviceProcAddr"); +    return userptr; +} + +int gladLoaderLoadVulkan( VkInstance instance, VkPhysicalDevice physical_device, VkDevice device) { +    int version = 0; +    void *handle = NULL; +    int did_load = 0; +    struct _glad_vulkan_userptr userptr; + +    did_load = _glad_Vulkan_loader_handle == NULL; +    handle = glad_vulkan_dlopen_handle(); +    if (handle != NULL) { +        userptr = glad_vulkan_build_userptr(handle, instance, device); + +        if (userptr.get_instance_proc_addr != NULL && userptr.get_device_proc_addr != NULL) { +            version = gladLoadVulkanUserPtr( physical_device, glad_vulkan_get_proc, &userptr); +        } + +        if (!version && did_load) { +            gladLoaderUnloadVulkan(); +        } +    } + +    return version; +} + + + +void gladLoaderUnloadVulkan(void) { +    if (_glad_Vulkan_loader_handle != NULL) { +        glad_close_dlopen_handle(_glad_Vulkan_loader_handle); +        _glad_Vulkan_loader_handle = NULL; +    } +} + +#endif /* GLAD_VULKAN */ + +#ifdef __cplusplus +} +#endif + +#endif /* GLAD_VULKAN_IMPLEMENTATION */ + diff --git a/pipeline.cpp b/pipeline.cpp new file mode 100644 index 0000000..30bf442 --- /dev/null +++ b/pipeline.cpp @@ -0,0 +1,29 @@ +#include "video.hpp" + +extern "C" { +#include "qstd/memory.h" +#include "qstd/plat.h" +} + +Pipeline_Builder::Pipeline_Builder(Arena* arena): +	arena(arena) {} + +void Pipeline_Builder::begin_rp() { +	pass = (Render_Pass*)arena_alloc(arena, sizeof *pass); +	pass->target = 0; +	pass->clear = { 0, 0, 0, 0 }; +} + +void Pipeline_Builder::rp_target(Texture_Id id, Colour clear) { +	pass->target = id; +	pass->clear = clear; +} + +void Pipeline_Builder::validate_rp() { +	assert(pass->target); +} + +Render_Pass& Pipeline_Builder::build_rp() { +	validate_rp(); +	return *pass; +} @@ -314,14 +314,17 @@ void write_csh(  	const Desc& d,  	const std::vector<uint32_t>* stages  ) { -	int hsize = 8, i, coff; +	int hsize = 16, i, coff;  	FILE* f = fopen(fname, "wb");  	if (!f) {  		print_err("Failed to open %s\n", fname);  		pbreak(500);  	} +	int c;  	fwrite("CSH2", 4, 1, f);  	fwrite(&d.type, 4, 1, f); +	c = d.attrs.size(); fwrite(&c, 4, 1, f); +	c = d.trgts.size(); fwrite(&c, 4, 1, f);  	for (const auto& a : d.attrs) {  		char buf[28];  		memset(buf, 0, sizeof buf); @@ -338,14 +341,18 @@ void write_csh(  		fwrite(&t.type, 4, 1, f);  		hsize += 32;  	} +	hsize += shader_type_count * 8;  	for (i = 0, coff = 0; i < shader_type_count; i++) {  		int o = 0; -		if (d.entrypoints[i].empty()) +		if (d.entrypoints[i].empty()) {  			fwrite(&o, 4, 1, f); -		else { +			fwrite(&o, 4, 1, f); +		} else { +			int size = stages[i].size() * sizeof(uint32_t);  			o = hsize + coff;  			fwrite(&o, 4, 1, f); -			coff += stages[i].size() * sizeof(uint32_t); +			fwrite(&size, 4, 1, f); +			coff += size;  		}  	}  	for (i = 0; i < shader_type_count; i++) diff --git a/video.cpp b/video.cpp new file mode 100644 index 0000000..c274e65 --- /dev/null +++ b/video.cpp @@ -0,0 +1,1238 @@ +#include "app.hpp" +#include "video.hpp" + +#define device_heap_size (1024 * 1024 * 4) +#define max_textures 1024 + +extern "C" { +#include "memory.h" +#include "plat.h" +#include "str.h" +#include "sc/sh_enums.h" +} + +#include <algorithm> +#include <new> +#include <tuple> +#include <unordered_map> + +#define VK_USE_PLATFORM_XLIB_KHR +#define GLAD_VULKAN_IMPLEMENTATION +#include "glad_vk.h" + +const char* device_exts[] = { +	VK_KHR_SWAPCHAIN_EXTENSION_NAME +}; + +extern "C" { +VkSurfaceKHR app_create_vk_surface(App* app, VkInstance inst); +void app_destroy_vk_surface( +	App* app, +	VkInstance inst, +	VkSurfaceKHR surf +); +} + +template <typename ID, typename T, int size> +struct ID_Map +{ +	T storage[size]; +	ID keys[size]; + +	void init() { +		int i; +		for (i = 0; i < size; i++) { +			keys[i] = 0; +		} +	} + +	std::pair<T*, uint32_t> bucket(ID id) { +		int index = (int)id % size, i; +		for (i = 0; i < size; i++) { +			ID key = keys[index]; +			if (!key || key == id) return { &storage[index], index }; +			index = (index + 1) % size; +		} +		return { 0, 0 }; +	} + +	T& set(ID id, const T& v) { +		auto [b, index] = bucket(id); +		assert(b != 0); +		assert(!keys[index]); +		keys[index] = id; +		*b = v; +		return *b; +	} + +	T& operator[](ID id) { +		T* b = bucket(id).first; +		assert(b != 0); +		return *b; +	} +}; + +static void* vk_alloc( +	void* uptr, +	size_t size, +	size_t alignment, +	VkSystemAllocationScope scope +) { +	Device* d = (Device*)uptr; +	void* r; +	(void)scope; +	if (!size) return 0; +	r = heap_alloc_aligned( +		d->heap, +		size, +		alignment +	); +	if (!r) { +		print_err("Out of memory."); +		pbreak(4096); +	} +	return r; +} + +static void vk_free( +	void* uptr, +	void* ptr +) { +	Device* d = (Device*)uptr; +	heap_free(d->heap, ptr); +} + +static void* vk_realloc( +	void* uptr, +	void* old, +	size_t size, +	size_t alignment, +	VkSystemAllocationScope scope +) { +	int os; +	void* na; +	(void)scope; +	if (!old) +		return vk_alloc(uptr, size, alignment, scope); +	if (!size) { +		vk_free(uptr, old); +		return 0; +	} +	os = heap_block_size(old); +	na = vk_alloc(uptr, size, alignment, scope); +	memcpy(na, old, std::min(os, (int)size)); +	vk_free(uptr, old); +	return na; +} + +typedef struct { +	VkSurfaceCapabilitiesKHR cap; +	unsigned fmt_count, pm_count; +	VkSurfaceFormatKHR* fmts; +	VkPresentModeKHR* pms; +} Swap_Cap; + +static void get_swap_cap( +	Device* d, +	VkPhysicalDevice dev, +	VkSurfaceKHR surf, +	Swap_Cap* cap +) { +	cap->fmts = 0; +	cap->pms = 0; +	vkGetPhysicalDeviceSurfaceCapabilitiesKHR( +		dev, +		surf, +		&cap->cap +	); +	vkGetPhysicalDeviceSurfaceFormatsKHR( +		dev, +		surf, +		&cap->fmt_count, +		0 +	); +	if (cap->fmt_count) { +		cap->fmts = (VkSurfaceFormatKHR*)heap_alloc( +			d->heap, +			sizeof *cap->fmts * cap->fmt_count +		); +		vkGetPhysicalDeviceSurfaceFormatsKHR( +			dev, +			surf, +			&cap->fmt_count, +			cap->fmts +		); +	} +	vkGetPhysicalDeviceSurfacePresentModesKHR( +		dev, +		surf, +		&cap->pm_count, +		0 +	); +	if (cap->pm_count) { +		cap->pms = (VkPresentModeKHR*)heap_alloc( +			d->heap, +			sizeof *cap->pms * cap->pm_count +		); +		vkGetPhysicalDeviceSurfacePresentModesKHR( +			dev, +			surf, +			&cap->pm_count, +			cap->pms +		); +	} +} + +static void deinit_swap_cap( +	Device* d, +	Swap_Cap* cap +) { +	if (cap->fmts) heap_free(d->heap, cap->fmts); +	if (cap->pms)  heap_free(d->heap, cap->pms); +} + +struct Device_Vk; +struct Swapchain { +	VkSwapchainKHR swapchain; +	Texture_Id* textures; +	VkSurfaceFormatKHR format; +	VkExtent2D size; +	VkPresentModeKHR mode; +	int image_count; + +	void init(const App& app, Device_Vk* dev); +	void initr(const App& app, Device_Vk* dev); +	void recreate(const App& app, Device_Vk* dev); +	void get_images(Device_Vk* dev); +	void destroy(Device_Vk* dev); +}; + +#define max_contexts 16 + +enum { +	context_state_avail = 1 << 0, +	context_state_init  = 1 << 1 +}; + +struct Shader_Vk : public Shader { +	SProgram_Type type; +	VkShaderModule modules[shader_type_count]; + +	bool init(Device_Vk* dev, FILE* f); +	bool init_module( +		Device_Vk* dev, +		int stage, +		char* buf, +		int size +	); +	void destroy_internal(Device_Vk* dev); +}; + +struct Context_Vk : public Context { +	int state; +	VkCommandBuffer cb; +	VkCommandPool pool; +	VkFence fence; +	VkSemaphore semaphore; + +	void init_pool(Device_Vk* dev); +	void init_cb(Device_Vk* dev); +	void init_sync(Device_Vk* dev); +	void init(Device_Vk* dev); +	void begin_record(Device_Vk* dev); +	Context_Vk& acquire(Device_Vk* dev); +	void release(); +}; + +struct Texture_Vk : public Texture { +	VkImage image; +	VkImageView view; +}; + +struct Renderpass_Vk { +	VkRenderPass rpo; +	VkFramebuffer fbo; +	VkClearValue clear; +	int age; + +	void on_submit() { +		age = 0; +	} + +	void init_rp(Device_Vk* dev, const Render_Pass& rp); +	void init_fb(Device_Vk* dev, const Render_Pass& rp); +	void destroy(Device_Vk* dev); +}; + +template<> +struct std::hash<Render_Pass> +{ +	size_t operator()(const Render_Pass& rp) const { +		return fnv1a64((uint8_t*)&rp, sizeof rp); +	} +}; + +struct Device_Vk : public Device { +	VkAllocationCallbacks ac; +	VkInstance inst; +	VkDevice dev; +	VkPhysicalDevice phys_dev; +	VkSurfaceKHR surf; +	uint32_t backbuffer_index; +	Texture_Id backbuffer_id; +	Swap_Cap swap_cap; +	int queue_index; +	VkQueue queue; +	Swapchain swapchain; +	Context_Vk contexts[max_contexts]; +	Context_Vk* current_ctx; +#ifdef DEBUG +	VkDebugUtilsMessengerEXT msg; +#endif + +	ID_Map<Texture_Id, Texture_Vk, max_textures> textures; +	Texture_Id texture_count; + +	std::unordered_map<Render_Pass, Renderpass_Vk> rpo_cache; + +	Texture_Id alloc_texture( +		VkImage img, +		VkImageView view,  +		const Texture& copy +	); + +	void init_internal(); +	void deinit_internal(); +	void init_ac(); +	void create_inst(const char** exts, int count); +	void create_dev(Swap_Cap* swap_cap); +	void find_exts(const char** exts, int& count); + +	bool has_validation(); +	void init_validation(); + +	void create_surf(); +	void on_resize_internal(int w, int h); + +	Renderpass_Vk& create_rpo(const Render_Pass& rp); +	Renderpass_Vk& get_rpo(const Render_Pass& rp); + +	void collect_garbage(); +}; + +#ifdef DEBUG +static VkBool32 debug_callback( +	VkDebugUtilsMessageSeverityFlagBitsEXT sev, +	VkDebugUtilsMessageTypeFlagsEXT type, +	const VkDebugUtilsMessengerCallbackDataEXT* data, +	void* uptr +) { +	(void)sev; +	(void)uptr; +	if (sev <= VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) +		return 0; +	switch (sev) { +		case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: +			print("%s\n", data->pMessage); +			break; +		case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: +			print_war("%s\n", data->pMessage); +			break; +		case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: +			print_err("%s\n", data->pMessage); +			break; +		default: break; +	} +	pbreak((int)type); +	return 0; +} + +static VkResult create_dmesg( +	Device_Vk* d, +	const VkDebugUtilsMessengerCreateInfoEXT* information, +	const VkAllocationCallbacks* allocator, +	VkDebugUtilsMessengerEXT* messenger +) { +	PFN_vkCreateDebugUtilsMessengerEXT f; +	f = (PFN_vkCreateDebugUtilsMessengerEXT) +		vkGetInstanceProcAddr( +			d->inst, +			"vkCreateDebugUtilsMessengerEXT" +		); +	return f? +		f(d->inst, information, allocator, messenger): +		VK_ERROR_EXTENSION_NOT_PRESENT; +} + +static void destroy_dmesg( +	VkInstance instance, +	VkDebugUtilsMessengerEXT messenger, +	const VkAllocationCallbacks* allocator +) { +	PFN_vkDestroyDebugUtilsMessengerEXT f; +	f = (PFN_vkDestroyDebugUtilsMessengerEXT) +		vkGetInstanceProcAddr( +			instance, +			"vkDestroyDebugUtilsMessengerEXT" +		); +	if (f) +		f(instance, messenger, allocator); +} + +void Device_Vk::init_validation() { +	VkDebugUtilsMessengerCreateInfoEXT mi{}; +	VkResult r; +	mi.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; +	mi.messageSeverity = +		VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | +		VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | +		VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; +	mi.messageType =  +		VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT    | +		VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | +		VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; +	mi.pfnUserCallback = debug_callback; +	r = create_dmesg( +		this, +		&mi, +		&ac, +		&msg +	); +	if (r != VK_SUCCESS) { +		print_err("Failed to create debug messenger.\n"); +		pbreak(r); +	} +} + +#endif + + +bool Device_Vk::has_validation() { +	unsigned count, i; +	int f; +	VkLayerProperties* props; +	VkResult r; +	r = vkEnumerateInstanceLayerProperties(&count, 0); +	if (!count || r != VK_SUCCESS) return 0; +	props = (VkLayerProperties*)heap_alloc(heap, count * sizeof *props); +	vkEnumerateInstanceLayerProperties(&count, props); +	for (f = 0, i = 0; i < count; i++) { +		if (strcmp( +			props[i].layerName, +			"VK_LAYER_KHRONOS_validation" +		)) { +			f = 1; +			break; +		} +	} +	heap_free(heap, props); +	return f; +} + +void Device_Vk::find_exts(const char** exts, int& count) { +	app->get_vk_exts(exts, count); +#ifdef DEBUG +	exts[count++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME; +#endif +} + +void Device_Vk::init_ac() { +	ac.pUserData = this; +	ac.pfnAllocation = vk_alloc; +	ac.pfnReallocation = vk_realloc; +	ac.pfnFree = vk_free; +	ac.pfnInternalAllocation = 0; +	ac.pfnInternalFree = 0; +} + +void Device_Vk::create_inst(const char** exts, int ext_count) { +	VkInstanceCreateInfo ci{}; +	VkApplicationInfo ai{}; +	VkResult r; +#ifdef DEBUG +	const char* vln = "VK_LAYER_KHRONOS_validation"; +#endif +	ai.apiVersion = VK_API_VERSION_1_0; +	ai.pApplicationName = "C2"; +	ci.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; +	ci.pApplicationInfo = &ai; +	ci.enabledExtensionCount = (unsigned)ext_count; +	ci.ppEnabledExtensionNames = exts; +#ifdef DEBUG +	ci.enabledLayerCount = has_validation(); +	ci.ppEnabledLayerNames = &vln; +	if (!ci.enabledLayerCount) +		print_war("No validation layers."); +#endif +	r = vkCreateInstance(&ci, &ac, &inst); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a Vulkan instance\n"); +		pbreak(r); +	} +} + +static int proc_swap( +	Device_Vk* d, +	VkPhysicalDevice dev, +	Swap_Cap* sc +) { +	get_swap_cap(d, dev, d->surf, sc); +	return sc->fmt_count > 0 && sc->pm_count > 0; +} + +int proc_qf(Device_Vk* d, VkPhysicalDevice dev) { +	unsigned fc, i; +	int r = 0; +	VkBool32 press; +	VkQueueFamilyProperties* fs, * p; +	vkGetPhysicalDeviceQueueFamilyProperties( +		dev, +		&fc, +		0 +	); +	fs = (VkQueueFamilyProperties*)heap_alloc(d->heap, (int)fc * sizeof *fs); +	vkGetPhysicalDeviceQueueFamilyProperties( +		dev, +		&fc, +		fs +	); +	for (i = 0; i < fc; i++) { +		p = &fs[i]; +		vkGetPhysicalDeviceSurfaceSupportKHR( +			dev, +			i, +			d->surf, +			&press +		); +		if ( +			p->queueFlags & VK_QUEUE_GRAPHICS_BIT && +			press +		) { +			d->queue_index = (int)i; +			r = 1; +			goto fin; +		} +	} +fin: +	heap_free(d->heap, fs); +	return r; +} + +static int sup_exts(Device_Vk* d, VkPhysicalDevice dev) { +	int r = 0, i, f; +	unsigned c, j; +	int extc = sizeof *device_exts / sizeof *device_exts; +	VkExtensionProperties* avail; +	vkEnumerateDeviceExtensionProperties(dev, 0, &c, 0); +	avail = (VkExtensionProperties*)heap_alloc(d->heap, c * sizeof *avail); +	vkEnumerateDeviceExtensionProperties( +		dev, +		0, +		&c, +		avail +	); +	for (i = 0; i < extc; i++) { +		f = 0; +		for (j = 0; j < c; j++) { +			if (!strcmp(device_exts[i], avail[j].extensionName)) { +				f = 1; +				break; +			} +		} +		if (!f) goto fin; +	} +	r = 1; +fin: +	heap_free(d->heap, avail); +	return r; +} + +VkPhysicalDevice get_phys_dev(Device_Vk* d, Swap_Cap* sc) { +	unsigned dc, i; +	VkPhysicalDevice* devs, dev; +	vkEnumeratePhysicalDevices(d->inst, &dc, 0); +	if (!dc) { +		print_err( +			"Couldn't find any vulkan-capable graphics hardware.\n" +		); +		pbreak(400); +	} +	devs = (VkPhysicalDevice*)heap_alloc(d->heap, (int)dc * sizeof *devs); +	vkEnumeratePhysicalDevices(d->inst, &dc, devs); +	for (i = 0; i < dc; i++) { +		dev = devs[i]; +		if ( +			proc_swap(d, dev, sc) && +			proc_qf(d, dev) && +			sup_exts(d, dev) +		) { +			heap_free(d->heap, devs); +			return dev; +		} +		deinit_swap_cap(d, sc); +	} +	print_err("Couldn't find a suitable GPU.\n"); +	pbreak(401); +	heap_free(d->heap, devs); +	return 0; +} + +void Device_Vk::create_dev(Swap_Cap* swap_cap) { +	const float priority = 0.0f; +	VkDeviceQueueCreateInfo qi{}; +	VkDeviceCreateInfo di{}; +	VkPhysicalDeviceFeatures pdf{}; +	VkResult r; +	phys_dev = get_phys_dev(this, swap_cap); +	qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; +	qi.queueFamilyIndex = queue_index; +	qi.queueCount = 1; +	qi.pQueuePriorities = &priority; +	di.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; +	di.pQueueCreateInfos = &qi; +	di.queueCreateInfoCount = 1; +	di.pEnabledFeatures = &pdf; +	di.enabledExtensionCount = +		sizeof device_exts / sizeof *device_exts; +	di.ppEnabledExtensionNames = device_exts; +	di.pNext = 0; +	r = vkCreateDevice( +		phys_dev, +		&di, +		&ac, +		&dev +	); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a Vulkan device.\n"); +		pbreak(r); +	} +} + +void Device_Vk::init_internal() { +	const char* exts[16]; +	int ext_count = 0, i; +	gladLoaderLoadVulkan(0, 0, 0); +	textures.init(); +	texture_count = 1; +	find_exts(exts, ext_count); +	init_ac(); +	create_inst(exts, ext_count); +#ifdef DEBUG +	if (has_validation()) +		init_validation(); +#endif +	surf = app_create_vk_surface(app, inst); +	create_dev(&swap_cap); +	gladLoaderLoadVulkan(inst, phys_dev, dev); +	vkGetDeviceQueue(dev, (uint32_t)queue_index, 0, &queue); +	swapchain.init(*app, this); +	for (i = 0; i < max_contexts; i++) +		contexts[i].state = context_state_avail; +} + +void Device_Vk::deinit_internal() { +	swapchain.destroy(this); +	deinit_swap_cap(this, &swap_cap); +	app_destroy_vk_surface(app, inst, surf); +	vkDestroyDevice(dev, &ac); +#ifdef DEBUG +	destroy_dmesg( +		inst, +		msg, +		&ac +	); +#endif +	vkDestroyInstance(inst, &ac); +} + +void Device_Vk::on_resize_internal(int w, int h) { +	(void)w; +	(void)h; +	vkDeviceWaitIdle(dev); +	deinit_swap_cap(this, &swap_cap); +	get_swap_cap(this, phys_dev, surf, &swap_cap); +	swapchain.recreate(*app, this); +} + +Renderpass_Vk& Device_Vk::create_rpo(const Render_Pass& rp) { +	VkClearValue clear{}; +	clear.color.float32[0] = (float)rp.clear.r / 255.0f; +	clear.color.float32[1] = (float)rp.clear.g / 255.0f; +	clear.color.float32[2] = (float)rp.clear.b / 255.0f; +	clear.color.float32[3] = (float)rp.clear.a / 255.0f; +	Renderpass_Vk rpo; +	rpo.init_rp(this, rp); +	rpo.init_fb(this, rp); +	rpo.age = 0; +	rpo.clear = clear; +	rpo_cache[rp] = rpo; +	return rpo_cache[rp]; +} + +Renderpass_Vk& Device_Vk::get_rpo(const Render_Pass& rp) { +	auto rpo_index = rpo_cache.find(rp); +	if (rpo_index == rpo_cache.end()) +		return create_rpo(rp); +	return rpo_index->second; +} + +void Renderpass_Vk::destroy(Device_Vk* dev) { +	vkDestroyRenderPass(dev->dev, rpo, &dev->ac); +	vkDestroyFramebuffer(dev->dev, fbo, &dev->ac); +} + +void Device_Vk::collect_garbage() { +	for (auto i = rpo_cache.begin(); i != rpo_cache.end();) { +		auto& rp = i->second; +		rp.age++; +		if (rp.age > 3) { +			rp.destroy(this); +			i = rpo_cache.erase(i); +		} else ++i; +	} +} + +void Renderpass_Vk::init_rp( +	Device_Vk* dev, +	const Render_Pass& rp +) { +	VkRenderPassCreateInfo ri{}; +	VkAttachmentDescription ad{}; +	VkAttachmentReference ar{}; +	VkSubpassDescription sd{}; +	VkResult r; + +	ad.format = dev->swapchain.format.format; +	ad.samples = VK_SAMPLE_COUNT_1_BIT; +	ad.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; +	ad.storeOp = VK_ATTACHMENT_STORE_OP_STORE; +	ad.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; +	ad.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; +	ad.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; +	ad.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + +	ar.attachment = 0; +	ar.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + +	sd.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; +	sd.colorAttachmentCount = 1; +	sd.pColorAttachments = &ar; + +	ri.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; +	ri.attachmentCount = 1; +	ri.pAttachments = &ad; +	ri.subpassCount = 1; +	ri.pSubpasses = &sd; + +	r = vkCreateRenderPass(dev->dev, &ri, &dev->ac, &rpo); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a render pass\n"); +		pbreak(r); +	} +} + +void Renderpass_Vk::init_fb( +	Device_Vk* dev, +	const Render_Pass& rp +) { +	const Texture_Vk& texture = +		*(const Texture_Vk*)&dev->get_texture(rp.target); +	VkResult r; +	VkFramebufferCreateInfo fbi{}; +	fbi.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; +	fbi.renderPass = rpo; +	fbi.width = texture.w; +	fbi.height = texture.h; +	fbi.layers = 1; +	fbi.attachmentCount = 1; +	fbi.pAttachments = &texture.view; +	r = vkCreateFramebuffer(dev->dev, &fbi, &dev->ac, &fbo); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a framebuffer.\n"); +		pbreak(r); +	} +} + +static int get_image_count(const Swap_Cap& s) { +	const VkSurfaceCapabilitiesKHR& cap = s.cap; +	return cap.minImageCount + (cap.minImageCount < cap.maxImageCount); +} + +static VkExtent2D choose_swap_extent(const App& app, const VkSurfaceCapabilitiesKHR& cap) { +	VkExtent2D r = { (uint32_t)app.w, (uint32_t)app.h }; +	r.width  = std::min(r.width,  cap.maxImageExtent.width); +	r.height = std::min(r.height, cap.maxImageExtent.height); +	r.width  = std::max(r.width,  cap.minImageExtent.width); +	r.height = std::max(r.height, cap.minImageExtent.height); +	return r; +} + +static VkSurfaceFormatKHR choose_swap_format(const Swap_Cap& cap) { +	unsigned i; +	for (i = 0; i < cap.fmt_count; i++) { +		const auto& fmt = cap.fmts[i]; +		if ( +			fmt.format == VK_FORMAT_B8G8R8A8_SRGB && +			fmt.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR +		) return fmt; +	} +	print_err("Failed to find a surface that supports VK_FORMAT_B8G8R8A8_SRGB.\n"); +	return cap.fmts[0]; +} + +static VkPresentModeKHR choose_swap_mode(const Swap_Cap& cap, bool vsync) { +	(void)vsync; +	(void)cap; /* todo */ +	return VK_PRESENT_MODE_FIFO_KHR; +} + +static VkImageView make_view( +	Device_Vk* dev, +	VkImage image, +	VkFormat fmt, +	VkImageAspectFlagBits flags +) { +	VkImageViewCreateInfo vi{}; +	VkResult r; +	VkImageView view; +	vi.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; +	vi.image = image; +	vi.viewType = VK_IMAGE_VIEW_TYPE_2D; +	vi.format = fmt; +	vi.subresourceRange.aspectMask = flags; +	vi.subresourceRange.baseMipLevel = 0; +	vi.subresourceRange.levelCount = 1; +	vi.subresourceRange.baseArrayLayer = 0; +	vi.subresourceRange.layerCount = 1; +	r = vkCreateImageView(dev->dev, &vi, &dev->ac, &view); +	if (r != VK_SUCCESS) { +		print_err("Failed to make image view.\n"); +		pbreak((int)r); +	} +	return view; +} + +void Swapchain::init(const App& app, Device_Vk* dev) { +	swapchain = (VkSwapchainKHR)0; +	textures = 0; +	initr(app, dev); +} + +void Swapchain::initr(const App& app, Device_Vk* dev) { +	image_count = get_image_count(dev->swap_cap); +	size = choose_swap_extent(app, dev->swap_cap.cap); +	format = choose_swap_format(dev->swap_cap); +	mode = choose_swap_mode(dev->swap_cap, false); +	{ +		VkResult r; +		VkSwapchainCreateInfoKHR si{}; +		si.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, +		si.surface = dev->surf; +		si.minImageCount = image_count; +		si.imageFormat = format.format; +		si.imageColorSpace = format.colorSpace; +		si.imageExtent = size; +		si.imageArrayLayers = 1; +		si.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; +		si.preTransform = dev->swap_cap.cap.currentTransform; +		si.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; +		si.presentMode = mode; +		si.clipped = VK_TRUE; +		si.oldSwapchain = swapchain; +		si.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; +		r = vkCreateSwapchainKHR(dev->dev, &si, &dev->ac, &swapchain); +		if (r != VK_SUCCESS) { +			print_err("Failed to create swapchain.\n"); +			pbreak(r); +		} +	} +	textures = (Texture_Id*)heap_alloc(dev->heap, sizeof *textures * image_count); +	get_images(dev); +} + +void Swapchain::recreate(const App& app, Device_Vk* dev) { +	Swapchain old = *this; +	vkDeviceWaitIdle(dev->dev); +	initr(app, dev); +	old.destroy(dev); +} + +void Swapchain::get_images(Device_Vk* dev) { +	unsigned count; +	int i; +	VkImage* images = (VkImage*)heap_alloc( +		dev->heap, +		sizeof *images * image_count +	); +	Texture info{}; +	info.w = size.width; +	info.h = size.height; +	info.alias = true; +	vkGetSwapchainImagesKHR(dev->dev, swapchain, &count, images); +	assert(count == (unsigned)image_count); +	for (i = 0; i < image_count; i++) { +		VkImageView view = make_view(dev, +			images[i], +			format.format, +			VK_IMAGE_ASPECT_COLOR_BIT +		); +		textures[i] = dev->alloc_texture(images[i], view, info); +	} +	heap_free(dev->heap, images); +} + +void Swapchain::destroy(Device_Vk* dev) { +	int i; +	for (i = 0; i < image_count; i++) +		dev->destroy_texture(textures[i]); +	vkDestroySwapchainKHR(dev->dev, swapchain, &dev->ac); +	heap_free(dev->heap, textures); +	textures = 0; +} + +Device* Device::create(Arena* a, App* ap) { +	Device_Vk* d = (Device_Vk*)arena_alloc(a, sizeof *d); +	new(d) Device_Vk(); +	d->init(a, ap); +	return d; +} + +void Device::init(Arena* a, App* ap) { +	void* hm; +	arena = a; +	app = ap; +	hm = arena_alloc(a, device_heap_size); +	heap = (Heap*)arena_alloc(a, sizeof *heap); +	init_heap(heap, hm, device_heap_size); +	((Device_Vk*)this)->init_internal(); +} + +void Device::destroy() { +	((Device_Vk*)this)->deinit_internal(); +} + +void Device::on_resize() { +	((Device_Vk*)this)->on_resize_internal(app->w, app->h); +} + +void Device::begin_frame() { +	Device_Vk* dev = (Device_Vk*)this; +	dev->collect_garbage(); +	dev->current_ctx = (Context_Vk*)&acquire(); +	vkAcquireNextImageKHR( +		dev->dev, +		dev->swapchain.swapchain, +		UINT64_MAX, +		dev->current_ctx->semaphore, +		VK_NULL_HANDLE, +		&dev->backbuffer_index +	); +	dev->backbuffer_id = dev->swapchain.textures[dev->backbuffer_index]; +} + +void Device::submit(Context& ctx_) { +	Context_Vk* ctx = (Context_Vk*)&ctx_; +	Device_Vk* dev = (Device_Vk*)this; +	VkPipelineStageFlags stage = +		VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; +	VkSubmitInfo si{}; +	si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; +	si.waitSemaphoreCount = 1; +	si.pWaitSemaphores = &ctx->semaphore; +	si.pWaitDstStageMask = &stage; +	si.signalSemaphoreCount = 1; +	si.pSignalSemaphores = &ctx->semaphore; +	si.commandBufferCount = 1; +	si.pCommandBuffers = &ctx->cb; +	vkEndCommandBuffer(ctx->cb); +	vkQueueSubmit(dev->queue, 1, &si, ctx->fence); +	ctx->wait(*dev); +	ctx->release(); +} + +void Device::present() { +	Device_Vk* dev = (Device_Vk*)this; +	Context_Vk* ctx = dev->current_ctx; +	VkPresentInfoKHR pi{}; +	VkSemaphore s[1]; +	VkSwapchainKHR sw[1]; +	submit(*ctx); +	s[0] = ctx->semaphore; +	sw[0] = dev->swapchain.swapchain; +	pi.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; +	pi.waitSemaphoreCount = 1; +	pi.pWaitSemaphores = s; +	pi.swapchainCount = 1; +	pi.pSwapchains = sw; +	pi.pImageIndices = &dev->backbuffer_index; +	vkQueuePresentKHR(dev->queue, &pi); + +/*	print("%d\n", dev->heap->blocks); +	print("%d\n", dev->rpo_cache.size()); +	heap_defrag(dev->heap);*/ +} + +Texture_Id Device::get_backbuffer() { +	return ((Device_Vk*)this)->backbuffer_id; +} + +Texture& Device::get_texture(Texture_Id id) { +	return ((Device_Vk*)this)->textures[id]; +} + +Texture_Id Device_Vk::alloc_texture( +	VkImage img, +	VkImageView view,  +	const Texture& copy +) { +	Texture_Id id = texture_count++; +	Texture_Vk tex; +	assert(id < max_textures); +	memcpy(&tex, ©, sizeof(Texture)); +	tex.image = img; +	tex.view = view; +	textures.set(id, tex); +	return id; +} + +void Device::destroy_texture(Texture_Id id) { +	Device_Vk* dev = (Device_Vk*)this; +	Texture_Vk& tex = dev->textures[id]; +	if (!tex.alias) +		vkDestroyImage(dev->dev, tex.image, &dev->ac); +	vkDestroyImageView(dev->dev, tex.view, &dev->ac); +} + +void Context::wait(Device& d) { +	Context_Vk* ctx = (Context_Vk*)this; +	Device_Vk* dev = (Device_Vk*)&d; +	vkWaitForFences( +		dev->dev, +		1, +		&ctx->fence, +		VK_TRUE, +		UINT64_MAX +	); +} + +void Context::submit( +	Device& d, +	const Draw& draw, +	const Pipeline& p, +	const Render_Pass& rp +) { +	Device_Vk* dev = (Device_Vk*)&d; +	(void)draw; +	(void)p; +	(void)rp; +	(void)dev; +	assert(0); +	/* todo */ +} + +void Context::submit( +	Device& d, +	const Draw* draws, +	int count, +	const Pipeline& p, +	const Render_Pass& rp +) { +	Device_Vk* dev = (Device_Vk*)&d; +	(void)draws; +	(void)count; +	(void)p; +	(void)rp; +	(void)dev; +	assert(0); +	/* todo */ +} + +void Context::submit(Device& d, const Render_Pass& rp) { +	Device_Vk* dev = (Device_Vk*)&d; +	Context_Vk* ctx = (Context_Vk*)this; +	Renderpass_Vk& rpo = dev->get_rpo(rp); +	VkRenderPassBeginInfo rpbi{}; +	rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; +	rpbi.renderPass = rpo.rpo; +	rpbi.framebuffer = rpo.fbo; +	rpbi.renderArea.extent = dev->swapchain.size; +	rpbi.clearValueCount = 1; +	rpbi.pClearValues = &rpo.clear; +	vkCmdBeginRenderPass( +		ctx->cb, +		&rpbi, +		VK_SUBPASS_CONTENTS_INLINE +	); +	vkCmdEndRenderPass(ctx->cb); +	rpo.on_submit(); +} + +void Context_Vk::init_pool(Device_Vk* dev) { +	VkCommandPoolCreateInfo pi{}; +	VkResult r; +	pi.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; +	pi.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; +	pi.queueFamilyIndex = (uint32_t)dev->queue_index; +	r = vkCreateCommandPool(dev->dev, &pi, &dev->ac, &pool); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a command pool.\n"); +		pbreak(r); +	} +} + +void Context_Vk::init_cb(Device_Vk* dev) { +	VkCommandBufferAllocateInfo ci{}; +	VkResult r; +	ci.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; +	ci.commandPool = pool; +	ci.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; +	ci.commandBufferCount = 1; +	r = vkAllocateCommandBuffers(dev->dev, &ci, &cb); +	if (r != VK_SUCCESS) { +		print_err("Failed to allocate a command buffer.\n"); +		pbreak(r); +	} +} + +void Context_Vk::init_sync(Device_Vk* dev) { +	VkFenceCreateInfo fi{}; +	VkSemaphoreCreateInfo si{}; +	VkResult r; +	fi.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; +	fi.flags = VK_FENCE_CREATE_SIGNALED_BIT; +	r = vkCreateFence(dev->dev, &fi, &dev->ac, &fence); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a fence.\n"); +		pbreak(r); +	} +	si.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; +	r = vkCreateSemaphore(dev->dev, &si, &dev->ac, &semaphore); +	if (r != VK_SUCCESS) { +		print_err("Failed to create a semaphore.\n"); +		pbreak(r); +	} +} + +void Context_Vk::init(Device_Vk* dev) { +	init_pool(dev); +	init_cb(dev); +	init_sync(dev); +	state |= context_state_init; +} + +void Context_Vk::begin_record(Device_Vk* dev) { +	VkCommandBufferBeginInfo bi{}; +	bi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; +	vkResetFences(dev->dev, 1, &fence); +	vkResetCommandBuffer(cb, 0); +	vkBeginCommandBuffer(cb, &bi); +} + +Context_Vk& Context_Vk::acquire(Device_Vk* dev) { +	if (~state & context_state_init) +		init(dev); +	state &= ~context_state_avail; +	begin_record(dev); +	return *this; +} + +void Context_Vk::release() { +	state |= context_state_avail; +} + +Context& Device::acquire() { +	Device_Vk* vk = (Device_Vk*)this; +	int i; +	for (i = 0; i < max_contexts; i++) { +		if (vk->contexts[i].state & context_state_avail) +			return vk->contexts[i].acquire(vk); +	} +	print_err("Too many active contexts!\n"); +	print("Probably a submit was missed.\n"); +	pbreak(10000); +	return vk->contexts[0]; +} + +Context& Device::get_ctx() { +	Device_Vk* vk = (Device_Vk*)this; +	return *vk->current_ctx; +} + +/* todo proper asset manager which will load this stuff */ +bool Shader_Vk::init(Device_Vk* dev, FILE* f) { +	char magic[4]; +	int attr_count, target_count, i; +	fread(magic, 4, 1, f); +	if ( +		magic[0] != 'C' || +		magic[1] != 'S' || +		magic[2] != 'H' || +		magic[3] != '2' +	) return false; +	fread(&type, 4, 1, f); +	fread(&attr_count, 4, 1, f); +	fread(&target_count, 4, 1, f); +	fseek(f, 32 * attr_count + 32 * target_count, SEEK_CUR); +	for (i = 0; i < shader_type_count; i++) { +		int o, s; +		fread(&o, 4, 1, f); +		fread(&s, 4, 1, f); +		if (o) { +			bool r; +			int before = ftell(f); +			char* buf = (char*)heap_alloc(dev->heap, s); +			fseek(f, o, SEEK_SET); +			fread(buf, 1, s, f); +			r = init_module(dev, i, buf, s); +			heap_free(dev->heap, buf); +			fseek(f, before, SEEK_SET); +			if (!r) return false; +		} else { +			modules[i] = VK_NULL_HANDLE; +		} +	} +	return true; +} + +bool Shader_Vk::init_module( +	Device_Vk* dev, +	int stage, +	char* buf, +	int size +) { +	VkResult r; +	VkShaderModule m; +	VkShaderModuleCreateInfo mi{}; +	mi.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; +	mi.codeSize = size; +	mi.pCode = (uint32_t*)buf; +	r = vkCreateShaderModule(dev->dev, &mi, &dev->ac, &m); +	modules[stage] = m; +	return r == VK_SUCCESS; +} + +void Shader_Vk::destroy_internal(Device_Vk* dev) { +	int i; +	for (i = 0; i < shader_type_count; i++) +		if (modules[i]) +			vkDestroyShaderModule(dev->dev, modules[i], &dev->ac); +} + +void Shader::destroy(Device* dev) { +	((Shader_Vk*)this)->destroy_internal((Device_Vk*)dev); +} + +Shader* Device::load_shader(const char* fname) { +	FILE* f = fopen(fname, "rb"); +	Shader_Vk* s; +	bool r; +	if (!f) return 0; +	s = (Shader_Vk*)heap_alloc(heap, sizeof *s); +	r = s->init((Device_Vk*)this, f); +	fclose(f); +	if (!r) { +		heap_free(heap, s); +		return 0; +	} +	return s; +} diff --git a/video.hpp b/video.hpp new file mode 100644 index 0000000..6878d77 --- /dev/null +++ b/video.hpp @@ -0,0 +1,104 @@ +#ifndef video_hpp +#define video_hpp + +#include <stdint.h> + +struct App; +struct Arena; +struct Heap; + +typedef uint32_t Texture_Id; +typedef uint32_t Buffer_Id; + +struct Pipeline { + +}; + +struct Colour { +	uint8_t r, g, b, a; +}; + +struct Render_Pass { +	Texture_Id target; +	Colour clear; + +	bool operator==(const Render_Pass& other) const { +		int size = sizeof *this, i; +		uint8_t* bba = (uint8_t*)this; +		uint8_t* bbb = (uint8_t*)&other; +		for (i = 0; i < size; i++) +			if (*bba != *bbb) return false; +		return true; +	} +}; + +struct Draw { + +}; + +struct Pipeline_Builder { +	Arena* arena; +	Render_Pass* pass; + +	Pipeline_Builder(Arena* arena); + +	void begin_rp(); +	void rp_target(Texture_Id id, Colour clear_colour); +	Render_Pass& build_rp(); +	void validate_rp(); +}; + +struct Texture { +	int w, h; +	bool alias; +}; + +struct Context; +struct Shader; +struct Device { +	Arena* arena; +	Heap* heap; +	App* app; + +	static Device* create(Arena* a, App* ap); +	void init(Arena* a, App* ap); +	void destroy(); + +	void on_resize(); + +	void begin_frame(); +	void submit(Context& ctx); +	void present(); + +	Context& acquire(); +	Context& get_ctx(); +	Texture_Id get_backbuffer(); +	Texture& get_texture(Texture_Id id); +	void destroy_texture(Texture_Id id); + +	Shader* load_shader(const char* fname); +}; + +struct Context { +	void wait(Device& d); +	void submit( +		Device& d, +		const Draw& draw, +		const Pipeline& p, +		const Render_Pass& rp +	); +	void submit( +		Device& d, +		const Draw* draws, +		int count, +		const Pipeline& p, +		const Render_Pass& rp +	); +	void submit(Device& d, const Render_Pass& rp); +}; + +struct Shader { +	void destroy(Device* dev); +}; + +#endif |