diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2017-01-07 04:37:55 +0300 |
---|---|---|
committer | Mai Lavelle <mai.lavelle@gmail.com> | 2017-01-13 04:40:58 +0300 |
commit | a051c5f2025a4314d4ee660f75572e7966b04bae (patch) | |
tree | 4ff43cd5de16595ec34e6466ea632dcae33195a9 | |
parent | c189403126d0811210ead30c4c4043cab679ff5c (diff) |
Cycles: Have CPU devices use new the acquire_tiles function
This is mostly for testing at the moment, as the default work request
sizes should result in only one tile being acquired at once. May need to
tweak the request sizes later, but for now this should do.
-rw-r--r-- | intern/cycles/device/device_cpu.cpp | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp index c8e001ec2fd..5cf71d1cbd4 100644 --- a/intern/cycles/device/device_cpu.cpp +++ b/intern/cycles/device/device_cpu.cpp @@ -221,7 +221,6 @@ public: } KernelGlobals kg = thread_kernel_globals_init(); - RenderTile tile; void(*path_trace_kernel)(KernelGlobals*, float*, unsigned int*, int, int, int, int, int); @@ -258,37 +257,44 @@ public: { path_trace_kernel = kernel_cpu_path_trace; } - - 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; - } - 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); + RenderWorkRequest work_request = {16*16, 64*64}; + vector<RenderTile> tiles; + + while(task.acquire_tiles(this, tiles, work_request)) { + foreach(RenderTile& tile, tiles) { + 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; + } + + 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; + tile.sample = sample + 1; - task.update_progress(&tile, tile.w*tile.h); - } + task.update_progress(&tile, tile.w*tile.h); + } - task.release_tile(tile); + task.release_tile(tile); + } if(task_pool.canceled()) { if(task.need_finish_queue == false) break; } + + tiles.clear(); } thread_kernel_globals_free(&kg); |