|
@@ -1,6 +1,7 @@
|
|
|
#define IMPORT_CORE
|
|
|
#include "core/WindowManager.h"
|
|
|
|
|
|
+#define GLFW_INCLUDE_VULKAN
|
|
|
#include <GLFW/glfw3.h>
|
|
|
#include <core/HashMap.h>
|
|
|
#include <core/Logger.h>
|
|
@@ -173,6 +174,31 @@ static void onMouseMove(GLFWwindow*, double x, double y) {
|
|
|
mousePosition.data[1] = (float)y;
|
|
|
}
|
|
|
|
|
|
+#define VK_ERROR_CASE(error) \
|
|
|
+ case error: return #error
|
|
|
+
|
|
|
+static const char* getVulkanErrorString(VkResult r) {
|
|
|
+ switch(r) {
|
|
|
+ VK_ERROR_CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
|
|
|
+ VK_ERROR_CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
|
|
+ VK_ERROR_CASE(VK_ERROR_INITIALIZATION_FAILED);
|
|
|
+ VK_ERROR_CASE(VK_ERROR_LAYER_NOT_PRESENT);
|
|
|
+ VK_ERROR_CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
|
|
|
+ VK_ERROR_CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
|
|
|
+ default: return "unknown";
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#define VK_ASSERT(a) \
|
|
|
+ do { \
|
|
|
+ VkResult vkResult = (a); \
|
|
|
+ if(vkResult != VK_SUCCESS) { \
|
|
|
+ printf("Vulkan error at [%s:%d]: %s\n", __FUNCTION__, __LINE__, \
|
|
|
+ getVulkanErrorString(vkResult)); \
|
|
|
+ return true; \
|
|
|
+ } \
|
|
|
+ } while(false)
|
|
|
+
|
|
|
bool openWindow(const WindowOptions* o) {
|
|
|
if(!glfwInit()) {
|
|
|
LOG_ERROR("could not initialize GLFW");
|
|
@@ -184,6 +210,7 @@ bool openWindow(const WindowOptions* o) {
|
|
|
glfwWindowHint(GLFW_RESIZABLE, true);
|
|
|
glfwWindowHint(GLFW_DECORATED, !o->fullscreen);
|
|
|
glfwWindowHint(GLFW_DOUBLEBUFFER, true);
|
|
|
+ glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
|
|
|
|
|
GLFWmonitor* m = o->fullscreen ? glfwGetPrimaryMonitor() : nullptr;
|
|
|
window =
|
|
@@ -199,6 +226,46 @@ bool openWindow(const WindowOptions* o) {
|
|
|
glfwSetFramebufferSizeCallback(window, onResize);
|
|
|
glfwSetMouseButtonCallback(window, onMouse);
|
|
|
glfwSetCursorPosCallback(window, onMouseMove);
|
|
|
+
|
|
|
+ VkInstance instance = {0};
|
|
|
+ VkApplicationInfo info = {.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
|
|
+ .pApplicationName = "Vulkan",
|
|
|
+ .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
|
|
+ .pEngineName = "Kajetan",
|
|
|
+ .engineVersion = VK_MAKE_VERSION(0, 0, 1),
|
|
|
+ .apiVersion = VK_API_VERSION_1_1};
|
|
|
+ VkInstanceCreateInfo instanceCreateInfo = {
|
|
|
+ .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
|
|
+ .pApplicationInfo = &info,
|
|
|
+ .enabledLayerCount = 1,
|
|
|
+ .ppEnabledLayerNames = (const char*[]){"VK_LAYER_KHRONOS_validation"},
|
|
|
+ .enabledExtensionCount = 4,
|
|
|
+ .ppEnabledExtensionNames =
|
|
|
+ (const char*[]){"VK_KHR_surface", "VK_KHR_xcb_surface",
|
|
|
+ VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
|
|
|
+ VK_EXT_DEBUG_REPORT_EXTENSION_NAME}};
|
|
|
+ VK_ASSERT(vkCreateInstance(&instanceCreateInfo, nullptr, &instance));
|
|
|
+
|
|
|
+ u32 graphicsFamily = 0;
|
|
|
+ VkPhysicalDeviceFeatures deviceFeatures = {0};
|
|
|
+ VkDeviceQueueCreateInfo dqInfo = {.sType =
|
|
|
+ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
|
|
+ .queueFamilyIndex = graphicsFamily,
|
|
|
+ .queueCount = 1,
|
|
|
+ .pQueuePriorities = (float[]){1.0f}};
|
|
|
+ VkDeviceCreateInfo deviceCreateInfo = {
|
|
|
+ .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
|
|
+ .queueCreateInfoCount = 1,
|
|
|
+ .pQueueCreateInfos = &dqInfo,
|
|
|
+ .enabledExtensionCount = 1,
|
|
|
+ .ppEnabledExtensionNames =
|
|
|
+ (const char*[]){VK_KHR_SWAPCHAIN_EXTENSION_NAME},
|
|
|
+ .pEnabledFeatures = &deviceFeatures};
|
|
|
+ VkPhysicalDevice physicalDevice = {0};
|
|
|
+ VkDevice device = {0};
|
|
|
+ VK_ASSERT(
|
|
|
+ vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device));
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -307,7 +374,6 @@ static void checkGamepad() {
|
|
|
|
|
|
static void endFrame(void) {
|
|
|
sizeChanged = false;
|
|
|
- glfwSwapBuffers(window);
|
|
|
glfwPollEvents();
|
|
|
if(searchForGamepad()) {
|
|
|
checkGamepad();
|
|
@@ -342,7 +408,6 @@ static void tick() {
|
|
|
}
|
|
|
|
|
|
void runWindow(void) {
|
|
|
- glfwMakeContextCurrent(window);
|
|
|
tps.last = getNanos();
|
|
|
fps.last = getNanos();
|
|
|
i64 lag = 0;
|