Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

#ifdef MESA_TRACE
#include "glheader.h"
#include "glapi.h"
#include "context.h" /* for _mesa_error */
#include "mtypes.h"
#include "tr_context.h"
#include "tr_write.h"


void glEnableTraceMESA( GLbitfield mask )
{
        trace_context_t * tctx = trCtx();

        tctx->traceEnableLogBits = mask;
        tctx->traceEnabled       = GL_TRUE;
}


void glDisableTraceMESA( GLbitfield mask )
{
        /* Reset traceEnableLogBits ? */
        trCtx()->traceEnabled = GL_FALSE;
}


void glNewTraceMESA( GLbitfield logbits, const GLubyte * traceName )
{
        char * newname;
        GLint     length;
        GLcontext * ctx;
        const char * defaultName = "traceGL";

        ctx = (GLcontext *)_glapi_get_context();

        assert(ctx);
        assert(ctx->TraceCtx);
        assert(ctx->TraceDispatch);
        if( !ctx ||                                      /* Do we even have a context ? */
                (ctx->TraceCtx->betweenBeginEnd == GL_TRUE)   || /* Are we currently between glBegin and glEnd ? */
           (ctx->TraceDispatch == _glapi_get_override_dispatch(1)) ) {  /* Has a trace already started ? */
                _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__ );
                return;
        }

        /* FIXME!!! When do we free tracename after the app is finished? */
        if( ctx->TraceCtx->traceName ) {
                free( ctx->TraceCtx->traceName );
        }

        length = strlen((char *)traceName) + 1;
        if( length != 1 ) {
                newname = (char *)malloc( length );
                strncpy( (char *)newname, (char *)traceName, length );
        } else {
                length = strlen( defaultName );
                newname = (char *)malloc( length );
                strncpy( (char *)newname, defaultName, length );
        }
        ctx->TraceCtx->traceName          = newname;
        ctx->TraceCtx->traceAttribLogBits = logbits;

        trOpenLogFile();
        trSetTraceDispatch();
}


void glEndTraceMESA(void)
{
        GLcontext * ctx;

        ctx = (GLcontext *)_glapi_get_context();
        assert(ctx);
        assert(ctx->TraceCtx);
        assert(ctx->TraceDispatch);

        /* Do we even have a context ? */
        /* Are we currently between glBegin and glEnd ? */
        /* Are we sure the current dispatch _is_ the TraceDispatch ? */
        if (!ctx ||
            (ctx->TraceCtx->betweenBeginEnd == GL_TRUE)  ||
            (ctx->TraceDispatch != _glapi_get_override_dispatch(1)) ) {
                _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__ );
                return;
        }

#if 0
        /* Always dump the max indices */
// But not yet...
        trWriteCMD( VAR_COLORPOINTER );
        trWritei( ctx->TraceCtx->trColorPtrState.maxIndex );
        trWriteCMD( VAR_EDGEFLAGPOINTER );
        trWritei( ctx->TraceCtx->trEdgeFlagPtrState.maxIndex );
        trWriteCMD( VAR_INDEXPOINTER );
        trWritei( ctx->TraceCtx->trIndexPtrState.maxIndex );
        trWriteCMD( VAR_NORMALPOINTER );
        trWritei( ctx->TraceCtx->trNormalPtrState.maxIndex );
        trWriteCMD( VAR_TEXCOORDPOINTER );
        trWritei( ctx->TraceCtx->trTexCoordPtrState.maxIndex );
        trWriteCMD( VAR_VERTEXPOINTER );
        trWritei( ctx->TraceCtx->trVertexPtrState.maxIndex );
#endif

        trCloseLogFile();
        trSetOriginalDispatch();
}


void glTraceAssertAttribMESA( GLbitfield attribMask )
{
#warning TraceAssertAttrib not implemented
}


void glTraceCommentMESA( const GLubyte * comment )
{
        trWriteString( (char *)comment );
}


void glTraceTextureMESA( GLuint name, const GLubyte* comment )
{
#warning TraceTexture not implemented
}

void glTraceListMESA( GLuint name, const GLubyte* comment )
{
#warning TraceList not implemented
}


void glTracePointerMESA( GLvoid* pointer, const GLubyte* comment )
{
#warning TracePointer not implemented
}


void glTracePointerRangeMESA( const GLvoid* first, const GLvoid* last, const GLubyte* comment )
{
#warning TracePointerRange not implemented
}

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