[Bf-blender-cvs] [41dd0c4554] cycles-tiles-rework: Add get_ideal_tile_size function to RenderEngine

Mai Lavelle noreply at git.blender.org
Fri Jan 13 02:52:39 CET 2017


Commit: 41dd0c4554fca73432ee3d41131e169cce3abb7b
Author: Mai Lavelle
Date:   Wed Jan 11 10:43:11 2017 -0500
Branches: cycles-tiles-rework
https://developer.blender.org/rB41dd0c4554fca73432ee3d41131e169cce3abb7b

Add get_ideal_tile_size function to RenderEngine

This allows render engines to specify an ideal tile size to use while
rendering. The function is optional, if provided the returned tile size
will override the scene settings, if not provided the original behavior
will be used.

===================================================================

M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c
M	source/blender/render/intern/source/initrender.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index f23e587e55..74b38bdb88 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3534,8 +3534,15 @@ static bool view3d_main_region_draw_engine(const bContext *C, Scene *scene,
 
 		engine = RE_engine_create_ex(type, true);
 
-		engine->tile_x = scene->r.tilex;
-		engine->tile_y = scene->r.tiley;
+		int tile_x = scene->r.tilex;
+		int tile_y = scene->r.tiley;
+
+		if(type->get_ideal_tile_size) {
+			type->get_ideal_tile_size(engine, scene, &tile_x, &tile_y);
+		}
+
+		engine->tile_x = tile_x;
+		engine->tile_y = tile_y;
 
 		type->view_update(engine, C);
 
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index d69ae2b78b..8f6ebace13 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -256,6 +256,29 @@ static void engine_update_script_node(RenderEngine *engine, struct bNodeTree *nt
 	RNA_parameter_list_free(&list);
 }
 
+static void engine_get_ideal_tile_size(RenderEngine *engine, struct Scene *scene, int *tile_x, int *tile_y)
+{
+	extern FunctionRNA rna_RenderEngine_get_ideal_tile_size_func;
+	PointerRNA ptr;
+	ParameterList list;
+	FunctionRNA *func;
+	void *tile_x_res, *tile_y_res;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func = &rna_RenderEngine_get_ideal_tile_size_func;
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "scene", &scene);
+	engine->type->ext.call(NULL, &ptr, func, &list);
+
+	RNA_parameter_get_lookup(&list, "tile_x", &tile_x_res);
+	RNA_parameter_get_lookup(&list, "tile_y", &tile_y_res);
+	*tile_x = *(int*)tile_x_res;
+	*tile_y = *(int*)tile_y_res;
+
+	RNA_parameter_list_free(&list);
+}
+
 /* RenderEngine registration */
 
 static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -276,7 +299,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
 	RenderEngineType *et, dummyet = {NULL};
 	RenderEngine dummyengine = {NULL};
 	PointerRNA dummyptr;
-	int have_function[6];
+	int have_function[7];
 
 	/* setup dummy engine & engine type to store static properties in */
 	dummyengine.type = &dummyet;
@@ -318,6 +341,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
 	et->view_update = (have_function[3]) ? engine_view_update : NULL;
 	et->view_draw = (have_function[4]) ? engine_view_draw : NULL;
 	et->update_script_node = (have_function[5]) ? engine_update_script_node : NULL;
+	et->get_ideal_tile_size = (have_function[6]) ? engine_get_ideal_tile_size : NULL;
 
 	BLI_addtail(&R_engines, et);
 
@@ -484,6 +508,16 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	parm = RNA_def_pointer(func, "node", "Node", "", "");
 	RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
 
+	/* engine query callbacks */
+	func = RNA_def_function(srna, "get_ideal_tile_size", NULL);
+	RNA_def_function_ui_description(func, "Query ideal tile size");
+	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
+	RNA_def_pointer(func, "scene", "Scene", "", "");
+	parm = RNA_def_int(func, "tile_x", 0, 0, INT_MAX, "Width", "", 0, INT_MAX);
+	RNA_def_function_return(func, parm);
+	parm = RNA_def_int(func, "tile_y", 0, 0, INT_MAX, "Height", "", 0, INT_MAX);
+	RNA_def_function_return(func, parm);
+
 	/* tag for redraw */
 	func = RNA_def_function(srna, "tag_redraw", "engine_tag_redraw");
 	RNA_def_function_ui_description(func, "Request redraw for viewport rendering");
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index f83a210275..4db899d8f6 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -97,6 +97,8 @@ typedef struct RenderEngineType {
 
 	void (*update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node);
 
+	void (*get_ideal_tile_size)(struct RenderEngine *engine, struct Scene *scene, int *tile_x, int *tile_y);
+
 	/* RNA integration */
 	ExtensionRNA ext;
 } RenderEngineType;
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index fd9d95c63b..39044cccfe 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -518,8 +518,8 @@ bool RE_bake_engine(
 	engine->resolution_y = re->winy;
 
 	RE_parts_init(re, false);
-	engine->tile_x = re->r.tilex;
-	engine->tile_y = re->r.tiley;
+	engine->tile_x = re->partx;
+	engine->tile_y = re->party;
 
 	/* update is only called so we create the engine.session */
 	if (type->update)
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 970a393765..4ea091e335 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -52,6 +52,8 @@
 #include "quicktime_export.h"
 #endif
 
+#include "RE_engine.h"
+
 /* this module */
 #include "renderpipeline.h"
 #include "render_types.h"
@@ -538,9 +540,19 @@ void RE_parts_free(Render *re)
 
 void RE_parts_clamp(Render *re)
 {
+	RenderEngineType *type = RE_engines_find(re->r.engine);
+	int tilex, tiley;
+
+	tilex = re->r.tilex;
+	tiley = re->r.tiley;
+
+	if(re->engine && type->get_ideal_tile_size) {
+		type->get_ideal_tile_size(re->engine, re->scene, &tilex, &tiley);
+	}
+
 	/* part size */
-	re->partx = max_ii(1, min_ii(re->r.tilex, re->rectx));
-	re->party = max_ii(1, min_ii(re->r.tiley, re->recty));
+	re->partx = max_ii(1, min_ii(tilex, re->rectx));
+	re->party = max_ii(1, min_ii(tiley, re->recty));
 }
 
 void RE_parts_init(Render *re, bool do_crop)




More information about the Bf-blender-cvs mailing list