From 3a04729fb6280a25477bf33ee2ea719e4143ef31 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Thu, 5 Jul 2018 01:05:50 +0200 Subject: [PATCH] shader: automatically prepend #version line GL: "#version 130" (3.0) GLES: "#version 100" (2.0) --- src/shader.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/shader.c b/src/shader.c index c837e80..684bf54 100644 --- a/src/shader.c +++ b/src/shader.c @@ -22,10 +22,37 @@ #include #include +static ALLEGRO_USTR* GetShaderSource(struct Game* game, const char* filename) { + ALLEGRO_FILE* fp = al_fopen(filename, "r"); + if (!fp) { + FatalError(game, false, "Failed to open shader file %s", filename); + return NULL; + } + ALLEGRO_USTR* str = al_ustr_new(al_get_opengl_variant() == ALLEGRO_OPENGL_ES ? "#version 100\n" : "#version 130\n"); + while (true) { + char buf[512]; + size_t n; + ALLEGRO_USTR_INFO info; + + n = al_fread(fp, buf, sizeof(buf)); + if (n <= 0) { + break; + } + al_ustr_append(str, al_ref_buffer(&info, buf, n)); + } + al_fclose(fp); + return str; +} + static bool AttachToShader(struct Game* game, ALLEGRO_SHADER* shader, ALLEGRO_SHADER_TYPE type, const char* filename) { bool ret; if (filename) { - ret = al_attach_shader_source_file(shader, type, filename); + ALLEGRO_USTR* src = GetShaderSource(game, filename); + if (!src) { + return false; + } + ret = al_attach_shader_source(shader, type, al_cstr(src)); + al_ustr_free(src); } else { ret = al_attach_shader_source(shader, type, al_get_default_shader_source(al_get_shader_platform(shader), type)); } @@ -80,6 +107,7 @@ SYMBOL_EXPORT void DestroyShader(struct Game* game, ALLEGRO_SHADER* shader) { if (item->fragment) { free(item->fragment); } + free(item); } SYMBOL_INTERNAL void ReloadShaders(struct Game* game, bool force) {