示例#1
0
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");
}
示例#3
0
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;
}