vulkan_test2

diff src/vku.c @ 15:196122a2b8c2

...
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 26 Jun 2018 08:39:30 +0300
parents 9fb6c24691ea
children 236f923a00a3
line diff
     1.1 --- a/src/vku.c	Tue Jun 26 07:20:03 2018 +0300
     1.2 +++ b/src/vku.c	Tue Jun 26 08:39:30 2018 +0300
     1.3 @@ -12,6 +12,10 @@
     1.4  static int ver_patch(uint32_t ver);
     1.5  static const char *mem_size_str(long sz);
     1.6  
     1.7 +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback_thunk(VkDebugReportFlagsEXT flags,
     1.8 +		VkDebugReportObjectTypeEXT otype, uint64_t obj, size_t loc, int32_t code,
     1.9 +		const char *layer_prefix, const char *msg, void *udata);
    1.10 +
    1.11  VkInstance vk;
    1.12  VkDevice vkdev;
    1.13  VkQueue vkq;
    1.14 @@ -22,6 +26,13 @@
    1.15  static VkExtensionProperties *vkext, *vkdevext;
    1.16  static uint32_t vkext_count, vkdevext_count;
    1.17  
    1.18 +static VkDebugReportCallbackEXT debug_callback_obj;
    1.19 +static VkResult (*vk_create_debug_report_callback)(VkInstance,
    1.20 +		const VkDebugReportCallbackCreateInfoEXT*, const VkAllocationCallbacks*,
    1.21 +		VkDebugReportCallbackEXT*);
    1.22 +static void (*user_dbg_callback)(const char*, void*);
    1.23 +static void *user_dbg_callback_data;
    1.24 +
    1.25  
    1.26  int vku_have_extension(const char *name)
    1.27  {
    1.28 @@ -83,10 +94,30 @@
    1.29  	return 0;
    1.30  }
    1.31  
    1.32 +void vku_set_debug_callback(void (*func)(const char*, void*), void *cls)
    1.33 +{
    1.34 +	if(!debug_callback_obj && vk_create_debug_report_callback) {
    1.35 +		VkDebugReportCallbackCreateInfoEXT foo;
    1.36 +
    1.37 +		memset(&foo, 0, sizeof foo);
    1.38 +		foo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
    1.39 +		foo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
    1.40 +		foo.pfnCallback = debug_callback_thunk;
    1.41 +
    1.42 +		vk_create_debug_report_callback(vk, &foo, 0, &debug_callback_obj);
    1.43 +	}
    1.44 +
    1.45 +	user_dbg_callback = func;
    1.46 +	user_dbg_callback_data = cls;
    1.47 +}
    1.48 +
    1.49 +
    1.50  int vku_create_dev(void)
    1.51  {
    1.52  	int i, j;
    1.53 +	uint32_t nlayers;
    1.54  	VkInstanceCreateInfo inst_info;
    1.55 +	VkLayerProperties *layers;
    1.56  	VkDeviceCreateInfo dev_info;
    1.57  	VkDeviceQueueCreateInfo queue_info;
    1.58  	VkCommandPoolCreateInfo cmdpool_info;
    1.59 @@ -97,11 +128,15 @@
    1.60  #ifdef VK_USE_PLATFORM_XLIB_KHR
    1.61  		"VK_KHR_xlib_surface",
    1.62  #endif
    1.63 -		"VK_KHR_surface"
    1.64 +		"VK_KHR_surface",
    1.65 +		"VK_EXT_debug_report"
    1.66  	};
    1.67  	static const char *devext_names[] = {
    1.68  		"VK_KHR_swapchain"
    1.69  	};
    1.70 +	static const char *layer_names[] = {
    1.71 +		"VK_LAYER_LUNARG_standard_validation"
    1.72 +	};
    1.73  
    1.74  	sel_dev = -1;
    1.75  	sel_qfamily = -1;
    1.76 @@ -113,10 +148,22 @@
    1.77  		}
    1.78  	}
    1.79  
    1.80 +	/* enumerate available validation layers */
    1.81 +	vkEnumerateInstanceLayerProperties(&nlayers, 0);
    1.82 +	layers = alloca(nlayers * sizeof *layers);
    1.83 +	vkEnumerateInstanceLayerProperties(&nlayers, layers);
    1.84 +
    1.85 +	printf("Available validation layers:\n");
    1.86 +	for(i=0; i<(int)nlayers; i++) {
    1.87 +		printf(" %s\n", layers[i].layerName);
    1.88 +	}
    1.89 +
    1.90  	memset(&inst_info, 0, sizeof inst_info);
    1.91  	inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    1.92  	inst_info.ppEnabledExtensionNames = ext_names;
    1.93  	inst_info.enabledExtensionCount = sizeof ext_names / sizeof *ext_names;
    1.94 +	inst_info.ppEnabledLayerNames = layer_names;
    1.95 +	inst_info.enabledLayerCount = sizeof layer_names / sizeof *layer_names;
    1.96  
    1.97  	if(vkCreateInstance(&inst_info, 0, &vk) != 0) {
    1.98  		fprintf(stderr, "failed to create vulkan instance\n");
    1.99 @@ -124,6 +171,13 @@
   1.100  	}
   1.101  	printf("created vulkan instance\n");
   1.102  
   1.103 +	if(!(vk_create_debug_report_callback = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(vk, "vkCreateDebugReportCallbackEXT"))) {
   1.104 +		fprintf(stderr, "FUCK EVERYTHING\n");
   1.105 +		return -1;
   1.106 +	}
   1.107 +	vku_set_debug_callback(user_dbg_callback, user_dbg_callback_data);	/* set debug callback */
   1.108 +
   1.109 +
   1.110  	if(vkEnumeratePhysicalDevices(vk, &num_devices, 0) != 0) {
   1.111  		fprintf(stderr, "failed to enumerate vulkan physical devices\n");
   1.112  		return -1;
   1.113 @@ -544,6 +598,27 @@
   1.114  	vkDestroyRenderPass(vkdev, rpass, 0);
   1.115  }
   1.116  
   1.117 +void vku_begin_renderpass(VkCommandBuffer cmdbuf, VkRenderPass rpass, VkFramebuffer fb,
   1.118 +		VkSubpassContents cont)
   1.119 +{
   1.120 +	VkRenderPassBeginInfo rpinf;
   1.121 +
   1.122 +	memset(&rpinf, 0, sizeof rpinf);
   1.123 +	rpinf.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
   1.124 +	rpinf.renderPass = rpass;
   1.125 +	rpinf.framebuffer = fb;
   1.126 +	rpinf.renderArea.offset.x = vkvport.x;
   1.127 +	rpinf.renderArea.offset.y = vkvport.y;
   1.128 +	rpinf.renderArea.extent.width = vkvport.width;
   1.129 +	rpinf.renderArea.extent.height = vkvport.height;
   1.130 +
   1.131 +	vkCmdBeginRenderPass(cmdbuf, &rpinf, cont);
   1.132 +}
   1.133 +
   1.134 +void vku_end_renderpass(VkCommandBuffer cmdbuf)
   1.135 +{
   1.136 +	vkCmdEndRenderPass(cmdbuf);
   1.137 +}
   1.138  
   1.139  #ifdef VK_USE_PLATFORM_XLIB_KHR
   1.140  int vku_xlib_usable_visual(Display *dpy, VisualID vid)
   1.141 @@ -666,3 +741,16 @@
   1.142  	sprintf(str, "%ld.%ld %s", sz / 10, sz % 10, unitstr[uidx]);
   1.143  	return str;
   1.144  }
   1.145 +
   1.146 +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback_thunk(VkDebugReportFlagsEXT flags,
   1.147 +		VkDebugReportObjectTypeEXT otype, uint64_t obj, size_t loc, int32_t code,
   1.148 +		const char *layer_prefix, const char *msg, void *udata)
   1.149 +{
   1.150 +	if(user_dbg_callback) {
   1.151 +		user_dbg_callback(msg, user_dbg_callback_data);
   1.152 +	} else {
   1.153 +		fprintf(stderr, "VK DEBUG (%s): %s\n", layer_prefix, msg);
   1.154 +	}
   1.155 +
   1.156 +	return VK_TRUE;
   1.157 +}