TRX/src/gfx/gl/program.c

152 lines
3.7 KiB
C
Raw Normal View History

2021-12-05 18:14:55 +01:00
#include "gfx/gl/program.h"
2021-12-05 18:04:37 +01:00
#include "filesystem.h"
2021-12-05 18:14:55 +01:00
#include "game/shell.h"
#include "gfx/gl/utils.h"
2021-12-05 18:04:37 +01:00
#include "log.h"
#include "memory.h"
#include <assert.h>
#include <stddef.h>
2021-12-05 18:04:37 +01:00
2021-12-05 18:14:55 +01:00
bool GFX_GL_Program_Init(GFX_GL_Program *program)
2021-12-05 18:04:37 +01:00
{
assert(program);
program->id = glCreateProgram();
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (!program->id) {
LOG_ERROR("Can't create shader program");
return false;
}
return true;
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Close(GFX_GL_Program *program)
2021-12-05 18:04:37 +01:00
{
if (program->id) {
glDeleteProgram(program->id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
program->id = 0;
}
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Bind(GFX_GL_Program *program)
2021-12-05 18:04:37 +01:00
{
glUseProgram(program->id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_AttachShader(
GFX_GL_Program *program, GLenum type, const char *path)
2021-12-05 18:04:37 +01:00
{
GLuint shader_id = glCreateShader(type);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (!shader_id) {
Shell_ExitSystem("Failed to create shader");
}
char *content = NULL;
if (!File_Load(path, &content, NULL)) {
Shell_ExitSystemFmt("Unable to find shader file: %s", path);
}
glShaderSource(shader_id, 1, (const char **)&content, NULL);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
glCompileShader(shader_id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
int compile_status;
glGetShaderiv(shader_id, GL_COMPILE_STATUS, &compile_status);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (compile_status != GL_TRUE) {
GLsizei info_log_size = 4096;
char info_log[info_log_size];
glGetShaderInfoLog(shader_id, info_log_size, &info_log_size, info_log);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (info_log[0]) {
Shell_ExitSystemFmt("Shader compilation failed:\n%s", info_log);
} else {
Shell_ExitSystemFmt("Shader compilation failed.");
}
}
2022-01-07 03:14:07 +01:00
Memory_FreePointer(&content);
2021-12-05 18:04:37 +01:00
glAttachShader(program->id, shader_id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
glDeleteShader(shader_id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Link(GFX_GL_Program *program)
2021-12-05 18:04:37 +01:00
{
glLinkProgram(program->id);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
GLint linkStatus;
glGetProgramiv(program->id, GL_LINK_STATUS, &linkStatus);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (!linkStatus) {
GLsizei info_log_size = 4096;
char info_log[info_log_size];
glGetProgramInfoLog(
program->id, info_log_size, &info_log_size, info_log);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (info_log[0]) {
Shell_ExitSystemFmt("Shader linking failed:\n%s", info_log);
} else {
Shell_ExitSystemFmt("Shader linking failed.");
}
}
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_FragmentData(GFX_GL_Program *program, const char *name)
2021-12-05 18:04:37 +01:00
{
glBindFragDataLocation(program->id, 0, name);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
GLint GFX_GL_Program_UniformLocation(GFX_GL_Program *program, const char *name)
2021-12-05 18:04:37 +01:00
{
GLint location = glGetUniformLocation(program->id, name);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
if (location == -1) {
LOG_INFO("Shader uniform not found: %s", name);
}
return location;
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Uniform3f(
GFX_GL_Program *program, GLint loc, GLfloat v0, GLfloat v1, GLfloat v2)
2021-12-05 18:04:37 +01:00
{
glUniform3f(loc, v0, v1, v2);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Uniform4f(
GFX_GL_Program *program, GLint loc, GLfloat v0, GLfloat v1, GLfloat v2,
2021-12-05 18:04:37 +01:00
GLfloat v3)
{
glUniform4f(loc, v0, v1, v2, v3);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_Uniform1i(GFX_GL_Program *program, GLint loc, GLint v0)
2021-12-05 18:04:37 +01:00
{
glUniform1i(loc, v0);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}
2021-12-05 18:14:55 +01:00
void GFX_GL_Program_UniformMatrix4fv(
GFX_GL_Program *program, GLint loc, GLsizei count, GLboolean transpose,
2021-12-05 18:04:37 +01:00
const GLfloat *value)
{
glUniformMatrix4fv(loc, count, transpose, value);
GFX_GL_CheckError();
2021-12-05 18:04:37 +01:00
}