diff --git a/Bigfoot/Libs/Graphics/GraphicsInterface/Include/GraphicsInterface/GraphicsSurface.hpp b/Bigfoot/Libs/Graphics/GraphicsInterface/Include/GraphicsInterface/GraphicsSurface.hpp new file mode 100644 index 0000000..72d93c1 --- /dev/null +++ b/Bigfoot/Libs/Graphics/GraphicsInterface/Include/GraphicsInterface/GraphicsSurface.hpp @@ -0,0 +1,65 @@ +/********************************************************************* + * \file GraphicsSurface.hpp + * + * \author Romain BOULLARD + * \date September 2026 + *********************************************************************/ +#ifndef BIGFOOT_GRAPHICSINTERFACE_GRAPHICSSURFACE_HPP +#define BIGFOOT_GRAPHICSINTERFACE_GRAPHICSSURFACE_HPP +#include + +#include +#include + +#include + +#include +#include + +#ifdef BIGFOOT_WINDOWS +#include +#elif defined BIGFOOT_LINUX +#include +#include +#endif + +namespace Bigfoot +{ +/** + * The native window handles needed to create a GraphicsSurface + */ +struct SurfaceCreateInfo +{ +#ifdef BIGFOOT_WINDOWS + HWND m_windowHandle = nullptr; + HINSTANCE m_windowInstance = nullptr; +#elif defined BIGFOOT_LINUX + Display* m_display = nullptr; + Window m_window = 0; +#endif +}; + +class GraphicsSurface +{ + public: + virtual ~GraphicsSurface() = default; + + GraphicsSurface(const GraphicsSurface& p_surface) = delete; + GraphicsSurface(GraphicsSurface&& p_surface) = delete; + + GraphicsSurface& operator=(const GraphicsSurface& p_surface) = delete; + GraphicsSurface& operator=(GraphicsSurface&& p_surface) = delete; + + protected: + GraphicsSurface() = default; +}; + +/****************************************************************************************/ + +using GraphicsSurfaceFactory = + Factory(const GraphicsInstance&, const SurfaceCreateInfo&)>>; +} // namespace Bigfoot + +#endif diff --git a/Bigfoot/Libs/Graphics/GraphicsVulkan/Include/GraphicsVulkan/VulkanSurface.hpp b/Bigfoot/Libs/Graphics/GraphicsVulkan/Include/GraphicsVulkan/VulkanSurface.hpp new file mode 100644 index 0000000..95fa855 --- /dev/null +++ b/Bigfoot/Libs/Graphics/GraphicsVulkan/Include/GraphicsVulkan/VulkanSurface.hpp @@ -0,0 +1,51 @@ +/********************************************************************* + * \file VulkanSurface.hpp + * + * \author Romain BOULLARD + * \date September 2026 + *********************************************************************/ +#ifndef BIGFOOT_GRAPHICSVULKAN_VULKANSURFACE_HPP +#define BIGFOOT_GRAPHICSVULKAN_VULKANSURFACE_HPP +#include +#include + +#include + +namespace Bigfoot::Vulkan +{ +class VulkanSurface final: public GraphicsSurface +{ + public: + /** + * Constructor. + * Creates a vk::SurfaceKHR for the given native window. + * + * \param p_instance The instance to create the surface from + * \param p_surfaceCreateInfo The native window handles to create the surface for + */ + VulkanSurface(const VulkanInstance& p_instance, const SurfaceCreateInfo& p_surfaceCreateInfo); + + ~VulkanSurface() override; + + /** + * Get the underlying Vulkan surface handle + * + * \return The vk::SurfaceKHR handle + */ + [[nodiscard]] + vk::SurfaceKHR GetHandle() const; + + private: + /** + * The instance + */ + const VulkanInstance& m_instance; + + /** + * The surface + */ + vk::SurfaceKHR m_surface; +}; +} // namespace Bigfoot::Vulkan + +#endif diff --git a/Bigfoot/Libs/Graphics/GraphicsVulkan/VulkanSurface.cpp b/Bigfoot/Libs/Graphics/GraphicsVulkan/VulkanSurface.cpp new file mode 100644 index 0000000..1ebf7fa --- /dev/null +++ b/Bigfoot/Libs/Graphics/GraphicsVulkan/VulkanSurface.cpp @@ -0,0 +1,47 @@ +/********************************************************************* + * \file VulkanSurface.cpp + * + * \author Romain BOULLARD + * \date September 2026 + *********************************************************************/ +#include + +#include +#include + +namespace Bigfoot::Vulkan +{ +VulkanSurface::VulkanSurface(const VulkanInstance& p_instance, const SurfaceCreateInfo& p_surfaceCreateInfo): + m_instance(p_instance) +{ +#ifdef BIGFOOT_WINDOWS + const vk::Win32SurfaceCreateInfoKHR createInfo {{}, + p_surfaceCreateInfo.m_windowInstance, + p_surfaceCreateInfo.m_windowHandle}; + const vk::ResultValue surface = m_instance.GetHandle().createWin32SurfaceKHR(createInfo); +#elif defined BIGFOOT_LINUX + const vk::XlibSurfaceCreateInfoKHR createInfo {{}, p_surfaceCreateInfo.m_display, p_surfaceCreateInfo.m_window}; + const vk::ResultValue surface = m_instance.GetHandle().createXlibSurfaceKHR(createInfo); +#endif + + CRITICAL_ASSERT(GraphicsVulkanAssertHandler, + surface.result == vk::Result::eSuccess, + "({}) Failed to create Vulkan surface", + surface.result); + m_surface = surface.value; +} + +/****************************************************************************************/ + +VulkanSurface::~VulkanSurface() +{ + m_instance.GetHandle().destroySurfaceKHR(m_surface); +} + +/****************************************************************************************/ + +vk::SurfaceKHR VulkanSurface::GetHandle() const +{ + return m_surface; +} +} // namespace Bigfoot::Vulkan diff --git a/Bigfoot/Tests/Graphics/GraphicsVulkan/VulkanSurface.cpp b/Bigfoot/Tests/Graphics/GraphicsVulkan/VulkanSurface.cpp new file mode 100644 index 0000000..54ef827 --- /dev/null +++ b/Bigfoot/Tests/Graphics/GraphicsVulkan/VulkanSurface.cpp @@ -0,0 +1,66 @@ +/********************************************************************* + * \file VulkanSurface.cpp + * + * \author Romain BOULLARD + * \date September 2026 + *********************************************************************/ +#include + +#include + +#include + +#define GLFW_INCLUDE_NONE +#include + +#ifdef BIGFOOT_WINDOWS +#define GLFW_EXPOSE_NATIVE_WIN32 +#elif defined BIGFOOT_LINUX +#define GLFW_EXPOSE_NATIVE_X11 +#endif +#include +#include + +namespace Bigfoot::Vulkan +{ +class VulkanSurfaceFixture: public ::testing::Test +{ + protected: + void SetUp() override + { + ASSERT_EQ(glfwInit(), GLFW_TRUE); + + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); + m_window = glfwCreateWindow(64, 64, "VulkanSurfaceTests", nullptr, nullptr); + ASSERT_NE(m_window, nullptr); + +#ifdef BIGFOOT_WINDOWS + m_surfaceCreateInfo.m_windowHandle = glfwGetWin32Window(m_window); + m_surfaceCreateInfo.m_windowInstance = GetModuleHandle(nullptr); +#elif defined BIGFOOT_LINUX + m_surfaceCreateInfo.m_display = glfwGetX11Display(); + m_surfaceCreateInfo.m_window = glfwGetX11Window(m_window); +#endif + } + + void TearDown() override + { + glfwDestroyWindow(m_window); + glfwTerminate(); + } + + VulkanInstance m_instance {"VulkanSurfaceTests", Version {1, 0, 0}}; + GLFWwindow* m_window = nullptr; + SurfaceCreateInfo m_surfaceCreateInfo; +}; + +/****************************************************************************************/ + +TEST_F(VulkanSurfaceFixture, Constructor_ShouldCreateAValidSurface) +{ + const VulkanSurface surface {m_instance, m_surfaceCreateInfo}; + + EXPECT_TRUE(surface.GetHandle()); +} +} // namespace Bigfoot::Vulkan