server_texture.c revision a399af7c964fd519318bb906a1274e720943a4c1
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync/* $Id$ */
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync/** @file
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * VBox crOpenGL: teximage functions.
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync */
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync/*
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * Copyright (C) 2010 Oracle Corporation
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync *
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * available from http://www.virtualbox.org. This file is free software;
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * you can redistribute it and/or modify it under the terms of the GNU
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * General Public License (GPL) as published by the Free Software
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync */
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#include "chromium.h"
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#include "cr_error.h"
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#include "server_dispatch.h"
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#include "server.h"
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#define CR_NOTHING()
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#define CR_CHECKPTR(name) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync if (!realptr) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync { \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync crWarning(#name " with NULL ptr, ignored!"); \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync return; \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync }
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#if !defined(CR_STATE_NO_TEXTURE_IMAGE_STORE)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync# define CR_FIXPTR() (uintptr_t) realptr += (uintptr_t) cr_server.head_spu->dispatch_table.MapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_ONLY_ARB)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#else
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync# define CR_FIXPTR()
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#endif
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#if defined(CR_ARB_pixel_buffer_object)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync# define CR_CHECKBUFFER(name, checkptr) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync { \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync CR_FIXPTR(); \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync } \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync else \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync { \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync checkptr \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync }
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#else
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync# define CR_CHECKBUFFER(name, checkptr) checkptr
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#endif
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#if defined(CR_ARB_pixel_buffer_object) && !defined(CR_STATE_NO_TEXTURE_IMAGE_STORE)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync# define CR_FINISHBUFFER() \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync { \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync if (!cr_server.head_spu->dispatch_table.UnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync { \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync crWarning("UnmapBufferARB failed"); \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync } \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync }
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#else
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#define CR_FINISHBUFFER()
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#endif
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync#define CR_FUNC_SUBIMAGE(name, def, call, ptrname) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncvoid SERVER_DISPATCH_APIENTRY \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsynccrServerDispatch##name##def \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync{ \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync const GLvoid *realptr = ptrname; \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync CR_CHECKBUFFER(name, CR_CHECKPTR(name)) \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync crState##name##call; \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync CR_FINISHBUFFER() \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync realptr = ptrname; \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync cr_server.head_spu->dispatch_table.##name##call; \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync}
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync#define CR_FUNC_IMAGE(name, def, call, ptrname) \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsyncvoid SERVER_DISPATCH_APIENTRY \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsynccrServerDispatch##name##def \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync{ \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync const GLvoid *realptr = ptrname; \
710d24589d0cbe0ea6e9ad143eda5bbd41000693vboxsync CR_CHECKBUFFER(name, CR_NOTHING()) \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync crState##name##call; \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync CR_FINISHBUFFER() \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync realptr = ptrname; \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync cr_server.head_spu->dispatch_table.##name##call; \
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync}
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#if defined(CR_ARB_texture_compression)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage1DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, width, format, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage2DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, yoffset, width, height, format, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(CompressedTexSubImage3DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_IMAGE(CompressedTexImage1DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, internalFormat, width, border, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_IMAGE(CompressedTexImage2DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, internalFormat, width, height, border, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_IMAGE(CompressedTexImage3DARB,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imagesize, const GLvoid * data),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, internalFormat, width, height, depth, border, imagesize, realptr), data)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync#endif
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(TexSubImage1D,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, width, format, type, realptr), pixels)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(TexSubImage2D,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, yoffset, width, height, format, type, realptr), pixels)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsyncCR_FUNC_SUBIMAGE(TexSubImage3D,
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, realptr), pixels)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsyncCR_FUNC_IMAGE(TexImage1D,
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, internalFormat, width, border, format, type, realptr), pixels)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsyncCR_FUNC_IMAGE(TexImage2D,
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync (target, level, internalFormat, width, height, border, format, type, realptr), pixels)
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsyncCR_FUNC_IMAGE(TexImage3D,
8d82d07fc2f7234b1e5a3ba544e1086a5a7a7c5fvboxsync (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels),
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync (target, level, internalFormat, width, height, depth, border, format, type, realptr), pixels)
73045e3d71f04f3d399e70e89fbd6395c4402821vboxsync