VBoxOGLOp.h revision a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fc
/** @file
*/
/*
*
* Copyright (C) 2006-2007 innotek GmbH
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
#ifndef ___VBox_HostService_VBoxOGLOp_h
#define ___VBox_HostService_VBoxOGLOp_h
#ifdef VBOX_OGL_GUEST_SIDE
/************************************************************************************************************
* Guest side macro's for packing OpenGL function calls into the command buffer. *
* *
************************************************************************************************************/
#define OGL_CMD_END(op) \
#define VBOX_OGL_GEN_OP(op) \
OGL_CMD(op, 8, sizeof(p1)+sizeof(p2)+sizeof(p3)+sizeof(p4)+sizeof(p5)+sizeof(p6)+sizeof(p7)+sizeof(p8)); \
/* last parameter is a memory block */
OGL_CMD(op, 8, sizeof(p1)+sizeof(p2)+sizeof(p3)+sizeof(p4)+sizeof(p5)+sizeof(p6)+sizeof(p7)+size); \
OGL_CMD(op, 9, sizeof(p1)+sizeof(p2)+sizeof(p3)+sizeof(p4)+sizeof(p5)+sizeof(p6)+sizeof(p7)+sizeof(p8)+size); \
OGL_CMD(op, 10, sizeof(p1)+sizeof(p2)+sizeof(p3)+sizeof(p4)+sizeof(p5)+sizeof(p6)+sizeof(p7)+sizeof(p8)+sizeof(p9)+size); \
/* two memory blocks */
/* Note: sync operations always set the last error */
/* sync operation that returns a value */
#define VBOX_OGL_GEN_SYNC_OP(op) \
VBoxOGLFlush();
VBoxOGLFlush();
VBoxOGLFlush();
/* Sync operation whose last parameter is a block of memory */
VBoxOGLFlush();
VBoxOGLFlush();
VBoxOGLFlush();
VBoxOGLFlush();
/* Sync operation whose last parameter is a block of memory in which results are returned */
VBOX_OGL_GEN_OP(op); \
/* Sync operation whose last parameter is a block of memory and return a value */
/* Sync operation whose last parameter is a block of memory in which results are returned and return a value */
/* Generate async functions elements in the command queue */
#define GL_GEN_FUNC(Function) \
{ \
}
{ \
VBOX_OGL_GEN_OP1(Function, a); \
}
{ \
VBOX_OGL_GEN_OP1(Function, a); \
} \
{ \
VBOX_OGL_GEN_OP1(Function, v[0]); \
} \
{ \
VBOX_OGL_GEN_OP2(Function, a, b); \
}
{ \
VBOX_OGL_GEN_OP2(Function, a, b); \
} \
{ \
} \
{ \
VBOX_OGL_GEN_OP3(Function, a, b, c); \
}
{ \
VBOX_OGL_GEN_OP3(Function, a, b, c); \
} \
{ \
} \
{ \
VBOX_OGL_GEN_OP4(Function, a, b, c, d); \
}
{ \
VBOX_OGL_GEN_OP4(Function, a, b, c, d); \
} \
{ \
} \
{ \
VBOX_OGL_GEN_OP6(Function, a, b, c, d, e, f); \
}
{ \
VBOX_OGL_GEN_OP2(Function, a, b); \
}
{ \
VBOX_OGL_GEN_OP2(Function, a, b); \
} \
{ \
} \
{ \
VBOX_OGL_GEN_OP3(Function, a, b, c); \
}
{ \
VBOX_OGL_GEN_OP3(Function, a, b, c); \
} \
{ \
} \
{ \
VBOX_OGL_GEN_OP4(Function, a, b, c, d); \
}
{ \
VBOX_OGL_GEN_OP5(Function, a, b, c, d, e); \
}
void APIENTRY VBOX_OGL_NAME_PREFIX(Function) (Type1 a, Type2 b, Type3 c, Type4 d, Type5 e, Type6 f) \
{ \
VBOX_OGL_GEN_OP6(Function, a, b, c, d, e, f); \
}
void APIENTRY VBOX_OGL_NAME_PREFIX(Function) (Type1 a, Type2 b, Type3 c, Type4 d, Type5 e, Type6 f, Type7 g) \
{ \
VBOX_OGL_GEN_OP7(Function, a, b, c, d, e, f, g); \
}
void APIENTRY VBOX_OGL_NAME_PREFIX(Function) (Type1 a, Type2 b, Type3 c, Type4 d, Type5 e, Type6 f, Type7 g, Type8 h) \
{ \
VBOX_OGL_GEN_OP8(Function, a, b, c, d, e, f, g, h); \
}
#define GL_GEN_VPAR_FUNC9(Function, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8 ,Type9) \
void APIENTRY VBOX_OGL_NAME_PREFIX(Function) (Type1 a, Type2 b, Type3 c, Type4 d, Type5 e, Type6 f, Type7 g, Type8 h, Type9 i) \
{ \
VBOX_OGL_GEN_OP9(Function, a, b, c, d, e, f, g, h, i); \
}
/************************************************************************************************************
* Host side macro's for generating OpenGL function calls from the packed commands in the command buffer. *
* *
************************************************************************************************************/
#ifdef VBOX_OGL_CMD_STRICT
#else
#define VBOX_OGL_CHECK_MAGIC(pParVal)
#endif
else \
else \
#define VBOX_OGL_GEN_OP(op) \
/* last parameter is a memory block */
#define VBOX_OGL_GEN_OP10PTR(op, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, Type10) \
/* two memory blocks */
/* Note: sync operations always set the last error */
/* sync operation that returns a value */
#define VBOX_OGL_GEN_SYNC_OP(op) \
/* Sync operation whose last parameter is a block of memory */
/* Sync operation whose last parameter is a block of memory in which results are returned */
/* Sync operation whose last parameter is a block of memory and returns a value */
#define VBOX_OGL_GEN_SYNC_OP7_PTR_RET(rettype, op, Type1, Type2, Type3, Type4, Type5, Type6, Type7) \
/* Generate async functions elements in the command queue */
#define GL_GEN_FUNC(Function) \
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
#define GL_GEN_VPAR_FUNC9(Function, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8 ,Type9) \
{ \
}
#endif /* VBOX_OGL_HOST_SIDE */
/* OpenGL opcodes */
/* Note: keep all three tables in sync! */
typedef enum
{
VBOX_OGL_OP_Illegal = 0,
/* Windows ICD exports */
/* OpenGL Extensions */
VBOX_OGL_OP_SizeHack = 0x7fffffff
} VBOX_OGL_OP;
#if defined(DEBUG) && defined(VBOX_OGL_WITH_CMD_STRINGS)
static const char *pszVBoxOGLCmd[VBOX_OGL_OP_Last] =
{
"ILLEGAL",
"glArrayElement",
"glBegin",
"glBindTexture",
"glBlendFunc",
"glCallList",
"glColor3b",
"glColor3d",
"glColor3f",
"glColor3i",
"glColor3s",
"glColor3ub",
"glColor3ui",
"glColor3us",
"glColor4b",
"glColor4d",
"glColor4f",
"glColor4i",
"glColor4s",
"glColor4ub",
"glColor4ui",
"glColor4us",
"glClear",
"glClearAccum",
"glClearColor",
"glClearDepth",
"glClearIndex",
"glClearStencil",
"glAccum",
"glAlphaFunc",
"glVertex2d",
"glVertex2f",
"glVertex2i",
"glVertex2s",
"glVertex3d",
"glVertex3f",
"glVertex3i",
"glVertex3s",
"glVertex4d",
"glVertex4f",
"glVertex4i",
"glVertex4s",
"glTexCoord1d",
"glTexCoord1f",
"glTexCoord1i",
"glTexCoord1s",
"glTexCoord2d",
"glTexCoord2f",
"glTexCoord2i",
"glTexCoord2s",
"glTexCoord3d",
"glTexCoord3f",
"glTexCoord3i",
"glTexCoord3s",
"glTexCoord4d",
"glTexCoord4f",
"glTexCoord4i",
"glTexCoord4s",
"glNormal3b",
"glNormal3d",
"glNormal3f",
"glNormal3i",
"glNormal3s",
"glRasterPos2d",
"glRasterPos2f",
"glRasterPos2i",
"glRasterPos2s",
"glRasterPos3d",
"glRasterPos3f",
"glRasterPos3i",
"glRasterPos3s",
"glRasterPos4d",
"glRasterPos4f",
"glRasterPos4i",
"glRasterPos4s",
"glEvalCoord1d",
"glEvalCoord1f",
"glEvalCoord2d",
"glEvalCoord2f",
"glEvalPoint1",
"glEvalPoint2",
"glIndexd",
"glIndexf",
"glIndexi",
"glIndexs",
"glIndexub",
"glRotated",
"glRotatef",
"glScaled",
"glScalef",
"glTranslated",
"glTranslatef",
"glDepthFunc",
"glDepthMask",
"glFinish",
"glFlush",
"glDeleteLists",
"glCullFace",
"glDeleteTextures",
"glDepthRange",
"glDisableClientState",
"glEnableClientState",
"glEvalMesh1",
"glEvalMesh2",
"glFogf",
"glFogfv",
"glFogi",
"glFogiv",
"glLightModelf",
"glLightModelfv",
"glLightModeli",
"glLightModeliv",
"glLightf",
"glLightfv",
"glLighti",
"glLightiv",
"glLineStipple",
"glLineWidth",
"glListBase",
"glDrawArrays",
"glDrawBuffer",
"glEdgeFlag",
"glEnd",
"glEndList",
"glCopyTexImage1D",
"glCopyTexImage2D",
"glColorMaterial",
"glMateriali",
"glMaterialf",
"glMaterialfv",
"glMaterialiv",
"glPopAttrib",
"glPopClientAttrib",
"glPopMatrix",
"glPopName",
"glPushAttrib",
"glPushClientAttrib",
"glPushMatrix",
"glPushName",
"glReadBuffer",
"glTexGendv",
"glTexGenf",
"glTexGend",
"glTexGeni",
"glTexEnvi",
"glTexEnvf",
"glTexEnviv",
"glTexEnvfv",
"glTexGeniv",
"glTexGenfv",
"glTexParameterf",
"glTexParameteri",
"glTexParameterfv",
"glTexParameteriv",
"glLoadIdentity",
"glLoadName",
"glLoadMatrixd",
"glLoadMatrixf",
"glStencilFunc",
"glShadeModel",
"glStencilMask",
"glStencilOp",
"glScissor",
"glViewport",
"glRectd",
"glRectf",
"glRecti",
"glRects",
"glRectdv",
"glRectfv",
"glRectiv",
"glRectsv",
"glMultMatrixd",
"glMultMatrixf",
"glNewList",
"glHint",
"glIndexMask",
"glInitNames",
"glTexCoordPointer",
"glVertexPointer",
"glColorPointer",
"glEdgeFlagPointer",
"glIndexPointer",
"glNormalPointer",
"glPolygonStipple",
"glCallLists",
"glClipPlane",
"glFrustum",
"glGenTextures",
"glMap1d",
"glMap1f",
"glMap2d",
"glMap2f",
"glMapGrid1d",
"glMapGrid1f",
"glMapGrid2d",
"glMapGrid2f",
"glCopyPixels",
"glTexImage1D",
"glTexImage2D",
"glTexSubImage1D",
"glTexSubImage2D",
"glFeedbackBuffer",
"glSelectBuffer",
"glIsList",
"glIsTexture",
"glRenderMode",
"glReadPixels",
"glIsEnabled",
"glGenLists",
"glPixelTransferf",
"glPixelTransferi",
"glPixelZoom",
"glPixelStorei",
"glPixelStoref",
"glPixelMapfv",
"glPixelMapuiv",
"glPixelMapusv",
"glPointSize",
"glPolygonMode",
"glPolygonOffset",
"glPassThrough",
"glOrtho",
"glMatrixMode",
"glLogicOp",
"glColorMask",
"glCopyTexSubImage1D",
"glCopyTexSubImage2D",
"glFrontFace",
"glDisable",
"glEnable",
"glPrioritizeTextures",
"glGetBooleanv",
"glGetDoublev",
"glGetFloatv",
"glGetIntegerv",
"glGetLightfv",
"glGetLightiv",
"glGetMaterialfv",
"glGetMaterialiv",
"glGetPixelMapfv",
"glGetPixelMapuiv",
"glGetPixelMapusv",
"glGetTexEnviv",
"glGetTexEnvfv",
"glGetTexGendv",
"glGetTexGenfv",
"glGetTexGeniv",
"glGetTexParameterfv",
"glGetTexParameteriv",
"glGetClipPlane",
"glGetPolygonStipple",
"glGetTexLevelParameterfv",
"glGetTexLevelParameteriv",
"glGetTexImage",
/* Windows ICD exports */
"DrvReleaseContext",
"DrvCreateContext",
"DrvDeleteContext",
"DrvCopyContext",
"DrvSetContext",
"DrvCreateLayerContext",
"DrvShareLists",
"DrvDescribeLayerPlane",
"DrvSetLayerPaletteEntries",
"DrvGetLayerPaletteEntries",
"DrvRealizeLayerPalette",
"DrvSwapLayerBuffers",
"DrvDescribePixelFormat",
"DrvSetPixelFormat",
"DrvSwapBuffers",
/* OpenGL Extensions */
"wglSwapIntervalEXT",
"wglGetSwapIntervalEXT",
};
#endif
/* OpenGL function wrappers. */
{
NULL,
/* Windows ICD exports */
#ifdef RT_OS_WINDOWS
/* OpenGL Extensions */
#endif
};
#endif
typedef struct
{
const char *pszExtName;
const char *pszExtFunctionName;
#ifdef VBOX_OGL_GUEST_SIDE
#else
#endif
bool fAvailable;
} OPENGL_EXT, *POPENGL_EXT;
#ifdef VBOX_OGL_GUEST_SIDE
#define VBOX_OGL_EXTENSION(a) (RTUINTPTR)a
#else
#endif
static OPENGL_EXT OpenGLExtensions[] =
{
{ "WGL_EXT_swap_control", "wglGetSwapIntervalEXT", VBOX_OGL_EXTENSION(wglGetSwapIntervalEXT), false },
};
#endif /* VBOX_OGL_WITH_EXTENSION_ARRAY */
#endif