X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fvkxlib%2Fvulkancontext.cpp;h=f25349974c8adfd3d47b1bb44ad5a1a9737d2b4f;hb=f01fa56a13100ed04c94c9d8b17fbdcf0f0a8bad;hp=34c0c511f749c6757820f1121893e2417117efbf;hpb=17575b79ca15113686ec04726feea35962d5c471;p=libs%2Fgui.git diff --git a/source/graphics/vkxlib/vulkancontext.cpp b/source/graphics/vkxlib/vulkancontext.cpp index 34c0c51..f253499 100644 --- a/source/graphics/vkxlib/vulkancontext.cpp +++ b/source/graphics/vkxlib/vulkancontext.cpp @@ -3,6 +3,7 @@ #define VK_USE_PLATFORM_XLIB_KHR #include #include +#include #include #include "display_private.h" #include "vulkancontext.h" @@ -62,7 +63,9 @@ string vulkan_error::get_error_message(unsigned code) VulkanOptions::VulkanOptions(): enable_validation(false), - enable_debug_report(false) + enable_debug_report(false), + enable_geometry_shader(false), + enable_tessellation_shader(false) { } @@ -120,7 +123,7 @@ void VulkanContext::platform_init(const VulkanOptions &opts) { VkDebugReportCallbackCreateInfoEXT debug_report_create_info = { }; debug_report_create_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; - debug_report_create_info.flags = VK_DEBUG_REPORT_WARNING_BIT_EXT|VK_DEBUG_REPORT_ERROR_BIT_EXT|VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + debug_report_create_info.flags = VK_DEBUG_REPORT_WARNING_BIT_EXT|VK_DEBUG_REPORT_ERROR_BIT_EXT|VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT|VK_DEBUG_REPORT_INFORMATION_BIT_EXT; debug_report_create_info.pfnCallback = &Private::debug_report_func; debug_report_create_info.pUserData = this; @@ -175,7 +178,10 @@ void VulkanContext::platform_init(const VulkanOptions &opts) continue; if(supported) - priv->physical_device = phys_devices[0]; + { + priv->physical_device = phys_device; + break; + } } if(!priv->physical_device) @@ -193,12 +199,17 @@ void VulkanContext::platform_init(const VulkanOptions &opts) extensions.clear(); extensions.push_back("VK_KHR_swapchain"); + VkPhysicalDeviceFeatures features = { }; + features.geometryShader = (opts.enable_geometry_shader ? VK_TRUE : VK_FALSE); + features.tessellationShader = (opts.enable_tessellation_shader ? VK_TRUE : VK_FALSE); + VkDeviceCreateInfo device_create_info = { }; device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_create_info.queueCreateInfoCount = 1; device_create_info.pQueueCreateInfos = &queue_create_info; device_create_info.enabledExtensionCount = extensions.size(); device_create_info.ppEnabledExtensionNames = extensions.data(); + device_create_info.pEnabledFeatures = &features; result = f.vkCreateDevice(priv->physical_device, &device_create_info, 0, &priv->device); if(result!=VK_SUCCESS) @@ -246,9 +257,11 @@ VulkanContext::Private::Private(): debug_report_callback(0) { } -VkBool32 VulkanContext::Private::debug_report_func(VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT obj_type, uint64_t obj_id, size_t, int32_t, const char *layer_prefix, const char *message, void *) +VkBool32 VulkanContext::Private::debug_report_func(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT, uint64_t, size_t, int32_t, const char *, const char *message, void *) { - IO::print(IO::cerr, "Vulkan debug report from %s: Object %d of type %d: %s\n", layer_prefix, obj_type, obj_id, message); + IO::print(IO::cerr, "%s\n", message); + if((flags&VK_DEBUG_REPORT_ERROR_BIT_EXT) && Debug::check_debugger()==Debug::GDB) + Debug::debug_break(); return VK_FALSE; }