void PACKSPU_APIENTRY packspu_ChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values) { CRMessage msg; int len; GET_THREAD(thread); switch(target) { case GL_GATHER_PACK_CR: /* flush the current pack buffer */ packspuFlush( (void *) thread ); /* the connection is thread->server.conn */ msg.header.type = CR_MESSAGE_GATHER; msg.gather.offset = 69; len = sizeof(CRMessageGather); crNetSend(thread->netServer.conn, NULL, &msg, len); break; default: if (pack_spu.swap) crPackChromiumParametervCRSWAP(target, type, count, values); else crPackChromiumParametervCR(target, type, count, values); } }
/** * Send the current tilesort tile info to all the servers. */ void tilesortspuSendTileInfoToServers( WindowInfo *winInfo ) { GET_THREAD(thread); int i; /* release geometry buffer */ crPackReleaseBuffer( thread->packer ); /* loop over servers */ for (i = 0; i < tilesort_spu.num_servers; i++) { ServerWindowInfo *servWinInfo = winInfo->server + i; int tileInfo[4 + 4 * CR_MAX_EXTENTS], arraySize; int j; /* build tileInfo array */ tileInfo[0] = i; tileInfo[1] = winInfo->muralWidth; tileInfo[2] = winInfo->muralHeight; tileInfo[3] = servWinInfo->num_extents; for (j = 0; j < servWinInfo->num_extents; j++) { int w = servWinInfo->extents[j].x2 - servWinInfo->extents[j].x1; int h = servWinInfo->extents[j].y2 - servWinInfo->extents[j].y1; tileInfo[4 + j * 4 + 0] = servWinInfo->extents[j].x1; tileInfo[4 + j * 4 + 1] = servWinInfo->extents[j].y1; tileInfo[4 + j * 4 + 2] = w; tileInfo[4 + j * 4 + 3] = h; } arraySize = 4 + 4 * servWinInfo->num_extents; /* pack/send to server[i] */ crPackSetBuffer( thread->packer, &(thread->buffer[i]) ); if (tilesort_spu.swap) crPackChromiumParametervCRSWAP(GL_TILE_INFO_CR, GL_INT, arraySize, tileInfo); else crPackChromiumParametervCR(GL_TILE_INFO_CR, GL_INT, arraySize, tileInfo); /* release server buffer */ crPackReleaseBuffer( thread->packer ); } /* Restore default buffer */ crPackSetBuffer( thread->packer, &(thread->geometry_buffer) ); }
/** * Examine the server tile boundaries to compute the overall max * viewport dims. Then send those dims to the servers. * * XXX \todo This isn't used!?! */ void tilesortspuComputeMaxViewport(WindowInfo *winInfo) { ThreadInfo *thread0 = &(tilesort_spu.thread[0]); GLint totalDims[2]; int i; /* release geometry buffer, if it's bound */ crPackReleaseBuffer( thread0->packer ); /* * It's hard to say what the max viewport size should be. * We've changed this computation a few times now. * For now, we set it to twice the mural size, or at least 4K. * One problem is that the mural size can change dynamically... */ totalDims[0] = 2 * winInfo->muralWidth; totalDims[1] = 2 * winInfo->muralHeight; if (totalDims[0] < 4096) totalDims[0] = 4096; if (totalDims[1] < 4096) totalDims[1] = 4096; tilesort_spu.limits.maxViewportDims[0] = totalDims[0]; tilesort_spu.limits.maxViewportDims[1] = totalDims[1]; /* * Once we've computed the maximum viewport size, we send * a message to each server with its new viewport parameters. */ for (i = 0; i < tilesort_spu.num_servers; i++) { crPackSetBuffer( thread0->packer, &(thread0->buffer[i]) ); if (tilesort_spu.swap) crPackChromiumParametervCRSWAP(GL_SET_MAX_VIEWPORT_CR, GL_INT, 2, totalDims); else crPackChromiumParametervCR(GL_SET_MAX_VIEWPORT_CR, GL_INT, 2, totalDims); /* release server buffer */ crPackReleaseBuffer( thread0->packer ); /* Flush buffer (send to server) */ tilesortspuSendServerBuffer( i ); } }