summaryrefslogtreecommitdiff
path: root/drivers/gles2/shader_compiler_gles2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles2/shader_compiler_gles2.cpp')
-rw-r--r--drivers/gles2/shader_compiler_gles2.cpp90
1 files changed, 87 insertions, 3 deletions
diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp
index 6dc6259fef..ada9efa4b3 100644
--- a/drivers/gles2/shader_compiler_gles2.cpp
+++ b/drivers/gles2/shader_compiler_gles2.cpp
@@ -145,6 +145,32 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a
} break;
case SL::Node::TYPE_VARIABLE: {
SL::VariableNode *vnode=(SL::VariableNode*)p_node;
+ if (type==ShaderLanguage::SHADER_MATERIAL_VERTEX) {
+
+ if (vnode->name==vname_vertex && p_assign_left) {
+ vertex_code_writes_vertex=true;
+ }
+ if (vnode->name==vname_color_interp) {
+ flags->use_color_interp=true;
+ }
+ if (vnode->name==vname_uv_interp) {
+ flags->use_uv_interp=true;
+ }
+ if (vnode->name==vname_uv2_interp) {
+ flags->use_uv2_interp=true;
+ }
+ if (vnode->name==vname_var1_interp) {
+ flags->use_var1_interp=true;
+ }
+ if (vnode->name==vname_var2_interp) {
+ flags->use_var2_interp=true;
+ }
+ if (vnode->name==vname_tangent_interp || vnode->name==vname_binormal_interp) {
+ flags->use_tangent_interp=true;
+ }
+
+
+ }
if (type==ShaderLanguage::SHADER_MATERIAL_FRAGMENT) {
if (vnode->name==vname_discard) {
@@ -176,7 +202,17 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a
}
}
+ if (type==ShaderLanguage::SHADER_MATERIAL_LIGHT) {
+
+ if (vnode->name==vname_light) {
+ uses_light=true;
+ }
+
+ }
+ if (vnode->name==vname_time) {
+ uses_time=true;
+ }
code=replace_string(vnode->name);
} break;
@@ -404,7 +440,7 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a
}
-void ShaderCompilerGLES2::compile_node(SL::ProgramNode *p_program) {
+Error ShaderCompilerGLES2::compile_node(SL::ProgramNode *p_program) {
// feed the local replace table and global code
global_code="";
@@ -417,8 +453,15 @@ void ShaderCompilerGLES2::compile_node(SL::ProgramNode *p_program) {
for(Map<StringName,SL::Uniform>::Element *E=p_program->uniforms.front();E;E=E->next()) {
String uline="uniform "+_typestr(E->get().type)+" _"+E->key().operator String()+";"ENDL;
+
global_code+=uline;
if (uniforms) {
+ //if (uniforms->has(E->key())) {
+ // //repeated uniform, error
+ // ERR_EXPLAIN("Uniform already exists from other shader: "+String(E->key()));
+ // ERR_FAIL_COND_V(uniforms->has(E->key()),ERR_ALREADY_EXISTS);
+//
+// }
SL::Uniform u = E->get();
u.order+=ubase;
uniforms->insert(E->key(),u);
@@ -468,12 +511,14 @@ void ShaderCompilerGLES2::compile_node(SL::ProgramNode *p_program) {
print_line(code);
code=code.replace("\n","");
#endif
+
+ return OK;
}
-void ShaderCompilerGLES2::create_glsl_120_code(void *p_str,SL::ProgramNode *p_program) {
+Error ShaderCompilerGLES2::create_glsl_120_code(void *p_str,SL::ProgramNode *p_program) {
ShaderCompilerGLES2 *compiler=(ShaderCompilerGLES2*)p_str;
- compiler->compile_node(p_program);
+ return compiler->compile_node(p_program);
}
@@ -499,6 +544,8 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
uses_alpha=false;
uses_discard=false;
uses_screen_uv=false;
+ uses_light=false;
+ uses_time=false;
vertex_code_writes_vertex=false;
uniforms=r_uniforms;
flags=&r_flags;
@@ -527,6 +574,8 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
r_flags.vertex_code_writes_vertex=vertex_code_writes_vertex;
r_flags.uses_discard=uses_discard;
r_flags.uses_screen_uv=uses_screen_uv;
+ r_flags.uses_light=uses_light;
+ r_flags.uses_time=uses_time;
r_code_line=code;
r_globals_line=global_code;
return OK;
@@ -562,7 +611,11 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
replace_table["sign"]= "sign";
replace_table["floor"]= "floor";
replace_table["trunc"]= "trunc";
+#ifdef GLEW_ENABLED
+ replace_table["round"]= "roundfix";
+#else
replace_table["round"]= "round";
+#endif
replace_table["ceil" ]= "ceil";
replace_table["fract"]= "fract";
replace_table["mod" ]= "mod";
@@ -571,6 +624,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
replace_table["clamp"]= "clamp";
replace_table["mix" ]= "mix";
replace_table["step" ]= "step";
+ replace_table["smoothstep" ]= "smoothstep";
replace_table["length"]= "length";
replace_table["distance"]= "distance";
replace_table["dot" ]= "dot";
@@ -584,6 +638,11 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
replace_table["texscreen"]= "texscreen";
replace_table["texpos"]= "texpos";
+ mode_replace_table[0]["SRC_VERTEX"]="vertex_in.xyz";
+ mode_replace_table[0]["SRC_NORMAL"]="normal_in";
+ mode_replace_table[0]["SRC_TANGENT"]="tangent_in";
+ mode_replace_table[0]["SRC_BINORMALF"]="binormalf";
+
mode_replace_table[0]["VERTEX"]="vertex_interp";
mode_replace_table[0]["NORMAL"]="normal_interp";
mode_replace_table[0]["TANGENT"]="tangent_interp";
@@ -596,6 +655,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
mode_replace_table[0]["WORLD_MATRIX"]="world_transform";
mode_replace_table[0]["INV_CAMERA_MATRIX"]="camera_inverse_transform";
mode_replace_table[0]["PROJECTION_MATRIX"]="projection_transform";
+ mode_replace_table[0]["MODELVIEW_MATRIX"]="modelview";
mode_replace_table[0]["POINT_SIZE"]="gl_PointSize";
mode_replace_table[0]["VAR1"]="var1_interp";
mode_replace_table[0]["VAR2"]="var2_interp";
@@ -622,6 +682,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
mode_replace_table[1]["DIFFUSE_ALPHA"]="diffuse";
mode_replace_table[1]["SPECULAR"]="specular";
mode_replace_table[1]["EMISSION"]="emission";
+ mode_replace_table[1]["SHADE_PARAM"]="shade_param";
mode_replace_table[1]["SPEC_EXP"]="specular_exp";
mode_replace_table[1]["GLOW"]="glow";
mode_replace_table[1]["DISCARD"]="discard_";
@@ -632,6 +693,26 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
//mode_replace_table[1]["SCREEN_TEXEL_SIZE"]="SCREEN_TEXEL_SIZE";
mode_replace_table[1]["TIME"]="time";
+ //////////////
+
+ mode_replace_table[2]["NORMAL"]="normal";
+ //mode_replace_table[2]["POSITION"]="IN_POSITION";
+ mode_replace_table[2]["LIGHT_DIR"]="light_dir";
+ mode_replace_table[2]["LIGHT_DIFFUSE"]="light_diffuse";
+ mode_replace_table[2]["LIGHT_SPECULAR"]="light_specular";
+ mode_replace_table[2]["EYE_VEC"]="eye_vec";
+ mode_replace_table[2]["DIFFUSE"]="mdiffuse";
+ mode_replace_table[2]["SPECULAR"]="specular";
+ mode_replace_table[2]["SPECULAR_EXP"]="specular_exp";
+ mode_replace_table[2]["SHADE_PARAM"]="shade_param";
+ mode_replace_table[2]["LIGHT"]="light";
+ mode_replace_table[2]["POINT_COORD"]="gl_PointCoord";
+ mode_replace_table[2]["TIME"]="time";
+
+ //mode_replace_table[2]["SCREEN_POS"]="SCREEN_POS";
+ //mode_replace_table[2]["SCREEN_TEXEL_SIZE"]="SCREEN_TEXEL_SIZE";
+
+
out_vertex_name="VERTEX";
vname_discard="DISCARD";
@@ -644,5 +725,8 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
vname_binormal_interp="BINORMAL";
vname_var1_interp="VAR1";
vname_var2_interp="VAR2";
+ vname_vertex="VERTEX";
+ vname_light="LIGHT";
+ vname_time="TIME";
}