[Bf-blender-cvs] [a72255a] opensubdiv-modifier: Solve crash when doing viewport render

Sergey Sharybin noreply at git.blender.org
Wed Jun 18 12:57:44 CEST 2014


Commit: a72255acf77fe0cf3bddebeb7a77013d985f2077
Author: Sergey Sharybin
Date:   Wed Jun 18 16:51:34 2014 +0600
https://developer.blender.org/rBa72255acf77fe0cf3bddebeb7a77013d985f2077

Solve crash when doing viewport render

The issue was caused by the render pipeline creating
DerivedMesh for purposes of it's export to the render
database. In this case SubSurf modifier shouldn't be
applied on GPU because render pipeline would want to
access hires data from the CPU side.

Added a flag to modifier apply bitmask which indicates
that the result could be stored in the GPU side. The
flag is called MOD_APPLY_ALLOW_GPU. If this flag is
set modifiers are allowed to keep their result on GPU.

We still need to implement CPU-side hi-res mesh unpack
even if it was originally evaluated on GPU, but the
current change is useful anyway because it'll avoid
possible overhead of copying data back-n-forth.

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

M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/modifiers/intern/MOD_subsurf.c

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

diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 75616b9..d8c1c42 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -115,6 +115,12 @@ typedef enum ModifierApplyFlag {
 	MOD_APPLY_IGNORE_SIMPLIFY = 1 << 3, /* Ignore scene simplification flag and use subdivisions
 	                                     * level set in multires modifier.
 	                                     */
+	MOD_APPLY_ALLOW_GPU = 1 << 4,  /* Allow modifier to be applied and stored in the GPU.
+	                                * Used by the viewport in order to be able to have SS
+	                                * happening on GPU.
+	                                * Render pipeline (including viewport render) should
+	                                * have DM on the CPU.
+	                                */
 } ModifierApplyFlag;
 
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index b35c45b..53465ba 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1442,7 +1442,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
                                 DerivedMesh **deform_r, DerivedMesh **final_r,
                                 int useRenderParams, int useDeform,
                                 int needMapping, CustomDataMask dataMask,
-                                int index, int useCache, int build_shapekey_layers)
+                                int index, int useCache, int build_shapekey_layers,
+                                bool allow_gpu)
 {
 	Mesh *me = ob->data;
 	ModifierData *firstmd, *md, *previewmd = NULL;
@@ -1481,6 +1482,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
 	ModifierApplyFlag deform_app_flags = app_flags;
 	if (useCache)
 		app_flags |= MOD_APPLY_USECACHE;
+	if (allow_gpu)
+		app_flags |= MOD_APPLY_ALLOW_GPU;
 	if (useDeform)
 		deform_app_flags |= MOD_APPLY_USECACHE;
 
@@ -2250,7 +2253,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
 
 	mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
 	                    &ob->derivedFinal, 0, 1,
-	                    needMapping, dataMask, -1, 1, build_shapekey_layers);
+	                    needMapping, dataMask, -1, 1, build_shapekey_layers,
+	                    true);
 
 	DM_set_object_boundbox(ob, ob->derivedFinal);
 
@@ -2358,7 +2362,7 @@ DerivedMesh *mesh_create_derived_render(Scene *scene, Object *ob, CustomDataMask
 {
 	DerivedMesh *final;
 	
-	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1, 0, 0, false);
 
 	return final;
 }
@@ -2367,7 +2371,7 @@ DerivedMesh *mesh_create_derived_index_render(Scene *scene, Object *ob, CustomDa
 {
 	DerivedMesh *final;
 	
-	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, index, 0, 0);
+	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, index, 0, 0, false);
 
 	return final;
 }
@@ -2382,7 +2386,7 @@ DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask d
 	 */
 	ob->transflag |= OB_NO_PSYS_UPDATE;
 
-	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0, 0, false);
 
 	ob->transflag &= ~OB_NO_PSYS_UPDATE;
 
@@ -2394,7 +2398,7 @@ DerivedMesh *mesh_create_derived_no_deform(Scene *scene, Object *ob, float (*ver
 {
 	DerivedMesh *final;
 	
-	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1, 0, 0, false);
 
 	return final;
 }
@@ -2404,7 +2408,7 @@ DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*ve
 {
 	DerivedMesh *final;
 	
-	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 0, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 0, dataMask, -1, 0, 0, false);
 
 	return final;
 }
@@ -2414,7 +2418,7 @@ DerivedMesh *mesh_create_derived_physics(Scene *scene, Object *ob, float (*vertC
 {
 	DerivedMesh *final;
 	
-	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0, 0, false);
 
 	return final;
 }
@@ -2425,7 +2429,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob,
 {
 	DerivedMesh *final;
 
-	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1, 0, 0);
+	mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1, 0, 0, false);
 
 	return final;
 }
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index 0ab0403..0ab9a74 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -100,6 +100,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	DerivedMesh *result;
 	const bool useRenderParams = (flag & MOD_APPLY_RENDER) != 0;
 	const bool isFinalCalc = (flag & MOD_APPLY_USECACHE) != 0;
+	const bool allow_gpu = (flag & MOD_APPLY_ALLOW_GPU) != 0;
 
 	if (useRenderParams)
 		subsurf_flags |= SUBSURF_USE_RENDER_PARAMS;
@@ -109,7 +110,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 		subsurf_flags |= SUBSURF_IN_EDIT_MODE;
 
 	/* TODO(sergey): Not entirely correct, only good for purposes of test. */
-	if (md->next == NULL && useRenderParams == false) {
+	if (md->next == NULL && allow_gpu) {
 		subsurf_flags |= SUBSURF_USE_GPU_BACKEND;
 	}




More information about the Bf-blender-cvs mailing list