|
@@ -267,7 +267,7 @@ void ShaderCompilerGLES3::_dump_function_deps(SL::ShaderNode *p_node, const Stri
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions) {
|
|
|
+String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning) {
|
|
|
|
|
|
String code;
|
|
|
|
|
@@ -407,7 +407,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
//code for functions
|
|
|
for (int i = 0; i < pnode->functions.size(); i++) {
|
|
|
SL::FunctionNode *fnode = pnode->functions[i].function;
|
|
|
- function_code[fnode->name] = _dump_node_code(fnode->body, p_level + 1, r_gen_code, p_actions, p_default_actions);
|
|
|
+ function_code[fnode->name] = _dump_node_code(fnode->body, p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
}
|
|
|
|
|
|
//place functions in actual code
|
|
@@ -455,7 +455,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
|
|
|
for (int i = 0; i < bnode->statements.size(); i++) {
|
|
|
|
|
|
- String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
|
|
|
if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW || bnode->single_statement) {
|
|
|
code += scode; //use directly
|
|
@@ -481,7 +481,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
declaration += _mkid(vdnode->declarations[i].name);
|
|
|
if (vdnode->declarations[i].initializer) {
|
|
|
declaration += "=";
|
|
|
- declaration += _dump_node_code(vdnode->declarations[i].initializer, p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ declaration += _dump_node_code(vdnode->declarations[i].initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -490,6 +490,10 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
case SL::Node::TYPE_VARIABLE: {
|
|
|
SL::VariableNode *vnode = (SL::VariableNode *)p_node;
|
|
|
|
|
|
+ if (p_assigning && p_actions.write_flag_pointers.has(vnode->name)) {
|
|
|
+ *p_actions.write_flag_pointers[vnode->name] = true;
|
|
|
+ }
|
|
|
+
|
|
|
if (p_default_actions.usage_defines.has(vnode->name) && !used_name_defines.has(vnode->name)) {
|
|
|
String define = p_default_actions.usage_defines[vnode->name];
|
|
|
if (define.begins_with("@")) {
|
|
@@ -540,24 +544,18 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
case SL::OP_ASSIGN_BIT_AND:
|
|
|
case SL::OP_ASSIGN_BIT_OR:
|
|
|
case SL::OP_ASSIGN_BIT_XOR:
|
|
|
- if (onode->arguments[0]->type == SL::Node::TYPE_VARIABLE) {
|
|
|
- SL::VariableNode *vnode = (SL::VariableNode *)onode->arguments[0];
|
|
|
- if (p_actions.write_flag_pointers.has(vnode->name)) {
|
|
|
- *p_actions.write_flag_pointers[vnode->name] = true;
|
|
|
- }
|
|
|
- }
|
|
|
- code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, true) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
break;
|
|
|
case SL::OP_BIT_INVERT:
|
|
|
case SL::OP_NEGATE:
|
|
|
case SL::OP_NOT:
|
|
|
case SL::OP_DECREMENT:
|
|
|
case SL::OP_INCREMENT:
|
|
|
- code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
break;
|
|
|
case SL::OP_POST_DECREMENT:
|
|
|
case SL::OP_POST_INCREMENT:
|
|
|
- code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op);
|
|
|
+ code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op);
|
|
|
break;
|
|
|
case SL::OP_CALL:
|
|
|
case SL::OP_CONSTRUCT: {
|
|
@@ -584,31 +582,31 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
for (int i = 1; i < onode->arguments.size(); i++) {
|
|
|
if (i > 1)
|
|
|
code += ", ";
|
|
|
- code += _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
}
|
|
|
code += ")";
|
|
|
} break;
|
|
|
case SL::OP_INDEX: {
|
|
|
|
|
|
- code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
code += "[";
|
|
|
- code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
code += "]";
|
|
|
|
|
|
} break;
|
|
|
case SL::OP_SELECT_IF: {
|
|
|
|
|
|
- code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
code += "?";
|
|
|
- code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
code += ":";
|
|
|
- code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
|
|
|
} break;
|
|
|
|
|
|
default: {
|
|
|
|
|
|
- code = "(" + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions) + ")";
|
|
|
+ code = "(" + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")";
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -618,29 +616,29 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
SL::ControlFlowNode *cfnode = (SL::ControlFlowNode *)p_node;
|
|
|
if (cfnode->flow_op == SL::FLOW_OP_IF) {
|
|
|
|
|
|
- code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ")\n";
|
|
|
- code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
|
|
|
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
if (cfnode->blocks.size() == 2) {
|
|
|
|
|
|
code += _mktab(p_level) + "else\n";
|
|
|
- code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
}
|
|
|
} else if (cfnode->flow_op == SL::FLOW_OP_WHILE) {
|
|
|
|
|
|
- code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ")\n";
|
|
|
- code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _mktab(p_level) + "while (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n";
|
|
|
+ code += _dump_node_code(cfnode->blocks[0], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
} else if (cfnode->flow_op == SL::FLOW_OP_FOR) {
|
|
|
|
|
|
- String left = _dump_node_code(cfnode->blocks[0], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
- String middle = _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
- String right = _dump_node_code(cfnode->expressions[1], p_level, r_gen_code, p_actions, p_default_actions);
|
|
|
+ String left = _dump_node_code(cfnode->blocks[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
+ String middle = _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
+ String right = _dump_node_code(cfnode->expressions[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
code += _mktab(p_level) + "for (" + left + ";" + middle + ";" + right + ")\n";
|
|
|
- code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions);
|
|
|
+ code += _dump_node_code(cfnode->blocks[1], p_level + 1, r_gen_code, p_actions, p_default_actions, p_assigning);
|
|
|
|
|
|
} else if (cfnode->flow_op == SL::FLOW_OP_RETURN) {
|
|
|
|
|
|
if (cfnode->expressions.size()) {
|
|
|
- code = "return " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions) + ";";
|
|
|
+ code = "return " + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ";";
|
|
|
} else {
|
|
|
code = "return;";
|
|
|
}
|
|
@@ -658,7 +656,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
|
|
|
} break;
|
|
|
case SL::Node::TYPE_MEMBER: {
|
|
|
SL::MemberNode *mnode = (SL::MemberNode *)p_node;
|
|
|
- code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions) + "." + mnode->name;
|
|
|
+ code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + "." + mnode->name;
|
|
|
|
|
|
} break;
|
|
|
}
|
|
@@ -694,7 +692,7 @@ Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String &p_code,
|
|
|
used_rmode_defines.clear();
|
|
|
used_flag_pointers.clear();
|
|
|
|
|
|
- _dump_node_code(parser.get_shader(), 1, r_gen_code, *p_actions, actions[p_mode]);
|
|
|
+ _dump_node_code(parser.get_shader(), 1, r_gen_code, *p_actions, actions[p_mode], false);
|
|
|
|
|
|
if (r_gen_code.uniform_total_size) { //uniforms used?
|
|
|
int md = sizeof(float) * 4;
|