重构完成逻辑设备创建,surface创建
							parent
							
								
									77e93d01d1
								
							
						
					
					
						commit
						7063d9a0f9
					
				|  | @ -9,8 +9,8 @@ | ||||||
| #include "VulkanExampleBase.h" | #include "VulkanExampleBase.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| std::vector<const char*> VulkanExampleBase::args; |  | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
| VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, const char * pLayerPrefix, const char * pMsg, void * pUserData) | VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, const char * pLayerPrefix, const char * pMsg, void * pUserData) | ||||||
| { | { | ||||||
| 	std::string prefix(""); | 	std::string prefix(""); | ||||||
|  | @ -33,7 +33,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback(VkDebugReportFlagsEXT flags, | ||||||
| 	fflush(stdout); | 	fflush(stdout); | ||||||
| 	return VK_FALSE; | 	return VK_FALSE; | ||||||
| } | } | ||||||
| 
 | */ | ||||||
| VkResult VulkanExampleBase::createInstance(bool enableValidation) | VkResult VulkanExampleBase::createInstance(bool enableValidation) | ||||||
| { | { | ||||||
| 	setter.settings.validation = enableValidation; | 	setter.settings.validation = enableValidation; | ||||||
|  | @ -591,7 +591,7 @@ void VulkanExampleBase::initVulkan() | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 		Validation layers | 		Validation layers | ||||||
| 	*/ | 	 | ||||||
| 	if (settings.validation) { | 	if (settings.validation) { | ||||||
| 		vkCreateDebugReportCallback = reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT")); | 		vkCreateDebugReportCallback = reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT")); | ||||||
| 		vkDestroyDebugReportCallback = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT")); | 		vkDestroyDebugReportCallback = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT")); | ||||||
|  | @ -601,10 +601,10 @@ void VulkanExampleBase::initVulkan() | ||||||
| 		debugCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; | 		debugCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; | ||||||
| 		VK_CHECK_RESULT(vkCreateDebugReportCallback(instance, &debugCreateInfo, nullptr, &debugReportCallback)); | 		VK_CHECK_RESULT(vkCreateDebugReportCallback(instance, &debugCreateInfo, nullptr, &debugReportCallback)); | ||||||
| 	} | 	} | ||||||
| 
 | 	*/ | ||||||
| 	/*
 | 	/*
 | ||||||
| 		GPU selection | 		GPU selection | ||||||
| 	*/ | 	 | ||||||
| 	uint32_t gpuCount = 0; | 	uint32_t gpuCount = 0; | ||||||
| 	VK_CHECK_RESULT(vkEnumeratePhysicalDevices(instance, &gpuCount, nullptr)); | 	VK_CHECK_RESULT(vkEnumeratePhysicalDevices(instance, &gpuCount, nullptr)); | ||||||
| 	assert(gpuCount > 0); | 	assert(gpuCount > 0); | ||||||
|  | @ -620,7 +620,7 @@ void VulkanExampleBase::initVulkan() | ||||||
| 	vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties); | 	vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties); | ||||||
| 	vkGetPhysicalDeviceFeatures(physicalDevice, &deviceFeatures); | 	vkGetPhysicalDeviceFeatures(physicalDevice, &deviceFeatures); | ||||||
| 	vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); | 	vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); | ||||||
| 
 | 	*/ | ||||||
| 	/*
 | 	/*
 | ||||||
| 		Device creation | 		Device creation | ||||||
| 	*/ | 	*/ | ||||||
|  |  | ||||||
|  | @ -2270,9 +2270,11 @@ void PlumageRender::updateUIOverlay() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	 | ||||||
| // 完全重写,避免OS specific
 | // 完全重写,避免OS specific
 | ||||||
