CONGE-2 Added better login in Demo1 and added error handling in VulkanContext.cpp

This commit is contained in:
Jimmy Tremblay-Bernier 2024-11-22 20:29:48 -05:00
parent 829c7b5c52
commit 15f8898808
4 changed files with 163 additions and 24 deletions

View File

@ -15,13 +15,32 @@ namespace ConjureEngine {
void VulkanContext::AttachTo(SDL_Window* window, const VkApplicationInfo& appInfo)
{
// LOAD THE EXTENSIONS
SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, nullptr);
// LOAD THE EXTENSIONS
SDL_bool sdlSuccess;
VkResult vk_result;
// FETCH NUMBER OF EXTENSIONS TO RESERVE SPACE IN VECTOR
sdlSuccess = SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, nullptr);
if(sdlSuccess != SDL_TRUE)
{
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error Getting Extensions: %s", SDL_GetError());
exit(1);
}
m_extensionNames.reserve(m_extensionCount);
SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, m_extensionNames.data());
// FILLING UP THE VECTOR
sdlSuccess = SDL_Vulkan_GetInstanceExtensions(window, &m_extensionCount, m_extensionNames.data());
if(sdlSuccess != SDL_TRUE)
{
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error Getting Extensions: %s", SDL_GetError());
exit(1);
}
else
{
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM,"FETCHING OF EXTENSION FINISHED SUCCESSFULLY");
}
// Fill the instance create info using appInfo
// Fill the instance create info struct using appInfo
VkInstanceCreateInfo vulkanInfos{};
vulkanInfos.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
vulkanInfos.pApplicationInfo = &appInfo;
@ -29,26 +48,57 @@ namespace ConjureEngine {
// ENABLE THE REQUIRED EXTENSIONS
this->EnableGlobalExtentions(window, vulkanInfos);
// CREATE VULKAN INSTANCE
vkCreateInstance(&vulkanInfos, nullptr, &m_vkInst);
// CREATE THE VULKAN INSTANCE
vk_result = vkCreateInstance(&vulkanInfos, nullptr, &m_vkInst);
if(vk_result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error while creating the device: CODE = %d", static_cast<int>(vk_result));
exit(1);
}
else {
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM,"VULKAN INSTANCE CREATED SUCCESSFULLY");
}
// LOAD THE PHYSICAL DEVICES (GPUs)
vkEnumeratePhysicalDevices(m_vkInst, &m_physicalDeviceCount, nullptr);
// FETCH THE NUMBER OF PHYSICAL DEVICES (GPUs) TO RESERVE SPACE INTHE VECTOR
vk_result = vkEnumeratePhysicalDevices(m_vkInst, &m_physicalDeviceCount, nullptr);
if(vk_result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error while enumerating physical devices: CODE = %d", static_cast<int>(vk_result));
exit(1);
}
m_physicalDevices = std::vector<VkPhysicalDevice>(m_physicalDeviceCount);
vkEnumeratePhysicalDevices(m_vkInst, &m_physicalDeviceCount, m_physicalDevices.data());
// SELECT THE MAIN GPU (WE COULD HAVE A SMARTER SELECTION LATER)
// FILL THE VECTOR WITH ACTUAL DEVICES DATA
vk_result = vkEnumeratePhysicalDevices(m_vkInst, &m_physicalDeviceCount, m_physicalDevices.data());
if(vk_result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error while enumerating physical devices: CODE = %d", static_cast<int>(vk_result));
exit(1);
}
else {
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "VULKAN ENUMERATION OF PHYSICAL DEVICES FINISHED SUCCESSFULLY");
}
// SELECT THE MAIN GPU (WE COULD HAVE A SMARTER SELECTION LATER. FOR NOW, WE SELECT THE FIRST ONE WE SEE)
m_selectedPhysicalDevice = m_physicalDevices[0];
// LOAD THE FAMILLY QUEUE PROPERTIES
// FETCH THE QUANTITY OF FAMILY QUEUE TO RESERVE SPACE IN THE VECTOR
vkGetPhysicalDeviceQueueFamilyProperties(m_selectedPhysicalDevice, &m_queueFamilyCount, nullptr);
std::vector<VkQueueFamilyProperties> queueFamilies(m_queueFamilyCount);
// FILL THE VECTOR WITH ACTUAL QUEUE DATA
vkGetPhysicalDeviceQueueFamilyProperties(m_selectedPhysicalDevice, &m_queueFamilyCount, queueFamilies.data());
// CREATE THE SURFACE FOR RENDERING
SDL_Vulkan_CreateSurface(window, m_vkInst, &m_surface);
sdlSuccess = SDL_Vulkan_CreateSurface(window, m_vkInst, &m_surface);
if(sdlSuccess != SDL_TRUE)
{
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error Getting Extensions: %s", SDL_GetError());
exit(1);
}
else
{
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "VULKAN SURFACE CREATED SUCCESSFULLY");
}
// ???
// NOT SURE WHAT THIS DOES YET, WILL CHECK IN THE TUTORIAL
uint32_t graphicsQueueIndex = UINT32_MAX;
uint32_t presentQueueIndex = UINT32_MAX;
VkBool32 support;
@ -58,7 +108,11 @@ namespace ConjureEngine {
VK_QUEUE_GRAPHICS_BIT)
graphicsQueueIndex = i;
if (presentQueueIndex == UINT32_MAX) {
vkGetPhysicalDeviceSurfaceSupportKHR(m_selectedPhysicalDevice, i, m_surface, &support);
vk_result = vkGetPhysicalDeviceSurfaceSupportKHR(m_selectedPhysicalDevice, i, m_surface, &support);
if(vk_result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_SYSTEM, "Error while checking the surface capability: CODE = %d", static_cast<int>(vk_result));
}
if (support)
presentQueueIndex = i;
}
@ -94,12 +148,13 @@ namespace ConjureEngine {
// CREATE VIRTUAL DEVICE FOR RENDERING
VkResult result = vkCreateDevice(m_selectedPhysicalDevice, &m_deviceCreateInfo, nullptr, &m_device);
if(result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Error while creating the device: %d", static_cast<int>(result));
vk_result = vkCreateDevice(m_selectedPhysicalDevice, &m_deviceCreateInfo, nullptr, &m_device);
if(vk_result != VkResult::VK_SUCCESS) {
SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Error while creating the device: %d", static_cast<int>(vk_result));
exit(1);
}
else {
SDL_Log("DEVICE CREATED SUCCESSFULLY");
SDL_LogDebug(SDL_LOG_CATEGORY_SYSTEM, "DEVICE CREATED SUCCESSFULLY");
}
vkGetDeviceQueue(m_device, graphicsQueueIndex, 0, &m_graphicQueue);

View File

@ -19,7 +19,11 @@ namespace ConjureEngine {
SDL_Vulkan_UnloadLibrary();
SDL_Quit();
SDL_Log("Cleaned up with errors: %s", SDL_GetError());
std::string error = SDL_GetError();
if(!error.empty())
{
SDL_Log("Cleaned up with errors: %s", error);
}
}
SDL_Window* Window::GetWindow() const

View File

@ -21,22 +21,22 @@ namespace Demo1 {
void Demo1::Awake()
{
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - AWAKING");
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"AWAKING");
}
void Demo1::Start()
{
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - STARTING");
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"STARTING");
}
void Demo1::Tick(double deltaTime)
{
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[DEMO1 - TRACE] - TICKING %f", deltaTime);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "TICKING %f", deltaTime);
}
void Demo1::Destroy()
{
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"[DEMO1 - TRACE] - DESTROYING");
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,"DESTROYING");
}
} // Demo1

