fix instance creation error
parent
9a48337d87
commit
b9294307a6
|
@ -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 )
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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; // 图片序列开关(暂时弃用)
|
||||
|
|
Loading…
Reference in New Issue