Skip to content

Commit 090b562

Browse files
committed
feat: added basic vulkan window
1 parent e60ee39 commit 090b562

File tree

11 files changed

+421
-108
lines changed

11 files changed

+421
-108
lines changed

CMakeLists.txt

+17-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
cmake_minimum_required(VERSION 3.26)
1212
include(FindOpenGL)
1313
include(CMakePrintHelpers)
14+
include(FetchContent)
1415

1516
set(VCPKG_FEATURE_FLAGS "manifests,registries,versions")
1617

@@ -117,6 +118,15 @@ find_package(glfw3 CONFIG REQUIRED)
117118
## LepusGfx: GLFW includes
118119
include_directories(LepusGfx ${GLFW_INCLUDES})
119120

121+
## LepusGfx: VkBootstrap
122+
find_package(Vulkan REQUIRED)
123+
FetchContent_Declare(
124+
fetch_vk_bootstrap
125+
GIT_REPOSITORY https://github.com/charles-lunarg/vk-bootstrap
126+
GIT_TAG v1.3.302
127+
)
128+
FetchContent_MakeAvailable(fetch_vk_bootstrap)
129+
120130
# LepusEngine sources
121131

122132
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}/Release)
@@ -130,15 +140,17 @@ if (OpenGL::GL)
130140
elseif (OpenGL::OpenGL)
131141
set(GL_LIBRARY OpenGL::OpenGL)
132142
endif (OpenGL::GL)
133-
target_link_libraries(LepusGfx PRIVATE GL3W glfw ${GL_LIBRARY} DearImgui LepusEngine LepusUtility LepusSystem)
143+
144+
target_link_libraries(LepusGfx PRIVATE GL3W glfw ${GL_LIBRARY} vk-bootstrap::vk-bootstrap DearImgui LepusEngine LepusUtility LepusSystem Vulkan::Vulkan)
145+
146+
target_include_directories(LepusGfx PUBLIC "${Vulkan_INCLUDE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/_deps/fetch_vk_bootstrap-src/src")
134147
target_link_libraries(LepusDemo PRIVATE DearImgui LepusGfx LepusUtility LepusEngine)
135148

