diff --git a/src/main.c b/src/main.c index 0ab790d..5a71cd6 100644 --- a/src/main.c +++ b/src/main.c @@ -116,8 +116,6 @@ int main(int argc, char *argv[]) { state.inotify_fd = -1; } - initialize_shaders(&state, arguments.shader_file, arguments.buffer_file); - state.window = initialize_window(WINDOW_WIDTH, WINDOW_HEIGHT); if (state.window == NULL) { glfwTerminate(); @@ -126,40 +124,14 @@ int main(int argc, char *argv[]) { unsigned int VAO = initialize_vertices(); - state.screen_shader.program = glCreateProgram(); - if (!state.screen_shader.program) { - log_error("Could not create screen shader program"); + int err = + initialize_shaders(&state, arguments.shader_file, arguments.buffer_file, + WINDOW_WIDTH, WINDOW_HEIGHT); + if (err) { glfwDestroyWindow(state.window); glfwTerminate(); return EXIT_FAILURE; } - compile_shaders(&state.screen_shader.program, state.screen_shader.filename); - glUseProgram(state.screen_shader.program); - glUniform1i(glGetUniformLocation(state.screen_shader.program, "u_texture"), - 0); - - unsigned int framebuffer = 0; - unsigned int texture_color_buffer = 0; - if (state.buffer_shader.filename) { - state.buffer_shader.program = glCreateProgram(); - if (!state.buffer_shader.program) { - log_error("Could not create buffer shader program"); - glfwDestroyWindow(state.window); - glfwTerminate(); - return EXIT_FAILURE; - } - compile_shaders(&state.buffer_shader.program, state.buffer_shader.filename); - glUseProgram(state.buffer_shader.program); - glUniform1i(glGetUniformLocation(state.buffer_shader.program, "u_texture"), - 0); - - if (initialize_framebuffer(&framebuffer, &texture_color_buffer, - WINDOW_WIDTH, WINDOW_HEIGHT)) { - glfwDestroyWindow(state.window); - glfwTerminate(); - return EXIT_FAILURE; - } - } /* Drawing loop */ glfwSetTime(0.0); @@ -184,7 +156,7 @@ int main(int argc, char *argv[]) { if (state.buffer_shader.filename) { /* bind the framebuffer and draw to it */ - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, state.framebuffer); /* Background */ glClearColor(0, 0, 0, 1.0f); @@ -204,7 +176,7 @@ int main(int argc, char *argv[]) { /* Draw the vertices */ glBindVertexArray(VAO); - glBindTexture(GL_TEXTURE_2D, texture_color_buffer); + glBindTexture(GL_TEXTURE_2D, state.texture_color_buffer); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } @@ -229,7 +201,7 @@ int main(int argc, char *argv[]) { /* Draw the vertices */ glBindVertexArray(VAO); - glBindTexture(GL_TEXTURE_2D, texture_color_buffer); + glBindTexture(GL_TEXTURE_2D, state.texture_color_buffer); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); diff --git a/src/renderer.h b/src/renderer.h index e5fe9a5..f48d765 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -20,7 +20,10 @@ struct renderer_state { GLFWwindow *window; /**< GLFW window where the shaders are rendered. */ struct shader_state screen_shader; /**< Shader for the main screen. */ struct shader_state buffer_shader; /**< Shader for the framebuffer. */ - int inotify_fd; /**< inotify file descriptor. */ + unsigned int framebuffer; /**< Framebuffer. */ + unsigned int + texture_color_buffer; /**< Texture where the framebuffer renders. */ + int inotify_fd; /**< inotify file descriptor. */ size_t frame_count; /**< Frame count since the start of the render loop. */ size_t prev_frame_count; /**< Frame count at the last log. */ double time; /**< Time in seconds since the start of the render loop. */ diff --git a/src/shaders.c b/src/shaders.c index e1bef3a..cd1e7ab 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -8,16 +8,20 @@ #include "shaders.h" /** - * @brief Initialize shaders and setup inotify if required. + * @brief Initialize shaders, compile them, and create the required + * texture for the buffer shader. * * @param state The target renderer state. * @param shader_file The file name of the screen shader. * @param buffer_file The file name of the buffer shader, or NULL if no buffer * shader. + * @param texture_width The width of the texture for the buffer shader. + * @param texture_height The height of the texture for the buffer shader. * @return 0 on success, 1 on error. */ int initialize_shaders(struct renderer_state *state, const char *shader_file, - const char *buffer_file) { + const char *buffer_file, int texture_width, + int texture_height) { state->screen_shader.filename = shader_file; log_info("Screen shader file: %s", state->screen_shader.filename); @@ -49,6 +53,35 @@ int initialize_shaders(struct renderer_state *state, const char *shader_file, } } + state->screen_shader.program = glCreateProgram(); + if (!state->screen_shader.program) { + log_error("Could not create screen shader program"); + return 1; + } + compile_shaders(&state->screen_shader.program, state->screen_shader.filename); + glUseProgram(state->screen_shader.program); + glUniform1i(glGetUniformLocation(state->screen_shader.program, "u_texture"), + 0); + + if (state->buffer_shader.filename) { + state->buffer_shader.program = glCreateProgram(); + if (!state->buffer_shader.program) { + log_error("Could not create buffer shader program"); + return 1; + } + compile_shaders(&state->buffer_shader.program, + state->buffer_shader.filename); + glUseProgram(state->buffer_shader.program); + glUniform1i(glGetUniformLocation(state->buffer_shader.program, "u_texture"), + 0); + + if (initialize_framebuffer(&state->framebuffer, + &state->texture_color_buffer, texture_width, + texture_height)) { + return 1; + } + } + return 0; } diff --git a/src/shaders.h b/src/shaders.h index 6a82080..7b1f6d5 100644 --- a/src/shaders.h +++ b/src/shaders.h @@ -4,7 +4,8 @@ #include "renderer.h" int initialize_shaders(struct renderer_state *state, const char *shader_file, - const char *buffer_file); + const char *buffer_file, int window_width, + int window_height); int compile_shaders(unsigned int *shader_program, const char *const fragment_shader_file); char *read_file(const char *const filename);