📄 vertex.c
字号:
/* ************************************************************************* *\
** ************************************************************************* **
**
** INTEL Corporation Proprietary Information
**
** This listing is supplied under the terms of a license
** agreement with INTEL Corporation and may not be copied
** nor disclosed except in accordance with the terms of
** that agreement.
**
** Copyright (c) 2003 Intel Corporation.
** All Rights Reserved.
**
** ************************************************************************* **
\* ************************************************************************* */
/**************************************************************************
* Name : vertex.c
* Author : BCB
* Created : 01/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
**************************************************************************/
#define MODULE_ID MODID_VERTEX
#include "context.h"
#include "HXFProfiler.h"
#include "CTL.h"
// from hxfslaveport.c
void* HXFBeginPrimitiveList ( void*, void*, void*, CTLU32 );
void* HXFBeginClippedTriList ( void* );
void* HXFBeginClippedLineList ( void* );
void* HXFEndPrimitiveList ( void* );
// from UtilsARM.s
void HXFCountVertices_8To16( HUINT16* pIndices, const HUINT8* pSrcIndices, HUINT32 NumIndices,
HUINT32* out_pMinIndex, HUINT32* out_pMaxIndex );
void HXFCountVertices( const HUINT16* pIndices, HUINT32 NumIndices, HUINT32* out_pMinIndex,
HUINT32* out_pMaxIndex );
/***********************************************************************************
Function Name : glClientActiveTexture
Inputs : texture
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets current texture coordinate array unit.
************************************************************************************/
GLAPI void APIENTRY glClientActiveTexture(GLenum texture)
{
IMG_UINT32 ui32Unit;
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
ui32Unit = texture - GL_TEXTURE0;
if (ui32Unit < 0 || ui32Unit >= GLES_MAX_TEXTURE_UNITS)
{
SetError(gc, GL_INVALID_ENUM);
return;
}
gc->ui32ClientActiveTexture = ui32Unit;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
}
/***********************************************************************************
Function Name : glEnableClientState
Inputs : array
Outputs : -
Returns : -
Description : ENTRYPOINT: Enables coordinate array specified by array
************************************************************************************/
GLAPI void APIENTRY glEnableClientState(GLenum array)
{
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
switch(array)
{
case GL_VERTEX_ARRAY:
gc->sVertexArray.ui32ArrayEnables |= VARRAY_VERT_ENABLE;
break;
case GL_NORMAL_ARRAY:
gc->sVertexArray.ui32ArrayEnables |= VARRAY_NORMAL_ENABLE;
break;
case GL_COLOR_ARRAY:
gc->sVertexArray.ui32ArrayEnables |= VARRAY_COLOR_ENABLE;
break;
case GL_TEXTURE_COORD_ARRAY:
gc->sVertexArray.ui32ArrayEnables |= (VARRAY_TEXCOORD0_ENABLE<<gc->ui32ClientActiveTexture);
break;
default:
SetError(gc, GL_INVALID_ENUM);
return;
}
gc->ui32DirtyMask |= GLES_DIRTY_SW_VARRAY;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
}
/***********************************************************************************
Function Name : glDisableClientState
Inputs : array
Outputs : -
Returns : -
Description : ENTRYPOINT: Disables coordinate array specified by array.
************************************************************************************/
GLAPI void APIENTRY glDisableClientState(GLenum array)
{
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
switch(array)
{
case GL_VERTEX_ARRAY:
gc->sVertexArray.ui32ArrayEnables &= ~VARRAY_VERT_ENABLE;
break;
case GL_NORMAL_ARRAY:
gc->sVertexArray.ui32ArrayEnables &= ~VARRAY_NORMAL_ENABLE;
break;
case GL_COLOR_ARRAY:
gc->sVertexArray.ui32ArrayEnables &= ~VARRAY_COLOR_ENABLE;
break;
case GL_TEXTURE_COORD_ARRAY:
gc->sVertexArray.ui32ArrayEnables &= ~(VARRAY_TEXCOORD0_ENABLE<<gc->ui32ClientActiveTexture);
break;
default:
SetError(gc, GL_INVALID_ENUM);
return;
}
gc->ui32DirtyMask |= GLES_DIRTY_SW_VARRAY;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
}
/***********************************************************************************
Function Name : glColor4[f/x]
Inputs : red, green, blue, alpha
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets current color
************************************************************************************/
#if defined( PROFILE_COMMON )
GLAPI void APIENTRY glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
{
__GL_GET_CONTEXT();
gc->sState.sCurrent.Color = *((CTLCOLOR4*)&red);
}
GLAPI void APIENTRY glColor4x( GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha )
{
glColor4f( XtoF( red ), XtoF( green ), XtoF( blue ), XtoF( alpha ));
} /* glColor4x */
#elif defined( PROFILE_COMMON_LITE )
GLAPI void APIENTRY glColor4x( GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha )
{
__GL_GET_CONTEXT();
HXF_PROFILER_START( HXFPROFILE_STATE_VERTEX );
gc->sState.sCurrent.Color = *((CTLCOLOR4*)&red);
HXF_PROFILER_STOP( HXFPROFILE_STATE_VERTEX );
} /* glColorx */
#else
#error "Profile not defined for glColor"
#endif
/***********************************************************************************
Function Name : glMultiTexCoord4[f/x]
Inputs : target, s, t, r, q
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets current texture coordinate on unit specified
by target.
************************************************************************************/
#if defined(PROFILE_COMMON)
GLAPI void APIENTRY glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
IMG_UINT32 ui32Unit = target - GL_TEXTURE0;
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
if (ui32Unit < 0 || ui32Unit >= GLES_MAX_TEXTURE_UNITS)
{
SetError(gc, GL_INVALID_ENUM);
return;
}
gc->sState.sCurrent.aTextureCoords[ui32Unit].x = s;
gc->sState.sCurrent.aTextureCoords[ui32Unit].y = t;
gc->sState.sCurrent.aTextureCoords[ui32Unit].z = r;
gc->sState.sCurrent.aTextureCoords[ui32Unit].w = q;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
}
GLAPI void APIENTRY glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
{
glMultiTexCoord4f( target, XtoF( s ), XtoF( t ), XtoF( r ), XtoF( q ));
}
#elif defined( PROFILE_COMMON_LITE )
GLAPI void APIENTRY glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
{
IMG_UINT32 ui32Unit = target - GL_TEXTURE0;
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
if (ui32Unit < 0 || ui32Unit >= GLES_MAX_TEXTURE_UNITS)
{
SetError(gc, GL_INVALID_ENUM);
return;
}
gc->sState.sCurrent.aTextureCoords[ui32Unit].x = s;
gc->sState.sCurrent.aTextureCoords[ui32Unit].y = t;
gc->sState.sCurrent.aTextureCoords[ui32Unit].z = r;
gc->sState.sCurrent.aTextureCoords[ui32Unit].w = q;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
}
#endif
/***********************************************************************************
Function Name : glNormal3[f/x]
Inputs : nx, ny, nz
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets current normal.
************************************************************************************/
#if defined(PROFILE_COMMON)
GLAPI void APIENTRY glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
{
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
gc->sState.sCurrent.Normal = *((CTLVECTOR3*)&nx);
}
#endif
GLAPI void APIENTRY glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz)
{
__GL_GET_CONTEXT();
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
gc->sState.sCurrent.Normal = *((CTLVECTOR3*)&nx);
}
/***********************************************************************************
Function Name : glColorPointer
Inputs : size, type, stride, pointer
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets array pointer/size/type for color data
************************************************************************************/
GLAPI void APIENTRY glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
CTL_ARRAY_FORMAT ctlFmt = CTLAFORMAT_NONE;
HUINT32 ui32ImpliedStride;
__GL_GET_CONTEXT();
HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);
if (stride < 0 || size != 4)
{
SetError(gc, GL_INVALID_VALUE);
return;
}
switch(type)
{
case GL_UNSIGNED_BYTE:
ctlFmt = CTLAFORMAT_UINT8;
ui32ImpliedStride = 4;
break;
case GL_FIXED:
ctlFmt = CTLAFORMAT_FIXED;
ui32ImpliedStride = 16;
break;
#if defined(PROFILE_COMMON)
case GL_FLOAT:
ctlFmt = CTLAFORMAT_FLOAT;
ui32ImpliedStride = 16;
break;
#endif
default:
SetError(gc, GL_INVALID_ENUM);
return;
}
if(stride == 0)
{
stride = ui32ImpliedStride;
}
gc->sVertexArray.sCPState.ctlFormat = ctlFmt;
gc->sVertexArray.sCPState.pui8Pointer = (IMG_UINT8 *)pointer;
gc->sVertexArray.sCPState.ui32Stride = stride;
gc->sVertexArray.sCPState.ui32Size = size;
HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
} /* glColorPointer */
/***********************************************************************************
Function Name : glSecondaryColorPointer
Inputs : size, type, stride, pointer
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets array pointer/size/type for color data
************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -