Vulkan示例

更新日期:2016年5月8日

更新到了Device,若想使用这些代码请自行下载Vulkan SDK并链接库,或者加入QQ群:308637496,我把资料已经传到QQ群里了

//win32平台
#define VK_USE_PLATFORM_WIN32_KHR

//Vulkan相关头文件
#include 
#include 

//错误处理
#include 

//标准IO流
#include 

//Vulkan实例
VkInstance				Instance;

//设备
VkPhysicalDevice		PhysicalDevice;
VkDevice				Device;

//队列家族
uint32_t				QueueFamilyIndex;
VkQueueFamilyProperties	QueueFamilyProperties;

//错误
VkResult Err;

//使用std命名空间
using namespace std;

//初始化Vulkan
void initVulkan()
{
	/*获取实例扩展*/

	//扩展信息
	uint32_t				InstanceExtensionCount = 0;
	VkExtensionProperties*	ExtensionProperties;

	//获取扩展总数
	Err = vkEnumerateInstanceExtensionProperties(NULL, &InstanceExtensionCount, NULL);

	assert(!Err);

	//获取扩展列表
	ExtensionProperties		= new VkExtensionProperties[InstanceExtensionCount];

	Err = vkEnumerateInstanceExtensionProperties(NULL, &InstanceExtensionCount, ExtensionProperties);

	assert(!Err);

	//启用的实例扩展
	char* EnableExtensionNameArray[2];

	for (uint32_t i = 0; i < InstanceExtensionCount; i++)
	{
		//surface扩展
		if (strcmp(ExtensionProperties[i].extensionName, VK_KHR_SURFACE_EXTENSION_NAME) == 0)
		{
			EnableExtensionNameArray[0] = ExtensionProperties[i].extensionName;
		}
		//win32 surface扩展
		else if (strcmp(ExtensionProperties[i].extensionName, VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
		{
			EnableExtensionNameArray[1] = ExtensionProperties[i].extensionName;
		}
	}

	/*创建实例*/

	//程序信息
	VkApplicationInfo		ApplicationInfo;

	ApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
	ApplicationInfo.pNext = NULL;
	ApplicationInfo.apiVersion = 0;
	ApplicationInfo.applicationVersion = 1;
	ApplicationInfo.engineVersion = 0;
	ApplicationInfo.pApplicationName = "测试工程";
	ApplicationInfo.pEngineName = "GScience";

	//实例创建信息
	VkInstanceCreateInfo	InstanceCreateInfo;

	InstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
	InstanceCreateInfo.pNext = NULL;
	InstanceCreateInfo.pApplicationInfo = &ApplicationInfo;
	InstanceCreateInfo.enabledLayerCount = 0;
	InstanceCreateInfo.enabledExtensionCount = 2;
	InstanceCreateInfo.ppEnabledExtensionNames = EnableExtensionNameArray;

	//创建实例
	Err = vkCreateInstance(&InstanceCreateInfo, NULL, &Instance);

	//回收资源
	delete[](ExtensionProperties);

	assert(!Err);
}

//初始化Device(包含创建Queue)
void initDevice()
{
	/*获取第一个物理设备并且显示设备属性*/

	//获取物理设备列表
	uint32_t					PhysicalDeviceCount;
	VkPhysicalDevice*			PhysicalDevices;

	//获取设备总数
	Err = vkEnumeratePhysicalDevices(Instance, &PhysicalDeviceCount, NULL);

	assert(!Err);

	//是否有设备?
	if (PhysicalDeviceCount != 0)
	{
		//创建数组
		PhysicalDevices = new VkPhysicalDevice[PhysicalDeviceCount];

		//获取设备列表
		Err = vkEnumeratePhysicalDevices(Instance, &PhysicalDeviceCount, PhysicalDevices);

		assert(!Err);
		
		//我们用第一个物理设备就好了
		PhysicalDevice = PhysicalDevices[0];

		//回收资源
		delete[](PhysicalDevices);
	}
	
	//获取设备属性
	VkPhysicalDeviceProperties	PhysicalDeviceProperties;

	vkGetPhysicalDeviceProperties(PhysicalDevice, &PhysicalDeviceProperties);

	//显示设备信息
	cout << "PhysicalDevice Info:" << std::endl
		 << "Device Name:" << PhysicalDeviceProperties.deviceName << std::endl
		 << "Driver Version:" << PhysicalDeviceProperties.driverVersion << std::endl
		 << "API Version:" << PhysicalDeviceProperties.apiVersion << std::endl
	     << "Device Type:" << PhysicalDeviceProperties.deviceType << std::endl;

	//获取设备队列家族属性
	VkQueueFamilyProperties*	QueueFamilysProperties;
	uint32_t					QueueFamilyCount;

	/*获取该设备的队列家族列表并且找到支持渲染的队列家族*/

	//获取队列家族总数
	vkGetPhysicalDeviceQueueFamilyProperties(PhysicalDevice, &QueueFamilyCount, NULL);

	if (QueueFamilyCount > 0)
	{
		//创建数组
		QueueFamilysProperties = new VkQueueFamilyProperties[QueueFamilyCount];

		//获取队列家族属性列表
		vkGetPhysicalDeviceQueueFamilyProperties(PhysicalDevice, &QueueFamilyCount, QueueFamilysProperties);

		//获取支持渲染的队列家族
		for (int i = 0; i < QueueFamilyCount; i++)
		{
			if (QueueFamilysProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
			{
				QueueFamilyIndex = i;
				QueueFamilyProperties = QueueFamilysProperties[i];

				break;
			}
		}
		//回收资源
		delete[](QueueFamilysProperties);
	}

	/*获取设备扩展*/

	//获取物理设备扩展
	uint32_t				DeviceExtensionCount;
	VkExtensionProperties*	DeviceExtensionProperties;

	//获取扩展总数
	VkResult Err = vkEnumerateDeviceExtensionProperties(PhysicalDevice, NULL, &DeviceExtensionCount, NULL);

	assert(!Err);

	//获取扩展列表
	DeviceExtensionProperties	= new VkExtensionProperties[DeviceExtensionCount];

	Err = vkEnumerateDeviceExtensionProperties(PhysicalDevice, NULL, &DeviceExtensionCount, DeviceExtensionProperties);

	assert(!Err);

	//启用的实例扩展
	char* EnableExtensionNameArray[1];

	for (uint32_t i = 0; i < DeviceExtensionCount; i++)
	{
		if (strcmp(VK_KHR_SWAPCHAIN_EXTENSION_NAME, DeviceExtensionProperties[i].extensionName) == 0)
		{
			EnableExtensionNameArray[0] = DeviceExtensionProperties[i].extensionName;

			break;
		}
	}

	/*创建逻辑设备*/

	//设备的队列创建信息

	//Queue的优先级
	float QueuePriorities[1] = { 0.0 };

	VkDeviceQueueCreateInfo DeviceQueueCreateInfo;

	DeviceQueueCreateInfo.flags = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
	DeviceQueueCreateInfo.pNext = NULL;
	DeviceQueueCreateInfo.queueFamilyIndex = QueueFamilyIndex;
	DeviceQueueCreateInfo.queueCount = 1;
	DeviceQueueCreateInfo.pQueuePriorities = QueuePriorities;

	//设置设备创建信息
	VkDeviceCreateInfo DeviceCreateInfo;

	DeviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
	DeviceCreateInfo.pNext = NULL;
	DeviceCreateInfo.queueCreateInfoCount = 1;
	DeviceCreateInfo.pQueueCreateInfos = &DeviceQueueCreateInfo;
	DeviceCreateInfo.enabledLayerCount = 0;
	DeviceCreateInfo.enabledExtensionCount = 1;
	DeviceCreateInfo.ppEnabledExtensionNames = EnableExtensionNameArray;
	DeviceCreateInfo.pEnabledFeatures = NULL;;

	Err = vkCreateDevice(PhysicalDevice, &DeviceCreateInfo, NULL, &Device);

	assert(!Err);

	//回收资源
	delete[](DeviceExtensionProperties);
}
int main()
{
	initVulkan();
	initDevice();

	return 0;
}

你可能感兴趣的:(Vulkan教程)