Files
VulkanDriver/test/c/main.c

109 lines
3.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define VK_NO_PROTOTYPES
#include <vulkan/vulkan_core.h>
#include <unistd.h>
#include <dlfcn.h>
#ifndef LIBVK
#define LIBVK "vulkan"
#endif
#define VOLK_IMPLEMENTATION
#include <volk.h>
#define CheckVk(x) \
do { \
if((x) != VK_SUCCESS) \
{ \
fprintf(stderr, "Vulkan call failed %d\n", (x)); \
abort(); \
} \
} while(0)
int main(void)
{
volkInitialize();
void* lib = dlopen("./zig-out/lib/lib" LIBVK ".so", RTLD_NOW | RTLD_LOCAL);
if(!lib)
{
fprintf(stderr, "Could not open driver lib: %s\n", dlerror());
exit(EXIT_FAILURE);
}
puts("openned ./zig-out/lib/lib" LIBVK ".so");
VkDirectDriverLoadingInfoLUNARG direct_loading_info = {};
direct_loading_info.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
direct_loading_info.pfnGetInstanceProcAddr = (PFN_vkGetInstanceProcAddrLUNARG)(dlsym(lib, "vk_icdGetInstanceProcAddr"));
VkDirectDriverLoadingListLUNARG direct_driver_list = {};
direct_driver_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
direct_driver_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG;
direct_driver_list.driverCount = 1;
direct_driver_list.pDrivers = &direct_loading_info;
const char* extensions[] = { VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME };
VkInstanceCreateInfo instance_create_info = {};
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instance_create_info.pApplicationInfo = NULL;
instance_create_info.enabledExtensionCount = 1;
instance_create_info.ppEnabledExtensionNames = extensions;
instance_create_info.pNext = &direct_driver_list;
VkInstance instance = VK_NULL_HANDLE;
CheckVk(vkCreateInstance(&instance_create_info, NULL, &instance));
volkLoadInstance(instance);
uint32_t count;
vkEnumeratePhysicalDevices(instance, &count, NULL);
VkPhysicalDevice* physical_devices = (VkPhysicalDevice*)calloc(count, sizeof(VkPhysicalDevice));
vkEnumeratePhysicalDevices(instance, &count, physical_devices);
VkPhysicalDeviceProperties props;
vkGetPhysicalDeviceProperties(physical_devices[0], &props);
printf("VkPhysicalDevice name %s\n", props.deviceName);
VkDeviceQueueCreateInfo queue_create_infos = {0};
queue_create_infos.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queue_create_infos.queueFamilyIndex = 1;
queue_create_infos.queueCount = 1;
VkDeviceCreateInfo device_create_info = {0};
device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_create_info.queueCreateInfoCount = 1;
device_create_info.pQueueCreateInfos = &queue_create_infos;
VkDevice device = VK_NULL_HANDLE;
CheckVk(vkCreateDevice(physical_devices[0], &device_create_info, NULL, &device));
volkLoadDevice(device);
VkQueue queue = VK_NULL_HANDLE;
vkGetDeviceQueue(device, 1, 0, &queue);
VkFenceCreateInfo fence_info = {};
fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fence_info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
VkFence fence = VK_NULL_HANDLE;
CheckVk(vkCreateFence(device, &fence_info, NULL, &fence));
CheckVk(vkQueueSubmit(queue, 0, NULL, fence));
CheckVk(vkQueueSubmit(queue, 0, NULL, fence));
CheckVk(vkQueueSubmit(queue, 0, NULL, fence));
CheckVk(vkQueueWaitIdle(queue));
vkDestroyFence(device, fence, NULL);
vkDestroyDevice(device, NULL);
vkDestroyInstance(instance, NULL);
free(physical_devices);
dlclose(lib);
return 0;
}