Equalizer  1.2.1
eqNBody/pipe.cpp
00001 
00002 /*
00003  * Copyright (c) 2009, Philippe Robert <philippe.robert@gmail.com> 
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  * - Redistributions of source code must retain the above copyright notice, this
00009  *   list of conditions and the following disclaimer.
00010  * - Redistributions in binary form must reproduce the above copyright notice,
00011  *   this list of conditions and the following disclaimer in the documentation
00012  *   and/or other materials provided with the distribution.
00013  * - Neither the name of Eyescale Software GmbH nor the names of its
00014  *   contributors may be used to endorse or promote products derived from this
00015  *   software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include "pipe.h"
00031 
00032 #include "config.h"
00033 #include "frameData.h"
00034 
00035 using namespace co::base;
00036 using namespace std;
00037 
00038 namespace eqNbody
00039 {
00040 
00041 Pipe::Pipe( eq::Node* parent ) 
00042     : eq::Pipe( parent ) 
00043     , _isInitialized( false )
00044 {
00045 }
00046 
00047 bool Pipe::configInit( const eq::uint128_t& initID )
00048 {
00049     if( !eq::Pipe::configInit( initID )) {
00050         return false;
00051     }
00052 
00053     Config*         config      = static_cast<Config*>( getConfig() );
00054     const InitData& initData    = config->getInitData();
00055     const eq::uint128_t frameDataID = initData.getFrameDataID();
00056 
00057     _data = new SharedData(config);
00058     EQASSERT( _data );
00059 
00060     FrameData& fd = const_cast<FrameData&>(_data->getFrameData());
00061     fd.init(initData.getNumBodies());
00062 
00063     const bool mapped = config->mapObject( &fd, frameDataID );
00064     EQASSERT( mapped );
00065 
00066     return mapped;
00067 }
00068 
00069 bool Pipe::configExit()
00070 {
00071     eq::Config* config = getConfig();
00072     FrameData& fd = const_cast<FrameData&>(_data->getFrameData());
00073 
00074     config->unmapObject( &fd );
00075     EQASSERT( _data );
00076     _data->releaseMemory();
00077     delete _data;
00078     return eq::Pipe::configExit();
00079 }
00080 
00081 void Pipe::frameStart( const eq::uint128_t& frameID, const uint32_t frameNumber )
00082 {
00083     
00084     FrameData& fd = const_cast<FrameData&>(_data->getFrameData());
00085 
00086     // Allocate the CUDA memory after proper CUDA initialisation!
00087     if( _isInitialized == false) 
00088     {
00089         fd.initHostData();
00090         _isInitialized = true;
00091     }
00092 
00093     // Sync for the next frame - wait for the data broadcast!
00094     fd.sync( frameID );
00095     eq::Pipe::frameStart( frameID, frameNumber );
00096 }
00097 }
Generated on Fri Jun 8 2012 15:44:32 for Equalizer 1.2.1 by  doxygen 1.8.0