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

LibAccelGfx: Compile all needed shaders during Painter construction

Instead of recompiling shaders on each paint command call we can
compile them once.
This commit is contained in:
Aliaksandr Kalenik 2023-11-02 00:48:32 +01:00 committed by Andreas Kling
parent 1e85bf221d
commit b7f8d7e357
5 changed files with 139 additions and 58 deletions

View file

@ -0,0 +1,81 @@
/*
* Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
*
* 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/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 = 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);
return Program { program };
}
void Program::use()
{
glUseProgram(m_id);
}
GLuint Program::get_attribute_location(char const* name)
{
return glGetAttribLocation(m_id, name);
}
GLuint Program::get_uniform_location(char const* name)
{
return glGetUniformLocation(m_id, name);
}
Program::~Program()
{
glDeleteProgram(m_id);
}
}