[Bf-blender-cvs] [494c180] ui-preview-buttons: changes for over-allocation

Campbell Barton noreply at git.blender.org
Sun May 10 12:31:20 CEST 2015


Commit: 494c180af9856e27a6c9ac9e7074571ad25c59bd
Author: Campbell Barton
Date:   Sun May 10 20:18:53 2015 +1000
Branches: ui-preview-buttons
https://developer.blender.org/rB494c180af9856e27a6c9ac9e7074571ad25c59bd

changes for over-allocation

use more conventional `pointer + 1` to access over alloc data.
Was confusing having 2 byte trailing member of struct.

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

M	source/blender/blenkernel/intern/icons.c
M	source/blender/editors/render/render_preview.c
M	source/blender/makesdna/DNA_ID.h

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

diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 1656869..9971afe 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -131,17 +131,15 @@ void BKE_icons_free(void)
 	}
 }
 
-static PreviewImage *previewimg_create_ex(void *deferred_data, size_t deferred_data_size)
+static PreviewImage *previewimg_create_ex(size_t deferred_data_size)
 {
 	PreviewImage *prv_img = NULL;
-	size_t overalloc = (deferred_data_size > sizeof(prv_img->deferred_data)) ?
-	                       deferred_data_size - sizeof(prv_img->deferred_data) : 0;
 	int i;
 
-	prv_img = MEM_callocN(sizeof(PreviewImage) + overalloc, "img_prv");
+	prv_img = MEM_mallocN(sizeof(PreviewImage) + deferred_data_size, "img_prv");
+	memset(prv_img, 0, sizeof(*prv_img));  /* leave deferred data dirty */
 
-	if (deferred_data) {
-		memcpy(prv_img->deferred_data, deferred_data, deferred_data_size);
+	if (deferred_data_size) {
 		prv_img->use_deferred = true;
 	}
 
@@ -154,7 +152,7 @@ static PreviewImage *previewimg_create_ex(void *deferred_data, size_t deferred_d
 
 PreviewImage *BKE_previewimg_create(void)
 {
-	return previewimg_create_ex(NULL, 0);
+	return previewimg_create_ex(0);
 }
 
 void BKE_previewimg_freefunc(void *link)
@@ -327,7 +325,8 @@ PreviewImage *BKE_previewimg_cached_thumbnail_get(
 	}
 
 	if (prv && force_update) {
-		if (((int)prv->deferred_data[0] == source) && STREQ(&prv->deferred_data[1], path)) {
+		const char *prv_deferred_data = PRV_DEFERRED_DATA(prv);
+		if (((int)prv_deferred_data[0] == source) && STREQ(&prv_deferred_data[1], path)) {
 			/* If same path, no need to re-allocate preview, just clear it up. */
 			BKE_previewimg_clear(prv, ICON_SIZE_ICON);
 			BKE_previewimg_clear(prv, ICON_SIZE_PREVIEW);
@@ -339,16 +338,15 @@ PreviewImage *BKE_previewimg_cached_thumbnail_get(
 
 	if (!prv) {
 		/* We pack needed data for lazy loading (source type, in a single char, and path). */
-		size_t defdata_size = strlen(path) + 2;
-		char *defdata = MEM_mallocN(defdata_size, __func__);
+		const size_t deferred_data_size = strlen(path) + 2;
+		char *deferred_data;
 
-		defdata[0] = (char)source;
-		strcpy(&defdata[1], path);
+		prv = previewimg_create_ex(deferred_data_size);
+		deferred_data = PRV_DEFERRED_DATA(prv);
+		deferred_data[0] = source;
+		memcpy(&deferred_data[1], path, deferred_data_size - 1);
 
-		prv = previewimg_create_ex((void *)defdata, defdata_size);
 		force_update = true;
-
-		MEM_freeN(defdata);
 	}
 
 	if (force_update) {
@@ -385,8 +383,9 @@ void BKE_previewimg_ensure(PreviewImage *prv, const int size)
 
 		if (do_icon || do_preview) {
 			ImBuf *thumb;
-			int source = (int)prv->deferred_data[0];
-			char *path = &prv->deferred_data[1];
+			char *prv_deferred_data = PRV_DEFERRED_DATA(prv);
+			int source =  prv_deferred_data[0];
+			char *path = &prv_deferred_data[1];
 			int icon_w, icon_h;
 
 			thumb = IMB_thumb_manage(path, THB_LARGE, source);
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index f3302a9..26d0519 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -939,8 +939,9 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
 	if (sp->pr_method == PR_ICON_DEFERRED) {
 		PreviewImage *prv = sp->owner;
 		ImBuf *thumb;
-		int source = (int)prv->deferred_data[0];
-		char *path = &prv->deferred_data[1];
+		char *deferred_data = PRV_DEFERRED_DATA(prv);
+		int source =  deferred_data[0];
+		char *path = &deferred_data[1];
 
 //		printf("generating deferred %d×%d preview for %s\n", sp->sizex, sp->sizey, path);
 
@@ -1064,7 +1065,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short
 	while (cur_size) {
 		PreviewImage *prv = ip->owner;
 		ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview");
-		const bool is_render = !prv->deferred_data;
+		const bool is_render = !prv->use_deferred;
 
 		/* construct shader preview from image size and previewcustomdata */
 		sp->scene = ip->scene;
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 8513938..ec169d3 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -178,10 +178,13 @@ typedef struct PreviewImage {
 	struct GPUTexture *gputexture[2];
 	int icon_id;  /* Used by previews outside of ID context. */
 
-	short use_deferred;  /* for now a mere bool, if we add more deferred loading methods we can switch to bitflag. */
-	char deferred_data[2];  /* *must* remain the last one, used as over-allocated mem storage. */
+	char pad[3];
+	char use_deferred;  /* for now a mere bool, if we add more deferred loading methods we can switch to bitflag. */
 } PreviewImage;
 
+#define PRV_DEFERRED_DATA(prv) \
+	(CHECK_TYPE_INLINE(prv, PreviewImage *), (void *)((prv) + 1))
+
 /**
  * Defines for working with IDs.
  *




More information about the Bf-blender-cvs mailing list