Serenity Operating System
1/*
2 * Copyright (c) 2022, Stephan Unverwerth <s.unverwerth@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/LexicalPath.h>
8#include <AK/String.h>
9#include <LibGL/GL/gl.h>
10#include <LibGL/GLContext.h>
11#include <LibGfx/Bitmap.h>
12#include <LibGfx/QOIWriter.h>
13#include <LibTest/TestCase.h>
14
15static NonnullOwnPtr<GL::GLContext> create_testing_context(int width, int height)
16{
17 auto bitmap = MUST(Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, { width, height }));
18 auto context = MUST(GL::create_context(*bitmap));
19 GL::make_context_current(context);
20
21 return context;
22}
23
24TEST_CASE(0001_program_creation)
25{
26 auto context = create_testing_context(64, 64);
27
28 GLuint vertex_shader;
29 GLuint fragment_shader;
30 GLuint program;
31
32 auto vertex_shader_source = "#version 330\n"
33 "void main() {\n"
34 " gl_Position = vec4(0, 0, 0, 0);\n"
35 "}\n";
36
37 auto fragment_shader_source = "#version 330\n"
38 "out vec4 color;\n"
39 "void main() {\n"
40 " color = vec4(1, 1, 1, 1);\n"
41 "}\n";
42
43 vertex_shader = glCreateShader(GL_VERTEX_SHADER);
44 glShaderSource(vertex_shader, 1, &vertex_shader_source, nullptr);
45 glCompileShader(vertex_shader);
46 GLint vertex_shader_compile_status;
47 glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &vertex_shader_compile_status);
48 EXPECT_EQ(vertex_shader_compile_status, GL_TRUE);
49
50 fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
51 glShaderSource(fragment_shader, 1, &fragment_shader_source, nullptr);
52 glCompileShader(fragment_shader);
53 GLint fragment_shader_compile_status;
54 glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &fragment_shader_compile_status);
55 EXPECT_EQ(fragment_shader_compile_status, GL_TRUE);
56
57 program = glCreateProgram();
58 glAttachShader(program, vertex_shader);
59 glAttachShader(program, fragment_shader);
60 glLinkProgram(program);
61 glUseProgram(program);
62
63 glBegin(GL_TRIANGLES);
64 glColor3f(1, 0, 0);
65 glVertex2i(-1, -1);
66 glColor3f(0, 1, 0);
67 glVertex2i(1, -1);
68 glColor3f(0, 0, 1);
69 glVertex2i(1, 1);
70 glEnd();
71
72 context->present();
73
74 glDeleteShader(vertex_shader);
75 glDeleteShader(fragment_shader);
76 glDeleteProgram(program);
77
78 EXPECT_EQ(glGetError(), 0u);
79}