Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1804 - in trunk/Engine: Control ImageTraversers PixelSamplers


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1804 - in trunk/Engine: Control ImageTraversers PixelSamplers
  • Date: Fri, 2 Nov 2007 15:15:34 -0600 (MDT)

Author: boulos
Date: Fri Nov  2 15:15:32 2007
New Revision: 1804

Modified:
   trunk/Engine/Control/RTRT.cc
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
   trunk/Engine/PixelSamplers/SingleSampler.cc
   trunk/Engine/PixelSamplers/SingleSampler.h
Log:
Engine/ImageTraversers/DeadlineImageTraverser.cc
Engine/ImageTraversers/DeadlineImageTraverser.h

 DeadlineImageTraverser now swaps out SampleGenerators using
 const_cost evilness. Better pictures result.

Engine/PixelSamplers/SingleSampler.cc
Engine/PixelSamplers/SingleSampler.h

 Updating SingleSampler to compute the region_id as well.


Modified: trunk/Engine/Control/RTRT.cc
==============================================================================
--- trunk/Engine/Control/RTRT.cc        (original)
+++ trunk/Engine/Control/RTRT.cc        Fri Nov  2 15:15:32 2007
@@ -175,7 +175,7 @@
 
   //currentSampleGenerator = new ConstantSampleGenerator(0.f);
   currentSampleGenerator = new UniformRandomGenerator();
-  //currentSampleGenerator = new Stratified2D(64);
+  //currentSampleGenerator = new Stratified2D(81);
 }
 
 RTRT::~RTRT()

Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      Fri Nov  2 
15:15:32 2007
@@ -50,6 +50,9 @@
 #include <Interface/PixelSampler.h>
 #include <Engine/PixelSamplers/SingleSampler.h>
 #include <Engine/PixelSamplers/JitterSampler.h>
+#include <Engine/SampleGenerators/ConstantSampleGenerator.h>
+#include <Engine/SampleGenerators/Stratified2D.h>
+#include <Engine/SampleGenerators/UniformRandomGenerator.h>
 #include <Interface/RayPacket.h> // for maxsize
 #include <Core/Util/CPUTime.h>
 #include <MantaSSE.h>
@@ -58,6 +61,9 @@
 
 using namespace Manta;
 
+#define BLEND_OLD_SAMPLES 0
+#define USE_SAMPLE_GEN 1
+
 ImageTraverser* DeadlineImageTraverser::create(const vector<string>& args)
 {
   return new DeadlineImageTraverser(args);
@@ -119,6 +125,8 @@
   singleSampler = new SingleSampler(vector<string>());
 
   jitterSamplers = new JitterSampler*[kNumJitterLevels];
+  sampleGenerators = new SampleGenerator*[kNumJitterLevels + 1];
+  sampleGenerators[0] = new UniformRandomGenerator();
   int num_spp = 4;
   for (int i = 0; i < kNumJitterLevels; i++) {
     vector<string> args;
@@ -129,6 +137,7 @@
     r << num_spp;
     args.push_back(r.str());
     jitterSamplers[i] = new JitterSampler(args);
+    sampleGenerators[i+1] = new Stratified2D(num_spp);
     num_spp *= 4;
   }
 }
@@ -142,6 +151,9 @@
   for (int i = 0; i < kNumJitterLevels; i++) {
     jitterSamplers[i]->setupBegin(context, numChannels);
   }
+  for (int i = 0; i < kNumJitterLevels + 1; i++) {
+    sampleGenerators[i]->setupBegin(context, numChannels);
+  }
   context.loadBalancer->setupBegin(context, numChannels);
   context.pixelSampler->setupBegin(context, numChannels);
 
@@ -209,6 +221,10 @@
   for (int i = 0; i < kNumJitterLevels; i++) {
     jitterSamplers[i]->setupDisplayChannel(context);
   }
+
+  for (int i = 0; i < kNumJitterLevels + 1; i++) {
+    sampleGenerators[i]->setupDisplayChannel(context);
+  }
 }
 
 void DeadlineImageTraverser::setupFrame(const RenderContext& context)
@@ -239,6 +255,9 @@
   for (int i = 0; i < kNumJitterLevels; i++) {
     jitterSamplers[i]->setupFrame(context);
   }
+  for (int i = 0; i < kNumJitterLevels + 1; i++) {
+    sampleGenerators[i]->setupFrame(context);
+  }
   // Determine how long we should render this frame.
   frameEnd = CPUTime::currentSeconds() + frameTime;
   if (context.proc == 0) {
@@ -281,6 +300,11 @@
   image->getResolution(stereo, xres, yres);
   int numEyes = stereo?2:1;
 
+#if USE_SAMPLE_GEN
+  RenderContext& mutable_context = const_cast<RenderContext&>(context);
+  SampleGenerator* original_samplegen = context.sample_generator;
+#endif
+
   // NOTE(boulos): Only the coarse_yres and ytiles variables are being
   // used to determine the xtile and ytile of the assignment.
 
@@ -328,6 +352,9 @@
         }
         frag.setSize(idx);
         if((xcoarsepixelsize | ycoarsepixelsize) > 1){
+#if USE_SAMPLE_GEN
+          mutable_context.sample_generator = sampleGenerators[0];
+#endif
           singleSampler->renderFragment(context, frag);
 
           //Tile* tile = new Tile;
@@ -343,6 +370,9 @@
           computePriority(tile, frag);
           insertIntoQueue(tile, static_cast<size_t>(context.proc));
         } else {
+#if USE_SAMPLE_GEN
+          mutable_context.sample_generator = sampleGenerators[0];
+#endif
           context.pixelSampler->renderFragment(context, frag);
         }
         image->set(frag);
