summaryrefslogtreecommitdiffstats
path: root/modules/lightmapper_rd/lightmapper_rd.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-02-12 23:29:32 +0100
committerRémi Verschelde <rverschelde@gmail.com>2024-02-12 23:29:32 +0100
commit3be3d5099cc75a2db544b3a0964a430c3eb00909 (patch)
treec9741446ca06cfddf7a0861749565d0932ce243a /modules/lightmapper_rd/lightmapper_rd.cpp
parentc66f87daa796f4ddea70156f5fec582db6c525f6 (diff)
parent73eff10c76c201a083193c044de1836217b4d72b (diff)
downloadredot-engine-3be3d5099cc75a2db544b3a0964a430c3eb00909.tar.gz
Merge pull request #87340 from DarioSamo/rd_common_context
Finish splitting functionality of the `RenderingDevice` backends into `RenderingDeviceDriver`.
Diffstat (limited to 'modules/lightmapper_rd/lightmapper_rd.cpp')
-rw-r--r--modules/lightmapper_rd/lightmapper_rd.cpp54
1 files changed, 52 insertions, 2 deletions
diff --git a/modules/lightmapper_rd/lightmapper_rd.cpp b/modules/lightmapper_rd/lightmapper_rd.cpp
index 9ee281ad99..5d22cb1301 100644
--- a/modules/lightmapper_rd/lightmapper_rd.cpp
+++ b/modules/lightmapper_rd/lightmapper_rd.cpp
@@ -41,6 +41,10 @@
#include "editor/editor_settings.h"
#include "servers/rendering/rendering_device_binds.h"
+#if defined(VULKAN_ENABLED)
+#include "drivers/vulkan/rendering_context_driver_vulkan.h"
+#endif
+
//uncomment this if you want to see textures from all the process saved
//#define DEBUG_TEXTURES
@@ -1017,7 +1021,35 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
}
#endif
- RenderingDevice *rd = RenderingDevice::get_singleton()->create_local_device();
+ // Attempt to create a local device by requesting it from rendering server first.
+ // If that fails because the current renderer is not implemented on top of RD, we fall back to creating
+ // a local rendering device manually depending on the current platform.
+ Error err;
+ RenderingContextDriver *rcd = nullptr;
+ RenderingDevice *rd = RenderingServer::get_singleton()->create_local_rendering_device();
+ if (rd == nullptr) {
+#if defined(RD_ENABLED)
+#if defined(VULKAN_ENABLED)
+ rcd = memnew(RenderingContextDriverVulkan);
+ rd = memnew(RenderingDevice);
+#endif
+#endif
+ if (rcd != nullptr && rd != nullptr) {
+ err = rcd->initialize();
+ if (err == OK) {
+ err = rd->initialize(rcd);
+ }
+
+ if (err != OK) {
+ memdelete(rd);
+ memdelete(rcd);
+ rd = nullptr;
+ rcd = nullptr;
+ }
+ }
+ }
+
+ ERR_FAIL_NULL_V(rd, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES);
RID albedo_array_tex;
RID emission_array_tex;
@@ -1187,7 +1219,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
//shaders
Ref<RDShaderFile> raster_shader;
raster_shader.instantiate();
- Error err = raster_shader->parse_versions_from_text(lm_raster_shader_glsl);
+ err = raster_shader->parse_versions_from_text(lm_raster_shader_glsl);
if (err != OK) {
raster_shader->print_errors("raster_shader");
@@ -1195,6 +1227,10 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
FREE_BUFFERS
memdelete(rd);
+
+ if (rcd != nullptr) {
+ memdelete(rcd);
+ }
}
ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES);
@@ -1367,6 +1403,11 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
FREE_BUFFERS
FREE_RASTER_RESOURCES
memdelete(rd);
+
+ if (rcd != nullptr) {
+ memdelete(rcd);
+ }
+
compute_shader->print_errors("compute_shader");
}
ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES);
@@ -1789,6 +1830,11 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
FREE_RASTER_RESOURCES
FREE_COMPUTE_RESOURCES
memdelete(rd);
+
+ if (rcd != nullptr) {
+ memdelete(rcd);
+ }
+
blendseams_shader->print_errors("blendseams_shader");
}
ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES);
@@ -1964,6 +2010,10 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d
memdelete(rd);
+ if (rcd != nullptr) {
+ memdelete(rcd);
+ }
+
return BAKE_OK;
}