server_clear.c revision 2881ae582c193ac8e4dabe678ac5593c55ad7bd9
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync/* Copyright (c) 2001, Stanford University
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync * All rights reserved
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync *
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync * See the file LICENSE.txt for information on redistributing this software.
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync */
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "cr_spu.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "chromium.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "cr_mem.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "cr_net.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "server_dispatch.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include "server.h"
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#ifdef VBOXCR_LOGFPS
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include <iprt/timer.h>
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync#include <iprt/ctype.h>
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsynctypedef struct VBOXCRFPS
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync{
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t mPeriodSum;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t *mpaPeriods;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t mPrevTime;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t mcFrames;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint32_t mcPeriods;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint32_t miPeriod;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t mBytesSum;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint32_t *mpaBytes;
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync
4346537134a6c1454fc906711dbe4e987ebe9f33vboxsync uint64_t mBytesSentSum;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint32_t *mpaBytesSent;
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint64_t mCallsSum;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint32_t *mpaCalls;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint64_t mOpsSum;
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync uint32_t *mpaOps;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint64_t mTimeUsedSum;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync uint64_t *mpaTimes;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync} VBOXCRFPS, *PVBOXCRFPS;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
7af218a7441de38fc9e814919db04bae3e917664vboxsyncvoid vboxCrFpsInit(PVBOXCRFPS pFps, uint32_t cPeriods)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync crMemset(pFps, 0, sizeof (*pFps));
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync pFps->mcPeriods = 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);
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncvoid vboxCrFpsTerm(PVBOXCRFPS pFps)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync crFree(pFps->mpaPeriods);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync crFree(pFps->mpaBytes);
044af0d1e6474076366759db86f101778c5f20ccvboxsync crFree(pFps->mpaCalls);
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncvoid vboxCrFpsReportFrame(PVBOXCRFPS pFps)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint64_t cur = RTTimeNanoTS();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint64_t curBytes, curBytesSent, curCalls, curOps, curTimeUsed;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync int i;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync curBytes = 0;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync curBytesSent = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync curCalls = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync curOps = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync curTimeUsed = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (i = 0; i < cr_server.numClients; i++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (cr_server.clients[i] && cr_server.clients[i]->conn)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
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;
044af0d1e6474076366759db86f101778c5f20ccvboxsync curTimeUsed += cr_server.clients[i]->timeUsed;
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.clients[i]->conn->total_bytes_recv = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.clients[i]->conn->total_bytes_sent = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.clients[i]->conn->recv_count = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.clients[i]->conn->opcodes_count = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.clients[i]->timeUsed = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if(pFps->mPrevTime)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint64_t curPeriod = cur - pFps->mPrevTime;
044af0d1e6474076366759db86f101778c5f20ccvboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mPeriodSum += curPeriod - pFps->mpaPeriods[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaPeriods[pFps->miPeriod] = curPeriod;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mBytesSum += curBytes - pFps->mpaBytes[pFps->miPeriod];
044af0d1e6474076366759db86f101778c5f20ccvboxsync pFps->mpaBytes[pFps->miPeriod] = curBytes;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mBytesSentSum += curBytesSent - pFps->mpaBytesSent[pFps->miPeriod];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mpaBytesSent[pFps->miPeriod] = curBytesSent;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mCallsSum += curCalls - pFps->mpaCalls[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaCalls[pFps->miPeriod] = curCalls;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mOpsSum += curOps - pFps->mpaOps[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaOps[pFps->miPeriod] = curOps;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync pFps->mTimeUsedSum += curTimeUsed - pFps->mpaTimes[pFps->miPeriod];
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->mpaTimes[pFps->miPeriod] = curTimeUsed;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ++pFps->miPeriod;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pFps->miPeriod %= pFps->mcPeriods;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pFps->mPrevTime = cur;
044af0d1e6474076366759db86f101778c5f20ccvboxsync ++pFps->mcFrames;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncuint64_t vboxCrFpsGetEveragePeriod(PVBOXCRFPS pFps)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
044af0d1e6474076366759db86f101778c5f20ccvboxsync return pFps->mPeriodSum / pFps->mcPeriods;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncdouble vboxCrFpsGetFps(PVBOXCRFPS pFps)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return ((double)1000000000.0) / vboxCrFpsGetEveragePeriod(pFps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsyncdouble vboxCrFpsGetBps(PVBOXCRFPS pFps)
044af0d1e6474076366759db86f101778c5f20ccvboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return vboxCrFpsGetFps(pFps) * pFps->mBytesSum / pFps->mcPeriods;
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncdouble vboxCrFpsGetBpsSent(PVBOXCRFPS pFps)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return vboxCrFpsGetFps(pFps) * pFps->mBytesSentSum / pFps->mcPeriods;
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsyncdouble vboxCrFpsGetCps(PVBOXCRFPS pFps)
044af0d1e6474076366759db86f101778c5f20ccvboxsync{
044af0d1e6474076366759db86f101778c5f20ccvboxsync return vboxCrFpsGetFps(pFps) * pFps->mCallsSum / pFps->mcPeriods;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsyncdouble vboxCrFpsGetOps(PVBOXCRFPS pFps)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return vboxCrFpsGetFps(pFps) * pFps->mOpsSum / pFps->mcPeriods;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync}
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncdouble vboxCrFpsGetTimeProcPercent(PVBOXCRFPS pFps)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return 100.0*pFps->mTimeUsedSum/pFps->mPeriodSum;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncuint64_t vboxCrFpsGetNumFrames(PVBOXCRFPS pFps)
044af0d1e6474076366759db86f101778c5f20ccvboxsync{
044af0d1e6474076366759db86f101778c5f20ccvboxsync return pFps->mcFrames;
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync#endif
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchClear( GLenum mask )
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync const RunQueue *q = cr_server.run_queue;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync if (cr_server.only_swap_once)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync {
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 */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if ((mask & GL_COLOR_BUFFER_BIT) &&
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync (cr_server.curClient != cr_server.clients[cr_server.numClients - 1]))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Clear( mask );
9d020a0622f95aec3aabaff436a495e88dbbd71avboxsync}
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic void __draw_poly(CRPoly *p)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync int b;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
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);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.End();
044af0d1e6474076366759db86f101778c5f20ccvboxsync}
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsyncvoid SERVER_DISPATCH_APIENTRY
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsynccrServerDispatchSwapBuffers( GLint window, GLint flags )
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync{
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync CRMuralInfo *mural;
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync CRContext *ctx;
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync#ifdef VBOXCR_LOGFPS
044af0d1e6474076366759db86f101778c5f20ccvboxsync static VBOXCRFPS Fps;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync static bool bFpsInited = false;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!bFpsInited)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync vboxCrFpsInit(&Fps, 64 /* cPeriods */);
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync bFpsInited = true;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync vboxCrFpsReportFrame(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync if(!(vboxCrFpsGetNumFrames(&Fps) % 31))
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync double fps = vboxCrFpsGetFps(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync double bps = vboxCrFpsGetBps(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync double bpsSent = vboxCrFpsGetBpsSent(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync double cps = vboxCrFpsGetCps(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync double ops = vboxCrFpsGetOps(&Fps);
044af0d1e6474076366759db86f101778c5f20ccvboxsync double tup = vboxCrFpsGetTimeProcPercent(&Fps);
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);
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync#endif
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync mural = (CRMuralInfo *) crHashtableSearch(cr_server.muralTable, window);
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync if (!mural) {
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync return;
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync }
df8e6a449f00e1884fbf4a1fc67143614d7d528dvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (cr_server.only_swap_once)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
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 */
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (cr_server.curClient != cr_server.clients[cr_server.numClients - 1])
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync return;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync#if 0
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (cr_server.overlapBlending)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync int a;
044af0d1e6474076366759db86f101778c5f20ccvboxsync CRPoly *p;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync GLboolean lighting, fog, blend, cull, tex[3];
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync GLenum mm, blendSrc, blendDst;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync GLcolorf col;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync CRContext *ctx = crStateGetCurrent();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync const CRmatrix *baseProj;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * I've probably missed some state here, or it
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * might be easier just to push/pop it....
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync lighting = ctx->lighting.lighting;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync fog = ctx->fog.enable;
044af0d1e6474076366759db86f101778c5f20ccvboxsync tex[0] = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (!ctx->texture.unit[a].enabled1D) continue;
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync tex[0] = 1;
044af0d1e6474076366759db86f101778c5f20ccvboxsync break;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync tex[1] = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!ctx->texture.unit[a].enabled2D) continue;
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync tex[1] = 1;
044af0d1e6474076366759db86f101778c5f20ccvboxsync break;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync tex[2] = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync for (a=0; a<CR_MAX_TEXTURE_UNITS; a++)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (!ctx->texture.unit[a].enabled3D) continue;
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync tex[2] = 1;
044af0d1e6474076366759db86f101778c5f20ccvboxsync break;
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cull = ctx->polygon.cullFace;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync blend = ctx->buffer.blend;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync blendSrc = ctx->buffer.blendSrcRGB;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync blendDst = ctx->buffer.blendDstRGB;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mm = ctx->transform.matrixMode;
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
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync baseProj = &(cr_server.curClient->currentMural->extents[0].baseProjection);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync switch(mm)
a1df400bbe9d64aad400442e56eb637019300a5evboxsync {
de6e321f351aa489a6a62bed474390a0056e8093vboxsync case GL_PROJECTION:
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.PushMatrix();
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.PushMatrix();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.LoadIdentity();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync break;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync default:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
9d020a0622f95aec3aabaff436a495e88dbbd71avboxsync /* fall through */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync case GL_MODELVIEW:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.PushMatrix();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.LoadIdentity();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_PROJECTION);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.PushMatrix();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.LoadMatrixf((GLfloat *) baseProj);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MultMatrixf(cr_server.unnormalized_alignment_matrix);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync break;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* fix state */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (lighting)
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Disable(GL_LIGHTING);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (fog)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.Disable(GL_FOG);
a1df400bbe9d64aad400442e56eb637019300a5evboxsync if (tex[0])
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_1D);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync if (tex[1])
de6e321f351aa489a6a62bed474390a0056e8093vboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_2D);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync if (tex[2])
a1df400bbe9d64aad400442e56eb637019300a5evboxsync cr_server.head_spu->dispatch_table.Disable(GL_TEXTURE_3D);
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync if (cull)
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Disable(GL_CULL_FACE);
a1df400bbe9d64aad400442e56eb637019300a5evboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* Regular Blending */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (cr_server.overlapBlending == 1)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!blend)
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);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
a1df400bbe9d64aad400442e56eb637019300a5evboxsync /* draw the blends */
044af0d1e6474076366759db86f101778c5f20ccvboxsync for (a=1; a<cr_server.num_overlap_levels; a++)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (a-1 < cr_server.num_overlap_intens)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
a1df400bbe9d64aad400442e56eb637019300a5evboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0,
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.overlap_intens[a-1]);
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync else
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0, 1);
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync p = cr_server.overlap_geom[a];
044af0d1e6474076366759db86f101778c5f20ccvboxsync while (p)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* hopefully this isnt concave... */
044af0d1e6474076366759db86f101778c5f20ccvboxsync __draw_poly(p);
044af0d1e6474076366759db86f101778c5f20ccvboxsync p = p->next;
a1df400bbe9d64aad400442e56eb637019300a5evboxsync }
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync }
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync if (!blend)
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 }
044af0d1e6474076366759db86f101778c5f20ccvboxsync else
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Knockout Blending */
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(0, 0, 0, 1);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (blend)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync cr_server.head_spu->dispatch_table.Disable(GL_BLEND);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync p = cr_server.overlap_knockout;
044af0d1e6474076366759db86f101778c5f20ccvboxsync while (p)
044af0d1e6474076366759db86f101778c5f20ccvboxsync {
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync __draw_poly(p);
044af0d1e6474076366759db86f101778c5f20ccvboxsync p = p->next;
7af218a7441de38fc9e814919db04bae3e917664vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (blend)
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.Enable(GL_BLEND);
7af218a7441de38fc9e814919db04bae3e917664vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
7af218a7441de38fc9e814919db04bae3e917664vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* return things to normal */
7af218a7441de38fc9e814919db04bae3e917664vboxsync switch (mm)
7af218a7441de38fc9e814919db04bae3e917664vboxsync {
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsync case GL_PROJECTION:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.PopMatrix();
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_PROJECTION);
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.PopMatrix();
7af218a7441de38fc9e814919db04bae3e917664vboxsync break;
7af218a7441de38fc9e814919db04bae3e917664vboxsync case GL_MODELVIEW:
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.PopMatrix();
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.PopMatrix();
7af218a7441de38fc9e814919db04bae3e917664vboxsync break;
7af218a7441de38fc9e814919db04bae3e917664vboxsync default:
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.PopMatrix();
72a6fe3989272cb2d409b50caca25e1edbca9398vboxsync cr_server.head_spu->dispatch_table.MatrixMode(GL_MODELVIEW);
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.PopMatrix();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync cr_server.head_spu->dispatch_table.MatrixMode(mm);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync break;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (lighting)
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.Enable(GL_LIGHTING);
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (fog)
7af218a7441de38fc9e814919db04bae3e917664vboxsync cr_server.head_spu->dispatch_table.Enable(GL_FOG);
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (tex[0])
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_1D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (tex[1])
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_2D);
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (tex[2])
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_TEXTURE_3D);
77b92045ecae7978726dd23cb3d5de4676aec1c9vboxsync if (cull)
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Enable(GL_CULL_FACE);
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync cr_server.head_spu->dispatch_table.Color4f(col.r, col.g, col.b, col.a);
044af0d1e6474076366759db86f101778c5f20ccvboxsync }
044af0d1e6474076366759db86f101778c5f20ccvboxsync#endif
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Check if using a file network */
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (!cr_server.clients[0]->conn->actual_network && window == MAGIC_OFFSET)
044af0d1e6474076366759db86f101778c5f20ccvboxsync window = 0;
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync ctx = crStateGetCurrent();
044af0d1e6474076366759db86f101778c5f20ccvboxsync
044af0d1e6474076366759db86f101778c5f20ccvboxsync CRASSERT(cr_server.curClient && cr_server.curClient->currentMural == mural);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (ctx->framebufferobject.drawFB
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync mural->bFbDraw = GL_FALSE;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync CR_SERVER_DUMP_SWAPBUFFERS_ENTER();
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (crServerIsRedirectedToFBO())
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync crServerMuralFBOSwapBuffers(mural);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync crServerPresentFBO(mural);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync {
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync cr_server.head_spu->dispatch_table.SwapBuffers( mural->spuWindow, flags );
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (crServerVBoxCompositionPresentNeeded(mural))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync mural->fDataPresented = GL_TRUE;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync }
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CR_SERVER_DUMP_SWAPBUFFERS_LEAVE();
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync}
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsyncvoid SERVER_DISPATCH_APIENTRY
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsynccrServerDispatchFlush(void)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync{
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRContext *ctx = crStateGetCurrent();
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync cr_server.head_spu->dispatch_table.Flush();
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (cr_server.curClient && cr_server.curClient->currentMural)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync {
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (mural->bFbDraw)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync {
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (crServerIsRedirectedToFBO())
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync crServerPresentFBO(mural);
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync else if (crServerVBoxCompositionPresentNeeded(mural))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync mural->fDataPresented = GL_TRUE;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync }
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (ctx->framebufferobject.drawFB
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync mural->bFbDraw = GL_FALSE;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync }
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync}
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsyncvoid SERVER_DISPATCH_APIENTRY
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsynccrServerDispatchFinish(void)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync{
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRContext *ctx = crStateGetCurrent();
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync cr_server.head_spu->dispatch_table.Finish();
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (cr_server.curClient && cr_server.curClient->currentMural)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync {
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (mural->bFbDraw)
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync {
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (crServerIsRedirectedToFBO())
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync crServerPresentFBO(mural);
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync else if (crServerVBoxCompositionPresentNeeded(mural))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync mural->fDataPresented = GL_TRUE;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync }
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync if (ctx->framebufferobject.drawFB
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync || (ctx->buffer.drawBuffer != GL_FRONT && ctx->buffer.drawBuffer != GL_FRONT_LEFT))
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync mural->bFbDraw = GL_FALSE;
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync }
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync}
2bb12e589d2c280ad042e4e70635ae7224c7eceevboxsync