128 lines
4.4 KiB
C++
128 lines
4.4 KiB
C++
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#ifndef NL_VERTEX_STREAM_MANAGER_H
|
|
#define NL_VERTEX_STREAM_MANAGER_H
|
|
|
|
#include "nel/misc/types_nl.h"
|
|
|
|
|
|
#include "nel/misc/types_nl.h"
|
|
#include "nel/3d/driver.h"
|
|
|
|
|
|
namespace NL3D
|
|
{
|
|
|
|
|
|
// ***************************************************************************
|
|
/**
|
|
* A class used to fill a virtual Vertexbuffer, while rendering it, avoiding Stalls during Locks. Actually multiple versions
|
|
* of VertexBuffer are kept and the swapVBHard() method cycles around them.
|
|
* NB: it is used for instance to render all skins of a CSkeletonModel, in just one CVertexStreamManager.
|
|
* This allow optimisation because less VBuffer activation is needed.
|
|
* NB: only a single lock/unlock may happen between 2 calls of swapVBHard
|
|
* \author Lionel Berenguier
|
|
* \author Nevrax France
|
|
* \date 2002
|
|
*/
|
|
class CVertexStreamManager
|
|
{
|
|
public:
|
|
|
|
/// Constructor
|
|
CVertexStreamManager();
|
|
~CVertexStreamManager();
|
|
|
|
/// \name Init/Setup
|
|
// @{
|
|
|
|
/** init the manager with a driver, allocate the VBHards, and setup the vertexFormat.
|
|
* Must call each time the drive changes.
|
|
* NB: if VBufferHard creation fail (not supported etc...), then a VBSoft is created instead (and just one since not useful)
|
|
* \param numVBHard the number of VBHard to create. The max you set, the lower lock you'll have.
|
|
* \param vbName base, for Lock profiling
|
|
* \param allowVolatileVertexBuffer allow to use a volatile vertex buffer instead of several buffers on devices that support it
|
|
* NB : in this case, you should not keep the vertex buffer locked outside of render, you should follow an atomic lock/unlock/render sequence
|
|
*/
|
|
void init(IDriver *driver, uint vertexFormat, uint maxVertices, uint numVBHard, const std::string &vbName, bool allowVolatileVertexBuffer = false);
|
|
/// release the VBHard. init() can be called after this.
|
|
void release();
|
|
|
|
/// get the numVBhard used (Nb: if !vbHardMode(), still returns the argument passed in init(), ie not 0 or 1)
|
|
uint getNumVB() const {return _NumVB;}
|
|
/// return the driver used.
|
|
IDriver *getDriver() const {return _Driver;}
|
|
/// get the vertexFormat
|
|
uint getVertexFormat() const {return _VertexFormat;}
|
|
/// get the vertexSize
|
|
uint getVertexSize() const {return _VertexSize;}
|
|
/// get max vertices the Buffer allows.
|
|
uint getMaxVertices() const {return _MaxVertices;}
|
|
|
|
// @}
|
|
|
|
/// \name Rendering. Those method assert if init() not called with correct parameters.
|
|
// @{
|
|
|
|
/** lock the currently activated VBHard, for future filling
|
|
* NB: only a single lock/unlock may happen between 2 calls of swapVBHard
|
|
*/
|
|
uint8 *lock();
|
|
/** unlock the currently activated VBHard. Tell how many vertices have changed.
|
|
* NB: only a single lock/unlock may happen between 2 calls of swapVBHard
|
|
*/
|
|
void unlock(uint numVertices);
|
|
|
|
/// activate the currentVBhard as the current VB in the driver, for future rendering
|
|
void activate();
|
|
|
|
/// return true if the current activated VBHard is in BGRA mode. nlassert(_Lockdone)
|
|
bool isBRGA() const;
|
|
|
|
/** Swap to the next VBHard. This allow some parralelism, since CPU fill one VBHard while the other is rendered
|
|
* NB: no-op if the vertex stream manager falls down to the VBSoft solution.
|
|
*/
|
|
void swapVBHard();
|
|
|
|
// @}
|
|
|
|
// ********************
|
|
private:
|
|
uint _NumVB;
|
|
|
|
NLMISC::CRefPtr<IDriver> _Driver;
|
|
std::vector<CVertexBuffer> _VB;
|
|
CVertexBuffer _VBVolatile; // volatile vertex buffer, used if supported by driver
|
|
CVertexBufferReadWrite _VBA;
|
|
bool _InitOk;
|
|
bool _SupportVolatileVB;
|
|
bool _LockDone;
|
|
uint _VertexFormat;
|
|
uint _VertexSize;
|
|
uint _MaxVertices;
|
|
|
|
uint _CurentVB;
|
|
|
|
};
|
|
|
|
|
|
} // NL3D
|
|
|
|
|
|
#endif // NL_VERTEX_STREAM_MANAGER_H
|
|
|
|
/* End of vertex_stream_manager.h */
|