commit
ca16469545
@ -0,0 +1,44 @@
|
||||
SRC := src
|
||||
CDEBUG := -g -fsanitize=address,undefined
|
||||
CXXFLAGS := -Ilib $(CDEBUG)
|
||||
CPP := c++
|
||||
LIBS := -lvulkan -lglfw
|
||||
OUT := ./out
|
||||
BIN := $(OUT)/main
|
||||
CXXCMD := $(CPP) $(CXXFLAGS) $(LIBS)
|
||||
|
||||
define linit
|
||||
$(wordlist 2,$(words $(1)),x $(1))
|
||||
endef
|
||||
define llast
|
||||
$(lastword $(1))
|
||||
endef
|
||||
|
||||
SRCS=$(wildcard $(SRC)/*)
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
|
||||
run: all
|
||||
VK_ADD_LAYER_PATH=/usr/share/vulkan/explicit_layer.d/VkLayer_khronos_validation.json VK_LOADER_LAYERS_ENABLE=*validation ./out/main
|
||||
|
||||
clean:
|
||||
rm -f out/*
|
||||
|
||||
cleanlsp:
|
||||
rm -f compile_commands.json
|
||||
|
||||
cleanall: clean cleanlsp
|
||||
|
||||
lsp: $(SRCS)
|
||||
rm -f compile_commands.json # TODO figure out how to depend on cleanlsp
|
||||
echo [ >> compile_commands.json
|
||||
for src in $(call linit,$^) ; do \
|
||||
echo {'"'directory'"': '"'$(PWD)'"', '"'command'"': '"'$(CXXCMD) $^ -o $(BIN)'"', '"'file'"': '"'$$src'"'}, >> compile_commands.json ;\
|
||||
done
|
||||
echo {'"'directory'"': '"'$(PWD)'"', '"'command'"': '"'$(CXXCMD) $^ -o $(BIN)'"', '"'file'"': '"'$(call llast,$^)'"'} >> compile_commands.json ;\
|
||||
echo ] >> compile_commands.json
|
||||
|
||||
$(BIN): $(SRCS)
|
||||
$(CXXCMD) $^ -o $@
|
||||
|
@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
namespace ls {
|
||||
class GlfwState {
|
||||
public:
|
||||
GlfwState();
|
||||
|
||||
std::vector<const char*> get_vulkan_exts();
|
||||
};
|
||||
class GlfwWindow {
|
||||
private:
|
||||
GLFWwindow* __window;
|
||||
std::string __title;
|
||||
public:
|
||||
GlfwWindow(GlfwState* state, uint32_t x_size, uint32_t y_size, std::string title);
|
||||
void show();
|
||||
void set_title(const std::string title);
|
||||
GLFWwindow* __get_backing();
|
||||
VkResult __make_surface(VkInstance instance, VkSurfaceKHR* surface);
|
||||
};
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
namespace ls {
|
||||
class VulkanState;
|
||||
}
|
||||
|
||||
#include "window.hpp"
|
||||
|
||||
namespace ls {
|
||||
class VulkanState {
|
||||
private:
|
||||
VkInstance __instance;
|
||||
public:
|
||||
VulkanState(GlfwState* state);
|
||||
|
||||
void __make_surface(GlfwWindow* win, VkSurfaceKHR* surf);
|
||||
};
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
namespace ls {
|
||||
class Window;
|
||||
}
|
||||
|
||||
#include "glfw.hpp"
|
||||
#include "vulkan.hpp"
|
||||
|
||||
namespace ls {
|
||||
class Window {
|
||||
public:
|
||||
Window(GlfwState* glfw_state);
|
||||
~Window();
|
||||
void show();
|
||||
void set_title(const std::string title);
|
||||
void init_surface(VulkanState* vulkan_state);
|
||||
GlfwWindow* __get_native();
|
||||
private:
|
||||
GlfwWindow* __window;
|
||||
VkSurfaceKHR __surface;
|
||||
};
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
// NOTE: Order matters.
|
||||
// Including glfw before Vulkan makes glfw not load Vulkan-specific functions
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <assert.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
#include "glfw.hpp"
|
||||
|
||||
namespace ls {
|
||||
// GlfwState
|
||||
GlfwState::GlfwState() {
|
||||
assert(glfwInit() == GLFW_TRUE);
|
||||
};
|
||||
|
||||
std::vector<const char*> GlfwState::get_vulkan_exts() {
|
||||
std::vector<const char*> res;
|
||||
uint32_t glfw_exts_count = 0;
|
||||
const char** glfw_exts = glfwGetRequiredInstanceExtensions(&glfw_exts_count);
|
||||
for(int i = 0; i < glfw_exts_count; i++) {
|
||||
res.push_back(glfw_exts[i]);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// GlfwWindow
|
||||
GlfwWindow::GlfwWindow(GlfwState* state, uint32_t x_size, uint32_t y_size, std::string title) {
|
||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
|
||||
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
|
||||
this->__window = glfwCreateWindow(x_size, y_size, title.c_str(), NULL, NULL);
|
||||
};
|
||||
|
||||
void GlfwWindow::show() {
|
||||
glfwShowWindow(__window);
|
||||
}
|
||||
|
||||
void GlfwWindow::set_title(const std::string title) {
|
||||
this->__title = title;
|
||||
glfwSetWindowTitle(this->__window, this->__title.c_str());
|
||||
}
|
||||
|
||||
VkResult GlfwWindow::__make_surface(VkInstance instance, VkSurfaceKHR* surface) {
|
||||
return glfwCreateWindowSurface(instance, this->__window, NULL, surface);
|
||||
}
|
||||
|
||||
GLFWwindow* GlfwWindow::__get_backing() {
|
||||
return __window;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
// Entry point.
|
||||
// Should probably link the engine libs & run the editor but
|
||||
// imma hack random shit together for now
|
||||
#include "glfw.hpp"
|
||||
#include "vulkan.hpp"
|
||||
#include "window.hpp"
|
||||
|
||||
using namespace ls;
|
||||
|
||||
int main() {
|
||||
auto glfw = GlfwState();
|
||||
auto vulkan = VulkanState(&glfw);
|
||||
auto window = Window(&glfw);
|
||||
window.set_title("LightningStrike Hello World!");
|
||||
window.init_surface(&vulkan);
|
||||
window.show();
|
||||
while(1) {}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "vulkan.hpp"
|
||||
|
||||
#include "glfw.hpp"
|
||||
#include "window.hpp"
|
||||
|
||||
namespace ls {
|
||||
VulkanState::VulkanState(GlfwState* state) {
|
||||
VkApplicationInfo application_info = {
|
||||
VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
||||
NULL,
|
||||
"Game",
|
||||
VK_MAKE_VERSION( 1, 0, 0 ),
|
||||
"LightningStrike",
|
||||
VK_MAKE_VERSION( 1, 0, 0 ),
|
||||
VK_API_VERSION_1_3,
|
||||
};
|
||||
std::vector<const char*> vk_exts = state->get_vulkan_exts();
|
||||
VkInstanceCreateInfo instance_create_info = {
|
||||
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||
NULL,
|
||||
0,
|
||||
&application_info,
|
||||
0,
|
||||
NULL,
|
||||
static_cast<uint32_t>(vk_exts.size()),
|
||||
vk_exts.data()
|
||||
};
|
||||
VkResult res = vkCreateInstance(&instance_create_info, NULL, &__instance);
|
||||
assert(res == VK_SUCCESS);
|
||||
}
|
||||
void VulkanState::__make_surface(GlfwWindow* win, VkSurfaceKHR* surf) {
|
||||
VkResult res = win->__make_surface(__instance, surf);
|
||||
assert(res == VK_SUCCESS);
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <cstdlib>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "window.hpp"
|
||||
|
||||
#include "glfw.hpp"
|
||||
#include "vulkan.hpp"
|
||||
|
||||
namespace ls {
|
||||
Window::Window(GlfwState* glfw_state) {
|
||||
this->__window = new GlfwWindow(glfw_state, 1920, 1080, "");
|
||||
};
|
||||
|
||||
Window::~Window() {
|
||||
std::free(this->__window);
|
||||
}
|
||||
void Window::init_surface(VulkanState* vulkan_state) {
|
||||
vulkan_state->__make_surface(__window, &__surface);
|
||||
}
|
||||
void Window::show() {
|
||||
__window->show();
|
||||
}
|
||||
void Window::set_title(const std::string title) {
|
||||
__window->set_title(title);
|
||||
}
|
||||
GlfwWindow* Window::__get_native() {
|
||||
return __window;
|
||||
}
|
||||
}
|
Loading…
Reference in new issue