Tomato Cycles: use actual number of tiles for viewport rendering

Before this debug_tile_size was used as a size of tile, which
became hidden property since tile-based rendering implementation
and couldn't have been controlled.

This resolves the issue with single thread used for viewport
rendering in some cases. Also it makes possible to control tiles
for CUDA viewport rendering, which still behaves much faster when
using the single tile.

Also fixed issue with minimal tile size which was used to calculate
divider of final resolution to be used for initial rendering. Now
it's a Resolution Divider property in Performance tab. This option
could be used to tweak initial resolution of viewport for faster
navigation or faster refresh when changing some properties.
This commit is contained in:
Sergey Sharybin
2012-08-12 11:58:34 +00:00
parent 8aeba8ec8b
commit 711b97c2ac
8 changed files with 30 additions and 50 deletions

View File

@@ -235,18 +235,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default=0.0,
)
cls.debug_tile_size = IntProperty(
name="Tile Size",
description="",
min=1, max=4096,
default=1024,
)
cls.debug_min_size = IntProperty(
name="Min Size",
description="",
min=1, max=4096,
default=64,
cls.resolution_divider = IntProperty(
name="Resolution Divider",
description="Start viewport rendering with lower resolutionm which would be real resolution divided by two in power of this value",
min=1, max=512,
default=4,
)
cls.debug_reset_timeout = FloatProperty(
name="Reset timeout",
description="",

View File

@@ -205,9 +205,6 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
subsub.enabled = not rd.use_border
subsub.prop(rd, "use_save_buffers")
#sub.prop(cscene, "debug_tile_size")
#sub.prop(cscene, "debug_min_size")
col = split.column()
sub = col.column(align=True)
@@ -216,6 +213,8 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
sub.prop(cscene, "debug_use_spatial_splits")
sub.prop(cscene, "use_cache")
sub.prop(cscene, "resolution_divider")
class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
bl_label = "Layers"

View File

@@ -347,17 +347,8 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use
int tile_x = b_engine.tile_x();
int tile_y = b_engine.tile_y();
if(tile_x == 0 || tile_y == 0) {
tile_x = get_int(cscene, "debug_tile_size");
tile_y = tile_x;
params.tile_size = make_int2(tile_x, tile_y);
params.min_size = get_int(cscene, "debug_min_size");
}
else {
params.tile_size = make_int2(tile_x, tile_y);
params.min_size = min(tile_x, tile_y);
}
params.tile_size = make_int2(tile_x, tile_y);
params.resolution = 1 << get_int(cscene, "resolution_divider");
/* other parameters */
params.threads = b_scene.render().threads();
@@ -368,7 +359,7 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use
if(background) {
params.progressive = false;
params.min_size = INT_MAX;
params.resolution = 1;
}
else
params.progressive = true;

View File

@@ -36,7 +36,7 @@ CCL_NAMESPACE_BEGIN
Session::Session(const SessionParams& params_)
: params(params_),
tile_manager(params.progressive, params.samples, params.tile_size, params.min_size,
tile_manager(params.progressive, params.samples, params.tile_size, params.resolution,
(params.background)? 1: max(params.device.multi_devices.size(), 1))
{
device_use_gl = ((params.device.type != DEVICE_CPU) && !params.background);

View File

@@ -48,7 +48,7 @@ public:
bool experimental;
int samples;
int2 tile_size;
int min_size;
int resolution;
int threads;
double cancel_timeout;
@@ -64,7 +64,7 @@ public:
experimental = false;
samples = INT_MAX;
tile_size = make_int2(64, 64);
min_size = 64;
resolution = 4;
threads = 0;
cancel_timeout = 0.1;
@@ -81,7 +81,7 @@ public:
&& progressive == params.progressive
&& experimental == params.experimental
&& tile_size == params.tile_size
&& min_size == params.min_size
&& resolution == params.resolution
&& threads == params.threads
&& cancel_timeout == params.cancel_timeout
&& reset_timeout == params.reset_timeout

View File

@@ -23,11 +23,11 @@
CCL_NAMESPACE_BEGIN
TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int min_size_, int num_devices_)
TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int resolution_, int num_devices_)
{
progressive = progressive_;
tile_size = tile_size_;
min_size = min_size_;
resolution = resolution_;
num_devices = num_devices_;
BufferParams buffer_params;
@@ -42,19 +42,6 @@ void TileManager::reset(BufferParams& params_, int num_samples_)
{
params = params_;
start_resolution = 1;
int w = params.width, h = params.height;
if(min_size != INT_MAX) {
while(w*h > min_size*min_size) {
w = max(1, w/2);
h = max(1, h/2);
start_resolution *= 2;
}
}
num_samples = num_samples_;
state.buffer = BufferParams();
@@ -62,7 +49,7 @@ void TileManager::reset(BufferParams& params_, int num_samples_)
state.num_tiles = 0;
state.num_rendered_tiles = 0;
state.num_samples = 0;
state.resolution = start_resolution;
state.resolution = resolution;
state.tiles.clear();
}

View File

@@ -57,7 +57,7 @@ public:
list<Tile> tiles;
} state;
TileManager(bool progressive, int num_samples, int2 tile_size, int min_size, int num_devices = 1);
TileManager(bool progressive, int num_samples, int2 tile_size, int resolution, int num_devices = 1);
~TileManager();
void reset(BufferParams& params, int num_samples);
@@ -72,7 +72,7 @@ protected:
bool progressive;
int num_samples;
int2 tile_size;
int min_size;
int resolution;
int num_devices;
int start_resolution;

View File

@@ -2824,13 +2824,21 @@ static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar, int draw
/* create render engine */
if (!rv3d->render_engine) {
RenderEngine *engine;
type = RE_engines_find(scene->r.engine);
if (!(type->view_update && type->view_draw))
return 0;
rv3d->render_engine = RE_engine_create(type);
type->view_update(rv3d->render_engine, C);
engine = RE_engine_create(type);
engine->tile_x = scene->r.xparts;
engine->tile_y = scene->r.yparts;
type->view_update(engine, C);
rv3d->render_engine = engine;
}
/* setup view matrices */