Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/device/opencl/opencl_mega.cpp
| Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | void thread_run(DeviceTask *task) | ||||
| } | } | ||||
| else if(task->type == DeviceTask::SHADER) { | else if(task->type == DeviceTask::SHADER) { | ||||
| shader(*task); | shader(*task); | ||||
| } | } | ||||
| else if(task->type == DeviceTask::RENDER) { | else if(task->type == DeviceTask::RENDER) { | ||||
| RenderTile tile; | RenderTile tile; | ||||
| /* Keep rendering tiles until done. */ | /* Keep rendering tiles until done. */ | ||||
| while(task->acquire_tile(this, tile)) { | while(task->acquire_tile(this, tile)) { | ||||
| if(tile.task == RenderTile::PATH_TRACE) { | |||||
| int start_sample = tile.start_sample; | int start_sample = tile.start_sample; | ||||
| int end_sample = tile.start_sample + tile.num_samples; | int end_sample = tile.start_sample + tile.num_samples; | ||||
| for(int sample = start_sample; sample < end_sample; sample++) { | for(int sample = start_sample; sample < end_sample; sample++) { | ||||
| if(task->get_cancel()) { | if(task->get_cancel()) { | ||||
| if(task->need_finish_queue == false) | if(task->need_finish_queue == false) | ||||
| break; | break; | ||||
| } | } | ||||
| path_trace(tile, sample); | path_trace(tile, sample); | ||||
| tile.sample = sample + 1; | tile.sample = sample + 1; | ||||
| task->update_progress(&tile, tile.w*tile.h); | task->update_progress(&tile, tile.w*tile.h); | ||||
| } | } | ||||
| /* Complete kernel execution before release tile */ | /* Complete kernel execution before release tile */ | ||||
| /* This helps in multi-device render; | /* This helps in multi-device render; | ||||
| * The device that reaches the critical-section function | * The device that reaches the critical-section function | ||||
| * release_tile waits (stalling other devices from entering | * release_tile waits (stalling other devices from entering | ||||
| * release_tile) for all kernels to complete. If device1 (a | * release_tile) for all kernels to complete. If device1 (a | ||||
| * slow-render device) reaches release_tile first then it would | * slow-render device) reaches release_tile first then it would | ||||
| * stall device2 (a fast-render device) from proceeding to render | * stall device2 (a fast-render device) from proceeding to render | ||||
| * next tile. | * next tile. | ||||
| */ | */ | ||||
| clFinish(cqCommandQueue); | clFinish(cqCommandQueue); | ||||
| } | |||||
| else if(tile.task == RenderTile::DENOISE) { | |||||
| tile.sample = tile.start_sample + tile.num_samples; | |||||
| denoise(tile, *task); | |||||
| task->update_progress(&tile, tile.w*tile.h); | |||||
| } | |||||
| task->release_tile(tile); | task->release_tile(tile); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| bool is_split_kernel() | |||||
brecht: `{` on new line. | |||||
| { | |||||
| return false; | |||||
| } | |||||
| }; | }; | ||||
| Device *opencl_create_mega_device(DeviceInfo& info, Stats& stats, bool background) | Device *opencl_create_mega_device(DeviceInfo& info, Stats& stats, bool background) | ||||
| { | { | ||||
| return new OpenCLDeviceMegaKernel(info, stats, background); | return new OpenCLDeviceMegaKernel(info, stats, background); | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||
| #endif | #endif | ||||
{ on new line.