void ImageManager::device_update(Device *device, Scene *scene, Progress& progress) { if(!need_update) { return; } TaskPool pool; for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) { for(size_t slot = 0; slot < images[type].size(); slot++) { if(!images[type][slot]) continue; if(images[type][slot]->users == 0) { device_free_image(device, (ImageDataType)type, slot); } else if(images[type][slot]->need_load) { if(!osl_texture_system || images[type][slot]->builtin_data) pool.push(function_bind(&ImageManager::device_load_image, this, device, scene, (ImageDataType)type, slot, &progress)); } } } pool.wait_work(); need_update = false; }
void task_add(DeviceTask& task) { /* split task into smaller ones */ list<DeviceTask> tasks; task.split(tasks, TaskScheduler::num_threads()); foreach(DeviceTask& task, tasks) task_pool.push(new CPUDeviceTask(this, task)); }
void task_add(DeviceTask& task) { /* split task into smaller ones, more than number of threads for uneven * workloads where some parts of the image render slower than others */ list<DeviceTask> tasks; task.split(tasks, TaskScheduler::num_threads()); foreach(DeviceTask& task, tasks) task_pool.push(new CPUDeviceTask(this, task)); }
TEST(util_task, basic) { TaskScheduler::init(0); TaskPool pool; for (int i = 0; i < 100; ++i) { pool.push(function_bind(task_run)); } TaskPool::Summary summary; pool.wait_work(&summary); TaskScheduler::exit(); EXPECT_EQ(summary.num_tasks_handled, 100); }
void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress& progress) { if(!need_update) return; TaskPool pool; for(size_t slot = 0; slot < images.size(); slot++) { if(!images[slot]) continue; if(images[slot]->users == 0) { device_free_image(device, dscene, slot); } else if(images[slot]->need_load) { if(!osl_texture_system) pool.push(function_bind(&ImageManager::device_load_image, this, device, dscene, slot, &progress)); } } for(size_t slot = 0; slot < float_images.size(); slot++) { if(!float_images[slot]) continue; if(float_images[slot]->users == 0) { device_free_image(device, dscene, slot + TEX_IMAGE_FLOAT_START); } else if(float_images[slot]->need_load) { if(!osl_texture_system) pool.push(function_bind(&ImageManager::device_load_image, this, device, dscene, slot + TEX_IMAGE_FLOAT_START, &progress)); } } pool.wait_work(); if(pack_images) device_pack_images(device, dscene, progress); need_update = false; }
void task_add(DeviceTask& task) { /* split task into smaller ones */ list<DeviceTask> tasks; if(task.type == DeviceTask::SHADER) task.split(tasks, TaskScheduler::num_threads(), 256); else task.split(tasks, TaskScheduler::num_threads()); foreach(DeviceTask& task, tasks) task_pool.push(new CPUDeviceTask(this, task)); }
void task_add(DeviceTask &task) { /* Load texture info. */ load_texture_info(); /* split task into smaller ones */ list<DeviceTask> tasks; if (task.type == DeviceTask::SHADER) task.split(tasks, info.cpu_threads, 256); else task.split(tasks, info.cpu_threads); foreach (DeviceTask &task, tasks) task_pool.push(new CPUDeviceTask(this, task)); }
void task_add(DeviceTask& task) { task_pool.push(new OpenCLDeviceTask(this, task)); }