07af1ef65718d6e8c959e281b6bab6fa635fac0d
[vkrt] / src / main.c
1 #include <stdio.h>
2
3 #define GLFW_INCLUDE_VULKAN
4 #include <GLFW/glfw3.h>
5 #include <stdlib.h>
6 #include <string.h>
7
8 #include "vk.h"
9
10
11 /* static glfw callbacks */
12
13 static void
14 clb_key(GLFWwindow *win, int key, int scancode, int action, int mods);
15
16 static void
17 clb_reshape(GLFWwindow *win, int width, int height);
18
19 /* static functions */
20
21 static bool
22 init();
23
24 static void
25 cleanup();
26
27 static void
28 display();
29
30
31 /* static variables */
32
33 static GLFWwindow *win;
34
35 static int win_w = 800;
36 static int win_h = 600;
37
38 static struct vk_ctx vk_core;
39 static struct vk_swapchain vk_swap;
40
41 int main(int argc, char** argv)
42 {
43     atexit(cleanup);
44
45     if (!init()) {
46         return 1;
47     }
48
49     /* reshape window once just in case */
50
51     glfwGetWindowSize(win, &win_w, &win_h);
52     clb_reshape(win, win_w, win_h);
53
54     /* event loop */
55
56     while(!glfwWindowShouldClose(win)) {
57         display();
58         glfwPollEvents();
59     }
60
61     return 0;
62 }
63
64 /* static functions */
65
66 static bool
67 init()
68 {
69     /* initialize GLFW */
70
71     if (!glfwInit()) {
72         fprintf(stderr, "Failed to initialize GLFW.\n");
73         return false;
74     }
75
76     if (glfwVulkanSupported() != GLFW_TRUE) {
77         fprintf(stderr, "Vulkan is not supported on this device.\n");
78         return false;
79     }
80
81     /* initialize Vulkan context */
82
83     if (!vk_init_ctx_for_rendering(&vk_core)) {
84         fprintf(stderr, "Failed to initialize Vulkan context.\n");
85         return false;
86     }
87
88     memset(&vk_swap, 0, sizeof vk_swap);
89
90     /* create window */
91
92     glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
93     win = glfwCreateWindow(win_w, win_h, "helloworld rt", 0, 0);
94
95     if (!win) {
96         fprintf(stderr, "Failed to create GLFW window\n");
97         return false;
98     }
99
100     /* create (Xcb) surface */
101
102     glfwGetFramebufferSize(win, &win_h, &win_h);
103     if (glfwCreateWindowSurface(vk_core.inst, win, 0, &vk_swap.surface)
104             != VK_SUCCESS) {
105         fprintf(stderr, "Failed to create XCB surface.\n");
106         return false;
107     }
108
109     /* create Vulkan swapchain */
110
111     /* aquire images? */
112
113     /* create shaders */
114
115     /* create semaphores? */
116
117     /* create renderer */
118
119     /* set GLFW callbacks */
120
121     glfwSetKeyCallback(win, clb_key);
122     glfwSetWindowSizeCallback(win, clb_reshape);
123
124     /*
125     glfwSetCursorPosCallback(win, clb_motion);
126     glfwSetMouseButtonCallback(win, clb_mouse);
127     */
128
129     return true;
130 }
131
132 static void
133 display()
134 {
135 }
136
137 static void
138 cleanup()
139 {
140     vk_cleanup_ctx(&vk_core);
141     glfwTerminate();
142 }
143
144 /* glfw callbacks */
145
146 static void
147 clb_key(GLFWwindow *win, int key, int scancode,
148         int action, int mods)
149 {
150     if (action == GLFW_PRESS) {
151         switch(key) {
152         case GLFW_KEY_ESCAPE:
153             glfwSetWindowShouldClose(win, GLFW_TRUE);
154             return;
155         }
156     }
157 }
158
159 static void
160 clb_reshape(GLFWwindow *win, int width, int height)
161 {
162     /* set viewport */
163
164     win_w = width;
165     win_h = height;
166 }