1 // Utility code for loading GLSL shaders.
2 // Has support for auto-reload, see glsl_refresh
3
4 #pragma once
5
6 #include <map>
7 #include <string>
8 #include <time.h>
9
10 #include "Common/GPU/OpenGL/GLCommon.h"
11
12 // Represent a compiled and linked vshader/fshader pair.
13 // A just-constructed object is valid but cannot be used as a shader program, meaning that
14 // yes, you can declare these as globals if you like.
CompileShader(const char * source,GLuint shader,const char * filename,std::string * error_message)15 struct GLSLProgram {
16 char name[16];
17 char vshader_filename[256];
18 char fshader_filename[256];
19 const char *vshader_source;
20 const char *fshader_source;
21 time_t vshader_mtime;
22 time_t fshader_mtime;
23
24 // Locations to some common uniforms. Hardcoded for speed.
25 GLint sampler0;
26 GLint sampler1;
27 GLint u_worldviewproj;
28 GLint u_world;
29 GLint u_viewproj;
30 GLint u_fog; // rgb = color, a = density
31 GLint u_sundir;
32 GLint u_camerapos;
33
34 GLint a_position;
35 GLint a_color;
36 GLint a_normal;
37 GLint a_texcoord0;
38 GLint a_texcoord1;
39
40 // Private to the implementation, do not touch
41 GLuint vsh_;
42 GLuint fsh_;
43 GLuint program_;
44 };
45
46 // C API, old skool. Not much point either...
47
48 // From files (VFS)
49 GLSLProgram *glsl_create(const char *vshader_file, const char *fshader_file, std::string *error_message = 0);
50 // Directly from source code
51 GLSLProgram *glsl_create_source(const char *vshader_src, const char *fshader_src, std::string *error_message = 0);
52 void glsl_destroy(GLSLProgram *program);
53
54 // If recompilation of the program fails, the program is untouched and error messages
55 // are logged and the function returns false.
glsl_create_source(const char * vshader_src,const char * fshader_src,std::string * error_message)56 bool glsl_recompile(GLSLProgram *program, std::string *error_message = 0);
57 void glsl_bind(const GLSLProgram *program);
58 const GLSLProgram *glsl_get_program();
59 void glsl_unbind();
60 int glsl_attrib_loc(const GLSLProgram *program, const char *name);
61 int glsl_uniform_loc(const GLSLProgram *program, const char *name);
62