1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:07:44 +00:00

LibAccelGfx: Use wrapping functions with error check for OpenGL calls

This change introduces GL.h with error check wrappers for all the
OpenGL functions we used so far.

For now, the error check is simply:
`VERIFY(glGetError() == GL_NO_ERROR);`
but that is better than continuing execution after encounting an error.
This commit is contained in:
Aliaksandr Kalenik 2023-11-10 18:00:18 +01:00 committed by Andreas Kling
parent da88d766b2
commit 048e179572
8 changed files with 313 additions and 130 deletions

View file

@ -4,78 +4,41 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#define GL_GLEXT_PROTOTYPES
#include <AK/Assertions.h>
#include <AK/Format.h>
#include <GL/gl.h>
#include <GL/glext.h>
#include <LibAccelGfx/GL.h>
#include <LibAccelGfx/Program.h>
namespace AccelGfx {
static GLuint create_shader(GLenum type, char const* source)
{
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, nullptr);
glCompileShader(shader);
int success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
char buffer[512];
glGetShaderInfoLog(shader, sizeof(buffer), nullptr, buffer);
dbgln("GLSL shader compilation failed: {}", buffer);
VERIFY_NOT_REACHED();
}
return shader;
}
Program Program::create(char const* vertex_shader_source, char const* fragment_shader_source)
{
GLuint program = glCreateProgram();
auto vertex_shader = GL::create_shader(GL::ShaderType::Vertex, vertex_shader_source);
auto fragment_shader = GL::create_shader(GL::ShaderType::Fragment, fragment_shader_source);
auto vertex_shader = create_shader(GL_VERTEX_SHADER, vertex_shader_source);
auto fragment_shader = create_shader(GL_FRAGMENT_SHADER, fragment_shader_source);
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
int linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked);
if (!linked) {
char buffer[512];
glGetProgramInfoLog(program, sizeof(buffer), nullptr, buffer);
dbgln("GLSL program linking failed: {}", buffer);
VERIFY_NOT_REACHED();
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
auto program = GL::create_program(vertex_shader, fragment_shader);
return Program { program };
}
void Program::use()
{
glUseProgram(m_id);
GL::use_program(m_program);
}
GLuint Program::get_attribute_location(char const* name)
GL::VertexAttribute Program::get_attribute_location(char const* name)
{
return glGetAttribLocation(m_id, name);
return GL::get_attribute_location(m_program, name);
}
GLuint Program::get_uniform_location(char const* name)
GL::Uniform Program::get_uniform_location(char const* name)
{
return glGetUniformLocation(m_id, name);
return GL::get_uniform_location(m_program, name);
}
Program::~Program()
{
glDeleteProgram(m_id);
GL::delete_program(m_program);
}
}