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 +}