From 6aaf89e603426b2697e6345dd5161038d3a4d243 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Mon, 16 Mar 2026 16:07:12 +0800 Subject: [PATCH] Add OpenGL backend: OpenGLDevice class - Created OpenGLDevice class for window and OpenGL context management - Added CreateWindow() and InitializeWithExistingWindow() methods - Integrated with GLFW and GLAD - Added to tests/OpenGL as test target This is the first step in building the OpenGL RHI backend parallel to D3D12. --- tests/OpenGL/CMakeLists.txt | 27 +++++----- tests/OpenGL/OpenGLDevice.cpp | 95 +++++++++++++++++++++++++++++++++++ tests/OpenGL/OpenGLDevice.h | 42 ++++++++++++++++ 3 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 tests/OpenGL/OpenGLDevice.cpp create mode 100644 tests/OpenGL/OpenGLDevice.h diff --git a/tests/OpenGL/CMakeLists.txt b/tests/OpenGL/CMakeLists.txt index 0ea5dda6..aa34c046 100644 --- a/tests/OpenGL/CMakeLists.txt +++ b/tests/OpenGL/CMakeLists.txt @@ -21,6 +21,20 @@ file(COPY ${copyResources} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug) file(GLOB assimpDll "${CMAKE_CURRENT_SOURCE_DIR}/package/dll/assimp-vc143-mt.dll") file(COPY ${assimpDll} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug) +add_executable( + XCRender + main.cpp + OpenGLDevice.cpp + ./package/src/glad.c +) + +target_link_libraries(XCRender + PRIVATE + glfw3.lib + assimp-vc143-mt.lib + XCEngine +) + add_custom_command(TARGET XCRender POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/compare_ppm.py @@ -31,17 +45,4 @@ add_custom_command(TARGET XCRender POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/GT.ppm $/GT.ppm -) - -add_executable( - XCRender - main.cpp - ./package/src/glad.c -) - -target_link_libraries(XCRender - PRIVATE - glfw3.lib - assimp-vc143-mt.lib - XCEngine ) \ No newline at end of file diff --git a/tests/OpenGL/OpenGLDevice.cpp b/tests/OpenGL/OpenGLDevice.cpp new file mode 100644 index 00000000..a4778cfa --- /dev/null +++ b/tests/OpenGL/OpenGLDevice.cpp @@ -0,0 +1,95 @@ +#define GLFW_INCLUDE_NONE +#include "OpenGLDevice.h" +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLDevice::OpenGLDevice() + : m_window(nullptr) + , m_initialized(false) + , m_ownsWindow(false) { +} + +OpenGLDevice::~OpenGLDevice() { + Shutdown(); +} + +bool OpenGLDevice::CreateWindow(int width, int height, const char* title, bool enableDebug) { + if (m_initialized) { + return true; + } + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + m_window = glfwCreateWindow(width, height, title, nullptr, nullptr); + if (!m_window) { + return false; + } + + m_ownsWindow = true; + return InitializeWithExistingWindow(m_window); +} + +bool OpenGLDevice::InitializeWithExistingWindow(GLFWwindow* window) { + if (m_initialized) { + return true; + } + + m_window = window; + if (!m_window) { + return false; + } + + glfwMakeContextCurrent(m_window); + + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { + return false; + } + + m_deviceInfo.vendor = reinterpret_cast(glGetString(GL_VENDOR)); + m_deviceInfo.renderer = reinterpret_cast(glGetString(GL_RENDERER)); + m_deviceInfo.version = reinterpret_cast(glGetString(GL_VERSION)); + + glGetIntegerv(GL_MAJOR_VERSION, &m_deviceInfo.majorVersion); + glGetIntegerv(GL_MINOR_VERSION, &m_deviceInfo.minorVersion); + + m_initialized = true; + return true; +} + +void OpenGLDevice::Shutdown() { + if (m_ownsWindow && m_window) { + glfwDestroyWindow(m_window); + } + m_window = nullptr; + m_initialized = false; + m_ownsWindow = false; +} + +void OpenGLDevice::SwapBuffers() { + if (m_window) { + glfwSwapBuffers(m_window); + } +} + +bool OpenGLDevice::PollEvents() { + glfwPollEvents(); + return !glfwWindowShouldClose(m_window); +} + +void OpenGLDevice::SetShouldClose(bool shouldClose) { + if (m_window) { + glfwSetWindowShouldClose(m_window, shouldClose ? GLFW_TRUE : GLFW_FALSE); + } +} + +bool OpenGLDevice::ShouldClose() const { + return m_window && glfwWindowShouldClose(m_window) == GLFW_TRUE; +} + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLDevice.h b/tests/OpenGL/OpenGLDevice.h new file mode 100644 index 00000000..47fea2ff --- /dev/null +++ b/tests/OpenGL/OpenGLDevice.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +namespace XCEngine { +namespace RHI { + +struct OpenGLDeviceInfo { + std::string vendor; + std::string renderer; + std::string version; + int majorVersion; + int minorVersion; +}; + +class OpenGLDevice { +public: + OpenGLDevice(); + ~OpenGLDevice(); + + bool CreateWindow(int width, int height, const char* title, bool enableDebug = false); + bool InitializeWithExistingWindow(GLFWwindow* window); + void Shutdown(); + + GLFWwindow* GetWindow() const { return m_window; } + const OpenGLDeviceInfo& GetDeviceInfo() const { return m_deviceInfo; } + + void SwapBuffers(); + bool PollEvents(); + void SetShouldClose(bool shouldClose); + bool ShouldClose() const; + +private: + GLFWwindow* m_window; + OpenGLDeviceInfo m_deviceInfo; + bool m_initialized; + bool m_ownsWindow; +}; + +} // namespace RHI +} // namespace XCEngine