[Bf-blender-cvs] [4550731] master: RNA: optimization to avoid malloc for iterators.

Brecht Van Lommel noreply at git.blender.org
Sat Apr 5 14:50:55 CEST 2014


Commit: 45507319635a0351d3c5010d75c32e40bf211d25
Author: Brecht Van Lommel
Date:   Sat Apr 5 14:36:18 2014 +0200
https://developer.blender.org/rB45507319635a0351d3c5010d75c32e40bf211d25

RNA: optimization to avoid malloc for iterators.

This mostly helps making Cycles scene synchronization a bit faster.

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

M	source/blender/makesrna/RNA_types.h
M	source/blender/makesrna/intern/makesrna.c
M	source/blender/makesrna/intern/rna_access.c
M	source/blender/makesrna/intern/rna_action.c
M	source/blender/makesrna/intern/rna_armature.c
M	source/blender/makesrna/intern/rna_group.c
M	source/blender/makesrna/intern/rna_internal.h
M	source/blender/makesrna/intern/rna_rna.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/makesrna/intern/rna_sequencer.c

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

diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 4bf0719..83f3870 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -236,12 +236,40 @@ typedef enum PropertyFlag {
 	PROP_ENUM_NO_TRANSLATE       = (1 << 29), /* for enums not to be translated (e.g. renderlayers' names in nodes) */
 } PropertyFlag;
 
