Skip to content

Commit f94bbfc

Browse files
committed
Merge pull request godotengine#118353 from Chaosus/shader_subgroups
Allow to define more than one subgroup level in shader material
2 parents 473b449 + 5c667de commit f94bbfc

6 files changed

Lines changed: 26 additions & 74 deletions

File tree

drivers/gles3/storage/material_storage.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,9 +601,6 @@ void ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const
601601
const ShaderLanguage::ShaderNode::Uniform &uniform = uniforms[uniform_name];
602602

603603
String group = uniform.group;
604-
if (!uniform.subgroup.is_empty()) {
605-
group += "::" + uniform.subgroup;
606-
}
607604

608605
if (group != last_group) {
609606
PropertyInfo pi;

scene/resources/material.cpp

Lines changed: 17 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -249,30 +249,18 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const {
249249
List<PropertyInfo> list;
250250
shader->get_shader_uniform_list(&list, true);
251251

252-
HashMap<String, HashMap<String, List<PropertyInfo>>> groups;
253-
LocalVector<Pair<String, LocalVector<String>>> vgroups;
254-
{
255-
HashMap<String, List<PropertyInfo>> none_subgroup;
256-
none_subgroup.insert("<None>", List<PropertyInfo>());
257-
groups.insert("<None>", none_subgroup);
258-
}
252+
HashMap<String, List<PropertyInfo>> groups;
253+
LocalVector<String> vgroups;
259254

260255
String last_group = "<None>";
261-
String last_subgroup = "<None>";
262256

263257
bool is_none_group_undefined = true;
264258
bool is_none_group = true;
265259

266260
for (const PropertyInfo &pi : list) {
267261
if (pi.usage == PROPERTY_USAGE_GROUP) {
268262
if (!pi.name.is_empty()) {
269-
Vector<String> vgroup = pi.name.split("::");
270-
last_group = vgroup[0];
271-
if (vgroup.size() > 1) {
272-
last_subgroup = vgroup[1];
273-
} else {
274-
last_subgroup = "<None>";
275-
}
263+
last_group = pi.name;
276264
is_none_group = false;
277265

278266
if (!groups.has(last_group)) {
@@ -281,36 +269,14 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const {
281269
info.name = last_group.capitalize();
282270
info.hint_string = "shader_parameter/";
283271

284-
List<PropertyInfo> none_subgroup;
285-
none_subgroup.push_back(info);
286-
287-
HashMap<String, List<PropertyInfo>> subgroup_map;
288-
subgroup_map.insert("<None>", none_subgroup);
272+
List<PropertyInfo> props;
273+
props.push_back(info);
289274

290-
groups.insert(last_group, subgroup_map);
291-
vgroups.push_back(Pair<String, LocalVector<String>>(last_group, { "<None>" }));
292-
}
293-
294-
if (!groups[last_group].has(last_subgroup)) {
295-
PropertyInfo info;
296-
info.usage = PROPERTY_USAGE_SUBGROUP;
297-
info.name = last_subgroup.capitalize();
298-
info.hint_string = "shader_parameter/";
299-
300-
List<PropertyInfo> subgroup;
301-
subgroup.push_back(info);
302-
303-
groups[last_group].insert(last_subgroup, subgroup);
304-
for (Pair<String, LocalVector<String>> &group : vgroups) {
305-
if (group.first == last_group) {
306-
group.second.push_back(last_subgroup);
307-
break;
308-
}
309-
}
275+
groups.insert(last_group, props);
276+
vgroups.push_back(last_group);
310277
}
311278
} else {
312279
last_group = "<None>";
313-
last_subgroup = "<None>";
314280
is_none_group = true;
315281
}
316282
continue; // Pass group.
@@ -323,9 +289,12 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const {
323289
info.usage = PROPERTY_USAGE_GROUP;
324290
info.name = "Shader Parameters";
325291
info.hint_string = "shader_parameter/";
326-
groups["<None>"]["<None>"].push_back(info);
327292

328-
vgroups.push_back(Pair<String, LocalVector<String>>("<None>", { "<None>" }));
293+
List<PropertyInfo> props;
294+
props.push_back(info);
295+
296+
groups.insert("<None>", props);
297+
vgroups.push_back("<None>");
329298
}
330299

331300
const bool is_uniform_cached = param_cache.has(pi.name);
@@ -375,16 +344,13 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const {
375344
param_cache.insert(pi.name, default_value);
376345
remap_cache.insert(info.name, pi.name);
377346
}
378-
groups[last_group][last_subgroup].push_back(info);
347+
groups[last_group].push_back(info);
379348
}
380349

381-
for (const Pair<String, LocalVector<String>> &group_pair : vgroups) {
382-
String group = group_pair.first;
383-
for (const String &subgroup : group_pair.second) {
384-
List<PropertyInfo> &prop_infos = groups[group][subgroup];
385-
for (const PropertyInfo &item : prop_infos) {
386-
p_list->push_back(item);
387-
}
350+
for (const String &group : vgroups) {
351+
List<PropertyInfo> &prop_infos = groups[group];
352+
for (const PropertyInfo &item : prop_infos) {
353+
p_list->push_back(item);
388354
}
389355
}
390356
}

servers/rendering/dummy/storage/material_storage.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,6 @@ void MaterialStorage::get_shader_parameter_list(RID p_shader, List<PropertyInfo>
214214
const ShaderLanguage::ShaderNode::Uniform &uniform = shader->uniforms[uniform_name];
215215

216216
String group = uniform.group;
217-
if (!uniform.subgroup.is_empty()) {
218-
group += "::" + uniform.subgroup;
219-
}
220217

221218
if (group != last_group) {
222219
PropertyInfo pi;

servers/rendering/renderer_rd/storage_rd/material_storage.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -609,9 +609,6 @@ void MaterialStorage::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_
609609
const ShaderLanguage::ShaderNode::Uniform &uniform = uniforms[uniform_name];
610610

611611
String group = uniform.group;
612-
if (!uniform.subgroup.is_empty()) {
613-
group += "::" + uniform.subgroup;
614-
}
615612

616613
if (group != last_group) {
617614
PropertyInfo pi;

servers/rendering/shader_language.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,7 +1316,6 @@ void ShaderLanguage::clear() {
13161316
last_name = StringName();
13171317
last_type = IDENTIFIER_MAX;
13181318
current_uniform_group_name = "";
1319-
current_uniform_subgroup_name = "";
13201319
current_uniform_hint = ShaderNode::Uniform::HINT_NONE;
13211320
current_uniform_filter = FILTER_DEFAULT;
13221321
current_uniform_repeat = REPEAT_DEFAULT;
@@ -9767,7 +9766,6 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
97679766
uniform.precision = precision;
97689767
uniform.array_size = array_size;
97699768
uniform.group = current_uniform_group_name;
9770-
uniform.subgroup = current_uniform_subgroup_name;
97719769

97729770
tk = _get_token();
97739771
if (tk.type == TK_BRACKET_OPEN) {
@@ -10301,22 +10299,22 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
1030110299
tk = _get_token();
1030210300
if (tk.type == TK_IDENTIFIER) {
1030310301
current_uniform_group_name = tk.text;
10304-
current_uniform_subgroup_name = "";
10302+
1030510303
tk = _get_token();
10306-
if (tk.type == TK_PERIOD) {
10304+
while (tk.type == TK_PERIOD) {
1030710305
tk = _get_token();
10306+
1030810307
if (tk.type == TK_IDENTIFIER) {
10309-
current_uniform_subgroup_name = tk.text;
10310-
tk = _get_token();
10311-
if (tk.type != TK_SEMICOLON) {
10312-
_set_expected_error(";");
10313-
return ERR_PARSE_ERROR;
10314-
}
10308+
current_uniform_group_name += "/" + tk.text;
1031510309
} else {
1031610310
_set_error(RTR("Expected an uniform subgroup identifier."));
1031710311
return ERR_PARSE_ERROR;
1031810312
}
10319-
} else if (tk.type != TK_SEMICOLON) {
10313+
10314+
tk = _get_token();
10315+
}
10316+
10317+
if (tk.type != TK_SEMICOLON) {
1032010318
_set_expected_error(";", ".");
1032110319
return ERR_PARSE_ERROR;
1032210320
}
@@ -10333,7 +10331,6 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
1033310331
return ERR_PARSE_ERROR;
1033410332
} else {
1033510333
current_uniform_group_name = "";
10336-
current_uniform_subgroup_name = "";
1033710334
}
1033810335
}
1033910336
} break;

servers/rendering/shader_language.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,6 @@ class ShaderLanguage {
711711
PackedStringArray hint_enum_names;
712712
int instance_index = 0;
713713
String group;
714-
String subgroup;
715714

716715
_FORCE_INLINE_ bool is_texture() const {
717716
// Order is assigned to -1 for texture uniforms.
@@ -1063,7 +1062,6 @@ class ShaderLanguage {
10631062
bool is_shader_inc = false;
10641063

10651064
String current_uniform_group_name;
1066-
String current_uniform_subgroup_name;
10671065

10681066
VaryingFunctionNames varying_function_names;
10691067
uint32_t base_varying_index = 0;

0 commit comments

Comments
 (0)