server_clear.c revision 2881ae582c193ac8e4dabe678ac5593c55ad7bd9
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync/* Copyright (c) 2001, Stanford University
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync * All rights reserved
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync * See the file LICENSE.txt for information on redistributing this software.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsynctypedef struct VBOXCRFPS
7af218a7441de38fc9e814919db04bae3e917664vboxsyncvoid vboxCrFpsInit(PVBOXCRFPS pFps, uint32_t cPeriods)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaPeriods = crCalloc(sizeof (pFps->mpaPeriods[0]) * cPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaBytes = crCalloc(sizeof (pFps->mpaBytes[0]) * cPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaBytesSent = crCalloc(sizeof (pFps->mpaBytesSent[0]) * cPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaCalls = crCalloc(sizeof (pFps->mpaCalls[0]) * cPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaOps = crCalloc(sizeof (pFps->mpaOps[0]) * cPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaTimes = crCalloc(sizeof (pFps->mpaTimes[0]) * cPeriods);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint64_t curBytes, curBytesSent, curCalls, curOps, curTimeUsed;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (cr_server.clients[i] && cr_server.clients[i]->conn)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync curBytes += cr_server.clients[i]->conn->total_bytes_recv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync curBytesSent += cr_server.clients[i]->conn->total_bytes_sent;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync curCalls += cr_server.clients[i]->conn->recv_count;
044af0d1e6474076366759db86f101778c5f20ccvboxsync curOps += cr_server.clients[i]->conn->opcodes_count;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mPeriodSum += curPeriod - pFps->mpaPeriods[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mBytesSum += curBytes - pFps->mpaBytes[pFps->miPeriod];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mBytesSentSum += curBytesSent - pFps->mpaBytesSent[pFps->miPeriod];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mCallsSum += curCalls - pFps->mpaCalls[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mOpsSum += curOps - pFps->mpaOps[pFps->miPeriod];
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync pFps->mTimeUsedSum += curTimeUsed - pFps->mpaTimes[pFps->miPeriod];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return ((double)1000000000.0) / vboxCrFpsGetEveragePeriod(pFps);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return vboxCrFpsGetFps(pFps) * pFps->mBytesSum / pFps->mcPeriods;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return vboxCrFpsGetFps(pFps) * pFps->mBytesSentSum / pFps->mcPeriods;
044af0d1e6474076366759db86f101778c5f20ccvboxsync return vboxCrFpsGetFps(pFps) * pFps->mCallsSum / pFps->mcPeriods;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return vboxCrFpsGetFps(pFps) * pFps->mOpsSum / pFps->mcPeriods;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchClear( GLenum mask )
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* NOTE: we only do the clear for the _last_ client in the list.
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync * This is because in multi-threaded apps the zeroeth client may
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync * be idle and never call glClear at all. See threadtest.c
044af0d1e6474076366759db86f101778c5f20ccvboxsync * It's pretty likely that the last client will be active.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync (cr_server.curClient != cr_server.clients[cr_server.numClients - 1]))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Begin(GL_POLYGON);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (b=0; b<p->npoints; b++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Vertex2dv(p->points+2*b);
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsynccrServerDispatchSwapBuffers( GLint window, GLint flags )
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync static bool bFpsInited = false;
044af0d1e6474076366759db86f101778c5f20ccvboxsync crDebug("fps: %f, rec Mbps: %.1f, send Mbps: %.1f, cps: %.1f, ops: %.0f, host %.1f%%",
044af0d1e6474076366759db86f101778c5f20ccvboxsync fps, bps/(1024.0*1024.0), bpsSent/(1024.0*1024.0), cps, ops, tup);
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync mural = (CRMuralInfo *) crHashtableSearch(cr_server.muralTable, window);
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* NOTE: we only do the clear for the _last_ client in the list.
044af0d1e6474076366759db86f101778c5f20ccvboxsync * This is because in multi-threaded apps the zeroeth client may
044af0d1e6474076366759db86f101778c5f20ccvboxsync * be idle and never call glClear at all. See threadtest.c
044af0d1e6474076366759db86f101778c5f20ccvboxsync * It's pretty likely that the last client will be active.
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (cr_server.curClient != cr_server.clients[cr_server.numClients - 1])
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * I've probably missed some state here, or it
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * might be easier just to push/pop it....
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
044af0d1e6474076366759db86f101778c5f20ccvboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync col.r = ctx->current.vertexAttrib[VERT_ATTRIB_COLOR0][0];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync col.g = ctx->current.vertexAttrib[VERT_ATTRIB_COLOR0][1];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync col.b = ctx->current.vertexAttrib[VERT_ATTRIB_COLOR0][2];
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync col.a = ctx->current.vertexAttrib[VERT_ATTRIB_COLOR0][3];
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync baseProj = &(cr_server.curClient->currentMural->extents[0].baseProjection);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.LoadMatrixf((GLfloat *) baseProj);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MultMatrixf(cr_server.unnormalized_alignment_matrix);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
9d020a0622f95aec3aabaff436a495e88dbbd71avboxsync /* fall through */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_PROJECTION);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.LoadMatrixf((GLfloat *) baseProj);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MultMatrixf(cr_server.unnormalized_alignment_matrix);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* fix state */
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Disable(GL_LIGHTING);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Disable(GL_FOG);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_1D);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_2D);
a1df400bbe9d64aad400442e56eb637019300a5evboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_3D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Disable(GL_CULL_FACE);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* Regular Blending */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Enable(GL_BLEND);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if ((blendSrc != GL_ZERO) && (blendDst != GL_SRC_ALPHA))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.BlendFunc(GL_ZERO, GL_SRC_ALPHA);
a1df400bbe9d64aad400442e56eb637019300a5evboxsync /* draw the blends */
a1df400bbe9d64aad400442e56eb637019300a5evboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0,
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0, 1);
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* hopefully this isnt concave... */
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Disable(GL_BLEND);
044af0d1e6474076366759db86f101778c5f20ccvboxsync if ((blendSrc != GL_ZERO) && (blendDst != GL_SRC_ALPHA))
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.BlendFunc(blendSrc, blendDst);
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Knockout Blending */
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0, 1);
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync cr_server.head_spu->dispatch_table.Disable(GL_BLEND);
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.Enable(GL_BLEND);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* return things to normal */
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_PROJECTION);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.Enable(GL_LIGHTING);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_1D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_2D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_3D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_CULL_FACE);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(col.r, col.g, col.b, col.a);
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Check if using a file network */
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (!cr_server.clients[0]->conn->actual_network && window == MAGIC_OFFSET)
044af0d1e6474076366759db86f101778c5f20ccvboxsync CRASSERT(cr_server.curClient && cr_server.curClient->currentMural == mural);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync cr_server.head_spu->dispatch_table.SwapBuffers( mural->spuWindow, flags );
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (cr_server.curClient && cr_server.curClient->currentMural)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync else if (crServerVBoxCompositionPresentNeeded(mural))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (cr_server.curClient && cr_server.curClient->currentMural)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync else if (crServerVBoxCompositionPresentNeeded(mural))