windows-nt/Source/XPSP1/NT/multimedia/opengl/server/generic/debug.c
2020-09-26 16:20:57 +08:00

250 lines
5.8 KiB
C

//+---------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation, 1997.
//
// debug.c
//
// Debug build support routines.
//
// History:
// Mon Jun 02 17:07:23 1997 -by- Drew Bliss [drewb]
// Created
//
//----------------------------------------------------------------------------
#include "precomp.h"
#pragma hdrstop
#include <imports.h>
#include <devlock.h>
#if DBG
static void printNormalFloat( float fval )
{
int logi, logval_i, logval_f;
float logval, logf;
int negative=0;
if( fval < (float) 0.0 )
negative = 1;
fval = __GL_ABSF(fval);
logval = (float) (log( fval ) / log( 10 ));
logi = (int) logval;
logf = logval - logi;
if( (logval <= (float) 0) && (logf != (float) 0.0) ) {
logi -= 1;
logf += (float) 1.0;
}
logval = (float) pow(10,logf);
if( negative )
DbgPrint( "-" );
#if 0
DbgPrint( "%fE%d", logval, logi );
#else
logval_i = (int) logval;
logval_f = (int) ((logval - (float) logval_i) * (float) 10000.0 + (float) 0.5);
DbgPrint( "%d.%dE%d", logval_i, logval_f, logi );
#endif
}
void printFloat( char *comment, void *mval, int printHex )
{
// IEEE single format: sign bits : 1
// exponent : 7
// fraction : 24
// Representation: low word : Fraction low
// high word : 0-6: Fraction high
// 7-14: Exponent
// 15: Sign
char *ploww, *phighw;
short loww, highw;
long lval = 0, fraction;
int sign, exponent;
float fval;
ploww = (char *) mval;
phighw = (char *) ((char *) mval) + 2;
memcpy( &loww, ploww, 2 );
memcpy( &highw, phighw, 2 );
memcpy( &lval, mval, 4 );
sign = (highw & 0x8000) >> 15;
fraction = lval & 0x007fffff;
exponent = (highw & 0x7f80) >> 7;
DbgPrint( "%s", comment );
if( printHex )
DbgPrint( "0x%x, ", lval );
if( exponent == 255 ) {
if( fraction == 0 ) {
if( sign )
DbgPrint( "-" );
DbgPrint( "infinity" );
}
else
DbgPrint( "NaN" );
}
else if( exponent == 0 ) {
if( fraction == 0 )
DbgPrint( "0.0" );
else {
memcpy( &fval, mval, 4 );
printNormalFloat( fval );
}
}
else {
memcpy( &fval, mval, 4 );
printNormalFloat( fval );
}
}
/*****************************************************************************\
* DbgPrintFloat
*
* Prints floating point numbers from within server, in exponent notation with
* 4 significant digits (e.g 1.7392E-23). Also prints string preceeding number.
* Checks for deviant cases, such as NaN's or infinity.
*
\*****************************************************************************/
void DbgPrintFloat( char *comment, float fval )
{
printFloat( comment, &fval, 0 );
}
/*****************************************************************************\
* DbgPrintFloatP
*
* Same as DbgPrintFloat, but takes a pointer to the float to print. Also
* prints out the hex representation of the float.
* Used in cases where the float may not be a valid float.
*
\*****************************************************************************/
void DbgPrintFloatP( char *comment, void *mval )
{
printFloat( comment, mval, 1 );
}
#if defined(VERBOSE_DDSLOCK)
//
// Define DDGLOCK if you know the location of the DDraw global lock
// (DDRAW!CheapMutexCrossProcess) and want to see its counts.
//
typedef struct _DDRAW_GLOBAL_LOCK
{
LONG LockCount;
LONG RecursionCount;
DWORD Tid;
DWORD Pid;
} DDRAW_GLOBAL_LOCK;
// #define DDGLOCK ((DDRAW_GLOBAL_LOCK *)0x76959048)
/******************************Public*Routine******************************\
*
* DDSLOCK
*
* Tracks DirectDraw surface locks
*
* History:
* Wed May 28 13:42:23 1997 -by- Drew Bliss [drewb]
* Created
*
\**************************************************************************/
HRESULT dbgDdsLock(LPDIRECTDRAWSURFACE pdds, DDSURFACEDESC *pddsd,
DWORD flags, char *file, int line)
{
HRESULT hr;
#ifdef DDGLOCK
volatile DDRAW_GLOBAL_LOCK *glock = DDGLOCK;
#endif
DbgPrint("%2X:Lock %08lX %4d:%s\n",
GetCurrentThreadId(), pdds, line, file);
#ifdef DDGLOCK
DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount,
glock->Tid);
#endif
hr = pdds->lpVtbl->Lock(pdds, NULL, pddsd, flags, NULL);
#ifdef DDGLOCK
DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount,
glock->Tid);
#endif
return hr;
}
/******************************Public*Routine******************************\
*
* DDSUNLOCK
*
* Tracks DirectDrawSurface unlocks
*
* History:
* Wed May 28 13:42:39 1997 -by- Drew Bliss [drewb]
* Created
*
\**************************************************************************/
HRESULT dbgDdsUnlock(LPDIRECTDRAWSURFACE pdds, void *ptr,
char *file, int line)
{
HRESULT hr;
#ifdef DDGLOCK
volatile DDRAW_GLOBAL_LOCK *glock = DDGLOCK;
LONG preLock;
#endif
DbgPrint("%2X:Unlk %08lX %4d:%s\n",
GetCurrentThreadId(), pdds, line, file);
#ifdef DDGLOCK
DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount,
glock->Tid);
preLock = glock->LockCount;
#endif
hr = pdds->lpVtbl->Unlock(pdds, ptr);
#ifdef DDGLOCK
DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount,
glock->Tid);
if (preLock <= glock->LockCount)
{
DebugBreak();
}
#endif
return hr;
}
#endif // VERBOSE_DDSLOCK
#endif // DBG
#ifdef _WIN95_
// Provide a DbgPrint implementation on Win95 since the system's doesn't
// do anything.
ULONG DbgPrint(PCH Format, ...)
{
char achMsg[256];
va_list vlArgs;
va_start(vlArgs, Format);
_vsnprintf(achMsg, sizeof(achMsg), Format, vlArgs);
va_end(vlArgs);
OutputDebugString(achMsg);
return TRUE;
}
#endif // _WIN95_