View File

@ -1,14 +1,94 @@
#define SDL_MAIN_HANDLED
#include <fstream>
#include <iostream>
#include "Demo1.h"
static std::ofstream logFile;
void OutputLog(void *userdata, int category, SDL_LogPriority priority, const char *message)
{
(void)userdata;
std::string categoryString;
switch (category)
{
case SDL_LOG_CATEGORY_APPLICATION:
categoryString = "Application";
break;
case SDL_LOG_CATEGORY_ERROR:
categoryString = "Error";
break;
case SDL_LOG_CATEGORY_ASSERT:
categoryString = "Assert";
break;
case SDL_LOG_CATEGORY_SYSTEM:
categoryString = "System";
break;
case SDL_LOG_CATEGORY_AUDIO:
categoryString = "Audio";
break;
case SDL_LOG_CATEGORY_VIDEO:
categoryString = "Video";
break;
case SDL_LOG_CATEGORY_RENDER:
categoryString = "Render";
break;
case SDL_LOG_CATEGORY_INPUT:
categoryString = "Input";
break;
case SDL_LOG_CATEGORY_TEST:
categoryString = "Test";
break;
default:
categoryString = "";
break;
}
std::string priorityString;
switch (priority)
{
case SDL_LOG_PRIORITY_VERBOSE:
priorityString = "VERBOSE";
break;
case SDL_LOG_PRIORITY_DEBUG:
priorityString = "DEBUG";
break;
case SDL_LOG_PRIORITY_INFO:
priorityString = "INFO";
break;
case SDL_LOG_PRIORITY_WARN:
priorityString = "WARN";
break;
case SDL_LOG_PRIORITY_ERROR:
priorityString = "ERROR";
break;
case SDL_LOG_PRIORITY_CRITICAL:
priorityString = "CRITICAL";
break;
default:
std::cout << message << "\n";
break;
}
logFile << "[" << categoryString << " - " << priorityString << "] " << message << "\n";
std::cout << "[" << categoryString << " - " << priorityString << "] " << message << "\n";
}
int main ( int argc, char* argv[] )
{
logFile = std::ofstream{"log.txt"};
SDL_SetMainReady();
SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
SDL_LogSetOutputFunction(&OutputLog, nullptr);
// I WANT TO CREATE AN APP
Demo1::Demo1 app;
// AND THEN START IT
return app.Run();
int status = app.Run();
return status;
}