server_texture.c revision a399af7c964fd519318bb906a1274e720943a4c1
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"
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 \
a399af7c964fd519318bb906a1274e720943a4c1vboxsynccrServerDispatch##name##def \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync{ \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync const GLvoid *realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_CHECKBUFFER(name, CR_CHECKPTR(name)) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync crState##name##call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_FINISHBUFFER() \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync cr_server.head_spu->dispatch_table.##name##call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync}
a399af7c964fd519318bb906a1274e720943a4c1vboxsync
a399af7c964fd519318bb906a1274e720943a4c1vboxsync#define CR_FUNC_IMAGE(name, def, call, ptrname) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsyncvoid SERVER_DISPATCH_APIENTRY \
a399af7c964fd519318bb906a1274e720943a4c1vboxsynccrServerDispatch##name##def \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync{ \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync const GLvoid *realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_CHECKBUFFER(name, CR_NOTHING()) \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync crState##name##call; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync CR_FINISHBUFFER() \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync realptr = ptrname; \
a399af7c964fd519318bb906a1274e720943a4c1vboxsync 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)