server_misc.c revision 12204ff4d822f4d94cf0ced0a12f4e1b5fc664ad
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* Copyright (c) 2001, Stanford University
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * All rights reserved
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * See the file LICENSE.txt for information on redistributing this software.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSelectBuffer( GLsizei size, GLuint *buffer )
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crError( "Unsupported network glSelectBuffer call." );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetChromiumParametervCR(GLenum target, GLuint index, GLenum type, GLsizei count, GLvoid *values)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync crError("Bad type in crServerDispatchGetChromiumParametervCR");
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync cr_server.head_spu->dispatch_table.GetChromiumParametervCR( target, index, type, count, local_storage );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync static int gather_connect_count = 0;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /* message from tilesort SPU to set new tile bounds */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync GLint numTiles, muralWidth, muralHeight, server, tiles;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CRASSERT((count - 4) % 4 == 0); /* must be multiple of four */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync /*crServerNewMuralTiling(mural, muralWidth, muralHeight, numTiles, tileBounds);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync mural->viewportValidated = GL_FALSE;*/
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (cr_server.only_swap_once && cr_server.curClient != cr_server.clients[0])
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * We want the last connect to go through,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * otherwise we might deadlock in CheckWindowSize()
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * in the readback spu
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (cr_server.only_swap_once && (gather_connect_count != cr_server.numClients))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
crDebug("Frustum: left, right, bottom, top, near, far: %f, %f, %f, %f, %f, %f", left, right, bottom, top, znear, zfar);
switch (target) {
case GL_SHARED_PROGRAMS_CR:
case GL_SERVER_CURRENT_EYE_CR:
switch (target) {
case GL_SHARED_PROGRAMS_CR:
return (*pCounter)++;
#ifdef CR_DUMP_BLITS
static int blitnum=0;
static int copynum=0;
# ifdef DEBUG_misha
# undef CRASSERT /* iprt assert's int3 are inlined that is why are more convenient to use since they can be easily disabled individually */
crServerDispatchCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
static int siHavePBO = 0;
static int siHaveFBO = 0;
cr_server.head_spu->dispatch_table.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
#ifdef CR_DUMP_BLITS
void *img;
GLint w, h;
copynum++;
if (siHavePBO<0)
if (siHaveFBO<0)
GLint w, h, i;
for (i=0; i<-height; ++i)
gl->TexSubImage2D(target, level, xoffset, yoffset, width, -height, GL_RGBA, GL_UNSIGNED_BYTE, img2);
gl->BindFramebufferEXT(GL_FRAMEBUFFER_EXT, ctx->framebufferobject.drawFB ? ctx->framebufferobject.drawFB->hwid:0);
crDebug("MISMATCH! (%x, %i, ->%i,%i <-%i, %i [%ix%i])", target, level, xoffset, yoffset, x, y, width, height);
DebugBreak();
gl->TexSubImage2D(target, level, xoffset, dRow, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)((uintptr_t)sRow*width*4));
#ifdef CR_CHECK_BLITS
void crDbgDumpImage2D(const char* pszDesc, const void *pvData, uint32_t width, uint32_t height, uint32_t bpp, uint32_t pitch)
crDbgPrint("<?dml?><exec cmd=\"!vbvdbg.ms 0x%p 0n%d 0n%d 0n%d 0n%d\">%s</exec>, ( !vbvdbg.ms 0x%p 0n%d 0n%d 0n%d 0n%d )\n",
GLint w, h;
if (fBreak)
CRASSERT(0);
int rc;
return NULL;
int crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTURE pTex, GLboolean fDraw)
if (!pFBO)
return VERR_NOT_IMPLEMENTED;
switch (enmBuf)
case GL_BACK:
case GL_BACK_RIGHT:
case GL_BACK_LEFT:
case GL_FRONT:
case GL_FRONT_RIGHT:
case GL_FRONT_LEFT:
return VERR_NOT_IMPLEMENTED;
if (!hwid)
return VERR_INVALID_STATE;
return VINF_SUCCESS;
return VERR_INVALID_STATE;
return VERR_NOT_IMPLEMENTED;
if (!tobj)
return VERR_INVALID_STATE;
return VERR_NOT_IMPLEMENTED;
return VINF_SUCCESS;
int rc;
return VERR_NOT_IMPLEMENTED;
return VERR_INVALID_STATE;
if (!mural)
return VERR_INVALID_STATE;
return rc;
return rc;
if (!pBlitter)
return VERR_GENERAL_FAILURE;
CrBltBlitTexTex(pBlitter, pReadTex, &ReadRect, pDrawTex, &DrawRect, 1, CRBLT_FLAGS_FROM_FILTER(filter));
return rc;
bool fTryBlitter = false;
#ifdef CR_CHECK_BLITS
GLint rfb=0, dfb=0, dtex=0, dlev=-1, rtex=0, rlev=-1, rb=0, db=0, ppb=0, pub=0, vp[4], otex, dstw, dsth;
pbufId = 0;
ubufId = 0;
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_DEPTH, &depth);
gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &dtex);
gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &dlev);
gl->GetFramebufferAttachmentParameterivEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &rtex);
gl->GetFramebufferAttachmentParameterivEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &rlev);
if (dtex)
if (rtex)
#ifdef CR_DUMP_BLITS
void *img;
blitnum++;
crDebug("[%i]BlitFramebufferEXT(%i, %i, %i, %i, %i, %i, %i, %i, %x, %x)", blitnum, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &dtex);
gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &dlev);
crDebug("Src[rb 0x%x, fbo %i] Dst[db 0x%x, fbo %i(0x%x), tex %i.%i]", rb, rfb, db, dfb, status, dtex, dlev);
fTryBlitter = true;
if (fTryBlitter)
int rc = crServerVBoxBlitterBlitCurrentCtx(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
goto my_exit;
#ifdef CR_DUMP_BLITS
switch (mode)
case GL_BACK:
case GL_BACK_LEFT:
case GL_BACK_RIGHT:
case GL_FRONT:
case GL_FRONT_LEFT:
case GL_FRONT_RIGHT:
Assert(cr_server.curClient->currentMural->aidFBOs[cr_server.curClient->currentMural->iCurDrawBuffer]);
switch (mode)
case GL_BACK:
case GL_BACK_LEFT:
case GL_BACK_RIGHT:
case GL_FRONT:
case GL_FRONT_LEFT:
case GL_FRONT_RIGHT: