portability/native/test.cpp

157 lines
6.2 KiB
C++
Raw Normal View History

2017-11-07 14:33:36 +11:00
/// Sample code adopted from https://github.com/LunarG/VulkanSamples
2017-09-07 12:01:58 +10:00
#include <vulkan/vulkan.h>
2017-09-07 11:34:41 +10:00
#include <assert.h>
#include <stdio.h>
2017-11-23 10:02:09 +11:00
extern "C" VkSurfaceKHR vkCreateSurfaceGFX(VkInstance);
2017-11-14 14:55:43 +11:00
int main() {
2017-09-07 11:34:41 +10:00
printf("starting the portability test\n");
VkInstance instance;
2017-11-23 10:02:09 +11:00
VkResult res = (VkResult)0;
2017-11-07 14:46:57 +11:00
unsigned int i;
2017-11-14 14:55:43 +11:00
VkInstanceCreateInfo inst_info = {};
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
2017-09-07 11:34:41 +10:00
res = vkCreateInstance(&inst_info, NULL, &instance);
if (res == VK_ERROR_INCOMPATIBLE_DRIVER) {
printf("cannot find a compatible Vulkan ICD\n");
2017-09-07 11:34:41 +10:00
return -1;
} else if (res) {
printf("unknown error\n");
2017-09-07 11:34:41 +10:00
return -1;
}
2017-11-14 14:55:43 +11:00
VkSurfaceKHR surface = vkCreateSurfaceGFX(instance);
printf("\tvkCreateSurfaceGFX\n");
2017-09-13 02:27:01 +10:00
uint32_t adapter_count = 1;
2017-09-07 11:34:41 +10:00
VkPhysicalDevice physical_devices[1] = {};
2017-09-13 02:27:01 +10:00
res = vkEnumeratePhysicalDevices(instance, &adapter_count, physical_devices);
printf("\tvkEnumeratePhysicalDevices: res=%d count=%d\n", res, adapter_count);
assert(!res && adapter_count);
2017-09-07 11:34:41 +10:00
2017-09-13 02:27:01 +10:00
VkQueueFamilyProperties queue_family_properties[5];
uint32_t queue_family_count = sizeof(queue_family_properties) / sizeof(VkQueueFamilyProperties);
vkGetPhysicalDeviceQueueFamilyProperties(physical_devices[0], &queue_family_count, queue_family_properties);
printf("\tvkGetPhysicalDeviceQueueFamilyProperties: count=%d\n", queue_family_count);
assert(queue_family_count);
int queue_family_index = -1;
2017-11-07 14:46:57 +11:00
for (i = 0; i < queue_family_count; i++) {
2017-11-15 03:19:33 +11:00
VkBool32 supports_present = 0;
vkGetPhysicalDeviceSurfaceSupportKHR(physical_devices[0], i, surface, &supports_present);
if ((queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && supports_present) {
2017-09-13 02:27:01 +10:00
queue_family_index = i;
break;
}
}
printf("\tusing queue family index %d\n", queue_family_index);
assert(queue_family_index >= 0);
2017-11-15 03:19:33 +11:00
VkSurfaceFormatKHR surfFormats[20];
uint32_t formatCount = sizeof(surfFormats) / sizeof(surfFormats[0]);
res = vkGetPhysicalDeviceSurfaceFormatsKHR(physical_devices[0], surface, &formatCount, surfFormats);
printf("\tvkGetPhysicalDeviceSurfaceFormatsKHR: res=%d, count=%d\n", res, formatCount);
assert(!res);
VkSurfaceCapabilitiesKHR surfCapabilities;
res = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_devices[0], surface, &surfCapabilities);
assert(!res);
VkPresentModeKHR presentModes[10];
uint32_t presentModeCount = sizeof(presentModes) / sizeof(presentModes[0]);
res = vkGetPhysicalDeviceSurfacePresentModesKHR(physical_devices[0], surface, &presentModeCount, presentModes);
printf("\tvkGetPhysicalDeviceSurfacePresentModesKHR: res=%d, count=%d\n", res, presentModeCount);
assert(!res);
VkExtent2D swapchainExtent = surfCapabilities.currentExtent;
VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR;
// Determine the number of VkImage's to use in the swap chain.
// We need to acquire only 1 presentable image at at time.
// Asking for minImageCount images ensures that we can acquire
// 1 presentable image as long as we present it before attempting
// to acquire another.
uint32_t desiredNumberOfSwapChainImages = surfCapabilities.minImageCount;
VkSurfaceTransformFlagBitsKHR preTransform;
if (surfCapabilities.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) {
preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
} else {
preTransform = surfCapabilities.currentTransform;
}
VkCompositeAlphaFlagBitsKHR compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
/*VkSwapchainCreateInfoKHR swapchain_ci = {0};
swapchain_ci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
swapchain_ci.surface = info.surface;
swapchain_ci.minImageCount = desiredNumberOfSwapChainImages;
swapchain_ci.imageFormat = info.format;
swapchain_ci.imageExtent.width = swapchainExtent.width;
swapchain_ci.imageExtent.height = swapchainExtent.height;
swapchain_ci.preTransform = preTransform;
swapchain_ci.compositeAlpha = compositeAlpha;
swapchain_ci.imageArrayLayers = 1;
swapchain_ci.presentMode = swapchainPresentMode;
swapchain_ci.oldSwapchain = VK_NULL_HANDLE;
swapchain_ci.clipped = true;
swapchain_ci.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
swapchain_ci.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;*/
2017-09-13 02:27:01 +10:00
VkDeviceQueueCreateInfo queue_info = {};
float queue_priorities[1] = {0.0};
queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queue_info.queueCount = 1;
queue_info.pQueuePriorities = queue_priorities;
VkDeviceCreateInfo device_info = {};
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_info.queueCreateInfoCount = 1;
device_info.pQueueCreateInfos = &queue_info;
VkDevice device = 0;
res = vkCreateDevice(physical_devices[0], &device_info, NULL, &device);
printf("\tvkCreateDevice: res=%d\n", res);
assert(!res);
2017-11-07 14:33:36 +11:00
VkCommandPool cmd_pool = 0;
VkCommandPoolCreateInfo cmd_pool_info = {};
cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
cmd_pool_info.pNext = NULL;
cmd_pool_info.queueFamilyIndex = queue_family_index;
cmd_pool_info.flags = 0;
res = vkCreateCommandPool(device, &cmd_pool_info, NULL, &cmd_pool);
printf("\tvkCreateCommandPool: res=%d\n", res);
assert(!res);
VkCommandBuffer cmd_buffer = 0;
VkCommandBufferAllocateInfo cmd_alloc_info;
cmd_alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
cmd_alloc_info.pNext = NULL;
cmd_alloc_info.commandPool = cmd_pool;
cmd_alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmd_alloc_info.commandBufferCount = 1;
res = vkAllocateCommandBuffers(device, &cmd_alloc_info, &cmd_buffer);
printf("\tvkAllocateCommandBuffers: res=%d\n", res);
assert(!res);
// Some work...
vkFreeCommandBuffers(device, cmd_pool, 1, &cmd_buffer);
vkDestroyCommandPool(device, cmd_pool, NULL);
2017-11-14 14:55:43 +11:00
vkDestroySurfaceKHR(instance, surface, NULL);
2017-09-13 02:27:01 +10:00
vkDestroyDevice(device, NULL);
2017-09-07 11:34:41 +10:00
vkDestroyInstance(instance, NULL);
2017-09-07 11:34:41 +10:00
printf("done.\n");
return 0;
}