FRAG_COUNT config

This commit is contained in:
2025-09-18 22:01:26 +02:00
parent c05a193b4d
commit f15d737e48
7 changed files with 89 additions and 52 deletions
+1 -1
View File
@@ -106,7 +106,7 @@ make -f Makefile.dev release-arch
- [ ] 16 input + 16 fx definition and selection (with const param)
- [x] Feedback texture
- [ ] Shaders config file
- [ ] uniform config
- [x] uniform config
- [ ] fragment output config
- [ ] subroutines config
- [ ] Clean code
-4
View File
@@ -9,10 +9,6 @@
#define VERSION "(dev)"
#endif /* VERSION */
#ifndef FRAG_COUNT
#define FRAG_COUNT 6
#endif /* FRAG_COUNT */
#ifndef TEX_COUNT
#define TEX_COUNT 9
#endif /* TEXT_COUNT */
+3 -2
View File
@@ -102,7 +102,8 @@ char *config_file_get_str(ConfigFile config, char *key, char *default_value) {
return item->value;
}
int config_file_get_int(ConfigFile config, char *key, int default_value) {
unsigned int config_file_get_int(ConfigFile config, char *key,
int default_value) {
ConfigFileItem c_key;
ConfigFileItem *item;
@@ -119,7 +120,7 @@ int config_file_get_int(ConfigFile config, char *key, int default_value) {
return default_value;
}
return atoi(item->value);
return (unsigned int)atoi(item->value);
}
void config_file_free(ConfigFile config) { hashmap_free(config.map); }
+2 -1
View File
@@ -7,7 +7,8 @@ ConfigFile config_file_read(char *path, bool free_path);
char *config_file_get_str(ConfigFile config, char *key, char *default_value);
int config_file_get_int(ConfigFile config, char *key, int default_value);
unsigned int config_file_get_int(ConfigFile config, char *key,
int default_value);
void config_file_free(ConfigFile config);
+18 -11
View File
@@ -53,7 +53,7 @@ static void hot_reload(ShaderProgram program, File *common_shader_code,
force_update = true;
}
for (i = 0; i < FRAG_COUNT; i++) {
for (i = 0; i < program.frag_count; i++) {
if (force_update || file_should_update(fragment_shaders[i])) {
file_update(&fragment_shaders[i]);
file_prepend(&fragment_shaders[i], *common_shader_code);
@@ -96,10 +96,10 @@ File read_fragment_shader_file(char *frag_path, unsigned int i) {
}
static void init_files(char *frag_path, File *common_shader_code,
File *fragment_shaders) {
File *fragment_shaders, unsigned int frag_count) {
unsigned int i;
for (i = 0; i < FRAG_COUNT + 1; i++) {
for (i = 0; i < frag_count + 1; i++) {
if (i == 0) {
(*common_shader_code) = read_fragment_shader_file(frag_path, i);
} else {
@@ -110,10 +110,11 @@ static void init_files(char *frag_path, File *common_shader_code,
}
}
static void free_files(File *common_shader_code, File *fragment_shaders) {
static void free_files(File *common_shader_code, File *fragment_shaders,
unsigned int frag_count) {
unsigned int i;
for (i = 0; i < FRAG_COUNT; i++) {
for (i = 0; i < frag_count; i++) {
file_free(&fragment_shaders[i], true);
}
@@ -121,7 +122,8 @@ static void free_files(File *common_shader_code, File *fragment_shaders) {
}
void forge_run(Parameters params) {
File fragment_shaders[FRAG_COUNT];
unsigned int frag_count;
File *fragment_shaders;
File common_shader_code;
ShaderProgram program;
Window *window;
@@ -129,10 +131,15 @@ void forge_run(Parameters params) {
Context context;
ConfigFile shader_config;
init_files(params.frag_path, &common_shader_code, fragment_shaders);
shader_config = config_file_read(params.frag_config_path, false);
frag_count = config_file_get_int(shader_config, "FRAG_COUNT", 6);
fragment_shaders = malloc(frag_count * sizeof(File));
init_files(params.frag_path, &common_shader_code, fragment_shaders,
frag_count);
window = window_init(PACKAGE " " VERSION, params.screen, error_callback,
key_callback);
@@ -152,9 +159,9 @@ void forge_run(Parameters params) {
fragment_shaders, &timer);
}
window_close(window, true);
free_files(&common_shader_code, fragment_shaders);
free_files(&common_shader_code, fragment_shaders, frag_count);
config_file_free(shader_config);
window_close(window, true);
}
+51 -21
View File
@@ -1,8 +1,10 @@
#include <glad/gl.h>
#include <linmath.h>
#include <stddef.h>
#include <stdlib.h>
#include "config.h"
#include "config_file.h"
#include "constants.h"
#include "logs.h"
#include "shaders.h"
@@ -59,9 +61,11 @@ static void init_textures(ShaderProgram *program, Context context) {
static void init_framebuffers(ShaderProgram *program) {
unsigned int i, j;
glGenFramebuffers(FRAG_COUNT, program->frame_buffers);
program->frame_buffers = malloc(program->frag_count * sizeof(GLuint));
for (i = 0; i < FRAG_COUNT; i++) {
glGenFramebuffers(program->frag_count, program->frame_buffers);
for (i = 0; i < program->frag_count; i++) {
glBindFramebuffer(GL_FRAMEBUFFER, program->frame_buffers[i]);
for (j = 0; j < TEX_COUNT; j++) {
@@ -118,8 +122,10 @@ static void init_shaders(ShaderProgram *program, File *fragment_shaders) {
"internal fragment shader (monitor)",
monitor_shader_text);
program->fragment_shaders = malloc(program->frag_count * sizeof(GLuint));
// compile fragment shaders
for (i = 0; i < FRAG_COUNT; i++) {
for (i = 0; i < program->frag_count; i++) {
program->fragment_shaders[i] = glCreateShader(GL_FRAGMENT_SHADER);
program->error |=
!compile_shader(program->fragment_shaders[i], fragment_shaders[i].path,
@@ -132,7 +138,7 @@ static void init_shaders(ShaderProgram *program, File *fragment_shaders) {
}
static void init_single_program(ShaderProgram *program, unsigned int i,
bool output) {
ConfigFile shader_config, bool output) {
unsigned int j;
char name[32];
@@ -150,14 +156,19 @@ static void init_single_program(ShaderProgram *program, unsigned int i,
// create uniforms pointers
if (!output) {
program->itime_locations[i] =
glGetUniformLocation(program->programs[i], "iTime");
program->itempo_locations[i] =
glGetUniformLocation(program->programs[i], "iTempo");
program->ifps_locations[i] =
glGetUniformLocation(program->programs[i], "iFPS");
program->ires_locations[i] =
glGetUniformLocation(program->programs[i], "iResolution");
program->itime_locations[i] = glGetUniformLocation(
program->programs[i],
config_file_get_str(shader_config, "UNIFORM_TIME", "iTime"));
program->itempo_locations[i] = glGetUniformLocation(
program->programs[i],
config_file_get_str(shader_config, "UNIFORM_TEMPO", "iTempo"));
program->ifps_locations[i] = glGetUniformLocation(
program->programs[i],
config_file_get_str(shader_config, "UNIFORM_FPS", "iFPS"));
program->ires_locations[i] = glGetUniformLocation(
program->programs[i],
config_file_get_str(shader_config, "UNIFORM_RESOLUTION",
"iResolution"));
for (j = 0; j < SUB_COUNT; j++) {
sprintf(name, "src_%d", j + 1);
@@ -177,7 +188,7 @@ static void init_single_program(ShaderProgram *program, unsigned int i,
// create texX uniforms pointer
for (j = 0; j < TEX_COUNT; j++) {
sprintf(name, "tex%d", j);
program->textures_locations[i][j] =
program->textures_locations[j][i] =
glGetUniformLocation(program->programs[i], name);
}
@@ -194,6 +205,26 @@ static void init_single_program(ShaderProgram *program, unsigned int i,
log_success("Program %d initialized", i + 1);
}
static void init_programs(ShaderProgram *program, ConfigFile shader_config) {
unsigned int i;
program->programs = malloc(program->frag_count * sizeof(GLuint));
program->itime_locations = malloc(program->frag_count * sizeof(GLuint));
program->itempo_locations = malloc(program->frag_count * sizeof(GLuint));
program->ifps_locations = malloc(program->frag_count * sizeof(GLuint));
program->ires_locations = malloc(program->frag_count * sizeof(GLuint));
program->vpos_locations = malloc(program->frag_count * sizeof(GLuint));
for (i = 0; i < TEX_COUNT; i++) {
program->textures_locations[i] =
malloc(program->frag_count * sizeof(GLuint));
}
for (i = 0; i < program->frag_count + 1; i++) {
init_single_program(program, i, shader_config, i == program->frag_count);
}
}
ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
Context context) {
unsigned int i;
@@ -202,6 +233,7 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
program.error = false;
program.last_width = context.width;
program.last_height = context.height;
program.frag_count = config_file_get_int(shader_config, "FRAG_COUNT", 6);
init_textures(&program, context);
@@ -215,11 +247,9 @@ ShaderProgram shaders_init(File *fragment_shaders, ConfigFile shader_config,
init_vertices(&program);
// create and link full shader programs
for (i = 0; i < FRAG_COUNT + 1; i++) {
init_single_program(&program, i, i == FRAG_COUNT);
}
init_programs(&program, shader_config);
// TODO each for each frag
for (i = 0; i < TEX_COUNT; i++) {
program.draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
}
@@ -263,11 +293,11 @@ void shaders_apply(ShaderProgram program, Context context) {
resolution[0] = (float)context.width;
resolution[1] = (float)context.height;
for (i = 0; i < FRAG_COUNT + 1; i++) {
for (i = 0; i < program.frag_count + 1; i++) {
// use specific shader program
glUseProgram(program.programs[i]);
if (i == FRAG_COUNT) {
if (i == program.frag_count) {
// use default framebuffer (output)
glBindFramebuffer(GL_FRAMEBUFFER, 0);
@@ -294,7 +324,7 @@ void shaders_apply(ShaderProgram program, Context context) {
// set GL_TEXTURE(X) to uniform sampler2D texX
for (j = 0; j < TEX_COUNT; j++) {
glUniform1i(program.textures_locations[i][j], j);
glUniform1i(program.textures_locations[j][i], j);
}
glDrawBuffers(TEX_COUNT - 1, program.draw_buffers);
@@ -302,4 +332,4 @@ void shaders_apply(ShaderProgram program, Context context) {
// draw output
glDrawArrays(GL_TRIANGLES, 0, 6);
}
}
}
+14 -12
View File
@@ -35,31 +35,33 @@ typedef struct ShaderProgram {
int last_width;
int last_height;
GLuint programs[FRAG_COUNT + 1];
unsigned int frag_count;
GLuint *programs;
GLuint vertex_shader;
GLuint output_shader;
GLuint monitor_shader;
GLuint fragment_shaders[FRAG_COUNT];
GLuint *fragment_shaders;
GLuint itime_locations[FRAG_COUNT];
GLuint itempo_locations[FRAG_COUNT];
GLuint ifps_locations[FRAG_COUNT];
GLuint ires_locations[FRAG_COUNT];
GLuint *itime_locations;
GLuint *itempo_locations;
GLuint *ifps_locations;
GLuint *ires_locations;
GLuint textures_locations[FRAG_COUNT + 1][TEX_COUNT];
GLuint *textures_locations[TEX_COUNT];
GLuint sub_src_indexes[FRAG_COUNT][SUB_COUNT];
GLuint sub_fx_indexes[FRAG_COUNT][SUB_COUNT];
GLuint sub_mix_indexes[FRAG_COUNT][2];
GLuint sub_src_indexes[6][SUB_COUNT]; // TODO change
GLuint sub_fx_indexes[6][SUB_COUNT];
GLuint sub_mix_indexes[6][2];
GLuint vpos_locations[FRAG_COUNT + 1];
GLuint *vpos_locations;
GLuint vertex_buffer;
GLuint vertex_array;
GLuint frame_buffers[FRAG_COUNT];
GLuint *frame_buffers;
GLuint textures[TEX_COUNT];
GLenum draw_buffers[TEX_COUNT];