vulkan_test2

diff src/vku.c @ 5:cec4b0e7fce8

created swapchain
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 22 Sep 2017 17:48:18 +0300
parents c31c4115d44a
children 1dd2c7398afc
line diff
     1.1 --- a/src/vku.c	Fri Sep 22 15:26:29 2017 +0300
     1.2 +++ b/src/vku.c	Fri Sep 22 17:48:18 2017 +0300
     1.3 @@ -99,6 +99,9 @@
     1.4  #endif
     1.5  		"VK_KHR_surface"
     1.6  	};
     1.7 +	static const char *devext_names[] = {
     1.8 +		"VK_KHR_swapchain"
     1.9 +	};
    1.10  
    1.11  	sel_dev = -1;
    1.12  	sel_qfamily = -1;
    1.13 @@ -189,6 +192,14 @@
    1.14  		return -1;
    1.15  	}
    1.16  
    1.17 +	for(i=0; i<sizeof devext_names / sizeof *devext_names; i++) {
    1.18 +		if(!vku_have_device_extension(devext_names[i])) {
    1.19 +			fprintf(stderr, "required extension (%s) not found on the selected device (%d)\n",
    1.20 +					ext_names[i], sel_dev);
    1.21 +			return -1;
    1.22 +		}
    1.23 +	}
    1.24 +
    1.25  	/* create device & command queue */
    1.26  	memset(&queue_info, 0, sizeof queue_info);
    1.27  	queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    1.28 @@ -200,6 +211,8 @@
    1.29  	dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    1.30  	dev_info.queueCreateInfoCount = 1;
    1.31  	dev_info.pQueueCreateInfos = &queue_info;
    1.32 +	dev_info.enabledExtensionCount = sizeof devext_names / sizeof *devext_names;
    1.33 +	dev_info.ppEnabledExtensionNames = devext_names;
    1.34  
    1.35  	if(vkCreateDevice(phys_devices[sel_dev], &dev_info, 0, &vkdev) != 0) {
    1.36  		fprintf(stderr, "failed to create device %d\n", sel_dev);
    1.37 @@ -298,6 +311,34 @@
    1.38  	vkQueueSubmit(q, 1, &info, done_fence);
    1.39  }
    1.40  
    1.41 +VkSwapchainKHR vku_create_swapchain(VkSurfaceKHR surf, int xsz, int ysz, int n,
    1.42 +		VkPresentModeKHR pmode, VkSwapchainKHR prev)
    1.43 +{
    1.44 +	VkSwapchainKHR sc;
    1.45 +	VkSwapchainCreateInfoKHR inf;
    1.46 +
    1.47 +	memset(&inf, 0, sizeof inf);
    1.48 +	inf.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
    1.49 +	inf.surface = surf;
    1.50 +	inf.minImageCount = n;
    1.51 +	inf.imageFormat = VK_FORMAT_B8G8R8A8_UNORM;	/* TODO enumerate and choose */
    1.52 +	inf.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
    1.53 +	inf.imageExtent.width = xsz;
    1.54 +	inf.imageExtent.height = ysz;
    1.55 +	inf.imageArrayLayers = 1;
    1.56 +	inf.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
    1.57 +	inf.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;	/* XXX make this an option? */
    1.58 +	inf.preTransform = VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR;
    1.59 +	inf.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
    1.60 +	inf.presentMode = pmode;
    1.61 +	inf.oldSwapchain = prev;
    1.62 +
    1.63 +	if(vkCreateSwapchainKHR(vkdev, &inf, 0, &sc) != 0) {
    1.64 +		return 0;
    1.65 +	}
    1.66 +	return sc;
    1.67 +}
    1.68 +
    1.69  struct vku_buffer *vku_create_buffer(int sz, unsigned int usage)
    1.70  {
    1.71  	struct vku_buffer *buf;
    1.72 @@ -342,11 +383,29 @@
    1.73  }
    1.74  
    1.75  #ifdef VK_USE_PLATFORM_XLIB_KHR
    1.76 +
    1.77  int vku_xlib_usable_visual(Display *dpy, VisualID vid)
    1.78  {
    1.79  	return vkGetPhysicalDeviceXlibPresentationSupportKHR(phys_devices[sel_dev],
    1.80  			sel_qfamily, dpy, vid);
    1.81  }
    1.82 +
    1.83 +VkSurfaceKHR vku_xlib_create_surface(Display *dpy, Window win)
    1.84 +{
    1.85 +	VkSurfaceKHR surf;
    1.86 +	VkXlibSurfaceCreateInfoKHR inf;
    1.87 +
    1.88 +	memset(&inf, 0, sizeof inf);
    1.89 +	inf.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
    1.90 +	inf.dpy = dpy;
    1.91 +	inf.window = win;
    1.92 +
    1.93 +	if(vkCreateXlibSurfaceKHR(vk, &inf, 0, &surf) != 0) {
    1.94 +		return 0;
    1.95 +	}
    1.96 +	return surf;
    1.97 +}
    1.98 +
    1.99  #endif	/* VK_USE_PLATFORM_XLIB_KHR */
   1.100  
   1.101  static const char *get_device_name(VkPhysicalDeviceType type)