📄 profile.c
字号:
/**************************************************************************
* Name : profile.c
* Author : Vlad Stamate
* Created : 20/01/2004
*
* Copyright : 2004 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/08 18:57:34 $
* $Log: profile.c $
*
**************************************************************************/
/* Exclude from non-Metrics builds */
#if defined (TIMING) || defined (DEBUG)
#include "context.h"
#include "metrics.h"
#include "profile.h"
#include "osglue.h"
static char * const PrimNames[] = {
"GL_POINTS ",
"GL_LINES ",
"GL_LINE_LOOP ",
"GL_LINE_STRIP ",
"GL_TRIANGLES ",
"GL_TRIANGLE_STRIP",
"GL_TRIANGLE_FAN "};
static char * const DrawFunctionNames[] = {
"DrawArrays ",
"DrawElements "};
static char * const FunctionNames[] = {
"glActiveTexture ",
"glAlphaFunc ",
"glAlphaFuncx ",
"glBindTexture ",
"glBlendFunc ",
"glClear ",
"glClearColor ",
"glClearColorx ",
"glClearDepthf ",
"glClearDepthx ",
"glClearStencil ",
"glClientActiveTexture ",
"glColor4f ",
"glColor4x ",
"glColorMask ",
"glColorPointer ",
"glCompressedTexImage2D ",
"glCompressedTexSubImage2D",
"glCopyTexImage2D ",
"glCopyTexSubImage2D ",
"glCullFace ",
"glDeleteTextures ",
"glDepthFunc ",
"glDepthMask ",
"glDepthRangef ",
"glDepthRangex ",
"glDisable ",
"glDisableClientState ",
"glDrawArrays ",
"glDrawElements ",
"glEnable ",
"glEnableClientState ",
"glFinish ",
"glFlush ",
"glFogf ",
"glFogfv ",
"glFogx ",
"glFogxv ",
"glFrontFace ",
"glFrustumf ",
"glFrustumx ",
"glGenTextures ",
"glGetError ",
"glGetIntegerv ",
"glGetString ",
"glHint ",
"glLightModelf ",
"glLightModelfv ",
"glLightModelx ",
"glLightModelxv ",
"glLightf ",
"glLightfv ",
"glLightx ",
"glLightxv ",
"glLineWidth ",
"glLineWidthx ",
"glLoadIdentity ",
"glLoadMatrixf ",
"glLoadMatrixx ",
"glLogicOp ",
"glMaterialf ",
"glMaterialfv ",
"glMaterialx ",
"glMaterialxv ",
"glMatrixMode ",
"glMultMatrixf ",
"glMultMatrixx ",
"glMultiTexCoord4f ",
"glMultiTexCoord4x ",
"glNormal3f ",
"glNormal3x ",
"glNormalPointer ",
"glOrthof ",
"glOrthox ",
"glPixelStorei ",
"glPointSize ",
"glPointSizex ",
"glPolygonOffset ",
"glPolygonOffsetx ",
"glPopMatrix ",
"glPushMatrix ",
"glReadPixels ",
"glRotatef ",
"glRotatex ",
"glSampleCoverage ",
"glSampleCoveragex ",
"glScalef ",
"glScalex ",
"glScissor ",
"glShadeModel ",
"glStencilFunc ",
"glStencilMask ",
"glStencilOp ",
"glTexCoordPointer ",
"glTexEnvf ",
"glTexEnvfv ",
"glTexEnvx ",
"glTexEnvxv ",
"glTexImage2D ",
"glTexParameterf ",
"glTexParameterx ",
"glTexSubImage2D ",
"glTranslatef ",
"glTranslatex ",
"glVertexPointer ",
"glViewport "
};
static char * const RasterEnables[] = {
"ALPHABLEND ",
"ALPHATEST ",
"LOGICOP ",
"TEXTURE0 ",
"TEXTURE1 ",
"DEPTHTEST ",
"POLYOFFSET ",
"CULLFACE ",
"FOG "
};
static char * const FrameEnables[] = {
"DITHER ",
"MULTISAMPLE",
"SCISSOR "
};
static char * const TnLEnables[] = {
"LIGHT0 ",
"LIGHT1 ",
"LIGHT2 ",
"LIGHT3 ",
"LIGHT4 ",
"LIGHT5 ",
"LIGHT6 ",
"LIGHT7 ",
"LIGHTING ",
"RESCALE ",
"COLORMAT ",
"NORMALIZE "
};
static char * const IgnoreEnables[] = {
"MSALPHACOV ",
"MSSAMPALPHA",
"MSSAMPCOV ",
"STENCILTEST",
"LINESMOOTH ",
"POINTSMOOTH",
"POLYSMOOTH "
};
IMG_VOID DisplayStateMetricTable(GLESContext *gc);
IMG_VOID DestroyStateMetricData(GLESContext *gc);
/***********************************************************************************
Function Name : InitProfileData
Inputs : -
Outputs : -
Returns : -
Description : Resets metrics timers and finds CPU speed
************************************************************************************/
IMG_VOID InitProfileData(GLESContext *gc)
{
HostMemSet(gc->sDrawCall, (IMG_UINT8)0, 2 * (GL_TRIANGLE_FAN+1) * 2 * sizeof(IMG_UINT32));
gc->psStateMetricData = 0;
}
/***********************************************************************************
Function Name : DecodePrimitiveCall
Inputs : -
Outputs : -
Returns : -
Description : Displays primitive call/primitive type profiling data
************************************************************************************/
IMG_VOID DecodePrimitiveCall(GLESContext *gc, IMG_UINT32 ui32Type, IMG_UINT32 ui32Which)
{
IMG_CHAR psString[256];
sprintf(psString, "%s %8lu %8lu %17lu %14lu\n",
PrimNames[ui32Which],
gc->sDrawCall[ui32Type].VertexCount[ui32Which],
gc->sDrawCall[ui32Type].CallCount[ui32Which],
gc->sDrawCall[ui32Type].VertexCount[ui32Which] / GLES_CALLS(GLES_TIMES_SWAP_BUFFERS),
gc->sDrawCall[ui32Type].CallCount[ui32Which] / GLES_CALLS(GLES_TIMES_SWAP_BUFFERS));
GLESProfileOutput(gc, psString);
}
/***********************************************************************************
Function Name : AddToStateMetric
Inputs : gc
Outputs : -
Returns : -
Description : Updates the state table (link list) with the new state
************************************************************************************/
IMG_VOID AddToStateMetric(GLESContext *gc)
{
StateMetricData *psTemp;
StateMetricData *psNewMetric;
IMG_BOOL bFound;
if(!gc->psStateMetricData)
{
/* our list is empty, we are adding our first entry */
gc->psStateMetricData = GLESMalloc(gc, sizeof(StateMetricData));
if(!gc->psStateMetricData)
{
DPF((DBG_ERROR, "Could not create metricdata structure, possibly out of memory"));
return;
}
gc->psStateMetricData->ui32RasterEnables = __GC(ui32RasterEnables);
gc->psStateMetricData->ui32TnLEnables = __GC(ui32TnLEnables);
gc->psStateMetricData->ui32IgnoredEnables = __GC(ui32IgnoredEnables);
gc->psStateMetricData->ui32FrameEnables = __GC(ui32FrameEnables);
gc->psStateMetricData->ui32Count = 1;
gc->psStateMetricData->next = NULL;
gc->psStateMetricData->previous = NULL;
}
else
{
/* first search if this state is already in our linked list */
psTemp = gc->psStateMetricData;
while(psTemp)
{
IMG_UINT32 ui32Matches = 0;
bFound = IMG_FALSE;
if(psTemp->ui32RasterEnables == __GC(ui32RasterEnables)) ui32Matches++;
if(psTemp->ui32TnLEnables == __GC(ui32TnLEnables)) ui32Matches++;
if(psTemp->ui32IgnoredEnables == __GC(ui32IgnoredEnables)) ui32Matches++;
if(psTemp->ui32FrameEnables == __GC(ui32FrameEnables)) ui32Matches++;
if(ui32Matches == 4)
{
bFound = IMG_TRUE;
break;
}
psTemp = psTemp->next;
}
if(bFound)
{
/* we have found a similar state, so just increment the usage count */
psTemp->ui32Count++;
}
else
{
/* this is a new state so we need to add it to the list */
psTemp = gc->psStateMetricData;
while(psTemp->next)
{
psTemp = psTemp->next;
}
psNewMetric = (StateMetricData*)GLESMalloc(gc, sizeof(StateMetricData));
psNewMetric->ui32RasterEnables = __GC(ui32RasterEnables);
psNewMetric->ui32TnLEnables = __GC(ui32TnLEnables);
psNewMetric->ui32IgnoredEnables = __GC(ui32IgnoredEnables);
psNewMetric->ui32FrameEnables = __GC(ui32FrameEnables);
psNewMetric->ui32Count = 1;
psNewMetric->next = 0;
psNewMetric->previous = psTemp;
psTemp->next = psNewMetric;
}
}
}
/***********************************************************************************
Function Name : PrintMetricStateRow
Inputs : -
Outputs : -
Returns : -
Description : Displays a row of enables in the state table (link list)
************************************************************************************/
IMG_VOID PrintMetricStateRow(GLESContext *gc, IMG_CHAR *psEnableName, IMG_UINT32 ui32Which,
IMG_UINT32 ui32Bit, IMG_UINT32 ui32NumberStates)
{
IMG_UINT32 i, j;
StateMetricData *psTemp;
IMG_CHAR psString[256];
sprintf(psString, "%s ", psEnableName);
GLESProfileOutput(gc, psString);
for(i=0; i<ui32NumberStates; i++)
{
psTemp = gc->psStateMetricData;
for(j=0; j<i; j++)
{
psTemp = psTemp->next;
}
switch(ui32Which)
{
case 0:
if(psTemp->ui32RasterEnables & ui32Bit)
sprintf(psString, " x ");
else
sprintf(psString, " ");
break;
case 1:
if(psTemp->ui32TnLEnables & ui32Bit)
sprintf(psString, " x ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -