Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

#ifdef MESA_TRACE

#include "glheader.h"
#include <time.h>  /* XXX move into glheader.h */
#include "tr_write.h"
#include "tr_context.h"

#define PATH_MAX 4098


static void trWriteFile( const void * buf, GLint recsize, GLint numrecs, const char * funcname ) {
        GLint recswritten;

        if( !(trCtx()->trDoPrint) ) {
                return;
        }

        recswritten = fwrite( buf, recsize, numrecs, trCtx()->logFP );
        if( recswritten != numrecs ) {
                fprintf( stderr, "Error writing to file in %s\n", funcname );
                fprintf( stderr, "Perhaps the disk is full?\n" );
                /* Should we abort ? */
                trCtx()->trDoPrint = GL_FALSE;
        }
}


static void (*trWrite)( const void *, GLint, GLint, const char *) = trWriteFile;


void trWriteCMD( GLint cmd ) {
        trWrite( (void*)&cmd, sizeof(GLint), 1, "trWriteCMD" );
}

void trWriteb( GLbyte b ) {
        trWrite( (void*)&b, sizeof(GLbyte), 1, "trWriteb" );
}

void trWrited( GLdouble d ) {
        trWrite( (void*)&d, sizeof(GLdouble), 1, "trWrited" );
}

void trWriteClampd( GLclampd cd ) {
        trWrite( (void*)&cd, sizeof(GLclampd), 1, "trWriteClampd" );
}

void trWritef( GLfloat f ) {
        trWrite( (void*)&f, sizeof(GLfloat), 1, "trWritef" );
}

void trWriteClampf( GLclampf cf ) {
        trWrite( (void*)&cf, sizeof(GLclampf), 1, "trWriteClampf" );
}

void trWritei( GLint i ) {
        trWrite( (void*)&i, sizeof(GLint), 1, "trWritei" );
}

void trWrites( GLshort s ) {
        trWrite( (void*)&s, sizeof(GLshort), 1, "trWrites" );
}

void trWriteub( GLubyte ub ) {
        trWrite( (void*)&ub, sizeof(GLubyte), 1, "trWriteub" );
}

void trWriteui( GLuint ui ) {
        trWrite( (void*)&ui, sizeof(GLuint), 1, "trWriteui" );
}

void trWriteus( GLushort us ) {
        trWrite( (void*)&us, sizeof(GLushort), 1, "trWriteus" );
}

void trWriteBool( GLboolean b ) {
        trWrite( (void*)&b, sizeof(GLboolean), 1, "trWriteBool" );
}

void trWriteBits( GLbitfield bf ) {
        trWrite( (void*)&bf, sizeof(GLbitfield), 1, "trWriteBits" );
}

void trWriteEnum( GLenum en ) {
        trWrite( (void*)&en, sizeof(GLenum), 1, "trWriteEnum" );
}

void trWriteSizei( GLsizei si ) {
        trWrite( (void*)&si, sizeof(GLsizei), 1, "trWriteSizei" );
}


void trWritePointer( const void * p ) {
        trWrite( (void*)&p, sizeof(void *), 1, "trWritePointer" );
}


void trWriteArrayb( GLsizei n, const GLbyte * b ) {
        trWrite( (void *)b, sizeof(GLbyte), n, "trWriteArrayb" );
}


void trWriteArrayub( GLsizei n, const GLubyte * ub ) {
        trWrite( (void *)ub, sizeof(GLubyte), n, "trWriteArrayub" );
}


void trWriteArrays( GLsizei n, const GLshort * s ) {
        trWrite( (void *)s, sizeof(GLshort), n, "trWriteArrays" );
}


void trWriteArrayus( GLsizei n, const GLushort * us ) {
        trWrite( (void *)us, sizeof(GLushort), n, "trWriteArrayus" );
}


void trWriteArrayi( GLsizei n, const GLint * i ) {
        trWrite( (void *)i, sizeof(GLint), n, "trWriteArrayi" );
}


void trWriteArrayui( GLsizei n, const GLuint * ui ) {
        trWrite( (void *)ui, sizeof(GLuint), n, "trWriteArrayui" );
}


void trWriteArrayBool( GLsizei n, const GLboolean * b ) {
        trWrite( (void *)b, sizeof(GLboolean), n, "trWriteArrayBool" );
}


void trWriteArrayf( GLsizei n, const GLfloat * f ) {
        trWrite( (void *)f, sizeof(GLfloat), n, "trWriteArrayf" );
}


void trWriteArrayd( GLsizei n, const GLdouble * d ) {
        trWrite( (void *)d, sizeof(GLdouble), n, "trWriteArrayd" );
}


void trWriteString( const char * str ) {
        GLuint length = strlen(str);
        trWriteui( length );
        trWrite( (void *)str, sizeof(GLubyte), length, "trWriteString" );
}


void trFileFlush( void ) {
  fflush( trCtx()->logFP );
}


static void trWriteTypeInformation( void ) {
       
        trWriteub( sizeof(GLint) );
        trWriteub( sizeof(GLshort) );
        trWriteub( sizeof(GLfloat) );
        trWriteub( sizeof(GLdouble) );
        trWriteub( sizeof(GLboolean) );
        trWriteub( sizeof(GLenum) );
        trWriteub( sizeof(GLsizei) );
        trWriteub( sizeof(GLbitfield) );
        trWriteub( sizeof(GLclampf) );
        trWriteub( sizeof(GLclampd) );
        trWriteub( sizeof(GLvoid *) );

}


static void trWriteHeader( void ) {
        struct tm *newtime;
        time_t aclock;
        char timestring[256];

        trWriteString( "0.0.1" );
        trWriteString( trCtx()->traceName );
        trWritei( trCtx()->framecounter );

        /* Always print this! */
        time( &aclock );
        newtime = localtime( &aclock );
        asctime( newtime );
        snprintf( timestring, sizeof(timestring), "Time: %s", asctime( newtime ) );
        trWriteString( timestring );
}


static void trWriteGLState( void ) {
        /*
         * This function will write all the queryable GL state at
         * the time the trace is started.
         */

}


void trOpenLogFile( void ) {
        GLint numchars;
        char buffer[PATH_MAX];

        numchars = snprintf( buffer, sizeof(buffer), "%s-gl.log.%d",
                             trCtx()->traceName, trCtx()->framecounter );
        if( numchars > -1 && numchars < sizeof(buffer) ) {
                trCtx()->logFP = fopen( buffer, "wb" );

                /* This information is needed before we can extract _anything_ */
                trWriteTypeInformation();
                trWriteHeader();
                trWriteGLState();

                (trCtx()->framecounter)++;
        } else if( numchars > -1 ) {
                fprintf( stderr, "buffer needs to be %d bytes long for logging to work.\n",
                         numchars + 1 );
                exit( -1 );
        } else {
                fprintf( stderr, "buffer needs to grow for logging to work.  Try %d bytes.\n",
                         sizeof(buffer) * 2 );
                exit( -1 );
        }
}


void trCloseLogFile( void ) {
        if( trCtx()->logFP != NULL ) {
                fclose(trCtx()->logFP);
        }

        trCtx()->logFP = NULL;
}


#else
extern void tr_write_dummy_func(void);
void tr_write_dummy_func(void)
{
}
#endif