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;
}
更新到了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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性