📄 misc.c
字号:
/**************************************************************************
* Name : misc.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
*
* $Date: 2004/11/04 11:23:49 $ $Revision: 1.31.1.8 $
* $Log: misc.c $
* ;
* --- Revision Logs Removed ---
**************************************************************************/
#define MODULE_ID MODID_MISC
#include "context.h"
#include "osglue.h"
#include "misc.h"
#include <string.h>
/***********************************************************************************
Function Name : Clamp[f/i]
Inputs : [f/i32]Val, [f/i32]Min, [f/i32]Max
Outputs : -
Returns : Clamped [float/int] in range min, max
Description : UTILITY: Clamps a float/int the range min, max.
************************************************************************************/
IMG_FLOAT Clampf(IMG_FLOAT fVal, IMG_FLOAT fMin, IMG_FLOAT fMax)
{
if (fVal < fMin) { return fMin; }
else if (fVal > fMax) { return fMax; }
else { return fVal; }
}
IMG_INT32 Clampi(IMG_INT32 i32Val, IMG_INT32 i32Min, IMG_INT32 i32Max)
{
if (i32Val < i32Min) { return i32Min; }
else if (i32Val > i32Max) { return i32Max; }
else { return i32Val; }
}
#if defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)
/***********************************************************************************
Function Name : ColorConvertToHWFormat
Inputs : psColor
Outputs : -
Returns : HW format color
Description : UTILITY: Converts a GLEScolor to a HW format color - uses
swizzle in FF TNL VGP program to get order correct.
************************************************************************************/
IMG_UINT32 ColorConvertToHWFormat(GLEScolor *psColor)
{
IMG_FLOAT afColor[4];
IMG_UINT32 ui32Color = 0;
IMG_INT32 i32Temp;
IMG_UINT32 i;
afColor[0] = psColor->fRed;
afColor[1] = psColor->fGreen;
afColor[2] = psColor->fBlue;
afColor[3] = psColor->fAlpha;
for(i=0; i<4; i++)
{
i32Temp = (IMG_INT32)(256.0f*afColor[i]);
if(i32Temp>255)
{
i32Temp = 255;
}
else if(i32Temp < 0)
{
i32Temp = 0;
}
ui32Color |= ((IMG_UINT32)i32Temp << (i*8));
}
return ui32Color;
}
/***********************************************************************************
Function Name : ColorConvertFromHWFormat
Inputs : psColor, ui32Color
Outputs : -
Returns : -
Description : UTILITY: Converts a HW format color to GLEScolor.
************************************************************************************/
IMG_VOID ColorConvertFromHWFormat(GLEScolor *psColor, IMG_UINT32 ui32Color)
{
IMG_FLOAT fTemp = 1.0f / 255.0f;
psColor->fRed = (ui32Color & 0xFF) * fTemp;
psColor->fGreen = ((ui32Color & 0xFF00) >> 8) * fTemp;
psColor->fBlue = ((ui32Color & 0xFF0000) >> 16) * fTemp;
psColor->fAlpha = ((ui32Color & 0xFF000000) >> 24) * fTemp;
}
#else
/***********************************************************************************
Function Name : ColorConvertToHWFormat
Inputs : psColor
Outputs : -
Returns : HW format color
Description : UTILITY: Converts a GLEScolor to a HW format color
************************************************************************************/
IMG_UINT32 ColorConvertToHWFormat(GLEScolor *psColor)
{
IMG_FLOAT afColor[4];
IMG_UINT32 ui32Color = 0;
IMG_INT32 i32Temp;
IMG_UINT32 i;
afColor[0] = psColor->fBlue;
afColor[1] = psColor->fGreen;
afColor[2] = psColor->fRed;
afColor[3] = psColor->fAlpha;
for(i=0; i<4; i++)
{
i32Temp = (IMG_INT32)(256.0f*afColor[i]);
if(i32Temp>255)
{
i32Temp = 255;
}
else if(i32Temp < 0)
{
i32Temp = 0;
}
ui32Color |= ((IMG_UINT32)i32Temp << (i*8));
}
return ui32Color;
}
#endif
/***********************************************************************************
Function Name : FogConvert
Inputs : fFog
Outputs : -
Returns : HW format fog factor value
Description : UTILITY: Converts a float fog factor to a HW format fog factor
************************************************************************************/
IMG_UINT32 FogConvert(IMG_FLOAT fFog)
{
IMG_INT32 i32Temp;
i32Temp = (IMG_INT32)(256.0f*fFog);
if(i32Temp>255)
{
i32Temp = 255;
}
else if(i32Temp < 0)
{
i32Temp = 0;
}
return ((IMG_UINT32)i32Temp << 24);
}
/***********************************************************************************
Function Name : glFinish
Inputs : -
Outputs : -
Returns : -
Description : ENTRYPOINT: Indicates all current commands should complete
before returning. In practice, is ignored when doublebuffered.
************************************************************************************/
GLAPI void APIENTRY glFinish(void)
{
__GL_GET_CONTEXT();
GLES_TIME_START(GLES_TIMES_glFinish);
if(gc->sDrawableParams.bIsPBuffer)
FlushHW(gc, gc->psRenderSurface, IMG_TRUE);
GLES_TIME_STOP(GLES_TIMES_glFinish);
}
/***********************************************************************************
Function Name : glFlush
Inputs : -
Outputs : -
Returns : -
Description : ENTRYPOINT: Indicates all current commands should be flushed.
In practice, is ignored when doublebuffered.
************************************************************************************/
GLAPI void APIENTRY glFlush(void)
{
__GL_GET_CONTEXT();
GLES_TIME_START(GLES_TIMES_glFlush);
/* FIXME: To something for single buffered apphint situation? */
GLES_TIME_STOP(GLES_TIMES_glFlush);
}
/***********************************************************************************
Function Name : glGetError
Inputs : -
Outputs : -
Returns : Current error
Description : ENTRYPOINT: Returns current error. Resets error state.
************************************************************************************/
GLAPI GLenum APIENTRY glGetError(void)
{
IMG_INT32 i32Error;
__GL_GET_CONTEXT_RETURN();
GLES_TIME_START(GLES_TIMES_glGetError);
i32Error = gc->i32Error;
gc->i32Error = 0;
GLES_TIME_STOP(GLES_TIMES_glGetError);
return (GLenum)i32Error;
}
/***********************************************************************************
Function Name : glGetIntegerv
Inputs : pname
Outputs : params
Returns : -
Description : ENTRYPOINT: Returns a piece of static state indicated by pname
************************************************************************************/
GLAPI void APIENTRY glGetIntegerv(GLenum pname, GLint *params)
{
__GL_GET_CONTEXT();
GLES_TIME_START(GLES_TIMES_glGetIntegerv);
switch (pname)
{
case GL_ALIASED_POINT_SIZE_RANGE:
*params++ = GLES_ALIASED_POINT_SIZE_MIN;
*params++ = GLES_ALIASED_POINT_SIZE_MAX;
break;
case GL_ALIASED_LINE_WIDTH_RANGE:
*params++ = GLES_ALIASED_LINE_WIDTH_MIN;
*params++ = GLES_ALIASED_LINE_WIDTH_MAX;
break;
case GL_SMOOTH_POINT_SIZE_RANGE:
*params++ = GLES_SMOOTH_POINT_SIZE_MIN;
*params++ = GLES_SMOOTH_POINT_SIZE_MAX;
break;
case GL_SMOOTH_LINE_WIDTH_RANGE:
*params++ = GLES_SMOOTH_LINE_WIDTH_MIN;
*params++ = GLES_SMOOTH_LINE_WIDTH_MAX;
break;
case GL_RED_BITS:
*params++ = gc->psMode->ui32RedBits;
break;
case GL_GREEN_BITS:
*params++ = gc->psMode->ui32GreenBits;
break;
case GL_BLUE_BITS:
*params++ = gc->psMode->ui32BlueBits;
break;
case GL_ALPHA_BITS:
*params++ = gc->psMode->ui32AlphaBits;
break;
case GL_DEPTH_BITS:
*params++ = gc->psMode->ui32DepthBits;
break;
case GL_STENCIL_BITS:
*params++ = 0;
break;
case GL_MAX_ELEMENTS_VERTICES:
*params++ = GLES_MAX_VERTICES;
break;
case GL_MAX_ELEMENTS_INDICES:
*params++ = GLES_MAX_INDICES;
break;
case GL_MAX_LIGHTS:
*params++ = GLES_MAX_LIGHTS;
break;
case GL_MAX_MODELVIEW_STACK_DEPTH:
*params++ = GLES_MAX_MODELVIEW_STACK_DEPTH;
break;
case GL_MAX_PROJECTION_STACK_DEPTH:
*params++ = GLES_MAX_PROJECTION_STACK_DEPTH;
break;
case GL_MAX_TEXTURE_STACK_DEPTH:
*params++ = GLES_MAX_TEXTURE_STACK_DEPTH;
break;
case GL_MAX_TEXTURE_SIZE:
*params++ = GLES_MAX_TEXTURE_SIZE;
break;
case GL_MAX_TEXTURE_UNITS:
*params++ = GLES_MAX_TEXTURE_UNITS;
break;
case GL_MAX_VIEWPORT_DIMS:
*params++ = GLES_MAX_VIEWPORT_WIDTH;
*params++ = GLES_MAX_VIEWPORT_HEIGHT;
break;
case GL_SUBPIXEL_BITS:
*params++ = GLES_MAX_SUBPIXEL_BITS;
break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
switch(gc->psMode->ePixelFormat)
{
case PVRSRV_PIXEL_FORMAT_ARGB8888:
*params++ = GL_UNSIGNED_BYTE;
break;
case PVRSRV_PIXEL_FORMAT_RGB565:
default:
*params++ = GL_UNSIGNED_SHORT_5_6_5;
break;
}
break;
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
switch(gc->psMode->ePixelFormat)
{
case PVRSRV_PIXEL_FORMAT_ARGB8888:
*params++ = GL_RGBA;
break;
case PVRSRV_PIXEL_FORMAT_RGB565:
default:
*params++ = GL_RGB;
break;
}
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
*params++ = 14;
break;
case GL_COMPRESSED_TEXTURE_FORMATS:
*params++ = GL_PALETTE4_RGB8_OES;
*params++ = GL_PALETTE4_RGBA8_OES;
*params++ = GL_PALETTE4_R5_G6_B5_OES;
*params++ = GL_PALETTE4_RGBA4_OES;
*params++ = GL_PALETTE4_RGB5_A1_OES;
*params++ = GL_PALETTE8_RGB8_OES;
*params++ = GL_PALETTE8_RGBA8_OES;
*params++ = GL_PALETTE8_R5_G6_B5_OES;
*params++ = GL_PALETTE8_RGBA4_OES;
*params++ = GL_PALETTE8_RGB5_A1_OES;
*params++ = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
*params++ = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
*params++ = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
*params++ = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
break;
#if defined(SUPPORT_VGP)
case GL_MAX_CLIP_PLANES:
*params++ = GLES_MAX_CLIP_PLANES;
break;
#endif
#if (defined(SUPPORT_VGP) || defined(SUPPORT_VGP_LITE)) && !defined(PASSTHROUGH_BUILD)
case GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB:
*params++ = GLES_MAX_PROGRAM_STACK_DEPTH;
break;
case GL_MAX_PROGRAM_MATRICES_ARB:
*params++ = GLES_MAX_PROGRAM_MATRICES;
break;
case GL_MAX_VERTEX_ATTRIBS_ARB:
*params++ = GLES_MAX_VERTEX_ATTRIBS;
break;
#endif
default:
SetError(gc, GL_INVALID_ENUM);
GLES_TIME_STOP(GLES_TIMES_glGetIntegerv);
return;
}
GLES_TIME_STOP(GLES_TIMES_glGetIntegerv);
}
/***********************************************************************************
Function Name : glGetString
Inputs : pname
Outputs : -
Returns : Appropriate static string
Description : ENTRYPOINT: Returns a static string indicated by pname.
************************************************************************************/
GLAPI const GLubyte * APIENTRY glGetString(GLenum name)
{
const GLubyte *pszReturnString;
__GL_GET_CONTEXT_RETURN();
GLES_TIME_START(GLES_TIMES_glGetString);
switch (name)
{
case GL_VENDOR:
{
pszReturnString = (const GLubyte *)pszVendor;
break;
}
case GL_RENDERER:
{
pszReturnString = (const GLubyte *)pszRenderer;
break;
}
case GL_VERSION:
{
pszReturnString = (const GLubyte *)pszVersion;
break;
}
case GL_EXTENSIONS:
{
pszReturnString = (const GLubyte *)gc->pszExtensions;
break;
}
default:
{
pszReturnString = (const GLubyte *)0;
DPF((DBG_ERROR, "glGetString unknown name"));
SetError(gc, GL_INVALID_ENUM);
break;
}
}
GLES_TIME_STOP(GLES_TIMES_glGetString);
return pszReturnString;
}
/***********************************************************************************
Function Name : glHint
Inputs : target, mode
Outputs : -
Returns : -
Description : ENTRYPOINT: Indicates a performance hint. Currently ignored.
************************************************************************************/
GLAPI void APIENTRY glHint(GLenum target, GLenum mode)
{
__GL_GET_CONTEXT();
GLES_TIME_START(GLES_TIMES_glHint);
switch (mode)
{
case GL_DONT_CARE:
case GL_FASTEST:
case GL_NICEST:
break;
default:
SetError(gc, GL_INVALID_ENUM);
GLES_TIME_STOP(GLES_TIMES_glHint);
return;
}
switch (target)
{
case GL_PERSPECTIVE_CORRECTION_HINT:
case GL_POINT_SMOOTH_HINT:
case GL_LINE_SMOOTH_HINT:
case GL_POLYGON_SMOOTH_HINT:
case GL_FOG_HINT:
break;
#if defined(SUPPORT_FASTTNL_PATH)
case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
if(mode == GL_FASTEST)
{
gc->sState.sHints.ui32FastPath |= GLES_HINT_NO_CLIPVOLUME;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -