diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f8e21bd..9531ffb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 ) diff --git a/src/render/render.cpp b/src/render/render.cpp index 7915081..d584e6f 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -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(requiredExtensions.size()); - createInfo.ppEnabledExtensionNames = requiredExtensions.data(); + + std::vector 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(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 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 PlumageRender::getRequiredExtensions() { - + /* uint32_t glfwExtensionCount = 0; const char** glfwExtensions; glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); @@ -125,8 +119,8 @@ std::vector PlumageRender::getRequiredExtensions() if (settings.headless) { extensions.clear(); - } - + }*/ + std::vector extensions; if (settings.validation) { extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); @@ -140,18 +134,14 @@ std::vector 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(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT")); + vkDestroyDebugReportCallback = reinterpret_cast(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(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(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]; diff --git a/src/render/render.h b/src/render/render.h index 5f9b65a..920b6cf 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -12,7 +12,7 @@ #define GLFW_INCLUDE_VULKAN #include - +#include #include #include #include @@ -30,8 +30,8 @@ #include #include #include -#include -#include +#include + // #include @@ -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; // 图片序列开关(暂时弃用)