Hi,

My parallel epa still shows up a black screen. Is there anything wrong with
my code? I looked hard for errors but couldn't find anything.I'll send you
my patch.

Thanks!


On Fri, Mar 18, 2016 at 3:06 AM Vasco Alexandre da Silva Costa <
vasco.co...@gmail.com> wrote:

> On Thu, Mar 17, 2016 at 7:54 PM, Vasco Alexandre da Silva Costa <
> vasco.co...@gmail.com> wrote:
>
>> On Thu, Mar 17, 2016 at 7:47 PM, Christopher Sean Morrison <
>> brl...@mac.com> wrote:
>>
>>>
>>>
>>> On Mar 17, 2016, at 05:33 AM, Param Hanji <param.catchch...@gmail.com>
>>> wrote:
>>>
>>> Great. I'm happy to help!
>>> Also is ehy running fine in OpenCL mode? My generated PNG is just a
>>> blank black screen with no figure. The terminal logs don't seem to indicate
>>> anything wrong. Maybe ehy_shot.cl has a bug?
>>>
>>>
>>> 1) Does that exact same ehy render correctly in non-OpenCL mode?
>>> 2) Does another primitive (e.g., an ell via mged> make ell ell) render
>>> correctly in OpenCL mode
>>>
>>
>> The problem is the material lighting code. The results are not the same.
>> In OpenCL mode it renders that ehy in a really dark color and you nearly
>> miss it. If you render the ehy in surface normals lighting mode (i.e. rt
>> -z1 -l2) the output is as expected here.
>>
>
> The problem was more complicated that I thought. It turns out the OpenCL
> code was calling the ehy normal computation routine more than once. It
> turns out that routine (ehy_norm) both depends on hit_vpriv to compute the
> proper normal, and clobbers hit_vpriv after normal computation to store
> some temporary value for later computation of curvatures.
> It just so happens that this only happened in the Full lighting mode.
>
> I put a fix for this on SVN trunk.
>
> --
> Vasco Alexandre da Silva Costa
> PhD in Computer Engineering (Computer Graphics)
> Instituto Superior Técnico/University of Lisbon, Portugal
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
> _______________________________________________
> BRL-CAD Developer mailing list
> brlcad-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/brlcad-devel
>
--- src/librt/librt_private.h	2016-03-15 13:28:31.225331492 +0530
+++ src/librt/librt_private.h	2016-03-15 14:14:31.773364136 +0530
@@ -194,7 +194,6 @@
 CLT_DECLARE_INTERFACE(sph);
 CLT_DECLARE_INTERFACE(ehy);
 CLT_DECLARE_INTERFACE(bot);
+CLT_DECLARE_INTERFACE(epa);
 
 extern size_t clt_bot_pack(struct bu_pool *pool, struct soltab *stp);
 #endif
--- src/librt/primitives/epa/epa.c	2016-03-07 09:20:47.247217894 +0530
+++ src/librt/primitives/epa/epa.c	2016-03-13 15:55:46.000000000 +0530
@@ -184,36 +184,6 @@
     { {'\0', '\0', '\0', '\0'}, 0, (char *)NULL, 0, BU_STRUCTPARSE_FUNC_NULL, NULL, NULL }
 };

+
+#ifdef USE_OPENCL
+/* largest data members first */
+struct clt_epa_specific {
+	cl_double epa_V[3];     /* vector to epa origin */
+	cl_double epa_Hunit[3]; /* unit H vector */
+	cl_double epa_SoR[16];  /* Scale(Rot(vect)) */
+	cl_double epa_invRoS[16];   /* invRot(Scale(vect)) */
+};
+
+size_t
+clt_epa_pack(struct bu_pool *pool, struct soltab *stp)
+{
+	struct epa_specific *epa =
+		(struct epa_specific *)stp->st_specific;
+	struct clt_epa_specific *args;
+
+	const size_t size = sizeof(*args);
+	args = (struct clt_epa_specific*)bu_pool_alloc(pool, 1, size);
+
+	VMOVE(args->epa_V, epa->epa_V);
+	VMOVE(args->epa_Hunit, epa->epa_Hunit);
+	MAT_COPY(args->epa_SoR, epa->epa_SoR);
+	MAT_COPY(args->epa_invRoS, epa->epa_invRoS);
+	return size;
+}
+
+#endif /* USE_OPENCL */
+
+
 /**
  * Create a bounding RPP for an epa
  */
