Cycles/BI: Add a pixel size option for speeding up viewport rendering
This patch adds "Pixel Size" to the performance options, which allows to render in a smaller resolution, which is especially useful for displays with high DPI. Reviewers: Severin, dingto, sergey, brecht Reviewed By: brecht Subscribers: Severin, venomgfx, eyecandy, brecht Differential Revision: https://developer.blender.org/D1619
This commit is contained in:
@@ -152,6 +152,8 @@ bool BKE_scene_check_rigidbody_active(const struct Scene *scene);
|
||||
int BKE_scene_num_threads(const struct Scene *scene);
|
||||
int BKE_render_num_threads(const struct RenderData *r);
|
||||
|
||||
int BKE_render_preview_pixel_size(const struct RenderData *r);
|
||||
|
||||
double BKE_scene_unit_scale(const struct UnitSettings *unit, const int unit_type, double value);
|
||||
|
||||
/* multiview */
|
||||
|
||||
@@ -2411,6 +2411,14 @@ int BKE_scene_num_threads(const Scene *scene)
|
||||
return BKE_render_num_threads(&scene->r);
|
||||
}
|
||||
|
||||
int BKE_render_preview_pixel_size(const RenderData *r)
|
||||
{
|
||||
if (r->preview_pixel_size == 0) {
|
||||
return (U.pixelsize > 1.5f)? 2 : 1;
|
||||
}
|
||||
return r->preview_pixel_size;
|
||||
}
|
||||
|
||||
/* Apply the needed correction factor to value, based on unit_type (only length-related are affected currently)
|
||||
* and unit->scale_length.
|
||||
*/
|
||||
|
||||
@@ -1171,7 +1171,7 @@ static void render_update_resolution(Render *re, const RenderPreview *rp,
|
||||
}
|
||||
|
||||
if (rp->has_freestyle) {
|
||||
if (rp->resolution_divider == 1) {
|
||||
if (rp->resolution_divider == BKE_render_preview_pixel_size(&rp->scene->r)) {
|
||||
RE_ChangeModeFlag(re, R_EDGE_FRS, false);
|
||||
}
|
||||
else {
|
||||
@@ -1312,11 +1312,12 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda
|
||||
RE_updateRenderInstances(re, ob_inst_update_flag);
|
||||
|
||||
for (;;) {
|
||||
int pixel_size = BKE_render_preview_pixel_size(&rp->scene->r);
|
||||
if (first_time == false) {
|
||||
if (restore)
|
||||
RE_DataBase_IncrementalView(re, rp->viewmat, 1);
|
||||
|
||||
rp->resolution_divider /= 2;
|
||||
rp->resolution_divider = MAX2(rp->resolution_divider/2, pixel_size);
|
||||
*do_update = 1;
|
||||
|
||||
render_update_resolution(re, rp, use_border, &cliprct);
|
||||
@@ -1333,7 +1334,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda
|
||||
|
||||
first_time = false;
|
||||
|
||||
if (*stop || rp->resolution_divider == 1) {
|
||||
if (*stop || rp->resolution_divider == pixel_size) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1435,7 +1436,7 @@ static void render_view3d_do(RenderEngine *engine, const bContext *C)
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
int width = ar->winx, height = ar->winy;
|
||||
int divider = 1;
|
||||
int divider = BKE_render_preview_pixel_size(&scene->r);
|
||||
int resolution_threshold = scene->r.preview_start_resolution *
|
||||
scene->r.preview_start_resolution;
|
||||
|
||||
|
||||
@@ -790,14 +790,13 @@ typedef struct RenderData {
|
||||
struct BakeData bake;
|
||||
|
||||
int preview_start_resolution;
|
||||
short preview_pixel_size;
|
||||
|
||||
/* Type of the debug pass to use.
|
||||
* Only used when built with debug passes support.
|
||||
*/
|
||||
short debug_pass_type;
|
||||
|
||||
short pad;
|
||||
|
||||
/* MultiView */
|
||||
ListBase views; /* SceneRenderView */
|
||||
short actview;
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BLI_path_util.h"
|
||||
|
||||
#include "BKE_scene.h"
|
||||
|
||||
#include "RNA_define.h"
|
||||
#include "RNA_enum_types.h"
|
||||
|
||||
@@ -123,6 +125,11 @@ static int engine_support_display_space_shader(RenderEngine *UNUSED(engine), Sce
|
||||
return IMB_colormanagement_support_glsl_draw(&scene->view_settings);
|
||||
}
|
||||
|
||||
static int engine_get_preview_pixel_size(RenderEngine *UNUSED(engine), Scene *scene)
|
||||
{
|
||||
return BKE_render_preview_pixel_size(&scene->r);
|
||||
}
|
||||
|
||||
static void engine_bind_display_space_shader(RenderEngine *UNUSED(engine), Scene *scene)
|
||||
{
|
||||
IMB_colormanagement_setup_glsl_draw(&scene->view_settings,
|
||||
@@ -647,6 +654,13 @@ static void rna_def_render_engine(BlenderRNA *brna)
|
||||
parm = RNA_def_boolean(func, "supported", 0, "Supported", "");
|
||||
RNA_def_function_return(func, parm);
|
||||
|
||||
func = RNA_def_function(srna, "get_preview_pixel_size", "engine_get_preview_pixel_size");
|
||||
RNA_def_function_ui_description(func, "Get the pixel size that should be used for preview rendering");
|
||||
parm = RNA_def_pointer(func, "scene", "Scene", "", "");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
|
||||
parm = RNA_def_int(func, "pixel_size", 0, 1, 8, "Pixel Size", "", 1, 8);
|
||||
RNA_def_function_return(func, parm);
|
||||
|
||||
RNA_define_verify_sdna(0);
|
||||
|
||||
prop = RNA_def_property(srna, "is_animation", PROP_BOOLEAN, PROP_NONE);
|
||||
|
||||
@@ -1846,6 +1846,13 @@ static void rna_Scene_simplify_update(Main *bmain, Scene *UNUSED(scene), Pointer
|
||||
rna_Scene_use_simplify_update(bmain, sce, ptr);
|
||||
}
|
||||
|
||||
static void rna_SceneRenderData_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
||||
{
|
||||
Scene *sce = ptr->id.data;
|
||||
|
||||
DAG_id_tag_update(&sce->id, 0);
|
||||
}
|
||||
|
||||
static void rna_Scene_use_persistent_data_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
||||
{
|
||||
Scene *sce = ptr->id.data;
|
||||
@@ -5895,6 +5902,15 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
static EnumPropertyItem pixel_size_items[] = {
|
||||
{0, "AUTO", 0, "Automatic", "Automatic pixel size, depends on the UI scale"},
|
||||
{1, "1", 0, "1x", "Render at full resolution"},
|
||||
{2, "2", 0, "2x", "Render at 50% resolution"},
|
||||
{4, "4", 0, "4x", "Render at 25% resolution"},
|
||||
{8, "8", 0, "8x", "Render at 12.5% resolution"},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
static EnumPropertyItem octree_resolution_items[] = {
|
||||
{64, "64", 0, "64", ""},
|
||||
{128, "128", 0, "128", ""},
|
||||
@@ -6018,6 +6034,12 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
||||
"progressively increasing it to the full viewport size");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "preview_pixel_size", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "preview_pixel_size");
|
||||
RNA_def_property_enum_items(prop, pixel_size_items);
|
||||
RNA_def_property_ui_text(prop, "Pixel Size", "Pixel size for viewport rendering");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_SceneRenderData_update");
|
||||
|
||||
prop = RNA_def_property(srna, "pixel_aspect_x", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_float_sdna(prop, NULL, "xasp");
|
||||
RNA_def_property_flag(prop, PROP_PROPORTIONAL);
|
||||
|
||||
Reference in New Issue
Block a user