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 'intern/cycles/render')
-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
4 files changed, 86 insertions, 54 deletions
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]);