@@ -390,21 +420,36 @@
       case 4:
         //cerr << "Using a 4 spp sampler" << endl;
         jitter_sampler = jitterSamplers[0];
+#if USE_SAMPLE_GEN
+        mutable_context.sample_generator = sampleGenerators[1];
+#endif
         break;
       case 16:
         //cerr << "Using a 16 spp sampler" << endl;
         jitter_sampler = jitterSamplers[1];
+#if USE_SAMPLE_GEN
+        mutable_context.sample_generator = sampleGenerators[2];
+#endif
         break;
       case 64:
         //cerr << "Using a 64 spp sampler" << endl;
         jitter_sampler = jitterSamplers[2];
+#if USE_SAMPLE_GEN
+        mutable_context.sample_generator = sampleGenerators[3];
+#endif
         break;
       case 256:
         //cerr << "Using a 256 spp sampler" << endl;
         jitter_sampler = jitterSamplers[3];
+#if USE_SAMPLE_GEN
+        mutable_context.sample_generator = sampleGenerators[4];
+#endif
         break;
       case 1024:
         jitter_sampler = jitterSamplers[4];
+#if USE_SAMPLE_GEN
+        mutable_context.sample_generator = sampleGenerators[5];
+#endif
         break;
       default:
         throw SCIRun::InternalError("Expected either 4, 16, 64, 256, or 1024 
spp", __FILE__, __LINE__);
@@ -552,6 +597,9 @@
 
           // NOTE(boulos): We know that we don't just stop anymore due
           // to super sampling
+#if USE_SAMPLE_GEN
+          mutable_context.sample_generator = sampleGenerators[0];
+#endif
           singleSampler->renderFragment(context, frag);
           //Tile* childtile = new Tile;
           ASSERT(context.proc < DeadlineImageTraverser::kMaxThreads);
@@ -578,6 +626,9 @@
   // This can potentially happen before the other procesors are finished
   // rendering, but that is okay because it won't get displayed until
   // everyone enters the barrier anyway
+#if USE_SAMPLE_GEN
+  mutable_context.sample_generator = original_samplegen;
+#endif
   if(context.proc == 0)
     image->setValid(true);
 }

Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       Fri Nov  2 
15:15:32 2007
@@ -45,6 +45,7 @@
 
 namespace Manta {
   using namespace std;
+  class SampleGenerator;
   class SingleSampler;
   class JitterSampler;
 
@@ -71,6 +72,8 @@
 
     SingleSampler* singleSampler;
     JitterSampler** jitterSamplers; // An array of different jittered 
samplers
+
+    SampleGenerator** sampleGenerators; // An array of sample generators for 
each refinement level
 
     int xpacketsize;
     int ypacketsize;

Modified: trunk/Engine/PixelSamplers/SingleSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/SingleSampler.cc (original)
+++ trunk/Engine/PixelSamplers/SingleSampler.cc Fri Nov  2 15:15:32 2007
@@ -31,14 +31,13 @@
 {
   ChannelInfo& ci = channelInfo[context.channelIndex];
   bool stereo;
-  int xres, yres;
-  context.getResolution(stereo, xres, yres);
+  context.getResolution(stereo, ci.xres, ci.yres);
 
   // Set up the scale from -1 to 1
-  ci.xscale = (Real)2/xres;
-  ci.yscale = (Real)2/yres;
-  ci.xoffset = (-xres/(Real)2+(Real)0.5)*ci.xscale; // Offset to pixel center
-  ci.yoffset = (-yres/(Real)2+(Real)0.5)*ci.yscale;
+  ci.xscale = (Real)2/ci.xres;
+  ci.yscale = (Real)2/ci.yres;
+  ci.xoffset = (-ci.xres/(Real)2+(Real)0.5)*ci.xscale; // Offset to pixel 
center
+  ci.yoffset = (-ci.yres/(Real)2+(Real)0.5)*ci.yscale;
   context.renderer->setupDisplayChannel(context);
 }
 
@@ -76,6 +75,7 @@
       Real px = fragment.getX(f)*ci.xscale+ci.xoffset;
       Real py = fragment.getY(f)*ci.yscale+ci.yoffset;
       int eye = fragment.getWhichEye(f);
+      int pixel_id = fragment.getY(f) * ci.xres + fragment.getX(f);
 
 #if MANTA_SSE
       // The code used to load in the values using _mm_set_ps, but
@@ -86,20 +86,24 @@
                                            ci.xscale,
                                            ci.xscale+ci.xscale,
                                            ci.xscale+ci.xscale+ci.xscale};
+      MANTA_ALIGN(16) int pixel_addition[4] = {0, 1, 2, 3};
       __m128 vec_xscale_cascade = _mm_load_ps(cascade4);
       __m128 vec_px = _mm_add_ps(_mm_set1_ps(px), vec_xscale_cascade);
       __m128 vec_py = _mm_set1_ps(py);
       __m128i vec_eye = _mm_set1_epi32(eye);
+      __m128i vec_pixel_id = _mm_add_epi32(_mm_set1_epi32(pixel_id),
+                                           
_mm_load_si128((__m128i*)&pixel_addition));
       RayPacketData* data = rays.data;
       int e = size&(~3);
       __m128 vec_xscale4 = _mm_set1_ps(ci.xscale*4);
       for(int i=0;i<e;i+=4){
         _mm_store_si128((__m128i*)&data->whichEye[i], vec_eye);
         _mm_store_si128((__m128i*)&data->sample_id[i], _mm_set1_epi32(0));
-
+        _mm_store_si128((__m128i*)&data->region_id[i], vec_pixel_id);
         _mm_store_ps(&data->image[0][i], vec_px);
         _mm_store_ps(&data->image[1][i], vec_py);
         vec_px = _mm_add_ps(vec_px, vec_xscale4);
+        vec_pixel_id = _mm_add_epi32(vec_pixel_id, _mm_set1_epi32(4));
       }
       px += e*ci.xscale;
 #else
@@ -108,6 +112,7 @@
       for(int i=e;i<size;i++){
         rays.setPixel(i, eye, px, py);
         rays.data->sample_id[i] = 0;
+        rays.data->region_id[i] = pixel_id + i;
         px += ci.xscale;
       }
     }
@@ -122,6 +127,7 @@
 
         rays.setPixel(i, fragment.getWhichEye(f+i), px, py);
         rays.data->sample_id[i] = 0;
+        rays.data->region_id[i] = fragment.getY(f+i) * ci.xres + 
fragment.getX(f+i);
       }
     }
     // Otherwise, set each pixel individually.
@@ -136,11 +142,14 @@
       for(int i=0;i<e;i+=4) {
         _mm_store_si128((__m128i*)&data->whichEye[i], 
_mm_load_si128((__m128i*)&fragment.whichEye[f+i]));
         _mm_store_si128((__m128i*)&data->sample_id[i], _mm_set1_epi32(0));
-        __m128 fx = 
_mm_cvtepi32_ps(_mm_load_si128((__m128i*)&fragment.pixel[0][f+i]));
+        __m128i x_pixel = _mm_load_si128((__m128i*)&fragment.pixel[0][f+i]);
+        __m128 fx = _mm_cvtepi32_ps(x_pixel);
         _mm_store_ps(&data->image[0][i], _mm_add_ps(_mm_mul_ps(fx, 
vec_xscale), vec_xoffset));
-        __m128 fy = 
_mm_cvtepi32_ps(_mm_load_si128((__m128i*)&fragment.pixel[1][f+i]));
+        __m128i y_pixel = _mm_load_si128((__m128i*)&fragment.pixel[1][f+i]);
+        __m128 fy = _mm_cvtepi32_ps(y_pixel);
         _mm_store_ps(&data->image[1][i], _mm_add_ps(_mm_mul_ps(fy, 
vec_yscale), vec_yoffset));
-
+        __m128i pixel_id = _mm_add_epi32(_mm_mullo_epi32(y_pixel, 
_mm_set1_epi32(ci.xres)), x_pixel);
+        _mm_store_si128((__m128i*)&data->region_id[i], pixel_id);
       }
 #else
       int e = 0;
@@ -150,6 +159,7 @@
         Real py = fragment.getY(f+i)*ci.yscale+ci.yoffset;
         rays.setPixel(i, fragment.getWhichEye(f+i), px, py);
         rays.data->sample_id[i] = 0;
+        rays.data->region_id[i] = fragment.getY(f+i) * ci.xres + 
fragment.getX(f+i);
       }
     }
 

Modified: trunk/Engine/PixelSamplers/SingleSampler.h
==============================================================================
--- trunk/Engine/PixelSamplers/SingleSampler.h  (original)
+++ trunk/Engine/PixelSamplers/SingleSampler.h  Fri Nov  2 15:15:32 2007
@@ -19,7 +19,7 @@
     virtual void setupDisplayChannel(SetupContext&);
     virtual void setupFrame(const RenderContext& context);
     virtual void renderFragment(const RenderContext& context,
-                               Fragment& fragment);
+                                Fragment& fragment);
 
     static PixelSampler* create(const vector<string>& args);
   private:
@@ -31,6 +31,7 @@
       Real xoffset;
       Real yscale;
       Real yoffset;
+      int xres, yres;
     };
     vector<ChannelInfo> channelInfo;
   };




  • [Manta] r1804 - in trunk/Engine: Control ImageTraversers PixelSamplers, boulos, 11/02/2007

Archive powered by MHonArc 2.6.16.

Top of page