Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1163 - in trunk: Engine/ImageTraversers Engine/PixelSamplers Image


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1163 - in trunk: Engine/ImageTraversers Engine/PixelSamplers Image
  • Date: Thu, 10 Aug 2006 11:11:32 -0600 (MDT)

Author: boulos
Date: Thu Aug 10 11:11:30 2006
New Revision: 1163

Modified:
   trunk/Engine/ImageTraversers/TiledImageTraverser.cc
   trunk/Engine/ImageTraversers/TiledImageTraverser.h
   trunk/Engine/PixelSamplers/FastSampler.cc
   trunk/Engine/PixelSamplers/SingleSampler.cc
   trunk/Image/SimpleImage.h
   trunk/Image/SimpleImage_special.cc
Log:
Adding SquareShape Fragment as a possible output
for the TiledImageTraverser.

Fixing fragment.getFlag bugs in SimpleImage and 
the Samplers (this should be complete code 
coverage).


Modified: trunk/Engine/ImageTraversers/TiledImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/TiledImageTraverser.cc (original)
+++ trunk/Engine/ImageTraversers/TiledImageTraverser.cc Thu Aug 10 11:11:30 
2006
@@ -38,6 +38,7 @@
 #include <Interface/Image.h>
 #include <Interface/LoadBalancer.h>
 #include <Interface/PixelSampler.h>
+#include <Interface/RayPacket.h> // for maxsize
 #include <MantaSSE.h>
 
 using namespace Manta;
@@ -51,12 +52,21 @@
 {
   xtilesize = Fragment::MaxSize;
   ytilesize = Fragment::MaxSize;
+  shape = Fragment::LineShape;
   int argc = static_cast<int>(args.size());
   for(int i = 0; i<argc;i++){
     string arg = args[i];
     if(arg == "-tilesize"){
       if(!getResolutionArg(i, args, xtilesize, ytilesize))
         throw IllegalArgument("TiledImageTraverser -tilesize", i, args);
+    } else if (arg == "-square") {
+/*
+        int sqrt_size = static_cast<int>(sqrt(RayPacket::MaxSize));
+        if (sqrt_size * sqrt_size != RayPacket::MaxSize)
+            throw IllegalArgument("TiledImageTraverser -square 
(RayPacket::MaxSize is not square",
+                                  i, args);
+*/
+        shape = Fragment::SquareShape;
     } else {
       throw IllegalArgument("TiledImageTraverser", i, args);
     }
@@ -106,12 +116,12 @@
   int xres, yres;
   image->getResolution(stereo, xres, yres);
   int numEyes = stereo?2:1;
-  
+
   int s,e;
   while(context.loadBalancer->getNextAssignment(context, s, e)){
 
     for(int assignment = s; assignment < e; assignment++){
-      
+
       int xtile = assignment/ytiles;
       int ytile = assignment%ytiles;
       int xstart = xtile * xtilesize;
@@ -125,95 +135,139 @@
 
       if(yend > yres)
         yend = yres;
-      
+
 #ifdef MANTA_SSE
       __m128i vec_4 = _mm_set1_epi32(4);
       __m128i vec_cascade = _mm_set_epi32(3, 2, 1, 0);
 #endif
       // Create a Fragment that is consecutive in X pixels
-      Fragment frag(Fragment::LineShape, 
Fragment::ConsecutiveX|Fragment::ConstantEye);
-      int fsize = SCIRun::Min(Fragment::MaxSize, xend-xstart);
-      for(int eye = 0; eye < numEyes; eye++){
-#ifdef MANTA_SSE
-        // This finds the upper bound of the groups of 4.  Even if you
-        // write more than you need (say 8 for a fragment size of 6),
-        // you won't blow the top of the array, because
-        // (Fragment::MaxSize+3)&(~3) == Fragment::MaxSize.
-        int e = (fsize+3)&(~3);
-        __m128i vec_eye = _mm_set1_epi32(eye);
-        for(int i=0;i<e;i+=4)
-          _mm_store_si128((__m128i*)&frag.whichEye[i], vec_eye);
+      switch (shape) {
+      case Fragment::LineShape:
+      {
+          Fragment frag(Fragment::LineShape, 
Fragment::ConsecutiveX|Fragment::ConstantEye);
+
+          int fsize = SCIRun::Min(Fragment::MaxSize, xend-xstart);
+          for(int eye = 0; eye < numEyes; eye++){
+#ifdef MANTA_SSE
+              // This finds the upper bound of the groups of 4.  Even if you
+              // write more than you need (say 8 for a fragment size of 6),
+              // you won't blow the top of the array, because
+              // (Fragment::MaxSize+3)&(~3) == Fragment::MaxSize.
+              int e = (fsize+3)&(~3);
+              __m128i vec_eye = _mm_set1_epi32(eye);
+              for(int i=0;i<e;i+=4)
+                  _mm_store_si128((__m128i*)&frag.whichEye[i], vec_eye);
 #else
-        for(int i=0;i<fsize;i++)
-          frag.whichEye[i] = eye;
+              for(int i=0;i<fsize;i++)
+                  frag.whichEye[i] = eye;
 #endif
 
-        // Two versions.  If the assignment is narrower than a fragment, we
-        // can enable a few optimizations
-        if(xend-xstart <= Fragment::MaxSize){
-          // Common case - one packet in X direction
-          int size = xend-xstart;
-#ifdef MANTA_SSE
-          __m128i vec_x = _mm_add_epi32(_mm_set1_epi32(xstart), vec_cascade);
-          for(int i=0;i<size;i+=4){
-            // This will spill over by up to 3 pixels
-            _mm_store_si128((__m128i*)&frag.pixel[0][i], vec_x);
-            vec_x = _mm_add_epi32(vec_x, vec_4);
-          }
+              // Two versions.  If the assignment is narrower than a 
fragment, we
+              // can enable a few optimizations
+              if(xend-xstart <= Fragment::MaxSize){
+                  // Common case - one packet in X direction
+                  int size = xend-xstart;
+#ifdef MANTA_SSE
+                  __m128i vec_x = _mm_add_epi32(_mm_set1_epi32(xstart), 
vec_cascade);
+                  for(int i=0;i<size;i+=4){
+                      // This will spill over by up to 3 pixels
+                      _mm_store_si128((__m128i*)&frag.pixel[0][i], vec_x);
+                      vec_x = _mm_add_epi32(vec_x, vec_4);
+                  }
 #else
-          for(int i=0;i<size;i++)
-            frag.pixel[0][i] = i+xstart;
+                  for(int i=0;i<size;i++)
+                      frag.pixel[0][i] = i+xstart;
 #endif
-          frag.setSize(size);
-          for(int y = ystart; y<yend; y++){
+                  frag.setSize(size);
+                  for(int y = ystart; y<yend; y++){
 #ifdef MANTA_SSE
-            int e = (fsize+3)&(~3);
-            __m128i vec_y = _mm_set1_epi32(y);
-            for(int i=0;i<e;i+=4)
-              _mm_store_si128((__m128i*)&frag.pixel[1][i], vec_y);
+                      int e = (fsize+3)&(~3);
+                      __m128i vec_y = _mm_set1_epi32(y);
+                      for(int i=0;i<e;i+=4)
+                          _mm_store_si128((__m128i*)&frag.pixel[1][i], 
vec_y);
 #else
-            for(int i=0;i<fsize;i++)
-              frag.pixel[1][i] = y;
+                      for(int i=0;i<fsize;i++)
+                          frag.pixel[1][i] = y;
 #endif
-            context.pixelSampler->renderFragment(context, frag);
-            image->set(frag);
-          }
-        } else {
-          // General case (multiple packets in X direction)
-          for(int y = ystart; y<yend; y++){
-#ifdef MANTA_SSE
-            int e = (fsize+3)&(~3);
-            __m128i vec_y = _mm_set1_epi32(y);
-            for(int i=0;i<e;i+=4)
-              _mm_store_si128((__m128i*)&frag.pixel[1][i], vec_y);
+                      context.pixelSampler->renderFragment(context, frag);
+                      image->set(frag);
+                  }
+              } else {
+                  // General case (multiple packets in X direction)
+                  for(int y = ystart; y<yend; y++){
+#ifdef MANTA_SSE
+                      int e = (fsize+3)&(~3);
+                      __m128i vec_y = _mm_set1_epi32(y);
+                      for(int i=0;i<e;i+=4)
+                          _mm_store_si128((__m128i*)&frag.pixel[1][i], 
vec_y);
 #else
-            for(int i=0;i<fsize;i++)
-              frag.pixel[1][i] = y;
+                      for(int i=0;i<fsize;i++)
+                          frag.pixel[1][i] = y;
 #endif
-            for(int x = xstart; x<xend; x+= Fragment::MaxSize){
-              // This catches cases where xend-xstart is larger than
-              // Fragment::MaxSize.
-              int xnarf = x+Fragment::MaxSize;
-              if (xnarf > xend) xnarf = xend;
-              int size = xnarf-x;
-#ifdef MANTA_SSE
-              __m128i vec_x = _mm_add_epi32(_mm_set1_epi32(x), vec_cascade);
-              for(int i=0;i<size;i+=4){
-                // This will spill over by up to 3 pixels
-                _mm_store_si128((__m128i*)&frag.pixel[0][i], vec_x);
-                vec_x = _mm_add_epi32(vec_x, vec_4);
-              }
+                      for(int x = xstart; x<xend; x+= Fragment::MaxSize){
+                          // This catches cases where xend-xstart is larger 
than
+                          // Fragment::MaxSize.
+                          int xnarf = x+Fragment::MaxSize;
+                          if (xnarf > xend) xnarf = xend;
+                          int size = xnarf-x;
+#ifdef MANTA_SSE
+                          __m128i vec_x = _mm_add_epi32(_mm_set1_epi32(x), 
vec_cascade);
+                          for(int i=0;i<size;i+=4){
+                              // This will spill over by up to 3 pixels
+                              _mm_store_si128((__m128i*)&frag.pixel[0][i], 
vec_x);
+                              vec_x = _mm_add_epi32(vec_x, vec_4);
+                          }
 #else
-              for(int i=0;i<size;i++)
-                frag.pixel[0][i] = i+x;
+                          for(int i=0;i<size;i++)
+                              frag.pixel[0][i] = i+x;
 #endif
-              frag.setSize(size);
-              context.pixelSampler->renderFragment(context, frag);
-              image->set(frag);
-            }
+                          frag.setSize(size);
+                          context.pixelSampler->renderFragment(context, 
frag);
+                          image->set(frag);
+                      }
+                  }
+              }
           }
-        }
       }
+      break;
+      case Fragment::SquareShape:
+      {
+          Fragment frag(Fragment::SquareShape, Fragment::ConstantEye);
+
+          // Square Shaped fragments of about RayPacket::MaxSize each
+          static const int sqrt_size = 
static_cast<int>(sqrt(RayPacket::MaxSize));
+          static const int full_size = sqrt_size * sqrt_size;
+
+          for(int eye = 0; eye < numEyes; eye++){
+
+              for(int i=0;i<full_size;i++)
+                  frag.whichEye[i] = eye;
+
+              for (int y = ystart; y < yend; y += sqrt_size) {
+                  for (int x = xstart; x < xend; x += sqrt_size) {
+
+                      int j_end = SCIRun::Min(yend - y, sqrt_size);
+                      int i_end = SCIRun::Min(xend - x, sqrt_size);
+
+                      for (int j = 0; j < j_end; ++j) {
+                          for (int i = 0; i < i_end; ++i) {
+                              frag.pixel[0][j*i_end + i] = x + i;
+                              frag.pixel[1][j*i_end + i] = y + j;
+                          }
+                      }
+                      frag.setSize(j_end * i_end);
+                      context.pixelSampler->renderFragment(context, frag);
+
+                      image->set(frag);
+                  }
+              }
+          }
+      }
+      break;
+      default:
+          break;
+      }
+
     }
   }
   // This can potentially happen before the other procesors are finished

Modified: trunk/Engine/ImageTraversers/TiledImageTraverser.h
==============================================================================
--- trunk/Engine/ImageTraversers/TiledImageTraverser.h  (original)
+++ trunk/Engine/ImageTraversers/TiledImageTraverser.h  Thu Aug 10 11:11:30 
2006
@@ -31,6 +31,7 @@
 */
 
 #include <Interface/ImageTraverser.h>
+#include <Interface/Fragment.h>
 #include <sgi_stl_warnings_off.h>
 #include <string>
 #include <vector>
@@ -52,6 +53,8 @@
   private:
     TiledImageTraverser(const TiledImageTraverser&);
     TiledImageTraverser& operator=(const TiledImageTraverser&);
+
+      Fragment::FragmentShape shape;
 
     int xtilesize;
     int ytilesize;

Modified: trunk/Engine/PixelSamplers/FastSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/FastSampler.cc   (original)
+++ trunk/Engine/PixelSamplers/FastSampler.cc   Thu Aug 10 11:11:30 2006
@@ -67,7 +67,7 @@
     RayPacket rays(raydata, RayPacket::UnknownShape, 0, size, depth, flags);
 
     // Check to see if the fragment is consecutive in x.
-    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) == 
Fragment::ConsecutiveX|Fragment::ConstantEye){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
 
       // If so place each pixel in the ray packet relative to the first
       // fragment.

Modified: trunk/Engine/PixelSamplers/SingleSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/SingleSampler.cc (original)
+++ trunk/Engine/PixelSamplers/SingleSampler.cc Thu Aug 10 11:11:30 2006
@@ -68,7 +68,7 @@
     RayPacket rays(raydata, RayPacket::UnknownShape, 0, size, depth, flags);
 
     // Check to see if the fragment is consecutive in x.
-    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) == 
Fragment::ConsecutiveX|Fragment::ConstantEye){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
 
       // If so place each pixel in the ray packet relative to the first
       // fragment.

Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h   (original)
+++ trunk/Image/SimpleImage.h   Thu Aug 10 11:11:30 2006
@@ -45,7 +45,7 @@
     SimpleImage(bool stereo, int xres, int yres);
     virtual ~SimpleImage();
     static Image* create(const std::vector<std::string>& args, bool stereo,
-                        int xres, int yres);
+                         int xres, int yres);
     void set(const Fragment& fragment);
     void get(Fragment& fragment) const;
 
@@ -66,10 +66,10 @@
   {
     delete[] data;
   }
-  
+
   template<class Pixel>
-  Image* SimpleImage<Pixel>::create(const std::vector<std::string>& args, 
-                                   bool stereo, int xres, int yres)
+  Image* SimpleImage<Pixel>::create(const std::vector<std::string>& args,
+                                    bool stereo, int xres, int yres)
   {
     if(args.size() != 0)
       throw SCIRun::IllegalValue<std::string>
@@ -101,7 +101,7 @@
       eyeStart[1] = eyeStart[0]+yres;
       eyeStart[1][0] = eyeStart[0][0]+xpad*yres;
       for(int i=1;i<yres;i++)
-       eyeStart[1][i] = eyeStart[1][i-1]+xpad;
+        eyeStart[1][i] = eyeStart[1][i-1]+xpad;
     } else {
       eyeStart[1] = 0;
     }
@@ -110,12 +110,11 @@
   template<class Pixel>
   void SimpleImage<Pixel>::set(const Fragment& fragment)
   {
-    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-       Fragment::ConsecutiveX|Fragment::ConstantEye){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
       int b = fragment.begin();
       Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
       for(int i=fragment.begin(); i< fragment.end();i++)
-       convertToPixel(*pix++, fragment.getColor(i).convertRGB());
+        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());
@@ -138,8 +137,7 @@
   template<class Pixel>
   void SimpleImage<Pixel>::get(Fragment& fragment) const
   {
-    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-       Fragment::ConsecutiveX|Fragment::ConstantEye){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
       int b = fragment.begin();
       Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
       for(int i=fragment.begin(); i < fragment.end();i++) {

Modified: trunk/Image/SimpleImage_special.cc
==============================================================================
--- trunk/Image/SimpleImage_special.cc  (original)
+++ trunk/Image/SimpleImage_special.cc  Thu Aug 10 11:11:30 2006
@@ -9,8 +9,7 @@
 template<>
 void SimpleImage<ARGB8Pixel>::set(const Fragment& fragment)
 {
-  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-     Fragment::ConsecutiveX|Fragment::ConstantEye){
+  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
     int b = fragment.begin();
     ARGB8Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
 #if MANTA_SSE
@@ -56,8 +55,7 @@
 template<>
 void SimpleImage<BGRA8Pixel>::set(const Fragment& fragment)
 {
-  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-     Fragment::ConsecutiveX|Fragment::ConstantEye){
+  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
     int b = fragment.begin();
     BGRA8Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
 #if MANTA_SSE
@@ -120,8 +118,7 @@
 template<>
 void SimpleImage<RGBA8Pixel>::set(const Fragment& fragment)
 {
-  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-     Fragment::ConsecutiveX|Fragment::ConstantEye){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)) {
     int b = fragment.begin();
     RGBA8Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
 #if MANTA_SSE
@@ -184,8 +181,7 @@
 template<>
 void SimpleImage<RGBAfloatPixel>::set(const Fragment& fragment)
 {
-  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
-     Fragment::ConsecutiveX|Fragment::ConstantEye){
+  if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye)){
     int b = fragment.begin();
     RGBAfloatPixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
 #if MANTA_SSE
@@ -209,7 +205,7 @@
         // I found this method to be slightly faster and easier to use
         // than the swizzle4 code previously found in the repository.
         _MM_TRANSPOSE4_PS(r, g, b, a);
-        
+
         // Copy data over
         _mm_stream_ps(fpix,    r);
         _mm_stream_ps(fpix+4,  g);




  • [MANTA] r1163 - in trunk: Engine/ImageTraversers Engine/PixelSamplers Image, boulos, 08/10/2006

Archive powered by MHonArc 2.6.16.

Top of page