--- src/librt/primitives/epa/epa_shot.cl	1970-01-01 05:30:00.000000000 +0530
+++ src/librt/primitives/epa/epa_shot.cl	2016-03-07 15:50:24.033081000 +0530
@@ -0,0 +1,139 @@
+#include "common.cl"
+
+
+/* hit_surfno is set to one of these */
+#define EPA_NORM_BODY	(1)		/* compute normal */
+#define EPA_NORM_TOP	(2)		/* copy epa_N */
+
+
+struct epa_specific {
+	double epa_V[3];		// vector to epa origin
+	double epa_Hunit[3];	// unit H vector
+	double epa_SoR[16];		// Scale(Rot(vect))
+	double epa_invRoS[16];	// invRot(Scale(vect))
+};
+
+int epa_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct epa_specific *epa)
+{
+	double3 dp;			// D'
+	double3 pp;			// P'
+	double k1, k2;		// distance constants of solution
+	double3 xlated;		// translated vector
+	struct hit hits[3];	// 2 potential hit points
+	struct hit *hitp;	// pointer to hit point
+
+	hitp = &hits[0];
+
+	dp = MAT4X3VEC(epa->epa_SoR, r_dir);
+	xlated = r_pt - vload3(0, epa->epa_V);
+	pp = MAT4X3VEC(epa->epa_SoR, xlated);
+
+	// Find roots of the equation
+	double a, b, c;		//coeffs of polynomial
+	double disc;		// disc of radical
+
+	a = dp.x * dp.x + dp.y * dp.y;
+	b = 2 * (dp.x * pp.x + dp.y * pp.y)
+	    - dp.z;
+	c = pp.x * pp.x
+	    + pp.y * pp.y - pp.z - 1.0;
+	if (!NEAR_ZERO(a, RT_PCOEF_TOL)) {
+		disc = b*b - 4 * a * c;
+		if (disc > 0.0) {
+			disc = sqrt(disc);
+
+			k1 = (-b + disc) / (2.0 * a);
+			k2 = (-b - disc) / (2.0 * a);
+
+			/* k1 and k2 are potential solutions to intersection with
+			* side.  See if they fall in range.
+			*/
+			hitp->hit_vpriv = pp + k1 * dp;		// hit'
+			if (hitp->hit_vpriv.z <= 0.0) {
+				hitp->hit_dist = k1;
+				hitp->hit_surfno = EPA_NORM_BODY;	// compute N
+				hitp++;
+			}
+
+			hitp->hit_vpriv = pp + k2 * dp;		// hit'
+			if (hitp->hit_vpriv.z <= 0.0) {
+				hitp->hit_dist = k2;
+				hitp->hit_surfno = EPA_NORM_BODY;	// compute N
+				hitp++;
+			}
+		}
+	} else if (!NEAR_ZERO(b, RT_PCOEF_TOL)) {
+		k1 = -c/b;
+		hitp->hit_vpriv = pp + k1 * dp;		// hit'
+		if (hitp->hit_vpriv.z <= 0.0) {
+			hitp->hit_dist = k1;
+			hitp->hit_surfno = EPA_NORM_BODY;	// compute N
+			hitp++;
+		}
+	}
+
+	/*
+	* Check for hitting the top plate.
+	*/
+	/* check top plate */
+	if (hitp == &hits[1]  &&  !ZERO(dp.z)) {
+		// 1 hit so far, this is worthwhile
+		k1 = -pp.z / dp.z;		// top plate
+		hitp->hit_vpriv = pp + k1 * dp;		//hit'
+		if (hitp->hit_vpriv.x * hitp->hit_vpriv.x +
+		    hitp->hit_vpriv.y * hitp->hit_vpriv.y <= 1.0) {
+			hitp->hit_dist = k1;
+			hitp->hit_surfno = EPA_NORM_TOP;	// -H
+			hitp++;
+		}
+	}
+
+	if (hitp != &hits[2]) {
+		return 0;	// MISS
+	}
+
+	if (hits[0].hit_dist < hits[1].hit_dist) {
+		// entry is [0], exit is [1]
+		do_segp(res, idx, &hits[0], &hits[1]);
+	} else {
+		/* entry is [1], exit is [0] */
+		do_segp(res, idx, &hits[1], &hits[0]);
+	}
+	return 2;	// HIT
+}
+
+
+void epa_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct epa_specific *epa)
+{
+	double scale;
+	double3 can_normal;	// normal to canonical epa
+
+	hitp->hit_point = r_pt + hitp->hit_dist * r_dir;
+	switch (hitp->hit_surfno) {
+	case EPA_NORM_BODY:
+		can_normal = (double3){
+			hitp->hit_vpriv.x,
+			hitp->hit_vpriv.y,
+			-0.5};
+		hitp->hit_normal = MAT4X3VEC(epa->epa_invRoS, can_normal);
+		scale = 1.0 / length(hitp->hit_normal);
+		hitp->hit_normal = hitp->hit_normal * scale;
+
+		// tuck away this scale for the curvature routine
+		hitp->hit_vpriv.x = scale;
+		break;
+	case EPA_NORM_TOP:
+		hitp->hit_normal = -vload3(0, epa->epa_Hunit);
+	}
+}
+
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
--- src/librt/primitives/common.cl	2016-03-18 10:44:20.698417413 +0530
+++ src/librt/primitives/common.cl	2016-03-18 10:42:34.102416153 +0530
@@ -114,7 +114,6 @@
 struct arb_specific;
 struct ehy_specific;
 struct ell_specific;
