00001
00002
00003
00004
00005 #ifndef ps2gl_immgmanager_h
00006 #define ps2gl_immgmanager_h
00007
00008 #include "ps2gl/gmanager.h"
00009
00010
00011
00012
00013
00014 class CImmGeomManager : public CGeomManager {
00015
00016 CVsmManager VsmMananger;
00017
00018
00019
00020
00021 CDmaPacket VertexBuf0, NormalBuf0, TexCoordBuf0, ColorBuf0;
00022 CDmaPacket VertexBuf1, NormalBuf1, TexCoordBuf1, ColorBuf1;
00023 CDmaPacket *CurVertexBuf, *CurNormalBuf, *CurTexCoordBuf, *CurColorBuf;
00024
00025
00026 static const int kMaxBuffersToBeFreed = 1024;
00027 int CurBuffer;
00028 void *BuffersToBeFreed[2][kMaxBuffersToBeFreed];
00029 int NumBuffersToBeFreed[2];
00030
00031 void FreeWaitingBuffers();
00032
00033 CGeometryBlock Geometry;
00034
00035 void DrawBlock( CGeometryBlock &block );
00036 void CommitNewGeom();
00037
00038 public:
00039 CImmGeomManager( CGLContext &context, int immBufferQwordSize );
00040 virtual ~CImmGeomManager();
00041
00042
00043
00044 inline void AddBufferToBeFreed( void *buf ) {
00045 mAssert( NumBuffersToBeFreed[CurBuffer] < kMaxBuffersToBeFreed );
00046 BuffersToBeFreed[CurBuffer][NumBuffersToBeFreed[CurBuffer]++] = buf;
00047 }
00048
00049 CVsmManager& GetVsmManager() { return VsmMananger; }
00050
00051 void SwapBuffers();
00052
00053 void SyncVu1Context( GLenum primType );
00054 void SyncVu1Renderer();
00055 void SyncGsContext();
00056 void SyncColorMaterial( bool pvColorsArePresent );
00057
00058
00059
00060
00061
00062 inline CDmaPacket& GetNormalBuf() { return *CurNormalBuf; }
00063 inline CDmaPacket& GetTexCoordBuf() { return *CurTexCoordBuf; }
00064
00065 void BeginDListDef();
00066
00067
00068
00069 void BeginGeom( GLenum mode );
00070 void Vertex( cpu_vec_xyzw newVert );
00071 void Normal( cpu_vec_xyz normal );
00072 void TexCoord( float u, float v );
00073 void Color( cpu_vec_xyzw color );
00074 void EndGeom();
00075 void DrawArrays( GLenum mode, int first, int count );
00076 void Flush();
00077 };
00078
00079 #endif // ps2gl_immgmanager_h