// Filename: cycleDataStageWriter.I // Created by: drose (06Feb06) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) Carnegie Mellon University. All rights reserved. // // All use of this software is subject to the terms of the revised BSD // license. You should have received a copy of this license along // with this source code in a file named "LICENSE." // //////////////////////////////////////////////////////////////////// #ifndef CPPPARSER #ifdef DO_PIPELINING // This is the implementation for full support of pipelining (as well // as the sanity-check only implementation). //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (full) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int stage, Thread *current_thread) : _cycler(&cycler), _current_thread(current_thread), _stage(stage) { _pointer = _cycler->write_stage(_stage, _current_thread); nassertv(_pointer != (CycleDataType *)NULL); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (full) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int stage, bool force_to_0, Thread *current_thread) : _cycler(&cycler), _current_thread(current_thread), _stage(stage) { _pointer = _cycler->write_stage_upstream(_stage, force_to_0, _current_thread); nassertv(_pointer != (CycleDataType *)NULL); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Copy Constructor (full) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(const CycleDataStageWriter ©) : _cycler(copy._cycler), _current_thread(copy._current_thread), _pointer(copy._pointer), _stage(copy._stage) { nassertv(_pointer != (CycleDataType *)NULL); _cycler->increment_write(_pointer); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Copy Assigment (full) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE void CycleDataStageWriter:: operator = (const CycleDataStageWriter ©) { nassertv(_pointer == (CycleDataType *)NULL); nassertv(_current_thread == copy._current_thread); _cycler = copy._cycler; _pointer = copy._pointer; _stage = copy._stage; nassertv(_pointer != (CycleDataType *)NULL); _cycler->increment_write(_pointer); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (full) // Access: Public // Description: This flavor of the constructor elevates the pointer // from the CycleDataLockedStageReader from a read to a write // pointer (and invalidates the reader). //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int stage, CycleDataLockedStageReader &take_from) : _cycler(&cycler), _current_thread(take_from.get_current_thread()), _stage(stage) { _pointer = _cycler->elevate_read_stage(_stage, take_from.take_pointer(), _current_thread); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (full) // Access: Public // Description: This flavor of the constructor elevates the pointer // from the CycleDataLockedStageReader from a read to a write // pointer (and invalidates the reader). //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int stage, CycleDataLockedStageReader &take_from, bool force_to_0) : _cycler(&cycler), _current_thread(take_from.get_current_thread()), _stage(stage) { _pointer = _cycler->elevate_read_stage_upstream(_stage, take_from.take_pointer(), force_to_0, _current_thread); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Destructor (full) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: ~CycleDataStageWriter() { if (_pointer != (CycleDataType *)NULL) { _cycler->release_write_stage(_stage, _pointer); } } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::operator -> (full) // Access: Public // Description: This provides an indirect member access to the actual // CycleData data. //////////////////////////////////////////////////////////////////// template INLINE CycleDataType *CycleDataStageWriter:: operator -> () { nassertr(_pointer != (CycleDataType *)NULL, _cycler->cheat()); return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::operator -> (full) // Access: Public // Description: This provides an indirect member access to the actual // CycleData data. //////////////////////////////////////////////////////////////////// template INLINE const CycleDataType *CycleDataStageWriter:: operator -> () const { nassertr(_pointer != (CycleDataType *)NULL, _cycler->cheat()); return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Typecast pointer (full) // Access: Public // Description: This allows the CycleDataStageWriter to be passed to any // function that expects a CycleDataType pointer. //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: operator CycleDataType * () { nassertr(_pointer != (CycleDataType *)NULL, _cycler->cheat()); return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::get_current_thread (full) // Access: Public // Description: Returns the Thread pointer of the currently-executing // thread, as passed to the constructor of this object. //////////////////////////////////////////////////////////////////// template INLINE Thread *CycleDataStageWriter:: get_current_thread() const { return _current_thread; } #else // !DO_PIPELINING // This is the trivial, do-nothing implementation. //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (trivial) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int, Thread *) { _pointer = cycler.cheat(); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (trivial) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &cycler, int, bool, Thread *) { _pointer = cycler.cheat(); } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Copy Constructor (trivial) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(const CycleDataStageWriter ©) : _pointer(copy._pointer) { } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Copy Assigment (trivial) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE void CycleDataStageWriter:: operator = (const CycleDataStageWriter ©) { _pointer = copy._pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (trivial) // Access: Public // Description: This flavor of the constructor elevates the pointer // from the CycleDataLockedStageReader from a read to a write // pointer (and invalidates the reader). //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &, int, CycleDataLockedStageReader &take_from) : _pointer((CycleDataType *)take_from.take_pointer()) { } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Constructor (trivial) // Access: Public // Description: This flavor of the constructor elevates the pointer // from the CycleDataLockedStageReader from a read to a write // pointer (and invalidates the reader). //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: CycleDataStageWriter(PipelineCycler &, int, CycleDataLockedStageReader &take_from, bool) : _pointer((CycleDataType *)take_from.take_pointer()) { } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Destructor (trivial) // Access: Public // Description: //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: ~CycleDataStageWriter() { } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::operator -> (trivial) // Access: Public // Description: This provides an indirect member access to the actual // CycleData data. //////////////////////////////////////////////////////////////////// template INLINE CycleDataType *CycleDataStageWriter:: operator -> () { return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::operator -> (trivial) // Access: Public // Description: This provides an indirect member access to the actual // CycleData data. //////////////////////////////////////////////////////////////////// template INLINE const CycleDataType *CycleDataStageWriter:: operator -> () const { return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::Typecast pointer (trivial) // Access: Public // Description: This allows the CycleDataStageWriter to be passed to any // function that expects a CycleDataType pointer. //////////////////////////////////////////////////////////////////// template INLINE CycleDataStageWriter:: operator CycleDataType * () { return _pointer; } //////////////////////////////////////////////////////////////////// // Function: CycleDataStageWriter::get_current_thread (trivial) // Access: Public // Description: Returns the Thread pointer of the currently-executing // thread, as passed to the constructor of this object. //////////////////////////////////////////////////////////////////// template INLINE Thread *CycleDataStageWriter:: get_current_thread() const { return Thread::get_current_thread(); } #endif // DO_PIPELINING #endif // CPPPARSER