quick backup - everything is going to be changed on vulkan side.
[demo] / src / opengl / opengl.cc
1 #include <GL/glew.h>
2 #include <GLFW/glfw3.h>
3 #include <stdio.h>
4
5 #include "gfxapi.h"
6 #include "opengl/opengl.h"
7
8 extern GLFWwindow *win;
9 extern int win_h;
10 extern int win_w;
11
12 static void clear(float r, float g, float b);
13 static void viewport(int x, int y, int width, int height);
14 static void zbuffer(bool enable);
15 static void cull_face(Gfx_cull_face cf);
16
17 bool init_opengl()
18 {
19         if(!glfwInit()) {
20                 fprintf(stderr, "Failed to initialize GLFW.\n");
21                 return false;
22         }
23
24         glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
25         glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
26         glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE);
27
28         if(!(win = glfwCreateWindow(win_w, win_h, "glcow", 0, 0))) {
29                 fprintf(stderr, "Failed to create window.\n");
30                 return false;
31         }
32         glfwMakeContextCurrent(win);
33
34         glewInit();
35
36         glEnable(GL_DEPTH_TEST);
37         glEnable(GL_CULL_FACE);
38         glEnable(GL_FRAMEBUFFER_SRGB); // linear colorspace
39
40         gfx_clear = clear;
41         gfx_viewport = viewport;
42         gfx_zbuffer = zbuffer;
43         gfx_cull_face = cull_face;
44
45         // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
46         return true;
47 }
48
49 void cleanup_opengl()
50 {
51         if(win) {
52                 glfwDestroyWindow(win);
53         }
54         glfwTerminate();
55 }
56
57 static void clear(float r, float g, float b)
58 {
59         glClearColor(r, g, b, 1.0);
60         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
61 }
62
63 static void viewport(int x, int y, int width, int height)
64 {
65         glViewport(x, y, width, height);
66 }
67
68 static void zbuffer(bool enable)
69 {
70         if(enable)
71                 glEnable(GL_DEPTH_TEST);
72         else
73                 glDisable(GL_DEPTH_TEST);
74 }
75
76 static void cull_face(Gfx_cull_face cf)
77 {
78         switch(cf) {
79         case GFX_CULL_NONE:
80                 glDisable(GL_CULL_FACE);
81                 break;
82         case GFX_CULL_FRONT:
83                 glEnable(GL_CULL_FACE);
84                 glCullFace(GL_FRONT);
85                 break;
86         case GFX_CULL_BACK:
87                 glEnable(GL_CULL_FACE);
88                 glCullFace(GL_BACK);
89                 break;
90         }
91 }