server_misc.c revision 32b624becaf56a356992d660b1618bd9be0c5b09
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"
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 }
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) {
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:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
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++;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 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);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 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);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 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;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync 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
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;
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:
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync crWarning("Recieved GL_HH_SET_DEFAULT_SHARED_CTX from guest, ignoring");
b57c052e6d9d432fa8b66fb33d373fc608d4d050vboxsync 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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsyncvoid 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);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync gl->FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target,
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid, level);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync status = gl->CheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync 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
88c504b1c053e580e42d5fc90ef2ccedc50c65bdvboxsync
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;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync Ctx.Base.visualBits = cr_server.MainContextInfo.CreateInfo.visualBits;
d7bd3e8bc4c337f385a92e0e5528525abba906c2vboxsync rc = CrBltInit(&cr_server.Blitter, &Ctx, true, true, NULL, &cr_server.head_spu->dispatch_table);
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 }
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return &cr_server.Blitter;
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync}
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync
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
7908c1b917ec64d28d80a506f7a1bc524cd2f212vboxsync if (!(mural->fPresentMode & CR_SERVER_REDIR_F_FBO))
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync return VERR_NOT_IMPLEMENTED;
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:
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("unsupported enum buf");
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 {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("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 {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("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 {
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync crWarning("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
f0b06b8e4de2a0d9ddb10ac0a30d68fafd73d8c1vboxsync CrBltMuralSetCurrent(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
f67af59f039fe962080af93e1f7dd5065250b2cfvboxsync rc = CrBltEnter(pBlitter, &Ctx, &BltInfo);
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
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsyncvoid SERVER_DISPATCH_APIENTRY
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsynccrServerDispatchBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
d7b582240fd84655df03ad70cf59ac764bf7cce7vboxsync 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 GLint curSrvSpuCtx = cr_server.currentCtxInfo && cr_server.currentCtxInfo->SpuContext > 0 ? cr_server.currentCtxInfo->SpuContext : cr_server.MainContextInfo.SpuContext;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync bool fSwitchToTmpCtx = (curSrvSpuCtx != context);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRMuralInfo *pCurrentMural = cr_server.currentMural;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync pCurCtx = pCurCtxInfo ? pCurCtxInfo->pContext : NULL;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CRASSERT(pCurCtx == pCtx);
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 fDoPrePostProcess = fSwitchToTmpCtx ? 1 : -1;
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{
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crSPUInitDispatchTable(&cr_server.TmpCtxDispatch);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crSPUCopyDispatchTable(&cr_server.TmpCtxDispatch, &cr_server.head_spu->dispatch_table);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.TmpCtxDispatch.MakeCurrent = crServerMakeTmpCtxCurrent;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync/* dump stuff */
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#ifdef VBOX_WITH_CRSERVER_DUMPER
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
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;
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncunsigned long g_CrDbgDumpDraw = CR_SERVER_DUMP_F_COMPILE_SHADER
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync | CR_SERVER_DUMP_F_LINK_PROGRAM
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
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync ; //CR_SERVER_DUMP_F_DRAW_BUFF_ENTER | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE;
2881ae582c193ac8e4dabe678ac5593c55ad7bd9vboxsyncunsigned long g_CrDbgDumpDrawFramesSettings = CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
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
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
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (CrBltIsInitialized(&cr_server.RecorderBlitter))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return VINF_SUCCESS;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync pBlitterMural = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.visualBits);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!pBlitterMural)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("crServerGetDummyMural failed");
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return VERR_GENERAL_FAILURE;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterWinInit(&BltWin, pBlitterMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterCtxInit(&BltCtx, &cr_server.MainContextInfo);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
d7bd3e8bc4c337f385a92e0e5528525abba906c2vboxsync rc = CrBltInit(&cr_server.RecorderBlitter, &BltCtx, true, true, NULL, &cr_server.TmpCtxDispatch);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!RT_SUCCESS(rc))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("CrBltInit failed rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return rc;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync rc = CrBltMuralSetCurrent(&cr_server.RecorderBlitter, &BltWin);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync if (!RT_SUCCESS(rc))
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync {
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crWarning("CrBltMuralSetCurrent failed rc %d", rc);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync return rc;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync }
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#if 0
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crDmpDbgPrintInit(&cr_server.DbgPrintDumper);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.pDumper = &cr_server.DbgPrintDumper.Base;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync#else
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crDmpHtmlInit(&cr_server.HtmlDumper, "S:\\projects\\virtualbox\\3d\\dumps\\1", "index.html");
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync cr_server.pDumper = &cr_server.HtmlDumper.Base;
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 CR_BLITTER_WINDOW BltWin;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CR_BLITTER_CONTEXT BltCtx;
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 crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterCtxInit(&BltCtx, pCtxInfo);
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
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecDumpBuffer(&cr_server.Recorder, ctx, &BltCtx, &BltWin, 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 CR_BLITTER_WINDOW BltWin;
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync CR_BLITTER_CONTEXT BltCtx;
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
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterWinInit(&BltWin, cr_server.currentMural);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crServerVBoxBlitterCtxInit(&BltCtx, pCtxInfo);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync crRecDumpTextures(&cr_server.Recorder, ctx, &BltCtx, &BltWin);
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync}
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncbool crServerDumpFilterOp(unsigned long event, CR_DUMPER *pDumper)
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync{
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync return CR_SERVER_DUMP_DEFAULT_FILTER_OP(event);
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync}
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsyncbool crServerDumpFilterDmp(unsigned long event, CR_DUMPER *pDumper)
81578c6df6541d965dcfe32dd0e0decb64a42284vboxsync{
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
28140a038e3e4b8a04d8f246a55fe206b130c204vboxsync/* */