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

vsmmanager.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_vsmmanager_h
00006 #define ps2gl_vsmmanager_h
00007 
00008 #include "eestruct.h"
00009 
00010 #include "ps2s/vif.h"
00011 
00012 #include "GL/gl.h"
00013 
00014 /********************************************
00015  * flags describing what pieces of microcode can do/
00016  * need to do
00017  */
00018 
00019 class CVu1RendererProps {
00020    public:
00021       unsigned int PrimType             : 3;
00022       unsigned int Lighting             : 1;
00023       unsigned int LightTypes           : 5;
00024       unsigned int Texture              : 1;
00025       unsigned int Specular             : 1;
00026       unsigned int PerVtxMaterial       : 3;
00027       unsigned int CullFace             : 1;
00028       unsigned int TwoSidedLighting     : 1;
00029 
00030       // convert to unsigned int
00031 
00032       inline operator unsigned int() const {
00033          unsigned int value;
00034          asm (" ### CVu1RendererProps to uint ### " : "=r" (value) : "0" (*this) );
00035          return value;
00036       }
00037 };
00038 
00039 namespace Vu1RendererProps {
00040    typedef enum { kPtsLinesStripsFans   = 1 << 0,
00041                   kTriangles            = 1 << 1,
00042                   kQuads                = 1 << 2 } tPrimType;
00043 
00044    typedef enum { k3DirLights           = 1 << 0,
00045                   k8DirLights           = 1 << 1,
00046                   k1PtLight             = 1 << 2,
00047                   k2PtLights            = 1 << 3,
00048                   k8PtLights            = 1 << 4 } tLightTypes;
00049 
00050    typedef enum { kNone                 = 1 << 0,
00051                   kDiffuse              = 1 << 1,
00052                   kSpecular             = 1 << 2 } tPerVtxMaterial;
00053 }      
00054 
00055 /********************************************
00056  * CVsmManager - code common to all rendering microcode
00057  */
00058 
00059 class CGLContext;
00060 class CImmGeomManager;
00061 class CVifSCDmaPacket;
00062 class CGeometryBlock;
00063 
00064 typedef enum { kDirectional, kPoint, kSpot } tLightType;
00065 
00066 typedef struct {
00067       void              *packet;
00068       CVu1RendererProps provides;
00069       unsigned char     inputQuadsPerVert, outputQuadsPerVert;
00070 } tVu1Renderer;
00071 
00072 class CVsmManager {
00073       CGLContext        &GLContext;
00074 
00075       CVu1RendererProps VsmRequirements;
00076       bool              VsmReqsHaveChanged;
00077       const tVu1Renderer        *CurrentVu1Renderer;
00078       static const tVu1Renderer Vu1Renderers[];
00079       static const int  NumVu1Renderers;
00080 
00081       sceGifTag         GifTag;
00082 
00083       // cache some state for use in DrawArrays
00084       bool              TexEnabled;
00085       bool              ColorMaterialEnabled;
00086 
00087       int               WordsPerVertex, WordsPerNormal, WordsPerTexCoord, WordsPerColor;
00088       unsigned int      VertexUnpackMode, NormalUnpackMode;
00089       unsigned int      TexCoordUnpackMode, ColorUnpackMode;
00090       Vifs::tMask       VertexUnpackMask, NormalUnpackMask;
00091       Vifs::tMask       TexCoordUnpackMask, ColorUnpackMask;
00092 
00093       void GetUnpackAttribs( int numWords, unsigned int &mode, Vifs::tMask &mask );
00094 
00095       void FindNumBuffers( int numToAdd, int numVertsToRestart,
00096                            int numVertsAlreadyInFirstBuffer, int maxVertsPerBuffer,
00097                            int &numVertsFirstBuffer, int &numVertsLastBuffer,
00098                            int &numBuffers );
00099       void XferBlock( CVifSCDmaPacket &packet, CImmGeomManager &gmanager, GLenum primType,
00100                       void *vertices, void *normals, void *texCoords, void *colors,
00101                       int vu1Offset, int firstElement, int numToAdd );
00102       void XferBufferHeader( CVifSCDmaPacket& packet, GLenum primType,
00103                              int numVerts,
00104                              int numStripsInBuffer, unsigned short *stripOffsets );
00105       void XferVectors( CVifSCDmaPacket &packet, unsigned int *dataStart,
00106                         int startOffset, int numVectors, int wordsPerVec,
00107                         Vifs::tMask unpackMask, tU32 unpackMode,
00108                         int vu1MemOffset );
00109 
00110       void DrawStrip( CVifSCDmaPacket &packet, CImmGeomManager &gmanager,
00111                       CGeometryBlock &block, int maxVertsPerBuffer );
00112       void FinishBuffer( CVifSCDmaPacket &packet, CGeometryBlock &block,
00113                          int numVertsInBuffer, int vu1QuadsPerVert,
00114                          int numStripsInBuffer, unsigned short *stripOffsets );
00115 
00116    public:
00117       CVsmManager( CGLContext &context);
00118 
00119       void DrawArrays( CVifSCDmaPacket &packet, CImmGeomManager &gmanager,
00120                        CGeometryBlock &block );
00121 
00122       void TransferSetupInfo( CVifSCDmaPacket &packet,
00123                               CImmGeomManager &gmanager, GLenum primType );
00124 
00125       void SyncGifTag( CImmGeomManager &gmanager, GLenum primType );
00126       sceGifTag GetGifTag() const { return GifTag; }
00127 
00128       bool SyncVu1Renderer();
00129       void XferVu1Renderer( CVifSCDmaPacket &packet );
00130 
00131       // state updates
00132 
00133       void NumLightsChanged( tLightType type, int num );
00134       void PrimChanged( unsigned char prim );
00135       void TexEnabledChanged( bool enabled );
00136       void LightingEnabledChanged( bool enabled );
00137       void SpecularEnabledChanged( bool enabled );
00138       void PerVtxMaterialChanged( Vu1RendererProps::tPerVtxMaterial matType );
00139       void CullFaceEnabledChanged( bool enabled );
00140 };
00141 
00142 #endif // ps2gl_vsmmanager_h

ps2gl version 0.2