+struct epa_specific;
 struct rec_specific;
 struct sph_specific;
 struct tgc_specific;
@@ -124,7 +123,6 @@
 extern int bot_shot(RESULT_TYPE *res, const double3 r_pt, double3 r_dir, const uint idx, global const uchar *args);
 extern int ehy_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct ehy_specific *ehy);
 extern int ell_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct ell_specific *ell);
+extern int epa_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct epa_specific *epa);
 extern int rec_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct rec_specific *rec);
 extern int sph_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct sph_specific *sph);
 extern int tgc_shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, global const struct tgc_specific *tgc);
@@ -134,7 +132,6 @@
 extern void bot_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const uchar *args);
 extern void ehy_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct ehy_specific *ehy);
 extern void ell_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct ell_specific *ell);
+extern void epa_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct epa_specific *epa);
 extern void rec_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct rec_specific *rec);
 extern void sph_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct sph_specific *sph);
 extern void tgc_norm(struct hit *hitp, const double3 r_pt, const double3 r_dir, global const struct tgc_specific *tgc);
--- src/librt/primitives/primitive_util.c	2016-03-14 00:46:27.267504655 +0530
+++ src/librt/primitives/primitive_util.c	2016-03-07 16:55:13.917226000 +0530
@@ -588,6 +588,7 @@
             "bot_shot.cl",
             "ehy_shot.cl",
             "ell_shot.cl",
+            "epa_shot.cl",
             "sph_shot.cl",
             "rec_shot.cl",
             "tgc_shot.cl",
@@ -643,6 +644,7 @@
 	case ID_EHY:    size = clt_ehy_pack(pool, stp);	break;
 	case ID_ARS:
 	case ID_BOT:    size = clt_bot_pack(pool, stp);	break;
+	case ID_EPA:    size = clt_epa_pack(pool, stp); break;
 	default:	size = 0;			break;
     }
     return size;
--- src/librt/primitives/rt.cl	2016-03-14 00:46:28.399504669 +0530
+++ src/librt/primitives/rt.cl	2016-03-07 16:54:28.213225000 +0530
@@ -91,6 +91,7 @@
 #define ID_SPH          10      /**< @brief Sphere */
 #define ID_EHY          20      /**< @brief Elliptical Hyperboloid  */
 #define ID_BOT          30      /**< @brief Bag o' triangles */
+#define ID_EPA          40      /**< @brief Elliptical Paraboloid */
 
 
 inline int shot(RESULT_TYPE *res, const double3 r_pt, const double3 r_dir, const uint idx, const int id, global const void *args)
@@ -105,6 +106,7 @@
	case ID_EHY:	return ehy_shot(res, r_pt, r_dir, idx, args);
	case ID_ARS:
	case ID_BOT:	return bot_shot(res, r_pt, r_dir, idx, args);
+	case ID_EPA:	return epa_shot(res, r_pt, r_dir, idx, args);
	default:		return 0;
	};
 }
@@ -121,6 +123,7 @@
	case ID_SPH:	sph_norm(hitp, r_pt, r_dir, args);	break;
	case ID_ARS:
	case ID_BOT:	bot_norm(hitp, r_pt, r_dir, args);	break;
+	case ID_EPA:	epa_norm(hitp, r_pt, r_dir, args);	break;
	default:							break;
	};
 }
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
BRL-CAD Developer mailing list
brlcad-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-devel

Reply via email to