summaryrefslogtreecommitdiff
path: root/drivers/gles3/shader_gles3.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles3/shader_gles3.h')
-rw-r--r--drivers/gles3/shader_gles3.h317
1 files changed, 153 insertions, 164 deletions
diff --git a/drivers/gles3/shader_gles3.h b/drivers/gles3/shader_gles3.h
index 464f359d51..6f5ccc9126 100644
--- a/drivers/gles3/shader_gles3.h
+++ b/drivers/gles3/shader_gles3.h
@@ -38,19 +38,17 @@
#include GLES3_INCLUDE_H
#endif
+#include "camera_matrix.h"
#include "hash_map.h"
#include "map.h"
#include "variant.h"
-#include "camera_matrix.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
-
class ShaderGLES3 {
-protected:
-
+protected:
struct Enum {
uint64_t mask;
@@ -71,7 +69,7 @@ protected:
};
struct UniformPair {
- const char* name;
+ const char *name;
Variant::Type type_hint;
};
@@ -94,8 +92,8 @@ protected:
};
bool uniforms_dirty;
-private:
+private:
//@TODO Optimize to a fixed set of shader pools and use a LRU
int uniform_count;
int texunit_pair_count;
@@ -117,22 +115,24 @@ private:
uint32_t version;
Vector<StringName> texture_uniforms;
Vector<CharString> custom_defines;
-
};
-
struct Version {
-
+
GLuint id;
GLuint vert_id;
- GLuint frag_id;
+ GLuint frag_id;
GLint *uniform_location;
Vector<GLint> texture_uniform_locations;
uint32_t code_version;
bool ok;
- Version() { code_version=0; ok=false; uniform_location=NULL; }
+ Version() {
+ code_version = 0;
+ ok = false;
+ uniform_location = NULL;
+ }
};
-
+
Version *version;
union VersionKey {
@@ -142,36 +142,34 @@ private:
uint32_t code_version;
};
uint64_t key;
- bool operator==(const VersionKey& p_key) const { return key==p_key.key; }
- bool operator<(const VersionKey& p_key) const { return key<p_key.key; }
-
+ bool operator==(const VersionKey &p_key) const { return key == p_key.key; }
+ bool operator<(const VersionKey &p_key) const { return key < p_key.key; }
};
struct VersionKeyHash {
- static _FORCE_INLINE_ uint32_t hash( const VersionKey& p_key) { return HashMapHasherDefault::hash(p_key.key); };
+ static _FORCE_INLINE_ uint32_t hash(const VersionKey &p_key) { return HashMapHasherDefault::hash(p_key.key); };
};
//this should use a way more cachefriendly version..
- HashMap<VersionKey,Version,VersionKeyHash> version_map;
+ HashMap<VersionKey, Version, VersionKeyHash> version_map;
- HashMap<uint32_t,CustomCode> custom_code_map;
+ HashMap<uint32_t, CustomCode> custom_code_map;
uint32_t last_custom_code;
-
-
+
VersionKey conditional_version;
VersionKey new_conditional_version;
-
- virtual String get_shader_name() const=0;
-
- const char** conditional_defines;
- const char** uniform_names;
+
+ virtual String get_shader_name() const = 0;
+
+ const char **conditional_defines;
+ const char **uniform_names;
const AttributePair *attribute_pairs;
const TexUnitPair *texunit_pairs;
const UBOPair *ubo_pairs;
const Feedback *feedbacks;
- const char* vertex_code;
- const char* fragment_code;
+ const char *vertex_code;
+ const char *fragment_code;
CharString fragment_code0;
CharString fragment_code1;
CharString fragment_code2;
@@ -187,213 +185,204 @@ private:
int base_material_tex_index;
- Version * get_current_version();
-
+ Version *get_current_version();
+
static ShaderGLES3 *active;
int max_image_units;
- _FORCE_INLINE_ void _set_uniform_variant(GLint p_uniform,const Variant& p_value) {
+ _FORCE_INLINE_ void _set_uniform_variant(GLint p_uniform, const Variant &p_value) {
- if (p_uniform<0)
+ if (p_uniform < 0)
return; // do none
- switch(p_value.get_type()) {
-
- case Variant::BOOL:
- case Variant::INT: {
-
- int val=p_value;
- glUniform1i( p_uniform, val );
- } break;
- case Variant::REAL: {
-
- real_t val=p_value;
- glUniform1f( p_uniform, val );
- } break;
- case Variant::COLOR: {
-
- Color val=p_value;
- glUniform4f( p_uniform, val.r, val.g,val.b,val.a );
- } break;
- case Variant::VECTOR2: {
-
- Vector2 val=p_value;
- glUniform2f( p_uniform, val.x,val.y );
- } break;
- case Variant::VECTOR3: {
-
- Vector3 val=p_value;
- glUniform3f( p_uniform, val.x,val.y,val.z );
- } break;
- case Variant::PLANE: {
-
- Plane val=p_value;
- glUniform4f( p_uniform, val.normal.x,val.normal.y,val.normal.z,val.d );
- } break;
- case Variant::QUAT: {
-
- Quat val=p_value;
- glUniform4f( p_uniform, val.x,val.y,val.z,val.w );
- } break;
-
- case Variant::TRANSFORM2D: {
-
- Transform2D tr=p_value;
- GLfloat matrix[16]={ /* build a 16x16 matrix */
- tr.elements[0][0],
- tr.elements[0][1],
- 0,
- 0,
- tr.elements[1][0],
- tr.elements[1][1],
- 0,
- 0,
- 0,
- 0,
- 1,
- 0,
- tr.elements[2][0],
- tr.elements[2][1],
- 0,
- 1
- };
-
- glUniformMatrix4fv(p_uniform,1,false,matrix);
-
- } break;
- case Variant::BASIS:
- case Variant::TRANSFORM: {
-
- Transform tr=p_value;
- GLfloat matrix[16]={ /* build a 16x16 matrix */
- tr.basis.elements[0][0],
- tr.basis.elements[1][0],
- tr.basis.elements[2][0],
- 0,
- tr.basis.elements[0][1],
- tr.basis.elements[1][1],
- tr.basis.elements[2][1],
- 0,
- tr.basis.elements[0][2],
- tr.basis.elements[1][2],
- tr.basis.elements[2][2],
- 0,
- tr.origin.x,
- tr.origin.y,
- tr.origin.z,
- 1
- };
-
-
- glUniformMatrix4fv(p_uniform,1,false,matrix);
- } break;
- default: { ERR_FAIL(); } // do nothing
-
- }
+ switch (p_value.get_type()) {
+
+ case Variant::BOOL:
+ case Variant::INT: {
+
+ int val = p_value;
+ glUniform1i(p_uniform, val);
+ } break;
+ case Variant::REAL: {
+
+ real_t val = p_value;
+ glUniform1f(p_uniform, val);
+ } break;
+ case Variant::COLOR: {
+
+ Color val = p_value;
+ glUniform4f(p_uniform, val.r, val.g, val.b, val.a);
+ } break;
+ case Variant::VECTOR2: {
+
+ Vector2 val = p_value;
+ glUniform2f(p_uniform, val.x, val.y);
+ } break;
+ case Variant::VECTOR3: {
+
+ Vector3 val = p_value;
+ glUniform3f(p_uniform, val.x, val.y, val.z);
+ } break;
+ case Variant::PLANE: {
+
+ Plane val = p_value;
+ glUniform4f(p_uniform, val.normal.x, val.normal.y, val.normal.z, val.d);
+ } break;
+ case Variant::QUAT: {
+
+ Quat val = p_value;
+ glUniform4f(p_uniform, val.x, val.y, val.z, val.w);
+ } break;
+
+ case Variant::TRANSFORM2D: {
+
+ Transform2D tr = p_value;
+ GLfloat matrix[16] = { /* build a 16x16 matrix */
+ tr.elements[0][0],
+ tr.elements[0][1],
+ 0,
+ 0,
+ tr.elements[1][0],
+ tr.elements[1][1],
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ tr.elements[2][0],
+ tr.elements[2][1],
+ 0,
+ 1
+ };
+
+ glUniformMatrix4fv(p_uniform, 1, false, matrix);
+
+ } break;
+ case Variant::BASIS:
+ case Variant::TRANSFORM: {
+
+ Transform tr = p_value;
+ GLfloat matrix[16] = { /* build a 16x16 matrix */
+ tr.basis.elements[0][0],
+ tr.basis.elements[1][0],
+ tr.basis.elements[2][0],
+ 0,
+ tr.basis.elements[0][1],
+ tr.basis.elements[1][1],
+ tr.basis.elements[2][1],
+ 0,
+ tr.basis.elements[0][2],
+ tr.basis.elements[1][2],
+ tr.basis.elements[2][2],
+ 0,
+ tr.origin.x,
+ tr.origin.y,
+ tr.origin.z,
+ 1
+ };
+
+ glUniformMatrix4fv(p_uniform, 1, false, matrix);
+ } break;
+ default: { ERR_FAIL(); } // do nothing
+ }
}
- Map<uint32_t,Variant> uniform_defaults;
- Map<uint32_t,CameraMatrix> uniform_cameras;
-
-
-protected:
+ Map<uint32_t, Variant> uniform_defaults;
+ Map<uint32_t, CameraMatrix> uniform_cameras;
+protected:
_FORCE_INLINE_ int _get_uniform(int p_which) const;
_FORCE_INLINE_ void _set_conditional(int p_which, bool p_value);
-
- void setup(const char** p_conditional_defines, int p_conditional_count,const char** p_uniform_names,int p_uniform_count, const AttributePair* p_attribute_pairs, int p_attribute_count, const TexUnitPair *p_texunit_pairs, int p_texunit_pair_count, const UBOPair *p_ubo_pairs,int p_ubo_pair_count, const Feedback* p_feedback, int p_feedback_count,const char*p_vertex_code, const char *p_fragment_code,int p_vertex_code_start,int p_fragment_code_start);
-
+
+ void setup(const char **p_conditional_defines, int p_conditional_count, const char **p_uniform_names, int p_uniform_count, const AttributePair *p_attribute_pairs, int p_attribute_count, const TexUnitPair *p_texunit_pairs, int p_texunit_pair_count, const UBOPair *p_ubo_pairs, int p_ubo_pair_count, const Feedback *p_feedback, int p_feedback_count, const char *p_vertex_code, const char *p_fragment_code, int p_vertex_code_start, int p_fragment_code_start);
+
ShaderGLES3();
+
public:
-
enum {
- CUSTOM_SHADER_DISABLED=0
+ CUSTOM_SHADER_DISABLED = 0
};
- GLint get_uniform_location(const String& p_name) const;
+ GLint get_uniform_location(const String &p_name) const;
GLint get_uniform_location(int p_uniform) const;
-
+
static _FORCE_INLINE_ ShaderGLES3 *get_active() { return active; };
bool bind();
void unbind();
void bind_uniforms();
-
- inline GLuint get_program() const { return version?version->id:0; }
-
+ inline GLuint get_program() const { return version ? version->id : 0; }
+
void clear_caches();
uint32_t create_custom_shader();
- void set_custom_shader_code(uint32_t p_id,const String& p_vertex, const String& p_vertex_globals,const String& p_fragment,const String& p_p_light,const String& p_fragment_globals,const String& p_uniforms,const Vector<StringName>& p_texture_uniforms,const Vector<CharString> &p_custom_defines);
+ void set_custom_shader_code(uint32_t p_id, const String &p_vertex, const String &p_vertex_globals, const String &p_fragment, const String &p_p_light, const String &p_fragment_globals, const String &p_uniforms, const Vector<StringName> &p_texture_uniforms, const Vector<CharString> &p_custom_defines);
void set_custom_shader(uint32_t p_id);
void free_custom_shader(uint32_t p_id);
- void set_uniform_default(int p_idx, const Variant& p_value) {
+ void set_uniform_default(int p_idx, const Variant &p_value) {
- if (p_value.get_type()==Variant::NIL) {
+ if (p_value.get_type() == Variant::NIL) {
uniform_defaults.erase(p_idx);
} else {
- uniform_defaults[p_idx]=p_value;
+ uniform_defaults[p_idx] = p_value;
}
uniforms_dirty = true;
}
uint32_t get_version() const { return new_conditional_version.version; }
- void set_uniform_camera(int p_idx, const CameraMatrix& p_mat) {
+ void set_uniform_camera(int p_idx, const CameraMatrix &p_mat) {
uniform_cameras[p_idx] = p_mat;
uniforms_dirty = true;
};
- _FORCE_INLINE_ void set_texture_uniform(int p_idx, const Variant& p_value) {
+ _FORCE_INLINE_ void set_texture_uniform(int p_idx, const Variant &p_value) {
ERR_FAIL_COND(!version);
- ERR_FAIL_INDEX(p_idx,version->texture_uniform_locations.size());
- _set_uniform_variant( version->texture_uniform_locations[p_idx], p_value );
+ ERR_FAIL_INDEX(p_idx, version->texture_uniform_locations.size());
+ _set_uniform_variant(version->texture_uniform_locations[p_idx], p_value);
}
-
+
_FORCE_INLINE_ GLint get_texture_uniform_location(int p_idx) {
- ERR_FAIL_COND_V(!version,-1);
- ERR_FAIL_INDEX_V(p_idx,version->texture_uniform_locations.size(),-1);
+ ERR_FAIL_COND_V(!version, -1);
+ ERR_FAIL_INDEX_V(p_idx, version->texture_uniform_locations.size(), -1);
return version->texture_uniform_locations[p_idx];
}
- virtual void init()=0;
+ virtual void init() = 0;
void finish();
void set_base_material_tex_index(int p_idx);
- void add_custom_define(const String& p_define) {
+ void add_custom_define(const String &p_define) {
custom_defines.push_back(p_define.utf8());
}
virtual ~ShaderGLES3();
-
};
-
-// called a lot, made inline
-
+// called a lot, made inline
int ShaderGLES3::_get_uniform(int p_which) const {
-
- ERR_FAIL_INDEX_V( p_which, uniform_count,-1 );
- ERR_FAIL_COND_V( !version, -1 );
+
+ ERR_FAIL_INDEX_V(p_which, uniform_count, -1);
+ ERR_FAIL_COND_V(!version, -1);
return version->uniform_location[p_which];
}
void ShaderGLES3::_set_conditional(int p_which, bool p_value) {
-
- ERR_FAIL_INDEX(p_which,conditional_count);
+
+ ERR_FAIL_INDEX(p_which, conditional_count);
if (p_value)
- new_conditional_version.version|=(1<<p_which);
+ new_conditional_version.version |= (1 << p_which);
else
- new_conditional_version.version&=~(1<<p_which);
+ new_conditional_version.version &= ~(1 << p_which);
}
#endif
-