[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39770] branches/cycles/intern/cycles: Cycles: preview passes setting to set the max number of passes to render in
Brecht Van Lommel
brechtvanlommel at pandora.be
Mon Aug 29 12:21:11 CEST 2011
Revision: 39770
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39770
Author: blendix
Date: 2011-08-29 10:21:10 +0000 (Mon, 29 Aug 2011)
Log Message:
-----------
Cycles: preview passes setting to set the max number of passes to render in
the viewport working now, set to 0 for unlimited (well, actually 2147483647).
Modified Paths:
--------------
branches/cycles/intern/cycles/blender/addon/ui.py
branches/cycles/intern/cycles/render/session.cpp
branches/cycles/intern/cycles/render/session.h
Added Paths:
-----------
branches/cycles/intern/cycles/kernel/osl/nodes/node_holdout.osl
Modified: branches/cycles/intern/cycles/blender/addon/ui.py
===================================================================
--- branches/cycles/intern/cycles/blender/addon/ui.py 2011-08-29 06:28:09 UTC (rev 39769)
+++ branches/cycles/intern/cycles/blender/addon/ui.py 2011-08-29 10:21:10 UTC (rev 39770)
@@ -43,16 +43,15 @@
split = layout.split()
col = split.column()
- col.prop(cscene, "passes", text="Render Passes")
- #sub = col.row()
- #sub.active = cscene.preview_passes >= 1
- #sub.prop(cscene, "preview_passes")
+ sub = col.column(align=True)
+ sub.prop(cscene, "passes", text="Render Passes")
+ sub.prop(cscene, "preview_passes")
col.prop(cscene, "no_caustics")
col = split.column()
- col = col.column(align=True)
- col.prop(cscene, "max_bounces")
- col.prop(cscene, "min_bounces")
+ sub = col.column(align=True)
+ sub.prop(cscene, "max_bounces")
+ sub.prop(cscene, "min_bounces")
#row = col.row()
#row.prop(cscene, "blur_caustics")
@@ -74,9 +73,10 @@
col.prop(cscene, "transparent")
col = split.column()
- col.prop(cscene, "filter_type", text="")
+ sub = col.column(align=True)
+ sub.prop(cscene, "filter_type", text="")
if cscene.filter_type != 'BOX':
- col.prop(cscene, "filter_width", text="Width")
+ sub.prop(cscene, "filter_width", text="Width")
class CyclesRender_PT_performance(CyclesButtonsPanel, bpy.types.Panel):
bl_label = "Performance"
Copied: branches/cycles/intern/cycles/kernel/osl/nodes/node_holdout.osl (from rev 39737, branches/cycles/intern/cycles/kernel/osl/nodes/node_background.osl)
===================================================================
--- branches/cycles/intern/cycles/kernel/osl/nodes/node_holdout.osl (rev 0)
+++ branches/cycles/intern/cycles/kernel/osl/nodes/node_holdout.osl 2011-08-29 10:21:10 UTC (rev 39770)
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_background(
+ color Color = color(0.8, 0.8, 0.8),
+ float Strength = 1.0,
+ output closure color Background = background())
+{
+ Background = Color*Strength*background();
+}
+
Modified: branches/cycles/intern/cycles/render/session.cpp
===================================================================
--- branches/cycles/intern/cycles/render/session.cpp 2011-08-29 06:28:09 UTC (rev 39769)
+++ branches/cycles/intern/cycles/render/session.cpp 2011-08-29 10:21:10 UTC (rev 39770)
@@ -57,6 +57,7 @@
display_outdated = false;
gpu_draw_ready = false;
gpu_need_tonemap = false;
+ pause = false;
}
Session::~Session()
@@ -65,6 +66,7 @@
progress.set_cancel("Exiting");
gpu_need_tonemap = false;
gpu_need_tonemap_cond.notify_all();
+ set_pause(false);
wait();
}
@@ -111,6 +113,8 @@
gpu_need_tonemap = false;
gpu_need_tonemap_cond.notify_all();
+
+ pause_cond.notify_all();
}
bool Session::draw_gpu(int w, int h)
@@ -150,52 +154,72 @@
reset_time = time_dt();
while(!progress.get_cancel()) {
+ /* advance to next tile */
bool done = !tile_manager.next();
- if(done && params.background)
- break;
+ /* any work left? */
+ if(done) {
+ /* if in background mode, we can stop immediately */
+ if(params.background) {
+ break;
+ }
+ else {
+ /* in interactive mode, we wait until woken up */
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause_cond.wait(pause_lock);
+ }
+ }
+ else {
+ /* test for pause and wait until woken up */
+ thread_scoped_lock pause_lock(pause_mutex);
+ while(pause)
+ pause_cond.wait(pause_lock);
+ }
- /* todo: wait when done in interactive mode */
+ {
+ /* buffers mutex is locked entirely while rendering each
+ pass, and released/reacquired on each iteration to allow
+ reset and draw in between */
+ thread_scoped_lock buffers_lock(buffers->mutex);
- /* buffers mutex is locked entirely while rendering each
- pass, and released/reacquired on each iteration to allow
- reset and draw in between */
- thread_scoped_lock buffers_lock(buffers->mutex);
+ /* update scene */
+ update_scene();
+ if(progress.get_cancel())
+ break;
- /* update scene */
- update_scene();
- if(progress.get_cancel())
- break;
+ /* update status and timing */
+ update_status_time();
- /* update status and timing */
- update_status_time();
+ /* path trace */
+ foreach(Tile& tile, tile_manager.state.tiles) {
+ path_trace(tile);
- /* path trace */
- foreach(Tile& tile, tile_manager.state.tiles) {
- path_trace(tile);
+ device->task_wait();
- device->task_wait();
+ if(progress.get_cancel())
+ break;
+ }
- if(progress.get_cancel())
- break;
- }
+ /* update status and timing */
+ update_status_time();
- gpu_need_tonemap = true;
- gpu_draw_ready = true;
- progress.set_update();
+ gpu_need_tonemap = true;
+ gpu_draw_ready = true;
+ progress.set_update();
- /* wait for tonemap */
- if(!params.background) {
- while(gpu_need_tonemap) {
- if(progress.get_cancel())
- break;
+ /* wait for tonemap */
+ if(!params.background) {
+ while(gpu_need_tonemap) {
+ if(progress.get_cancel())
+ break;
- gpu_need_tonemap_cond.wait(buffers_lock);
+ gpu_need_tonemap_cond.wait(buffers_lock);
+ }
}
+
+ if(progress.get_cancel())
+ break;
}
-
- if(progress.get_cancel())
- break;
}
}
@@ -213,6 +237,8 @@
delayed_reset.passes = passes;
delayed_reset.do_reset = true;
device->task_cancel();
+
+ pause_cond.notify_all();
}
bool Session::draw_cpu(int w, int h)
@@ -249,14 +275,33 @@
}
while(!progress.get_cancel()) {
+ /* advance to next tile */
bool done = !tile_manager.next();
+ bool need_tonemap = false;
- if(done && params.background)
- break;
+ /* any work left? */
+ if(done) {
+ /* if in background mode, we can stop immediately */
+ if(params.background) {
+ break;
+ }
+ else {
+ /* in interactive mode, we wait until woken up */
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause_cond.wait(pause_lock);
+ }
+ }
+ else {
+ /* test for pause and wait until woken up */
+ thread_scoped_lock pause_lock(pause_mutex);
+ while(pause)
+ pause_cond.wait(pause_lock);
+ }
- /* todo: wait when done in interactive mode */
-
- {
+ if(!done) {
+ /* buffers mutex is locked entirely while rendering each
+ pass, and released/reacquired on each iteration to allow
+ reset and draw in between */
thread_scoped_lock buffers_lock(buffers->mutex);
/* update scene */
@@ -267,9 +312,14 @@
/* update status and timing */
update_status_time();
- /* path trace all tiles */
+ /* path trace */
foreach(Tile& tile, tile_manager.state.tiles)
path_trace(tile);
+
+ /* update status and timing */
+ update_status_time();
+
+ need_tonemap = true;
}
device->task_wait();
@@ -284,7 +334,7 @@
delayed_reset.do_reset = false;
reset_(delayed_reset.w, delayed_reset.h, delayed_reset.passes);
}
- else {
+ else if(need_tonemap) {
/* tonemap only if we do not reset, we don't we don't
want to show the result of an incomplete pass*/
tonemap();
@@ -357,10 +407,21 @@
if(passes != params.passes) {
params.passes = passes;
tile_manager.set_passes(passes);
- /* todo: awake in paused loop */
+
+ pause_cond.notify_all();
}
}
+void Session::set_pause(bool pause_)
+{
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause = pause_;
+ }
+
+ pause_cond.notify_all();
+}
+
void Session::wait()
{
session_thread->join();
Modified: branches/cycles/intern/cycles/render/session.h
===================================================================
--- branches/cycles/intern/cycles/render/session.h 2011-08-29 06:28:09 UTC (rev 39769)
+++ branches/cycles/intern/cycles/render/session.h 2011-08-29 10:21:10 UTC (rev 39770)
@@ -109,6 +109,7 @@
bool ready_to_reset();
void reset(int w, int h, int passes);
void set_passes(int passes);
+ void set_pause(bool pause);
protected:
struct DelayedReset {
@@ -146,6 +147,10 @@
volatile bool gpu_need_tonemap;
thread_condition_variable gpu_need_tonemap_cond;
+ bool pause;
+ thread_condition_variable pause_cond;
+ thread_mutex pause_mutex;
+
double start_time;
double reset_time;
double preview_time;
More information about the Bf-blender-cvs
mailing list