136149
# Copy content (models, GLSL, etc.)
137150
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Content)
138151
add_custom_command(TARGET LepusDemo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/Content" ${CMAKE_BINARY_DIR}/Content)
139152

140153
# Unit testing framework
141-
include(FetchContent)
142154
FetchContent_Declare(
143155
googletest
144156
GIT_REPOSITORY https://github.com/google/googletest.git
@@ -194,7 +206,9 @@ if (MSVC)
194206
# 4265-5027: copy ctor, move ctor, assignment, move assignment implicitly deleted (this messes up gtest projects)
195207
# 5045: "compiler will insert Spectre mitigation for memory load"
196208
# 5262: implicit switch fallback
197-
set(MSVCDisabledWarnings 4100 4514 4464 4820 4263 4625 5026 4626 5027 5045 5262)
209+
# 4191: unsafe reinterpret_casts are needed for vulkan PFNs
210+
# 4583: VkBootstrap destructors are not implicitly called
211+
set(MSVCDisabledWarnings 4100 4514 4464 4820 4263 4625 5026 4626 5027 5045 5262 4191 4583)
198212

199213
set(MSVCDisabledWarningsFormatted "")
200214
foreach (Warning IN LISTS MSVCDisabledWarnings)

src/examples/demo/DemoApp.h

+21-23
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
#include "lepus/gfx/GraphicsEngine/Apis/ApiGL/Types/GLShader.h"
2-
3-
#include <imgui/imgui.h>
4-
#include <imgui/backends/imgui_impl_glfw.h>
5-
#include <imgui/backends/imgui_impl_opengl3.h>
61

72
#include <lepus/system/Windowing/GLFW.h>
3+
#include "lepus/gfx/GraphicsEngine/Apis/ApiVk.h"
4+
5+
#include "lepus/gfx/GraphicsEngine/Apis/ApiGL/Types/GLShader.h"
6+
87
#include <lepus/gfx/GraphicsEngine/Apis/ApiGL.h>
98
#include <lepus/gfx/GraphicsEngine.h>
109
#include <lepus/gfx/GraphicsEngine/ShaderCompilers/ShaderCompilerGLSL.h>
@@ -118,19 +117,18 @@ class DemoApp : public system::BaseApp
118117

119118
inline int Run() override
120119
{
121-
std::shared_ptr<system::WindowingGLFW> windowing = std::make_shared<system::WindowingGLFW>(800, 600);
120+
std::shared_ptr<system::WindowingGLFW> windowing = std::make_shared<system::WindowingGLFW>(800, 600, false);
121+
122+
gfx::GraphicsApiVkOptions options = {};
123+
options.windowingPtr = windowing;
122124

123125
// Create new graphics engine instance
124-
gfx::GraphicsApiGLOptions options = {};
125126
options.mainViewport = {800, 600};
126127
gfx::GraphicsEngine engine(&options, windowing);
127128

128129
// Termination condition for main loop
129130
bool isRunning = true;
130131

131-
// Set the window as the current OpenGL context.
132-
windowing->SetAsCurrentContext();
133-
134132
// Output start message to console
135133
engine::ConsoleLogger::Global().LogInfo("", "main", "Demo starting!");
136134

@@ -140,20 +138,20 @@ class DemoApp : public system::BaseApp
140138
fragShaderSrc = system::FileSystem::Read("../../Content/GLSL/Unlit/RGBVertex.frag"),
141139
vertShaderSrc2 = system::FileSystem::Read("../../Content/GLSL/Unlit/SolidColour.vert"),
142140
fragShaderSrc2 = system::FileSystem::Read("../../Content/GLSL/Unlit/SolidColour.frag");
143-
gfx::ShaderCompiledResult
141+
/*gfx::ShaderCompiledResult
144142
vertShader = gfx::ShaderCompilerGLSL::Singleton().CompileShader(vertShaderSrc.c_str(), vertShaderSrc.length(), gfx::VertexShader),
145143
fragShader = gfx::ShaderCompilerGLSL::Singleton().CompileShader(fragShaderSrc.c_str(), fragShaderSrc.length(), gfx::FragmentShader),
146144
vertShader2 = gfx::ShaderCompilerGLSL::Singleton().CompileShader(vertShaderSrc2.c_str(), vertShaderSrc2.length(), gfx::VertexShader),
147145
fragShader2 = gfx::ShaderCompilerGLSL::Singleton().CompileShader(fragShaderSrc2.c_str(), fragShaderSrc2.length(), gfx::FragmentShader);
148-
146+
*/
149147
// Register shader with the API.
150-
auto& api = engine.GetApi<gfx::GraphicsApiGL>();
151-
api.GetSceneGraph().SetCamera(&m_Camera);
148+
auto& api = engine.GetApi<gfx::GraphicsApiVk>();
149+
engine.GetSceneGraph().SetCamera(&m_Camera);
152150

153151
lepus::gfx::Material baseMaterial, otherMaterial;
154152
lepus::gfx::GLShader baseShader(lepus::gfx::ShaderInfo("RGBVertex")), redShader(lepus::gfx::ShaderInfo("SolidColour"));
155-
baseShader.SetGLProgram(gfx::ShaderCompilerGLSL::Singleton().BuildProgram(vertShader, fragShader));
156-
redShader.SetGLProgram(gfx::ShaderCompilerGLSL::Singleton().BuildProgram(vertShader2, fragShader2));
153+
// baseShader.SetGLProgram(gfx::ShaderCompilerGLSL::Singleton().BuildProgram(vertShader, fragShader));
154+
// redShader.SetGLProgram(gfx::ShaderCompilerGLSL::Singleton().BuildProgram(vertShader2, fragShader2));
157155
baseMaterial.SetShader(&baseShader);
158156
otherMaterial.SetShader(&redShader);
159157

@@ -165,18 +163,18 @@ class DemoApp : public system::BaseApp
165163
m_Camera.Transform().Origin(m_Camera.Transform().Forward() * -2.f);
166164

167165
// Instantiate two Renderables in the scene graph, each with its own transform, using the same cube mesh data.
168-
auto cubeMesh = lepus::gfx::GLMesh(lepus::utility::Primitives::Cube());
169-
auto cube = lepus::gfx::Renderable<lepus::gfx::GLMesh>(&cubeMesh, lepus::math::Transform(), baseMaterial);
170-
auto cube2 = lepus::gfx::Renderable<lepus::gfx::GLMesh>(&cubeMesh, lepus::math::Transform(), otherMaterial);
171-
auto cube3 = lepus::gfx::Renderable<lepus::gfx::GLMesh>(&cubeMesh, lepus::math::Transform(), otherMaterial);
172-
auto cube4 = lepus::gfx::Renderable<lepus::gfx::GLMesh>(&cubeMesh, lepus::math::Transform(), baseMaterial);
166+
auto cubeMesh = engine.CreateMesh(lepus::utility::Primitives::Cube());
167+
auto cube = lepus::gfx::Renderable(&cubeMesh, lepus::math::Transform(), baseMaterial);
168+
auto cube2 = lepus::gfx::Renderable(&cubeMesh, lepus::math::Transform(), otherMaterial);
169+
auto cube3 = lepus::gfx::Renderable(&cubeMesh, lepus::math::Transform(), otherMaterial);
170+
auto cube4 = lepus::gfx::Renderable(&cubeMesh, lepus::math::Transform(), baseMaterial);
173171

174172
cube.GetTransform()->Origin(lepus::types::Vector3(0.f, 0.f, -2.f));
175173
cube2.GetTransform()->Origin(lepus::types::Vector3(2.f, 0.f, 0.f));
176174
cube3.GetTransform()->Origin(lepus::types::Vector3(0.f, 0.f, 2.f));
177175
cube4.GetTransform()->Origin(lepus::types::Vector3(0.f, -2.f, 0.f));
178176

179-
auto rootNode = api.GetSceneGraph().AddChild(&cube);
177+
auto rootNode = engine.GetSceneGraph().AddChild(&cube);
180178
auto childNode1 = rootNode->AddChild(&cube2);
181179
auto childNode2 = childNode1->AddChild(&cube3);
182180
// auto childNode3 = childNode2->AddChild(&cube4);
@@ -185,7 +183,7 @@ class DemoApp : public system::BaseApp
185183
// cube2.GetTransform()->SetScale(1.f / 1.5f);
186184
cube2.GetTransform()->Rotate(lepus::types::Quaternion(1.f, 0.f, 0.f, (float)PI * (-90.f / 180.f)));
187185

188-
auto cubeNode = api.GetSceneGraph().AddChild(&cube);
186+
auto cubeNode = engine.GetSceneGraph().AddChild(&cube);
189187

190188
auto window = static_cast<GLFWwindow*>(windowing->GetWindowPtr());
191189

src/lepus/gfx/GraphicsEngine.h

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define L3D_GRAPHICSENGINE
33

44
#include "Camera.h"
5+
#include "SceneGraph.h"
56
#include "GraphicsEngine/GraphicsApi.h"
67
#include <lepus/system/Windowing.h>
78
#include <lepus/utility/types/String.h>
@@ -27,6 +28,8 @@ namespace lepus
2728
lepus::types::Viewport viewport;
2829
} m_OutputInfo;
2930

31+
SceneGraph m_Scene;
32+
3033
void _InitDefault()
3134
{
3235
m_Api = nullptr;
@@ -93,6 +96,10 @@ namespace lepus
9396
/// @param g Solid clear colour value (green, range [0, 1])
9497
/// @param b Solid clear colour value (blue, range [0, 1])
9598
void Render(float r, float g, float b);
99+
100+
inline SceneGraph& GetSceneGraph() { return m_Scene; }
101+
102+
lepus::engine::objects::Mesh* CreateMesh(const utility::Primitive& geometry);
96103
};
97104
} // namespace gfx
98105
} // namespace lepus

