a399af7c964fd519318bb906a1274e720943a4c1vboxsync/* $Id$ */
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync/** @file
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * VBox crOpenGL: teximage functions.
a399af7c964fd519318bb906a1274e720943a4c1vboxsync */
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync/*
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * Copyright (C) 2010 Oracle Corporation
a399af7c964fd519318bb906a1274e720943a4c1vboxsync *
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * available from http://www.virtualbox.org. This file is free software;
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * General Public License (GPL) as published by the Free Software
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a399af7c964fd519318bb906a1274e720943a4c1vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a399af7c964fd519318bb906a1274e720943a4c1vboxsync */
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#include "chromium.h"
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#include "cr_error.h"
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#include "server_dispatch.h"
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#include "server.h"
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync#include "cr_mem.h"
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_NOTHING()
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_CHECKPTR(name) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync if (!realptr) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync { \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync crWarning(#name " with NULL ptr, ignored!"); \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync return; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync }
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#if !defined(CR_STATE_NO_TEXTURE_IMAGE_STORE)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync# define CR_FIXPTR() (uintptr_t) realptr += (uintptr_t) cr_server.head_spu->dispatch_table.MapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_ONLY_ARB)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#else
a399af7c964fd519318bb906a1274e720943a4c1vboxsync# define CR_FIXPTR()
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#endif
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#if defined(CR_ARB_pixel_buffer_object)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync# define CR_CHECKBUFFER(name, checkptr) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync { \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_FIXPTR(); \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync } \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync else \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync { \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync checkptr \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync }
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#else
a399af7c964fd519318bb906a1274e720943a4c1vboxsync# define CR_CHECKBUFFER(name, checkptr) checkptr
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#endif
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#if defined(CR_ARB_pixel_buffer_object) && !defined(CR_STATE_NO_TEXTURE_IMAGE_STORE)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync# define CR_FINISHBUFFER() \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync { \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync if (!cr_server.head_spu->dispatch_table.UnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync { \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync crWarning("UnmapBufferARB failed"); \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync } \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync }
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#else
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_FINISHBUFFER()
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#endif
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_FUNC_SUBIMAGE(name, def, call, ptrname) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncvoid SERVER_DISPATCH_APIENTRY \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsynccrServerDispatch##name def \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync{ \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync const GLvoid *realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_CHECKBUFFER(name, CR_CHECKPTR(name)) \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsync crState##name call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_FINISHBUFFER() \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync realptr = ptrname; \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsync cr_server.head_spu->dispatch_table.name call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync}
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_FUNC_IMAGE(name, def, call, ptrname) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncvoid SERVER_DISPATCH_APIENTRY \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsynccrServerDispatch##name def \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync{ \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync const GLvoid *realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_CHECKBUFFER(name, CR_NOTHING()) \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsync crState##name call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_FINISHBUFFER() \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync realptr = ptrname; \
f0710dd411f9359a72793d021d3a3e21ce2ca33avboxsync cr_server.head_spu->dispatch_table.name call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync}
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#if defined(CR_ARB_texture_compression)
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage1DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, width, format, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage2DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, yoffset, width, height, format, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage3DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(CompressedTexImage1DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, border, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(CompressedTexImage2DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, height, border, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(CompressedTexImage3DARB,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imagesize, const GLvoid * data),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, height, depth, border, imagesize, realptr), data)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#endif
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(TexSubImage1D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, width, format, type, realptr), pixels)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(TexSubImage2D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, yoffset, width, height, format, type, realptr), pixels)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_SUBIMAGE(TexSubImage3D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, realptr), pixels)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(TexImage1D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, border, format, type, realptr), pixels)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(TexImage2D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, height, border, format, type, realptr), pixels)
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncCR_FUNC_IMAGE(TexImage3D,
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
a399af7c964fd519318bb906a1274e720943a4c1vboxsync (target, level, internalFormat, width, height, depth, border, format, type, realptr), pixels)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchTexEnvf( GLenum target, GLenum pname, GLfloat param )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateTexEnvf( target, pname, param );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.TexEnvf( target, pname, param ););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchTexEnvfv( GLenum target, GLenum pname, const GLfloat * params )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateTexEnvfv( target, pname, params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.TexEnvfv( target, pname, params ););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchTexEnvi( GLenum target, GLenum pname, GLint param )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateTexEnvi( target, pname, param );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.TexEnvi( target, pname, param ););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchTexEnviv( GLenum target, GLenum pname, const GLint * params )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateTexEnviv( target, pname, params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync CR_GLERR_CHECK(cr_server.head_spu->dispatch_table.TexEnviv( target, pname, params ););
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetTexEnvfv( GLenum target, GLenum pname, GLfloat * params )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLfloat local_params[4];
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync (void) params;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.GetTexEnvfv( target, pname, local_params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateGetTexEnvfv( target, pname, local_params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerReturnValue( &(local_params[0]), crStateHlpComponentsCount(pname)*sizeof (GLfloat) );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetTexEnviv( GLenum target, GLenum pname, GLint * params )
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync GLint local_params[4];
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync (void) params;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (GL_POINT_SPRITE != target && pname != GL_COORD_REPLACE)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync cr_server.head_spu->dispatch_table.GetTexEnviv( target, pname, local_params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crStateGetTexEnviv( target, pname, local_params );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crServerReturnValue( &(local_params[0]), crStateHlpComponentsCount(pname)*sizeof (GLint) );
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchBindTexture( GLenum target, GLuint texture )
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync{
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crStateBindTexture( target, texture );
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync cr_server.head_spu->dispatch_table.BindTexture(target, crStateGetTextureHWID(texture));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchDeleteTextures( GLsizei n, const GLuint *textures)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync{
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLint i;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync if (!newTextures)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crError("crServerDispatchDeleteTextures: out of memory");
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync return;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync for (i = 0; i < n; i++)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync newTextures[i] = crStateGetTextureHWID(textures[i]);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync// for (i = 0; i < n; ++i)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync// {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync// crDebug("DeleteTexture: %d, pid %d, ctx %d", textures[i], (uint32_t)cr_server.curClient->pid, cr_server.currentCtxInfo->pContext->id);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync// }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crStateDeleteTextures(n, textures);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync cr_server.head_spu->dispatch_table.DeleteTextures(n, newTextures);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crFree(newTextures);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchPrioritizeTextures( GLsizei n, const GLuint * textures, const GLclampf * priorities )
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync{
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLint i;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync if (!newTextures)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crError("crServerDispatchDeleteTextures: out of memory");
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync return;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crStatePrioritizeTextures(n, textures, priorities);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync for (i = 0; i < n; i++)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync newTextures[i] = crStateGetTextureHWID(textures[i]);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync cr_server.head_spu->dispatch_table.PrioritizeTextures(n, newTextures, priorities);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crFree(newTextures);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync/*@todo will fail for textures loaded from snapshot */
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsyncGLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsTexture( GLuint texture )
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync{
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLboolean retval;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync retval = cr_server.head_spu->dispatch_table.IsTexture(crStateGetTextureHWID(texture));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crServerReturnValue( &retval, sizeof(retval) );
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync return retval; /* WILL PROBABLY BE IGNORED */
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsyncGLboolean SERVER_DISPATCH_APIENTRY
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsynccrServerDispatchAreTexturesResident(GLsizei n, const GLuint *textures,
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLboolean *residences)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync{
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLboolean retval;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLsizei i;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLboolean *res = (GLboolean *) crAlloc(n * sizeof(GLboolean));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync GLuint *textures2 = (GLuint *) crAlloc(n * sizeof(GLuint));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync (void) residences;
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync for (i = 0; i < n; i++)
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync {
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync textures2[i] = crStateGetTextureHWID(textures[i]);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync }
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync retval = cr_server.head_spu->dispatch_table.AreTexturesResident(n, textures2, res);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crFree(textures2);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crServerReturnValue(res, n * sizeof(GLboolean));
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync crFree(res);
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync return retval; /* WILL PROBABLY BE IGNORED */
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync}
f3e7d9f629952c2a40ea9788ba1d9b748131e26bvboxsync