summaryrefslogtreecommitdiffstats
path: root/servers/rendering/rendering_server_default.h
diff options
context:
space:
mode:
Diffstat (limited to 'servers/rendering/rendering_server_default.h')
-rw-r--r--servers/rendering/rendering_server_default.h93
1 files changed, 68 insertions, 25 deletions
diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h
index 2dcdc3f254..225a67fb52 100644
--- a/servers/rendering/rendering_server_default.h
+++ b/servers/rendering/rendering_server_default.h
@@ -129,32 +129,32 @@ public:
#define ServerName RendererTextureStorage
#define server_name RSG::texture_storage
-#define FUNCRIDTEX0(m_type) \
- virtual RID m_type##_create() override { \
- RID ret = RSG::texture_storage->texture_allocate(); \
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) { \
- RSG::texture_storage->m_type##_initialize(ret); \
- } else { \
- command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret); \
- } \
- return ret; \
+#define FUNCRIDTEX0(m_type) \
+ virtual RID m_type##_create() override { \
+ RID ret = RSG::texture_storage->texture_allocate(); \
+ if (Thread::get_caller_id() == server_thread || RSG::rasterizer->can_create_resources_async()) { \
+ RSG::texture_storage->m_type##_initialize(ret); \
+ } else { \
+ command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret); \
+ } \
+ return ret; \
}
-#define FUNCRIDTEX1(m_type, m_type1) \
- virtual RID m_type##_create(m_type1 p1) override { \
- RID ret = RSG::texture_storage->texture_allocate(); \
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) { \
- RSG::texture_storage->m_type##_initialize(ret, p1); \
- } else { \
- command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret, p1); \
- } \
- return ret; \
+#define FUNCRIDTEX1(m_type, m_type1) \
+ virtual RID m_type##_create(m_type1 p1) override { \
+ RID ret = RSG::texture_storage->texture_allocate(); \
+ if (Thread::get_caller_id() == server_thread || RSG::rasterizer->can_create_resources_async()) { \
+ RSG::texture_storage->m_type##_initialize(ret, p1); \
+ } else { \
+ command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret, p1); \
+ } \
+ return ret; \
}
#define FUNCRIDTEX2(m_type, m_type1, m_type2) \
virtual RID m_type##_create(m_type1 p1, m_type2 p2) override { \
RID ret = RSG::texture_storage->texture_allocate(); \
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) { \
+ if (Thread::get_caller_id() == server_thread || RSG::rasterizer->can_create_resources_async()) { \
RSG::texture_storage->m_type##_initialize(ret, p1, p2); \
} else { \
command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret, p1, p2); \
@@ -165,7 +165,7 @@ public:
#define FUNCRIDTEX3(m_type, m_type1, m_type2, m_type3) \
virtual RID m_type##_create(m_type1 p1, m_type2 p2, m_type3 p3) override { \
RID ret = RSG::texture_storage->texture_allocate(); \
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) { \
+ if (Thread::get_caller_id() == server_thread || RSG::rasterizer->can_create_resources_async()) { \
RSG::texture_storage->m_type##_initialize(ret, p1, p2, p3); \
} else { \
command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret, p1, p2, p3); \
@@ -176,7 +176,7 @@ public:
#define FUNCRIDTEX6(m_type, m_type1, m_type2, m_type3, m_type4, m_type5, m_type6) \
virtual RID m_type##_create(m_type1 p1, m_type2 p2, m_type3 p3, m_type4 p4, m_type5 p5, m_type6 p6) override { \
RID ret = RSG::texture_storage->texture_allocate(); \
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) { \
+ if (Thread::get_caller_id() == server_thread || RSG::rasterizer->can_create_resources_async()) { \
RSG::texture_storage->m_type##_initialize(ret, p1, p2, p3, p4, p5, p6); \
} else { \
command_queue.push(RSG::texture_storage, &RendererTextureStorage::m_type##_initialize, ret, p1, p2, p3, p4, p5, p6); \
@@ -245,6 +245,26 @@ public:
FUNCRIDSPLIT(shader)
+ virtual RID shader_create_from_code(const String &p_code, const String &p_path_hint = String()) override {
+ RID shader = RSG::material_storage->shader_allocate();
+ bool using_server_thread = Thread::get_caller_id() == server_thread;
+ if (using_server_thread || RSG::rasterizer->can_create_resources_async()) {
+ if (using_server_thread) {
+ command_queue.flush_if_pending();
+ }
+
+ RSG::material_storage->shader_initialize(shader);
+ RSG::material_storage->shader_set_code(shader, p_code);
+ RSG::material_storage->shader_set_path_hint(shader, p_path_hint);
+ } else {
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::shader_initialize, shader);
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::shader_set_code, shader, p_code);
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::shader_set_path_hint, shader, p_path_hint);
+ }
+
+ return shader;
+ }
+
FUNC2(shader_set_code, RID, const String &)
FUNC2(shader_set_path_hint, RID, const String &)
FUNC1RC(String, shader_get_code, RID)
@@ -261,6 +281,28 @@ public:
FUNCRIDSPLIT(material)
+ virtual RID material_create_from_shader(RID p_next_pass, int p_render_priority, RID p_shader) override {
+ RID material = RSG::material_storage->material_allocate();
+ bool using_server_thread = Thread::get_caller_id() == server_thread;
+ if (using_server_thread || RSG::rasterizer->can_create_resources_async()) {
+ if (using_server_thread) {
+ command_queue.flush_if_pending();
+ }
+
+ RSG::material_storage->material_initialize(material);
+ RSG::material_storage->material_set_next_pass(material, p_next_pass);
+ RSG::material_storage->material_set_render_priority(material, p_render_priority);
+ RSG::material_storage->material_set_shader(material, p_shader);
+ } else {
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::material_initialize, material);
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::material_set_next_pass, material, p_next_pass);
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::material_set_render_priority, material, p_render_priority);
+ command_queue.push(RSG::material_storage, &RendererMaterialStorage::material_set_shader, material, p_shader);
+ }
+
+ return material;
+ }
+
FUNC2(material_set_shader, RID, RID)
FUNC3(material_set_param, RID, const StringName &, const Variant &)
@@ -281,10 +323,9 @@ public:
virtual RID mesh_create_from_surfaces(const Vector<SurfaceData> &p_surfaces, int p_blend_shape_count = 0) override {
RID mesh = RSG::mesh_storage->mesh_allocate();
- // TODO once we have RSG::mesh_storage, add can_create_resources_async and call here instead of texture_storage!!
-
- if (Thread::get_caller_id() == server_thread || RSG::texture_storage->can_create_resources_async()) {
- if (Thread::get_caller_id() == server_thread) {
+ bool using_server_thread = Thread::get_caller_id() == server_thread;
+ if (using_server_thread || RSG::rasterizer->can_create_resources_async()) {
+ if (using_server_thread) {
command_queue.flush_if_pending();
}
RSG::mesh_storage->mesh_initialize(mesh);
@@ -292,12 +333,14 @@ public:
for (int i = 0; i < p_surfaces.size(); i++) {
RSG::mesh_storage->mesh_add_surface(mesh, p_surfaces[i]);
}
+ RSG::scene->mesh_generate_pipelines(mesh, using_server_thread);
} else {
command_queue.push(RSG::mesh_storage, &RendererMeshStorage::mesh_initialize, mesh);
command_queue.push(RSG::mesh_storage, &RendererMeshStorage::mesh_set_blend_shape_count, mesh, p_blend_shape_count);
for (int i = 0; i < p_surfaces.size(); i++) {
command_queue.push(RSG::mesh_storage, &RendererMeshStorage::mesh_add_surface, mesh, p_surfaces[i]);
}
+ command_queue.push(RSG::scene, &RenderingMethod::mesh_generate_pipelines, mesh, true);
}
return mesh;