VulkanSurface

This commit is contained in:
2026-09-09 00:46:41 +02:00
parent 7f3b46867f
commit e27d69b36e
4 changed files with 229 additions and 0 deletions
@@ -0,0 +1,65 @@
/*********************************************************************
* \file GraphicsSurface.hpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#ifndef BIGFOOT_GRAPHICSINTERFACE_GRAPHICSSURFACE_HPP
#define BIGFOOT_GRAPHICSINTERFACE_GRAPHICSSURFACE_HPP
#include <GraphicsInterface/GraphicsInstance.hpp>
#include <Utils/Factory.hpp>
#include <Utils/TargetMacros.h>
#include <GraphicsInterface/GraphicsAPI_generated.hpp>
#include <EASTL/functional.h>
#include <EASTL/unique_ptr.h>
#ifdef BIGFOOT_WINDOWS
#include <Windows.h>
#elif defined BIGFOOT_LINUX
#include <X11/X.h>
#include <X11/Xlib.h>
#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<GraphicsSurface,
GraphicsAPI,
eastl::function<eastl::unique_ptr<GraphicsSurface>(const GraphicsInstance&, const SurfaceCreateInfo&)>>;
} // namespace Bigfoot
#endif
@@ -0,0 +1,51 @@
/*********************************************************************
* \file VulkanSurface.hpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#ifndef BIGFOOT_GRAPHICSVULKAN_VULKANSURFACE_HPP
#define BIGFOOT_GRAPHICSVULKAN_VULKANSURFACE_HPP
#include <GraphicsVulkan/VulkanInclude.hpp>
#include <GraphicsVulkan/VulkanInstance.hpp>
#include <GraphicsInterface/GraphicsSurface.hpp>
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
@@ -0,0 +1,47 @@
/*********************************************************************
* \file VulkanSurface.cpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#include <GraphicsVulkan/VulkanSurface.hpp>
#include <GraphicsVulkan/GraphicsVulkanAssertHandler.hpp>
#include <GraphicsVulkan/VulkanFormatters.hpp>
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<vk::SurfaceKHR> 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<vk::SurfaceKHR> 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
@@ -0,0 +1,66 @@
/*********************************************************************
* \file VulkanSurface.cpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#include <GraphicsVulkan/VulkanSurface.hpp>
#include <GraphicsVulkan/VulkanInstance.hpp>
#include <Utils/TargetMacros.h>
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
#ifdef BIGFOOT_WINDOWS
#define GLFW_EXPOSE_NATIVE_WIN32
#elif defined BIGFOOT_LINUX
#define GLFW_EXPOSE_NATIVE_X11
#endif
#include <GLFW/glfw3native.h>
#include <gtest/gtest.h>
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