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:
authorBrecht Van Lommel <brecht@blender.org>2020-11-12 22:19:30 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-11-12 22:30:14 +0300
commitb6988de22a9c1b78fe4f5ddedfd4467db1d8e209 (patch)
tree1afe1f40db2decd3c2c60b3852ff1776369fb46c
parenta6c1c0427c947673b5e05d584bd82285a630336c (diff)
parentd59fa12f2ad5c57c68d63e476270fcd274b61062 (diff)
Merge branch 'blender-v2.91-release'
-rw-r--r--intern/cycles/blender/blender_session.cpp2
-rw-r--r--intern/cycles/blender/blender_volume.cpp25
-rw-r--r--intern/cycles/render/geometry.cpp39
-rw-r--r--intern/cycles/render/session.cpp35
-rw-r--r--intern/cycles/render/session.h1
-rw-r--r--intern/cycles/render/volume.cpp65
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py6
7 files changed, 95 insertions, 78 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 770f4ca51c9..8566d0e7ed5 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -260,6 +260,8 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
void BlenderSession::free_session()
{
+ session->cancel();
+
delete sync;
delete session;
}
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index 1843fecd586..094d4bbc08c 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -242,13 +242,6 @@ class BlenderVolumeLoader : public VDBImageLoader {
#endif
}
- bool equals(const ImageLoader &other) const override
- {
- /* TODO: detect multiple volume datablocks with the same filepath. */
- const BlenderVolumeLoader &other_loader = (const BlenderVolumeLoader &)other;
- return b_volume == other_loader.b_volume && grid_name == other_loader.grid_name;
- }
-
BL::Volume b_volume;
};
@@ -307,23 +300,8 @@ static void sync_volume_object(BL::BlendData &b_data,
}
}
-/* If the voxel attributes change, we need to rebuild the bounding mesh. */
-static vector<int> get_voxel_image_slots(Mesh *mesh)
-{
- vector<int> slots;
- for (const Attribute &attr : mesh->attributes.attributes) {
- if (attr.element == ATTR_ELEMENT_VOXEL) {
- slots.push_back(attr.data_voxel().svm_slot());
- }
- }
-
- return slots;
-}
-
void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume)
{
- vector<int> old_voxel_slots = get_voxel_image_slots(volume);
-
volume->clear(true);
if (view_layer.use_volumes) {
@@ -339,8 +317,7 @@ void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume)
}
/* Tag update. */
- bool rebuild = (old_voxel_slots != get_voxel_image_slots(volume));
- volume->tag_update(scene, rebuild);
+ volume->tag_update(scene, true);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index a63fc620c69..12f4eaf0b79 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -1410,12 +1410,17 @@ void GeometryManager::device_update(Device *device,
true_displacement_used = true;
}
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
}
}
+ if (progress.get_cancel()) {
+ return;
+ }
+
/* Tessellate meshes that are using subdivision */
if (total_tess_needed) {
scoped_callback_timer timer([scene](double time) {
@@ -1453,10 +1458,15 @@ void GeometryManager::device_update(Device *device,
i++;
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
}
+
+ if (progress.get_cancel()) {
+ return;
+ }
}
/* Update images needed for true displacement. */
@@ -1486,8 +1496,9 @@ void GeometryManager::device_update(Device *device,
});
device_update_mesh(device, dscene, scene, true, progress);
}
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
{
scoped_callback_timer timer([scene](double time) {
@@ -1496,8 +1507,9 @@ void GeometryManager::device_update(Device *device,
}
});
device_update_attributes(device, dscene, scene, progress);
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
/* Update displacement. */
@@ -1527,11 +1539,16 @@ void GeometryManager::device_update(Device *device,
}
}
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
}
+ if (progress.get_cancel()) {
+ return;
+ }
+
/* Device re-update after displacement. */
if (displacement_done) {
scoped_callback_timer timer([scene](double time) {
@@ -1543,8 +1560,9 @@ void GeometryManager::device_update(Device *device,
device_free(device, dscene);
device_update_attributes(device, dscene, scene, progress);
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
{
@@ -1591,8 +1609,9 @@ void GeometryManager::device_update(Device *device,
}
}
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
{
scoped_callback_timer timer([scene](double time) {
@@ -1601,8 +1620,9 @@ void GeometryManager::device_update(Device *device,
}
});
device_update_bvh(device, dscene, scene, progress);
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
{
@@ -1613,8 +1633,9 @@ void GeometryManager::device_update(Device *device,
}
});
device_update_mesh(device, dscene, scene, false, progress);
- if (progress.get_cancel())
+ if (progress.get_cancel()) {
return;
+ }
}
need_update = false;
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index a60542259f6..524a0e3b9d4 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -98,21 +98,7 @@ Session::Session(const SessionParams &params_)
Session::~Session()
{
- if (session_thread) {
- /* wait for session thread to end */
- progress.set_cancel("Exiting");
-
- gpu_need_display_buffer_update = false;
- gpu_need_display_buffer_update_cond.notify_all();
-
- {
- thread_scoped_lock pause_lock(pause_mutex);
- pause = false;
- }
- pause_cond.notify_all();
-
- wait();
- }
+ cancel();
if (buffers && params.write_render_cb) {
/* Copy to display buffer and write out image if requested */
@@ -146,6 +132,25 @@ void Session::start()
}
}
+void Session::cancel()
+{
+ if (session_thread) {
+ /* wait for session thread to end */
+ progress.set_cancel("Exiting");
+
+ gpu_need_display_buffer_update = false;
+ gpu_need_display_buffer_update_cond.notify_all();
+
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause = false;
+ }
+ pause_cond.notify_all();
+
+ wait();
+ }
+}
+
bool Session::ready_to_reset()
{
double dt = time_dt() - reset_time;
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 770d3124db7..ab6c0b5f124 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -146,6 +146,7 @@ class Session {
~Session();
void start();
+ void cancel();
bool draw(BufferParams &params, DeviceDrawParams &draw_params);
void wait();
diff --git a/intern/cycles/render/volume.cpp b/intern/cycles/render/volume.cpp
index 63261d6a247..64196cdd8a8 100644
--- a/intern/cycles/render/volume.cpp
+++ b/intern/cycles/render/volume.cpp
@@ -491,6 +491,39 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
string msg = string_printf("Computing Volume Mesh %s", volume->name.c_str());
progress.set_status("Updating Mesh", msg);
+ /* Find shader and compute padding based on volume shader interpolation settings. */
+ Shader *volume_shader = NULL;
+ int pad_size = 0;
+
+ foreach (Node *node, volume->get_used_shaders()) {
+ Shader *shader = static_cast<Shader *>(node);
+
+ if (!shader->has_volume) {
+ continue;
+ }
+
+ volume_shader = shader;
+
+ if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_LINEAR) {
+ pad_size = max(1, pad_size);
+ }
+ else if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_CUBIC) {
+ pad_size = max(2, pad_size);
+ }
+
+ break;
+ }
+
+ /* Clear existing volume mesh, done here in case we early out due to
+ * empty grid or missing volume shader. */
+ volume->clear();
+ volume->need_update_rebuild = true;
+
+ if (!volume_shader) {
+ return;
+ }
+
+ /* Create volume mesh builder. */
VolumeMeshBuilder builder;
#ifdef WITH_OPENVDB
@@ -537,37 +570,11 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
}
#endif
+ /* If nothing to build, early out. */
if (builder.empty_grid()) {
return;
}
- /* Compute padding. */
- Shader *volume_shader = NULL;
- int pad_size = 0;
-
- foreach (Node *node, volume->get_used_shaders()) {
- Shader *shader = static_cast<Shader *>(node);
-
- if (!shader->has_volume) {
- continue;
- }
-
- volume_shader = shader;
-
- if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_LINEAR) {
- pad_size = max(1, pad_size);
- }
- else if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_CUBIC) {
- pad_size = max(2, pad_size);
- }
-
- break;
- }
-
- if (!volume_shader) {
- return;
- }
-
builder.add_padding(pad_size);
/* Slightly offset vertex coordinates to avoid overlapping faces with other
@@ -583,11 +590,9 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
vector<float3> face_normals;
builder.create_mesh(vertices, indices, face_normals, face_overlap_avoidance);
- volume->clear();
volume->reserve_mesh(vertices.size(), indices.size() / 3);
+ volume->used_shaders.clear();
volume->used_shaders.push_back_slow(volume_shader);
- volume->tag_modified();
- volume->need_update_rebuild = true;
for (size_t i = 0; i < vertices.size(); ++i) {
volume->add_vertex(vertices[i]);
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index ce9543d7dc4..56a9491a5e7 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -576,6 +576,12 @@ class USERPREF_PT_system_sound(SystemPanel, CenterAlignMixIn, Panel):
class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
bl_label = "Cycles Render Devices"
+ @classmethod
+ def poll(cls, context):
+ # No GPU rendering on macOS currently.
+ import sys
+ return bpy.app.build_options.cycles and sys.platform != "darwin"
+
def draw_centered(self, context, layout):
prefs = context.preferences