fix instance creation error
parent
9a48337d87
commit
b9294307a6
|
@ -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 )
|
||||||
|
|
|
@ -30,7 +30,7 @@ void PlumageRender::initVulkan()
|
||||||
{
|
{
|
||||||
createInstance();
|
createInstance();
|
||||||
|
|
||||||
createSurface();
|
//createSurface();
|
||||||
|
|
||||||
pickupPhysicalDevice();
|
pickupPhysicalDevice();
|
||||||
}
|
}
|
||||||
|
@ -43,48 +43,42 @@ 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
|
||||||
VkInstanceCreateInfo createInfo{};
|
VkInstanceCreateInfo createInfo{};
|
||||||
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();
|
||||||
|
|
||||||
// throw error in creating instance
|
|
||||||
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)
|
|
||||||
{
|
|
||||||
throw std::runtime_error("failed to create instance");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return vkCreateInstance(&instanceCreateInfo, nullptr, &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),
|
||||||
|
@ -596,6 +586,7 @@ void PlumageRender::createCommandPool()
|
||||||
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -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];
|
||||||
|
|
|
@ -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; // 图片序列开关(暂时弃用)
|
||||||
|
|
Loading…
Reference in New Issue