diff options
author | David Robillard <d@drobilla.net> | 2020-04-04 13:36:45 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-04-04 13:36:45 +0200 |
commit | ecc281c56a8c3c297cfd2f0b6d4671b2000efd9b (patch) | |
tree | 6cabb79d95f19da7fc89318fd2aacf5f18c0200e /examples | |
parent | ac3036fd7343ce71377fbfecafd8ba672372a5b9 (diff) | |
download | pugl-ecc281c56a8c3c297cfd2f0b6d4671b2000efd9b.tar.gz pugl-ecc281c56a8c3c297cfd2f0b6d4671b2000efd9b.tar.bz2 pugl-ecc281c56a8c3c297cfd2f0b6d4671b2000efd9b.zip |
Shader Demo: Factor out version-dependent GLSL header
Diffstat (limited to 'examples')
-rw-r--r-- | examples/pugl_gl3_demo.c | 4 | ||||
-rw-r--r-- | examples/shader_utils.h | 21 |
2 files changed, 16 insertions, 9 deletions
diff --git a/examples/pugl_gl3_demo.c b/examples/pugl_gl3_demo.c index f43592d..6f7ed91 100644 --- a/examples/pugl_gl3_demo.c +++ b/examples/pugl_gl3_demo.c @@ -259,6 +259,7 @@ setupGl(PuglTestApp* app) } // Load shader sources + char* const headerSource = loadShader("shaders/header_330.glsl"); char* const vertexSource = loadShader("shaders/rect.vert"); char* const fragmentSource = loadShader("shaders/rect.frag"); if (!vertexSource || !fragmentSource) { @@ -267,9 +268,10 @@ setupGl(PuglTestApp* app) } // Compile rectangle shaders and program - app->drawRect = compileProgram(vertexSource, fragmentSource); + app->drawRect = compileProgram(headerSource, vertexSource, fragmentSource); free(fragmentSource); free(vertexSource); + free(headerSource); if (!app->drawRect.program) { return PUGL_FAILURE; } diff --git a/examples/shader_utils.h b/examples/shader_utils.h index 834d8fc..2fd26c5 100644 --- a/examples/shader_utils.h +++ b/examples/shader_utils.h @@ -28,11 +28,12 @@ typedef struct } Program; static GLuint -compileShader(const char* source, const GLenum type) +compileShader(const char* header, const char* source, const GLenum type) { - GLuint shader = glCreateShader(type); - const int sourceLength = (int)strlen(source); - glShaderSource(shader, 1, &source, &sourceLength); + const GLchar* sources[] = {header, source}; + const GLint lengths[] = {(GLint)strlen(header), (GLint)strlen(source)}; + GLuint shader = glCreateShader(type); + glShaderSource(shader, 2, sources, lengths); glCompileShader(shader); int status; @@ -61,13 +62,17 @@ deleteProgram(Program program) } static Program -compileProgram(const char* vertexSource, const char* fragmentSource) +compileProgram(const char* headerSource, + const char* vertexSource, + const char* fragmentSource) { static const Program nullProgram = {0, 0, 0}; - Program program = {compileShader(vertexSource, GL_VERTEX_SHADER), - compileShader(fragmentSource, GL_FRAGMENT_SHADER), - glCreateProgram()}; + Program program = { + compileShader(headerSource, vertexSource, GL_VERTEX_SHADER), + compileShader(headerSource, fragmentSource, GL_FRAGMENT_SHADER), + glCreateProgram(), + }; if (!program.vertexShader || !program.fragmentShader || !program.program) { deleteProgram(program); |