+struct CollectionPropertyIterator;
+struct Link;
+typedef int (*IteratorSkipFunc)(struct CollectionPropertyIterator *iter, void *data);
+
+typedef struct ListBaseIterator {
+	struct Link *link;
+	int flag;
+	IteratorSkipFunc skip;
+} ListBaseIterator;
+
+typedef struct ArrayIterator {
+	char *ptr;
+	char *endptr;  /* past the last valid pointer, only for comparisons, ignores skipped values */
+	void *free_ptr; /* will be freed if set */
+	int itemsize;
+
+	/* array length with no skip functions applied, take care not to compare against index from animsys
+	 * or python indices */
+	int length;
+
+	/* optional skip function, when set the array as viewed by rna can contain only a subset of the members.
+	 * this changes indices so quick array index lookups are not possible when skip function is used. */
+	IteratorSkipFunc skip;
+} ArrayIterator;
+
 typedef struct CollectionPropertyIterator {
 	/* internal */
 	PointerRNA parent;
 	PointerRNA builtin_parent;
 	struct PropertyRNA *prop;
-	void *internal;
+	union {
+		ArrayIterator array;
+		ListBaseIterator listbase;
+	} internal;
 	int idprop;
 	int level;
 
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 76a9677..029e25f 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -1147,7 +1147,7 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
 	fprintf(f, "	if (iter.valid) {\n");
 
 	if (strcmp(nextfunc, "rna_iterator_array_next") == 0) {
-		fprintf(f, "		ArrayIterator *internal = iter.internal;\n");
+		fprintf(f, "		ArrayIterator *internal = &iter.internal.array;\n");
 		fprintf(f, "		if (index < 0 || index >= internal->length) {\n");
 		fprintf(f, "#ifdef __GNUC__\n");
 		fprintf(f, "			printf(\"Array iterator out of range: %%s (index %%d)\\n\", __func__, index);\n");
@@ -1167,7 +1167,7 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
 		fprintf(f, "		}\n");
 	}
 	else if (strcmp(nextfunc, "rna_iterator_listbase_next") == 0) {
-		fprintf(f, "		ListBaseIterator *internal = iter.internal;\n");
+		fprintf(f, "		ListBaseIterator *internal = &iter.internal.listbase;\n");
 		fprintf(f, "		if (internal->skip) {\n");
 		fprintf(f, "			while (index-- > 0 && iter.valid) {\n");
 		fprintf(f, "				rna_iterator_listbase_next(&iter);\n");
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 5e0ed7c..b0ed7e2 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -2886,7 +2886,7 @@ void RNA_property_collection_skip(CollectionPropertyIterator *iter, int num)
 
 	if (num > 1 && (iter->idprop || (cprop->property.flag & PROP_RAW_ARRAY))) {
 		/* fast skip for array */
-		ArrayIterator *internal = iter->internal;
+		ArrayIterator *internal = &iter->internal.array;
 
 		if (!internal->skip) {
 			internal->ptr += internal->itemsize * (num - 1);
@@ -3227,7 +3227,7 @@ int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, Proper
 
 	if (iter.valid) {
 		/* get data from array iterator and item property */
-		internal = iter.internal;
+		internal = &iter.internal.array;
 		arrayp = (iter.valid) ? iter.ptr.data : NULL;
 
 		if (internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) {
@@ -3644,13 +3644,11 @@ int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, Proper
 
 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
 {
-	ListBaseIterator *internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 
-	internal = MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
 	internal->link = (lb) ? lb->first : NULL;
 	internal->skip = skip;
 
-	iter->internal = internal;
 	iter->valid = (internal->link != NULL);
 
 	if (skip && iter->valid && skip(iter, internal->link))
@@ -3659,7 +3657,7 @@ void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb,
 
 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
 {
-	ListBaseIterator *internal = iter->internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 
 	if (internal->skip) {
 		do {
@@ -3675,15 +3673,13 @@ void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
 
 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
 {
-	ListBaseIterator *internal = iter->internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 
 	return internal->link;
 }
 
-void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
+void rna_iterator_listbase_end(CollectionPropertyIterator *UNUSED(iter))
 {
-	MEM_freeN(iter->internal);
-	iter->internal = NULL;
 }
 
 PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct ListBase *lb, int index)
@@ -3704,7 +3700,7 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
 		itemsize = 0;
 	}
 
-	internal = MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
+	internal = &iter->internal.array;
 	internal->ptr = ptr;
 	internal->free_ptr = free_ptr ? ptr : NULL;
 	internal->endptr = ((char *)ptr) + length * itemsize;
@@ -3712,7 +3708,6 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
 	internal->skip = skip;
 	internal->length = length;
 	
-	iter->internal = internal;
 	iter->valid = (internal->ptr != internal->endptr);
 
 	if (skip && iter->valid && skip(iter, internal->ptr))
@@ -3721,7 +3716,7 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
 
 void rna_iterator_array_next(CollectionPropertyIterator *iter)
 {
-	ArrayIterator *internal = iter->internal;
+	ArrayIterator *internal = &iter->internal.array;
 
 	if (internal->skip) {
 		do {
@@ -3737,14 +3732,14 @@ void rna_iterator_array_next(CollectionPropertyIterator *iter)
 
 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
 {
-	ArrayIterator *internal = iter->internal;
+	ArrayIterator *internal = &iter->internal.array;
 
 	return internal->ptr;
 }
 
 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
 {
-	ArrayIterator *internal = iter->internal;
+	ArrayIterator *internal = &iter->internal.array;
 
 	/* for ** arrays */
 	return *(void **)(internal->ptr);
@@ -3752,14 +3747,12 @@ void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
 
 void rna_iterator_array_end(CollectionPropertyIterator *iter)
 {
-	ArrayIterator *internal = iter->internal;
+	ArrayIterator *internal = &iter->internal.array;
 	
 	if (internal->free_ptr) {
 		MEM_freeN(internal->free_ptr);
 		internal->free_ptr = NULL;
 	}
-	MEM_freeN(iter->internal);
-	iter->internal = NULL;
 }
 
 PointerRNA rna_array_lookup_int(PointerRNA *ptr, StructRNA *type, void *data, int itemsize, int length, int index)
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index de12839..ecfa128 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -56,7 +56,7 @@
 
 static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter)
 {
-	ListBaseIterator *internal = iter->internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 	FCurve *fcu = (FCurve *)internal->link;
 	bActionGroup *grp = fcu->grp;
 	
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index 9d4e7a1..612ce14 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -441,7 +441,7 @@ static void rna_Armature_editbone_transform_update(Main *bmain, Scene *scene, Po
 
 static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
 {
-	ListBaseIterator *internal = iter->internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 	Bone *bone = (Bone *)internal->link;
 
 	if (bone->childbase.first)
diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c
index 0706d97..2f9c12c 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -47,7 +47,7 @@
 
 static PointerRNA rna_Group_objects_get(CollectionPropertyIterator *iter)
 {
-	ListBaseIterator *internal = iter->internal;
+	ListBaseIterator *internal = &iter->internal.listbase;
 
 	/* we are actually iterating a GroupObject list, so override get */
 	return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ((GroupObject *)internal->link)->ob);
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index d75ee25..ecfb7f5 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -355,35 +355,12 @@ int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, Point
 
 /* Iterators */
 
-typedef int (*IteratorSkipFunc)(struct CollectionPropertyIterator *iter, void *data);
-
-typedef struct ListBaseIterator {
-	Link *link;
-	int flag;
-	IteratorSkipFunc skip;
-} ListBaseIterator;
-
 void rna_iterator_listbase_begin(struct CollectionPropertyIterator *iter, struct ListBase *lb, IteratorSkipFunc skip);
 void rna_iterator_listbase_next(struct CollectionPropertyIterator *iter);
 void *rna_iterator_listbase_get(struct CollectionPropertyIterator *iter);
 void rna_iterator_listbase_end(struct CollectionPropertyIterator *iter);
 PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct ListBase *lb, int index);
 
-typedef struct ArrayIterator {
-	char *ptr;
-	char *endptr;  /* past the last valid pointer, only for comparisons, ignores skipped values */
-	void *free_ptr; /* will be freed if set */
-	int itemsize;
-
-	/* array length with no skip functions applied, 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list