Browse Source

Fix shader constant sorting

Yuri Roubinsky 5 years ago
parent
commit
bc30f541e6

+ 8 - 7
drivers/gles2/shader_compiler_gles2.cpp

@@ -404,18 +404,19 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener
 
 			// constants
 
-			for (Map<StringName, SL::ShaderNode::Constant>::Element *E = snode->constants.front(); E; E = E->next()) {
+			for (int i = 0; i < snode->vconstants.size(); i++) {
+				const SL::ShaderNode::Constant &cnode = snode->vconstants[i];
 				String gcode;
 				gcode += "const ";
-				gcode += _prestr(E->get().precision);
-				if (E->get().type == SL::TYPE_STRUCT) {
-					gcode += _mkid(E->get().type_str);
+				gcode += _prestr(cnode.precision);
+				if (cnode.type == SL::TYPE_STRUCT) {
+					gcode += _mkid(cnode.type_str);
 				} else {
-					gcode += _typestr(E->get().type);
+					gcode += _typestr(cnode.type);
 				}
-				gcode += " " + _mkid(E->key());
+				gcode += " " + _mkid(String(cnode.name));
 				gcode += "=";
-				gcode += _dump_node_code(E->get().initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+				gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 				gcode += ";\n";
 				vertex_global += gcode;
 				fragment_global += gcode;

+ 8 - 7
servers/rendering/rasterizer_rd/shader_compiler_rd.cpp

@@ -547,18 +547,19 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
 				index++;
 			}
 
-			for (Map<StringName, SL::ShaderNode::Constant>::Element *E = pnode->constants.front(); E; E = E->next()) {
+			for (int i = 0; i < pnode->vconstants.size(); i++) {
+				const SL::ShaderNode::Constant &cnode = pnode->vconstants[i];
 				String gcode;
 				gcode += "const ";
-				gcode += _prestr(E->get().precision);
-				if (E->get().type == SL::TYPE_STRUCT) {
-					gcode += _mkid(E->get().type_str);
+				gcode += _prestr(cnode.precision);
+				if (cnode.type == SL::TYPE_STRUCT) {
+					gcode += _mkid(cnode.type_str);
 				} else {
-					gcode += _typestr(E->get().type);
+					gcode += _typestr(cnode.type);
 				}
-				gcode += " " + _mkid(E->key());
+				gcode += " " + _mkid(String(cnode.name));
 				gcode += "=";
-				gcode += _dump_node_code(E->get().initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+				gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 				gcode += ";\n";
 				r_gen_code.vertex_global += gcode;
 				r_gen_code.fragment_global += gcode;

+ 3 - 0
servers/rendering/shader_language.cpp

@@ -6219,6 +6219,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
 
 					while (true) {
 						ShaderNode::Constant constant;
+						constant.name = name;
 						constant.type = is_struct ? TYPE_STRUCT : type;
 						constant.type_str = struct_name;
 						constant.precision = precision;
@@ -6258,6 +6259,8 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
 						}
 
 						shader->constants[name] = constant;
+						shader->vconstants.push_back(constant);
+
 						if (tk.type == TK_COMMA) {
 							tk = _get_token();
 							if (tk.type != TK_IDENTIFIER) {

+ 2 - 0
servers/rendering/shader_language.h

@@ -599,6 +599,7 @@ public:
 	struct ShaderNode : public Node {
 
 		struct Constant {
+			StringName name;
 			DataType type;
 			StringName type_str;
 			DataPrecision precision;
@@ -681,6 +682,7 @@ public:
 		Vector<StringName> render_modes;
 
 		Vector<Function> functions;
+		Vector<Constant> vconstants;
 		Vector<Struct> vstructs;
 
 		ShaderNode() :