Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/device/device_task.cpp
| Show All 29 Lines | |||||
| : type(type_), x(0), y(0), w(0), h(0), rgba_byte(0), rgba_half(0), buffer(0), | : type(type_), x(0), y(0), w(0), h(0), rgba_byte(0), rgba_half(0), buffer(0), | ||||
| sample(0), num_samples(1), | sample(0), num_samples(1), | ||||
| shader_input(0), shader_output(0), | shader_input(0), shader_output(0), | ||||
| shader_eval_type(0), shader_x(0), shader_w(0) | shader_eval_type(0), shader_x(0), shader_w(0) | ||||
| { | { | ||||
| last_update_time = time_dt(); | last_update_time = time_dt(); | ||||
| } | } | ||||
| void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) | int DeviceTask::get_subtask_count(int num, int max_size) | ||||
| { | { | ||||
| if(max_size != 0) { | if(max_size != 0) { | ||||
| int max_size_num; | int max_size_num; | ||||
| if(type == SHADER) { | if(type == SHADER) { | ||||
| max_size_num = (shader_w + max_size - 1)/max_size; | max_size_num = (shader_w + max_size - 1)/max_size; | ||||
| } | } | ||||
| else { | else { | ||||
| max_size = max(1, max_size/w); | max_size = max(1, max_size/w); | ||||
| max_size_num = (h + max_size - 1)/max_size; | max_size_num = (h + max_size - 1)/max_size; | ||||
| } | } | ||||
| num = max(max_size_num, num); | num = max(max_size_num, num); | ||||
| } | } | ||||
| if(type == SHADER) { | if(type == SHADER) { | ||||
| num = min(shader_w, num); | num = min(shader_w, num); | ||||
| } | |||||
| else if(type == PATH_TRACE) { | |||||
| } | |||||
| else { | |||||
| num = min(h, num); | |||||
| } | |||||
| return num; | |||||
| } | |||||
| void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) | |||||
| { | |||||
| num = get_subtask_count(num, max_size); | |||||
| if(type == SHADER) { | |||||
| for(int i = 0; i < num; i++) { | for(int i = 0; i < num; i++) { | ||||
| int tx = shader_x + (shader_w/num)*i; | int tx = shader_x + (shader_w/num)*i; | ||||
| int tw = (i == num-1)? shader_w - i*(shader_w/num): shader_w/num; | int tw = (i == num-1)? shader_w - i*(shader_w/num): shader_w/num; | ||||
| DeviceTask task = *this; | DeviceTask task = *this; | ||||
| task.shader_x = tx; | task.shader_x = tx; | ||||
| task.shader_w = tw; | task.shader_w = tw; | ||||
| tasks.push_back(task); | tasks.push_back(task); | ||||
| } | } | ||||
| } | } | ||||
| else if(type == PATH_TRACE) { | else if(type == PATH_TRACE) { | ||||
| for(int i = 0; i < num; i++) | for(int i = 0; i < num; i++) | ||||
| tasks.push_back(*this); | tasks.push_back(*this); | ||||
| } | } | ||||
| else { | else { | ||||
| num = min(h, num); | |||||
| for(int i = 0; i < num; i++) { | for(int i = 0; i < num; i++) { | ||||
| int ty = y + (h/num)*i; | int ty = y + (h/num)*i; | ||||
| int th = (i == num-1)? h - i*(h/num): h/num; | int th = (i == num-1)? h - i*(h/num): h/num; | ||||
| DeviceTask task = *this; | DeviceTask task = *this; | ||||
| task.y = ty; | task.y = ty; | ||||
| task.h = th; | task.h = th; | ||||
| tasks.push_back(task); | tasks.push_back(task); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void DeviceTask::update_progress(RenderTile &rtile) | void DeviceTask::update_progress(RenderTile *rtile) | ||||
| { | { | ||||
| if (type != PATH_TRACE) | if((type != PATH_TRACE) && | ||||
| (type != SHADER)) | |||||
| return; | return; | ||||
| if(update_progress_sample) | if(update_progress_sample) | ||||
| update_progress_sample(); | update_progress_sample(); | ||||
| if(update_tile_sample) { | if(update_tile_sample) { | ||||
| double current_time = time_dt(); | double current_time = time_dt(); | ||||
| if (current_time - last_update_time >= 1.0) { | if (current_time - last_update_time >= 1.0) { | ||||
| update_tile_sample(rtile); | update_tile_sample(*rtile); | ||||
| last_update_time = current_time; | last_update_time = current_time; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||