VirtualBox

Changeset 21308 in vbox for trunk/src


Ignore:
Timestamp:
Jul 7, 2009 10:49:52 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
49651
Message:

crOpenGL: use host side VBO when possible

Location:
trunk/src/VBox
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/crOpenGL/array/arrayspu.c

    r20970 r21308  
    478478    }
    479479#endif
     480    //crDebug("arrayspu_DrawElements mode:0x%x, count:%d, type:0x%x", mode, count, type);
     481   
    480482
    481483    array_spu.self.Begin(mode);
     
    521523static void ARRAYSPU_APIENTRY arrayspu_ColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
    522524{
    523     crStateColorPointer( size, type, stride, pointer );
     525    crStateColorPointer(size, type, stride, pointer);
     526    array_spu.child.ColorPointer(size, type, stride, pointer);
    524527}
    525528
    526529static void ARRAYSPU_APIENTRY arrayspu_SecondaryColorPointerEXT( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
    527530{
    528     crStateSecondaryColorPointerEXT( size, type, stride, pointer );
     531    crStateSecondaryColorPointerEXT(size, type, stride, pointer);
     532    array_spu.child.SecondaryColorPointerEXT(size, type, stride, pointer);
    529533}
    530534
    531535static void ARRAYSPU_APIENTRY arrayspu_VertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
    532536{
    533     crStateVertexPointer( size, type, stride, pointer );
     537    crStateVertexPointer(size, type, stride, pointer);
     538    array_spu.child.VertexPointer(size, type, stride, pointer);
    534539}
    535540
    536541static void ARRAYSPU_APIENTRY arrayspu_TexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer )
    537542{
    538     crStateTexCoordPointer( size, type, stride, pointer );
     543    crStateTexCoordPointer(size, type, stride, pointer);
     544    array_spu.child.TexCoordPointer(size, type, stride, pointer);
    539545}
    540546
    541547static void ARRAYSPU_APIENTRY arrayspu_NormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
    542548{
    543     crStateNormalPointer( type, stride, pointer );
     549    crStateNormalPointer(type, stride, pointer);
     550    array_spu.child.NormalPointer(type, stride, pointer);
    544551}
    545552
    546553static void ARRAYSPU_APIENTRY arrayspu_IndexPointer( GLenum type, GLsizei stride, const GLvoid *pointer )
    547554{
    548     crStateIndexPointer( type, stride, pointer );
     555    crStateIndexPointer(type, stride, pointer);
     556    array_spu.child.IndexPointer(type, stride, pointer);
    549557}
    550558
    551559static void ARRAYSPU_APIENTRY arrayspu_EdgeFlagPointer( GLsizei stride, const GLvoid *pointer )
    552560{
    553     crStateEdgeFlagPointer( stride, pointer );
     561    crStateEdgeFlagPointer(stride, pointer);
     562    array_spu.child.EdgeFlagPointer(stride, pointer);
    554563}
    555564
    556565static void ARRAYSPU_APIENTRY arrayspu_VertexAttribPointerNV( GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer )
    557566{
    558     crStateVertexAttribPointerNV( index, size, type, stride, pointer );
     567    crStateVertexAttribPointerNV(index, size, type, stride, pointer);
     568    array_spu.child.VertexAttribPointerNV(index, size, type, stride, pointer);
    559569}
    560570
    561571static void ARRAYSPU_APIENTRY arrayspu_FogCoordPointerEXT( GLenum type, GLsizei stride, const GLvoid *pointer )
    562572{
    563     crStateFogCoordPointerEXT( type, stride, pointer );
     573    crStateFogCoordPointerEXT(type, stride, pointer);
     574    array_spu.child.FogCoordPointerEXT(type, stride, pointer);
    564575}
    565576
    566577static void ARRAYSPU_APIENTRY arrayspu_GetPointerv( GLenum pname, GLvoid **params )
    567578{
    568     crStateGetPointerv( pname, params );
     579    crStateGetPointerv(pname, params);
    569580}
    570581
    571582static void ARRAYSPU_APIENTRY arrayspu_EnableClientState( GLenum array )
    572583{
    573     crStateEnableClientState( array );
     584    crStateEnableClientState(array);
     585    array_spu.child.EnableClientState(array);
    574586}
    575587
    576588static void ARRAYSPU_APIENTRY arrayspu_DisableClientState( GLenum array )
    577589{
    578     crStateDisableClientState( array );
     590    crStateDisableClientState(array);
     591    array_spu.child.DisableClientState(array);
    579592}
    580593
    581594static void ARRAYSPU_APIENTRY arrayspu_ClientActiveTextureARB( GLenum texture )
    582595{
    583     crStateClientActiveTextureARB( texture );
     596    crStateClientActiveTextureARB(texture);
     597    array_spu.child.ClientActiveTextureARB(texture);
    584598}
    585599
     
    662676                                const GLvoid *pointer)
    663677{
    664     crStateVertexAttribPointerARB( index, size, type, normalized, stride, pointer );
     678    crStateVertexAttribPointerARB(index, size, type, normalized, stride, pointer);
     679    array_spu.child.VertexAttribPointerARB(index, size, type, normalized, stride, pointer);
    665680}
    666681
     
    703718arrayspu_GenBuffersARB( GLsizei n, GLuint * buffers )
    704719{
    705     crStateGenBuffersARB(n, buffers);
     720    array_spu.child.GenBuffersARB(n, buffers);
    706721}
    707722
     
    710725{
    711726    crStateDeleteBuffersARB(n, buffers);
     727    array_spu.child.DeleteBuffersARB(n, buffers);
    712728}
    713729
     
    716732{
    717733    crStateBindBufferARB(target, buffer);
     734    array_spu.child.BindBufferARB(target, buffer);
    718735}
    719736
     
    721738arrayspu_IsBufferARB (GLuint buffer)
    722739{
    723     return crStateIsBufferARB(buffer);
     740    return array_spu.child.IsBufferARB(buffer);
    724741}
    725742
     
    728745{
    729746    crStateBufferDataARB(target, size, data, usage);
     747    array_spu.child.BufferDataARB(target, size, data, usage);
    730748}
    731749
     
    735753{
    736754    crStateBufferSubDataARB(target, offset, size, data);
     755    array_spu.child.BufferSubDataARB(target, offset, size, data);
    737756}
    738757
     
    752771arrayspu_UnmapBufferARB(GLenum target)
    753772{
    754     return crStateUnmapBufferARB(target);
     773    crStateUnmapBufferARB(target);
     774    return array_spu.child.UnmapBufferARB(target);
    755775}
    756776
  • trunk/src/VBox/Additions/common/crOpenGL/load.c

    r20616 r21308  
    589589#endif
    590590
    591     strcpy(response, "3 0 array 1 feedback 2 pack");
     591    strcpy(response, "2 0 feedback 1 pack");
    592592    spuchain = crStrSplit( response, " " );
    593593    num_spus = crStrToInt( spuchain[0] );
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c

    r20083 r21308  
    1515packspu_MapBufferARB( GLenum target, GLenum access )
    1616{
    17     GLint size = -1;
    1817    GET_CONTEXT(ctx);
    1918    void *buffer;
     19#if 0
    2020    CRBufferObject *bufObj;
     21    GLint size = -1;
    2122
    2223    (void) crStateMapBufferARB( target, access );
     
    5253     */
    5354    packspu_GetBufferSubDataARB(target, 0, bufObj->size, buffer);
     55#else
     56    CRASSERT(GL_TRUE == ctx->clientState->bufferobject.retainBufferData);
     57    buffer = crStateMapBufferARB(target, access);
     58#endif
    5459
    5560    return buffer;
     61}
     62
     63void PACKSPU_APIENTRY packspu_GetBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data )
     64{
     65    crStateGetBufferSubDataARB(target, offset, size, data);
    5666}
    5767
     
    6070packspu_UnmapBufferARB( GLenum target )
    6171{
     72    GET_CONTEXT(ctx);
     73
     74#if 0
    6275    CRBufferObject *bufObj;
    63     GET_CONTEXT(ctx);
    6476
    6577    if (target == GL_ARRAY_BUFFER_ARB) {
     
    7688    /* free the buffer / unmap it */
    7789    crFree(bufObj->pointer);
     90#endif
    7891
    7992    crStateUnmapBufferARB( target );
     
    8497
    8598void PACKSPU_APIENTRY
    86 packspu_BufferDataARB( GLenum target, GLsizeiptrARB size,
    87                                              const GLvoid * data, GLenum usage )
     99packspu_BufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage)
    88100{
     101    /*crDebug("packspu_BufferDataARB size:%d", size);*/
    89102    crStateBufferDataARB(target, size, data, usage);
    90103    crPackBufferDataARB(target, size, data, usage);
     104}
     105
     106void PACKSPU_APIENTRY
     107packspu_BufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data)
     108{
     109    /*crDebug("packspu_BufferSubDataARB size:%d", size);*/
     110    crStateBufferSubDataARB(target, offset, size, data);
     111    crPackBufferSubDataARB(target, offset, size, data);
    91112}
    92113
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c

    r20083 r21308  
    153153    }
    154154#endif
     155
     156    /*crDebug("packspu_InterleavedArrays");*/
     157
    155158    crStateInterleavedArrays( format, stride, pointer );
    156159}
     
    160163packspu_ArrayElement( GLint index )
    161164{
     165#if 0
    162166    GLboolean serverArrays = GL_FALSE;
    163167
    164168#if CR_ARB_vertex_buffer_object
    165169    GET_CONTEXT(ctx);
     170    /*crDebug("packspu_ArrayElement index:%i", index);*/
    166171    if (ctx->clientState->extensions.ARB_vertex_buffer_object)
    167172        serverArrays = crStateUseServerArrays();
     
    184189            crPackExpandArrayElement( index, clientState );
    185190    }
     191#else
     192    GET_CONTEXT(ctx);
     193    CRClientState *clientState = &(ctx->clientState->client);
     194    crPackExpandArrayElement(index, clientState);
     195#endif
    186196}
    187197
     
    194204#if CR_ARB_vertex_buffer_object
    195205    GET_CONTEXT(ctx);
     206    /*crDebug("DrawElements count=%d, indices=%p", count, indices);*/
    196207    if (ctx->clientState->extensions.ARB_vertex_buffer_object)
    197208        serverArrays = crStateUseServerArrays();
     
    212223            crPackExpandDrawElementsSWAP( mode, count, type, indices, clientState );
    213224        else
     225        {
     226            //packspu_Begin(mode);
    214227            crPackExpandDrawElements( mode, count, type, indices, clientState );
     228            //packspu_End();
     229        }
    215230    }
    216231}
     
    224239#if CR_ARB_vertex_buffer_object
    225240    GET_CONTEXT(ctx);
     241    /*crDebug("DrawRangeElements count=%d", count);*/
    226242    if (ctx->clientState->extensions.ARB_vertex_buffer_object)
    227243         serverArrays = crStateUseServerArrays();
     
    242258            crPackExpandDrawRangeElementsSWAP( mode, start, end, count, type, indices, clientState );
    243259        else
     260        {
    244261            crPackExpandDrawRangeElements( mode, start, end, count, type, indices, clientState );
     262        }
    245263    }
    246264}
     
    254272#if CR_ARB_vertex_buffer_object
    255273    GET_CONTEXT(ctx);
     274    /*crDebug("DrawArrays count=%d", count);*/
    256275    if (ctx->clientState->extensions.ARB_vertex_buffer_object)
    257276         serverArrays = crStateUseServerArrays();
     
    302321void PACKSPU_APIENTRY packspu_EnableClientState( GLenum array )
    303322{
    304     crStateEnableClientState( array );
     323    crStateEnableClientState(array);
     324    crPackEnableClientState(array);
    305325}
    306326
    307327void PACKSPU_APIENTRY packspu_DisableClientState( GLenum array )
    308328{
    309     crStateDisableClientState( array );
     329    crStateDisableClientState(array);
     330    crPackDisableClientState(array);
    310331}
    311332
    312333void PACKSPU_APIENTRY packspu_ClientActiveTextureARB( GLenum texUnit )
    313334{
    314     crStateClientActiveTextureARB( texUnit );
    315     /* XXX also send to server for texcoord arrays? */
    316 }
    317 
     335    crStateClientActiveTextureARB(texUnit);
     336    crPackClientActiveTextureARB(texUnit);
     337}
     338
     339void PACKSPU_APIENTRY packspu_EnableVertexAttribArrayARB(GLuint index)
     340{
     341    crStateEnableVertexAttribArrayARB(index);
     342    crPackEnableVertexAttribArrayARB(index);
     343}
     344
     345
     346void PACKSPU_APIENTRY packspu_DisableVertexAttribArrayARB(GLuint index)
     347{
     348    crStateDisableVertexAttribArrayARB(index);
     349    crPackDisableVertexAttribArrayARB(index);
     350}
    318351
    319352void PACKSPU_APIENTRY packspu_Enable( GLenum cap )
    320353{
    321     switch (cap) {
    322     case GL_VERTEX_ARRAY:
    323     case GL_NORMAL_ARRAY:
    324     case GL_COLOR_ARRAY:
    325     case GL_INDEX_ARRAY:
    326     case GL_TEXTURE_COORD_ARRAY:
    327     case GL_EDGE_FLAG_ARRAY:
    328     case GL_FOG_COORDINATE_ARRAY_EXT:
    329     case GL_SECONDARY_COLOR_ARRAY_EXT:
    330 #if CR_NV_vertex_program
    331     case GL_VERTEX_ATTRIB_ARRAY0_NV:
    332     case GL_VERTEX_ATTRIB_ARRAY1_NV:
    333     case GL_VERTEX_ATTRIB_ARRAY2_NV:
    334     case GL_VERTEX_ATTRIB_ARRAY3_NV:
    335     case GL_VERTEX_ATTRIB_ARRAY4_NV:
    336     case GL_VERTEX_ATTRIB_ARRAY5_NV:
    337     case GL_VERTEX_ATTRIB_ARRAY6_NV:
    338     case GL_VERTEX_ATTRIB_ARRAY7_NV:
    339     case GL_VERTEX_ATTRIB_ARRAY8_NV:
    340     case GL_VERTEX_ATTRIB_ARRAY9_NV:
    341     case GL_VERTEX_ATTRIB_ARRAY10_NV:
    342     case GL_VERTEX_ATTRIB_ARRAY11_NV:
    343     case GL_VERTEX_ATTRIB_ARRAY12_NV:
    344     case GL_VERTEX_ATTRIB_ARRAY13_NV:
    345     case GL_VERTEX_ATTRIB_ARRAY14_NV:
    346     case GL_VERTEX_ATTRIB_ARRAY15_NV:
    347 #endif /* CR_NV_vertex_program */
    348         crStateEnableClientState(cap);
    349         break;
    350     default:
    351         ;
    352     }
     354    crStateEnable(cap);
    353355
    354356    if (pack_spu.swap)
     
    361363void PACKSPU_APIENTRY packspu_Disable( GLenum cap )
    362364{
    363     switch (cap) {
    364     case GL_VERTEX_ARRAY:
    365     case GL_NORMAL_ARRAY:
    366     case GL_COLOR_ARRAY:
    367     case GL_INDEX_ARRAY:
    368     case GL_TEXTURE_COORD_ARRAY:
    369     case GL_EDGE_FLAG_ARRAY:
    370     case GL_FOG_COORDINATE_ARRAY_EXT:
    371     case GL_SECONDARY_COLOR_ARRAY_EXT:
    372 #if CR_NV_vertex_program
    373     case GL_VERTEX_ATTRIB_ARRAY0_NV:
    374     case GL_VERTEX_ATTRIB_ARRAY1_NV:
    375     case GL_VERTEX_ATTRIB_ARRAY2_NV:
    376     case GL_VERTEX_ATTRIB_ARRAY3_NV:
    377     case GL_VERTEX_ATTRIB_ARRAY4_NV:
    378     case GL_VERTEX_ATTRIB_ARRAY5_NV:
    379     case GL_VERTEX_ATTRIB_ARRAY6_NV:
    380     case GL_VERTEX_ATTRIB_ARRAY7_NV:
    381     case GL_VERTEX_ATTRIB_ARRAY8_NV:
    382     case GL_VERTEX_ATTRIB_ARRAY9_NV:
    383     case GL_VERTEX_ATTRIB_ARRAY10_NV:
    384     case GL_VERTEX_ATTRIB_ARRAY11_NV:
    385     case GL_VERTEX_ATTRIB_ARRAY12_NV:
    386     case GL_VERTEX_ATTRIB_ARRAY13_NV:
    387     case GL_VERTEX_ATTRIB_ARRAY14_NV:
    388     case GL_VERTEX_ATTRIB_ARRAY15_NV:
    389 #endif /* CR_NV_vertex_program */
    390         crStateDisableClientState(cap);
    391         break;
    392     default:
    393         ;
    394     }
     365    crStateDisable(cap);
    395366
    396367    if (pack_spu.swap)
     
    400371}
    401372
     373GLboolean PACKSPU_APIENTRY packspu_IsEnabled(GLenum cap)
     374{
     375    GLboolean res = crStateIsEnabled(cap);
     376#ifdef DEBUG
     377    {   
     378        GET_THREAD(thread);
     379            int writeback = 1;
     380            GLboolean return_val = (GLboolean) 0;
     381        crPackIsEnabled(cap, &return_val, &writeback);
     382            packspuFlush( (void *) thread );
     383            while (writeback)
     384                  crNetRecv();
     385        CRASSERT(return_val==res);
     386    }
     387#endif
     388
     389    return res;
     390}
    402391
    403392void PACKSPU_APIENTRY packspu_PushClientAttrib( GLbitfield mask )
    404393{
    405394    crStatePushClientAttrib(mask);
     395    crPackPushClientAttrib(mask);
    406396}
    407397
     
    409399{
    410400    crStatePopClientAttrib();
    411 }
     401    crPackPopClientAttrib();
     402}
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c

    r21127 r21308  
    163163    /* XXX fix-up sharedCtx param here */
    164164    pack_spu.context[slot].clientState = crStateCreateContext(NULL, visual, NULL);
     165    pack_spu.context[slot].clientState->bufferobject.retainBufferData = GL_TRUE;
    165166    pack_spu.context[slot].serverCtx = serverCtx;
    166167
     
    227228        crPackSetContext( thread->packer );
    228229        crStateMakeCurrent( newCtx->clientState );
     230        //crStateSetCurrentPointers(newCtx->clientState, &thread->packer->current);
    229231        serverCtx = pack_spu.context[slot].serverCtx;
    230232    }
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py

    r20084 r21308  
    6969        print '\t}'
    7070        if func_name in simple_funcs:
    71             print '\tif (pname == GL_UNPACK_ALIGNMENT ||'
    72             print '\t\tpname == GL_UNPACK_ROW_LENGTH ||'
    73             print '\t\tpname == GL_UNPACK_SKIP_PIXELS ||'
    74             print '\t\tpname == GL_UNPACK_LSB_FIRST ||'
    75             print '\t\tpname == GL_UNPACK_SWAP_BYTES ||'
    76             print '#ifdef CR_OPENGL_VERSION_1_2'
    77             print '\t\tpname == GL_UNPACK_IMAGE_HEIGHT ||'
    78             print '#endif'
    79             print '\t\tpname == GL_UNPACK_SKIP_ROWS ||'
    80             print '\t\tpname == GL_PACK_ALIGNMENT ||'
    81             print '\t\tpname == GL_PACK_ROW_LENGTH ||'
    82             print '\t\tpname == GL_PACK_SKIP_PIXELS ||'
    83             print '\t\tpname == GL_PACK_LSB_FIRST ||'
    84             print '\t\tpname == GL_PACK_SWAP_BYTES ||'
    85             print '#ifdef CR_OPENGL_VERSION_1_2'
    86             print '\t\tpname == GL_PACK_IMAGE_HEIGHT ||'
    87             print '#endif'
    88             print '\t\tpname == GL_PACK_SKIP_ROWS'
    89             print '\t\t|| pname == GL_DRAW_BUFFER'
    90             print '#ifdef CR_OPENGL_VERSION_1_3'
    91             print '\t\t|| pname == GL_ACTIVE_TEXTURE'
    92             print '#endif'
    93             print '#ifdef CR_ARB_multitexture'
    94             print '\t\t|| pname == GL_ACTIVE_TEXTURE_ARB'
    95             print '#endif'
    96             print ') {'
    97             print '\t\t\tcrState%s( pname, params );' % func_name
    98             print '\t\t\treturn;'
    99             print '\t}'
     71            print """
     72    if (pname == GL_UNPACK_ALIGNMENT
     73        || pname == GL_UNPACK_ROW_LENGTH
     74        || pname == GL_UNPACK_SKIP_PIXELS
     75        || pname == GL_UNPACK_LSB_FIRST
     76        || pname == GL_UNPACK_SWAP_BYTES
     77#ifdef CR_OPENGL_VERSION_1_2
     78        || pname == GL_UNPACK_IMAGE_HEIGHT
     79#endif
     80        || pname == GL_UNPACK_SKIP_ROWS
     81        || pname == GL_PACK_ALIGNMENT
     82        || pname == GL_PACK_ROW_LENGTH
     83        || pname == GL_PACK_SKIP_PIXELS
     84        || pname == GL_PACK_LSB_FIRST
     85        || pname == GL_PACK_SWAP_BYTES
     86#ifdef CR_OPENGL_VERSION_1_2
     87        || pname == GL_PACK_IMAGE_HEIGHT
     88#endif
     89        || pname == GL_PACK_SKIP_ROWS
     90        || pname == GL_DRAW_BUFFER
     91#ifdef CR_OPENGL_VERSION_1_3
     92        || pname == GL_ACTIVE_TEXTURE
     93#endif
     94#ifdef CR_ARB_multitexture
     95        || pname == GL_ACTIVE_TEXTURE_ARB
     96#endif
     97        )
     98        {
     99            crState%s( pname, params );
     100            return;
     101        }
     102            """ % func_name
    100103        params.append( ("&writeback", "foo", 0) )
    101104        print '\tif (pack_spu.swap)'
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special

    r20467 r21308  
    7272GetAttachedObjectsARB
    7373GetInfoLogARB
     74BufferSubDataARB
     75EnableVertexAttribArrayARB
     76DisableVertexAttribArrayARB
     77GetBufferSubDataARB
     78IsEnabled
  • trunk/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt

    r20467 r21308  
    33663366category    1.1
    33673367props       setclient
    3368 chromium   
     3368chromium    extpack
    33693369
    33703370name        PushClientAttrib
     
    33733373category    1.1
    33743374props       setclient
    3375 chromium   
     3375chromium    extpack
    33763376
    33773377
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_client.c

    r21306 r21308  
    88#include "cr_opcodes.h"
    99#include "cr_version.h"
     10#include "state/cr_limits.h"
     11#include "cr_glstate.h"
     12
     13/*Convert from GLint to GLfloat in [-1.f,1.f]*/
     14#define CRP_I2F_NORM(i) ((2.f*((GLint)(i))+1.f) * (1.f/4294967294.f))
     15/*Convert from GLshort to GLfloat in [-1.f,1.f]*/
     16#define CRP_S2F_NORM(s) ((2.f*((GLshort)(s))+1.f) * (1.f/65535.f))
     17
     18
     19static void crPackVertexAttrib(const CRVertexArrays *array, unsigned int attr, GLint index)
     20{
     21    GLint *iPtr;
     22    GLshort *sPtr;
     23    unsigned char *p = array->a[attr].p + index * array->a[attr].stride;
     24
     25#ifdef CR_ARB_vertex_buffer_object
     26    if (array->a[attr].buffer && array->a[attr].buffer->data)
     27    {
     28        p = (unsigned char *)(array->a[attr].buffer->data) + (unsigned long)p;
     29    }
     30#endif
     31    switch (array->a[attr].type)
     32    {
     33        case GL_SHORT:
     34            sPtr = (GLshort*) p;
     35            switch (array->a[attr].size)
     36            {
     37                case 1:
     38                    if (array->a[attr].normalized)
     39                        crPackVertexAttrib1fARB(attr, CRP_S2F_NORM(sPtr[0]));
     40                    else
     41                        crPackVertexAttrib1svARB(attr, sPtr);
     42                    break;
     43                case 2:
     44                    if (array->a[attr].normalized)
     45                        crPackVertexAttrib2fARB(attr, CRP_S2F_NORM(sPtr[0]), CRP_S2F_NORM(sPtr[1]));
     46                    else
     47                        crPackVertexAttrib2svARB(attr, sPtr);
     48                    break;
     49                case 3:
     50                    if (array->a[attr].normalized)
     51                        crPackVertexAttrib3fARB(attr, CRP_S2F_NORM(sPtr[0]), CRP_S2F_NORM(sPtr[1]), CRP_S2F_NORM(sPtr[2]));
     52                    else
     53                        crPackVertexAttrib3svARB(attr, sPtr);
     54                    break;
     55                case 4:
     56                    if (array->a[attr].normalized)
     57                        crPackVertexAttrib4NsvARB(attr, sPtr);
     58                    else
     59                        crPackVertexAttrib4svARB(attr, sPtr);
     60                    break;
     61            }
     62            break;
     63        case GL_INT:
     64            iPtr = (GLint*) p;
     65            switch (array->a[attr].size)
     66            {
     67                case 1:
     68                    if (array->a[attr].normalized)
     69                        crPackVertexAttrib1fARB(attr, CRP_I2F_NORM(iPtr[0]));
     70                    else
     71                        crPackVertexAttrib1fARB(attr, iPtr[0]);
     72                    break;
     73                case 2:
     74                    if (array->a[attr].normalized)
     75                        crPackVertexAttrib2fARB(attr, CRP_I2F_NORM(iPtr[0]), CRP_I2F_NORM(iPtr[1]));
     76                    else
     77                        crPackVertexAttrib2fARB(attr, iPtr[0], iPtr[1]);
     78                    break;
     79                case 3:
     80                    if (array->a[attr].normalized)
     81                        crPackVertexAttrib3fARB(attr, CRP_I2F_NORM(iPtr[0]), CRP_I2F_NORM(iPtr[1]), CRP_I2F_NORM(iPtr[2]));
     82                    else
     83                        crPackVertexAttrib3fARB(attr, iPtr[0], iPtr[1], iPtr[2]);
     84                    break;
     85                case 4:
     86                    if (array->a[attr].normalized)
     87                        crPackVertexAttrib4NivARB(attr, iPtr);
     88                    else
     89                        crPackVertexAttrib4fARB(attr, iPtr[0], iPtr[1], iPtr[2], iPtr[3]);
     90                    break;
     91            }
     92            break;
     93        case GL_FLOAT:
     94            switch (array->a[attr].size)
     95            {
     96                case 1: crPackVertexAttrib1fvARB(attr, (GLfloat *)p); break;
     97                case 2: crPackVertexAttrib2fvARB(attr, (GLfloat *)p); break;
     98                case 3: crPackVertexAttrib3fvARB(attr, (GLfloat *)p); break;
     99                case 4: crPackVertexAttrib4fvARB(attr, (GLfloat *)p); break;
     100            }
     101            break;
     102        case GL_DOUBLE:
     103            switch (array->a[attr].size)
     104            {
     105                case 1: crPackVertexAttrib1dvARB(attr, (GLdouble *)p); break;
     106                case 2: crPackVertexAttrib2dvARB(attr, (GLdouble *)p); break;
     107                case 3: crPackVertexAttrib3dvARB(attr, (GLdouble *)p); break;
     108                case 4: crPackVertexAttrib4dvARB(attr, (GLdouble *)p); break;
     109            }
     110            break;
     111        default:
     112            crWarning("Bad datatype for vertex attribute [%d] array: 0x%x\n",
     113                       attr, array->a[attr].type);
     114    }
     115}
    10116
    11117/*
     
    16122{
    17123    unsigned char *p;
    18     int unit;
    19 
    20     if (c->array.e.enabled)
    21     {
    22         crPackEdgeFlagv(c->array.e.p + index * c->array.e.stride);
    23     }
    24     for (unit = 0; unit < CR_MAX_TEXTURE_UNITS; unit++)
    25     {
    26         if (c->array.t[unit].enabled)
    27         {
    28             p = c->array.t[unit].p + index * c->array.t[unit].stride;
    29             switch (c->array.t[unit].type)
    30             {
    31                 case GL_SHORT:
    32                     switch (c->array.t[c->curClientTextureUnit].size)
    33                     {
    34                         case 1: crPackMultiTexCoord1svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
    35                         case 2: crPackMultiTexCoord2svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
    36                         case 3: crPackMultiTexCoord3svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
    37                         case 4: crPackMultiTexCoord4svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
    38                     }
    39                     break;
    40                 case GL_INT:
    41                     switch (c->array.t[c->curClientTextureUnit].size)
    42                     {
    43                         case 1: crPackMultiTexCoord1ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
    44                         case 2: crPackMultiTexCoord2ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
    45                         case 3: crPackMultiTexCoord3ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
    46                         case 4: crPackMultiTexCoord4ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
    47                     }
    48                     break;
    49                 case GL_FLOAT:
    50                     switch (c->array.t[c->curClientTextureUnit].size)
    51                     {
    52                         case 1: crPackMultiTexCoord1fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
    53                         case 2: crPackMultiTexCoord2fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
    54                         case 3: crPackMultiTexCoord3fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
    55                         case 4: crPackMultiTexCoord4fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
    56                     }
    57                     break;
    58                 case GL_DOUBLE:
    59                     switch (c->array.t[c->curClientTextureUnit].size)
    60                     {
    61                         case 1: crPackMultiTexCoord1dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
    62                         case 2: crPackMultiTexCoord2dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
    63                         case 3: crPackMultiTexCoord3dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
    64                         case 4: crPackMultiTexCoord4dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
    65                     }
    66                     break;
    67             }
    68         }
    69     } /* loop over texture units */
    70 
    71     if (c->array.i.enabled)
    72     {
    73         p = c->array.i.p + index * c->array.i.stride;
    74         switch (c->array.i.type)
    75         {
    76             case GL_SHORT: crPackIndexsv((GLshort *)p); break;
    77             case GL_INT: crPackIndexiv((GLint *)p); break;
    78             case GL_FLOAT: crPackIndexfv((GLfloat *)p); break;
    79             case GL_DOUBLE: crPackIndexdv((GLdouble *)p); break;
    80         }
    81     }
    82     if (c->array.c.enabled)
    83     {
    84         p = c->array.c.p + index * c->array.c.stride;
    85         switch (c->array.c.type)
    86         {
    87             case GL_BYTE:
    88                 switch (c->array.c.size)
    89                 {
    90                     case 3: crPackColor3bv((GLbyte *)p); break;
    91                     case 4: crPackColor4bv((GLbyte *)p); break;
    92                 }
    93                 break;
    94             case GL_UNSIGNED_BYTE:
    95                 switch (c->array.c.size)
    96                 {
    97                     case 3: crPackColor3ubv((GLubyte *)p); break;
    98                     case 4: crPackColor4ubv((GLubyte *)p); break;
    99                 }
    100                 break;
    101             case GL_SHORT:
    102                 switch (c->array.c.size)
    103                 {
    104                     case 3: crPackColor3sv((GLshort *)p); break;
    105                     case 4: crPackColor4sv((GLshort *)p); break;
    106                 }
    107                 break;
    108             case GL_UNSIGNED_SHORT:
    109                 switch (c->array.c.size)
    110                 {
    111                     case 3: crPackColor3usv((GLushort *)p); break;
    112                     case 4: crPackColor4usv((GLushort *)p); break;
    113                 }
    114                 break;
    115             case GL_INT:
    116                 switch (c->array.c.size)
    117                 {
    118                     case 3: crPackColor3iv((GLint *)p); break;
    119                     case 4: crPackColor4iv((GLint *)p); break;
    120                 }
    121                 break;
    122             case GL_UNSIGNED_INT:
    123                 switch (c->array.c.size)
    124                 {
    125                     case 3: crPackColor3uiv((GLuint *)p); break;
    126                     case 4: crPackColor4uiv((GLuint *)p); break;
    127                 }
    128                 break;
    129             case GL_FLOAT:
    130                 switch (c->array.c.size)
    131                 {
    132                     case 3: crPackColor3fv((GLfloat *)p); break;
    133                     case 4: crPackColor4fv((GLfloat *)p); break;
    134                 }
    135                 break;
    136             case GL_DOUBLE:
    137                 switch (c->array.c.size)
    138                 {
    139                     case 3: crPackColor3dv((GLdouble *)p); break;
    140                     case 4: crPackColor4dv((GLdouble *)p); break;
    141                 }
    142                 break;
    143         }
    144     }
    145     if (c->array.n.enabled)
    146     {
    147         p = c->array.n.p + index * c->array.n.stride;
    148         switch (c->array.n.type)
     124    unsigned int unit, attr;
     125    const CRVertexArrays *array = &(c->array);
     126    const GLboolean vpEnabled = crStateGetCurrent()->program.vpEnabled;
     127
     128    if (array->n.enabled && !(vpEnabled && array->a[VERT_ATTRIB_NORMAL].enabled))
     129    {
     130        p = array->n.p + index * array->n.stride;
     131
     132#ifdef CR_ARB_vertex_buffer_object
     133        if (array->n.buffer && array->n.buffer->data)
     134        {
     135            p = (unsigned char *)(array->n.buffer->data) + (unsigned long)p;
     136        }
     137#endif
     138
     139        switch (array->n.type)
    149140        {
    150141            case GL_BYTE: crPackNormal3bv((GLbyte *)p); break;
     
    155146        }
    156147    }
     148
     149    if (array->c.enabled && !(vpEnabled && array->a[VERT_ATTRIB_COLOR0].enabled))
     150    {
     151        p = array->c.p + index * array->c.stride;
     152
     153#ifdef CR_ARB_vertex_buffer_object
     154        if (array->c.buffer && array->c.buffer->data)
     155        {
     156            p = (unsigned char *)(array->c.buffer->data) + (unsigned long)p;
     157        }
     158#endif
     159
     160        switch (array->c.type)
     161        {
     162            case GL_BYTE:
     163                switch (c->array.c.size)
     164                {
     165                    case 3: crPackColor3bv((GLbyte *)p); break;
     166                    case 4: crPackColor4bv((GLbyte *)p); break;
     167                }
     168                break;
     169            case GL_UNSIGNED_BYTE:
     170                switch (c->array.c.size)
     171                {
     172                    case 3: crPackColor3ubv((GLubyte *)p); break;
     173                    case 4: crPackColor4ubv((GLubyte *)p); break;
     174                }
     175                break;
     176            case GL_SHORT:
     177                switch (c->array.c.size)
     178                {
     179                    case 3: crPackColor3sv((GLshort *)p); break;
     180                    case 4: crPackColor4sv((GLshort *)p); break;
     181                }
     182                break;
     183            case GL_UNSIGNED_SHORT:
     184                switch (c->array.c.size)
     185                {
     186                    case 3: crPackColor3usv((GLushort *)p); break;
     187                    case 4: crPackColor4usv((GLushort *)p); break;
     188                }
     189                break;
     190            case GL_INT:
     191                switch (c->array.c.size)
     192                {
     193                    case 3: crPackColor3iv((GLint *)p); break;
     194                    case 4: crPackColor4iv((GLint *)p); break;
     195                }
     196                break;
     197            case GL_UNSIGNED_INT:
     198                switch (c->array.c.size)
     199                {
     200                    case 3: crPackColor3uiv((GLuint *)p); break;
     201                    case 4: crPackColor4uiv((GLuint *)p); break;
     202                }
     203                break;
     204            case GL_FLOAT:
     205                switch (c->array.c.size)
     206                {
     207                    case 3: crPackColor3fv((GLfloat *)p); break;
     208                    case 4: crPackColor4fv((GLfloat *)p); break;
     209                }
     210                break;
     211            case GL_DOUBLE:
     212                switch (c->array.c.size)
     213                {
     214                    case 3: crPackColor3dv((GLdouble *)p); break;
     215                    case 4: crPackColor4dv((GLdouble *)p); break;
     216                }
     217                break;
     218        }
     219    }
     220
    157221#ifdef CR_EXT_secondary_color
    158     if (c->array.s.enabled)
    159     {
    160         p = c->array.s.p + index * c->array.s.stride;
    161         switch (c->array.s.type)
     222    if (array->s.enabled && !(vpEnabled && array->a[VERT_ATTRIB_COLOR1].enabled))
     223    {
     224        p = array->s.p + index * array->s.stride;
     225
     226#ifdef CR_ARB_vertex_buffer_object
     227        if (array->s.buffer && array->s.buffer->data)
     228        {
     229            p = (unsigned char *)(array->s.buffer->data) + (unsigned long)p;
     230        }
     231#endif
     232
     233        switch (array->s.type)
    162234        {
    163235            case GL_BYTE:
     
    179251        }
    180252    }
    181 #endif
    182     if (c->array.v.enabled)
    183     {
    184         p = c->array.v.p + (index * c->array.v.stride);
    185         switch (c->array.v.type)
     253#endif // CR_EXT_secondary_color
     254
     255
     256#ifdef CR_EXT_fog_coord
     257    if (array->f.enabled && !(vpEnabled && array->a[VERT_ATTRIB_FOG].enabled))
     258    {
     259        p = array->f.p + index * array->f.stride;
     260
     261#ifdef CR_ARB_vertex_buffer_object
     262        if (array->f.buffer && array->f.buffer->data)
     263        {
     264            p = (unsigned char *)(array->f.buffer->data) + (unsigned long)p;
     265        }
     266#endif
     267        crPackFogCoordfEXT( *((GLfloat *) p) );
     268    }
     269#endif // CR_EXT_fog_coord
     270
     271    for (unit = 0 ; unit < CR_MAX_TEXTURE_UNITS ; unit++)
     272    {
     273        if (array->t[unit].enabled && !(vpEnabled && array->a[VERT_ATTRIB_TEX0+unit].enabled))
     274        {
     275            p = array->t[unit].p + index * array->t[unit].stride;
     276
     277#ifdef CR_ARB_vertex_buffer_object
     278            if (array->t[unit].buffer && array->t[unit].buffer->data)
     279            {
     280                p = (unsigned char *)(array->t[unit].buffer->data) + (unsigned long)p;
     281            }
     282#endif
     283
     284            switch (array->t[unit].type)
     285            {
     286                case GL_SHORT:
     287                    switch (array->t[unit].size)
     288                    {
     289                        case 1: crPackMultiTexCoord1svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
     290                        case 2: crPackMultiTexCoord2svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
     291                        case 3: crPackMultiTexCoord3svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
     292                        case 4: crPackMultiTexCoord4svARB(GL_TEXTURE0_ARB + unit, (GLshort *)p); break;
     293                    }
     294                    break;
     295                case GL_INT:
     296                    switch (array->t[unit].size)
     297                    {
     298                        case 1: crPackMultiTexCoord1ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
     299                        case 2: crPackMultiTexCoord2ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
     300                        case 3: crPackMultiTexCoord3ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
     301                        case 4: crPackMultiTexCoord4ivARB(GL_TEXTURE0_ARB + unit, (GLint *)p); break;
     302                    }
     303                    break;
     304                case GL_FLOAT:
     305                    switch (array->t[unit].size)
     306                    {
     307                        case 1: crPackMultiTexCoord1fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
     308                        case 2: crPackMultiTexCoord2fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
     309                        case 3: crPackMultiTexCoord3fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
     310                        case 4: crPackMultiTexCoord4fvARB(GL_TEXTURE0_ARB + unit, (GLfloat *)p); break;
     311                    }
     312                    break;
     313                case GL_DOUBLE:
     314                    switch (array->t[unit].size)
     315                    {
     316                        case 1: crPackMultiTexCoord1dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
     317                        case 2: crPackMultiTexCoord2dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
     318                        case 3: crPackMultiTexCoord3dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
     319                        case 4: crPackMultiTexCoord4dvARB(GL_TEXTURE0_ARB + unit, (GLdouble *)p); break;
     320                    }
     321                    break;
     322            }
     323        }
     324    }
     325
     326    if (array->i.enabled)
     327    {
     328        p = array->i.p + index * array->i.stride;
     329
     330#ifdef CR_ARB_vertex_buffer_object
     331        if (array->i.buffer && array->i.buffer->data)
     332        {
     333            p = (unsigned char *)(array->i.buffer->data) + (unsigned long)p;
     334        }
     335#endif
     336
     337        switch (array->i.type)
     338        {
     339            case GL_SHORT: crPackIndexsv((GLshort *)p); break;
     340            case GL_INT: crPackIndexiv((GLint *)p); break;
     341            case GL_FLOAT: crPackIndexfv((GLfloat *)p); break;
     342            case GL_DOUBLE: crPackIndexdv((GLdouble *)p); break;
     343        }
     344    }
     345
     346    if (array->e.enabled)
     347    {
     348        p = array->e.p + index * array->e.stride;
     349
     350#ifdef CR_ARB_vertex_buffer_object
     351        if (array->e.buffer && array->e.buffer->data)
     352        {
     353            p = (unsigned char *)(array->e.buffer->data) + (unsigned long)p;
     354        }
     355#endif
     356
     357        crPackEdgeFlagv(p);
     358    }
     359
     360    for (attr = 1; attr < VERT_ATTRIB_MAX; attr++)
     361    {
     362        if (array->a[attr].enabled)
     363        {
     364            crPackVertexAttrib(array, attr, index);
     365        }
     366    }
     367
     368    if (array->a[VERT_ATTRIB_POS].enabled)
     369    {
     370        crPackVertexAttrib(array, 0, index);
     371    }
     372    else if (array->v.enabled)
     373    {
     374        p = array->v.p + index * array->v.stride;
     375
     376#ifdef CR_ARB_vertex_buffer_object
     377        if (array->v.buffer && array->v.buffer->data)
     378        {
     379            p = (unsigned char *)(array->v.buffer->data) + (unsigned long)p;
     380        }
     381#endif
     382        switch (array->v.type)
    186383        {
    187384            case GL_SHORT:
    188385                switch (c->array.v.size)
    189386                {
    190                     case 2: crPackVertex2svBBOX_COUNT((GLshort *)p); break;
    191                     case 3: crPackVertex3svBBOX_COUNT((GLshort *)p); break;
    192                     case 4: crPackVertex4svBBOX_COUNT((GLshort *)p); break;
     387                    case 2: crPackVertex2sv((GLshort *)p); break;
     388                    case 3: crPackVertex3sv((GLshort *)p); break;
     389                    case 4: crPackVertex4sv((GLshort *)p); break;
    193390                }
    194391                break;
     
    196393                switch (c->array.v.size)
    197394                {
    198                     case 2: crPackVertex2ivBBOX_COUNT((GLint *)p); break;
    199                     case 3: crPackVertex3ivBBOX_COUNT((GLint *)p); break;
    200                     case 4: crPackVertex4ivBBOX_COUNT((GLint *)p); break;
     395                    case 2: crPackVertex2iv((GLint *)p); break;
     396                    case 3: crPackVertex3iv((GLint *)p); break;
     397                    case 4: crPackVertex4iv((GLint *)p); break;
    201398                }
    202399                break;
     
    204401                switch (c->array.v.size)
    205402                {
    206                     case 2: crPackVertex2fvBBOX_COUNT((GLfloat *)p); break;
    207                     case 3: crPackVertex3fvBBOX_COUNT((GLfloat *)p); break;
    208                     case 4: crPackVertex4fvBBOX_COUNT((GLfloat *)p); break;
     403                    case 2: crPackVertex2fv((GLfloat *)p); break;
     404                    case 3: crPackVertex3fv((GLfloat *)p); break;
     405                    case 4: crPackVertex4fv((GLfloat *)p); break;
    209406                }
    210407                break;
     
    212409                switch (c->array.v.size)
    213410                {
    214                     case 2: crPackVertex2dvBBOX_COUNT((GLdouble *)p); break;
    215                     case 3: crPackVertex3dvBBOX_COUNT((GLdouble *)p); break;
    216                     case 4: crPackVertex4dvBBOX_COUNT((GLdouble *)p); break;
     411                    case 2: crPackVertex2dv((GLdouble *)p); break;
     412                    case 3: crPackVertex3dv((GLdouble *)p); break;
     413                    case 4: crPackVertex4dv((GLdouble *)p); break;
    217414                }
    218415                break;
     
    247444}
    248445
    249 
    250 /*
    251  * Really pack glDrawElements (for server-side vertex arrays)
    252  * Note: we pack the pointer (which is actually an index into the server-side
    253  * vertex buffer) and not the actual indices.
    254  */
     446static GLsizei crPackElementsIndexSize(GLenum type)
     447{
     448    switch (type)
     449    {
     450        case GL_UNSIGNED_BYTE:
     451            return sizeof(GLubyte);
     452        case GL_UNSIGNED_SHORT:
     453            return sizeof(GLushort);
     454        case GL_UNSIGNED_INT:
     455            return sizeof(GLuint);
     456        default:
     457            crError("Unknown type 0x%x in crPackElementsIndexSize", type);
     458            return 0;
     459    }
     460}
     461
    255462void PACK_APIENTRY
    256463crPackDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
    257464{
    258     unsigned char *data_ptr;
     465    unsigned char *data_ptr, *start_ptr;
    259466    int packet_length = sizeof(int) + sizeof(mode) + sizeof(count) + sizeof(type) + sizeof(GLintptrARB);
    260     data_ptr = (unsigned char *) crPackAlloc(packet_length);
    261     WRITE_DATA( 0, GLenum, CR_DRAWELEMENTS_EXTEND_OPCODE );
    262     WRITE_DATA( 4, GLenum, mode );
    263     WRITE_DATA( 8, GLsizei, count);
    264     WRITE_DATA( 12, GLenum, type);
    265     WRITE_DATA( 16, GLsizeiptrARB, (GLsizeiptrARB) indices );
    266     crHugePacket( CR_EXTEND_OPCODE, data_ptr );
    267     crPackFree( data_ptr );
     467    GLsizei indexsize;
     468#ifdef CR_ARB_vertex_buffer_object
     469    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
     470    packet_length += sizeof(GLboolean);
     471    if (elementsBuffer && elementsBuffer->name)
     472    {
     473        /*@todo not sure it's possible, and not sure what to do*/
     474        if (!elementsBuffer->data)
     475        {
     476            crWarning("crPackDrawElements: trying to use bound but empty elements buffer, ignoring.");
     477            return;
     478        }
     479        indexsize = 0;
     480    }
     481    else
     482#endif
     483    {
     484        indexsize = crPackElementsIndexSize(type);
     485    }
     486
     487    packet_length += count * indexsize;
     488
     489    start_ptr = data_ptr = (unsigned char *) crPackAlloc(packet_length);
     490    WRITE_DATA_AI(GLenum, CR_DRAWELEMENTS_EXTEND_OPCODE );
     491    WRITE_DATA_AI(GLenum, mode );
     492    WRITE_DATA_AI(GLsizei, count);
     493    WRITE_DATA_AI(GLenum, type);
     494    WRITE_DATA_AI(GLsizeiptrARB, (GLsizeiptrARB) indices );
     495#ifdef CR_ARB_vertex_buffer_object
     496    WRITE_DATA_AI(GLboolean, (GLboolean) indexsize>0);
     497#endif
     498    if (indexsize>0)
     499    {
     500        crMemcpy(data_ptr, indices, count * indexsize);
     501    }
     502    crHugePacket(CR_EXTEND_OPCODE, start_ptr);
     503    crPackFree(start_ptr);
     504}
     505
     506void PACK_APIENTRY
     507crPackDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
     508                                                GLenum type, const GLvoid *indices)
     509{
     510    unsigned char *data_ptr, *start_ptr;
     511    int packet_length = sizeof(int) + sizeof(mode) + sizeof(start)
     512        + sizeof(end) + sizeof(count) + sizeof(type) + sizeof(GLintptrARB);
     513    GLsizei indexsize;
     514
     515#ifdef CR_ARB_vertex_buffer_object
     516    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
     517    packet_length += sizeof(GLboolean);
     518    if (elementsBuffer && elementsBuffer->name)
     519    {
     520        /*@todo not sure it's possible, and not sure what to do*/
     521        if (!elementsBuffer->data)
     522        {
     523            crWarning("crPackDrawElements: trying to use bound but empty elements buffer, ignoring.");
     524            return;
     525        }
     526        indexsize = 0;
     527    }
     528    else
     529#endif
     530    {
     531      indexsize = crPackElementsIndexSize(type);
     532    }
     533
     534    packet_length += count * indexsize;
     535
     536    start_ptr = data_ptr = (unsigned char *) crPackAlloc(packet_length);
     537    WRITE_DATA_AI(GLenum, CR_DRAWRANGEELEMENTS_EXTEND_OPCODE);
     538    WRITE_DATA_AI(GLenum, mode);
     539    WRITE_DATA_AI(GLuint, start);
     540    WRITE_DATA_AI(GLuint, end);
     541    WRITE_DATA_AI(GLsizei, count);
     542    WRITE_DATA_AI(GLenum, type);
     543    WRITE_DATA_AI(GLsizeiptrARB, (GLsizeiptr) indices);
     544#ifdef CR_ARB_vertex_buffer_object
     545    WRITE_DATA_AI(GLboolean, (GLboolean) indexsize>0);
     546#endif
     547    if (indexsize>0)
     548    {
     549        crMemcpy(data_ptr, indices, count * indexsize);
     550    }
     551    crHugePacket(CR_EXTEND_OPCODE, start_ptr);
     552    crPackFree(start_ptr);
    268553}
    269554
     
    278563{
    279564    int i;
     565    GLubyte *p = (GLubyte *)indices;
     566#ifdef CR_ARB_vertex_buffer_object
     567    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
     568#endif
    280569
    281570    if (count < 0)
     
    302591    }
    303592
     593#ifdef CR_ARB_vertex_buffer_object
     594    if (elementsBuffer && elementsBuffer->data)
     595    {
     596        p = (unsigned char *)(elementsBuffer->data) + (unsigned long)p;
     597    }
     598#endif
     599
    304600    if (mode != 999)
    305601        crPackBegin(mode);
    306602
    307     switch (type)   {
    308     case GL_UNSIGNED_BYTE:
    309         {
    310             const GLubyte *p = (const GLubyte *) indices;
    311             for (i = 0; i < count; i++)
    312                 crPackExpandArrayElement(p[i], c);
    313         }
    314         break;
    315     case GL_UNSIGNED_SHORT:
    316         {
    317             const GLushort *p = (const GLushort *) indices;
     603    //crDebug("crPackExpandDrawElements mode:0x%x, count:%d, type:0x%x", mode, count, type);
     604
     605    switch (type)
     606    {
     607        case GL_UNSIGNED_BYTE:
    318608            for (i=0; i<count; i++)
    319                 crPackExpandArrayElement(p[i], c);
    320         }
    321         break;
    322     case GL_UNSIGNED_INT:
    323         {
    324             const GLuint *p = (const GLuint *) indices;
    325             for (i = 0; i < count; i++)
    326                 crPackExpandArrayElement(p[i], c);
    327         }
    328         break;
    329     default:
    330         __PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
    331                                  "crPackDrawElements(bad type)");
    332         break;
     609            {
     610                crPackExpandArrayElement((GLint) *p++, c);
     611            }
     612            break;
     613        case GL_UNSIGNED_SHORT:
     614            for (i=0; i<count; i++)
     615            {
     616                crPackExpandArrayElement((GLint) * (GLushort *) p, c);
     617                p+=sizeof (GLushort);
     618            }
     619            break;
     620        case GL_UNSIGNED_INT:
     621            for (i=0; i<count; i++)
     622            {
     623                crPackExpandArrayElement((GLint) * (GLuint *) p, c);
     624                p+=sizeof (GLuint);
     625            }
     626            break;
     627        default:
     628            crError( "this can't happen: array_spu.self.DrawElements" );
     629            break;
    333630    }
    334631
     
    379676
    380677/*
    381  * Really pack glDrawRangeElements (for server-side vertex arrays)
    382  * Note: we pack the pointer (which is actually an index into the server-side
    383  * vertex buffer) and not the actual indices.
    384  */
    385 void PACK_APIENTRY
    386 crPackDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
    387                                                 GLenum type, const GLvoid *indices)
    388 {
    389     unsigned char *data_ptr;
    390     int packet_length = sizeof(int) + sizeof(mode) + sizeof(start)
    391         + sizeof(end) + sizeof(count) + sizeof(type) + sizeof(GLintptrARB);
    392 
    393     data_ptr = (unsigned char *) crPackAlloc(packet_length);
    394     WRITE_DATA( 0, GLenum, CR_DRAWRANGEELEMENTS_EXTEND_OPCODE );
    395     WRITE_DATA( 4, GLenum, mode );
    396     WRITE_DATA( 8, GLuint, start );
    397     WRITE_DATA( 12, GLuint, end );
    398     WRITE_DATA( 16, GLsizei, count );
    399     WRITE_DATA( 20, GLenum, type );
    400     WRITE_DATA( 24, GLsizeiptrARB, (GLsizeiptr) indices );
    401     crHugePacket( CR_EXTEND_OPCODE, data_ptr );
    402     crPackFree( data_ptr );
    403 }
    404 
    405 
    406 /*
    407678 * glDrawRangeElements, expanded into crPackBegin/Vertex/End/etc.
    408679 */
     
    410681crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c)
    411682{
    412     int i;
    413     GLubyte *p = (GLubyte *)indices;
    414 
    415     (void) end;
    416 
    417     if (count < 0)
    418     {
    419         __PackError(__LINE__, __FILE__, GL_INVALID_VALUE, "crPackDrawRangeElements(negative count)");
     683    if (start>end)
     684    {
     685        crWarning("crPackExpandDrawRangeElements start>end (%d>%d)", start, end);
    420686        return;
    421687    }
    422688
    423     if (mode > GL_POLYGON)
    424     {
    425         __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackDrawRangeElements(bad mode)");
    426         return;
    427     }
    428 
    429     if (type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT)
    430     {
    431         __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackDrawRangeElements(bad type)");
    432         return;
    433     }
    434 
    435     crPackBegin(mode);
    436     switch (type)
    437     {
    438     case GL_UNSIGNED_BYTE:
    439         for (i=0; i<count; i++)
    440         {
    441             crPackExpandArrayElement((GLint) *p++, c);
    442         }
    443         break;
    444     case GL_UNSIGNED_SHORT:
    445         for (i=0; i<count; i++)
    446         {
    447             crPackExpandArrayElement((GLint) * (GLushort *) p, c);
    448             p += sizeof(GLushort);
    449         }
    450         break;
    451     case GL_UNSIGNED_INT:
    452         for (i=0; i<count; i++)
    453         {
    454             crPackExpandArrayElement((GLint) * (GLuint *) p, c);
    455             p += sizeof(GLuint);
    456         }
    457         break;
    458     default:
    459         crError( "this can't happen: crPackDrawRangeElements" );
    460         break;
    461     }
    462     crPackEnd();
     689    crPackExpandDrawElements(mode, count, type, indices, c);
    463690}
    464691
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_bufferobject.c

    r20975 r21308  
    172172                    DIRTY(bb->elementsBinding, g->neg_bitid);
    173173                }
    174                 /* XXX check bindings with the vertex arrays */
     174                /* @todo check bindings with the vertex arrays */
    175175
    176176                crHashtableDelete(b->buffers, buffers[i], crStateFreeBufferObject);
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c

    r15532 r21308  
    13121312}
    13131313
     1314/*Returns if the given clientpointer could be used on server side directly*/
     1315#define CRSTATE_IS_SERVER_CP(cp) (!(cp).enabled || !(cp).p || ((cp).buffer && (cp).buffer->name))
     1316
     1317static crStateDumpClientPointer(CRClientPointer *cp, const char *name, int i)
     1318{
     1319  if (i<0 && cp->enabled)
     1320  {
     1321    crDebug("CP(%s): enabled:%d ptr:%p buffer:%p buffer.name:%i %s",
     1322            name, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->name:-1,
     1323            CRSTATE_IS_SERVER_CP(*cp) ? "":"!FAIL!");
     1324  }
     1325  else if (0==i || cp->enabled)
     1326  {
     1327    crDebug("CP(%s%i): enabled:%d ptr:%p buffer:%p buffer.name:%i %s",
     1328            name, i, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->name:-1,
     1329            CRSTATE_IS_SERVER_CP(*cp) ? "":"!FAIL!");
     1330  }
     1331}
    13141332
    13151333/*
     
    13231341    CRClientState *c = &(g->client);
    13241342    int i;
    1325 
    1326     if (!c->array.v.enabled)
    1327         return GL_FALSE;
    1328 
    1329     if (c->array.v.enabled && (!c->array.v.buffer || !c->array.v.buffer->name))
    1330         return GL_FALSE;
    1331 
    1332     if (c->array.n.enabled && (!c->array.n.buffer || !c->array.n.buffer->name))
    1333         return GL_FALSE;
    1334 
    1335     if (c->array.c.enabled && (!c->array.c.buffer || !c->array.c.buffer->name))
    1336         return GL_FALSE;
    1337 
    1338     if (c->array.i.enabled && (!c->array.i.buffer || !c->array.i.buffer->name))
    1339         return GL_FALSE;
     1343    GLboolean res;
     1344
     1345    res =    CRSTATE_IS_SERVER_CP(c->array.v)
     1346          && CRSTATE_IS_SERVER_CP(c->array.n)
     1347          && CRSTATE_IS_SERVER_CP(c->array.c)
     1348          && CRSTATE_IS_SERVER_CP(c->array.i)
     1349          && CRSTATE_IS_SERVER_CP(c->array.e)
     1350          && CRSTATE_IS_SERVER_CP(c->array.s)
     1351          && CRSTATE_IS_SERVER_CP(c->array.f);
    13401352
    13411353    for (i = 0; (unsigned int)i < g->limits.maxTextureUnits; i++)
    1342          if (c->array.t[i].enabled && (!c->array.t[i].buffer || !c->array.t[i].buffer->name))
    1343                 return GL_FALSE;
    1344 
    1345     if (c->array.e.enabled && (!c->array.e.buffer || !c->array.e.buffer->name))
    1346          return GL_FALSE;
    1347 
    1348     if (c->array.s.enabled && (!c->array.s.buffer || !c->array.s.buffer->name))
    1349          return GL_FALSE;
    1350 
    1351     if (c->array.f.enabled && (!c->array.f.buffer || !c->array.f.buffer->name))
    1352          return GL_FALSE;
     1354        if (!CRSTATE_IS_SERVER_CP(c->array.t[i]))
     1355        {
     1356            res = GL_FALSE;
     1357            break;   
     1358        }
    13531359
    13541360    for (i = 0; (unsigned int)i < g->limits.maxVertexProgramAttribs; i++)
    1355          if (c->array.a[i].enabled && (!c->array.a[i].buffer || !c->array.a[i].buffer->name))
    1356                 return GL_FALSE;
    1357 
    1358     return GL_TRUE;
     1361        if (!CRSTATE_IS_SERVER_CP(c->array.a[i]))
     1362        {
     1363            res = GL_FALSE;
     1364            break;   
     1365        }
     1366
     1367    if (!res)
     1368    {
     1369        crStateDumpClientPointer(&c->array.v, "v", -1);
     1370        crStateDumpClientPointer(&c->array.n, "n", -1);
     1371        crStateDumpClientPointer(&c->array.c, "c", -1);
     1372        crStateDumpClientPointer(&c->array.i, "i", -1);
     1373        crStateDumpClientPointer(&c->array.e, "e", -1);
     1374        crStateDumpClientPointer(&c->array.s, "s", -1);
     1375        crStateDumpClientPointer(&c->array.f, "f", -1);
     1376        for (i = 0; (unsigned int)i < g->limits.maxTextureUnits; i++)
     1377            crStateDumpClientPointer(&c->array.t[i], "tex", i);
     1378        for (i = 0; (unsigned int)i < g->limits.maxVertexProgramAttribs; i++)
     1379            crStateDumpClientPointer(&c->array.a[i], "attrib", i);
     1380        crDebug("crStateUseServerArrays->%d", res);
     1381    }
     1382
     1383    return res;
    13591384#else
    13601385    return GL_FALSE;
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.py

    r20916 r21308  
    403403            return temp->num_values;
    404404    }
    405     crWarning( "Invalid pname to __numValues: 0x%x\\n", (int) pname );
     405    crDebug( "Invalid pname to __numValues: 0x%x\\n", (int) pname );
    406406    return 0;
    407407}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py

    r21033 r21308  
    4949    print '\t(void) params;'
    5050    print '\tget_values = (%s *) crAlloc( tablesize );' % types[index]
     51    print '\tif (tablesize>0)'
    5152    print '\tcr_server.head_spu->dispatch_table.%s( pname, get_values );' % func_name
    5253    print """
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py

    r15532 r21308  
    2828
    2929static void crUnpackExtend(void);
     30static void crUnpackExtendDbg(void);
     31
     32/*#define CR_UNPACK_DEBUG_OPCODES*/
     33/*#define CR_UNPACK_DEBUG_LAST_OPCODES*/
    3034"""
    3135
    32 
     36nodebug_opcodes = [
     37    "CR_MULTITEXCOORD2FARB_OPCODE",
     38    "CR_VERTEX3F_OPCODE",
     39    "CR_NORMAL3F_OPCODE",
     40    "CR_COLOR4UB_OPCODE",
     41    "CR_LOADIDENTITY_OPCODE",
     42    "CR_MATRIXMODE_OPCODE",
     43    "CR_LOADMATRIXF_OPCODE",
     44    "CR_DISABLE_OPCODE",
     45    "CR_COLOR4F_OPCODE",
     46    "CR_ENABLE_OPCODE",
     47    "CR_BEGIN_OPCODE",
     48    "CR_END_OPCODE",
     49    "CR_SECONDARYCOLOR3FEXT_OPCODE"
     50]
     51
     52nodebug_extopcodes = [
     53    "CR_ACTIVETEXTUREARB_EXTEND_OPCODE"
     54]
    3355
    3456#
     
    199221    cr_unpackData = (const unsigned char *)data;
    200222
     223    crDebug("crUnpack: %d opcodes", num_opcodes);
     224
    201225    for (i = 0 ; i < num_opcodes ; i++)
    202226    {
     
    211235    if "pack" in apiutil.ChromiumProps(func_name):
    212236        print '\t\t\tcase %s:' % apiutil.OpcodeName( func_name )
    213 #        print '\t\t\t\tcrDebug("Unpack: %s");' % apiutil.OpcodeName( func_name )
     237        if not apiutil.OpcodeName(func_name) in nodebug_opcodes:
     238            print """
     239#ifdef CR_UNPACK_DEBUG_LAST_OPCODES
     240                if (i==(num_opcodes-1))
     241#endif
     242#if defined(CR_UNPACK_DEBUG_OPCODES) || defined(CR_UNPACK_DEBUG_LAST_OPCODES)
     243                crDebug("Unpack: %s");
     244#endif """ % apiutil.OpcodeName(func_name)
    214245        print '\t\t\t\tcrUnpack%s(); \n\t\t\t\tbreak;' % func_name
    215246
    216247print """       
    217             case CR_EXTEND_OPCODE: crUnpackExtend(); break;
     248            case CR_EXTEND_OPCODE:
     249                #ifdef CR_UNPACK_DEBUG_OPCODES
     250                    crUnpackExtendDbg();
     251                #else
     252                # ifdef CR_UNPACK_DEBUG_LAST_OPCODES
     253                    if (i==(num_opcodes-1)) crUnpackExtendDbg();
     254                    else
     255                # endif
     256                    crUnpackExtend();
     257                #endif
     258                break;
    218259            default:
    219260                crError( "Unknown opcode: %d", *unpack_opcodes );
     
    263304    INCR_VAR_PTR();
    264305}"""
     306
     307print 'static void crUnpackExtendDbg(void)'
     308print '{'
     309print '\tGLenum extend_opcode = %s;' % ReadData( 4, 'GLenum' );
     310print ''
     311print '\t/*crDebug(\"Unpacking extended opcode \%d", extend_opcode);*/'
     312print '\tswitch( extend_opcode )'
     313print '\t{'
     314
     315
     316#
     317# Emit switch statement for extended opcodes
     318#
     319for func_name in keys:
     320    if "extpack" in apiutil.ChromiumProps(func_name):
     321        print '\t\tcase %s:' % apiutil.ExtendedOpcodeName( func_name )
     322        if not apiutil.ExtendedOpcodeName(func_name) in nodebug_extopcodes:
     323            print '\t\t\tcrDebug("Unpack: %s");' % apiutil.ExtendedOpcodeName( func_name )
     324        print '\t\t\tcrUnpackExtend%s( );' % func_name
     325        print '\t\t\tbreak;'
     326
     327print """       default:
     328            crError( "Unknown extended opcode: %d", (int) extend_opcode );
     329            break;
     330    }
     331    INCR_VAR_PTR();
     332}"""
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_arrays.c

    r21306 r21308  
    117117void crUnpackExtendDrawElements(void)
    118118{
    119     GLenum mode = READ_DATA( 8, GLenum );
    120     GLsizei count = READ_DATA( 12, GLsizei );
    121     GLenum type = READ_DATA( 16, GLenum );
     119    GLenum mode         = READ_DATA( 8, GLenum );
     120    GLsizei count       = READ_DATA( 12, GLsizei );
     121    GLenum type         = READ_DATA( 16, GLenum );
    122122    GLintptrARB indices = READ_DATA( 20, GLintptrARB );
    123     cr_unpackDispatch.DrawElements( mode, count, type, (void *) indices);
     123    void * indexptr;
     124#ifdef CR_ARB_vertex_buffer_object
     125    GLboolean hasidxdata = READ_DATA(24, GLboolean);
     126    indexptr = hasidxdata ? DATA_POINTER(24+sizeof(GLboolean), void) : (void*)indices;
     127#else
     128    indexptr = DATA_POINTER(24, void);
     129#endif
     130    /*crDebug("DrawElements: count=%i, indexptr=%p, hasidx=%p", count, indexptr, hasidxdata);*/
     131    cr_unpackDispatch.DrawElements(mode, count, type, indexptr);
    124132}
    125133
    126134void crUnpackExtendDrawRangeElements(void)
    127135{
    128     GLenum mode = READ_DATA( 8, GLenum );
    129     GLuint start = READ_DATA( 12, GLuint );
    130     GLuint end = READ_DATA( 16, GLuint );
    131     GLsizei count = READ_DATA( 20, GLsizei );
    132     GLenum type = READ_DATA( 24, GLenum );
     136    GLenum mode         = READ_DATA( 8, GLenum );
     137    GLuint start        = READ_DATA( 12, GLuint );
     138    GLuint end          = READ_DATA( 16, GLuint );
     139    GLsizei count       = READ_DATA( 20, GLsizei );
     140    GLenum type         = READ_DATA( 24, GLenum );
    133141    GLintptrARB indices = READ_DATA( 28, GLintptrARB );
    134     cr_unpackDispatch.DrawRangeElements( mode, start, end, count, type, (void *) indices);
     142    void * indexptr;
     143#ifdef CR_ARB_vertex_buffer_object
     144    GLboolean hasidxdata = READ_DATA(32, GLboolean);
     145    indexptr = hasidxdata ? DATA_POINTER(32+sizeof(GLboolean), void) : (void*)indices;
     146#else
     147    indexptr = DATA_POINTER(32, void);
     148#endif
     149    cr_unpackDispatch.DrawRangeElements(mode, start, end, count, type, indexptr);
    135150}
    136151
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_bufferobject.c

    r21306 r21308  
    3232void crUnpackExtendBufferDataARB( void )
    3333{
    34     GLenum target = READ_DATA( sizeof(int) + 4, GLenum );
    35     GLsizeiptrARB size = READ_DATA( sizeof(int) + 8, GLsizeiptrARB );
    36     GLenum usage = READ_DATA( sizeof(int) + 12, GLenum );
    37     GLvoid *data = DATA_POINTER( sizeof(int) + 16, GLvoid );
     34    GLenum target      = READ_DATA(sizeof(int) + 4, GLenum);
     35    GLsizeiptrARB size = READ_DATA(sizeof(int) + 8, GLsizeiptrARB);
     36    GLenum usage       = READ_DATA(sizeof(int) + 12, GLenum);
     37    GLboolean hasdata  = READ_DATA(sizeof(int) + 16, GLboolean);
     38    GLvoid *data       = DATA_POINTER(sizeof(int) + 16 + sizeof(GLboolean), GLvoid);
    3839
    3940    CRASSERT(sizeof(GLsizeiptrARB) == 4);
    40     CRASSERT(usage == GL_STATIC_DRAW_ARB);
     41    /*@todo, why?*/
     42    /*CRASSERT(usage == GL_STATIC_DRAW_ARB);*/
    4143
    42     cr_unpackDispatch.BufferDataARB( target, size, data, usage );
     44    cr_unpackDispatch.BufferDataARB(target, size, hasdata ? data:NULL, usage);
    4345}
    4446
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpacker.h

    r15532 r21308  
    1313#define DLLDATA(type) DECLEXPORT(type)
    1414
     15#include "cr_version.h"
    1516#include "cr_unpack.h"
    1617#include "unpack_extend.h"
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette