Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/eevee_next')
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_instance.cc17
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_instance.hh1
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_material.cc5
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_sync.cc14
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_sync.hh10
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_world.cc3
6 files changed, 50 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc
index 8005b27c30e..a0bdf70e254 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc
@@ -106,6 +106,8 @@ void Instance::begin_sync()
gpencil_engine_enabled = false;
+ scene_sync();
+
depth_of_field.sync();
motion_blur.sync();
hiz_buffer.sync();
@@ -115,6 +117,21 @@ void Instance::begin_sync()
film.sync();
}
+void Instance::scene_sync()
+{
+ SceneHandle &sc_handle = sync.sync_scene(scene);
+
+ sc_handle.reset_recalc_flag();
+
+ /* This refers specifically to the Scene camera that can be accessed
+ * via View Layer Attribute nodes, rather than the actual render camera. */
+ if (scene->camera != nullptr) {
+ ObjectHandle &ob_handle = sync.sync_object(scene->camera);
+
+ ob_handle.reset_recalc_flag();
+ }
+}
+
void Instance::object_sync(Object *ob)
{
const bool is_renderable_type = ELEM(ob->type, OB_CURVES, OB_GPENCIL, OB_MESH, OB_LAMP);
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.hh b/source/blender/draw/engines/eevee_next/eevee_instance.hh
index c8eecbd812d..bc610cd0642 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.hh
@@ -162,6 +162,7 @@ class Instance {
void render_sample();
void render_read_result(RenderLayer *render_layer, const char *view_name);
+ void scene_sync();
void mesh_sync(Object *ob, ObjectHandle &ob_handle);
void update_eval_members();
diff --git a/source/blender/draw/engines/eevee_next/eevee_material.cc b/source/blender/draw/engines/eevee_next/eevee_material.cc
index b63002df2e3..d190a1f17a3 100644
--- a/source/blender/draw/engines/eevee_next/eevee_material.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_material.cc
@@ -187,6 +187,8 @@ MaterialPass MaterialModule::material_pass_get(Object *ob,
/* Returned material should be ready to be drawn. */
BLI_assert(GPU_material_status(matpass.gpumat) == GPU_MAT_SUCCESS);
+ inst_.manager->register_layer_attributes(matpass.gpumat);
+
if (GPU_material_recalc_flag_get(matpass.gpumat)) {
inst_.sampling.reset();
}
@@ -217,6 +219,9 @@ MaterialPass MaterialModule::material_pass_get(Object *ob,
matpass.sub_pass = &shader_sub->sub(GPU_material_get_name(matpass.gpumat));
matpass.sub_pass->material_set(*inst_.manager, matpass.gpumat);
}
+ else {
+ matpass.sub_pass = nullptr;
+ }
}
return matpass;
diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc
index f2daba48d7a..08cda6f47cf 100644
--- a/source/blender/draw/engines/eevee_next/eevee_sync.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc
@@ -68,6 +68,20 @@ WorldHandle &SyncModule::sync_world(::World *world)
return eevee_dd;
}
+SceneHandle &SyncModule::sync_scene(::Scene *scene)
+{
+ DrawEngineType *owner = (DrawEngineType *)&DRW_engine_viewport_eevee_next_type;
+ struct DrawData *dd = DRW_drawdata_ensure(
+ (ID *)scene, owner, sizeof(eevee::SceneHandle), draw_data_init_cb, nullptr);
+ SceneHandle &eevee_dd = *reinterpret_cast<SceneHandle *>(dd);
+
+ const int recalc_flags = ID_RECALC_ALL;
+ if ((eevee_dd.recalc & recalc_flags) != 0) {
+ inst_.sampling.reset();
+ }
+ return eevee_dd;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.hh b/source/blender/draw/engines/eevee_next/eevee_sync.hh
index ab883ce44c2..eda0342c4b6 100644
--- a/source/blender/draw/engines/eevee_next/eevee_sync.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_sync.hh
@@ -139,6 +139,15 @@ struct WorldHandle : public DrawData {
}
};
+struct SceneHandle : public DrawData {
+ void reset_recalc_flag()
+ {
+ if (recalc != 0) {
+ recalc = 0;
+ }
+ }
+};
+
class SyncModule {
private:
Instance &inst_;
@@ -149,6 +158,7 @@ class SyncModule {
ObjectHandle &sync_object(Object *ob);
WorldHandle &sync_world(::World *world);
+ SceneHandle &sync_scene(::Scene *scene);
void sync_mesh(Object *ob,
ObjectHandle &ob_handle,
diff --git a/source/blender/draw/engines/eevee_next/eevee_world.cc b/source/blender/draw/engines/eevee_next/eevee_world.cc
index 313c0bda42e..37f90570028 100644
--- a/source/blender/draw/engines/eevee_next/eevee_world.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_world.cc
@@ -87,6 +87,9 @@ void World::sync()
default_tree.nodetree_get(bl_world);
GPUMaterial *gpumat = inst_.shaders.world_shader_get(bl_world, ntree);
+
+ inst_.manager->register_layer_attributes(gpumat);
+
inst_.pipelines.world.sync(gpumat);
}