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/renderFoundation.h" "render/renderFoundation.cpp")
target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} glfw )
target_link_libraries(${HOMEWORK_NAME} base ${Vulkan_LIBRARY} )
else(WIN32)
add_executable(${HOMEWORK_NAME} ${MAIN_CPP} ${SOURCE} ${MAIN_HEADER} ${SHADERS_GLSL} ${SHADERS_HLSL} ${README_FILES})
target_link_libraries(${HOMEWORK_NAME} base )

View File

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

View File

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