/* WARNING: This is auto-generated file. Do not modify, since changes will
 * be lost! Modify the generating script instead.
 */
namespace vk
{
template<typename T> VkObjectType getObjectType	(void);
template<> inline VkObjectType	getObjectType<VkBuffer>							(void) { return VK_OBJECT_TYPE_BUFFER;							}
template<> inline VkObjectType	getObjectType<VkImage>							(void) { return VK_OBJECT_TYPE_IMAGE;							}
template<> inline VkObjectType	getObjectType<VkInstance>						(void) { return VK_OBJECT_TYPE_INSTANCE;						}
template<> inline VkObjectType	getObjectType<VkPhysicalDevice>					(void) { return VK_OBJECT_TYPE_PHYSICAL_DEVICE;					}
template<> inline VkObjectType	getObjectType<VkDevice>							(void) { return VK_OBJECT_TYPE_DEVICE;							}
template<> inline VkObjectType	getObjectType<VkQueue>							(void) { return VK_OBJECT_TYPE_QUEUE;							}
template<> inline VkObjectType	getObjectType<VkSemaphore>						(void) { return VK_OBJECT_TYPE_SEMAPHORE;						}
template<> inline VkObjectType	getObjectType<VkCommandBuffer>					(void) { return VK_OBJECT_TYPE_COMMAND_BUFFER;					}
template<> inline VkObjectType	getObjectType<VkFence>							(void) { return VK_OBJECT_TYPE_FENCE;							}
template<> inline VkObjectType	getObjectType<VkDeviceMemory>					(void) { return VK_OBJECT_TYPE_DEVICE_MEMORY;					}
template<> inline VkObjectType	getObjectType<VkEvent>							(void) { return VK_OBJECT_TYPE_EVENT;							}
template<> inline VkObjectType	getObjectType<VkQueryPool>						(void) { return VK_OBJECT_TYPE_QUERY_POOL;						}
template<> inline VkObjectType	getObjectType<VkBufferView>						(void) { return VK_OBJECT_TYPE_BUFFER_VIEW;						}
template<> inline VkObjectType	getObjectType<VkImageView>						(void) { return VK_OBJECT_TYPE_IMAGE_VIEW;						}
template<> inline VkObjectType	getObjectType<VkShaderModule>					(void) { return VK_OBJECT_TYPE_SHADER_MODULE;					}
template<> inline VkObjectType	getObjectType<VkPipelineCache>					(void) { return VK_OBJECT_TYPE_PIPELINE_CACHE;					}
template<> inline VkObjectType	getObjectType<VkPipelineLayout>					(void) { return VK_OBJECT_TYPE_PIPELINE_LAYOUT;					}
template<> inline VkObjectType	getObjectType<VkPipeline>						(void) { return VK_OBJECT_TYPE_PIPELINE;						}
template<> inline VkObjectType	getObjectType<VkRenderPass>						(void) { return VK_OBJECT_TYPE_RENDER_PASS;						}
template<> inline VkObjectType	getObjectType<VkDescriptorSetLayout>			(void) { return VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT;			}
template<> inline VkObjectType	getObjectType<VkSampler>						(void) { return VK_OBJECT_TYPE_SAMPLER;							}
template<> inline VkObjectType	getObjectType<VkDescriptorSet>					(void) { return VK_OBJECT_TYPE_DESCRIPTOR_SET;					}
template<> inline VkObjectType	getObjectType<VkDescriptorPool>					(void) { return VK_OBJECT_TYPE_DESCRIPTOR_POOL;					}
template<> inline VkObjectType	getObjectType<VkFramebuffer>					(void) { return VK_OBJECT_TYPE_FRAMEBUFFER;						}
template<> inline VkObjectType	getObjectType<VkCommandPool>					(void) { return VK_OBJECT_TYPE_COMMAND_POOL;					}
template<> inline VkObjectType	getObjectType<VkSamplerYcbcrConversion>			(void) { return VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION;		}
template<> inline VkObjectType	getObjectType<VkDescriptorUpdateTemplate>		(void) { return VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE;		}
template<> inline VkObjectType	getObjectType<VkSurfaceKHR>						(void) { return VK_OBJECT_TYPE_SURFACE_KHR;						}
template<> inline VkObjectType	getObjectType<VkSwapchainKHR>					(void) { return VK_OBJECT_TYPE_SWAPCHAIN_KHR;					}
template<> inline VkObjectType	getObjectType<VkDisplayKHR>						(void) { return VK_OBJECT_TYPE_DISPLAY_KHR;						}
template<> inline VkObjectType	getObjectType<VkDisplayModeKHR>					(void) { return VK_OBJECT_TYPE_DISPLAY_MODE_KHR;				}
template<> inline VkObjectType	getObjectType<VkDeferredOperationKHR>			(void) { return VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR;			}
template<> inline VkObjectType	getObjectType<VkDebugReportCallbackEXT>			(void) { return VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT;		}
template<> inline VkObjectType	getObjectType<VkCuModuleNVX>					(void) { return VK_OBJECT_TYPE_CU_MODULE_NVX;					}
template<> inline VkObjectType	getObjectType<VkCuFunctionNVX>					(void) { return VK_OBJECT_TYPE_CU_FUNCTION_NVX;					}
template<> inline VkObjectType	getObjectType<VkDebugUtilsMessengerEXT>			(void) { return VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT;		}
template<> inline VkObjectType	getObjectType<VkValidationCacheEXT>				(void) { return VK_OBJECT_TYPE_VALIDATION_CACHE_EXT;			}
template<> inline VkObjectType	getObjectType<VkAccelerationStructureNV>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV;		}
template<> inline VkObjectType	getObjectType<VkPerformanceConfigurationINTEL>	(void) { return VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL;	}
template<> inline VkObjectType	getObjectType<VkIndirectCommandsLayoutNV>		(void) { return VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV;		}
template<> inline VkObjectType	getObjectType<VkPrivateDataSlotEXT>				(void) { return VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT;			}
template<> inline VkObjectType	getObjectType<VkAccelerationStructureKHR>		(void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;		}
template<> inline VkObjectType	getObjectType<VkVideoSessionKHR>				(void) { return VK_OBJECT_TYPE_VIDEO_SESSION_KHR;				}
template<> inline VkObjectType	getObjectType<VkVideoSessionParametersKHR>		(void) { return VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR;	}
}
