Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1521 - in trunk: Core/Math Core/Util Engine/ImageTraversers


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1521 - in trunk: Core/Math Core/Util Engine/ImageTraversers
  • Date: Fri, 20 Jul 2007 15:48:52 -0600 (MDT)

Author: boulos
Date: Fri Jul 20 15:48:52 2007
New Revision: 1521

Modified:
   trunk/Core/Math/CheapRNG.h
   trunk/Core/Util/PriorityQueue.h
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
Log:
Core/Math/CheapRNG.h

  Making the SIMD version used again (forgot to add RayPacket
  apparently, so the virtual function wasn't being overridden.

Core/Util/PriorityQueue.h

  Trying to make the compiler produce a conditional move (right now it
  has a jump on my system... how annoying) for this expensive portion
  of the PriorityQueue code.

Engine/ImageTraversers/DeadlineImageTraverser.cc
Engine/ImageTraversers/DeadlineImageTraverser.h

  Removing the statically allocated Tile* tiles array and any
  reference to it.  Right now there are calls to new and delete to
  create Tiles when needed but this will soon be replaced with a set
  of MemoryPools.


Modified: trunk/Core/Math/CheapRNG.h
==============================================================================
--- trunk/Core/Math/CheapRNG.h  (original)
+++ trunk/Core/Math/CheapRNG.h  Fri Jul 20 15:48:52 2007
@@ -100,7 +100,7 @@
       return val;
     }
 
-    virtual void nextIntPacket(Packet<unsigned int>& results) {
+    virtual void nextIntPacket(Packet<unsigned int>& results, RayPacket& 
rays) {
 #ifdef MANTA_SSE
       for (int i = 0; i < Packet<unsigned int>::MaxSize; i+=4) {
         val_sse = _mm_add_epi32(_mm_set_epi32(2531011, 10395331, 13737667, 
1),

Modified: trunk/Core/Util/PriorityQueue.h
==============================================================================
--- trunk/Core/Util/PriorityQueue.h     (original)
+++ trunk/Core/Util/PriorityQueue.h     Fri Jul 20 15:48:52 2007
@@ -70,11 +70,15 @@
       while((p<<1)+2 < qsize){
         size_t c1 = (p<<1)+1;
         size_t c2 = (p<<1)+2;
+#if 0
         size_t c;
         if(queue_data[c1].priority > queue_data[c2].priority)
           c = c1;
         else
           c = c2;
+#else
+        size_t c = (queue_data[c1].priority > queue_data[c2].priority) ? c1 
: c2;
+#endif
         queue_data[p] = queue_data[c];
         p = c;
       }

Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      Fri Jul 20 
15:48:52 2007
@@ -64,7 +64,7 @@
 }
 
 DeadlineImageTraverser::DeadlineImageTraverser(const vector<string>& args)
-  : qlock("DeadlineImageTraverser queue lock"), queue(8, 8)
+  : qlock("DeadlineImageTraverser queue lock"), queue(16, 16)
 {
   finished_coarse = false;
   reset_every_frame = false;
@@ -115,13 +115,8 @@
     }
   }
   frameTime = 1./frameRate;
-  tiles = 0;
-  total_tiles = 0;
   singleSampler = new SingleSampler(vector<string>());
 
-  //cerr << "xpacketsize = " << xpacketsize << endl;
-  //cerr << "ypacketsize = " << ypacketsize << endl;
-
   jitterSamplers = new JitterSampler*[kNumJitterLevels];
   int num_spp = 4;
   for (int i = 0; i < kNumJitterLevels; i++) {
@@ -148,12 +143,8 @@
   }
   context.loadBalancer->setupBegin(context, numChannels);
   context.pixelSampler->setupBegin(context, numChannels);
-  if(total_tiles){
-    delete[] tiles;
-    queue.clear();
-  }
-  total_tiles = 0;
-  top_tiles = 0;
+
+  queue.clear();
 
   context.rtrt_int->addIdleMode(this);
 }
@@ -208,41 +199,6 @@
   // Continue setting up the rendering stack.
   context.pixelSampler->setupDisplayChannel(context);
 
-  int cur = 1;
-  int ntotal = 0;
-  float x = xcoarsepixelsize;
-  float y = ycoarsepixelsize;
-  // NOTE(boulos): This used to be > 1, but needs to be >= to account
-  // for (current) lowest level of a single tile of 1 pixel.  In the
-  // future this should get updated with something that accounts for
-  // super sampling too.
-  const float min_x = 1./16.f;
-  const float min_y = 1./16.f;
-  while(x >= min_x || y >= min_y){
-    //cerr << "Cur is " << cur;
-    //cerr << " x is " << x;
-    //cerr << " y is " << y;
-    //cerr << " ntotal is " << ntotal << endl;
-    ntotal += cur;
-    cur *= xrefinementRatio * yrefinementRatio;
-    x /= xrefinementRatio;
-    y /= yrefinementRatio;
-  }
-  // NOTE(boulos): But the "popTiles" code doesn't check for whether
-  // or not it'll actually be generating new children, so it needs on more
-  // level of available refinement space.  We account for that here.
-  ntotal += cur;
-  if(total_tiles){
-    delete[] tiles;
-    queue.clear();
-  }
-  if(numAssignments > top_tiles)
-    top_tiles = numAssignments;
-  total_tiles = ntotal * xtiles * ytiles;
-  //cerr << "Total tiles is now " << total_tiles << endl;
-  tiles = new Tile[total_tiles];
-  //queue.reserve(total_tiles); // With the new queue, we don't even need to 
reserve ;)
-
   singleSampler->setupDisplayChannel(context);
   // NOTE(boulos): Having the sampler tell the renderer to setup is a
   // bit confusing and redundant but oh well...
@@ -264,14 +220,12 @@
   if (!finished_coarse) {
     context.loadBalancer->setupFrame(context);
     queue.clear();
-    next_tile = top_tiles;
     converged = false;
     StartFrameTime = CPUTime::currentSeconds();
   }
 
   context.pixelSampler->setupFrame(context);
 
-
   singleSampler->setupFrame(context);
   for (int i = 0; i < kNumJitterLevels; i++) {
     jitterSamplers[i]->setupFrame(context);
@@ -286,39 +240,24 @@
       cerr << "Took " << total_time << " seconds to refine to 
"<<Fragment::MaxSize<<" spp" << endl;
     }
     //cerr << "queue size = " << queue.size() << ", next_tile = " << 
next_tile << endl;
-    //cerr << "totalTiles = " << total_tiles << endl;
   }
 }
 
 void DeadlineImageTraverser::insertIntoQueue(Tile* tile, size_t thread_id)
 {
-  //qlock.lock();
-
   queue.push(tile, tile->priority, thread_id);
-
-  //qlock.unlock();
 }
 
 void DeadlineImageTraverser::insertIntoQueue(vector<Tile*>& tiles, size_t 
thread_id)
 {
-  //qlock.lock();
-
   for(size_t i=0; i < tiles.size(); i++) {
     Tile* tile = tiles[i];
     queue.push(tile, tile->priority, thread_id);
   }
-
-  //qlock.unlock();
 }
 
 DeadlineImageTraverser::Tile* DeadlineImageTraverser::popFromQueue(size_t 
thread_id) {
-  //qlock.lock();
-  //if (queue.empty()) {
-  //qlock.unlock();
-  // return 0;
-  //}
   Tile* result = queue.pop(thread_id);
-  //qlock.unlock();
   return result;
 }
 
@@ -376,7 +315,7 @@
         frag.setSize(idx);
         if((xcoarsepixelsize | ycoarsepixelsize) > 1){
           singleSampler->renderFragment(context, frag);
-          Tile* tile = &tiles[assignment];
+          Tile* tile = new Tile;
           tile->xstart = xstart;
           tile->ystart = ystart;
           tile->xend = xend;
@@ -550,6 +489,13 @@
       }
     }
 
+    // Return the memory.  TODO(boulos): Use a memory pool
+    // implementation, so that each frame we can say that "I know I'm
+    // done with any pointers I asked for even if I don't ask to
+    // delete them." (because currently the priority queue might be
+    // the only class that is holding some pointers that need to be
+    // cleaned up)
+    delete tile;
     // Check size before inserting to avoid lock contention
     if(childtiles.size())
       insertIntoQueue(childtiles, static_cast<size_t>(context.proc));

Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       Fri Jul 20 
15:48:52 2007
@@ -93,14 +93,7 @@
       int padding; // unfortunately we can't make these 128 bytes wide
     };
     SCIRun::Mutex qlock;
-    Tile* tiles;
-    //Tile** queue;
-    //PriorityQueue<Tile*, float> queue;
     ApproximatePriorityQueue<Tile*, float> queue;
-    int next_tile;
-    //int qsize;
-    int total_tiles;
-    int top_tiles;
     bool reset_every_frame;
     bool finished_coarse;
     bool ShowTimeSupersample;




  • [MANTA] r1521 - in trunk: Core/Math Core/Util Engine/ImageTraversers, boulos, 07/20/2007

Archive powered by MHonArc 2.6.16.

Top of page