Commit: b65836195418f2f9b4d744c45a387cb19bc4447c
Author: Lukas Stockner
Date:   Mon May 23 20:16:52 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBb65836195418f2f9b4d744c45a387cb19bc4447c

Cycles Denoising: Change PATH_TRACE task to more flexible RENDER task

This commit renames the PATH_TRACE task to RENDER and adds subtypes to the 
RenderTile, for now
PATH_TRACE and DENOISE. The reason for doing this instead of simply adding a 
new DENOISE
task is that it 1. allows to reuse the acquire_tile system etc. and 2. allows 
to denoise tiles
while others are still rendering (if DENOISE was an own task, it would have to 
wait until PATH_TRACE
was running out of tiles).
The task isn't used yet, that's for the upcoming commits.

===================================================================

M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_cuda.cpp
M       intern/cycles/device/device_opencl.cpp
M       intern/cycles/device/device_task.cpp
M       intern/cycles/device/device_task.h
M       intern/cycles/render/buffers.h
M       intern/cycles/render/session.cpp
M       intern/cycles/render/session.h

===================================================================

diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 676b1279..512f8b2 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -189,8 +189,8 @@ public:
 
        void thread_run(DeviceTask *task)
        {
-               if(task->type == DeviceTask::PATH_TRACE)
-                       thread_path_trace(*task);
+               if(task->type == DeviceTask::RENDER)
+                       thread_render(*task);
                else if(task->type == DeviceTask::FILM_CONVERT)
                        thread_film_convert(*task);
                else if(task->type == DeviceTask::SHADER)
@@ -206,7 +206,7 @@ public:
                }
        };
 
