Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1124 - in trunk: Engine/Display Image Interface scenes


Chronological Thread 
  • From: no_author@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1124 - in trunk: Engine/Display Image Interface scenes
  • Date: Tue, 20 Jun 2006 16:05:03 -0600 (MDT)

Author: None
Date: Tue Jun 20 16:05:02 2006
New Revision: 1124

Modified:
   trunk/Engine/Display/PureOpenGLDisplay.cc
   trunk/Image/SimpleImage.h
   trunk/Image/SimpleImage_special.cc
   trunk/Interface/RayPacket.h
   trunk/scenes/objviewer.cc
Log:

Engine/Display/PureOpenGLDisplay.cc

  Added options to print out which function actually drew the picture
  when doing verbose mode.

  Removed an unneeded gl_print_error in the middle of the
  drawImage_pbo function.

  Added support for floating point textures.

Image/SimpleImage.h
Image/SimpleImage_special.cc

  Added specialization for SimpleImage<RGBAfloatPixel>::set using SSE.

Interface/RayPacket.h

  Fixed computation of inverseDirection using SSE.  The previous code
  didn't take into consideration when ray packet sizes were not a
  multiple of 4 or aligned on 16 byte boundaries.

scenes/objviewer.cc

  Added LinearGroup_Build which puts the triangles in a Group without
  an acceleration structure.


Modified: trunk/Engine/Display/PureOpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/PureOpenGLDisplay.cc   (original)
+++ trunk/Engine/Display/PureOpenGLDisplay.cc   Tue Jun 20 16:05:02 2006
@@ -323,10 +323,13 @@
 
   if(mode == "pbo" && drawImage_pbo(image)){
     // Drawn by texture...
+    if (verbose) cerr << "pbo mode drew it\n";
   } else if (mode == "texture" && drawImage_texture(image)) {
     // Drawn by pbo...
+    if (verbose) cerr << "texture mode drew it\n";
   } else if(drawImage_pixels(image)){
     // Drawn by pixels...
+    if (verbose) cerr << "image mode drew it\n";
   } else {
       throw InternalError("Unknown image type in OpenGLDisplay",
                           __FILE__, __LINE__);
@@ -502,8 +505,6 @@
   glDisable(GL_TEXTURE_2D);
   glEnable(GL_TEXTURE_RECTANGLE_EXT);
 
-  gl_print_error(__FILE__,__LINE__);
-
   GLenum format;
   GLenum type;
   bool have_alpha;
@@ -691,6 +692,12 @@
   } else if(typeid(*image) == typeid(SimpleImage<BGRA8Pixel>)){
     format = GL_BGRA;
     type = big_endian? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV;
+  } else if(typeid(*image) == typeid(SimpleImage<RGBAfloatPixel>)){
+    format = GL_RGBA;
+    type = GL_FLOAT;
+  } else if(typeid(*image) == typeid(SimpleImage<RGBfloatPixel>)){
+    format = GL_RGB;
+    type = GL_FLOAT;
   } else {
     return false;
   }

Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h   (original)
+++ trunk/Image/SimpleImage.h   Tue Jun 20 16:05:02 2006
@@ -132,6 +132,9 @@
   template<>
     void SimpleImage<RGBA8Pixel>::set(const Fragment& fragment);
 
