Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

immgmanager.h

Go to the documentation of this file.
00001 /*           Copyright (C) 2001 Sony Computer Entertainment America
00002                               All Rights Reserved
00003                                SCEA Confidential                                */
00004 
00005 #ifndef ps2gl_immgmanager_h
00006 #define ps2gl_immgmanager_h
00007 
00008 #include "ps2gl/gmanager.h"
00009 
00010 /********************************************
00011  * CImmGeomManager - the immediate renderer
00012  */
00013 
00014 class CImmGeomManager : public CGeomManager {
00015 
00016       CVsmManager       VsmMananger;
00017 
00018       // a double set of buffers for storing immediate-mode vertices, normals, etc.
00019       // these don't really need to be dma packets since they will be reffed by
00020       // the microcode
00021       CDmaPacket        VertexBuf0, NormalBuf0, TexCoordBuf0, ColorBuf0;
00022       CDmaPacket        VertexBuf1, NormalBuf1, TexCoordBuf1, ColorBuf1;
00023       CDmaPacket        *CurVertexBuf, *CurNormalBuf, *CurTexCoordBuf, *CurColorBuf;
00024 
00025       // list of memory to free after this frame is finished
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       // util - add a block of memory to a list to be freed at the end of the
00043       // frame
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       // for microcode
00059 
00060       // microcode needs to be able to request these for storage when no
00061       // normal, tex coord or vertex color is supplied for each vertex
00062       inline CDmaPacket& GetNormalBuf() { return *CurNormalBuf; }
00063       inline CDmaPacket& GetTexCoordBuf() { return *CurTexCoordBuf; }
00064 
00065       void BeginDListDef();
00066 
00067       // geometry specification
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

ps2gl version 0.2