Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:dreveman:openSUSE:11.1:cr
cr
cr-server-serialize-contexts-option.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File cr-server-serialize-contexts-option.diff of Package cr
commit 4b438e189e6c62b37d115bcffbba4b872b425acb Author: David Reveman <davidr@novell.com> Date: Thu Apr 9 22:18:12 2009 -0400 Add serialize_contexts config option to crserver. diff --git a/crserverlib/server_config.c b/crserverlib/server_config.c index bcea23b..c8f6d1d 100644 --- a/crserverlib/server_config.c +++ b/crserverlib/server_config.c @@ -37,6 +37,7 @@ setDefaults(void) cr_server.vpProjectionMatrixParameter = -1; cr_server.vpProjectionMatrixVariable = NULL; cr_server.currentProgram = 0; + cr_server.serializeContexts = 1; cr_server.num_overlap_intens = 0; cr_server.overlap_intens = 0; @@ -295,6 +296,10 @@ crServerGatherConfiguration(char *mothership) else cr_server.stereoView = 0x3; } + if (crMothershipGetServerParam(conn, response, "serialize_contexts")) + { + cr_server.serializeContexts = crStrToInt(response); + } if (crMothershipGetServerParam(conn, response, "view_matrix")) { crMatrixInitFromString(&cr_server.viewMatrix[0], response); diff --git a/crserverlib/server_context.c b/crserverlib/server_context.c index b43edd9..50446a3 100644 --- a/crserverlib/server_context.c +++ b/crserverlib/server_context.c @@ -32,6 +32,13 @@ generateID(void) } } +static void +SpuContextMatch(unsigned long key, void *data, void *ptr ) +{ + (void) key; + if ((int) data == *((int *) ptr)) + *((int *) ptr) = -1; +} GLint SERVER_DISPATCH_APIENTRY crServerDispatchCreateContext( const char *dpyName, GLint visualBits, GLint shareCtx ) @@ -39,7 +46,19 @@ crServerDispatchCreateContext( const char *dpyName, GLint visualBits, GLint shar GLint retVal = -1; CRContext *newCtx; - if (shareCtx > 0) { + if (!cr_server.serializeContexts) { + if (!cr_server.firstCallCreateContext) { + int SpuContext = cr_server.SpuContext; + + crHashtableWalk(cr_server.SpuContextTable, SpuContextMatch, + (void *) &SpuContext); + + if (SpuContext != -1) + cr_server.head_spu->dispatch_table.DestroyContext(cr_server.SpuContext); + cr_server.firstCallCreateContext = GL_TRUE; + } + } + else if (shareCtx > 0) { crWarning("CRServer: context sharing not implemented."); shareCtx = 0; } @@ -99,6 +118,8 @@ crServerDispatchCreateContext( const char *dpyName, GLint visualBits, GLint shar crStateSetCurrentPointers( newCtx, &(cr_server.current) ); retVal = generateID(); crHashtableAdd(cr_server.contextTable, retVal, newCtx); + crHashtableAdd(cr_server.SpuContextTable, retVal, + (void *) cr_server.SpuContext); } crServerReturnValue( &retVal, sizeof(retVal) ); @@ -110,6 +131,7 @@ void SERVER_DISPATCH_APIENTRY crServerDispatchDestroyContext( GLint ctx ) { CRContext *crCtx; + int SpuContext; crCtx = (CRContext *) crHashtableSearch(cr_server.contextTable, ctx); if (!crCtx) { @@ -125,6 +147,11 @@ crServerDispatchDestroyContext( GLint ctx ) cr_server.curClient->currentContextNumber = -1; cr_server.curClient->currentCtx = cr_server.DummyContext; } + + SpuContext = (int) crHashtableSearch(cr_server.SpuContextTable, ctx); + if (SpuContext != cr_server.SpuContext) + cr_server.head_spu->dispatch_table.DestroyContext(SpuContext); + crHashtableDelete(cr_server.SpuContextTable, ctx, NULL); } @@ -168,6 +195,9 @@ crServerDispatchMakeCurrent( GLint window, GLint nativeWindow, GLint context ) cr_server.curClient->currentCtx = ctx; cr_server.curClient->currentMural = mural; cr_server.curClient->currentWindow = window; + cr_server.curClient->currentNativeWindow = nativeWindow; + + cr_server.SpuContext = (int) crHashtableSearch(cr_server.SpuContextTable, context); CRASSERT(cr_server.curClient->currentCtx); @@ -207,6 +237,7 @@ crServerDispatchMakeCurrent( GLint window, GLint nativeWindow, GLint context ) nativeWindow, cr_server.SpuContext ); cr_server.firstCallMakeCurrent = GL_FALSE; + cr_server.currentContextNumber = context; cr_server.currentWindow = window; cr_server.currentNativeWindow = nativeWindow; diff --git a/crserverlib/server_main.c b/crserverlib/server_main.c index 86788ce..845090e 100644 --- a/crserverlib/server_main.c +++ b/crserverlib/server_main.c @@ -232,12 +232,15 @@ crServerInit(int argc, char *argv[]) * Default context */ cr_server.contextTable = crAllocHashtable(); + cr_server.SpuContextTable = crAllocHashtable(); cr_server.DummyContext = crStateCreateContext( &cr_server.limits, CR_RGB_BIT | CR_DEPTH_BIT, NULL ); cr_server.curClient->currentCtx = cr_server.DummyContext; crServerInitDispatch(); - crStateDiffAPI( &(cr_server.head_spu->dispatch_table) ); + + if (cr_server.serializeContexts) + crStateDiffAPI( &(cr_server.head_spu->dispatch_table) ); crUnpackSetReturnPointer( &(cr_server.return_ptr) ); crUnpackSetWritebackPointer( &(cr_server.writeback_ptr) ); diff --git a/crserverlib/server_stream.c b/crserverlib/server_stream.c index 20f6afd..7233f65 100644 --- a/crserverlib/server_stream.c +++ b/crserverlib/server_stream.c @@ -408,9 +408,12 @@ crServerServiceClient(const RunQueue *qEntry) */ if (cr_server.curClient) { int clientWindow = cr_server.curClient->currentWindow; + int clientNativeWindow = cr_server.curClient->currentNativeWindow; int clientContext = cr_server.curClient->currentContextNumber; - if (clientWindow && clientWindow != cr_server.currentWindow) { - crServerDispatchMakeCurrent(clientWindow, 0, clientContext); + if (cr_server.serializeContexts) + cr_server.currentContextNumber = cr_server.curClient->currentContextNumber; + if (clientContext && clientWindow && (clientContext != cr_server.currentContextNumber || clientWindow != cr_server.currentWindow)) { + crServerDispatchMakeCurrent(clientWindow, clientNativeWindow, clientContext); /* CRASSERT(cr_server.currentWindow == clientWindow); */ diff --git a/include/cr_server.h b/include/cr_server.h index fad68a0..c99fc4f 100644 --- a/include/cr_server.h +++ b/include/cr_server.h @@ -68,6 +68,7 @@ typedef struct _crclient { GLint currentContextNumber; CRContext *currentCtx; GLint currentWindow; + GLint currentNativeWindow; CRMuralInfo *currentMural; GLint windowList[CR_MAX_WINDOWS]; } CRClient; @@ -101,6 +102,7 @@ typedef struct { GLboolean firstCallCreateContext; GLboolean firstCallMakeCurrent; GLint currentWindow; + GLint currentContextNumber; GLint currentNativeWindow; CRHashTable *muralTable; /**< hash table where all murals are stored */ @@ -119,6 +121,7 @@ typedef struct { CRLimitsState limits; /**< GL limits for any contexts we create */ + CRHashTable *SpuContextTable; /**< hash table for head SPU rendering contexts */ int SpuContext; /**< Rendering context for the head SPU */ int SpuContextVisBits; /**< Context's visual attributes */ @@ -148,6 +151,7 @@ typedef struct { int vpProjectionMatrixParameter; const char *vpProjectionMatrixVariable; int stereoView; + int serializeContexts; int vncMode; /* cmd line option */ /*@}*/ /** view_matrix config */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor