fix instance creation error

ink-soul 2024-04-15 11:32:00 +08:00
parent 9a48337d87
commit b9294307a6
3 changed files with 67 additions and 82 deletions

View File

@ -39,7 +39,7 @@ function(buildHomework HOMEWORK_NAME)
"render/glTFModel.cpp" "render/glTFModel.cpp"
"render/renderFoundation.h" "render/renderFoundation.cpp") "render/renderFoundation.h" "render/renderFoundation.cpp")
target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} glfw ) target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} )
else(WIN32) else(WIN32)
add_executable(${HOMEWORK_NAME} ${MAIN_CPP} ${SOURCE} ${MAIN_HEADER} ${SHADERS_GLSL} ${SHADERS_HLSL} ${README_FILES}) add_executable(${HOMEWORK_NAME} ${MAIN_CPP} ${SOURCE} ${MAIN_HEADER} ${SHADERS_GLSL} ${SHADERS_HLSL} ${README_FILES})
target_link_libraries(${HOMEWORK_NAME} base ) target_link_libraries(${HOMEWORK_NAME} base )

View File

@ -30,7 +30,7 @@ void PlumageRender::initVulkan()
{ {
createInstance(); createInstance();
createSurface(); //createSurface();
pickupPhysicalDevice(); pickupPhysicalDevice();
} }
@ -43,14 +43,10 @@ VkResult PlumageRender::createInstance()
throw std::runtime_error("validation layers requsted,but not available"); throw std::runtime_error("validation layers requsted,but not available");
} }
//setup appliaction info VkApplicationInfo appInfo = {};
VkApplicationInfo appInfo{};
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "Hello Triangle"; appInfo.pApplicationName = name.c_str();
appInfo.applicationVersion = VK_API_VERSION_1_0; appInfo.pEngineName = name.c_str();
appInfo.pEngineName = "No_Engine";
appInfo.engineVersion = VK_MAKE_API_VERSION(1, 0, 0,0);
appInfo.apiVersion = VK_API_VERSION_1_0; appInfo.apiVersion = VK_API_VERSION_1_0;
// setup createInfo // setup createInfo
@ -58,33 +54,31 @@ VkResult PlumageRender::createInstance()
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo; createInfo.pApplicationInfo = &appInfo;
auto requiredExtensions = getRequiredExtensions();
createInfo.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size()); std::vector<const char*> instanceExtensions = { };
createInfo.ppEnabledExtensionNames = requiredExtensions.data();
// enable validation layer if available in createInfo VkInstanceCreateInfo instanceCreateInfo = {};
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
if (settings.validation) instanceCreateInfo.pNext = NULL;
instanceCreateInfo.pApplicationInfo = &appInfo;
if (instanceExtensions.size() > 0)
{ {
createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size()); if (settings.validation) {
createInfo.ppEnabledLayerNames = validationLayers.data(); instanceExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
}
populateDebugMessengerCreateInfo(debugCreateInfo); instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size();
createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*)&debugCreateInfo; instanceCreateInfo.ppEnabledExtensionNames = instanceExtensions.data();
} }
else std::vector<const char*> validationLayerNames;
{ if (settings.validation) {
createInfo.enabledLayerCount = 0; validationLayerNames.push_back("VK_LAYER_KHRONOS_validation");
createInfo.pNext = nullptr; instanceCreateInfo.enabledLayerCount = (uint32_t)validationLayerNames.size();
instanceCreateInfo.ppEnabledLayerNames = validationLayerNames.data();
} }
return vkCreateInstance(&instanceCreateInfo, nullptr, &instance);
// throw error in creating instance
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)
{
throw std::runtime_error("failed to create instance");
}
} }
bool PlumageRender::checkValidationLayerSupport() bool PlumageRender::checkValidationLayerSupport()
@ -117,7 +111,7 @@ bool PlumageRender::checkValidationLayerSupport()
std::vector<const char*> PlumageRender::getRequiredExtensions() std::vector<const char*> PlumageRender::getRequiredExtensions()
{ {
/*
uint32_t glfwExtensionCount = 0; uint32_t glfwExtensionCount = 0;
const char** glfwExtensions; const char** glfwExtensions;
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
@ -125,8 +119,8 @@ std::vector<const char*> PlumageRender::getRequiredExtensions()
if (settings.headless) if (settings.headless)
{ {
extensions.clear(); extensions.clear();
} }*/
std::vector<const char*> extensions;
if (settings.validation) if (settings.validation)
{ {
extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
@ -140,18 +134,14 @@ std::vector<const char*> PlumageRender::getRequiredExtensions()
void PlumageRender::setupDebugMessager() void PlumageRender::setupDebugMessager()
{ {
if (!settings.validation) if (settings.validation) {
{ vkCreateDebugReportCallback = reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT"));
return; vkDestroyDebugReportCallback = reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT"));
} VkDebugReportCallbackCreateInfoEXT debugCreateInfo{};
debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
VkDebugUtilsMessengerCreateInfoEXT createInfo{}; debugCreateInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT)debugMessageCallback;
populateDebugMessengerCreateInfo(createInfo); debugCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
VK_CHECK_RESULT(vkCreateDebugReportCallback(instance, &debugCreateInfo, nullptr, &debugReportCallback));
if (CreateDebugUtilsMessengerEXT(instance, &createInfo, nullptr, &debugMessenger) != VK_SUCCESS)
{
throw std::runtime_error("failed to set up debug messenger in setupDebugMessenger");
} }
} }
@ -172,7 +162,7 @@ void PlumageRender::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreate
VKAPI_ATTR VkBool32 VKAPI_CALL PlumageRender::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) VKAPI_ATTR VkBool32 VKAPI_CALL PlumageRender::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData)
{ {
{ {
std::cerr << "validation layer: " << pCallbackData->pMessage << "/n" << std::endl; std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl;
return VK_FALSE; return VK_FALSE;
} }
@ -208,11 +198,11 @@ void PlumageRender::createSurface()
{ {
return; return;
} }
/*
if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS)
{ {
throw std::runtime_error("failed to create window surface in createSurface()"); throw std::runtime_error("failed to create window surface in createSurface()");
} }*/
} }
void PlumageRender::pickupPhysicalDevice() void PlumageRender::pickupPhysicalDevice()
@ -432,7 +422,7 @@ void PlumageRender::createLogicalDevice()
} }
vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicQueue); vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicQueue);
if (settings.headless) if (!settings.headless)
{ {
vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
} }
@ -559,7 +549,7 @@ VkExtent2D PlumageRender::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capab
else else
{ {
int width, height; int width, height;
glfwGetFramebufferSize(window, &width, &height); //glfwGetFramebufferSize(window, &width, &height);
VkExtent2D actualExtent = { VkExtent2D actualExtent = {
static_cast<uint32_t>(width), static_cast<uint32_t>(width),
@ -597,6 +587,7 @@ void PlumageRender::createCommandPool()
poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value(); poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value();
if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS)
{ {
throw std::runtime_error("failed to create command pool in createCommandpool"); throw std::runtime_error("failed to create command pool in createCommandpool");
@ -1157,11 +1148,13 @@ void PlumageRender::renderLoop()
} }
else else
{ {
/*
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
{ {
glfwPollEvents(); glfwPollEvents();
drawFrame(); drawFrame();
} }
*/
} }
vkDeviceWaitIdle(device); vkDeviceWaitIdle(device);
} }
@ -1205,6 +1198,7 @@ bool PlumageRender::swapChainAcquireNextImage(bool framebuffeerResized, uint32_t
void PlumageRender::recreateSwapChain() void PlumageRender::recreateSwapChain()
{ {
/*
int width = 0, height = 0; int width = 0, height = 0;
glfwGetFramebufferSize(window, &width, &height); glfwGetFramebufferSize(window, &width, &height);
while (width == 0 || height == 0) while (width == 0 || height == 0)
@ -1223,7 +1217,7 @@ void PlumageRender::recreateSwapChain()
createSwapChain(); createSwapChain();
createImageView(); createImageView();
createFramebuffer(); createFramebuffer();*/
} }
void PlumageRender::submitToGraphicQueue(uint32_t frameIndex, uint32_t currentBuffer) void PlumageRender::submitToGraphicQueue(uint32_t frameIndex, uint32_t currentBuffer)
@ -1427,7 +1421,7 @@ void PlumageRender::buildCommandBuffers()
} }
// User interface // User interface
gui->draw(currentCB); //gui->draw(currentCB);
vkCmdEndRenderPass(currentCB); vkCmdEndRenderPass(currentCB);
VK_CHECK_RESULT(vkEndCommandBuffer(currentCB)); VK_CHECK_RESULT(vkEndCommandBuffer(currentCB));
@ -2773,32 +2767,27 @@ void PlumageRender::updateShaderData()
void PlumageRender::initWindow(int Width, int Height) void PlumageRender::initWindow(int Width, int Height)
{ {
/*
glfwInit(); glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
window = glfwCreateWindow(Width, Height, "vulkan", nullptr, nullptr); window = glfwCreateWindow(Width, Height, "vulkan", nullptr, nullptr);
glfwSetWindowUserPointer(window, this); glfwSetWindowUserPointer(window, this);
glfwSetFramebufferSizeCallback(window, framebufferResizeCallback); glfwSetFramebufferSizeCallback(window, framebufferResizeCallback);
*/
} }
/*
void PlumageRender::framebufferResizeCallback(GLFWwindow* window, int width, int height) void PlumageRender::framebufferResizeCallback(GLFWwindow* window, int width, int height)
{ {
auto app = reinterpret_cast<PlumageRender*>(glfwGetWindowUserPointer(window)); auto app = reinterpret_cast<PlumageRender*>(glfwGetWindowUserPointer(window));
app->framebufferResized = true; app->framebufferResized = true;
} }
*/
void PlumageRender::windowResized()
{
buildCommandBuffers();
vkDeviceWaitIdle(device);
updateUniformBuffers();
//update UI
updateUIOverlay();
}
void PlumageRender::prepare() void PlumageRender::prepare()
{ {
createSwapChain(); //createSwapChain();
createCommandPool(); createCommandPool();
@ -2814,9 +2803,9 @@ void PlumageRender::prepare()
waitFences.resize(renderAhead); waitFences.resize(renderAhead);
presentCompleteSemaphores.resize(renderAhead); presentCompleteSemaphores.resize(renderAhead);
renderCompleteSemaphores.resize(renderAhead); renderCompleteSemaphores.resize(renderAhead);
commandBuffers.resize(swapChainImages.size()); commandBuffers.resize(renderAhead);
uniformBuffers.resize(swapChainImages.size()); uniformBuffers.resize(renderAhead);
descriptorSets.resize(swapChainImages.size()); descriptorSets.resize(renderAhead);
// Command buffer execution fences // Command buffer execution fences
for (auto& waitFence : waitFences) { for (auto& waitFence : waitFences) {
VkFenceCreateInfo fenceCI{ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT }; VkFenceCreateInfo fenceCI{ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
@ -2848,8 +2837,8 @@ void PlumageRender::prepare()
setupDescriptors(); setupDescriptors();
preparePipelines(); preparePipelines();
gui = new UI(vulkanDevice, renderPass, graphicQueue, pipelineCache, settings.sampleCount); //gui = new UI(vulkanDevice, renderPass, graphicQueue, pipelineCache, settings.sampleCount);
updateUIOverlay(); //updateUIOverlay();
buildCommandBuffers(); buildCommandBuffers();
@ -3236,10 +3225,11 @@ void PlumageRender::render()
uint32_t imageIndex; uint32_t imageIndex;
/*
if (settings.headless) if (settings.headless)
{ {
updateUIOverlay(); updateUIOverlay();
} }*/
//加入写到文件的函数 //加入写到文件的函数
//swapChainImage = swapChain.images[frameIndex]; //swapChainImage = swapChain.images[frameIndex];

View File

@ -12,7 +12,7 @@
#define GLFW_INCLUDE_VULKAN #define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <stdexcept>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <cstdio> #include <cstdio>
@ -30,8 +30,8 @@
#include <iostream> #include <iostream>
#include <optional> #include <optional>
#include <filesystem> #include <filesystem>
#include <cstdint> #include <cstdlib>
#include <stdexcept>
// //
#include <commdlg.h> #include <commdlg.h>
@ -46,12 +46,6 @@
#define ENABLE_VALIDATION false
class PlumageRender class PlumageRender
{ {
public: public:
@ -74,8 +68,9 @@ public:
//"VK_EXT_headless_surface" //"VK_EXT_headless_surface"
}; };
std::string title; std::string title = "render";
std::string name = "plumage"; std::string name = "plumage";
VkInstance instance;
Camera camera; Camera camera;
VkPhysicalDevice physicalDevice; VkPhysicalDevice physicalDevice;
@ -159,7 +154,7 @@ public:
}chineseUI; }chineseUI;
VkInstance instance;
struct UniformBufferSet { struct UniformBufferSet {
Buffer scene; Buffer scene;
@ -253,7 +248,7 @@ public:
bool vsync = false; // 垂直同步开关 bool vsync = false; // 垂直同步开关
bool multiSampling = true; // 多重采样 bool multiSampling = true; // 多重采样
bool rotateModel = true; // 模型自旋转(暂时失效) bool rotateModel = true; // 模型自旋转(暂时失效)
bool headless = false; // 无头开关 bool headless = true; // 无头开关
bool outputPNGimage = false; bool outputPNGimage = false;
uint32_t endFrameIndex = 75; uint32_t endFrameIndex = 75;
bool enableSaveToImageSequeue = true; // 图片序列开关(暂时弃用) bool enableSaveToImageSequeue = true; // 图片序列开关(暂时弃用)