server_misc.c revision 32b624becaf56a356992d660b1618bd9be0c5b09
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSelectBuffer( GLsizei size, GLuint *buffer )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Unsupported network glSelectBuffer call." );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetChromiumParametervCR(GLenum target, GLuint index, GLenum type, GLsizei count, GLvoid *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("Bad type in crServerDispatchGetChromiumParametervCR");
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync GLuint *puRc = (GLuint *)(bytes >=4 ? local_storage : NULL);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync cr_server.head_spu->dispatch_table.GetChromiumParametervCR( target, index, type, count, local_storage );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync static int gather_connect_count = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* message from tilesort SPU to set new tile bounds */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numTiles, muralWidth, muralHeight, server, tiles;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT((count - 4) % 4 == 0); /* must be multiple of four */
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync /*crServerNewMuralTiling(mural, muralWidth, muralHeight, numTiles, tileBounds);
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync mural->viewportValidated = GL_FALSE;*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (cr_server.only_swap_once && cr_server.curClient != cr_server.clients[0])
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We want the last connect to go through,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * otherwise we might deadlock in CheckWindowSize()
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * in the readback spu
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (cr_server.only_swap_once && (gather_connect_count != cr_server.numClients))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set this server's view matrix which will get premultiplied onto the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * modelview matrix. For non-planar tilesort and stereo.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* values[0] is the server index. Ignored here but used in tilesort SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* values[1] is the left/right eye index (0 or 1) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMatrixInitFromFloats(&cr_server.viewMatrix[eye], v + 2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set this server's projection matrix which will get replace the user's
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * projection matrix. For non-planar tilesort and stereo.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* values[0] is the server index. Ignored here but used in tilesort SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* values[1] is the left/right eye index (0 or 1) */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMatrixInitFromFloats(&cr_server.projectionMatrix[eye], v + 2);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("Frustum: left, right, bottom, top, near, far: %f, %f, %f, %f, %f, %f", left, right, bottom, top, znear, zfar);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Todo: Add debug output for orthographic projection*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParameteriCR(GLenum target, GLint value)
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync crWarning("Recieved GL_HH_SET_DEFAULT_SHARED_CTX from guest, ignoring");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParameteriCR( target, value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParameterfCR(GLenum target, GLfloat value)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParameterfCR( target, value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (*pCounter)++;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync/*#define CR_DUMP_BLITS*/
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncstatic int blitnum=0;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncstatic int copynum=0;
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync//# define CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# undef CRASSERT /* iprt assert's int3 are inlined that is why are more convenient to use since they can be easily disabled individually */
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsynccrServerDispatchCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync /*@todo pbo/fbo disabled for now as it's slower, check on other gpus*/
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync static int siHavePBO = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync static int siHaveFBO = 0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync cr_server.head_spu->dispatch_table.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync sprintf(fname, "copy_blit%i_copy_%i.tga", blitnum, copynum);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync else /* negative height, means we have to Yinvert the source pixels while copying */
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync const char *ext = (const char*)gl->GetString(GL_EXTENSIONS);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync siHavePBO = crStrstr(ext, "GL_ARB_pixel_buffer_object") ? 1:0;
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync const char *ext = (const char*)gl->GetString(GL_EXTENSIONS);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync siHaveFBO = crStrstr(ext, "GL_EXT_framebuffer_object") ? 1:0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=y-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexSubImage2D(target, level, xoffset, dRow, x, sRow, width, 1);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync w = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->level[0][level].width;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync h = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->level[0][level].height;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, -height);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->GetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, img1);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync for (i=0; i<-height; ++i)
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->TexSubImage2D(target, level, xoffset, yoffset, width, -height, GL_RGBA, GL_UNSIGNED_BYTE, img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync else if (siHaveFBO==1) /*@todo more states to set and restore here*/
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexImage2D(target, level, GL_RGBA, x, y, width, -height, 0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target,
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid, level);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync status = gl->CheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, 0, level);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindFramebufferEXT(GL_FRAMEBUFFER_EXT, ctx->framebufferobject.drawFB ? ctx->framebufferobject.drawFB->hwid:0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindTexture(target, ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync w = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->level[0][level].width;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync h = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->level[0][level].height;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GetTexImage(target, level, GL_BGRA, GL_UNSIGNED_BYTE, img1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=y-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexSubImage2D(target, level, xoffset, dRow, x, sRow, width, 1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GetTexImage(target, level, GL_BGRA, GL_UNSIGNED_BYTE, img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crDebug("MISMATCH! (%x, %i, ->%i,%i <-%i, %i [%ix%i])", target, level, xoffset, yoffset, x, y, width, height);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, -width*height*4, 0, GL_STATIC_COPY_ARB);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->ReadPixels(x, y, width, -height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, ctx->bufferobject.packBuffer->hwid);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboId);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexSubImage2D(target, level, xoffset, dRow, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)((uintptr_t)sRow*width*4));
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#else /*few times slower again*/
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=0, sRow=y-height-1; dRow<-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->ReadPixels(x, sRow, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)((uintptr_t)dRow*width*4));
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, ctx->bufferobject.packBuffer->hwid);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboId);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexSubImage2D(target, level, xoffset, yoffset, width, -height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, ctx->bufferobject.unpackBuffer->hwid);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgGetTexImage2D(GLint texTarget, GLint texName, GLvoid **ppvImage, GLint *pw, GLint *ph)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_READ_FRAMEBUFFER_BINDING_EXT, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_BINDING_EXT, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexLevelParameteriv(texTarget, 0, GL_TEXTURE_WIDTH, &dstw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexLevelParameteriv(texTarget, 0, GL_TEXTURE_HEIGHT, &dsth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexImage(texTarget, 0, GL_BGRA, GL_UNSIGNED_BYTE, pvImage);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_READ_FRAMEBUFFER_BINDING_EXT, rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_BINDING_EXT, dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncDECLEXPORT(void) crDbgPrint(const char *format, ... )
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgDumpImage2D(const char* pszDesc, const void *pvData, uint32_t width, uint32_t height, uint32_t bpp, uint32_t pitch)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync 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",
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgDumpTexImage2D(const char* pszDesc, GLint texTarget, GLint texName, GLboolean fBreak)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDbgGetTexImage2D(texTarget, texName, &pvImage, &w, &h);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDbgPrint("%s target(%d), name(%d), width(%d), height(%d)", pszDesc, texTarget, texName, w, h);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDbgDumpImage2D("texture data", pvImage, w, h, 32, (32 * w)/8);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync Ctx.Base.id = cr_server.MainContextInfo.SpuContext;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync Ctx.Base.visualBits = cr_server.MainContextInfo.CreateInfo.visualBits;
d7bd3e8bc4c337f385a92e0e5528525abba906c2vboxsync rc = CrBltInit(&cr_server.Blitter, &Ctx, true, true, NULL, &cr_server.head_spu->dispatch_table);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncint crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTURE pTex, GLboolean fDraw)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRFramebufferObjectState *pBuf = &ctx->framebufferobject;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRFramebufferObject *pFBO = fDraw ? pBuf->drawFB : pBuf->readFB;
7908c1b917ec64d28d80a506f7a1bc524cd2f212vboxsync if (!(mural->fPresentMode & CR_SERVER_REDIR_F_FBO))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync enmBuf = fDraw ? ctx->buffer.drawBuffer : ctx->buffer.readBuffer;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync hwid = mural->aidColorTexs[CR_SERVER_FBO_BB_IDX(mural)];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync hwid = mural->aidColorTexs[CR_SERVER_FBO_FB_IDX(mural)];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync enmBuf = fDraw ? pFBO->drawbuffer[0] : pFBO->readbuffer;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync tobj = (CRTextureObj*)crHashtableSearch(ctx->shared->textureTable, pAp->name);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("no texture object found for name %d", pAp->name);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (tobj->target != GL_TEXTURE_2D && tobj->target != GL_TEXTURE_RECTANGLE_NV)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncint crServerVBoxBlitterBlitCurrentCtx(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync rc = crServerVBoxBlitterTexInit(ctx, mural, &DrawTex, GL_TRUE);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("crServerVBoxBlitterTexInit failed for draw");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync rc = crServerVBoxBlitterTexInit(ctx, mural, &ReadTex, GL_FALSE);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync// crWarning("crServerVBoxBlitterTexInit failed for read");
f0b06b8e4de2a0d9ddb10ac0a30d68fafd73d8c1vboxsync crServerVBoxBlitterCtxInit(&Ctx, cr_server.curClient->currentCtxInfo);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync idDrawFBO = CR_SERVER_FBO_FOR_IDX(mural, mural->iCurDrawBuffer);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync idReadFBO = CR_SERVER_FBO_FOR_IDX(mural, mural->iCurReadBuffer);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crStateSwitchPrepare(NULL, ctx, idDrawFBO, idReadFBO);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CrBltBlitTexTex(pBlitter, pReadTex, &ReadRect, pDrawTex, &DrawRect, 1, CRBLT_FLAGS_FROM_FILTER(filter));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crStateSwitchPostprocess(ctx, NULL, idDrawFBO, idReadFBO);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsynccrServerDispatchBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync bool fTryBlitter = false;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync 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;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint id, tuId, pbufId, pbufIdHw, ubufId, ubufIdHw, width, height, depth;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Current TU: %i", ctx->texture.curTextureUnit);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync tobj = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Texture %i(hw %i), w=%i, h=%i", tobj->id, tobj->hwid, tl->width, tl->height, tl->depth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_ACTIVE_TEXTURE, &tuId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(tuId - GL_TEXTURE0_ARB == ctx->texture.curTextureUnit);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_TEXTURE_BINDING_2D, &id);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_DEPTH, &depth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Texture: %i, w=%i, h=%i, d=%i", id, width, height, depth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &pbufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &ubufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &dtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &dlev);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync dStatus = gl->CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &rtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &rlev);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync rStatus = gl->CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER_EXT);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->hwid == dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->drawbuffer[0] == db);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->color[0].type == GL_TEXTURE);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->color[0].level == 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync sdtex = ctx->framebufferobject.drawFB->color[0].name;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.readFB->hwid == rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.readFB->color[0].type == GL_TEXTURE);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.readFB->color[0].level == 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync srtex = ctx->framebufferobject.readFB->color[0].name;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("==> src tex:", GL_TEXTURE_2D, rtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("==> dst tex:", GL_TEXTURE_2D, dtex, true);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync GLint rfb=0, dfb=0, dtex=0, dlev=-1, rb=0, db=0, ppb=0, pub=0, vp[4], otex, dstw, dsth;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDebug("[%i]BlitFramebufferEXT(%i, %i, %i, %i, %i, %i, %i, %i, %x, %x)", blitnum, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDebug("%i, %i <-> %i, %i", srcX1-srcX0, srcY1-srcY0, dstX1-dstX0, dstY1-dstY0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT, &dtex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT, &dlev);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync status = gl->CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync 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);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDebug("Viewport [%i, %i, %i, %i]", vp[0], vp[1], vp[2], vp[3]);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, dlev, GL_TEXTURE_WIDTH, &dstw);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, dlev, GL_TEXTURE_HEIGHT, &dsth);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->ReadPixels(0, 0, vp[2], vp[3], GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, dlev, GL_BGRA, GL_UNSIGNED_BYTE, img);
819fb2627ce7d9246fcd2bfcf9d336b2175cab57vboxsync /* work around Intel driver bug on Linux host */
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync /* use srcY1 < srcY2 && dstY1 < dstY2 whenever possible to avoid GPU driver bugs */
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync /* use srcX1 < srcX2 && dstX1 < dstX2 whenever possible to avoid GPU driver bugs */
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int rc = crServerVBoxBlitterBlitCurrentCtx(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync cr_server.head_spu->dispatch_table.Disable(GL_SCISSOR_TEST);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync cr_server.head_spu->dispatch_table.BlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1,
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync cr_server.head_spu->dispatch_table.Enable(GL_SCISSOR_TEST);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync//#ifdef CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("<== src tex:", GL_TEXTURE_2D, rtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("<== dst tex:", GL_TEXTURE_2D, dtex, true);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, dlev, GL_BGRA, GL_UNSIGNED_BYTE, img);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchDrawBuffer( GLenum mode )
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync if (!crStateGetCurrent()->framebufferobject.drawFB)
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync if (mode == GL_FRONT || mode == GL_FRONT_LEFT || mode == GL_FRONT_RIGHT)
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_LEFT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_RIGHT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_FRONT_AND_BACK not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: unexpected mode! 0x%x", mode);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, CR_SERVER_FBO_FOR_IDX(mural, iBufferNeeded));
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.DrawBuffer( mode );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchReadBuffer( GLenum mode )
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_LEFT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_RIGHT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_FRONT_AND_BACK not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: unexpected mode! 0x%x", mode);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync Assert(CR_SERVER_FBO_FOR_IDX(mural, mural->iCurReadBuffer));
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_READ_FRAMEBUFFER, CR_SERVER_FBO_FOR_IDX(mural, iBufferNeeded));
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.ReadBuffer( mode );
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsyncGLenum SERVER_DISPATCH_APIENTRY crServerDispatchGetError( void )
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync err = cr_server.head_spu->dispatch_table.GetError();
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* our impl has a single error flag, so we just loop here to reset all error flags to no_error */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync err = cr_server.head_spu->dispatch_table.GetError();
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsynccrServerMakeTmpCtxCurrent( GLint window, GLint nativeWindow, GLint context )
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync GLint curSrvSpuCtx = cr_server.currentCtxInfo && cr_server.currentCtxInfo->SpuContext > 0 ? cr_server.currentCtxInfo->SpuContext : cr_server.MainContextInfo.SpuContext;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRMuralInfo *pCurrentMural = cr_server.currentMural;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync pCurCtx = pCurCtxInfo ? pCurCtxInfo->pContext : NULL;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idDrawFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurDrawBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idReadFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurReadBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync /* this is a GUI thread, so no need to do anything here */
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crStateSwitchPrepare(NULL, pCurCtx, idDrawFBO, idReadFBO);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.head_spu->dispatch_table.MakeCurrent( window, nativeWindow, context);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crStateSwitchPostprocess(pCurCtx, NULL, idDrawFBO, idReadFBO);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crSPUCopyDispatchTable(&cr_server.TmpCtxDispatch, &cr_server.head_spu->dispatch_table);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.TmpCtxDispatch.MakeCurrent = crServerMakeTmpCtxCurrent;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync/* dump stuff */
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync/* first four bits are buffer dump config
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * second four bits are texture dump config
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * config flags:
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 1 - blit on enter
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 2 - blit on exit
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 0x03 - dump buffer on enter and exit
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 0x22 - dump texture and buffer on exit */
ced0bcd0001bdedafca513cd3b73ffe2c9c74386vboxsyncunsigned long g_CrDbgDumpEnabled = 0;
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncunsigned long g_CrDbgDumpDraw = CR_SERVER_DUMP_F_COMPILE_SHADER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync ; //CR_SERVER_DUMP_F_DRAW_BUFF_ENTER | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesSettings = CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesAppliedSettings = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesSavedInitSettings = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesCount = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!CrBltIsInitialized(&cr_server.RecorderBlitter))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (CrBltIsInitialized(&cr_server.RecorderBlitter))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync pBlitterMural = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.visualBits);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterWinInit(&BltWin, pBlitterMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterCtxInit(&BltCtx, &cr_server.MainContextInfo);
d7bd3e8bc4c337f385a92e0e5528525abba906c2vboxsync rc = CrBltInit(&cr_server.RecorderBlitter, &BltCtx, true, true, NULL, &cr_server.TmpCtxDispatch);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync rc = CrBltMuralSetCurrent(&cr_server.RecorderBlitter, &BltWin);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("CrBltMuralSetCurrent failed rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.pDumper = &cr_server.DbgPrintDumper.Base;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crDmpHtmlInit(&cr_server.HtmlDumper, "S:\\projects\\virtualbox\\3d\\dumps\\1", "index.html");
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecInit(&cr_server.Recorder, &cr_server.RecorderBlitter, &cr_server.TmpCtxDispatch, cr_server.pDumper);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Dump(1)==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(1)");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(2)");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecRecompileCurrentProgram(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Uniforms==");
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync crRecDumpCurrentProgramUniforms(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Done Uniforms==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Attribs==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecDumpCurrentProgramAttribs(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Done Attribs==");
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrV(&cr_server.Recorder, ctx, pszFormat, pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncvoid crServerDumpDrawelv(GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrv(&cr_server.Recorder, ctx, idx, pszElFormat, cbEl, pvVal, cVal);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync idx = idx >= 0 ? idx : crServerMuralFBOIdxFromBufferName(cr_server.currentMural, pCtxInfo->pContext->buffer.drawBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idFBO = CR_SERVER_FBO_FOR_IDX(cr_server.currentMural, idx);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idTex = CR_SERVER_FBO_TEX_FOR_IDX(cr_server.currentMural, idx);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RedirTex.height = cr_server.currentMural->fboHeight;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecDumpBuffer(&cr_server.Recorder, ctx, &BltCtx, &BltWin, idFBO, idTex ? &RedirTex : NULL);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsyncvoid crServerDumpTexture(const VBOXVR_TEXTURE *pTex)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crRecDumpTextureF(&cr_server.Recorder, pTex, &BltCtx, &BltWin, "Tex (%d x %d), hwid (%d) target %#x", pTex->width, pTex->height, pTex->hwid, pTex->target);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecDumpTextures(&cr_server.Recorder, ctx, &BltCtx, &BltWin);
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncbool crServerDumpFilterOp(unsigned long event, CR_DUMPER *pDumper)
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncbool crServerDumpFilterDmp(unsigned long event, CR_DUMPER *pDumper)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crWarning("g_CrDbgDumpDrawFramesSettings is NULL, bump will not be started");
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesSavedInitSettings = g_CrDbgDumpDraw;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesAppliedSettings = g_CrDbgDumpDrawFramesSettings;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crDmpStrF(cr_server.Recorder.pDumper, "***Starting draw dump for %d frames, settings(0x%x)", g_CrDbgDumpDrawFramesCount, g_CrDbgDumpDraw);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crDmpStrF(cr_server.Recorder.pDumper, "***Stop draw dump");