您的位置:首页 > 编程语言 > C语言/C++

Vulkan示例

2016-05-08 12:17 411 查看
更新日期: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实例
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Vulkan 示例