1
0

Selecting logical devices en queues

This commit is contained in:
2021-11-24 17:06:41 +01:00
parent 54227af8b9
commit 85346d98c7
4 changed files with 52 additions and 6 deletions

3
Hello_triangle/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.vscode
bin

View File

@@ -2,12 +2,12 @@ CFLAGS = -std=c++17 -O2
LDFLAGS = -lglfw3 -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi
VulkanTest: main.cpp
g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)
g++ $(CFLAGS) -o ./bin/VulkanTest main.cpp $(LDFLAGS)
.PHONY: test clean
test: VulkanTest
./VulkanTest
./bin/VulkanTest
clean:
rm -f VulkanTest

Binary file not shown.

View File

@@ -1,7 +1,6 @@
/*
Following the vulkan tutorial on :
https://vulkan-tutorial.com/en/Drawing_a_triangle/Setup/Instance
https://vulkan-tutorial.com/en/Drawing_a_triangle/Presentation/Window_surface
*/
#define GLFW_INCLUDE_VULKAN
@@ -13,7 +12,6 @@
#include <cstring>
#include <optional>
const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600;
@@ -45,6 +43,9 @@ class HelloTriangleApplication{
VkInstance instance;
VkDebugUtilsMessengerEXT debugMessenger;
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
VkDevice device;
VkQueue graphicsQueue;
void initWindow(){
glfwInit();
@@ -59,8 +60,49 @@ class HelloTriangleApplication{
createInstance();
setupDebugMessenger();
pickPhysicalDevice();
createLogicalDevice();
}
void createLogicalDevice(){
QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
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;
VkPhysicalDeviceFeatures deviceFeatures{};
VkDeviceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.queueCreateInfoCount = 1;
createInfo.pEnabledFeatures = &deviceFeatures;
createInfo.enabledExtensionCount = 0;
if(enableValidationLayers){
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
createInfo.ppEnabledLayerNames = validationLayers.data();
} else{
createInfo.enabledLayerCount = 0 ;
}
if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS){
throw std::runtime_error("failed to create logical device");
}
vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0 , &graphicsQueue);
}
void pickPhysicalDevice(){
uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
@@ -255,6 +297,7 @@ class HelloTriangleApplication{
}
void cleanup(){
vkDestroyDevice(device, nullptr);
if(enableValidationLayers){
DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
}