packspu_context.c revision 31826dacef766ea4c6fb5e9059553c93e41e9d2d
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync/* Copyright (c) 2001, Stanford University
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * All rights reserved
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * See the file LICENSE.txt for information on redistributing this software.
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * Allocate a new ThreadInfo structure, setup a connection to the
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * server, allocate/init a packer context, bind this ThreadInfo to
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * the calling thread with crSetTSD().
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * We'll always call this function at least once even if we're not
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * using threads.
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* connect to the server */
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync thread->netServer.name = crStrdup( pack_spu.name );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync thread->netServer.buffer_size = pack_spu.buffer_size;
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* a new pthread */
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync crNetNewClient(pack_spu.thread[0].netServer.conn, &(thread->netServer));
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* packer setup */
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync thread->packer = crPackNewContext( pack_spu.swap );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync crPackInitBuffer( &(thread->buffer), crNetAlloc(thread->netServer.conn),
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync thread->netServer.conn->buffer_size, thread->netServer.conn->mtu );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync thread->buffer.canBarf = thread->netServer.conn->Barf ? GL_TRUE : GL_FALSE;
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync crPackSetBuffer( thread->packer, &thread->buffer );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsyncpackspu_CreateContext( const char *dpyName, GLint visual, GLint shareCtx )
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* translate to server ctx id */
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync if (shareCtx >= 0 && shareCtx < pack_spu.numContexts) {
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* Pack the command */
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync crPackCreateContextSWAP( dpyName, visual, shareCtx, &serverCtx, &writeback );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync crPackCreateContext( dpyName, visual, shareCtx, &serverCtx, &writeback );
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* Flush buffer and get return value */
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync if (!(pack_spu.thread[0].netServer.conn->actual_network))
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync /* HUMUNGOUS HACK TO MATCH SERVER NUMBERING
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * The hack exists solely to make file networking work for now. This
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * is totally gross, but since the server expects the numbers to start
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * from 5000, we need to write them out this way. This would be
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * marginally less gross if the numbers (500 and 5000) were maybe
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * some sort of #define'd constants somewhere so the client and the
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync * server could be aware of how each other were numbering things in
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync * cases like file networking where they actually
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync /* find an empty context slot */
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync for (slot = 0; slot < pack_spu.numContexts; slot++) {
0c94df02222ed175411e5363dd39658f2fb1df41vboxsync /* found empty slot */
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync /* Fill in the new context info */
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync /* XXX fix-up sharedCtx param here */
6728a36898fd2be125a28e84d2115d19aa4923edvboxsync pack_spu.context[slot].clientState = crStateCreateContext(NULL, visual, NULL);
9562e2d410460d8fae06fa24297f172fee1d1995vboxsyncvoid PACKSPU_APIENTRY packspu_DestroyContext( GLint ctx )
9562e2d410460d8fae06fa24297f172fee1d1995vboxsyncvoid PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLint ctx )
9562e2d410460d8fae06fa24297f172fee1d1995vboxsync crPackMakeCurrentSWAP( window, nativeWindow, serverCtx );