10 #ifndef hifi_GLShaders_h
11 #define hifi_GLShaders_h
17 #include <unordered_map>
18 #include <unordered_set>
23 struct ShaderBinding {
30 struct Uniform :
public ShaderBinding {
32 Uniform(GLint program,
int index) { load(program, index); };
33 using Vector = std::vector<Uniform>;
34 GLenum type{ GL_FLOAT };
36 void load(GLuint glprogram,
int index);
38 static Vector load(GLuint glprogram,
const std::function<
bool(
const Uniform&)>& filter);
39 static Vector loadTextures(GLuint glprogram);
40 static Vector load(GLuint glprogram);
41 static Vector load(GLuint glprogram,
const std::vector<GLuint>& indices);
42 static Vector load(GLuint glprogram,
const std::vector<const char*>& names);
43 static Vector load(GLuint glprogram,
const std::vector<std::string>& names);
44 static Uniform loadByName(GLuint glprogram,
const std::string& names);
47 static Vector loadByName(GLuint glprogram,
const C& names) {
51 std::vector<const char*> cnames;
52 cnames.reserve(names.size());
53 for (
const auto& name : names) {
54 cnames.push_back(name.c_str());
56 return load(glprogram, cnames);
60 using Uniforms = Uniform::Vector;
62 struct UniformBlock :
public ShaderBinding {
64 UniformBlock(GLint program,
int index) { load(program, index); };
66 using Vector = std::vector<UniformBlock>;
67 void load(GLuint glprogram,
int index);
68 static Vector load(GLuint glprogram);
71 using UniformBlocks = UniformBlock::Vector;
73 struct Input :
public ShaderBinding {
75 Input(GLint program,
int index) { load(program, index); };
76 using Vector = std::vector<Uniform>;
77 GLenum type{ GL_FLOAT };
79 void load(GLuint glprogram,
int index);
80 static Vector load(GLuint glprogram);
83 using Inputs = Input::Vector;
88 std::vector<char> binary;
89 inline operator bool()
const {
return format != 0 && !binary.empty(); }
92 using ShaderCache = std::unordered_map<std::string, CachedShader>;
94 std::string getShaderHash(
const std::string& shaderSource);
95 void loadShaderCache(ShaderCache& cache);
96 void saveShaderCache(
const ShaderCache& cache);
98 #ifdef SEPARATE_PROGRAM
99 bool compileShader(GLenum shaderDomain,
100 const std::string& shaderSource,
101 GLuint& shaderObject,
102 GLuint& programObject,
103 std::string& message);
104 bool compileShader(GLenum shaderDomain,
105 const std::vector<std::string>& shaderSources,
106 GLuint& shaderObject,
107 GLuint& programObject,
108 std::string& message);
110 bool compileShader(GLenum shaderDomain,
const std::string& shaderSource, GLuint& shaderObject, std::string& message);
111 bool compileShader(GLenum shaderDomain,
112 const std::vector<std::string>& shaderSources,
113 GLuint& shaderObject,
114 std::string& message);
117 GLuint buildProgram(
const std::vector<GLuint>& glshaders);
118 GLuint buildProgram(
const CachedShader& binary);
119 bool linkProgram(GLuint glprogram, std::string& message);
120 void getShaderInfoLog(GLuint glshader, std::string& message);
121 void getProgramInfoLog(GLuint glprogram, std::string& message);
122 void getProgramBinary(GLuint glprogram, CachedShader& cachedShader);