bool create_instance(const char *app_name) { uint32_t extensions_count = 0; VK_VERIFY (vkEnumerateInstanceExtensionProperties(nullptr, &extensions_count, nullptr)); VERIFY_LOG (extensions_count > 0, LOG_TYPE, "Error occurred during instance extensions enumeration!", ""); std::vector<VkExtensionProperties> available_extensions(extensions_count); VK_VERIFY (vkEnumerateInstanceExtensionProperties(nullptr, &extensions_count, &available_extensions[0])); std::vector<const char *> extensions = { VK_KHR_SURFACE_EXTENSION_NAME, #ifdef PLATFORM_WINDOWS VK_KHR_WIN32_SURFACE_EXTENSION_NAME #elif PLATFORM_LINUX VK_KHR_XCB_SURFACE_EXTENSION_NAME #endif }; for (size_t i = 0; i < extensions.size(); ++i) { VERIFY_LOG(utils::check_extension(extensions[i], available_extensions), LOG_TYPE, "Could not find instance extension named \"%s\"!", extensions[i]); } VkApplicationInfo application_info = { VK_STRUCTURE_TYPE_APPLICATION_INFO, // VkStructureType sType nullptr, // const void *pNext app_name, // const char *pApplicationName VK_MAKE_VERSION(0, 0, 1), // uint32_t applicationVersion "gladius", // const char *pEngineName VK_MAKE_VERSION(0, 0, 1), // uint32_t engineVersion VK_MAKE_VERSION(1, 0, 21) // uint32_t apiVersion }; VkInstanceCreateInfo instance_create_info = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkInstanceCreateFlags flags &application_info, // const VkApplicationInfo *pApplicationInfo 0, // uint32_t enabledLayerCount nullptr, // const char * const *ppEnabledLayerNames static_cast<uint32_t>(extensions.size()), // uint32_t enabledExtensionCount &extensions[0] // const char * const *ppEnabledExtensionNames }; VK_VERIFY(vkCreateInstance(&instance_create_info, nullptr, &(vk_globals::instance))); GET_INSTANCE_PROC_ADDR(vk_globals::instance, GetPhysicalDeviceSurfaceSupportKHR); GET_INSTANCE_PROC_ADDR(vk_globals::instance, GetPhysicalDeviceSurfaceFormatsKHR); return true; }
static void initShaderSetCreationHelper() { std::string path = FRAMEWORK->GetFileSystemUtils()->GetDeviceShaderResourcesPath() + SHADER_VARIABLES_FILE_NAME; std::ifstream variablesFile(path.c_str()); VERIFY_LOG(variablesFile.good(), "Successfully opened shader variables file %s for reading", path.c_str()); while (variablesFile.good()) { std::string qualifier, datatype, variableName, arraySpecifier; variablesFile >> qualifier >> datatype >> variableName; if (variableName.find("[") != std::string::npos) { arraySpecifier = variableName.substr(variableName.find("[")); variableName.erase(variableName.find("[")); } if (qualifier != "" && datatype != "" && variableName != "") { ASSERT(gVariableDeclarations.find(variableName) == gVariableDeclarations.end(), "Not duplicate variable %s", variableName.c_str()); ASSERT(gVariableQualifiers.find(variableName) == gVariableQualifiers.end(), "Not duplicate variable %s", variableName.c_str()); ASSERT(gVariableDatatypes.find(variableName) == gVariableDatatypes.end(), "Not duplicate variable %s", variableName.c_str()); std::string declaration = qualifier + " " + datatype + " " + variableName + arraySpecifier + ";"; gVariableDeclarations[variableName] = declaration; gVariableQualifiers[variableName] = qualifier; gVariableDatatypes[variableName] = datatype; } } FRAMEWORK->GetLogger()->dbglog("\nShader Variables Available:\n"); for (auto it = gVariableDeclarations.begin(); it != gVariableDeclarations.end(); ++it) { std::string declaration = it->second; FRAMEWORK->GetLogger()->dbglog("\n%s", declaration.c_str()); } FRAMEWORK->GetLogger()->dbglog("\n\n"); }
bool create_device() { uint32_t num_devices = 0; VK_VERIFY (vkEnumeratePhysicalDevices(vk_globals::instance, &num_devices, nullptr)); VERIFY_LOG (num_devices > 0, LOG_TYPE, "Error occurred during physical devices enumeration!", ""); std::vector<VkPhysicalDevice> physical_devices(num_devices); VK_VERIFY(vkEnumeratePhysicalDevices(vk_globals::instance, &num_devices, &physical_devices[0])); uint32_t selected_graphics_queue_family_index = UINT32_MAX; uint32_t selected_present_queue_family_index = UINT32_MAX; std::vector<const char *> extensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; for (uint32_t i = 0; i < num_devices; ++i) { if (check_physical_device_properties(physical_devices[i], selected_graphics_queue_family_index, selected_present_queue_family_index, extensions)) { vk_globals::gpu = physical_devices[i]; } } VERIFY_LOG (vk_globals::gpu != nullptr, LOG_TYPE, "Could not select physical device based on the chosen properties!", ""); vkGetPhysicalDeviceMemoryProperties(vk_globals::gpu, &vk_globals::gpu_memory_properties); std::vector<VkDeviceQueueCreateInfo> queue_create_infos; std::vector<float> queue_priorities = {1.0f}; queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_graphics_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); if (selected_graphics_queue_family_index != selected_present_queue_family_index) { queue_create_infos.push_back( { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceQueueCreateFlags flags selected_present_queue_family_index, // uint32_t queueFamilyIndex static_cast<uint32_t>(queue_priorities.size()), // uint32_t queueCount &queue_priorities[0] // const float *pQueuePriorities } ); } VkDeviceCreateInfo device_create_info = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkDeviceCreateFlags flags static_cast<uint32_t>(queue_create_infos.size()), // uint32_t queueCreateInfoCount &queue_create_infos[0], // const VkDeviceQueueCreateInfo *pQueueCreateInfos 0, // uint32_t enabledLayerCount nullptr, // const char * const *ppEnabledLayerNames static_cast<uint32_t>(extensions.size()), // uint32_t enabledExtensionCount &extensions[0], // const char * const *ppEnabledExtensionNames nullptr // const VkPhysicalDeviceFeatures *pEnabledFeatures }; VK_VERIFY (vkCreateDevice(vk_globals::gpu, &device_create_info, nullptr, &(vk_globals::device))); vk_globals::graphics_queue.index = selected_graphics_queue_family_index; vk_globals::present_queue.index = selected_present_queue_family_index; return true; }