X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;ds=inline;f=src%2Fvk.c;h=4e3aa1c3bba7e5942b99905ec828366ab3c2e3ad;hb=0e02d2e2c52c4906fcdc1123fe2ec75d46230ead;hp=d280e0083736cffcd65e91cba78e4e057390de9d;hpb=6d2c68e0e885a93a4b94ca56c49240728d4a6e35;p=vkrt diff --git a/src/vk.c b/src/vk.c index d280e00..4e3aa1c 100644 --- a/src/vk.c +++ b/src/vk.c @@ -8,8 +8,10 @@ /* static variables */ static VkViewport viewport; static VkRect2D scissor; +static bool enable_layers = true; /* static functions */ + static VkSampleCountFlagBits get_num_samples(uint32_t num_samples) { @@ -94,6 +96,36 @@ enable_validation_layers(VkInstanceCreateInfo *info) } } +static void +enable_extensions(VkInstanceCreateInfo *info) +{ + static const char *ext_names[] = { + "VK_KHR_xcb_surface", + "VK_KHR_surface" + }; + + uint32_t num_extensions; + VkExtensionProperties *extensions; + int i; + + vkEnumerateInstanceExtensionProperties(0, &num_extensions, 0); + if (!num_extensions) { + fprintf(stderr, "No instance extensions found.\n"); + return; + } + + extensions = alloca(num_extensions * sizeof *extensions); + vkEnumerateInstanceExtensionProperties(0, &num_extensions, extensions); + + printf("Available extensions:\n"); + for (i = 0; i < num_extensions; i++) { + printf(" %s\n", extensions[i].extensionName); + } + + info->ppEnabledExtensionNames = ext_names; + info->enabledExtensionCount = ARRAY_SIZE(ext_names); +} + static VkInstance create_instance(bool enable_layers) { @@ -101,17 +133,21 @@ create_instance(bool enable_layers) VkInstanceCreateInfo inst_info; VkInstance inst; + /* VkApplicationInfo */ memset(&app_info, 0, sizeof app_info); app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.pApplicationName = "vktest"; app_info.apiVersion = VK_API_VERSION_1_1; + /* VkInstanceCreateInfo */ memset(&inst_info, 0, sizeof inst_info); inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.pApplicationInfo = &app_info; - if (enable_layers) + enable_extensions(&inst_info); + if (enable_layers) { enable_validation_layers(&inst_info); + } if (vkCreateInstance(&inst_info, 0, &inst) != VK_SUCCESS) return 0; @@ -145,9 +181,7 @@ select_physical_device(VkInstance inst) static VkDevice create_device(struct vk_ctx *ctx, VkPhysicalDevice pdev) { - /* FIXME: swapchain */ - const char *deviceExtensions[] = { "VK_KHR_external_memory_fd", - "VK_KHR_external_semaphore_fd" }; + const char *deviceExtensions[] = { "VK_KHR_swapchain" }; VkDeviceQueueCreateInfo dev_queue_info; VkDeviceCreateInfo dev_info; VkDevice dev; @@ -966,7 +1000,7 @@ are_props_supported(struct vk_ctx *ctx, struct vk_image_props *props) bool vk_init_ctx(struct vk_ctx *ctx) { - if ((ctx->inst = create_instance(false)) == VK_NULL_HANDLE) { + if ((ctx->inst = create_instance(enable_layers)) == VK_NULL_HANDLE) { fprintf(stderr, "Failed to create Vulkan instance.\n"); goto fail; } @@ -1024,6 +1058,10 @@ fail: void vk_cleanup_ctx(struct vk_ctx *ctx) { + if (enable_layers) { + return; + } + if (ctx->cmd_buf != VK_NULL_HANDLE) { vkResetCommandBuffer(ctx->cmd_buf, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);