adds #define to disable starfield multithreading support based on C++11

turns it off by default, for now
This commit is contained in:
tosh 2013-03-29 23:19:16 +01:00
parent 51afe69864
commit 20e7837717
2 changed files with 61 additions and 10 deletions

View file

@ -29,6 +29,10 @@
#define STARFIELD_DEBUG_LOD 0 // set to 1 to peek behind the scenes #define STARFIELD_DEBUG_LOD 0 // set to 1 to peek behind the scenes
#endif #endif
#ifndef STARFIELD_MULTITHREADING
#define STARFIELD_MULTITHREADING 0
#endif
// //
// Dependencies: // Dependencies:
// //
@ -45,8 +49,10 @@
#include <stdint.h> #include <stdint.h>
#if STARFIELD_MULTITHREADING
#include <mutex> #include <mutex>
#include <atomic> #include <atomic>
#endif
#include <new> #include <new>
#include <vector> #include <vector>

View file

@ -56,11 +56,15 @@ namespace starfield {
class Controller { class Controller {
mutex _mtxInput;
InputVertices _seqInput; InputVertices _seqInput;
#if STARFIELD_MULTITHREADING
mutex _mtxInput;
atomic<unsigned> _valTileResolution; atomic<unsigned> _valTileResolution;
mutex _mtxLodState; mutex _mtxLodState;
#else
unsigned _valTileResolution;
#endif
double _valLodFraction; double _valLodFraction;
double _valLodLowWaterMark; double _valLodLowWaterMark;
double _valLodHighWaterMark; double _valLodHighWaterMark;
@ -70,11 +74,20 @@ namespace starfield {
BrightnessLevels _seqLodBrightness; BrightnessLevels _seqLodBrightness;
BrightnessLevel _valLodAllocBrightness; BrightnessLevel _valLodAllocBrightness;
#if STARFIELD_MULTITHREADING
atomic<BrightnessLevel> _valLodBrightness; atomic<BrightnessLevel> _valLodBrightness;
atomic<Renderer*> _ptrRenderer; atomic<Renderer*> _ptrRenderer;
typedef lock_guard<mutex> lock; typedef lock_guard<mutex> lock;
#else
BrightnessLevel _valLodBrightness;
Renderer* _ptrRenderer;
#define lock
#define _(x)
#endif
public: public:
@ -106,9 +119,11 @@ namespace starfield {
{ lock _(_mtxInput); { lock _(_mtxInput);
_seqInput.swap(vertices); _seqInput.swap(vertices);
#if STARFIELD_MULTITHREADING
unsigned k = _valTileResolution.load(memory_order_relaxed); unsigned k = _valTileResolution.load(memory_order_relaxed);
#else
unsigned k = _valTileResolution;
#endif
size_t n, nRender; size_t n, nRender;
BrightnessLevel bMin, b; BrightnessLevel bMin, b;
double rcpChange; double rcpChange;
@ -174,8 +189,11 @@ namespace starfield {
_valLodNalloc = n; _valLodNalloc = n;
_valLodNrender = nRender; _valLodNrender = nRender;
_valLodAllocBrightness = bMin; _valLodAllocBrightness = bMin;
#if STARFIELD_MULTITHREADING
_valLodBrightness.store(b, memory_order_relaxed); _valLodBrightness.store(b, memory_order_relaxed);
#else
_valLodBrightness = b;
#endif
} }
} }
@ -190,9 +208,12 @@ namespace starfield {
// fprintf(stderr, "Stars.cpp: setResolution(%d)\n", k); // fprintf(stderr, "Stars.cpp: setResolution(%d)\n", k);
if (k != _valTileResolution.load(memory_order_relaxed)) { #if STARFIELD_MULTITHREADING
if (k != _valTileResolution.load(memory_order_relaxed))
lock _(_mtxInput); #else
if (k != _valTileResolution)
#endif
{ lock _(_mtxInput);
unsigned n; unsigned n;
BrightnessLevel b, bMin; BrightnessLevel b, bMin;
@ -200,7 +221,11 @@ namespace starfield {
{ lock _(_mtxLodState); { lock _(_mtxLodState);
n = _valLodNalloc; n = _valLodNalloc;
#if STARFIELD_MULTITHREADING
b = _valLodBrightness.load(memory_order_relaxed); b = _valLodBrightness.load(memory_order_relaxed);
#else
b = _valLodBrightness;
#endif
bMin = _valLodAllocBrightness; bMin = _valLodAllocBrightness;
} }
@ -271,7 +296,11 @@ namespace starfield {
// this setting controls the renderer, also keep b as the // this setting controls the renderer, also keep b as the
// brightness becomes volatile as soon as the mutex is // brightness becomes volatile as soon as the mutex is
// released, so keep b // released, so keep b
#if STARFIELD_MULTITHREADING
_valLodBrightness.store(b, memory_order_relaxed); _valLodBrightness.store(b, memory_order_relaxed);
#else
_valLodBrightness = b;
#endif
// fprintf(stderr, "Stars.cpp: " // fprintf(stderr, "Stars.cpp: "
// "fraction = %lf, oaFract = %lf, n = %d, n' = %d, bMin = %d, b = %d\n", // "fraction = %lf, oaFract = %lf, n = %d, n' = %d, bMin = %d, b = %d\n",
@ -317,24 +346,36 @@ namespace starfield {
void recreateRenderer(size_t n, unsigned k, void recreateRenderer(size_t n, unsigned k,
BrightnessLevel b, BrightnessLevel bMin) { BrightnessLevel b, BrightnessLevel bMin) {
#if STARFIELD_MULTITHREADING
delete _ptrRenderer.exchange(new Renderer(_seqInput, n, k, b, bMin) ); delete _ptrRenderer.exchange(new Renderer(_seqInput, n, k, b, bMin) );
#else
delete _ptrRenderer;
_ptrRenderer = new Renderer(_seqInput, n, k, b, bMin);
#endif
} }
public: public:
void render(float perspective, float angle, mat4 const& orientation) { void render(float perspective, float angle, mat4 const& orientation) {
#if STARFIELD_MULTITHREADING
// check out renderer // check out renderer
Renderer* renderer = _ptrRenderer.exchange(0l); Renderer* renderer = _ptrRenderer.exchange(0l);
#else
Renderer* renderer = _ptrRenderer;
#endif
// have it render // have it render
if (renderer != 0l) { if (renderer != 0l) {
#if STARFIELD_MULTITHREADING
BrightnessLevel b = _valLodBrightness.load(memory_order_relaxed); BrightnessLevel b = _valLodBrightness.load(memory_order_relaxed);
#else
BrightnessLevel b = _valLodBrightness;
#endif
renderer->render(perspective, angle, orientation, b); renderer->render(perspective, angle, orientation, b);
} }
#if STARFIELD_MULTITHREADING
// check in - or dispose if there is a new one // check in - or dispose if there is a new one
Renderer* newOne = 0l; Renderer* newOne = 0l;
if (! _ptrRenderer.compare_exchange_strong(newOne, renderer)) { if (! _ptrRenderer.compare_exchange_strong(newOne, renderer)) {
@ -342,6 +383,10 @@ namespace starfield {
assert(!! newOne); assert(!! newOne);
delete renderer; delete renderer;
} }
#else
# undef lock
# undef _
#endif
} }
private: private: