[Rawstudio-commit] r3003 - branches/rawstudio-ng-color/plugins/dcp

Klaus Post klauspost at gmail.com
Sat Jan 16 11:02:08 CET 2010


Author: post
Date: 2010-01-16 11:02:07 +0100 (Sat, 16 Jan 2010)
New Revision: 3003

Modified:
   branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c
   branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c
   branches/rawstudio-ng-color/plugins/dcp/dcp.c
   branches/rawstudio-ng-color/plugins/dcp/dcp.h
Log:
DCP: Allocate aligned precalc tables ourselves, 32 bit GCC 4.3 doesn't always respect aligned struct members.

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c	2010-01-16 08:28:00 UTC (rev 3002)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp-sse2.c	2010-01-16 10:02:07 UTC (rev 3003)
@@ -199,7 +199,6 @@
 
 /* SSE2 implementation, matches the reference implementation pretty closely */
 
-
 void 
 calc_hsm_constants(const RSHuesatMap *map, PrecalcHSM* table) 
 {
@@ -662,7 +661,7 @@
 
 			if (dcp->huesatmap)
 			{
-				huesat_map_SSE2(dcp->huesatmap, &dcp->huesatmap_precalc, &h, &s, &v);
+				huesat_map_SSE2(dcp->huesatmap, dcp->huesatmap_precalc, &h, &s, &v);
 			}
 
 			/* Saturation */
@@ -771,7 +770,7 @@
 
 			/* Apply looktable */
 			if (dcp->looktable) {
-				huesat_map_SSE2(dcp->looktable, &dcp->looktable_precalc, &h, &s, &v);
+				huesat_map_SSE2(dcp->looktable, dcp->looktable_precalc, &h, &s, &v);
 			}
 			
 			/* Ensure that hue is within range */

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c	2010-01-16 08:28:00 UTC (rev 3002)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp-sse4.c	2010-01-16 10:02:07 UTC (rev 3003)
@@ -590,7 +590,7 @@
 
 			if (dcp->huesatmap)
 			{
-				huesat_map_SSE4(dcp->huesatmap, &dcp->huesatmap_precalc, &h, &s, &v);
+				huesat_map_SSE4(dcp->huesatmap, dcp->huesatmap_precalc, &h, &s, &v);
 			}
 
 			/* Saturation */
@@ -689,7 +689,7 @@
 
 			/* Apply looktable */
 			if (dcp->looktable) {
-				huesat_map_SSE4(dcp->looktable, &dcp->looktable_precalc, &h, &s, &v);
+				huesat_map_SSE4(dcp->looktable, dcp->looktable_precalc, &h, &s, &v);
 			}
 			
 			/* Ensure that hue is within range */	

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp.c
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp.c	2010-01-16 08:28:00 UTC (rev 3002)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp.c	2010-01-16 10:02:07 UTC (rev 3003)
@@ -57,6 +57,8 @@
 	RSDcp *dcp = RS_DCP(object);
 
 	g_free(dcp->curve_samples);
+	g_free(dcp->_huesatmap_precalc_unaligned);
+	g_free(dcp->_looktable_precalc_unaligned);
 
 	free_dcp_profile(dcp);	
 }
@@ -231,6 +233,8 @@
 	dcp->use_profile = FALSE;
 }
 
+#define ALIGNTO16(PTR) ((guintptr)PTR + ((16 - ((guintptr)PTR % 16)) % 16))
+
 static void
 rs_dcp_init(RSDcp *dcp)
 {
@@ -248,8 +252,17 @@
 	 * be loaded yet at that time :( */
 	if (!klass->prophoto)
 		klass->prophoto = rs_color_space_new_singleton("RSProphoto");
+
+	/* Allocate aligned precalc tables */
+	dcp->_huesatmap_precalc_unaligned = g_malloc(sizeof(PrecalcHSM)+16);
+	dcp->_looktable_precalc_unaligned = g_malloc(sizeof(PrecalcHSM)+16);
+	dcp->huesatmap_precalc = (PrecalcHSM*)ALIGNTO16(dcp->_huesatmap_precalc_unaligned);
+	dcp->looktable_precalc = (PrecalcHSM*)ALIGNTO16(dcp->_looktable_precalc_unaligned);
+	
 }
 
+#undef ALIGNTO16
+
 static void
 init_exposure(RSDcp *dcp)
 {
@@ -1050,9 +1063,9 @@
 	/* Camera to ProPhoto */
 	matrix3_multiply(&xyz_to_prophoto, &dcp->camera_to_pcs, &dcp->camera_to_prophoto); /* verified by SDK */
 	if (dcp->huesatmap)
-		calc_hsm_constants(dcp->huesatmap, &dcp->huesatmap_precalc); 
+		calc_hsm_constants(dcp->huesatmap, dcp->huesatmap_precalc); 
 	if (dcp->looktable)
-		calc_hsm_constants(dcp->looktable, &dcp->looktable_precalc); 
+		calc_hsm_constants(dcp->looktable, dcp->looktable_precalc); 
 	
 }
 

Modified: branches/rawstudio-ng-color/plugins/dcp/dcp.h
===================================================================
--- branches/rawstudio-ng-color/plugins/dcp/dcp.h	2010-01-16 08:28:00 UTC (rev 3002)
+++ branches/rawstudio-ng-color/plugins/dcp/dcp.h	2010-01-16 10:02:07 UTC (rev 3003)
@@ -32,15 +32,15 @@
 typedef struct _RSDcpClass RSDcpClass;
 
 typedef struct {
-	/* Precalc: */
-	gfloat hScale[4] __attribute__ ((aligned (16)));
-	gfloat sScale[4] __attribute__ ((aligned (16)));
-	gfloat vScale[4] __attribute__ ((aligned (16)));
-	gint maxHueIndex0[4] __attribute__ ((aligned (16)));
-	gint maxSatIndex0[4] __attribute__ ((aligned (16)));
-	gint maxValIndex0[4] __attribute__ ((aligned (16)));
-	gint hueStep[4] __attribute__ ((aligned (16)));
-	gint valStep[4] __attribute__ ((aligned (16)));
+	/* Precalc: all sizes must be 16 byte aligned */
+	gfloat hScale[4];
+	gfloat sScale[4];
+	gfloat vScale[4];
+	gint maxHueIndex0[4];
+	gint maxSatIndex0[4];
+	gint maxValIndex0[4];
+	gint hueStep[4];
+	gint valStep[4];
 } PrecalcHSM;
 
 
@@ -97,8 +97,10 @@
 	gfloat exposure_radius;
 	gfloat exposure_qscale;
 
-	PrecalcHSM huesatmap_precalc;
-	PrecalcHSM looktable_precalc;
+	PrecalcHSM *huesatmap_precalc;
+	PrecalcHSM *looktable_precalc;
+	void* _huesatmap_precalc_unaligned;
+	void* _looktable_precalc_unaligned;
 };
 
 struct _RSDcpClass {




More information about the Rawstudio-commit mailing list