+  template<>
+    void SimpleImage<RGBAfloatPixel>::set(const Fragment& fragment);
+
   template<class Pixel>
   void SimpleImage<Pixel>::get(Fragment& fragment) const
   {

Modified: trunk/Image/SimpleImage_special.cc
==============================================================================
--- trunk/Image/SimpleImage_special.cc  (original)
+++ trunk/Image/SimpleImage_special.cc  Tue Jun 20 16:05:02 2006
@@ -142,31 +142,92 @@
         __m128i g32 = _mm_cvttps_epi32(g); // 32 bits: g0g1g2g3
         __m128i b32 = _mm_cvttps_epi32(b); // 32 bits: b0b1b2b3
 
-        // 16 bits: b0b1b2b3r0r1r2r3
+        // 16 bits: r0r1r2r3b0b1b2b3
         __m128i rb16 = _mm_packs_epi32(r32, b32);
 
         // 16 bits: g0g1g2g3a0a1a2a3
         __m128i ga16 = _mm_packs_epi32(g32, alpha);
 
-        // 16 bits: b0g0b1g1b2g2b3g3
+        // 16 bits: r0g0r1g1r2g2r3g3
         __m128i rg16 = _mm_unpacklo_epi16(rb16, ga16);
 
-        // 16 bits: r0a0r1a1r2a2r3a3
+        // 16 bits: b0a0b1a1b2a2b3a3
         __m128i ba16 = _mm_unpackhi_epi16(rb16, ga16);
 
-        // 16 bits: b0g0r0a0b1g1r1a1
+        // 16 bits: r0g0b0a0r1g1b1a1
         __m128i rgba16a = _mm_unpacklo_epi32(rg16, ba16);
 
-        // 16 bits: b2g2r2a2b3g3r3a3
+        // 16 bits: r2g2b2a2r3g3b3a3
         __m128i rgba16b = _mm_unpackhi_epi32(rg16, ba16);
 
-        // 32 bits: b0g0r0a0 ... b3g3r3a3
+        // 32 bits: r0g0b0a0 ... r3g3b3a3
         __m128i result = _mm_packus_epi16(rgba16a, rgba16b);
 
         // Copy data over
         _mm_stream_si128((__m128i*)pix, result);
 
         pix += 4;
+      }
+    } else
+#endif /* MANTA_SSE */
+    {
+      for(int i=fragment.begin(); i< fragment.end();i++)
+        convertToPixel(*pix++, fragment.getColor(i).convertRGB());
+    }
+  } else {
+    for(int i=fragment.begin();i<fragment.end();i++){
+      
convertToPixel(eyeStart[fragment.getWhichEye(i)][fragment.getY(i)][fragment.getX(i)],
 fragment.getColor(i).convertRGB());
+    }
+  }
+}
+
+// vec_a  = a[0], a[1], a[2], a[3]
+// vec_b  = b[0], b[1], b[2], b[3]
+// Result = a[f0],a[f1],b[f2],b[f3]
+#define swizzle4(vec_a, vec_b, f0, f1, f2, f3) \
+  _mm_shuffle_ps( (vec_a), (vec_b), _MM_SHUFFLE(f3, f2, f1, f0) )
+
+template<>
+void SimpleImage<RGBAfloatPixel>::set(const Fragment& fragment)
+{
+  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
+     Fragment::ConsecutiveX|Fragment::ConstantEye){
+    int b = fragment.begin();
+    RGBAfloatPixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
+#if MANTA_SSE
+    float* fpix = reinterpret_cast<float*>(pix);
+    // If the fragment and the pixel are on an aligned boundary, use SSE
+    if(((fragment.pixelBegin | fragment.pixelEnd) & 0x3) == 0){
+      // Aligned for SSE
+      int f = fragment.end()-3;
+      for(int i=fragment.begin(); i< f;i+=4){
+        __m128 r = _mm_load_ps(&fragment.color[0][i]);
+        __m128 g = _mm_load_ps(&fragment.color[1][i]);
+        __m128 b = _mm_load_ps(&fragment.color[2][i]);
+        __m128 a = _mm_set_ps1(1.0f);  // alpha a0a1a2a3
+
+        // r0r1g0g1
+        __m128 rg01 = swizzle4(r, g, 0, 1, 0, 1);
+        // r2r3g2g3
+        __m128 rg23 = swizzle4(r, g, 2, 3, 2, 3);
+        // b0b1a0a1
+        __m128 ba01 = swizzle4(b, a, 0, 1, 0, 1);
+        // b2b3a2a3
+        __m128 ba23 = swizzle4(b, a, 2, 3, 2, 3);
+
+        // r0g0b0g0...
+        __m128 p0 = swizzle4(rg01, ba01, 0, 2, 0, 2);
+        __m128 p1 = swizzle4(rg01, ba01, 1, 3, 1, 3);
+        __m128 p2 = swizzle4(rg23, ba23, 0, 2, 0, 2);
+        __m128 p3 = swizzle4(rg23, ba23, 1, 3, 1, 3);
+
+        // Copy data over
+        _mm_stream_ps(fpix,    p0);
+        _mm_stream_ps(fpix+4,  p1);
+        _mm_stream_ps(fpix+8,  p2);
+        _mm_stream_ps(fpix+12, p3);
+
+        fpix += 16;
       }
     } else
 #endif /* MANTA_SSE */

Modified: trunk/Interface/RayPacket.h
==============================================================================
--- trunk/Interface/RayPacket.h (original)
+++ trunk/Interface/RayPacket.h Tue Jun 20 16:05:02 2006
@@ -19,7 +19,7 @@
 #endif
 
 // #include <sgi_stl_warnings_off.h>
-// #include <algorithm>
+// #include <iostream>
 // #include <sgi_stl_warnings_on.h>
 
 namespace Manta {
@@ -293,18 +293,31 @@
 #if MANTA_SSE
       int b = (rayBegin + 3) & (~3);
       int e = rayEnd & (~3);
-#pragma unroll(3)
-      for(int j=0; j<3; j++)
-      {
-        sse_t* dirs = (sse_t*)data->direction[j];
-        sse_t* inv_dirs = (sse_t*)data->inverseDirection[j];
-        for(int smd=b; smd<e; smd++)
-          inv_dirs[smd] = oneOver(dirs[smd]);
+      if (b == e) {
+        for(int i=rayBegin;i<rayEnd;i++)
+          for(int j=0;j<3;j++)
+            data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
+      } else {
+        int i = rayBegin;
+        // Do the non aligned in front
+        for(;i<b;++i)
+          for(int j=0;j<3;j++)
+            data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
+        // Do the aligned in the middle
+        for(;i<e;i+=4)
+          for(int j=0;j<3;j++) {
+            _mm_store_ps(&data->inverseDirection[j][i],
+                         oneOver(_mm_load_ps(&data->direction[j][i])));
+          }
+        // Do the non aligned in end
+        for(;i<rayEnd;++i)
+          for(int j=0;j<3;j++)
+            data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
       }
 #else
       for(int i=rayBegin;i<rayEnd;i++)
         for(int j=0;j<3;j++)
-          data->inverseDirection[j][i] = 1./data->direction[j][i];
+          data->inverseDirection[j][i] = (Real)1/data->direction[j][i];
 #endif
       flags |= HaveInverseDirections;
     }

Modified: trunk/scenes/objviewer.cc
==============================================================================
--- trunk/scenes/objviewer.cc   (original)
+++ trunk/scenes/objviewer.cc   Tue Jun 20 16:05:02 2006
@@ -108,10 +108,11 @@
     RealisticBvh_Build,
     DynBVH_Build,
     BVH_Build,
-    GriddedGroup_Build
+    GriddedGroup_Build,
+    LinearGroup_Build
 };
 int  which_BVH           = RealisticBvh_Build;
-vector<string> BVH_args;
+vector<string> build_args;
 
 ///////////////////////////////////////////////////////////////////////////
 // This function loads a specified .obj file into a runtime acceleration
@@ -161,8 +162,12 @@
             if (!getStringArg(i, args, build))
                 throw IllegalArgument("objviewer -bvh_build 
<type:naive,table>",
                                       i, args);
-            BVH_args.push_back("-build");
-            BVH_args.push_back(build);
+            build_args.push_back("-build");
+            build_args.push_back(build);
+        }
+        else if (args[i] == "-linear" || args[i] == "-flatgroup") {
+            std::cout << "Doing Linear Group build\n";
+            which_BVH = LinearGroup_Build;
         }
         else if (args[i] == "-nocentering") {
             center_object = false;
@@ -431,7 +436,7 @@
         bvh_group = new DynBVH();
         break;
     case BVH_Build:
-        bvh_group = new BVH(BVH_args);
+        bvh_group = new BVH(build_args);
         break;
     case GriddedGroup_Build:
       {
@@ -441,6 +446,9 @@
         bvh_group = new GriddedGroup(args);
       }
       break;
+    case LinearGroup_Build:
+        bvh_group = new Group(build_args);
+        break;
     }
 
     create_materials( model );
@@ -528,6 +536,7 @@
             case DynBVH_Build:
             case BVH_Build:
             case GriddedGroup_Build:
+            case LinearGroup_Build:
                 // these cases just add
                 bvh_group->add(triangle);
                 break;
@@ -562,6 +571,7 @@
     case DynBVH_Build:
     case BVH_Build:
     case GriddedGroup_Build:
+    case LinearGroup_Build:
         bvh = bvh_group;
         // Preprocesing will be done during the preprocessing phase
         break;





Archive powered by MHonArc 2.6.16.

Top of page