e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "server_dispatch.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "server.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#include "cr_string.h"
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#include "cr_pixeldata.h"
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync#ifdef VBOX_WITH_CRDUMPER
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync# include "cr_dump.h"
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSelectBuffer( GLsizei size, GLuint *buffer )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (void) buffer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Unsupported network glSelectBuffer call." );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetChromiumParametervCR(GLenum target, GLuint index, GLenum type, GLsizei count, GLvoid *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLubyte local_storage[4096];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint bytes = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (type) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_BYTE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = count * sizeof(GLbyte);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_SHORT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = count * sizeof(GLshort);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_UNSIGNED_INT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = count * sizeof(GLint);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_FLOAT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = count * sizeof(GLfloat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DOUBLE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bytes = count * sizeof(GLdouble);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("Bad type in crServerDispatchGetChromiumParametervCR");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(bytes >= 0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(bytes < 4096);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync switch (target)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync case GL_DBG_CHECK_BREAK_CR:
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (bytes > 0)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync GLubyte *pbRc = local_storage;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync GLuint *puRc = (GLuint *)(bytes >=4 ? local_storage : NULL);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync int rc;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync memset(local_storage, 0, bytes);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (cr_server.RcToGuestOnce)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync rc = cr_server.RcToGuestOnce;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync cr_server.RcToGuestOnce = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync else
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync rc = cr_server.RcToGuest;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (puRc)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync *puRc = rc;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync else
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync *pbRc = !!rc;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync else
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crWarning("zero bytes for GL_DBG_CHECK_BREAK_CR");
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync break;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync case GL_HH_SET_DEFAULT_SHARED_CTX:
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync WARN(("Recieved GL_HH_SET_DEFAULT_SHARED_CTX from guest, ignoring"));
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync break;
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync case GL_HH_SET_CLIENT_CALLOUT:
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync WARN(("Recieved GL_HH_SET_CLIENT_CALLOUT from guest, ignoring"));
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync break;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync default:
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync cr_server.head_spu->dispatch_table.GetChromiumParametervCR( target, index, type, count, local_storage );
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync break;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crServerReturnValue( local_storage, bytes );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync static int gather_connect_count = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (target) {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync case GL_SHARE_LISTS_CR:
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync CRContextInfo *pCtx[2];
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync GLint *ai32Values;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync int i;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (count != 2)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync WARN(("GL_SHARE_LISTS_CR invalid cound %d", count));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (type != GL_UNSIGNED_INT && type != GL_INT)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync WARN(("GL_SHARE_LISTS_CR invalid type %d", type));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync ai32Values = (GLint*)values;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync for (i = 0; i < 2; ++i)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync const int32_t val = ai32Values[i];
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (val == 0)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync WARN(("GL_SHARE_LISTS_CR invalid value[%d] %d", i, val));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync pCtx[i] = (CRContextInfo *) crHashtableSearch(cr_server.contextTable, val);
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (!pCtx[i])
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync WARN(("GL_SHARE_LISTS_CR invalid pCtx1 for value[%d] %d", i, val));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync if (!pCtx[i]->pContext)
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync {
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync WARN(("GL_SHARE_LISTS_CR invalid pCtx1 pContext for value[%d] %d", i, val));
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync return;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync crStateShareLists(pCtx[0]->pContext, pCtx[1]->pContext);
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync break;
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync }
a804628e06a5bd14e9af77943922ffd9649c221cvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SET_MAX_VIEWPORT_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *maxDims = (GLint *)values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.limits.maxViewportDims[0] = maxDims[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.limits.maxViewportDims[1] = maxDims[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TILE_INFO_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* message from tilesort SPU to set new tile bounds */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint numTiles, muralWidth, muralHeight, server, tiles;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *tileBounds;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(count >= 4);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT((count - 4) % 4 == 0); /* must be multiple of four */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(type == GL_INT);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync numTiles = (count - 4) / 4;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tileBounds = (GLint *) values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync server = tileBounds[0];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync muralWidth = tileBounds[1];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync muralHeight = tileBounds[2];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tiles = tileBounds[3];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(tiles == numTiles);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync tileBounds += 4; /* skip over header values */
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync /*crServerNewMuralTiling(mural, muralWidth, muralHeight, numTiles, tileBounds);
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync mural->viewportValidated = GL_FALSE;*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_GATHER_DRAWPIXELS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (cr_server.only_swap_once && cr_server.curClient != cr_server.clients[0])
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_GATHER_CONNECT_CR:
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We want the last connect to go through,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * otherwise we might deadlock in CheckWindowSize()
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * in the readback spu
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync gather_connect_count++;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (cr_server.only_swap_once && (gather_connect_count != cr_server.numClients))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync gather_connect_count = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SERVER_VIEW_MATRIX_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set this server's view matrix which will get premultiplied onto the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * modelview matrix. For non-planar tilesort and stereo.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(count == 18);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(type == GL_FLOAT);
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 {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLfloat *v = (const GLfloat *) values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const int eye = v[1] == 0.0 ? 0 : 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMatrixInitFromFloats(&cr_server.viewMatrix[eye], v + 2);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDebug("Got GL_SERVER_VIEW_MATRIX_CR:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m00,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m10,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m20,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m30,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m01,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m11,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m21,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m31,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m02,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m12,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m22,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m32,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m03,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m13,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m23,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewMatrix[eye].m33);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.viewOverride = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SERVER_PROJECTION_MATRIX_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Set this server's projection matrix which will get replace the user's
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * projection matrix. For non-planar tilesort and stereo.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(count == 18);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(type == GL_FLOAT);
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 {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const GLfloat *v = (const GLfloat *) values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const int eye = v[1] == 0.0 ? 0 : 1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMatrixInitFromFloats(&cr_server.projectionMatrix[eye], v + 2);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDebug("Got GL_SERVER_PROJECTION_MATRIX_CR:\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f\n"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync " %f %f %f %f",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m00,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m10,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m20,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m30,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m01,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m11,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m21,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m31,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m02,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m12,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m22,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m32,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m03,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m13,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m23,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionMatrix[eye].m33);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (cr_server.projectionMatrix[eye].m33 == 0.0f) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float x = cr_server.projectionMatrix[eye].m00;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float y = cr_server.projectionMatrix[eye].m11;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float a = cr_server.projectionMatrix[eye].m20;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float b = cr_server.projectionMatrix[eye].m21;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float c = cr_server.projectionMatrix[eye].m22;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float d = cr_server.projectionMatrix[eye].m32;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float znear = -d / (1.0f - c);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float zfar = (c - 1.0f) * znear / (c + 1.0f);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float left = znear * (a - 1.0f) / x;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float right = 2.0f * znear / x + left;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float bottom = znear * (b - 1.0f) / y;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync float top = 2.0f * znear / y + bottom;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDebug("Frustum: left, right, bottom, top, near, far: %f, %f, %f, %f, %f, %f", left, right, bottom, top, znear, zfar);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Todo: Add debug output for orthographic projection*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.projectionOverride = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync case GL_HH_SET_TMPCTX_MAKE_CURRENT:
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync /*we should not receive it from the guest! */
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync break;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync case GL_HH_SET_CLIENT_CALLOUT:
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync WARN(("Recieved GL_HH_SET_CLIENT_CALLOUT from guest, ignoring"));
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync break;
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( target, type, count, values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParameteriCR(GLenum target, GLint value)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (target) {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync case GL_SHARE_CONTEXT_RESOURCES_CR:
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crStateShareContext(value);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync break;
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync case GL_RCUSAGE_TEXTURE_SET_CR:
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync crStateSetTextureUsed(value, GL_TRUE);
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync break;
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync case GL_RCUSAGE_TEXTURE_CLEAR_CR:
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync crStateSetTextureUsed(value, GL_FALSE);
d0a71f63bd810b54e0359223fe53b07730154dc5vboxsync break;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync case GL_PIN_TEXTURE_SET_CR:
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync crStatePinTexture(value, GL_TRUE);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync break;
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync case GL_PIN_TEXTURE_CLEAR_CR:
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync crStatePinTexture(value, GL_FALSE);
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_DISPLAY_LISTS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedDisplayLists = value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_TEXTURE_OBJECTS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedTextureObjects = value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_PROGRAMS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedPrograms = value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SERVER_CURRENT_EYE_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.currentEye = value ? 1 : 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
a7ba3d5f31ca70d04a3933e570374e5ec5eff84avboxsync case GL_HOST_WND_CREATED_HIDDEN_CR:
12204ff4d822f4d94cf0ced0a12f4e1b5fc664advboxsync cr_server.bWindowsInitiallyHidden = value ? 1 : 0;
12204ff4d822f4d94cf0ced0a12f4e1b5fc664advboxsync break;
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync case GL_HH_SET_DEFAULT_SHARED_CTX:
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync WARN(("Recieved GL_HH_SET_DEFAULT_SHARED_CTX from guest, ignoring"));
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync break;
446c33ab1797a0d7df0c2ee8bbaba88006a5e04evboxsync case GL_HH_RENDERTHREAD_INFORM:
118ffced88fed3e5b6f6e1b4728010ace6336bd4vboxsync WARN(("Recieved GL_HH_RENDERTHREAD_INFORM from guest, ignoring"));
446c33ab1797a0d7df0c2ee8bbaba88006a5e04evboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParameteriCR( target, value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParameterfCR(GLenum target, GLfloat value)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (target) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_DISPLAY_LISTS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedDisplayLists = (int) value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_TEXTURE_OBJECTS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedTextureObjects = (int) value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_SHARED_PROGRAMS_CR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.sharedPrograms = (int) value;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Pass the parameter info to the head SPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParameterfCR( target, value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLint crServerGenerateID(GLint *pCounter)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (*pCounter)++;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync/*#define CR_DUMP_BLITS*/
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#ifdef CR_DUMP_BLITS
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncstatic int blitnum=0;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncstatic int copynum=0;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#endif
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# ifdef DEBUG_misha
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync//# define CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# include <iprt/assert.h>
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# undef CRASSERT /* iprt assert's int3 are inlined that is why are more convenient to use since they can be easily disabled individually */
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# define CRASSERT Assert
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync# endif
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncvoid SERVER_DISPATCH_APIENTRY
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsynccrServerDispatchCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync{
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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if ((target!=GL_TEXTURE_2D) || (height>=0))
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync cr_server.head_spu->dispatch_table.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#ifdef CR_DUMP_BLITS
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync {
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync void *img;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync GLint w, h;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync char fname[200];
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync copynum++;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync img = crAlloc(w*h*4);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync CRASSERT(img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync sprintf(fname, "copy_blit%i_copy_%i.tga", blitnum, copynum);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDumpNamedTGA(fname, w, h, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crFree(img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync }
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#endif
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync else /* negative height, means we have to Yinvert the source pixels while copying */
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (siHavePBO<0)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync const char *ext = (const char*)gl->GetString(GL_EXTENSIONS);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync siHavePBO = crStrstr(ext, "GL_ARB_pixel_buffer_object") ? 1:0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (siHaveFBO<0)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync const char *ext = (const char*)gl->GetString(GL_EXTENSIONS);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync siHaveFBO = crStrstr(ext, "GL_EXT_framebuffer_object") ? 1:0;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (siHavePBO==0 && siHaveFBO==0)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync#if 1
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync GLint dRow, sRow;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=y-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexSubImage2D(target, level, xoffset, dRow, x, sRow, width, 1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync#else
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync {
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync GLint w, h, i;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync char *img1, *img2, *sPtr, *dPtr;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync CRContext *ctx = crStateGetCurrent();
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
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
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync img1 = crAlloc(4*w*h);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync img2 = crAlloc(4*width*(-height));
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync CRASSERT(img1 && img2);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, -height);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->GetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, img1);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync sPtr=img1+4*xoffset+4*w*yoffset;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync dPtr=img2+4*width*(-height-1);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync for (i=0; i<-height; ++i)
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync {
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync crMemcpy(dPtr, sPtr, 4*width);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync sPtr += 4*w;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync dPtr -= 4*width;
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync }
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync gl->TexSubImage2D(target, level, xoffset, yoffset, width, -height, GL_RGBA, GL_UNSIGNED_BYTE, img2);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync crFree(img1);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync crFree(img2);
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync }
c113f3435253eb5c01a17f6b599c280d505663f7vboxsync#endif
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync else if (siHaveFBO==1) /*@todo more states to set and restore here*/
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync GLuint tID, fboID;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync GLenum status;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync CRContext *ctx = crStateGetCurrent();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GenTextures(1, &tID);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindTexture(target, tID);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexImage2D(target, level, GL_RGBA, x, y, width, -height, 0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GenFramebuffersEXT(1, &fboID);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync 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 if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crWarning("Framebuffer status 0x%x", status);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Enable(target);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PushAttrib(GL_VIEWPORT_BIT);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Viewport(xoffset, yoffset, width, -height);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->MatrixMode(GL_PROJECTION);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PushMatrix();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->LoadIdentity();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->MatrixMode(GL_MODELVIEW);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PushMatrix();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->LoadIdentity();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Disable(GL_DEPTH_TEST);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Disable(GL_CULL_FACE);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Disable(GL_STENCIL_TEST);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Disable(GL_SCISSOR_TEST);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Begin(GL_QUADS);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexCoord2f(0.0f, 1.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Vertex2f(-1.0, -1.0);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexCoord2f(0.0f, 0.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Vertex2f(-1.0f, 1.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexCoord2f(1.0f, 0.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Vertex2f(1.0f, 1.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexCoord2f(1.0f, 1.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->Vertex2f(1.0f, -1.0f);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->End();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PopMatrix();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->MatrixMode(GL_PROJECTION);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PopMatrix();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->PopAttrib();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
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 gl->DeleteFramebuffersEXT(1, &fboID);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->DeleteTextures(1, &tID);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#if 0
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync GLint dRow, sRow, w, h;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync void *img1, *img2;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync img1 = crAlloc(4*w*h);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync img2 = crAlloc(4*w*h);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync CRASSERT(img1 && img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GetTexImage(target, level, GL_BGRA, GL_UNSIGNED_BYTE, img1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=y-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->CopyTexSubImage2D(target, level, xoffset, dRow, x, sRow, width, 1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GetTexImage(target, level, GL_BGRA, GL_UNSIGNED_BYTE, img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync if (crMemcmp(img1, img2, 4*w*h))
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crDebug("MISMATCH! (%x, %i, ->%i,%i <-%i, %i [%ix%i])", target, level, xoffset, yoffset, x, y, width, height);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crDumpTGA(w, h, img1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crDumpTGA(w, h, img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync DebugBreak();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crFree(img1);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync crFree(img2);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#endif
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync else
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
a91869e545af1b242b7c5f6f0aa12164f74225f4vboxsync GLuint pboId, dRow, sRow;
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync CRContext *ctx = crStateGetCurrent();
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->GenBuffersARB(1, &pboId);
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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#if 1
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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboId);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=yoffset, sRow=-height-1; dRow<yoffset-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->TexSubImage2D(target, level, xoffset, dRow, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)((uintptr_t)sRow*width*4));
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync#else /*few times slower again*/
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync for (dRow=0, sRow=y-height-1; dRow<-height; dRow++, sRow--)
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync {
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->ReadPixels(x, sRow, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)((uintptr_t)dRow*width*4));
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, ctx->bufferobject.packBuffer->hwid);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
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#endif
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, ctx->bufferobject.unpackBuffer->hwid);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->DeleteBuffersARB(1, &pboId);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync }
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync}
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync#ifdef CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgFree(void *pvData)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crFree(pvData);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgGetTexImage2D(GLint texTarget, GLint texName, GLvoid **ppvImage, GLint *pw, GLint *ph)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint ppb, pub, dstw, dsth, otex;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint pa, pr, psp, psr, ua, ur, usp, usr;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLvoid *pvImage;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint rfb, dfb, rb, db;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_BUFFER, &rb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_BUFFER, &db);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_READ_FRAMEBUFFER_BINDING_EXT, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_BINDING_EXT, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->ReadBuffer(GL_BACK);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->DrawBuffer(GL_BACK);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_TEXTURE_BINDING_2D, &otex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PACK_ROW_LENGTH, &pr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PACK_ALIGNMENT, &pa);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PACK_SKIP_PIXELS, &psp);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PACK_SKIP_ROWS, &psr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_UNPACK_ROW_LENGTH, &ur);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_UNPACK_ALIGNMENT, &ua);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_UNPACK_SKIP_PIXELS, &usp);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_UNPACK_SKIP_ROWS, &usr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindTexture(texTarget, texName);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexLevelParameteriv(texTarget, 0, GL_TEXTURE_WIDTH, &dstw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexLevelParameteriv(texTarget, 0, GL_TEXTURE_HEIGHT, &dsth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_ROW_LENGTH, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_ALIGNMENT, 1);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_SKIP_PIXELS, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_SKIP_ROWS, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_ROW_LENGTH, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_ALIGNMENT, 1);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_SKIP_ROWS, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER, 0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pvImage = crAlloc(4*dstw*dsth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetTexImage(texTarget, 0, GL_BGRA, GL_UNSIGNED_BYTE, pvImage);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindTexture(texTarget, otex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_ROW_LENGTH, pr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_ALIGNMENT, pa);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_SKIP_PIXELS, psp);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_PACK_SKIP_ROWS, psr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_ROW_LENGTH, ur);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_ALIGNMENT, ua);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_SKIP_PIXELS, usp);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->PixelStorei(GL_UNPACK_SKIP_ROWS, usr);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindBufferARB(GL_PIXEL_PACK_BUFFER, ppb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindBufferARB(GL_PIXEL_UNPACK_BUFFER, pub);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_READ_FRAMEBUFFER_BINDING_EXT, rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_BINDING_EXT, dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->ReadBuffer(rb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->DrawBuffer(db);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync *ppvImage = pvImage;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync *pw = dstw;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync *ph = dsth;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncDECLEXPORT(void) crDbgPrint(const char *format, ... )
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync va_list args;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync static char txt[8092];
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync va_start( args, format );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync vsprintf( txt, format, args );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync OutputDebugString(txt);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgDumpImage2D(const char* pszDesc, const void *pvData, uint32_t width, uint32_t height, uint32_t bpp, uint32_t pitch)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
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",
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pvData, width, height, bpp, pitch,
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pszDesc,
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pvData, width, height, bpp, pitch);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid crDbgDumpTexImage2D(const char* pszDesc, GLint texTarget, GLint texName, GLboolean fBreak)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLvoid *pvImage;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint w, h;
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);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (fBreak)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(0);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDbgFree(pvImage);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync#endif
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncPCR_BLITTER crServerVBoxBlitterGet()
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync{
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!CrBltIsInitialized(&cr_server.Blitter))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CR_BLITTER_CONTEXT Ctx;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int rc;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRASSERT(cr_server.MainContextInfo.SpuContext);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync Ctx.Base.id = cr_server.MainContextInfo.SpuContext;
ed477c7dac5921fb5d44a9d3824fd5f508eed93bvboxsync Ctx.Base.visualBits = cr_server.MainContextInfo.CreateInfo.realVisualBits;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync rc = CrBltInit(&cr_server.Blitter, &Ctx, true, true, NULL, &cr_server.TmpCtxDispatch);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (RT_SUCCESS(rc))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRASSERT(CrBltIsInitialized(&cr_server.Blitter));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync else
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("CrBltInit failed, rc %d", rc);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRASSERT(!CrBltIsInitialized(&cr_server.Blitter));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return NULL;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync if (!CrBltMuralGetCurrentInfo(&cr_server.Blitter)->Base.id)
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync {
ed477c7dac5921fb5d44a9d3824fd5f508eed93bvboxsync CRMuralInfo *dummy = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.realVisualBits);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync CR_BLITTER_WINDOW DummyInfo;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync CRASSERT(dummy);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync crServerVBoxBlitterWinInit(&DummyInfo, dummy);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync CrBltMuralSetCurrentInfo(&cr_server.Blitter, &DummyInfo);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync }
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return &cr_server.Blitter;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync}
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncPCR_BLITTER crServerVBoxBlitterGetInitialized()
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync{
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (CrBltIsInitialized(&cr_server.Blitter))
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync return &cr_server.Blitter;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync return NULL;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync}
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncint crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTURE pTex, GLboolean fDraw)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync{
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRTextureObj *tobj;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRFramebufferObjectState *pBuf = &ctx->framebufferobject;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLenum enmBuf;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRFBOAttachmentPoint *pAp;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLuint idx;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRTextureLevel *tl;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRFramebufferObject *pFBO = fDraw ? pBuf->drawFB : pBuf->readFB;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!pFBO)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLuint hwid;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync if (!mural->fRedirected)
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync {
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync WARN(("mural not redirected!"));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync enmBuf = fDraw ? ctx->buffer.drawBuffer : ctx->buffer.readBuffer;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync switch (enmBuf)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_BACK:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_BACK_RIGHT:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_BACK_LEFT:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync hwid = mural->aidColorTexs[CR_SERVER_FBO_BB_IDX(mural)];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync break;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_FRONT:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_FRONT_RIGHT:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync case GL_FRONT_LEFT:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync hwid = mural->aidColorTexs[CR_SERVER_FBO_FB_IDX(mural)];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync break;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync default:
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync WARN(("unsupported enum buf %d", enmBuf));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync break;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!hwid)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("offscreen render tex hwid is null");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_INVALID_STATE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->width = mural->width;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->height = mural->height;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->target = GL_TEXTURE_2D;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->hwid = hwid;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VINF_SUCCESS;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync enmBuf = fDraw ? pFBO->drawbuffer[0] : pFBO->readbuffer;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync idx = enmBuf - GL_COLOR_ATTACHMENT0_EXT;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (idx >= CR_MAX_COLOR_ATTACHMENTS)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("idx is invalid %d, using 0", idx);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pAp = &pFBO->color[idx];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!pAp->name)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("no collor draw attachment");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_INVALID_STATE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (pAp->level)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync WARN(("non-zero level not implemented"));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync tobj = (CRTextureObj*)crHashtableSearch(ctx->shared->textureTable, pAp->name);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!tobj)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("no texture object found for name %d", pAp->name);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_INVALID_STATE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (tobj->target != GL_TEXTURE_2D && tobj->target != GL_TEXTURE_RECTANGLE_NV)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync WARN(("non-texture[rect|2d] not implemented"));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRASSERT(tobj->hwid);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync tl = tobj->level[0];
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->width = tl->width;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->height = tl->height;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->target = tobj->target;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pTex->hwid = tobj->hwid;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VINF_SUCCESS;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync}
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncint crServerVBoxBlitterBlitCurrentCtx(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLbitfield mask, GLenum filter)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync{
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync PCR_BLITTER pBlitter;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CR_BLITTER_CONTEXT Ctx;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRMuralInfo *mural;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CRContext *ctx = crStateGetCurrent();
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync PVBOXVR_TEXTURE pDrawTex, pReadTex;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync VBOXVR_TEXTURE DrawTex, ReadTex;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int rc;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync GLuint idDrawFBO, idReadFBO;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CR_BLITTER_WINDOW BltInfo;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (mask != GL_COLOR_BUFFER_BIT)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
0c3c267261e59ea62dd5126f96c338ca6a1dd199vboxsync WARN(("not supported blit mask %d", mask));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!cr_server.curClient)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("no current client");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_INVALID_STATE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync mural = cr_server.curClient->currentMural;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!mural)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("no current mural");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_INVALID_STATE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync rc = crServerVBoxBlitterTexInit(ctx, mural, &DrawTex, GL_TRUE);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (RT_SUCCESS(rc))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pDrawTex = &DrawTex;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync else
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("crServerVBoxBlitterTexInit failed for draw");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return rc;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync rc = crServerVBoxBlitterTexInit(ctx, mural, &ReadTex, GL_FALSE);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (RT_SUCCESS(rc))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pReadTex = &ReadTex;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync else
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync// crWarning("crServerVBoxBlitterTexInit failed for read");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return rc;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync pBlitter = crServerVBoxBlitterGet();
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (!pBlitter)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("crServerVBoxBlitterGet failed");
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_GENERAL_FAILURE;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f0b06b8e4de2a0d9ddb10ac0a30d68fafd73d8c1vboxsync crServerVBoxBlitterWinInit(&BltInfo, mural);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f0b06b8e4de2a0d9ddb10ac0a30d68fafd73d8c1vboxsync crServerVBoxBlitterCtxInit(&Ctx, cr_server.curClient->currentCtxInfo);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrBltMuralSetCurrentInfo(pBlitter, &BltInfo);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync idDrawFBO = CR_SERVER_FBO_FOR_IDX(mural, mural->iCurDrawBuffer);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync idReadFBO = CR_SERVER_FBO_FOR_IDX(mural, mural->iCurReadBuffer);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crStateSwitchPrepare(NULL, ctx, idDrawFBO, idReadFBO);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync rc = CrBltEnter(pBlitter);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (RT_SUCCESS(rc))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync RTRECT ReadRect, DrawRect;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync ReadRect.xLeft = srcX0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync ReadRect.yTop = srcY0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync ReadRect.xRight = srcX1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync ReadRect.yBottom = srcY1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync DrawRect.xLeft = dstX0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync DrawRect.yTop = dstY0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync DrawRect.xRight = dstX1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync DrawRect.yBottom = dstY1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CrBltBlitTexTex(pBlitter, pReadTex, &ReadRect, pDrawTex, &DrawRect, 1, CRBLT_FLAGS_FROM_FILTER(filter));
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync CrBltLeave(pBlitter);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync else
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("CrBltEnter failed rc %d", rc);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crStateSwitchPostprocess(ctx, NULL, idDrawFBO, idReadFBO);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return rc;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync}
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncvoid SERVER_DISPATCH_APIENTRY
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsynccrServerDispatchBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync GLbitfield mask, GLenum filter)
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync{
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync CRContext *ctx = crStateGetCurrent();
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync bool fTryBlitter = false;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync#ifdef CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// {
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 sdtex=0, srtex=0;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLenum dStatus, rStatus;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRTextureObj *tobj = 0;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRTextureLevel *tl = 0;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync GLint id, tuId, pbufId, pbufIdHw, ubufId, ubufIdHw, width, height, depth;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("===StateTracker===");
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Current TU: %i", ctx->texture.curTextureUnit);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync tobj = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(tobj);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync tl = &tobj->level[0][0];
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Texture %i(hw %i), w=%i, h=%i", tobj->id, tobj->hwid, tl->width, tl->height, tl->depth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pbufId = ctx->bufferobject.packBuffer->hwid;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync else
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync pbufId = 0;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Pack BufferId %i", pbufId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync ubufId = ctx->bufferobject.unpackBuffer->hwid;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync else
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync ubufId = 0;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Unpack BufferId %i", ubufId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("===GPU===");
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_ACTIVE_TEXTURE, &tuId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Current TU: %i", tuId - GL_TEXTURE0_ARB);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(tuId - GL_TEXTURE0_ARB == ctx->texture.curTextureUnit);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
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 CRASSERT(id == tobj->hwid);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(width == tl->width);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(height == tl->height);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(depth == tl->depth);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &pbufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Hw Pack BufferId %i", pbufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(pbufIdHw == pbufId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &ubufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crDebug("Hw Unpack BufferId %i", ubufIdHw);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ubufIdHw == ubufId);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_READ_BUFFER, &rb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_DRAW_BUFFER, &db);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_VIEWPORT, &vp[0]);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync gl->GetIntegerv(GL_TEXTURE_BINDING_2D, &otex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
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
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
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (dtex)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(!dlev);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (rtex)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(!rlev);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (ctx->framebufferobject.drawFB)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->hwid == dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.drawFB->drawbuffer[0] == db);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(dStatus==GL_FRAMEBUFFER_COMPLETE_EXT);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(db==GL_COLOR_ATTACHMENT0_EXT);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
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 sdtex = crStateGetTextureHWID(sdtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(sdtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync else
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(!dfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync if (ctx->framebufferobject.readFB)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(ctx->framebufferobject.readFB->hwid == rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(rStatus==GL_FRAMEBUFFER_COMPLETE_EXT);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
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 srtex = crStateGetTextureHWID(srtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(srtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync else
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(!rfb);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(sdtex == dtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync CRASSERT(srtex == rtex);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("==> src tex:", GL_TEXTURE_2D, rtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("==> dst tex:", GL_TEXTURE_2D, dtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync#endif
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#ifdef CR_DUMP_BLITS
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 GLenum status;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync char fname[200];
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync void *img;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync blitnum++;
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
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
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &rfb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &dfb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_READ_BUFFER, &rb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_DRAW_BUFFER, &db);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &ppb);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &pub);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_VIEWPORT, &vp[0]);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetIntegerv(GL_TEXTURE_BINDING_2D, &otex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync CRASSERT(!rfb && dfb);
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
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync CRASSERT(status==GL_FRAMEBUFFER_COMPLETE_EXT
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync && db==GL_COLOR_ATTACHMENT0_EXT
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync && (rb==GL_FRONT || rb==GL_BACK)
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync && !rfb && dfb && dtex && !dlev
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync && !ppb && !pub);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
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
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_PACK_ROW_LENGTH, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_PACK_ALIGNMENT, 1);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_PACK_SKIP_PIXELS, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_PACK_SKIP_ROWS, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_UNPACK_ROW_LENGTH, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_UNPACK_ALIGNMENT, 1);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->PixelStorei(GL_UNPACK_SKIP_ROWS, 0);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, dtex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, dlev, GL_TEXTURE_WIDTH, &dstw);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexLevelParameteriv(GL_TEXTURE_2D, dlev, GL_TEXTURE_HEIGHT, &dsth);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, otex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDebug("Dst is %i, %i", dstw, dsth);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync CRASSERT(vp[2]>=dstw && vp[3]>=dsth);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync img = crAlloc(vp[2]*vp[3]*4);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync CRASSERT(img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->ReadPixels(0, 0, vp[2], vp[3], GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync sprintf(fname, "blit%iA_src.tga", blitnum);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDumpNamedTGA(fname, vp[2], vp[3], img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, dtex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, dlev, GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync sprintf(fname, "blit%iB_dst.tga", blitnum);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDumpNamedTGA(fname, dstw, dsth, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, otex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#endif
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (srcY0 > srcY1)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
819fb2627ce7d9246fcd2bfcf9d336b2175cab57vboxsync /* work around Intel driver bug on Linux host */
819fb2627ce7d9246fcd2bfcf9d336b2175cab57vboxsync if (1 || dstY0 > dstY1)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync /* use srcY1 < srcY2 && dstY1 < dstY2 whenever possible to avoid GPU driver bugs */
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int32_t tmp = srcY0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync srcY0 = srcY1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync srcY1 = tmp;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync tmp = dstY0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync dstY0 = dstY1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync dstY1 = tmp;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (srcX0 > srcX1)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (dstX0 > dstX1)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync /* use srcX1 < srcX2 && dstX1 < dstX2 whenever possible to avoid GPU driver bugs */
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int32_t tmp = srcX0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync srcX0 = srcX1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync srcX1 = tmp;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync tmp = dstX0;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync dstX0 = dstX1;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync dstX1 = tmp;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
77708d0cc3d81cb2007c13ed2ca5fb1b8379d0ddvboxsync if (cr_server.fBlitterMode)
77708d0cc3d81cb2007c13ed2ca5fb1b8379d0ddvboxsync {
77708d0cc3d81cb2007c13ed2ca5fb1b8379d0ddvboxsync fTryBlitter = true;
77708d0cc3d81cb2007c13ed2ca5fb1b8379d0ddvboxsync }
77708d0cc3d81cb2007c13ed2ca5fb1b8379d0ddvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (fTryBlitter)
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync int rc = crServerVBoxBlitterBlitCurrentCtx(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync if (RT_SUCCESS(rc))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync goto my_exit;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync if (ctx->viewport.scissorTest)
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync cr_server.head_spu->dispatch_table.Disable(GL_SCISSOR_TEST);
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync cr_server.head_spu->dispatch_table.BlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1,
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync dstX0, dstY0, dstX1, dstY1,
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync mask, filter);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync if (ctx->viewport.scissorTest)
3379a3053bdf96e4a7c84cb099580a29c6d4547bvboxsync cr_server.head_spu->dispatch_table.Enable(GL_SCISSOR_TEST);
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsyncmy_exit:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync//#ifdef CR_CHECK_BLITS
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("<== src tex:", GL_TEXTURE_2D, rtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync// crDbgDumpTexImage2D("<== dst tex:", GL_TEXTURE_2D, dtex, true);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync//#endif
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#ifdef CR_DUMP_BLITS
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, dtex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->GetTexImage(GL_TEXTURE_2D, dlev, GL_BGRA, GL_UNSIGNED_BYTE, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync sprintf(fname, "blit%iC_res.tga", blitnum);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crDumpNamedTGA(fname, dstw, dsth, img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync gl->BindTexture(GL_TEXTURE_2D, otex);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync crFree(img);
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync#endif
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return;
05e2d532b00db03e631595029308c4c621a11e43vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchDrawBuffer( GLenum mode )
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crStateDrawBuffer( mode );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync if (!crStateGetCurrent()->framebufferobject.drawFB)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync if (mode == GL_FRONT || mode == GL_FRONT_LEFT || mode == GL_FRONT_RIGHT)
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync
4a90abf7472a436c6951fd92417018a6890a69a7vboxsync if (crServerIsRedirectedToFBO()
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync && cr_server.curClient->currentMural->aidFBOs[0])
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync GLint iBufferNeeded = -1;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync switch (mode)
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync {
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync case GL_BACK:
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync case GL_BACK_LEFT:
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync case GL_BACK_RIGHT:
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync break;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync case GL_FRONT:
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync case GL_FRONT_LEFT:
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync case GL_FRONT_RIGHT:
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_FB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_NONE:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("DrawBuffer: GL_NONE");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX0:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("DrawBuffer: GL_AUX0");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX1:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("DrawBuffer: GL_AUX1");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX2:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("DrawBuffer: GL_AUX2");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX3:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("DrawBuffer: GL_AUX3");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_LEFT:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_LEFT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_RIGHT:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_RIGHT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_FRONT_AND_BACK:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: GL_FRONT_AND_BACK not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync break;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync default:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("DrawBuffer: unexpected mode! 0x%x", mode);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = mural->iCurDrawBuffer;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync break;
eb31f787aa8be90af240e2bed7680be92d625ba8vboxsync }
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync if (iBufferNeeded != mural->iCurDrawBuffer)
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync {
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mural->iCurDrawBuffer = iBufferNeeded;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, CR_SERVER_FBO_FOR_IDX(mural, iBufferNeeded));
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.DrawBuffer( mode );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchReadBuffer( GLenum mode )
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync{
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync crStateReadBuffer( mode );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync
4a90abf7472a436c6951fd92417018a6890a69a7vboxsync if (crServerIsRedirectedToFBO()
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync && cr_server.curClient->currentMural->aidFBOs[0]
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync && !crStateGetCurrent()->framebufferobject.readFB)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync CRMuralInfo *mural = cr_server.curClient->currentMural;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync GLint iBufferNeeded = -1;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync switch (mode)
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync {
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync case GL_BACK:
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync case GL_BACK_LEFT:
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync case GL_BACK_RIGHT:
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync break;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync case GL_FRONT:
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync case GL_FRONT_LEFT:
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync case GL_FRONT_RIGHT:
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_FB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_NONE:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("ReadBuffer: GL_NONE");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX0:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("ReadBuffer: GL_AUX0");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX1:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("ReadBuffer: GL_AUX1");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX2:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("ReadBuffer: GL_AUX2");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_AUX3:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crDebug("ReadBuffer: GL_AUX3");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_LEFT:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_LEFT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_RIGHT:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_RIGHT not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync break;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync case GL_FRONT_AND_BACK:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: GL_FRONT_AND_BACK not supported properly");
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mode = GL_COLOR_ATTACHMENT0;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = CR_SERVER_FBO_BB_IDX(mural);
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync break;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync default:
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync crWarning("ReadBuffer: unexpected mode! 0x%x", mode);
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync iBufferNeeded = mural->iCurDrawBuffer;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync break;
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync Assert(CR_SERVER_FBO_FOR_IDX(mural, mural->iCurReadBuffer));
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync if (iBufferNeeded != mural->iCurReadBuffer)
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync {
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync mural->iCurReadBuffer = iBufferNeeded;
3904a969d57a5bb3cc5136c75ec805b66f8660dcvboxsync cr_server.head_spu->dispatch_table.BindFramebufferEXT(GL_READ_FRAMEBUFFER, CR_SERVER_FBO_FOR_IDX(mural, iBufferNeeded));
a076b35761e36233a2a3ba16f77c77d7849170cavboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync }
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync cr_server.head_spu->dispatch_table.ReadBuffer( mode );
1923b15bec4fe14f2049678525e5ae739a884dd0vboxsync}
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsyncGLenum SERVER_DISPATCH_APIENTRY crServerDispatchGetError( void )
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync{
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync GLenum retval, err;
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync CRContext *ctx = crStateGetCurrent();
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync retval = ctx->error;
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync err = cr_server.head_spu->dispatch_table.GetError();
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync if (retval == GL_NO_ERROR)
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync retval = err;
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync else
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync ctx->error = GL_NO_ERROR;
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* our impl has a single error flag, so we just loop here to reset all error flags to no_error */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync while (err != GL_NO_ERROR)
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync err = cr_server.head_spu->dispatch_table.GetError();
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync crServerReturnValue( &retval, sizeof(retval) );
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync return retval; /* WILL PROBABLY BE IGNORED */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsyncvoid SERVER_DISPATCH_APIENTRY
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsynccrServerMakeTmpCtxCurrent( GLint window, GLint nativeWindow, GLint context )
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContext *pCtx = crStateGetCurrent();
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContext *pCurCtx = NULL;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync GLuint idDrawFBO = 0, idReadFBO = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync int fDoPrePostProcess = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (pCtx)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRMuralInfo *pCurrentMural = cr_server.currentMural;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync pCurCtx = cr_server.currentCtxInfo ? cr_server.currentCtxInfo->pContext : cr_server.MainContextInfo.pContext;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync Assert(pCurCtx == pCtx);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync if (!context)
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync {
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync if (pCurrentMural)
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync {
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync Assert(cr_server.currentCtxInfo);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync context = cr_server.currentCtxInfo->SpuContext > 0 ? cr_server.currentCtxInfo->SpuContext : cr_server.MainContextInfo.SpuContext;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync window = pCurrentMural->spuWindow;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync }
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync else
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync {
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync CRMuralInfo * pDummy;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync Assert(!cr_server.currentCtxInfo);
ed477c7dac5921fb5d44a9d3824fd5f508eed93bvboxsync pDummy = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.realVisualBits);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync context = cr_server.MainContextInfo.SpuContext;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync window = pDummy->spuWindow;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync }
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync fDoPrePostProcess = -1;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync }
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync else
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync {
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync fDoPrePostProcess = 1;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (pCurrentMural)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idDrawFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurDrawBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idReadFBO = CR_SERVER_FBO_FOR_IDX(pCurrentMural, pCurrentMural->iCurReadBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync else
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idDrawFBO = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idReadFBO = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync else
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync /* this is a GUI thread, so no need to do anything here */
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (fDoPrePostProcess > 0)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crStateSwitchPrepare(NULL, pCurCtx, idDrawFBO, idReadFBO);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.head_spu->dispatch_table.MakeCurrent( window, nativeWindow, context);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (fDoPrePostProcess < 0)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crStateSwitchPostprocess(pCurCtx, NULL, idDrawFBO, idReadFBO);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsyncvoid crServerInitTmpCtxDispatch()
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync MakeCurrentFunc_t pfnMakeCurrent;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crSPUInitDispatchTable(&cr_server.TmpCtxDispatch);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crSPUCopyDispatchTable(&cr_server.TmpCtxDispatch, &cr_server.head_spu->dispatch_table);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.TmpCtxDispatch.MakeCurrent = crServerMakeTmpCtxCurrent;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync pfnMakeCurrent = crServerMakeTmpCtxCurrent;
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR(GL_HH_SET_TMPCTX_MAKE_CURRENT, GL_BYTE, sizeof (void*), &pfnMakeCurrent);
0c9c9bbd8b03d653b91df6aff642b2501ae8d76bvboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync/* dump stuff */
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#ifdef VBOX_WITH_CRSERVER_DUMPER
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync# ifndef VBOX_WITH_CRDUMPER
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync# error "VBOX_WITH_CRDUMPER undefined!"
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync# endif
4bf357e9215bcc257ba2a5e13ef1f083053cfeb9vboxsync
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 *
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync *
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * Example:
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync *
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 0x03 - dump buffer on enter and exit
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync * 0x22 - dump texture and buffer on exit */
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
ced0bcd0001bdedafca513cd3b73ffe2c9c74386vboxsyncint64_t g_CrDbgDumpPid = 0;
ced0bcd0001bdedafca513cd3b73ffe2c9c74386vboxsyncunsigned long g_CrDbgDumpEnabled = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncunsigned long g_CrDbgDumpDraw = 0
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#if 0
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_COMPILE_SHADER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_LINK_PROGRAM
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#endif
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync ;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#if 0
e20b6c04833c7afc840681167235afc1e1376f34vboxsync | CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER
e20b6c04833c7afc840681167235afc1e1376f34vboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER
e20b6c04833c7afc840681167235afc1e1376f34vboxsync | CR_SERVER_DUMP_F_DRAW_TEX_ENTER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_DRAW_STATE_ENTER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync | CR_SERVER_DUMP_F_DRAWEL
e20b6c04833c7afc840681167235afc1e1376f34vboxsync | CR_SERVER_DUMP_F_SHADER_SOURCE
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync ;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#endif
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesSettings = CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_DRAW_TEX_ENTER
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_COMPILE_SHADER
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_LINK_PROGRAM
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync | CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesAppliedSettings = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesSavedInitSettings = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesCount = 0;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncuint32_t g_CrDbgDumpDrawCount = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncuint32_t g_CrDbgDumpDumpOnCount = 10;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncuint32_t g_CrDbgDumpDumpOnCountEnabled = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncuint32_t g_CrDbgDumpDumpOnCountPerform = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncuint32_t g_CrDbgDumpDrawFlags = CR_SERVER_DUMP_F_COMPILE_SHADER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_SHADER_SOURCE
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_COMPILE_SHADER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_LINK_PROGRAM
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_TEX_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAW_STATE_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_DRAWEL
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync | CR_SERVER_DUMP_F_TEXPRESENT;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsyncvoid crServerDumpCheckTerm()
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!CrBltIsInitialized(&cr_server.RecorderBlitter))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CrBltTerm(&cr_server.RecorderBlitter);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsyncint crServerDumpCheckInit()
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync int rc;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CR_BLITTER_WINDOW BltWin;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CR_BLITTER_CONTEXT BltCtx;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRMuralInfo *pBlitterMural;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (!CrBltIsInitialized(&cr_server.RecorderBlitter))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
ed477c7dac5921fb5d44a9d3824fd5f508eed93bvboxsync pBlitterMural = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.realVisualBits);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (!pBlitterMural)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crWarning("crServerGetDummyMural failed");
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return VERR_GENERAL_FAILURE;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerVBoxBlitterWinInit(&BltWin, pBlitterMural);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerVBoxBlitterCtxInit(&BltCtx, &cr_server.MainContextInfo);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync rc = CrBltInit(&cr_server.RecorderBlitter, &BltCtx, true, true, NULL, &cr_server.TmpCtxDispatch);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (!RT_SUCCESS(rc))
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crWarning("CrBltInit failed rc %d", rc);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return rc;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync rc = CrBltMuralSetCurrentInfo(&cr_server.RecorderBlitter, &BltWin);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (!RT_SUCCESS(rc))
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crWarning("CrBltMuralSetCurrentInfo failed rc %d", rc);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return rc;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#if 0
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crDmpDbgPrintInit(&cr_server.DbgPrintDumper);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.pDumper = &cr_server.DbgPrintDumper.Base;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#else
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (!crDmpHtmlIsInited(&cr_server.HtmlDumper))
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync static int cCounter = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync// crDmpHtmlInit(&cr_server.HtmlDumper, "S:\\projects\\virtualbox\\3d\\dumps\\1", "index.html");
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crDmpHtmlInitF(&cr_server.HtmlDumper, "/Users/oracle-mac/vbox/dump/1", "index%d.html", cCounter);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.pDumper = &cr_server.HtmlDumper.Base;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync ++cCounter;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#endif
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecInit(&cr_server.Recorder, &cr_server.RecorderBlitter, &cr_server.TmpCtxDispatch, cr_server.pDumper);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return VINF_SUCCESS;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncvoid crServerDumpShader(GLint id)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync{
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync CRContext *ctx = crStateGetCurrent();
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crRecDumpShader(&cr_server.Recorder, ctx, id, 0);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync}
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncvoid crServerDumpProgram(GLint id)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync{
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync CRContext *ctx = crStateGetCurrent();
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crRecDumpProgram(&cr_server.Recorder, ctx, id, 0);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync}
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncvoid crServerDumpCurrentProgram()
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync{
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync CRContext *ctx = crStateGetCurrent();
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crRecDumpCurrentProgram(&cr_server.Recorder, ctx);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync}
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crServerDumpRecompileDumpCurrentProgram()
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Dump(1)==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerRecompileCurrentProgram();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerDumpCurrentProgramUniforms();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerDumpCurrentProgramAttribs();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(1)");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerRecompileCurrentProgram();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "Dump(2)");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerRecompileCurrentProgram();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerDumpCurrentProgramUniforms();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crServerDumpCurrentProgramAttribs();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(2)");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crServerRecompileCurrentProgram()
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CRContext *ctx = crStateGetCurrent();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecRecompileCurrentProgram(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncvoid crServerDumpCurrentProgramUniforms()
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync{
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync CRContext *ctx = crStateGetCurrent();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Uniforms==");
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync crRecDumpCurrentProgramUniforms(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Done Uniforms==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crServerDumpCurrentProgramAttribs()
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CRContext *ctx = crStateGetCurrent();
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Attribs==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecDumpCurrentProgramAttribs(&cr_server.Recorder, ctx);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(cr_server.Recorder.pDumper, "==Done Attribs==");
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync}
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncvoid crServerDumpState()
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync{
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync CRContext *ctx = crStateGetCurrent();
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync crRecDumpGlGetState(&cr_server.Recorder, ctx);
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync crRecDumpGlEnableState(&cr_server.Recorder, ctx);
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync}
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncvoid crServerDumpDrawel(const char*pszFormat, ...)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync CRContext *ctx = crStateGetCurrent();
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_list pArgList;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_start(pArgList, pszFormat);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrV(&cr_server.Recorder, ctx, pszFormat, pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_end(pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncvoid crServerDumpDrawelv(GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync CRContext *ctx = crStateGetCurrent();
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrv(&cr_server.Recorder, ctx, idx, pszElFormat, cbEl, pvVal, cVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncvoid crServerDumpBuffer(int idx)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContext *ctx = crStateGetCurrent();
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync GLint idFBO;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync GLint idTex;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync VBOXVR_TEXTURE RedirTex;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync int rc = crServerDumpCheckInit();
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync idx = idx >= 0 ? idx : crServerMuralFBOIdxFromBufferName(cr_server.currentMural, pCtxInfo->pContext->buffer.drawBuffer);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!RT_SUCCESS(rc))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (idx < 0)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("neg idx, unsupported");
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idFBO = CR_SERVER_FBO_FOR_IDX(cr_server.currentMural, idx);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync idTex = CR_SERVER_FBO_TEX_FOR_IDX(cr_server.currentMural, idx);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RedirTex.width = cr_server.currentMural->fboWidth;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RedirTex.height = cr_server.currentMural->fboHeight;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RedirTex.target = GL_TEXTURE_2D;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync RedirTex.hwid = idTex;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
d9677fea1378fca6695c8f8fd3dbb21ac4607280vboxsync crRecDumpBuffer(&cr_server.Recorder, ctx, idFBO, idTex ? &RedirTex : NULL);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
32b624becaf56a356992d660b1618bd9be0c5b09vboxsyncvoid crServerDumpTexture(const VBOXVR_TEXTURE *pTex)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync{
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CR_BLITTER_WINDOW BltWin;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CR_BLITTER_CONTEXT BltCtx;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRContext *ctx = crStateGetCurrent();
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync int rc = crServerDumpCheckInit();
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync if (!RT_SUCCESS(rc))
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync return;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crServerVBoxBlitterCtxInit(&BltCtx, pCtxInfo);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crRecDumpTextureF(&cr_server.Recorder, pTex, &BltCtx, &BltWin, "Tex (%d x %d), hwid (%d) target %#x", pTex->width, pTex->height, pTex->hwid, pTex->target);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync}
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsyncvoid crServerDumpTextures()
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCtxInfo = cr_server.currentCtxInfo;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContext *ctx = crStateGetCurrent();
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync int rc = crServerDumpCheckInit();
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!RT_SUCCESS(rc))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("crServerDumpCheckInit failed, rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
d9677fea1378fca6695c8f8fd3dbb21ac4607280vboxsync crRecDumpTextures(&cr_server.Recorder, ctx);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncvoid crServerDumpFilterOpLeave(unsigned long event, CR_DUMPER *pDumper)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (CR_SERVER_DUMP_F_DRAW_LEAVE_ALL & event)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync g_CrDbgDumpDumpOnCountPerform = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync}
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncbool crServerDumpFilterOpEnter(unsigned long event, CR_DUMPER *pDumper)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if ((CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER & event)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync || (CR_SERVER_DUMP_F_TEXPRESENT & event))
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDumpOnCountEnabled == 1)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync g_CrDbgDumpDumpOnCountEnabled = 2;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else if (g_CrDbgDumpDumpOnCountEnabled)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync g_CrDbgDumpDumpOnCountEnabled = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (cr_server.pDumper == &cr_server.HtmlDumper.Base)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crDmpHtmlTerm(&cr_server.HtmlDumper);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.pDumper = NULL;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync g_CrDbgDumpDrawCount = 0;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else if (CR_SERVER_DUMP_F_DRAW_ENTER_ALL & event)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDumpOnCountEnabled == 2)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDumpOnCount == g_CrDbgDumpDrawCount)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync g_CrDbgDumpDumpOnCountPerform = 1;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync ++g_CrDbgDumpDrawCount;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDumpOnCountPerform)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDrawFlags & event)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return true;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync return CR_SERVER_DUMP_DEFAULT_FILTER_OP(event);
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync}
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncbool crServerDumpFilterDmp(unsigned long event, CR_DUMPER *pDumper)
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDumpOnCountPerform)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g_CrDbgDumpDrawFlags & event)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return true;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync return CR_SERVER_DUMP_DEFAULT_FILTER_DMP(event);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncvoid crServerDumpFramesCheck()
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync{
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (!g_CrDbgDumpDrawFramesCount)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (!g_CrDbgDumpDrawFramesAppliedSettings)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (!g_CrDbgDumpDrawFramesSettings)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crWarning("g_CrDbgDumpDrawFramesSettings is NULL, bump will not be started");
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesCount = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesSavedInitSettings = g_CrDbgDumpDraw;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesAppliedSettings = g_CrDbgDumpDrawFramesSettings;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDraw = g_CrDbgDumpDrawFramesSettings;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crDmpStrF(cr_server.Recorder.pDumper, "***Starting draw dump for %d frames, settings(0x%x)", g_CrDbgDumpDrawFramesCount, g_CrDbgDumpDraw);
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync return;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync --g_CrDbgDumpDrawFramesCount;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync if (!g_CrDbgDumpDrawFramesCount)
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync {
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync crDmpStrF(cr_server.Recorder.pDumper, "***Stop draw dump");
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDraw = g_CrDbgDumpDrawFramesSavedInitSettings;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync g_CrDbgDumpDrawFramesAppliedSettings = 0;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync }
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#endif
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncGLvoid crServerSpriteCoordReplEnable(GLboolean fEnable)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CRContext *g = crStateGetCurrent();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CRTextureState *t = &(g->texture);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLuint curTextureUnit = t->curTextureUnit;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLuint curTextureUnitRestore = curTextureUnit;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLuint i;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync for (i = 0; i < g->limits.maxTextureUnits; ++i)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (g->point.coordReplacement[i])
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (i != curTextureUnit)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync curTextureUnit = i;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.ActiveTextureARB( i + GL_TEXTURE0_ARB );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.TexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, (GLint)fEnable);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (curTextureUnit != curTextureUnitRestore)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.ActiveTextureARB( curTextureUnitRestore + GL_TEXTURE0_ARB );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncGLvoid SERVER_DISPATCH_APIENTRY crServerDispatchDrawArrays(GLenum mode, GLint first, GLsizei count)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#ifdef DEBUG
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLenum status = cr_server.head_spu->dispatch_table.CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync Assert(GL_FRAMEBUFFER_COMPLETE == status);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#endif
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_TRUE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_ENTER();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.DrawArrays(mode, first, count););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_LEAVE();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_FALSE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncGLvoid SERVER_DISPATCH_APIENTRY crServerDispatchDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#ifdef DEBUG
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLenum status = cr_server.head_spu->dispatch_table.CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync Assert(GL_FRAMEBUFFER_COMPLETE == status);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#endif
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_TRUE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_ENTER();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.DrawElements(mode, count, type, indices););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_LEAVE();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_FALSE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchEnd( void )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CRContext *g = crStateGetCurrent();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLenum mode = g->current.mode;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateEnd();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.End();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_LEAVE();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_FALSE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchBegin(GLenum mode)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#ifdef DEBUG
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CRContext *ctx = crStateGetCurrent();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync SPUDispatchTable *gl = &cr_server.head_spu->dispatch_table;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (ctx->program.vpProgramBinding)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync AssertRelease(ctx->program.currentVertexProgram);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (ctx->program.currentVertexProgram->isARBprogram)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLint pid=-1;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync gl->GetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_BINDING_ARB, &pid);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (pid != ctx->program.currentVertexProgram->id)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crWarning("pid(%d) != ctx->program.currentVertexProgram->id(%d)", pid, ctx->program.currentVertexProgram->id);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync AssertRelease(pid == ctx->program.currentVertexProgram->id);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLint pid=-1;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync gl->GetIntegerv(GL_VERTEX_PROGRAM_BINDING_NV, &pid);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (pid != ctx->program.currentVertexProgram->id)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crWarning("pid(%d) != ctx->program.currentVertexProgram->id(%d)", pid, ctx->program.currentVertexProgram->id);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync AssertRelease(pid == ctx->program.currentVertexProgram->id);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else if (ctx->glsl.activeProgram)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLint pid=-1;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync gl->GetIntegerv(GL_CURRENT_PROGRAM, &pid);
e9a504e217664530ddff7987a6196cb55fb32274vboxsync //crDebug("pid %i, state: id %i, hwid %i", pid, ctx->glsl.activeProgram->id, ctx->glsl.activeProgram->hwid);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (pid != ctx->glsl.activeProgram->hwid)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crWarning("pid(%d) != ctx->glsl.activeProgram->hwid(%d)", pid, ctx->glsl.activeProgram->hwid);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync AssertRelease(pid == ctx->glsl.activeProgram->hwid);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync }
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync#endif
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (mode == GL_POINTS)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerSpriteCoordReplEnable(GL_TRUE);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_SERVER_DUMP_DRAW_ENTER();
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateBegin(mode);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.Begin(mode);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync