Skip to content

Commit a0c3798

Browse files
committed
Merge pull request godotengine#101210 from clayjohn/headless-export-shader
Save instance and global uniform data in RenderingServerDummy
2 parents 21fdf16 + 49846cf commit a0c3798

File tree

3 files changed

+178
-11
lines changed

3 files changed

+178
-11
lines changed

servers/rendering/dummy/storage/material_storage.cpp

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#include "material_storage.h"
3232

33+
#include "core/config/project_settings.h"
34+
3335
using namespace RendererDummy;
3436

3537
MaterialStorage *MaterialStorage::singleton = nullptr;
@@ -42,6 +44,103 @@ MaterialStorage::MaterialStorage() {
4244

4345
MaterialStorage::~MaterialStorage() {
4446
singleton = nullptr;
47+
global_shader_variables.clear();
48+
}
49+
50+
void MaterialStorage::global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) {
51+
ERR_FAIL_COND(global_shader_variables.has(p_name));
52+
53+
global_shader_variables[p_name] = p_type;
54+
}
55+
56+
void MaterialStorage::global_shader_parameter_remove(const StringName &p_name) {
57+
if (!global_shader_variables.has(p_name)) {
58+
return;
59+
}
60+
61+
global_shader_variables.erase(p_name);
62+
}
63+
64+
Vector<StringName> MaterialStorage::global_shader_parameter_get_list() const {
65+
Vector<StringName> names;
66+
for (const KeyValue<StringName, RS::GlobalShaderParameterType> &E : global_shader_variables) {
67+
names.push_back(E.key);
68+
}
69+
names.sort_custom<StringName::AlphCompare>();
70+
return names;
71+
}
72+
73+
RS::GlobalShaderParameterType MaterialStorage::global_shader_parameter_get_type(const StringName &p_name) const {
74+
if (!global_shader_variables.has(p_name)) {
75+
print_line("don't have name, sorry");
76+
return RS::GLOBAL_VAR_TYPE_MAX;
77+
}
78+
79+
return global_shader_variables[p_name];
80+
}
81+
82+
void MaterialStorage::global_shader_parameters_load_settings(bool p_load_textures) {
83+
List<PropertyInfo> settings;
84+
ProjectSettings::get_singleton()->get_property_list(&settings);
85+
86+
for (const PropertyInfo &E : settings) {
87+
if (E.name.begins_with("shader_globals/")) {
88+
StringName name = E.name.get_slice("/", 1);
89+
Dictionary d = GLOBAL_GET(E.name);
90+
91+
ERR_CONTINUE(!d.has("type"));
92+
ERR_CONTINUE(!d.has("value"));
93+
94+
String type = d["type"];
95+
96+
static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = {
97+
"bool",
98+
"bvec2",
99+
"bvec3",
100+
"bvec4",
101+
"int",
102+
"ivec2",
103+
"ivec3",
104+
"ivec4",
105+
"rect2i",
106+
"uint",
107+
"uvec2",
108+
"uvec3",
109+
"uvec4",
110+
"float",
111+
"vec2",
112+
"vec3",
113+
"vec4",
114+
"color",
115+
"rect2",
116+
"mat2",
117+
"mat3",
118+
"mat4",
119+
"transform_2d",
120+
"transform",
121+
"sampler2D",
122+
"sampler2DArray",
123+
"sampler3D",
124+
"samplerCube",
125+
"samplerExternalOES"
126+
};
127+
128+
RS::GlobalShaderParameterType gvtype = RS::GLOBAL_VAR_TYPE_MAX;
129+
130+
for (int i = 0; i < RS::GLOBAL_VAR_TYPE_MAX; i++) {
131+
if (global_var_type_names[i] == type) {
132+
gvtype = RS::GlobalShaderParameterType(i);
133+
break;
134+
}
135+
}
136+
137+
ERR_CONTINUE(gvtype == RS::GLOBAL_VAR_TYPE_MAX); //type invalid
138+
139+
if (!global_shader_variables.has(name)) {
140+
global_shader_parameter_add(name, gvtype, Variant());
141+
}
142+
}
143+
}
45144
}
46145

47146
RID MaterialStorage::shader_allocate() {
@@ -131,3 +230,56 @@ void MaterialStorage::get_shader_parameter_list(RID p_shader, List<PropertyInfo>
131230
p_param_list->push_back(pi);
132231
}
133232
}
233+
234+
RID MaterialStorage::material_allocate() {
235+
return material_owner.allocate_rid();
236+
}
237+
238+
void MaterialStorage::material_initialize(RID p_rid) {
239+
material_owner.initialize_rid(p_rid, DummyMaterial());
240+
}
241+
242+
void MaterialStorage::material_free(RID p_rid) {
243+
DummyMaterial *material = material_owner.get_or_null(p_rid);
244+
ERR_FAIL_NULL(material);
245+
246+
material_owner.free(p_rid);
247+
}
248+
249+
void MaterialStorage::material_set_shader(RID p_material, RID p_shader) {
250+
DummyMaterial *material = material_owner.get_or_null(p_material);
251+
ERR_FAIL_NULL(material);
252+
253+
material->shader = p_shader;
254+
}
255+
256+
void MaterialStorage::material_set_next_pass(RID p_material, RID p_next_material) {
257+
DummyMaterial *material = material_owner.get_or_null(p_material);
258+
ERR_FAIL_NULL(material);
259+
260+
material->next_pass = p_next_material;
261+
}
262+
263+
void MaterialStorage::material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) {
264+
DummyMaterial *material = material_owner.get_or_null(p_material);
265+
ERR_FAIL_NULL(material);
266+
DummyShader *shader = shader_owner.get_or_null(material->shader);
267+
268+
if (shader) {
269+
for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : shader->uniforms) {
270+
if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
271+
continue;
272+
}
273+
274+
RendererMaterialStorage::InstanceShaderParam p;
275+
p.info = ShaderLanguage::uniform_to_property_info(E.value);
276+
p.info.name = E.key; //supply name
277+
p.index = E.value.instance_index;
278+
p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint);
279+
r_parameters->push_back(p);
280+
}
281+
}
282+
if (material->next_pass.is_valid()) {
283+
material_get_instance_shader_parameters(material->next_pass, r_parameters);
284+
}
285+
}

servers/rendering/dummy/storage/material_storage.h

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class MaterialStorage : public RendererMaterialStorage {
4242
private:
4343
static MaterialStorage *singleton;
4444

45+
HashMap<StringName, RS::GlobalShaderParameterType> global_shader_variables;
46+
4547
struct DummyShader {
4648
HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms;
4749
};
@@ -50,6 +52,13 @@ class MaterialStorage : public RendererMaterialStorage {
5052

5153
ShaderCompiler dummy_compiler;
5254

55+
struct DummyMaterial {
56+
RID shader;
57+
RID next_pass;
58+
};
59+
60+
mutable RID_Owner<DummyMaterial> material_owner;
61+
5362
public:
5463
static MaterialStorage *get_singleton() { return singleton; }
5564

@@ -58,16 +67,16 @@ class MaterialStorage : public RendererMaterialStorage {
5867

5968
/* GLOBAL SHADER UNIFORM API */
6069

61-
virtual void global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) override {}
62-
virtual void global_shader_parameter_remove(const StringName &p_name) override {}
63-
virtual Vector<StringName> global_shader_parameter_get_list() const override { return Vector<StringName>(); }
70+
virtual void global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) override;
71+
virtual void global_shader_parameter_remove(const StringName &p_name) override;
72+
virtual Vector<StringName> global_shader_parameter_get_list() const override;
6473

6574
virtual void global_shader_parameter_set(const StringName &p_name, const Variant &p_value) override {}
6675
virtual void global_shader_parameter_set_override(const StringName &p_name, const Variant &p_value) override {}
6776
virtual Variant global_shader_parameter_get(const StringName &p_name) const override { return Variant(); }
68-
virtual RS::GlobalShaderParameterType global_shader_parameter_get_type(const StringName &p_name) const override { return RS::GLOBAL_VAR_TYPE_MAX; }
77+
virtual RS::GlobalShaderParameterType global_shader_parameter_get_type(const StringName &p_name) const override;
6978

70-
virtual void global_shader_parameters_load_settings(bool p_load_textures = true) override {}
79+
virtual void global_shader_parameters_load_settings(bool p_load_textures = true) override;
7180
virtual void global_shader_parameters_clear() override {}
7281

7382
virtual int32_t global_shader_parameters_instance_allocate(RID p_instance) override { return 0; }
@@ -95,23 +104,26 @@ class MaterialStorage : public RendererMaterialStorage {
95104
virtual RS::ShaderNativeSourceCode shader_get_native_source_code(RID p_shader) const override { return RS::ShaderNativeSourceCode(); }
96105

97106
/* MATERIAL API */
98-
virtual RID material_allocate() override { return RID(); }
99-
virtual void material_initialize(RID p_rid) override {}
100-
virtual void material_free(RID p_rid) override {}
107+
108+
bool owns_material(RID p_rid) { return material_owner.owns(p_rid); }
109+
110+
virtual RID material_allocate() override;
111+
virtual void material_initialize(RID p_rid) override;
112+
virtual void material_free(RID p_rid) override;
101113

102114
virtual void material_set_render_priority(RID p_material, int priority) override {}
103-
virtual void material_set_shader(RID p_shader_material, RID p_shader) override {}
115+
virtual void material_set_shader(RID p_shader_material, RID p_shader) override;
104116

105117
virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) override {}
106118
virtual Variant material_get_param(RID p_material, const StringName &p_param) const override { return Variant(); }
107119

108-
virtual void material_set_next_pass(RID p_material, RID p_next_material) override {}
120+
virtual void material_set_next_pass(RID p_material, RID p_next_material) override;
109121

110122
virtual bool material_is_animated(RID p_material) override { return false; }
111123
virtual bool material_casts_shadows(RID p_material) override { return false; }
112124
virtual RS::CullMode material_get_cull_mode(RID p_material) const override { return RS::CULL_MODE_DISABLED; }
113125

114-
virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override {}
126+
virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
115127
virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override {}
116128
};
117129

servers/rendering/dummy/storage/utilities.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ class Utilities : public RendererUtilities {
7777
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_shader(p_rid)) {
7878
RendererDummy::MaterialStorage::get_singleton()->shader_free(p_rid);
7979
return true;
80+
} else if (RendererDummy::MaterialStorage::get_singleton()->owns_material(p_rid)) {
81+
RendererDummy::MaterialStorage::get_singleton()->material_free(p_rid);
82+
return true;
8083
}
8184
return false;
8285
}

0 commit comments

Comments
 (0)