Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/tile.cpp
| Show First 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int start_resolution_, | ||||
| BufferParams buffer_params; | BufferParams buffer_params; | ||||
| reset(buffer_params, 0); | reset(buffer_params, 0); | ||||
| } | } | ||||
| TileManager::~TileManager() | TileManager::~TileManager() | ||||
| { | { | ||||
| } | } | ||||
| void TileManager::reset(BufferParams& params_, int num_samples_) | static int get_divider(int w, int h, int start_resolution) | ||||
| { | { | ||||
| params = params_; | |||||
| int divider = 1; | int divider = 1; | ||||
| int w = params.width, h = params.height; | |||||
| if(start_resolution != INT_MAX) { | if(start_resolution != INT_MAX) { | ||||
| while(w*h > start_resolution*start_resolution) { | while(w*h > start_resolution*start_resolution) { | ||||
| w = max(1, w/2); | w = max(1, w/2); | ||||
| h = max(1, h/2); | h = max(1, h/2); | ||||
| divider *= 2; | divider <<= 1; | ||||
| } | } | ||||
| } | } | ||||
| return divider; | |||||
| } | |||||
| num_samples = num_samples_; | void TileManager::reset(BufferParams& params_, int num_samples_) | ||||
| { | |||||
| params = params_; | |||||
| set_samples(num_samples_); | |||||
| state.buffer = BufferParams(); | state.buffer = BufferParams(); | ||||
| state.sample = range_start_sample - 1; | state.sample = range_start_sample - 1; | ||||
| state.num_tiles = 0; | state.num_tiles = 0; | ||||
| state.num_rendered_tiles = 0; | state.num_rendered_tiles = 0; | ||||
| state.num_samples = 0; | state.num_samples = 0; | ||||
| state.resolution_divider = divider; | state.resolution_divider = get_divider(params.width, params.height, start_resolution); | ||||
| state.tiles.clear(); | state.tiles.clear(); | ||||
| } | } | ||||
| void TileManager::set_samples(int num_samples_) | void TileManager::set_samples(int num_samples_) | ||||
| { | { | ||||
| num_samples = num_samples_; | num_samples = num_samples_; | ||||
| /* No real progress indication is possible when using unlimited samples. */ | |||||
| if(num_samples == INT_MAX) { | |||||
| state.total_pixel_samples = 0; | |||||
| } | |||||
| else { | |||||
| uint64_t pixel_samples = 0; | |||||
| /* While rendering in the viewport, the initial preview resolution is increased to the native resolution | |||||
| * before the actual rendering begins. Therefore, additional pixel samples will be rendered. */ | |||||
| int divider = get_divider(params.width, params.height, start_resolution) / 2; | |||||
| while(divider > 1) { | |||||
| int image_w = max(1, params.width/divider); | |||||
| int image_h = max(1, params.height/divider); | |||||
| pixel_samples += image_w * image_h; | |||||
| divider >>= 1; | |||||
| } | |||||
| state.total_pixel_samples = pixel_samples + get_num_effective_samples() * params.width*params.height; | |||||
| } | |||||
| } | } | ||||
| /* If sliced is false, splits image into tiles and assigns equal amount of tiles to every render device. | /* If sliced is false, splits image into tiles and assigns equal amount of tiles to every render device. | ||||
| * If sliced is true, slice image into as much pieces as how many devices are rendering this image. */ | * If sliced is true, slice image into as much pieces as how many devices are rendering this image. */ | ||||
| int TileManager::gen_tiles(bool sliced) | int TileManager::gen_tiles(bool sliced) | ||||
| { | { | ||||
| int resolution = state.resolution_divider; | int resolution = state.resolution_divider; | ||||
| int image_w = max(1, params.width/resolution); | int image_w = max(1, params.width/resolution); | ||||
| ▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | |||||
| int TileManager::get_num_effective_samples() | int TileManager::get_num_effective_samples() | ||||
| { | { | ||||
| return (range_num_samples == -1) ? num_samples | return (range_num_samples == -1) ? num_samples | ||||
| : range_num_samples; | : range_num_samples; | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||
sergey: `divider >> 1` ? :) | |||||
Not Done Inline ActionsIs this code running on every tile update? sergey: Is this code running on every tile update? | |||||
divider >> 1 ? :)