|  | /*
 | ||||||
| PlumageRender* plumageRender; | PlumageRender* plumageRender; | ||||||
| // OS specific macros for the example main entry points
 | 
 | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | 	LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | ||||||
| 	{ | 	{ | ||||||
|  | @ -2299,3 +2301,17 @@ PlumageRender* plumageRender; | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  | 	PlumageRender* plumageRender; | ||||||
|  | 	VulkanBackend::Setter setter; | ||||||
|  | 	if (!setter.settings.headless) | ||||||
|  | 	{ | ||||||
|  | 		plumageRender->initWindow(setter.settings.width, setter.settings.height); | ||||||
|  | 		plumageRender->initVulkan(); | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | @ -19,12 +19,15 @@ | ||||||
| #include <vulkan/vulkan.h> | #include <vulkan/vulkan.h> | ||||||
| #include "VulkanExampleBase.h" | #include "VulkanExampleBase.h" | ||||||
| #include "glTFModel.h" | #include "glTFModel.h" | ||||||
|  | #include "GLFW/glfw3.h" | ||||||
| #include <VulkanTexture.hpp> | #include <VulkanTexture.hpp> | ||||||
| #include "VulkanDevice.hpp" | #include "VulkanDevice.hpp" | ||||||
| #include "ui.hpp" | #include "ui.hpp" | ||||||
| #include <VulkanUtils.hpp> | #include <VulkanUtils.hpp> | ||||||
| #include "renderSetter.h" | #include "renderSetter.h" | ||||||
| #include "GLFW/glfw3.h" | #include "vulkanFoundation.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #define STB_IMAGE_WRITE_IMPLEMENTATION | #define STB_IMAGE_WRITE_IMPLEMENTATION | ||||||
| #include "stb_image_write.h" | #include "stb_image_write.h" | ||||||
|  | @ -296,6 +299,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	 | 	 | ||||||
| 	void initWindow(int width, int height); | 	void initWindow(int width, int height); | ||||||
|  | 	 | ||||||
| 	static void framebufferResizeCallback(GLFWwindow* window, int width, int height); | 	static void framebufferResizeCallback(GLFWwindow* window, int width, int height); | ||||||
| 	void renderNode(glTFModel::Node* node, uint32_t cbIndex, glTFModel::Material::AlphaMode alphaMode); | 	void renderNode(glTFModel::Node* node, uint32_t cbIndex, glTFModel::Material::AlphaMode alphaMode); | ||||||
| 	void loadScene(std::string filename); | 	void loadScene(std::string filename); | ||||||
|  |  | ||||||
|  | @ -1,12 +1,27 @@ | ||||||
| #include "vulkanFoundation.h" | #include "vulkanFoundation.h" | ||||||
| 
 | 
 | ||||||
| VKAPI_ATTR VkBool32 VKAPI_CALL VulkanBackend::VulkanFondation::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) |  | ||||||
| { |  | ||||||
| 	std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; |  | ||||||
| 
 | 
 | ||||||
| 	return VK_FALSE; | void VulkanBackend::VulkanFondation::initVulkan() | ||||||
|  | { | ||||||
|  | 	// 创建instance
 | ||||||
|  | 	createInstance(); | ||||||
|  | 
 | ||||||
|  | 	// 设置校验层消息回调
 | ||||||
|  | 	setupDebugMessager(); | ||||||
|  | 
 | ||||||
|  | 	// 选择主机显卡
 | ||||||
|  | 	pickPhysicalDevice(); | ||||||
|  | 
 | ||||||
|  | 	// 实时显示结果的glfw surface
 | ||||||
|  | 	createSurface(); | ||||||
|  | 
 | ||||||
|  | 	// 完成逻辑设备创建
 | ||||||
|  | 	createLogicalDevice(); | ||||||
|  | 	 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void VulkanBackend::VulkanFondation::createInstance() | void VulkanBackend::VulkanFondation::createInstance() | ||||||
| { | { | ||||||
| 	// check validation layers
 | 	// check validation layers
 | ||||||
|  | @ -106,6 +121,25 @@ std::vector<const char*> VulkanBackend::VulkanFondation::getRequiredExtensions() | ||||||
| 	return extensions; | 	return extensions; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void VulkanBackend::VulkanFondation::setupDebugMessager() | ||||||
|  | { | ||||||
|  | 	if (!setter.settings.validation) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	VkDebugUtilsMessengerCreateInfoEXT createInfo{}; | ||||||
|  | 	populateDebugMessengerCreateInfo(createInfo); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	if (CreateDebugUtilsMessengerEXT(instance, &createInfo, nullptr, &debugMessenger) != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		throw std::runtime_error("failed to set up debug messenger in setupDebugMessenger"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void VulkanBackend::VulkanFondation::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo) | void VulkanBackend::VulkanFondation::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo) | ||||||
| { | { | ||||||
| 	debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; | 	debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; | ||||||
|  | @ -119,13 +153,49 @@ void VulkanBackend::VulkanFondation::populateDebugMessengerCreateInfo(VkDebugUti | ||||||
| 	debugCreateInfo.pfnUserCallback = &debugCallback; | 	debugCreateInfo.pfnUserCallback = &debugCallback; | ||||||
| 	debugCreateInfo.pUserData = nullptr; | 	debugCreateInfo.pUserData = nullptr; | ||||||
| } | } | ||||||
|  | // debugCallback用于校验层
 | ||||||
|  | VKAPI_ATTR VkBool32 VKAPI_CALL VulkanBackend::VulkanFondation::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) | ||||||
|  | { | ||||||
|  | 	{ | ||||||
|  | 		std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; | ||||||
|  | 
 | ||||||
|  | 		return VK_FALSE; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | VkResult VulkanBackend::VulkanFondation::CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) | ||||||
|  | { | ||||||
|  | 	auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); | ||||||
|  | 
 | ||||||
|  | 	if (func != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		return func(instance, pCreateInfo, pAllocator, pDebugMessenger); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		return VK_ERROR_EXTENSION_NOT_PRESENT; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| void VulkanBackend::VulkanFondation::createSurface() | void VulkanBackend::VulkanFondation::createSurface() | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|  | 	if (setter.settings.headless) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| inline void VulkanBackend::VulkanFondation::pickPhysicalDevice() | 	if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		throw std::runtime_error("failed to create window surface in createSurface()"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void VulkanBackend::VulkanFondation::pickPhysicalDevice() | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	uint32_t deviceCount = 0; | 	uint32_t deviceCount = 0; | ||||||
|  | @ -208,12 +278,13 @@ VulkanBackend::VulkanFondation::QueueFamilyIndices VulkanBackend::VulkanFondatio | ||||||
| 
 | 
 | ||||||
| 	VkBool32 presentSupport = false; | 	VkBool32 presentSupport = false; | ||||||
| 
 | 
 | ||||||
| 	// 检查队列支持
 | 	// 检查显示队列支持
 | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	if (!setter.settings.headless) | 	if (!setter.settings.headless) | ||||||
| 	{ | 	{ | ||||||
| 		vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); | 		vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	for (const auto& queueFamily : queueFamilies) | 	for (const auto& queueFamily : queueFamilies) | ||||||
| 	{ | 	{ | ||||||
| 		if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) { | 		if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) { | ||||||
|  | @ -238,9 +309,7 @@ VulkanBackend::VulkanFondation::QueueFamilyIndices VulkanBackend::VulkanFondatio | ||||||
| 		{ | 		{ | ||||||
| 			indices.presentFamily = i; | 			indices.presentFamily = i; | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		i++; | 		i++; | ||||||
| 
 |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return indices; | 	return indices; | ||||||
|  | @ -273,3 +342,83 @@ VulkanBackend::VulkanFondation::SwapChainSupportDetails VulkanBackend::VulkanFon | ||||||
| 
 | 
 | ||||||
| 	return details; | 	return details; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void VulkanBackend::VulkanFondation::createLogicalDevice() | ||||||
|  | { | ||||||
|  | 	QueueFamilyIndices indices = findQueueFamilies(physicalDevice); | ||||||
|  | 	std::vector<VkDeviceQueueCreateInfo> queueCreateInfos; | ||||||
|  | 
 | ||||||
|  | 	if (setter.settings.headless) | ||||||
|  | 	{ | ||||||
|  | 		VkDeviceQueueCreateInfo queueCreateInfo{}; | ||||||
|  | 		queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; | ||||||
|  | 		queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value(); | ||||||
|  | 		queueCreateInfo.queueCount = 1; | ||||||
|  | 		float queuePriority = 1.0f; | ||||||
|  | 		queueCreateInfo.pQueuePriorities = &queuePriority; | ||||||
|  | 		queueCreateInfos.push_back(queueCreateInfo); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		 | ||||||
|  | 		std::set<uint32_t> uniqueQueueFamilies = { indices.graphicsFamily.value(),indices.presentFamily.value() }; | ||||||
|  | 
 | ||||||
|  | 		float queuePriority = 1.0f; | ||||||
|  | 		for (uint32_t queueFamily : uniqueQueueFamilies) | ||||||
|  | 		{ | ||||||
|  | 			VkDeviceQueueCreateInfo queueCreateInfo{}; | ||||||
|  | 			queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; | ||||||
|  | 			queueCreateInfo.queueFamilyIndex = queueFamily; | ||||||
|  | 			queueCreateInfo.queueCount = 1; | ||||||
|  | 			queueCreateInfo.pQueuePriorities = &queuePriority; | ||||||
|  | 			queueCreateInfos.push_back(queueCreateInfo); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	VkPhysicalDeviceFeatures enableFeatures{}; | ||||||
|  | 	if (deviceFeatures.samplerAnisotropy) { | ||||||
|  | 		enableFeatures.samplerAnisotropy = VK_TRUE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	std::vector<const char*> enabledExtensions{}; | ||||||
|  | 	if (!setter.settings.headless) | ||||||
|  | 	{ | ||||||
|  | 		for (auto swapchainExtension: swapchainExtensions) | ||||||
|  | 		{ | ||||||
|  | 			enabledExtensions.push_back(swapchainExtension); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	VkDeviceCreateInfo deviceCreateInfo{}; | ||||||
|  | 	deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; | ||||||
|  | 	deviceCreateInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size()); | ||||||
|  | 	deviceCreateInfo.pQueueCreateInfos = queueCreateInfos.data(); | ||||||
|  | 	deviceCreateInfo.pEnabledFeatures = &enableFeatures; | ||||||
|  | 	deviceCreateInfo.enabledExtensionCount = static_cast<uint32_t>(enabledExtensions.size()); | ||||||
|  | 	deviceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data(); | ||||||
|  | 
 | ||||||
|  | 	//新版本vulkan已不对实例和设备特定验证层做区分,此处保证兼容性
 | ||||||
|  | 	if (setter.settings.validation) | ||||||
|  | 	{ | ||||||
|  | 		deviceCreateInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size()); | ||||||
|  | 		deviceCreateInfo.ppEnabledLayerNames = validationLayers.data(); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		deviceCreateInfo.enabledLayerCount = 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device) != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		throw std::runtime_error("failed to create logical device"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicQueue); | ||||||
|  | 	if (setter.settings.headless) | ||||||
|  | 	{ | ||||||
|  | 		vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -27,18 +27,18 @@ namespace VulkanBackend | ||||||
| 			//"VK_EXT_headless_surface"
 | 			//"VK_EXT_headless_surface"
 | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		VulkanBackend::Setter setter; | 		const int MAX_FRAME_IN_FLIGHT = 2; | ||||||
| 
 | 
 | ||||||
|  | 		void initVulkan(); | ||||||
| 		 | 		 | ||||||
| 		 | 		 | ||||||
| 	private: | 	private: | ||||||
|  | 		VulkanBackend::Setter setter; | ||||||
| 
 | 
 | ||||||
| 		VkInstance instance; | 		VkInstance instance; | ||||||
|  | 
 | ||||||
| 		VkDebugUtilsMessengerEXT debugMessenger; | 		VkDebugUtilsMessengerEXT debugMessenger; | ||||||
| 
 | 
 | ||||||
| 		VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; |  | ||||||
| 		VkDevice device; |  | ||||||
| 		VkSurfaceKHR surface; |  | ||||||
| 		struct QueueFamilyIndices | 		struct QueueFamilyIndices | ||||||
| 		{ | 		{ | ||||||
| 			std::optional<uint32_t> graphicsFamily; | 			std::optional<uint32_t> graphicsFamily; | ||||||
|  | @ -61,23 +61,48 @@ namespace VulkanBackend | ||||||
| 			std::vector<VkPresentModeKHR> presentModes; | 			std::vector<VkPresentModeKHR> presentModes; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
|  | 		VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; | ||||||
|  | 		VkDevice device; | ||||||
|  | 
 | ||||||
|  | 		GLFWwindow* window; | ||||||
|  | 		VkSurfaceKHR surface; | ||||||
|  | 		 | ||||||
|  | 		VkPhysicalDeviceFeatures deviceFeatures; | ||||||
|  | 		VkQueue graphicQueue; | ||||||
|  | 		VkQueue presentQueue; | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 
 | ||||||
|  | 		// 句柄创建,检查校验层支持和获取需要的扩展
 | ||||||
|  | 		void createInstance(); | ||||||
|  | 		bool checkValidationLayerSupport(); | ||||||
|  | 		std::vector<const char*> getRequiredExtensions(); | ||||||
|  | 
 | ||||||
|  | 		// 实时显示结果使用的glfwSurface,受headless配置项控制
 | ||||||
|  | 		void createSurface(); | ||||||
|  | 
 | ||||||
|  | 		// 设置校验层使用的消息回调
 | ||||||
|  | 		void setupDebugMessager(); | ||||||
|  | 		void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo); | ||||||
| 		static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( | 		static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( | ||||||
| 			VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, | 			VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, | ||||||
| 			VkDebugUtilsMessageTypeFlagsEXT messageTypes, | 			VkDebugUtilsMessageTypeFlagsEXT messageTypes, | ||||||
| 			const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, | 			const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, | ||||||
| 			void* pUserData); | 			void* pUserData); | ||||||
|  | 		VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger); | ||||||
| 		 | 		 | ||||||
| 		void createInstance(); | 		// 通过检查队列、交换链、扩展支持,选择合适的显卡
 | ||||||
| 		bool checkValidationLayerSupport(); |  | ||||||
| 		std::vector<const char*> getRequiredExtensions(); |  | ||||||
| 		void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo); |  | ||||||
| 		 |  | ||||||
| 		void createSurface(); |  | ||||||
| 		void pickPhysicalDevice(); | 		void pickPhysicalDevice(); | ||||||
| 		bool isDeviceSuitable(VkPhysicalDevice device); | 		bool isDeviceSuitable(VkPhysicalDevice device); | ||||||
| 		bool checkDeviceExtensionSupport(VkPhysicalDevice device); | 		bool checkDeviceExtensionSupport(VkPhysicalDevice device); | ||||||
| 		VulkanBackend::VulkanFondation::QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); | 		VulkanBackend::VulkanFondation::QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); | ||||||
| 		VulkanBackend::VulkanFondation::SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); | 		VulkanBackend::VulkanFondation::SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); | ||||||
|  | 
 | ||||||
|  | 		// 创建程序使用的逻辑显卡设备
 | ||||||
|  | 
 | ||||||
|  | 		void createLogicalDevice(); | ||||||
|  | 		 | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	VulkanFondation::VulkanFondation() | 	VulkanFondation::VulkanFondation() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue