Vulkan示例

来源:互联网 发布:javascript 调用堆栈 编辑:程序博客网 时间:2024/05/16 21:48

更新日期:2016年5月8日

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

//win32平台#define VK_USE_PLATFORM_WIN32_KHR//Vulkan相关头文件#include <vulkan/vulkan.h>#include <vulkan/vk_sdk_platform.h>//错误处理#include <assert.h>//标准IO流#include <iostream>//Vulkan实例VkInstanceInstance;//设备VkPhysicalDevicePhysicalDevice;VkDeviceDevice;//队列家族uint32_tQueueFamilyIndex;VkQueueFamilyPropertiesQueueFamilyProperties;//错误VkResult Err;//使用std命名空间using namespace std;//初始化Vulkanvoid initVulkan(){/*获取实例扩展*///扩展信息uint32_tInstanceExtensionCount = 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;}}/*创建实例*///程序信息VkApplicationInfoApplicationInfo;ApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;ApplicationInfo.pNext = NULL;ApplicationInfo.apiVersion = 0;ApplicationInfo.applicationVersion = 1;ApplicationInfo.engineVersion = 0;ApplicationInfo.pApplicationName = "测试工程";ApplicationInfo.pEngineName = "GScience";//实例创建信息VkInstanceCreateInfoInstanceCreateInfo;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_tPhysicalDeviceCount;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);}//获取设备属性VkPhysicalDevicePropertiesPhysicalDeviceProperties;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_tQueueFamilyCount;/*获取该设备的队列家族列表并且找到支持渲染的队列家族*///获取队列家族总数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_tDeviceExtensionCount;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;}

0 0