-       void thread_path_trace(DeviceTask& task)
+       void thread_render(DeviceTask& task)
        {
                if(task_pool.canceled()) {
                        if(task.need_finish_queue == false)
@@ -259,26 +259,41 @@ public:
                
                while(task.acquire_tile(this, tile)) {
                        float *render_buffer = (float*)tile.buffer;
-                       uint *rng_state = (uint*)tile.rng_state;
-                       int start_sample = tile.start_sample;
-                       int end_sample = tile.start_sample + tile.num_samples;
-
-                       for(int sample = start_sample; sample < end_sample; 
sample++) {
-                               if(task.get_cancel() || task_pool.canceled()) {
-                                       if(task.need_finish_queue == false)
-                                               break;
-                               }
 
+                       if(tile.task == RenderTile::PATH_TRACE) {
+                               uint *rng_state = (uint*)tile.rng_state;
+                               int start_sample = tile.start_sample;
+                               int end_sample = tile.start_sample + 
tile.num_samples;
+
+                               for(int sample = start_sample; sample < 
end_sample; sample++) {
+                                       if(task.get_cancel() || 
task_pool.canceled()) {
+                                               if(task.need_finish_queue == 
false)
+                                                       break;
+                                       }
+
+                                       for(int y = tile.y; y < tile.y + 
tile.h; y++) {
+                                               for(int x = tile.x; x < tile.x 
+ tile.w; x++) {
+                                                       path_trace_kernel(&kg, 
render_buffer, rng_state,
+                                                                         
sample, x, y, tile.offset, tile.stride);
+                                               }
+                                       }
+
+                                       tile.sample = sample + 1;
+
+                                       task.update_progress(&tile);
+                               }
+                       }
+                       else if(tile.task == RenderTile::DENOISE) {
+                               printf("TODO: Implement Denoising kernel, was 
called for tile at (%d, %d) with size %dx%d!\n", tile.x, tile.y, tile.w, 
tile.h);
+                               /* Small brightness increase to have visual 
feedback in the UI which parts have been "denoised" already, will of course be 
removed once proper denoising works. */
                                for(int y = tile.y; y < tile.y + tile.h; y++) {
                                        for(int x = tile.x; x < tile.x + 
tile.w; x++) {
-                                               path_trace_kernel(&kg, 
render_buffer, rng_state,
-                                                                 sample, x, y, 
tile.offset, tile.stride);
+                                               float4 *pix = (float4*) 
(render_buffer + (tile.offset + y*tile.stride + x)*kg.__data.film.pass_stride);
+                                               pix->x *= 2;
+                                               pix->y *= 2;
+                                               pix->z *= 2;
                                        }
                                }
-
-                               tile.sample = sample + 1;
-
-                               task.update_progress(&tile);
                        }
 
                        task.release_tile(tile);
diff --git a/intern/cycles/device/device_cuda.cpp 
b/intern/cycles/device/device_cuda.cpp
index 12c62c0..968c4ed 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1107,27 +1107,32 @@ public:
 
        void thread_run(DeviceTask *task)
        {
-               if(task->type == DeviceTask::PATH_TRACE) {
+               if(task->type == DeviceTask::RENDER) {
                        RenderTile tile;
                        
                        bool branched = task->integrator_branched;
                        
                        /* keep rendering tiles until done */
                        while(task->acquire_tile(this, tile)) {
-                               int start_sample = tile.start_sample;
-                               int end_sample = tile.start_sample + 
tile.num_samples;
+                               if(tile.task == RenderTile::PATH_TRACE) {
+                                       int start_sample = tile.start_sample;
+                                       int end_sample = tile.start_sample + 
tile.num_samples;
 
-                               for(int sample = start_sample; sample < 
end_sample; sample++) {
-                                       if(task->get_cancel()) {
-                                               if(task->need_finish_queue == 
false)
-                                                       break;
-                                       }
+                                       for(int sample = start_sample; sample < 
end_sample; sample++) {
+                                               if(task->get_cancel()) {
+                                                       
if(task->need_finish_queue == false)
+                                                               break;
+                                               }
 
-                                       path_trace(tile, sample, branched);
+                                               path_trace(tile, sample, 
branched);
 
-                                       tile.sample = sample + 1;
+                                               tile.sample = sample + 1;
 
-                                       task->update_progress(&tile);
+                                               task->update_progress(&tile);
+                                       }
+                               }
+                               else if(tile.task == RenderTile::DENOISE) {
+                                       printf("TODO: Implement Denoising 
kernel, was called for tile at (%d, %d) with size %dx%d!\n", tile.x, tile.y, 
tile.w, tile.h);
                                }
 
                                task->release_tile(tile);
diff --git a/intern/cycles/device/device_opencl.cpp 
b/intern/cycles/device/device_opencl.cpp
index 1b4e542..0a03f16 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1767,10 +1767,11 @@ public:
                else if(task->type == DeviceTask::SHADER) {
                        shader(*task);
                }
-               else if(task->type == DeviceTask::PATH_TRACE) {
+               else if(task->type == DeviceTask::RENDER) {
                        RenderTile tile;
                        /* Keep rendering tiles until done. */
                        while(task->acquire_tile(this, tile)) {
+                               assert(tile.task == RenderTile::PATH_TRACE);
                                int start_sample = tile.start_sample;
                                int end_sample = tile.start_sample + 
tile.num_samples;
 
@@ -3080,7 +3081,7 @@ public:
                else if(task->type == DeviceTask::SHADER) {
                        shader(*task);
                }
-               else if(task->type == DeviceTask::PATH_TRACE) {
+               else if(task->type == DeviceTask::RENDER) {
                        RenderTile tile;
                        bool initialize_data_and_check_render_feasibility = 
false;
                        bool need_to_split_tiles_further = false;
@@ -3089,6 +3090,7 @@ public:
                        const int2 tile_size = task->requested_tile_size;
                        /* Keep rendering tiles until done. */
                        while(task->acquire_tile(this, tile)) {
+                               assert(tile.task == RenderTile::PATH_TRACE);
                                
if(!initialize_data_and_check_render_feasibility) {
                                        /* Initialize data. */
                                        /* Calculate 
per_thread_output_buffer_size. */
diff --git a/intern/cycles/device/device_task.cpp 
b/intern/cycles/device/device_task.cpp
index 1f1128a..7451e6c 100644
--- a/intern/cycles/device/device_task.cpp
+++ b/intern/cycles/device/device_task.cpp
@@ -54,7 +54,7 @@ int DeviceTask::get_subtask_count(int num, int max_size)
        if(type == SHADER) {
                num = min(shader_w, num);
        }
-       else if(type == PATH_TRACE) {
+       else if(type == RENDER) {
        }
        else {
                num = min(h, num);
@@ -80,7 +80,7 @@ void DeviceTask::split(list<DeviceTask>& tasks, int num, int 
max_size)
                        tasks.push_back(task);
                }
        }
-       else if(type == PATH_TRACE) {
+       else if(type == RENDER) {
                for(int i = 0; i < num; i++)
                        tasks.push_back(*this);
        }
@@ -101,7 +101,7 @@ void DeviceTask::split(list<DeviceTask>& tasks, int num, 
int max_size)
 
 void DeviceTask::update_progress(RenderTile *rtile)
 {
-       if((type != PATH_TRACE) &&
+       if((type != RENDER) &&
           (type != SHADER))
                return;
 
diff --git a/intern/cycles/device/device_task.h 
b/intern/cycles/device/device_task.h
index 8423e83..f73906e 100644
--- a/intern/cycles/device/device_task.h
+++ b/intern/cycles/device/device_task.h
@@ -34,7 +34,7 @@ class Tile;
 
 class DeviceTask : public Task {
 public:
-       typedef enum { PATH_TRACE, FILM_CONVERT, SHADER } Type;
+       typedef enum { RENDER, FILM_CONVERT, SHADER } Type;
        Type type;
 
        int x, y, w, h;
@@ -51,7 +51,7 @@ public:
        int shader_filter;
        int shader_x, shader_w;
 
-       explicit DeviceTask(Type type = PATH_TRACE);
+       explicit DeviceTask(Type type = RENDER);
 
        int get_subtask_count(int num, int max_size = 0);
        void split(list<DeviceTask>& tasks, int num, int max_size = 0);
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 57ffd96..52d031b 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -131,6 +131,9 @@ protected:
 
 class RenderTile {
 public:
+       typedef enum { PATH_TRACE, DENOISE } Task;
+
+       Task task;
        int x, y, w, h;
        int start_sample;
        int num_samples;
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 6303731..8b30772 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -273,8 +273,8 @@ void Session::run_gpu()
                        /* update status and timing */
                        update_status_time();
 
-                       /* path trace */
-                       path_trace();
+                       /* render */
+                       render();
 
                        device->task_wait();
 
@@ -377,6 +377,7 @@ bool Session::acquire_tile(Device *tile_device, RenderTile& 
rtile)
        rtile.start_sample = tile_manager.state.sample;
        rtile.num_samples = tile_manager.state.num_samples;
        rtile.resolution = tile_manager.state.resolution_divider;
+       rtile.task = RenderTile::PATH_TRACE;
 
        tile_lock.unlock();
 
@@ -561,8 +562,8 @@ void Session::run_cpu()
                        /* update status and timing */
                        update_status_time();
 
-                       /* path trace */
-                       path_trace();
+                       /* render */
+                       render();
 
                        /* update status and timing */
                        update_status_time();
@@ -908,10 +909,10 @@ void Session::update_progress_sample()
        progress.increment_sample();
 }
 
-void Session::path_trace()
+void Session::render()
 {
        /* add path trace task */
-       DeviceTask task(DeviceTask::PATH_TRACE);
+       DeviceTask task(DeviceTask::RENDER);
        
        task.acquire_tile = function_bind(&Session::acquire_tile, this, _1, _2);
        task.release_tile = function_bind(&Session::release_tile, this, _1);
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8bff0f9..68d4561 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -159,7 +159,7 @@ protected:
        void update_status_time(bool show_pause = false, bool show_done = 
false);
 
        void tonemap(int sample);
-       void path_trace();
+       void render();
        void reset_(BufferParams& params, int samples);
 
        void run_cpu();

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

Reply via email to