# Copyright (c) 2001, Stanford University
# All rights reserved.
#
# See the file LICENSE.txt for information on redistributing this software.

import sys

import apiutil


apiutil.CopyrightC()

print """#include "cr_spu.h"
#include "chromium.h"
#include "cr_error.h"
#include "cr_mem.h"
#include "cr_net.h"
#include "server_dispatch.h"
#include "server.h"
"""

from get_sizes import *;


funcs = [ 'GetIntegerv', 'GetFloatv', 'GetDoublev', 'GetBooleanv' ]
types = [ 'GLint', 'GLfloat', 'GLdouble', 'GLboolean' ]

for index in range(len(funcs)):
    func_name = funcs[index]
    params = apiutil.Parameters(func_name)
    print 'void SERVER_DISPATCH_APIENTRY crServerDispatch%s( %s )' % ( func_name, apiutil.MakeDeclarationString(params))
    print '{'
    print '\t%s *get_values;' % types[index]
    print '\tint tablesize;'
    print """
    #ifdef CR_ARB_texture_compression
    if (GL_COMPRESSED_TEXTURE_FORMATS_ARB == pname)
    {
        GLint numtexfmts = 0;
        cr_server.head_spu->dispatch_table.GetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, &numtexfmts);
        tablesize = numtexfmts * sizeof(%s);
    }
    else
    #endif
    {
        tablesize = __numValues( pname ) * sizeof(%s);
    }
    """ % (types[index], types[index])
    print '\t(void) params;'
    print '\tget_values = (%s *) crAlloc( tablesize );' % types[index]
    print '\tif (tablesize>0)'
    print '\tcr_server.head_spu->dispatch_table.%s( pname, get_values );' % func_name
    print """
    if (GL_TEXTURE_BINDING_1D==pname
        || GL_TEXTURE_BINDING_2D==pname
        || GL_TEXTURE_BINDING_3D==pname
        || GL_TEXTURE_BINDING_RECTANGLE_ARB==pname
        || GL_TEXTURE_BINDING_CUBE_MAP_ARB==pname)
    {
        GLuint texid;
        CRASSERT(tablesize/sizeof(%s)==1);
        texid = (GLuint) *get_values;
        *get_values = (%s) crStateTextureHWIDtoID(texid);
    }
    else if (GL_CURRENT_PROGRAM==pname)
    {
        GLuint programid;
        CRASSERT(tablesize/sizeof(%s)==1);
        programid = (GLuint) *get_values;
        *get_values = (%s) crStateGLSLProgramHWIDtoID(programid);
    }
    else if (GL_FRAMEBUFFER_BINDING_EXT==pname
             ||GL_READ_FRAMEBUFFER_BINDING==pname)
    {
        GLuint fboid;
        CRASSERT(tablesize/sizeof(%s)==1);
        fboid = (GLuint) *get_values;
        if (crServerIsRedirectedToFBO()
            && (fboid==cr_server.curClient->currentMural->aidFBOs[0]
            || fboid==cr_server.curClient->currentMural->aidFBOs[1]))
        {
            fboid = 0;
        }
        else
        {
        	fboid = crStateFBOHWIDtoID(fboid);
        }
        *get_values = (%s) fboid;
    }
    else if (GL_READ_BUFFER==pname)
    {
        if (crServerIsRedirectedToFBO()
            && CR_SERVER_FBO_FOR_IDX(cr_server.curClient->currentMural, cr_server.curClient->currentMural->iCurReadBuffer)
            && !crStateGetCurrent()->framebufferobject.readFB)
        {
            *get_values = (%s) crStateGetCurrent()->buffer.readBuffer;
            Assert(crStateGetCurrent()->buffer.readBuffer == GL_BACK || crStateGetCurrent()->buffer.readBuffer == GL_FRONT);
        }
    }
    else if (GL_DRAW_BUFFER==pname)
    {
        if (crServerIsRedirectedToFBO()
            && CR_SERVER_FBO_FOR_IDX(cr_server.curClient->currentMural, cr_server.curClient->currentMural->iCurDrawBuffer)
            && !crStateGetCurrent()->framebufferobject.drawFB)
        {
            *get_values = (%s) crStateGetCurrent()->buffer.drawBuffer;
            Assert(crStateGetCurrent()->buffer.drawBuffer == GL_BACK || crStateGetCurrent()->buffer.drawBuffer == GL_FRONT);
        }
    }
    else if (GL_RENDERBUFFER_BINDING_EXT==pname)
    {
        GLuint rbid;
        CRASSERT(tablesize/sizeof(%s)==1);
        rbid = (GLuint) *get_values;
        *get_values = (%s) crStateRBOHWIDtoID(rbid);
    }
    else if (GL_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_VERTEX_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_NORMAL_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_COLOR_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_INDEX_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB==pname
             || GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB==pname)
    {
        GLuint bufid;
        CRASSERT(tablesize/sizeof(%s)==1);
        bufid = (GLuint) *get_values;
        *get_values = (%s) crStateBufferHWIDtoID(bufid);
    }
    else if (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS==pname)
    {
    	if (CR_MAX_TEXTURE_UNITS < (GLuint)*get_values)
    	{
    		*get_values = (%s)CR_MAX_TEXTURE_UNITS;
    	} 
    }
    else if (GL_MAX_VERTEX_ATTRIBS_ARB==pname)
    {
        if (CR_MAX_VERTEX_ATTRIBS < (GLuint)*get_values)
        {
            *get_values = (%s)CR_MAX_VERTEX_ATTRIBS;
        } 
    }
    """ % (types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index])
    print '\tcrServerReturnValue( get_values, tablesize );'
    print '\tcrFree(get_values);'
    print '}\n'
