|
@@ -21,8 +21,10 @@ typedef struct {
|
|
|
// basic setup
|
|
|
VkInstance instance;
|
|
|
VkSurfaceKHR surface;
|
|
|
+#ifdef DEBUG_VULKAN
|
|
|
VkDebugUtilsMessengerEXT debugMessenger;
|
|
|
VkDebugReportCallbackEXT debugReportCallback;
|
|
|
+#endif
|
|
|
// render setup
|
|
|
u32 graphicsFamily;
|
|
|
VkPhysicalDevice physicalDevice;
|
|
@@ -57,9 +59,7 @@ static const char* getVulkanErrorString(VkResult r) {
|
|
|
do { \
|
|
|
VkResult vkResult = (a); \
|
|
|
if(vkResult != VK_SUCCESS) { \
|
|
|
- printf( \
|
|
|
- "Vulkan error at [%s:%d]: %s\n", getShortFileName(__FILE__), \
|
|
|
- __LINE__, getVulkanErrorString(vkResult)); \
|
|
|
+ LOG_ERROR("Vulkan error: %s\n", getVulkanErrorString(vkResult)); \
|
|
|
return true; \
|
|
|
} \
|
|
|
} while(false)
|
|
@@ -70,32 +70,50 @@ static PFN_vkVoidFunction getVulkanFunction(const char* name) {
|
|
|
|
|
|
#define GET_VULKAN_FUNCTION(name) ((PFN_##name)getVulkanFunction(#name))
|
|
|
|
|
|
-static int64_t someData[] = {10'000, 2, 3, 4, 5,
|
|
|
- 6, 0xFFFF'FFFF, 'a', 0b1000'0001};
|
|
|
-
|
|
|
static bool initInstance() {
|
|
|
- (void)someData; // gusi
|
|
|
- VkApplicationInfo i = {
|
|
|
+ u32 baseCount = 0;
|
|
|
+ const char** baseExtensions = glfwGetRequiredInstanceExtensions(&baseCount);
|
|
|
+ if(baseExtensions == nullptr) {
|
|
|
+ LOG_ERROR("Could not get required extensions from GLFW");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+#ifdef DEBUG_VULKAN
|
|
|
+ u32 count = baseCount + 2;
|
|
|
+ const char* extensions[32];
|
|
|
+ if(count > ARRAY_LENGTH(extensions)) {
|
|
|
+ LOG_ERROR("Extension buffer is too small");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ for(u32 i = 0; i < baseCount; i++) {
|
|
|
+ extensions[i] = baseExtensions[i];
|
|
|
+ }
|
|
|
+ extensions[baseCount] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
|
|
+ extensions[baseCount + 1] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
|
|
|
+#else
|
|
|
+ u32 count = baseCount;
|
|
|
+ const char** extensions = baseExtensions;
|
|
|
+#endif
|
|
|
+ VkApplicationInfo appInfo = {
|
|
|
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
|
|
.pApplicationName = "Vulkan",
|
|
|
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
|
|
.pEngineName = "Kajetan",
|
|
|
.engineVersion = VK_MAKE_VERSION(0, 0, 1),
|
|
|
.apiVersion = VK_API_VERSION_1_1};
|
|
|
- VkInstanceCreateInfo ci = {
|
|
|
+ VkInstanceCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
|
|
- .pApplicationInfo = &i,
|
|
|
+ .pApplicationInfo = &appInfo,
|
|
|
+#ifdef DEBUG_VULKAN
|
|
|
.enabledLayerCount = 1,
|
|
|
.ppEnabledLayerNames = (const char*[]){"VK_LAYER_KHRONOS_validation"},
|
|
|
- .enabledExtensionCount = 4,
|
|
|
- .ppEnabledExtensionNames =
|
|
|
- (const char*[]){"VK_KHR_surface", "VK_KHR_wayland_surface",
|
|
|
- VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
|
|
|
- VK_EXT_DEBUG_REPORT_EXTENSION_NAME}};
|
|
|
- VK_ASSERT(vkCreateInstance(&ci, nullptr, &vk.instance));
|
|
|
+#endif
|
|
|
+ .enabledExtensionCount = count,
|
|
|
+ .ppEnabledExtensionNames = extensions};
|
|
|
+ VK_ASSERT(vkCreateInstance(&info, nullptr, &vk.instance));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+#ifdef DEBUG_VULKAN
|
|
|
static VKAPI_ATTR VkBool32 onVulkanDebugMessenger VKAPI_CALL(
|
|
|
VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT,
|
|
|
const VkDebugUtilsMessengerCallbackDataEXT* data, void*) {
|
|
@@ -165,6 +183,18 @@ static void destroyDebugReportCallback() {
|
|
|
}
|
|
|
f(vk.instance, vk.debugReportCallback, nullptr);
|
|
|
}
|
|
|
+#else
|
|
|
+static bool initDebugging() {
|
|
|
+ (void)getVulkanFunction;
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+static void destroyDebugMessenger() {
|
|
|
+}
|
|
|
+
|
|
|
+static void destroyDebugReportCallback() {
|
|
|
+}
|
|
|
+#endif
|
|
|
|
|
|
static bool choosePhysicalDevice(VkPhysicalDevice* devices, u32 amount) {
|
|
|
VK_ASSERT(vkEnumeratePhysicalDevices(vk.instance, &amount, devices));
|