00001 /*************************************************************************** 00002 *cr 00003 *cr (C) Copyright 1995-2011 The Board of Trustees of the 00004 *cr University of Illinois 00005 *cr All Rights Reserved 00006 *cr 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * RCS INFORMATION: 00011 * 00012 * $RCSfile: FreeVRScene.C,v $ 00013 * $Author: johns $ $Locker: $ $State: Exp $ 00014 * $Revision: 1.38 $ $Date: 2010/12/16 04:08:16 $ 00015 * 00016 *************************************************************************** 00017 * DESCRIPTION: 00018 * The FreeVR specific Scene. It has to get information from the 00019 * shared memory arena, since the display lists are shared amoung 00020 * the different machines 00021 * 00022 ***************************************************************************/ 00023 00024 #include <stdlib.h> 00025 #include <freevr.h> 00026 00027 #include "FreeVRScene.h" 00028 #include "FreeVRRoutines.h" 00029 #include "DisplayDevice.h" 00030 #include "Inform.h" 00031 #include "utilities.h" 00032 #include "VMDApp.h" // for VMDexit() 00033 00034 #define FREEVRUSERWLOCK 1 00035 00037 FreeVRScene::FreeVRScene(VMDApp *vmdapp) : app(vmdapp) { 00038 #if defined(FREEVRUSERWLOCK) 00039 msgInfo << "Creating R/W lock for shared mem access sync.\n" << sendmsg; 00040 // draw_rwlock = vrLockCreate(vmdapp->freevrcontext); // allocate an RW Lock 00041 draw_rwlock = vrLockCreate(); // allocate an RW Lock 00042 vrLockWriteSet(draw_rwlock); // start out locked for writing 00043 #else 00044 msgInfo << "Creating draw barrier for " << vrContext->config->num_windows 00045 << " active FreeVR walls and master process.\n" << sendmsg; 00046 00047 // setup the drawing barrier used to control slave rendering processes 00048 draw_barrier =(vmd_barrier_t *) malloc_from_FreeVR_memory(sizeof(vmd_barrier_t)); 00049 if (draw_barrier == NULL) { 00050 msgErr << "CANNOT ALLOCATE SHARED MEMORY FOR FreeVRScene CLASS !!!" 00051 << sendmsg; 00052 } 00053 memset(draw_barrier, 0, sizeof(vmd_barrier_t)); 00054 00055 if (getenv("VMDFREEVRDRAWPROCS") != NULL) { 00056 vmd_thread_barrier_init_proc_shared(draw_barrier, atoi(getenv("VMDFREEVRDRAWPROCS")) + 1); 00057 } else { 00058 vmd_thread_barrier_init_proc_shared(draw_barrier, vrContext->config->num_windows + 1); 00059 } 00060 #endif 00061 } 00062 00064 FreeVRScene::~FreeVRScene(void) { 00065 #if defined(FREEVRUSERWLOCK) 00066 // XXX somehow we need to get the rendering slaves to 00067 // exit cleanly rather than getting stuck in mid-draw 00068 // attempting to do various stuff when the world goes away. 00069 vrLockFree(draw_rwlock); // delete the drawing rwlock 00070 #else 00071 // free things allocated from shared memory 00072 free_to_FreeVR_memory(draw_barrier); 00073 #endif 00074 } 00075 00076 // Called by FreeVR, on each of the child rendering processes 00077 void FreeVRScene::draw(DisplayDevice *display) { 00078 #if defined(FREEVRUSERWLOCK) 00079 if (display->is_renderer_process()) { 00080 vrLockReadSet(draw_rwlock); 00081 Scene::draw(display); 00082 vrLockReadRelease(draw_rwlock); 00083 } else { 00084 vrLockWriteRelease(draw_rwlock); 00085 vmd_msleep(1); // give 'em 1 millisecond to draw before re-locking 00086 vrLockWriteSet(draw_rwlock); 00087 } 00088 #else 00089 // Barrier synchronization for all drawing processes and the master 00090 vmd_thread_barrier(draw_barrier, 0); // wait for start of drawing 00091 Scene::draw(display); // draw the scene 00092 vmd_thread_barrier(draw_barrier, 0); // wait for end of drawing. 00093 #endif 00094 } 00095 00096 // this is called by the parent! 00097 int FreeVRScene::prepare() { 00098 // check if the ESC key is being pressed; if so, quit 00099 // note: THIS IS A HACK, just for Bill Sherman 00100 if(vrGet2switchValue(0)) { 00101 vrExit(); 00102 app->VMDexit("Exiting due to FreeVR escape key being pressed", 10, 4); 00103 } 00104 00105 return Scene::prepare(); // call regular scene prepare method 00106 } 00107 00108 void *FreeVRScene::operator new(size_t s) { 00109 return malloc_from_FreeVR_memory(s); 00110 } 00111 00112 void FreeVRScene::operator delete(void *p, size_t) { 00113 free_to_FreeVR_memory(p); 00114 } 00115
1.2.14 written by Dimitri van Heesch,
© 1997-2002