Revision: 49150
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49150
Author:   nazgul
Date:     2012-07-23 18:45:29 +0000 (Mon, 23 Jul 2012)
Log Message:
-----------
Tomato Cycles: update buffers on every sample finished

Was requested by Mango team to improve feedback during rendering.

Known issues:
- Updating of samples are accumulative, meaning that visually samples
  would be dark in the beginning becoming brighter during progress.
- Could give some % of slowdown, so probably should be disabled in
  background mode.

Still to come: update of samples when using CUDA and OpenCL.

Modified Paths:
--------------
    branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp
    branches/soc-2011-tomato/intern/cycles/device/device_task.h
    branches/soc-2011-tomato/intern/cycles/render/session.cpp
    branches/soc-2011-tomato/intern/cycles/render/session.h

Modified: branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp        
2012-07-23 18:28:00 UTC (rev 49149)
+++ branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp        
2012-07-23 18:45:29 UTC (rev 49150)
@@ -153,38 +153,43 @@
 
 #ifdef WITH_OPTIMIZED_KERNEL
                        if(system_cpu_support_optimized()) {
-                               for(int y = tile.y; y < tile.y + tile.h; y++) {
-                                       for(int x = tile.x; x < tile.x + 
tile.w; x++)
-                                               for(int sample = start_sample; 
sample < end_sample; sample++) {
-                                                       if (task.get_cancel()) {
+                               for(int sample = start_sample; sample < 
end_sample; sample++) {
+                                       for(int y = tile.y; y < tile.y + 
tile.h; y++) {
+                                               for(int x = tile.x; x < tile.x 
+ tile.w; x++) {
+                                                       if (task.get_cancel())
                                                                break;
-                                                       }
 
+                                                       
if(task_pool.cancelled())
+                                                               break;
+
                                                        
kernel_cpu_optimized_path_trace(kg, render_buffer, rng_state,
                                                                sample, x, y, 
tile.offset, tile.stride);
                                                }
+                                       }
 
-                                       if(task_pool.cancelled())
-                                               break;
+                                       task.update_tile_sample(tile);
                                }
                        }
                        else
 #endif
                        {
-                               for(int y = tile.y; y < tile.y + tile.h; y++) {
-                                       for(int x = tile.x; x < tile.x + 
tile.w; x++)
-                                               for(int sample = start_sample; 
sample < end_sample; sample++) {
+                               for(int sample = start_sample; sample < 
end_sample; sample++) {
+                                       for(int y = tile.y; y < tile.y + 
tile.h; y++) {
+                                               for(int x = tile.x; x < tile.x 
+ tile.w; x++) {
                                                        if (task.get_cancel()) {
                                                                break;
                                                        }
 
+                                                       
if(task_pool.cancelled())
+                                                               break;
+
                                                        
kernel_cpu_path_trace(kg, render_buffer, rng_state,
                                                                sample, x, y, 
tile.offset, tile.stride);
 
                                                }
+                                       }
 
-                                       if(task_pool.cancelled())
-                                               break;
+                                       task.update_tile_sample(tile);
                                }
                        }
 

Modified: branches/soc-2011-tomato/intern/cycles/device/device_task.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_task.h 2012-07-23 
18:28:00 UTC (rev 49149)
+++ branches/soc-2011-tomato/intern/cycles/device/device_task.h 2012-07-23 
18:45:29 UTC (rev 49150)
@@ -58,6 +58,7 @@
        void split_max_size(list<DeviceTask>& tasks, int max_size);
 
        boost::function<bool(Device *device, RenderTile&)> acquire_tile;
+       boost::function<void(RenderTile&)> update_tile_sample;
        boost::function<void(RenderTile&)> release_tile;
        boost::function<bool(void)> get_cancel;
 };

Modified: branches/soc-2011-tomato/intern/cycles/render/session.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/session.cpp   2012-07-23 
18:28:00 UTC (rev 49149)
+++ branches/soc-2011-tomato/intern/cycles/render/session.cpp   2012-07-23 
18:45:29 UTC (rev 49150)
@@ -373,12 +373,27 @@
        return true;
 }
 
+void Session::update_tile_sample(RenderTile& rtile)
+{
+       thread_scoped_lock tile_lock(tile_mutex);
+
+       if(write_render_buffers_cb) {
+               /* todo: optimize this by making it thread safe and removing 
lock */
+
+               if(!progress.get_cancel())
+                       write_render_buffers_cb(rtile.buffers);
+       }
+
+       update_status_time();
+}
+
 void Session::release_tile(RenderTile& rtile)
 {
        thread_scoped_lock tile_lock(tile_mutex);
 
        if(write_render_buffers_cb) {
                /* todo: optimize this by making it thread safe and removing 
lock */
+               /* todo: this could be removed as soon as all devices would use 
update_tile_sample */
                if(!progress.get_cancel())
                        write_render_buffers_cb(rtile.buffers);
                delete rtile.buffers;
@@ -679,6 +694,7 @@
        task.acquire_tile = function_bind(&Session::acquire_tile, this, _1, _2);
        task.release_tile = function_bind(&Session::release_tile, this, _1);
        task.get_cancel = function_bind(&Progress::get_cancel, &this->progress);
+       task.update_tile_sample = function_bind(&Session::update_tile_sample, 
this, _1);
 
        device->task_add(task);
 }

Modified: branches/soc-2011-tomato/intern/cycles/render/session.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/session.h     2012-07-23 
18:28:00 UTC (rev 49149)
+++ branches/soc-2011-tomato/intern/cycles/render/session.h     2012-07-23 
18:45:29 UTC (rev 49150)
@@ -145,6 +145,7 @@
        void reset_gpu(BufferParams& params, int samples);
 
        bool acquire_tile(Device *tile_device, RenderTile& tile);
+       void update_tile_sample(RenderTile& tile);
        void release_tile(RenderTile& tile);
 
        bool device_use_gl;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to