Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1957 - trunk/Model/Groups


Chronological Thread 
  • From: sparker@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1957 - trunk/Model/Groups
  • Date: Sun, 30 Dec 2007 23:54:44 -0700 (MST)

Author: sparker
Date: Sun Dec 30 23:54:40 2007
New Revision: 1957

Modified:
   trunk/Model/Groups/DynBVH.cc
Log:
10-15% speedup by using scalar sse for firstHit


Modified: trunk/Model/Groups/DynBVH.cc
==============================================================================
--- trunk/Model/Groups/DynBVH.cc        (original)
+++ trunk/Model/Groups/DynBVH.cc        Sun Dec 30 23:54:40 2007
@@ -144,6 +144,7 @@
 
     {
       // Try first hit as scalar
+#if 0
       float tmin = 1e-5f;
       float tmax = rays.getMinT(i);
 
@@ -160,6 +161,36 @@
         *out_tmin = tmin;
         return i;
       }
+#else
+      __m128 t00 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[0][0]), 
_mm_set_ss(rays.getOrigin(i, 0))),
+                              _mm_set_ss(rays.getInverseDirection(i, 0)));
+      __m128 t01 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[1][0]), 
_mm_set_ss(rays.getOrigin(i, 0))),
+                              _mm_set_ss(rays.getInverseDirection(i, 0)));
+      __m128 tmin0 = _mm_max_ss(_mm_min_ss(t00, t01), _mm_set_ss(T_EPSILON));
+      __m128 tmax0 = _mm_min_ss(_mm_max_ss(t00, t01), 
_mm_set_ss(rays.getMinT(i)));
+
+      __m128 t10 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[0][1]), 
_mm_set_ss(rays.getOrigin(i, 1))),
+                              _mm_set_ss(rays.getInverseDirection(i, 1)));
+      __m128 t11 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[1][1]), 
_mm_set_ss(rays.getOrigin(i, 1))),
+                              _mm_set_ss(rays.getInverseDirection(i, 1)));
+      __m128 tmin1 = _mm_max_ss(_mm_min_ss(t10, t11), tmin0);
+      __m128 tmax1 = _mm_min_ss(_mm_max_ss(t10, t11), tmax0);
+
+      __m128 t20 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[0][2]), 
_mm_set_ss(rays.getOrigin(i, 2))),
+                              _mm_set_ss(rays.getInverseDirection(i, 2)));
+      __m128 t21 = _mm_mul_ss(_mm_sub_ss(_mm_set_ss(box[1][2]), 
_mm_set_ss(rays.getOrigin(i, 2))),
+                              _mm_set_ss(rays.getInverseDirection(i, 2)));
+      __m128 tmin2 = _mm_max_ss(_mm_min_ss(t20, t21), tmin1);
+      __m128 tmax2 = _mm_min_ss(_mm_max_ss(t20, t21), tmax1);
+
+      float tmin, tmax;
+      _mm_store_ss(&tmin, tmin2);
+      _mm_store_ss(&tmax, tmax2);
+      if(tmin < tmax){
+        *out_tmin = tmin;
+        return i;
+      }
+#endif
     }
 
     // try a frustum miss




  • [Manta] r1957 - trunk/Model/Groups, sparker, 12/31/2007

Archive powered by MHonArc 2.6.16.

Top of page