light/Engine/src/Platform/GraphicsAPI/OpenGL/glGraphicsContext.cpp

101 lines
3.2 KiB
C++
Raw Normal View History

2021-05-26 18:39:40 +04:30
#include "ltpch.h"
#include "glGraphicsContext.h"
2021-06-01 11:23:41 +04:30
#include "Events/WindowEvents.h"
// forward declaration
#include "Graphics/Renderer.h"
#include "Graphics/RenderCommand.h"
#include "UserInterface/UserInterface.h"
#include "Utility/ResourceManager.h"
2021-05-31 23:28:29 +04:30
2021-05-26 18:39:40 +04:30
#include <glad/glad.h>
2021-06-26 13:09:11 +04:30
#include <GLFW/glfw3.h>
2021-05-26 18:39:40 +04:30
namespace Light {
glGraphicsContext::glGraphicsContext(GLFWwindow* windowHandle)
: m_WindowHandle(windowHandle)
{
// set 'GraphicsAPI'
2021-05-26 18:39:40 +04:30
m_GraphicsAPI = GraphicsAPI::OpenGL;
// make context current
2021-05-26 18:39:40 +04:30
glfwMakeContextCurrent(windowHandle);
2021-06-26 13:09:11 +04:30
// load opengl (glad)
LT_ENGINE_ASSERT(gladLoadGLLoader((GLADloadproc)glfwGetProcAddress), "glGraphicsContext::glGraphicsContext: failed to initialize opengl (glad)");
2021-05-26 18:39:40 +04:30
SetDebugMessageCallback();
2021-06-01 11:23:41 +04:30
}
void glGraphicsContext::OnWindowResize(const WindowResizedEvent& event)
{
2021-06-15 09:39:11 +04:30
if (event.GetSize().x < 0 || event.GetSize().y < 0)
{
LT_ENGINE_ERROR("glGraphicsContext::OnWindowResize: 'width'/'height' cannot be negative: [{}x{}]", event.GetSize().x, event.GetSize().y);
2021-06-15 09:39:11 +04:30
return;
}
2021-06-01 11:23:41 +04:30
glViewport(0, 0, event.GetSize().x, event.GetSize().y);
}
2021-05-31 23:28:29 +04:30
2021-06-01 11:23:41 +04:30
void glGraphicsContext::LogDebugData()
{
// #todo: log more information
2021-06-01 11:23:41 +04:30
LT_ENGINE_INFO("________________________________________");
LT_ENGINE_INFO("GraphicsContext::");
LT_ENGINE_INFO(" API : OpenGL");
LT_ENGINE_INFO(" Version : {}", glGetString(GL_VERSION));
2021-05-26 18:39:40 +04:30
LT_ENGINE_INFO(" Renderer: {}", glGetString(GL_RENDERER));
2021-06-01 11:23:41 +04:30
LT_ENGINE_INFO("________________________________________");
2021-05-26 18:39:40 +04:30
}
2021-05-31 23:28:29 +04:30
void glGraphicsContext::SetDebugMessageCallback()
{
// determine log level
#if defined(LIGHT_DEBUG)
2021-05-31 23:28:29 +04:30
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
#elif defined(LIGHT_RELEASE)
2021-05-31 23:28:29 +04:30
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
#else // LT_DIST
return;
#endif
// setup message callback
2021-05-31 23:28:29 +04:30
glDebugMessageCallback([](unsigned int source, unsigned int type,
unsigned int id, unsigned int severity,
int length, const char* message,
const void* userParam)
{
switch (severity)
{
case GL_DEBUG_SEVERITY_HIGH:
throw glException(source, type, id, message);
2021-05-31 23:28:29 +04:30
return;
2021-05-31 23:28:29 +04:30
case GL_DEBUG_SEVERITY_MEDIUM: case GL_DEBUG_SEVERITY_LOW:
LT_ENGINE_WARN("glMessageCallback: Severity: {} :: Source: {} :: Type: {} :: ID: {}",
Stringifier::glDebugMsgSeverity(severity),
Stringifier::glDebugMsgSource(source),
Stringifier::glDebugMsgType(type),
id);
LT_ENGINE_WARN(" {}", message);
return;
2021-05-31 23:28:29 +04:30
case GL_DEBUG_SEVERITY_NOTIFICATION:
LT_ENGINE_TRACE("glMessageCallback: Severity: {} :: Source: {} :: Type: {} :: ID: {}",
Stringifier::glDebugMsgSeverity(severity),
Stringifier::glDebugMsgSource(source),
Stringifier::glDebugMsgType(type),
id);
LT_ENGINE_TRACE(" {}", message);
return;
}
}, nullptr);
}
2021-05-26 18:39:40 +04:30
}