完成设备创建和队列创建
parent
ea503c3911
commit
079bd0f81e
|
@ -84,17 +84,7 @@ void HelloTriangleApplication::createInstance() {
|
||||||
throw std::runtime_error("failed to create instance");
|
throw std::runtime_error("failed to create instance");
|
||||||
}
|
}
|
||||||
|
|
||||||
// show available extensions
|
|
||||||
|
|
||||||
uint32_t availableExtensionCount = 0;
|
|
||||||
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, nullptr);
|
|
||||||
std::vector<VkExtensionProperties> availableExtensions(availableExtensionCount);
|
|
||||||
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, availableExtensions.data());
|
|
||||||
std::cout << "available extensions :" << std::endl;
|
|
||||||
for (const auto& extension : availableExtensions)
|
|
||||||
{
|
|
||||||
std::cout << "\t" << extension.extensionName << " ver:" << extension.specVersion << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,8 +94,15 @@ void HelloTriangleApplication::initVulkan() {
|
||||||
|
|
||||||
createInstance();
|
createInstance();
|
||||||
|
|
||||||
|
showAvailableExtension();
|
||||||
|
|
||||||
setupDebugMessenger();
|
setupDebugMessenger();
|
||||||
|
|
||||||
|
createSurface();
|
||||||
|
|
||||||
|
pickPhysicalDevice();
|
||||||
|
|
||||||
|
createLogicalDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,16 +120,22 @@ void HelloTriangleApplication::mainLoop(GLFWwindow* window){
|
||||||
|
|
||||||
void HelloTriangleApplication::cleanup(GLFWwindow* window) {
|
void HelloTriangleApplication::cleanup(GLFWwindow* window) {
|
||||||
|
|
||||||
|
vkDestroyDevice(device, nullptr);
|
||||||
|
|
||||||
if (enableValidationLayers)
|
if (enableValidationLayers)
|
||||||
{
|
{
|
||||||
DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
|
DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vkDestroySurfaceKHR(instance, surface, nullptr);
|
||||||
|
|
||||||
vkDestroyInstance(instance, nullptr);
|
vkDestroyInstance(instance, nullptr);
|
||||||
|
|
||||||
glfwDestroyWindow(window);
|
glfwDestroyWindow(window);
|
||||||
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<const char*> HelloTriangleApplication::getRequiredExtensions() {
|
std::vector<const char*> HelloTriangleApplication::getRequiredExtensions() {
|
||||||
|
@ -152,6 +155,21 @@ std::vector<const char*> HelloTriangleApplication::getRequiredExtensions() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HelloTriangleApplication::showAvailableExtension()
|
||||||
|
{
|
||||||
|
// show available extensions
|
||||||
|
|
||||||
|
uint32_t availableExtensionCount = 0;
|
||||||
|
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, nullptr);
|
||||||
|
std::vector<VkExtensionProperties> availableExtensions(availableExtensionCount);
|
||||||
|
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, availableExtensions.data());
|
||||||
|
std::cout << "available extensions :" << std::endl;
|
||||||
|
for (const auto& extension : availableExtensions)
|
||||||
|
{
|
||||||
|
std::cout << "\t" << extension.extensionName << " ver:" << extension.specVersion << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VKAPI_ATTR VkBool32 VKAPI_CALL HelloTriangleApplication::debugCallback(
|
VKAPI_ATTR VkBool32 VKAPI_CALL HelloTriangleApplication::debugCallback(
|
||||||
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
||||||
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
|
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
|
||||||
|
@ -196,6 +214,141 @@ void HelloTriangleApplication::populateDebugMessengerCreateInfo(VkDebugUtilsMess
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HelloTriangleApplication::createSurface()
|
||||||
|
{
|
||||||
|
if (glfwCreateWindowSurface(instance,window,nullptr,&surface) != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("failed to create window surface in createSurface()");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelloTriangleApplication::pickPhysicalDevice()
|
||||||
|
{
|
||||||
|
uint32_t deviceCount = 0;
|
||||||
|
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
|
||||||
|
if (deviceCount==0)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("failed to find GPUs with Vulkan support");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<VkPhysicalDevice> devices(deviceCount);
|
||||||
|
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
|
||||||
|
|
||||||
|
for (const auto& device : devices)
|
||||||
|
{
|
||||||
|
if (isDeviceSuitable(device))
|
||||||
|
{
|
||||||
|
physicalDevice = device;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (physicalDevice == VK_NULL_HANDLE)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("failed to find a suitable GPU");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HelloTriangleApplication::isDeviceSuitable(VkPhysicalDevice device)
|
||||||
|
{
|
||||||
|
QueueFamilyIndices indices = findQueueFamilies(device);
|
||||||
|
|
||||||
|
return indices.isComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
HelloTriangleApplication::QueueFamilyIndices HelloTriangleApplication::findQueueFamilies(VkPhysicalDevice device)
|
||||||
|
{
|
||||||
|
QueueFamilyIndices indices;
|
||||||
|
|
||||||
|
uint32_t queueFamilyCount = 0;
|
||||||
|
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
|
||||||
|
|
||||||
|
std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
|
||||||
|
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
|
||||||
|
|
||||||
|
VkBool32 presentSupport = false;
|
||||||
|
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);
|
||||||
|
for (const auto& queueFamily : queueFamilies)
|
||||||
|
{
|
||||||
|
if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
|
||||||
|
indices.graphicsFamily = i;
|
||||||
|
}
|
||||||
|
if (indices.isComplete())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (presentSupport)
|
||||||
|
{
|
||||||
|
indices.presentFamily = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return indices;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelloTriangleApplication::createLogicalDevice()
|
||||||
|
{
|
||||||
|
QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
|
||||||
|
|
||||||
|
std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
*/
|
||||||
|
|
||||||
|
VkDeviceCreateInfo deviceCreateInfo{};
|
||||||
|
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||||
|
deviceCreateInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
|
||||||
|
deviceCreateInfo.pQueueCreateInfos = queueCreateInfos.data();
|
||||||
|
deviceCreateInfo.pEnabledFeatures = &deviceFeatures;
|
||||||
|
//新版本vulkan已不对实例和设备特定验证层做区分,此处保证兼容性
|
||||||
|
deviceCreateInfo.enabledExtensionCount = 0;
|
||||||
|
if (enableValidationLayers)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool HelloTriangleApplication::checkValidationLayerSupport() {
|
bool HelloTriangleApplication::checkValidationLayerSupport() {
|
||||||
uint32_t layerCount;
|
uint32_t layerCount;
|
||||||
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
|
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
|
||||||
|
|
|
@ -3,14 +3,17 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
#define GLFW_INCLUDE_VULKAN
|
#define GLFW_INCLUDE_VULKAN
|
||||||
#include<GLFW/glfw3.h>
|
#include<GLFW/glfw3.h>
|
||||||
|
|
||||||
#include<vulkan/vulkan.h>
|
#include<vulkan/vulkan.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <optional>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,const VkAllocationCallbacks* pAllocator,VkDebugUtilsMessengerEXT* pDebugMessenger);
|
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,const VkAllocationCallbacks* pAllocator,VkDebugUtilsMessengerEXT* pDebugMessenger);
|
||||||
|
|
||||||
|
@ -36,6 +39,29 @@ private:
|
||||||
|
|
||||||
VkDebugUtilsMessengerEXT debugMessenger;
|
VkDebugUtilsMessengerEXT debugMessenger;
|
||||||
|
|
||||||
|
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
VkDevice device;
|
||||||
|
|
||||||
|
VkPhysicalDeviceFeatures deviceFeatures{};
|
||||||
|
|
||||||
|
VkQueue graphicQueue;
|
||||||
|
VkQueue presentQueue;
|
||||||
|
|
||||||
|
VkSurfaceKHR surface;
|
||||||
|
|
||||||
|
struct QueueFamilyIndices
|
||||||
|
{
|
||||||
|
std::optional<uint32_t> graphicsFamily;
|
||||||
|
std::optional<uint32_t> presentFamily;
|
||||||
|
|
||||||
|
bool isComplete() {
|
||||||
|
return graphicsFamily.has_value() && presentFamily.has_value();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GLFWwindow* initWindow(int Width, int Height);
|
GLFWwindow* initWindow(int Width, int Height);
|
||||||
|
|
||||||
void createInstance();
|
void createInstance();
|
||||||
|
@ -50,6 +76,8 @@ private:
|
||||||
|
|
||||||
std::vector<const char*> getRequiredExtensions();
|
std::vector<const char*> getRequiredExtensions();
|
||||||
|
|
||||||
|
void showAvailableExtension();
|
||||||
|
|
||||||
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
|
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
|
||||||
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
||||||
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
|
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
|
||||||
|
@ -57,9 +85,17 @@ private:
|
||||||
void* pUserData);
|
void* pUserData);
|
||||||
|
|
||||||
void setupDebugMessenger();
|
void setupDebugMessenger();
|
||||||
|
|
||||||
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
|
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
|
||||||
|
|
||||||
|
void createSurface();
|
||||||
|
|
||||||
|
void pickPhysicalDevice();
|
||||||
|
bool isDeviceSuitable(VkPhysicalDevice device);
|
||||||
|
|
||||||
|
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);
|
||||||
|
|
||||||
|
void createLogicalDevice();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
HelloTriangleApplication::HelloTriangleApplication()
|
HelloTriangleApplication::HelloTriangleApplication()
|
||||||
|
|
Loading…
Reference in New Issue