further vulkan stuff

This commit is contained in:
lukas 2020-05-03 00:33:11 +02:00
parent df4ebe6078
commit f93891f1fd

View File

@ -1,8 +1,25 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include "vulkan/vulkan.h" #include "vulkan/vulkan.h"
int main() { VkInstance instance;
VkDevice device;
VkSurfaceKHR surface;
GLFWwindow *window;
void startGlfw() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, false);
window = glfwCreateWindow(400, 300, "Vulkan Test", nullptr, nullptr);
}
void startVulkan() {
VkApplicationInfo appinfo; // general app info VkApplicationInfo appinfo; // general app info
appinfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appinfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appinfo.pNext = nullptr; appinfo.pNext = nullptr;
@ -29,6 +46,9 @@ int main() {
"VK_LAYER_NV_optimus" "VK_LAYER_NV_optimus"
}; };
uint32_t amountOfGlfwExtensins = 0;
auto glfWExtensions = glfwGetRequiredInstanceExtensions(&amountOfGlfwExtensins);
VkInstanceCreateInfo instanceInfo; VkInstanceCreateInfo instanceInfo;
instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instanceInfo.pNext = nullptr; instanceInfo.pNext = nullptr;
@ -36,15 +56,19 @@ int main() {
instanceInfo.pApplicationInfo = &appinfo; instanceInfo.pApplicationInfo = &appinfo;
instanceInfo.enabledLayerCount = validationLayers.size(); instanceInfo.enabledLayerCount = validationLayers.size();
instanceInfo.ppEnabledLayerNames = validationLayers.data(); instanceInfo.ppEnabledLayerNames = validationLayers.data();
instanceInfo.enabledExtensionCount = 0; instanceInfo.enabledExtensionCount = amountOfGlfwExtensins;
instanceInfo.ppEnabledExtensionNames = nullptr; instanceInfo.ppEnabledExtensionNames = glfWExtensions;
VkInstance instance;
// create vulkan instance // create vulkan instance
if (vkCreateInstance(&instanceInfo, nullptr, &instance) != VK_SUCCESS) { if (vkCreateInstance(&instanceInfo, nullptr, &instance) != VK_SUCCESS) {
std::cout << "error on creating vkinstance" << std::endl; std::cout << "error on creating vkinstance" << std::endl;
} }
if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
std::cout << "error on creating surface" << std::endl;
}
std::cout << "detecting gpus." << std::endl; std::cout << "detecting gpus." << std::endl;
uint32_t physicaldevicesnumber = 0; uint32_t physicaldevicesnumber = 0;
@ -75,10 +99,36 @@ int main() {
std::cout << std::endl; std::cout << std::endl;
} }
VkSurfaceCapabilitiesKHR surfaceCapabilities;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevices.at(0), surface, &surfaceCapabilities);
std::cout << "\tminImageCount: " << surfaceCapabilities.minImageCount << std::endl;
std::cout << "\tmaxImageCount: " << surfaceCapabilities.maxImageCount << std::endl;
std::cout << "\tcurrentExtent: " << surfaceCapabilities.currentExtent.height << "/"
<< surfaceCapabilities.currentExtent.width << std::endl;
std::cout << "\tminImageExtent: " << surfaceCapabilities.minImageExtent.height << "/"
<< surfaceCapabilities.minImageExtent.width << std::endl;
std::cout << "\tmaxImageExtent: " << surfaceCapabilities.maxImageExtent.height << "/"
<< surfaceCapabilities.maxImageExtent.width << std::endl;
std::cout << "\tmaxImageArrayLayers: " << surfaceCapabilities.maxImageArrayLayers << std::endl;
std::cout << "\tsupportedTransforms: " << surfaceCapabilities.supportedTransforms << std::endl;
std::cout << "\tcurrentTransform: " << surfaceCapabilities.currentTransform << std::endl;
std::cout << "\tsupportedCompositeAlpha: " << surfaceCapabilities.supportedCompositeAlpha << std::endl;
std::cout << "\tsupportedUsageFlags: " << surfaceCapabilities.supportedUsageFlags << std::endl;
uint32_t amountOfFormats = 0;
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevices.at(0), surface, &amountOfFormats, nullptr);
auto *surfaceFormats = new VkSurfaceFormatKHR[amountOfFormats];
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevices.at(0), surface, &amountOfFormats, surfaceFormats);
for(int i = 0; i < amountOfFormats; i++){
std::cout << "format supported: " << surfaceFormats[i].format << std::endl;
}
uint32_t amountOfExtensions = 0; uint32_t amountOfExtensions = 0;
vkEnumerateInstanceExtensionProperties(NULL, &amountOfExtensions, NULL); vkEnumerateInstanceExtensionProperties(nullptr, &amountOfExtensions, nullptr);
VkExtensionProperties *extensions = new VkExtensionProperties[amountOfExtensions]; auto *extensions = new VkExtensionProperties[amountOfExtensions];
vkEnumerateInstanceExtensionProperties(NULL, &amountOfExtensions, extensions); vkEnumerateInstanceExtensionProperties(nullptr, &amountOfExtensions, extensions);
std::cout << "found " << amountOfExtensions << " extensions" << std::endl; std::cout << "found " << amountOfExtensions << " extensions" << std::endl;
for (int i = 0; i < amountOfExtensions; i++) { for (int i = 0; i < amountOfExtensions; i++) {
@ -110,19 +160,40 @@ int main() {
deviceCreateInfo.pEnabledFeatures = &usedFeatures; deviceCreateInfo.pEnabledFeatures = &usedFeatures;
std::cout << "creating logical device" << std::endl; std::cout << "creating logical device" << std::endl;
VkDevice device;
if (vkCreateDevice(physicalDevices.at(0), &deviceCreateInfo, NULL, &device) != if (vkCreateDevice(physicalDevices.at(0), &deviceCreateInfo, NULL, &device) !=
VK_SUCCESS) { // todo select right physicaldevice VK_SUCCESS) { // todo select right physicaldevice
std::cout << "create logical device failed." << std::endl; std::cout << "create logical device failed." << std::endl;
} }
// stop jobs
vkDeviceWaitIdle(device); // waits until any work has finished
vkDestroyDevice(device, nullptr);
vkDestroyInstance(instance, nullptr);
delete[] layers; delete[] layers;
delete[] extensions; delete[] extensions;
}
void gameLoop() {
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
}
void shutdownVulkan() {
vkDeviceWaitIdle(device); // waits until any work has finished
vkDestroyDevice(device, nullptr);
vkDestroySurfaceKHR(instance, surface, nullptr);
vkDestroyInstance(instance, nullptr);
}
void shutdownGlfw() {
glfwDestroyWindow(window);
}
int main() {
startGlfw();
startVulkan();
gameLoop();
shutdownVulkan();
shutdownGlfw();
return 0; return 0;
} }