TestShaders.cpp 2.4 KB

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