/** * Allocate a new ContextInfo object, initialize it, put it into the * context hash table. If type==CHROMIUM, call the head SPU's * CreateContext() function too. */ ContextInfo * stubNewContext(char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) , struct VBOXUHGSMI *pHgsmi #endif ) { GLint spuContext = -1, spuShareCtx = 0, spuConnection = 0; ContextInfo *context; if (shareCtx > 0) { /* translate shareCtx to a SPU context ID */ context = (ContextInfo *) crHashtableSearch(stub.contextTable, shareCtx); if (context) spuShareCtx = context->spuContext; } if (type == CHROMIUM) { #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) if (pHgsmi) { spuConnection = stub.spu->dispatch_table.VBoxConCreate(pHgsmi); if (!spuConnection) { crWarning("VBoxConCreate failed"); return NULL; } } #endif spuContext = stub.spu->dispatch_table.VBoxCreateContext(spuConnection, dpyName, visBits, spuShareCtx); if (spuContext < 0) { crWarning("VBoxCreateContext failed"); #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) if (spuConnection) stub.spu->dispatch_table.VBoxConDestroy(spuConnection); #endif return NULL; } } context = crCalloc(sizeof(ContextInfo)); if (!context) { stub.spu->dispatch_table.DestroyContext(spuContext); #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) if (spuConnection) stub.spu->dispatch_table.VBoxConDestroy(spuConnection); #endif return NULL; } if (!dpyName) dpyName = ""; context->id = stub.freeContextNumber++; context->type = type; context->spuContext = spuContext; context->visBits = visBits; context->currentDrawable = NULL; crStrncpy(context->dpyName, dpyName, MAX_DPY_NAME); context->dpyName[MAX_DPY_NAME-1] = 0; #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) context->spuConnection = spuConnection; context->pHgsmi = pHgsmi; #endif #ifdef CHROMIUM_THREADSAFE VBoxTlsRefInit(context, stubContextDtor); #endif #if defined(GLX) || defined(DARWIN) context->share = (ContextInfo *) crHashtableSearch(stub.contextTable, (unsigned long) shareCtx); #endif #ifdef GLX context->pGLXPixmapsHash = crAllocHashtable(); context->damageQueryFailed = GL_FALSE; context->damageEventsBase = 0; #endif crHashtableAdd(stub.contextTable, context->id, (void *) context); return context; }
/* * Helper for crStateCreateContext, below. */ static CRContext * crStateCreateContextId(int i, const CRLimitsState *limits, GLint visBits, CRContext *shareCtx) { CRContext *ctx = (CRContext *) crCalloc( sizeof( *ctx ) ); int j; int node32 = i >> 5; int node = i & 0x1f; ctx->id = i; #ifdef CHROMIUM_THREADSAFE VBoxTlsRefInit(ctx, crStateContextDtor); #endif ctx->flush_func = NULL; for (j=0;j<CR_MAX_BITARRAY;j++){ if (j == node32) { ctx->bitid[j] = (1 << node); } else { ctx->bitid[j] = 0; } ctx->neg_bitid[j] = ~(ctx->bitid[j]); } if (shareCtx) { CRASSERT(shareCtx->shared); ctx->shared = shareCtx->shared; ctx->shared->refCount ++; } else { ctx->shared = crStateAllocShared(); ctx->shared->id = ctx->id; } /* use Chromium's OpenGL defaults */ crStateLimitsInit( &(ctx->limits) ); crStateExtensionsInit( &(ctx->limits), &(ctx->extensions) ); crStateBufferObjectInit( ctx ); /* must precede client state init! */ crStateClientInit( &(ctx->client) ); crStateBufferInit( ctx ); crStateCurrentInit( ctx ); crStateEvaluatorInit( ctx ); crStateFogInit( ctx ); crStateHintInit( ctx ); crStateLightingInit( ctx ); crStateLineInit( ctx ); crStateListsInit( ctx ); crStateMultisampleInit( ctx ); crStateOcclusionInit( ctx ); crStatePixelInit( ctx ); crStatePolygonInit( ctx ); crStatePointInit( ctx ); crStateProgramInit( ctx ); crStateRegCombinerInit( ctx ); crStateStencilInit( ctx ); crStateTextureInit( ctx ); crStateTransformInit( ctx ); crStateViewportInit ( ctx ); crStateFramebufferObjectInit(ctx); crStateGLSLInit(ctx); /* This has to come last. */ crStateAttribInit( &(ctx->attrib) ); ctx->renderMode = GL_RENDER; /* Initialize values that depend on the visual mode */ if (visBits & CR_DOUBLE_BIT) { ctx->limits.doubleBuffer = GL_TRUE; } if (visBits & CR_RGB_BIT) { ctx->limits.redBits = 8; ctx->limits.greenBits = 8; ctx->limits.blueBits = 8; if (visBits & CR_ALPHA_BIT) { ctx->limits.alphaBits = 8; } } else { ctx->limits.indexBits = 8; } if (visBits & CR_DEPTH_BIT) { ctx->limits.depthBits = 24; } if (visBits & CR_STENCIL_BIT) { ctx->limits.stencilBits = 8; } if (visBits & CR_ACCUM_BIT) { ctx->limits.accumRedBits = 16; ctx->limits.accumGreenBits = 16; ctx->limits.accumBlueBits = 16; if (visBits & CR_ALPHA_BIT) { ctx->limits.accumAlphaBits = 16; } } if (visBits & CR_STEREO_BIT) { ctx->limits.stereo = GL_TRUE; } if (visBits & CR_MULTISAMPLE_BIT) { ctx->limits.sampleBuffers = 1; ctx->limits.samples = 4; ctx->multisample.enabled = GL_TRUE; } if (visBits & CR_OVERLAY_BIT) { ctx->limits.level = 1; } return ctx; }