# HG changeset patch # User John Tsiombikas # Date 1529991570 -10800 # Node ID 196122a2b8c2da2114d9b0ad56253e8e46d6f42f # Parent 9fb6c24691ea774b2042cf0b78f0be21e68efbfa ... diff -r 9fb6c24691ea -r 196122a2b8c2 src/main.c --- a/src/main.c Tue Jun 26 07:20:03 2018 +0300 +++ b/src/main.c Tue Jun 26 08:39:30 2018 +0300 @@ -55,6 +55,16 @@ vkgl_clear_color(1, 0, 0, 1); vkgl_clear(VKGL_COLOR_BUFFER_BIT); + vku_begin_cmdbuf(vkcmdbuf, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); + vku_begin_renderpass(vkcmdbuf, vkrpass, swapchain_framebuf[next_swapchain_image], + VK_SUBPASS_CONTENTS_INLINE); + vkCmdBindPipeline(vkcmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline); + vkCmdDraw(vkcmdbuf, 3, 1, 0, 0); + vku_end_renderpass(vkcmdbuf); + vku_end_cmdbuf(vkcmdbuf); + + vku_submit_cmdbuf(vkq, vkcmdbuf, 0); + wsys_swap_buffers(); } diff -r 9fb6c24691ea -r 196122a2b8c2 src/vku.c --- a/src/vku.c Tue Jun 26 07:20:03 2018 +0300 +++ b/src/vku.c Tue Jun 26 08:39:30 2018 +0300 @@ -12,6 +12,10 @@ static int ver_patch(uint32_t ver); static const char *mem_size_str(long sz); +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback_thunk(VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT otype, uint64_t obj, size_t loc, int32_t code, + const char *layer_prefix, const char *msg, void *udata); + VkInstance vk; VkDevice vkdev; VkQueue vkq; @@ -22,6 +26,13 @@ static VkExtensionProperties *vkext, *vkdevext; static uint32_t vkext_count, vkdevext_count; +static VkDebugReportCallbackEXT debug_callback_obj; +static VkResult (*vk_create_debug_report_callback)(VkInstance, + const VkDebugReportCallbackCreateInfoEXT*, const VkAllocationCallbacks*, + VkDebugReportCallbackEXT*); +static void (*user_dbg_callback)(const char*, void*); +static void *user_dbg_callback_data; + int vku_have_extension(const char *name) { @@ -83,10 +94,30 @@ return 0; } +void vku_set_debug_callback(void (*func)(const char*, void*), void *cls) +{ + if(!debug_callback_obj && vk_create_debug_report_callback) { + VkDebugReportCallbackCreateInfoEXT foo; + + memset(&foo, 0, sizeof foo); + foo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; + foo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; + foo.pfnCallback = debug_callback_thunk; + + vk_create_debug_report_callback(vk, &foo, 0, &debug_callback_obj); + } + + user_dbg_callback = func; + user_dbg_callback_data = cls; +} + + int vku_create_dev(void) { int i, j; + uint32_t nlayers; VkInstanceCreateInfo inst_info; + VkLayerProperties *layers; VkDeviceCreateInfo dev_info; VkDeviceQueueCreateInfo queue_info; VkCommandPoolCreateInfo cmdpool_info; @@ -97,11 +128,15 @@ #ifdef VK_USE_PLATFORM_XLIB_KHR "VK_KHR_xlib_surface", #endif - "VK_KHR_surface" + "VK_KHR_surface", + "VK_EXT_debug_report" }; static const char *devext_names[] = { "VK_KHR_swapchain" }; + static const char *layer_names[] = { + "VK_LAYER_LUNARG_standard_validation" + }; sel_dev = -1; sel_qfamily = -1; @@ -113,10 +148,22 @@ } } + /* enumerate available validation layers */ + vkEnumerateInstanceLayerProperties(&nlayers, 0); + layers = alloca(nlayers * sizeof *layers); + vkEnumerateInstanceLayerProperties(&nlayers, layers); + + printf("Available validation layers:\n"); + for(i=0; i<(int)nlayers; i++) { + printf(" %s\n", layers[i].layerName); + } + memset(&inst_info, 0, sizeof inst_info); inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.ppEnabledExtensionNames = ext_names; inst_info.enabledExtensionCount = sizeof ext_names / sizeof *ext_names; + inst_info.ppEnabledLayerNames = layer_names; + inst_info.enabledLayerCount = sizeof layer_names / sizeof *layer_names; if(vkCreateInstance(&inst_info, 0, &vk) != 0) { fprintf(stderr, "failed to create vulkan instance\n"); @@ -124,6 +171,13 @@ } printf("created vulkan instance\n"); + if(!(vk_create_debug_report_callback = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(vk, "vkCreateDebugReportCallbackEXT"))) { + fprintf(stderr, "FUCK EVERYTHING\n"); + return -1; + } + vku_set_debug_callback(user_dbg_callback, user_dbg_callback_data); /* set debug callback */ + + if(vkEnumeratePhysicalDevices(vk, &num_devices, 0) != 0) { fprintf(stderr, "failed to enumerate vulkan physical devices\n"); return -1; @@ -544,6 +598,27 @@ vkDestroyRenderPass(vkdev, rpass, 0); } +void vku_begin_renderpass(VkCommandBuffer cmdbuf, VkRenderPass rpass, VkFramebuffer fb, + VkSubpassContents cont) +{ + VkRenderPassBeginInfo rpinf; + + memset(&rpinf, 0, sizeof rpinf); + rpinf.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + rpinf.renderPass = rpass; + rpinf.framebuffer = fb; + rpinf.renderArea.offset.x = vkvport.x; + rpinf.renderArea.offset.y = vkvport.y; + rpinf.renderArea.extent.width = vkvport.width; + rpinf.renderArea.extent.height = vkvport.height; + + vkCmdBeginRenderPass(cmdbuf, &rpinf, cont); +} + +void vku_end_renderpass(VkCommandBuffer cmdbuf) +{ + vkCmdEndRenderPass(cmdbuf); +} #ifdef VK_USE_PLATFORM_XLIB_KHR int vku_xlib_usable_visual(Display *dpy, VisualID vid) @@ -666,3 +741,16 @@ sprintf(str, "%ld.%ld %s", sz / 10, sz % 10, unitstr[uidx]); return str; } + +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_callback_thunk(VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT otype, uint64_t obj, size_t loc, int32_t code, + const char *layer_prefix, const char *msg, void *udata) +{ + if(user_dbg_callback) { + user_dbg_callback(msg, user_dbg_callback_data); + } else { + fprintf(stderr, "VK DEBUG (%s): %s\n", layer_prefix, msg); + } + + return VK_TRUE; +} diff -r 9fb6c24691ea -r 196122a2b8c2 src/vku.h --- a/src/vku.h Tue Jun 26 07:20:03 2018 +0300 +++ b/src/vku.h Tue Jun 26 08:39:30 2018 +0300 @@ -33,6 +33,8 @@ int vku_have_extension(const char *name); int vku_have_device_extension(const char *name); +void vku_set_debug_callback(void (*func)(const char*, void*), void *cls); + int vku_create_dev(void); void vku_cleanup(void); @@ -65,6 +67,9 @@ VkRenderPass vku_create_renderpass(VkFormat cfmt, VkFormat dsfmt); void vku_destroy_renderpass(VkRenderPass rpass); +void vku_begin_renderpass(VkCommandBuffer cmdbuf, VkRenderPass rpass, VkFramebuffer fb, + VkSubpassContents cont); +void vku_end_renderpass(VkCommandBuffer cmdbuf); /* platform-specific */ #ifdef VK_USE_PLATFORM_XLIB_KHR