📄 slaveport.c
字号:
/**************************************************************************
* Name : slaveport.c
* Author : BCB
* Created : 23/05/2003
*
* Copyright : 2003 by Imagination Technologies Limited. All rights reserved.
* : No part of this software, either material or conceptual
* : may be copied or distributed, transmitted, transcribed,
* : stored in a retrieval system or translated into any
* : human or computer language in any form by any means,
* : electronic, mechanical, manual or other-wise, or
* : disclosed to third parties without the express written
* : permission of Imagination Technologies Limited, Unit 8, HomePark
* : Industrial Estate, King's Langley, Hertfordshire,
* : WD4 8LZ, U.K.
*
* Platform : ANSI
*
* $Date: 2004/10/26 11:20:30 $ $Revision: 1.5.1.1 $
* $Log: slaveport.c $
**************************************************************************/
#define MODULE_ID MODID_SLAVEPORT
#include "context.h"
#include "slaveport.h"
/***********************************************************************************
Function Name : StartTriangle[List/Strip/Fan]
Inputs : gc
Outputs : -
Returns : -
Description : Emits a triangle [list/strip/fan] block header.
************************************************************************************/
IMG_VOID StartTriangleList(GLESContext *gc)
{
IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_VERTEXFACELIST | gc->sHWContext.ui32PrimitiveHeader;
WriteToSlavePort(gc, &ui32BlockHeader, 1);
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
WriteToSlavePort(gc, &gc->sHWContext.ui32VGPClipControlWord, 1);
#endif
}
IMG_VOID StartTriangleStrip(GLESContext *gc)
{
IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_VERTEXFACESTRIP | gc->sHWContext.ui32PrimitiveHeader;
WriteToSlavePort(gc, &ui32BlockHeader, 1);
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
WriteToSlavePort(gc, &gc->sHWContext.ui32VGPClipControlWord, 1);
#endif
}
IMG_VOID StartTriangleFan(GLESContext *gc)
{
IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_VERTEXFACEFAN | gc->sHWContext.ui32PrimitiveHeader;
WriteToSlavePort(gc, &ui32BlockHeader, 1);
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
WriteToSlavePort(gc, &gc->sHWContext.ui32VGPClipControlWord, 1);
#endif
}
/***********************************************************************************
Function Name : StartLineStrip
Inputs : gc
Outputs : -
Returns : -
Description : Emits a line strip block header, with line width state
************************************************************************************/
IMG_VOID StartLineStrip(GLESContext *gc)
{
IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_VERTEXLINESTRIP | gc->sHWContext.ui32PrimitiveHeader;
WriteToSlavePort(gc, &ui32BlockHeader, 1);
WriteToSlavePort(gc, gc->sState.sLine.pfLineWidth, 1);
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
WriteToSlavePort(gc, &gc->sHWContext.ui32VGPClipControlWord, 1);
#endif
}
/***********************************************************************************
Function Name : StartPointList
Inputs : gc
Outputs : -
Returns : -
Description : Emits a point list block header, with point size state
************************************************************************************/
IMG_VOID StartPointList(GLESContext *gc)
{
IMG_UINT32 ui32BlockHeader = MBX1_TAOBJTYPE_POINTS | gc->sHWContext.ui32PrimitiveHeader;
WriteToSlavePort(gc, &ui32BlockHeader, 1);
WriteToSlavePort(gc, gc->sState.sPoint.pfPointSize, 1);
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
WriteToSlavePort(gc, &gc->sHWContext.ui32VGPClipControlWord, 1);
#endif
}
/***********************************************************************************
Function Name : EndPrimitive
Inputs : gc
Outputs : -
Returns : -
Description : Emits a terminate to indicate end of strip/fan.
************************************************************************************/
IMG_VOID EndPrimitive(GLESContext *gc)
{
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 2;
#else
IMG_UINT32 ui32Terminate = 0;
#endif
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#else
WriteToSlavePortTerminate(gc, ui32Terminate);
#endif
}
/***********************************************************************************
Function Name : EndPrimitive
Inputs : gc
Outputs : -
Returns : -
Description : Emits a terminate to indicate end primitive block
************************************************************************************/
IMG_VOID EndPrimitiveBlock(GLESContext *gc)
{
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 3;
#else
IMG_UINT32 ui32Terminate = 1;
#endif
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#else
WriteToSlavePortTerminate(gc, ui32Terminate);
#endif
}
/***********************************************************************************
Function Name : EmitState
Inputs : gc, puState, uNumWords
Outputs : -
Returns : -
Description : Emits some state to the slaveport
************************************************************************************/
IMG_VOID EmitState(GLESContext *gc, IMG_UINT32 *pui32State, IMG_UINT32 ui32NumWords)
{
GLES_INC_COUNT(GLES_TIMER_TOTAL_STATE_COUNT, ui32NumWords);
WriteToSlavePort(gc, pui32State, ui32NumWords);
}
/***********************************************************************************
Function Name : OutputVerticesSpecialObject
Inputs : gc, pfVert, ui32NumVerts, ui32VertexSize
Outputs : -
Returns : -
Description : Emits some viewport vertex data to the slaveport
************************************************************************************/
IMG_VOID OutputVerticesSpecialObject(GLESContext *gc, IMG_FLOAT *pfVert,
IMG_UINT32 ui32NumVerts, IMG_UINT32 ui32VertexSize)
{
#ifdef USE_TERMINATE_WORD
IMG_UINT32 i;
IMG_UINT32 ui32Terminate = 0;
for(i=0; i< ui32NumVerts; i++)
{
WriteToSlavePort(gc, &ui32Terminate, 1);
WriteToSlavePort(gc, &pfVert[i*ui32VertexSize], ui32VertexSize);
}
#else
WriteToSlavePort(gc, pfVert, ui32VertexSize*ui32NumVerts);
#endif
}
#if (defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)) && !defined(PASSTHROUGH_BUILD)
/***********************************************************************************
Function Name : OutputVertex
Inputs : gc, pvInput, ui32Count
Outputs : -
Returns : -
Description : Emits some vertex data to the slaveport
************************************************************************************/
IMG_VOID OutputVertex(GLESContext *gc, IMG_VOID *pvInput, IMG_UINT32 ui32Count)
{
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, pvInput, ui32Count);
}
#else
#if !defined(USE_FIXED_POINT_VERTICES)
/***********************************************************************************
Function Name : OutputVertices[C/CF/CT0/CFT0/CT1/CFT1/CMT/CFMT]
Inputs : gc, psVertex, ui32Count
Outputs : -
Returns : -
Description : Emits some vertex data with different components to the slaveport
************************************************************************************/
static IMG_VOID OutputVerticesC(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
}
}
static IMG_VOID OutputVerticesCF(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
IMG_UINT32 ui32Fog = FogConvert(psVertex[i].fFog);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &ui32Fog, 1);
}
}
static IMG_VOID OutputVerticesCT0(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[0].fX, 2);
}
}
static IMG_VOID OutputVerticesCFT0(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
IMG_UINT32 ui32Fog = FogConvert(psVertex[i].fFog);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &ui32Fog, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[0].fX, 2);
}
}
static IMG_VOID OutputVerticesCT1(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[1].fX, 2);
}
}
static IMG_VOID OutputVerticesCFT1(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
IMG_UINT32 ui32Fog = FogConvert(psVertex[i].fFog);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &ui32Fog, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[1].fX, 2);
}
}
static IMG_VOID OutputVerticesCMT(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[0].fX, 2);
WriteToSlavePort(gc, &psVertex[i].asTexture[1].fX, 2);
}
}
static IMG_VOID OutputVerticesCFMT(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count)
{
IMG_UINT32 i;
#ifdef USE_TERMINATE_WORD
IMG_UINT32 ui32Terminate = 0;
#endif
for(i=0; i< ui32Count; i++)
{
IMG_UINT32 ui32Color = ColorConvertToHWFormat(&psVertex[i].sColor);
IMG_UINT32 ui32Fog = FogConvert(psVertex[i].fFog);
#ifdef USE_TERMINATE_WORD
WriteToSlavePort(gc, &ui32Terminate, 1);
#endif
WriteToSlavePort(gc, &psVertex[i].sWindow.fX, 4);
WriteToSlavePort(gc, &ui32Color, 1);
WriteToSlavePort(gc, &ui32Fog, 1);
WriteToSlavePort(gc, &psVertex[i].asTexture[0].fX, 2);
WriteToSlavePort(gc, &psVertex[i].asTexture[1].fX, 2);
}
}
/* Function table with outputvertices procs. Picked based on vertex format */
IMG_VOID (*apfnOutputVertexProcs[8])(GLESContext *gc, GLESvertex *psVertex, IMG_UINT32 ui32Count) =
{
OutputVerticesC, OutputVerticesCF, OutputVerticesCT0, OutputVerticesCFT0,
OutputVerticesCT1, OutputVerticesCFT1, OutputVerticesCMT, OutputVerticesCFMT
};
#endif /* !USE_FIXED_POINT_VERTICES */
#endif /* !SUPPORT_VGP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -