⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
 * 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 + -