# HG changeset patch # User Radek Brich # Date 1206753442 -3600 # Node ID 228cb8bfdd5496bb21900469a3f63e9e25dd0d5d # Parent a6413a3d741d7dba75311c9fb6cd9ba504b99900 slighly optimized raytrace_worker diff -r a6413a3d741d -r 228cb8bfdd54 include/raytracer.h --- a/include/raytracer.h Fri Mar 28 23:30:04 2008 +0100 +++ b/include/raytracer.h Sat Mar 29 02:17:22 2008 +0100 @@ -62,7 +62,7 @@ Vector3 SphereDistribute(int i, int n, Float extent, Vector3 &normal); - Sample **sample_queue; + Sample *sample_queue; int sample_queue_max, sample_queue_pos, sample_queue_count; bool sample_queue_end; pthread_mutex_t sample_queue_mutex, sampler_mutex; diff -r a6413a3d741d -r 228cb8bfdd54 include/sampler.h --- a/include/sampler.h Fri Mar 28 23:30:04 2008 +0100 +++ b/include/sampler.h Sat Mar 29 02:17:22 2008 +0100 @@ -37,8 +37,10 @@ */ class Sample { + friend class Sampler; public: Float x,y; + int sx,sy,osa_samp; }; /** @@ -62,17 +64,8 @@ void resetBuffer(Float *abuffer, int &aw, int &ah) { buffer = abuffer; w = aw; h = ah; }; virtual void init() = 0; virtual int initSampleSet() = 0; - virtual Sample *nextSample() = 0; - virtual void saveSample(Sample *samp, Colour &col) = 0; -}; - -/** - * default sample - */ -class DefaultSample: public Sample -{ - friend class DefaultSampler; - int sx,sy,osa_samp; + virtual bool nextSample(Sample *s) = 0; + virtual void saveSample(Sample &samp, Colour &col) = 0; }; /** @@ -90,8 +83,8 @@ Sampler(abuffer, aw, ah), phase(-1), subsample(8), oversample(0) {}; void init(); int initSampleSet(); - Sample *nextSample(); - void saveSample(Sample *samp, Colour &col); + bool nextSample(Sample *s); + void saveSample(Sample &samp, Colour &col); void setSubsample(int sub) { subsample = sub; }; int getSubsample() { return subsample; }; diff -r a6413a3d741d -r 228cb8bfdd54 include/scene.h --- a/include/scene.h Fri Mar 28 23:30:04 2008 +0100 +++ b/include/scene.h Sat Mar 29 02:17:22 2008 +0100 @@ -74,7 +74,12 @@ void rotate(const Quaternion &q); void move(const Float fw, const Float left, const Float up); - Ray makeRay(Sample *samp); + Ray makeRay(Sample &samp) + { + Vector3 dir = p + (u*samp.x - v*samp.y)*F; + dir.normalize(); + return Ray(eye, dir); + }; }; /** diff -r a6413a3d741d -r 228cb8bfdd54 src/raytracer.cc --- a/src/raytracer.cc Fri Mar 28 23:30:04 2008 +0100 +++ b/src/raytracer.cc Sat Mar 29 02:17:22 2008 +0100 @@ -29,7 +29,7 @@ #include #include "raytracer.h" -int pyrit_verbosity = 4; +int pyrit_verbosity = 2; // Hammersley spherical point distribution // http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoints.html @@ -396,8 +396,9 @@ void *Raytracer::raytrace_worker(void *d) { Raytracer *rt = (Raytracer*)d; - Sample *sample; - Colour col; + Sample my_queue[80]; + Colour my_colours[80]; + int my_count; Ray ray; for (;;) { @@ -415,26 +416,33 @@ pthread_cond_wait(&rt->sample_queue_cond, &rt->sample_queue_mutex); } - sample = rt->sample_queue[rt->sample_queue_pos++]; - rt->sample_queue_count--; - if (rt->sample_queue_pos > rt->sample_queue_max) - rt->sample_queue_pos = 0; + if (rt->sample_queue_count >= 80) + my_count = 80; + else + my_count = rt->sample_queue_count; + rt->sample_queue_count -= my_count; + + for (int i = 0; i < my_count; i++) + { + my_queue[i] = rt->sample_queue[rt->sample_queue_pos++]; + if (rt->sample_queue_pos > rt->sample_queue_max) + rt->sample_queue_pos = 0; + } pthread_mutex_unlock(&rt->sample_queue_mutex); // do the work - pthread_mutex_lock(&rt->sampler_mutex); - ray = rt->camera->makeRay(sample); - pthread_mutex_unlock(&rt->sampler_mutex); - - col = rt->raytrace(ray, 0, NULL); + for (int i = 0; i < my_count; i++) + { + ray = rt->camera->makeRay(my_queue[i]); + my_colours[i] = rt->raytrace(ray, 0, NULL); + } - // save the result + // save the results pthread_mutex_lock(&rt->sampler_mutex); - rt->sampler->saveSample(sample, col); + for (int i = 0; i < my_count; i++) + rt->sampler->saveSample(my_queue[i], my_colours[i]); pthread_mutex_unlock(&rt->sampler_mutex); - - delete sample; } } @@ -445,7 +453,7 @@ sample_queue_end = false; sample_queue_max = 2000; - sample_queue = new Sample* [sample_queue_max+1]; + sample_queue = new Sample [sample_queue_max+1]; sample_queue_pos = 0; sample_queue_count = 0; @@ -465,9 +473,9 @@ dbgmsg(2, "- 0%% done"); sampler->init(); - Sample *sample; int sampnum = 0, sampdone; int my_pos = 0, my_count; + bool more_samples; pthread_mutex_lock(&sampler_mutex); while ( (sampnum = sampler->initSampleSet()) > 0 ) @@ -476,16 +484,15 @@ for (;;) { my_count = 0; - while ( (sample = sampler->nextSample()) != NULL ) + while ( more_samples = sampler->nextSample(&sample_queue[my_pos++]) ) { - sample_queue[my_pos++] = sample; my_count++; if (my_count >= 1000) break; if (my_pos > sample_queue_max) my_pos = 0; } - if (sample == NULL) + if (!more_samples) break; pthread_mutex_unlock(&sampler_mutex); @@ -528,69 +535,6 @@ pthread_join(threads[t], NULL); delete[] sample_queue; - -#if 0 - RenderrowData *d; - - Float S = 0.5/w; - Vector3 dfix = camera->u*(-w/2.0*S/camera->f) - + camera->v*(h/2.0*S/camera->f) + camera->p; - Vector3 dx = camera->u * (S/camera->f); - Vector3 dy = camera->v * (-S/camera->f); - -#ifdef PTHREADS - dbgmsg(1, "* pthreads enabled, using %d threads\n", num_threads); - pthread_t threads[num_threads]; - for (int t = 0; t < num_threads; t++) - threads[t] = pthread_self(); - int t = 0; -#endif - - /* for each pixel... */ - dbgmsg(1, "* raytracing...\n"); - dbgmsg(2, "- row 0 ( 0%% done)"); - for (int y = 0; y < h; y += subsample) - { - d = (RenderrowData*) malloc(sizeof(RenderrowData)); - d->rt = this; - d->w = w; - d->eye = camera->eye; - d->dfix = dfix; - d->dx = dx; - d->dy = dy; - d->iter = buffer + y*3*w; -#ifdef PTHREADS - /* create new thread and increase 't' */ - int rc = pthread_create(&threads[t++], NULL, renderrow, (void *)d); - if (rc) { - dbgmsg(0, "\nE pthread_create unsuccessful, return code was %d\n", rc); - exit(1); - } - /* when 't' overflows, reset it */ - if (t >= num_threads) - t = 0; - /* wait for next thread in fifo queue, so the descriptor can be reused; - this also limits number of running threads */ - if (!pthread_equal(threads[t], pthread_self())) - if (pthread_join(threads[t], (void**)&d) == 0) - free(d); -#else - renderrow((void *)d); - free(d); -#endif - dfix += dy*subsample; - dbgmsg(2, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4d (%2d%% done)", y, y*100/(h-1)); - } - dbgmsg(2, "\n"); - -#ifdef PTHREADS - dbgmsg(2, "- waiting for threads to finish\n"); - for (t = 0; t < num_threads; t++) - if (pthread_join(threads[t], (void**)&d) == 0) - free(d); -#endif - -#endif } void Raytracer::addlight(Light *light) @@ -605,5 +549,5 @@ ao_angle = angle; if (ao_distance == 0) /* 0 ==> Inf */ - ao_distance = FLT_MAX; + ao_distance = Inf; } diff -r a6413a3d741d -r 228cb8bfdd54 src/sampler.cc --- a/src/sampler.cc Fri Mar 28 23:30:04 2008 +0100 +++ b/src/sampler.cc Sat Mar 29 02:17:22 2008 +0100 @@ -59,10 +59,8 @@ } } -Sample* DefaultSampler::nextSample() +bool DefaultSampler::nextSample(Sample* s) { - DefaultSample *s = new DefaultSample; - /* grid oversampling */ static const int gridsamples[] = {1,5,9,16}; static const Float osa5x[] = {0.0, -0.4, +0.4, +0.4, -0.4}; @@ -109,11 +107,10 @@ sx = 0; sy++; } + if (sy >= h) - { - delete s; - return NULL; - } + return false; + s->x = (Float)sx/h - (Float)w/h/2.0; s->y = (Float)sy/h - 0.5; osa_samp = 0; @@ -133,13 +130,13 @@ s->sx = sx; s->sy = sy; s->osa_samp = osa_samp; - return s; + + return true; } -void DefaultSampler::saveSample(Sample *samp, Colour &col) +void DefaultSampler::saveSample(Sample &samp, Colour &col) { - DefaultSample *sp = static_cast(samp); - Float *buf = buffer + 3*(sp->sy*w + sp->sx); + Float *buf = buffer + 3*(samp.sy * w + samp.sx); if (oversample) { *(buf+0) += col.r; diff -r a6413a3d741d -r 228cb8bfdd54 src/scene.cc --- a/src/scene.cc Fri Mar 28 23:30:04 2008 +0100 +++ b/src/scene.cc Sat Mar 29 02:17:22 2008 +0100 @@ -75,13 +75,6 @@ eye = eye + fw*p + left*u + up*v; } -Ray Camera::makeRay(Sample *samp) -{ - Vector3 dir = p + (u*samp->x - v*samp->y)*F; - dir.normalize(); - return Ray(eye, dir); -} - /* http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm */ bool BBox::intersect(const Ray &ray, Float &a, Float &b) {