X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvk.c;h=81e0f516b19069dcac2b7cff19dc49b55b40ec42;hb=c5fcb12273c24f6e24d459ad184f662ef9abefea;hp=d280e0083736cffcd65e91cba78e4e057390de9d;hpb=6d2c68e0e885a93a4b94ca56c49240728d4a6e35;p=vkrt diff --git a/src/vk.c b/src/vk.c index d280e00..81e0f51 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); @@ -1712,6 +1750,59 @@ vk_clear_color(struct vk_ctx *ctx, vkQueueWaitIdle(ctx->queue); } +bool +vk_create_swapchain(struct vk_ctx *ctx, + int width, int height, + int num_qfam, + struct vk_swapchain *swapchain) +{ + VkSwapchainCreateInfoKHR s_info; + VkExtent2D extent; + + extent.width = width; + extent.height = height; + + memset(&s_info, 0, sizeof s_info); + + s_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; + s_info.flags = 0; + s_info.surface = swapchain->surface; + s_info.minImageCount = 2; + s_info.imageFormat = VK_FORMAT_R32G32B32A32_SFLOAT; + s_info.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + s_info.imageExtent = extent; + s_info.imageArrayLayers = 1; + s_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT; + + s_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT; + s_info.queueFamilyIndexCount = num_qfam; /* how many queue families */ + + s_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; + s_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + s_info.presentMode = VK_PRESENT_MODE_FIFO_KHR; + s_info.clipped = VK_TRUE; + s_info.oldSwapchain = VK_NULL_HANDLE; + + if (vkCreateSwapchainKHR(ctx->dev, &s_info, 0, + &swapchain->swapchain) != VK_SUCCESS) { + fprintf(stderr, "Failed to create a swapchain.\n"); + return false; + } + + return true; +} + +void +vk_destroy_swapchain(struct vk_ctx *ctx, + struct vk_swapchain *swapchain) +{ + vkDestroySwapchainKHR(ctx->dev, swapchain->swapchain, 0); + vkDestroySurfaceKHR(ctx->inst, swapchain->surface, 0); +} + void vk_copy_image_to_buffer(struct vk_ctx *ctx, struct vk_image_att *src_img,