src/lepus/gfx/GraphicsEngine/Apis/ApiGL.h

+2
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ namespace lepus
152152
void SwapBuffers() override {}
153153

154154
void Shutdown() override;
155+
156+
inline engine::objects::Mesh* WrapMesh(engine::objects::Mesh* mesh) override { return mesh; }
155157
};
156158

157159
template lepus::gfx::GLUniformBinding<void*>* const GraphicsApi::GetUniform<lepus::gfx::GLUniformBinding<void*>*>(const char* name);
+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#ifndef L3D_GRAPHICSENGINE_APIS_APIVK
2+
#define L3D_GRAPHICSENGINE_APIS_APIVK
3+
4+
#include "lepus/gfx/GraphicsEngine/GraphicsApi.h"
5+
6+
#define VK_USE_PLATFORM_WIN32_KHR
7+
#include <VkBootstrap.h>
8+
9+
#include "lepus/system/Windowing/GLFW.h"
10+
11+
namespace lepus
12+
{
13+
namespace gfx
14+
{
15+
class GraphicsApiVkOptions : public GraphicsApiOptions
16+
{
17+
public:
18+
inline GraphicsApiType GetType() override
19+
{
20+
return GraphicsApiType::GraphicsApiVulkan;
21+
}
22+
23+
std::shared_ptr<system::WindowingGLFW> windowingPtr;
24+
};
25+
26+
template GraphicsApiVkOptions& GraphicsApi::GetOptions<GraphicsApiVkOptions>();
27+
28+
class GraphicsApiVk : public GraphicsApi
29+
{
30+
private:
31+
VkDevice m_vkDevice;
32+
VkQueue m_vkQueue;
33+
VkSurfaceKHR m_vkSurface;
34+
VkInstance m_vkInstance;
35+
VkSwapchainKHR m_vkSwapchain;
36+
VkCommandBuffer m_CommandBuffer;
37+
VkCommandPool m_CommandPool;
38+
VkFramebuffer* m_FrameBuffers;
39+
uint32_t m_FrameBufferCount;
40+
uint32_t m_CurrentImageIndex;
41+
42+
inline void* GetUniformInternal(const char* name) override
43+
{
44+
return nullptr;
45+
}
46+
47+
public:
48+
GraphicsApiVk()
49+
: GraphicsApi()
50+
{
51+
m_FrameBuffers = nullptr;
52+
m_FrameBufferCount = 0;
53+
m_CurrentImageIndex = 0;
54+
}
55+
56+
GraphicsApiVk(GraphicsApiOptions* options)
57+
{
58+
m_FrameBuffers = nullptr;
59+
m_FrameBufferCount = 0;
60+
m_CurrentImageIndex = 0;
61+
GraphicsApiVk::Init(options);
62+
}
63+
64+
void Init(GraphicsApiOptions* options) override;
65+
66+
void Draw() override {}
67+
68+
void CreatePipeline() override {}
69+
70+
void UpdateUniforms() override
71+
{
72+
}
73+
74+
void SwapBuffers() override;
75+
76+
void ClearFrameBuffer(float r, float g, float b) override;
77+
78+
engine::objects::Mesh* WrapMesh(engine::objects::Mesh* mesh) override;
79+
80+
void Shutdown() override;
81+
};
82+
} // namespace gfx
83+
} // namespace lepus
84+
85+
#endif

0 commit comments

Comments
 (0)