summaryrefslogtreecommitdiffstats
path: root/src/VBox/Additions/common/crOpenGL/entrypoints.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Additions/common/crOpenGL/entrypoints.py')
-rwxr-xr-xsrc/VBox/Additions/common/crOpenGL/entrypoints.py180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/VBox/Additions/common/crOpenGL/entrypoints.py b/src/VBox/Additions/common/crOpenGL/entrypoints.py
new file mode 100755
index 00000000..bdd93e75
--- /dev/null
+++ b/src/VBox/Additions/common/crOpenGL/entrypoints.py
@@ -0,0 +1,180 @@
+# Copyright (c) 2001, Stanford University
+# All rights reserved.
+#
+# See the file LICENSE.txt for information on redistributing this software.
+
+
+"""
+This module generates C entrypoints for all the OpenGL functions
+and the special Chromium meta/glue functions.
+"""
+
+
+from __future__ import print_function
+import sys
+
+import apiutil
+
+
+def GenerateEntrypoints(hacks = []):
+ """Emit code for all the OpenGL/Chromium entrypoints.
+ hacks is an optional list of functions which are special cased.
+ """
+
+ apiutil.CopyrightC()
+
+ print('#define GL_GLEXT_PROTOTYPES')
+ print('#include <stdio.h>')
+ print('#include <stdlib.h>')
+ print('#include <GL/gl.h>')
+ print('#include "chromium.h"')
+ print('#include "stub.h"')
+ print('#include "dri_glx.h"')
+ print('')
+ print('#ifdef __GNUC__')
+ print('# if (__GNUC__ << 16) + __GNUC_MINOR__ >= 0x40002')
+ print('# pragma GCC diagnostic ignored "-Wunused-parameter"')
+ print('# endif')
+ print('#endif')
+
+
+ # Get sorted list of dispatched functions.
+ # The order is very important - it must match cr_opcodes.h
+ # and spu_dispatch_table.h
+ keys = apiutil.GetDispatchedFunctions(sys.argv[1]+"/APIspec.txt")
+
+ for index in range(len(keys)):
+ func_name = keys[index]
+ if apiutil.Category(func_name) == "Chromium":
+ # this function is defined in stub.c
+ continue
+
+ return_type = apiutil.ReturnType(func_name)
+ params = apiutil.Parameters(func_name)
+
+ if func_name in hacks:
+ print("/* hacked entrypoint: %s */" % func_name)
+ if func_name == "TexImage3D":
+ # Pretty common: internalformat is GLenum, not GLint
+ print("void glTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels )")
+ print("{")
+ print("\tglim.TexImage3D( target, level, (GLint) internalformat, width, height, depth, border, format, type, pixels );")
+ print("}")
+ elif func_name == "TexImage2D":
+ # Pretty common: internalformat is GLenum, not GLint
+ print("void glTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels )")
+ print("{")
+ print("\tglim.TexImage2D( target, level, (GLint) internalformat, width, height, border, format, type, pixels );")
+ print("}")
+ elif func_name == "TexImage1D":
+ # Pretty common: internalformat is GLenum, not GLint
+ print("void glTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels )")
+ print("{")
+ print("\tglim.TexImage1D( target, level, (GLint) internalformat, width, border, format, type, pixels );")
+ print("}")
+ elif func_name == "EdgeFlagPointer":
+ # second arg is GLboolean instead of GLvoid
+ print("void glEdgeFlagPointer( GLsizei stride, const GLboolean *pointer )")
+ print("{")
+ print("\tglim.EdgeFlagPointer( stride, pointer );")
+ print("}")
+ elif func_name == "ProgramParameters4fvNV":
+ print("void glProgramParameters4fvNV( GLenum target, GLuint index, GLuint num, const GLfloat *params )")
+ print("{")
+ print("\tglim.ProgramParameters4fvNV( target, index, num, params );")
+ print("}")
+ elif func_name == "MultiDrawElementsEXT":
+ print("void glMultiDrawElementsEXT(GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount)")
+ print("{")
+ print("\tglim.MultiDrawElementsEXT(mode, count,type, indices, primcount);")
+ print("}")
+ elif func_name == "ProgramParameters4dvNV":
+ print("void glProgramParameters4dvNV( GLenum target, GLuint index, GLuint num, const GLdouble *params )")
+ print("{")
+ print("\tglim.ProgramParameters4dvNV( target, index, num, params );")
+ print("}")
+ else:
+ # the usual path
+ print("%s VBOXGLTAG(gl%s)(%s);" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("")
+ print("%s VBOXGLTAG(gl%s)(%s)" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("{")
+ print("\t", end="")
+ if return_type != "void":
+ print("return ", end=" ")
+ print("glim.%s(%s);" % (func_name, apiutil.MakeCallString(params)))
+ print("}")
+ print("")
+
+ print('/*')
+ print('* Aliases')
+ print('*/')
+
+ # Now loop over all the functions and take care of any aliases
+ allkeys = apiutil.GetAllFunctions(sys.argv[1]+"/APIspec.txt")
+ for func_name in allkeys:
+ if "omit" in apiutil.ChromiumProps(func_name):
+ continue
+
+ if func_name in keys:
+ # we already processed this function earlier
+ continue
+
+ # alias is the function we're aliasing
+ alias = apiutil.Alias(func_name)
+ if alias:
+ if func_name in hacks:
+ print("/* hacked entrypoint: %s */" % func_name)
+ if func_name == "MultiDrawArrays":
+ print("void glMultiDrawArrays( GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount )")
+ print("{")
+ print("\tglim.MultiDrawArraysEXT( mode, (GLint*)first, (GLsizei*)count, primcount );")
+ print("}")
+ elif func_name == "BufferData":
+ print("void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)")
+ print("{")
+ print("\tglim.BufferDataARB(target, size, data, usage);")
+ print("}")
+ elif func_name == "BufferSubData":
+ print("void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)")
+ print("{")
+ print("\tglim.BufferSubDataARB(target, offset, size, data);")
+ print("}")
+ elif func_name == "GetBufferSubData":
+ print("void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)")
+ print("{")
+ print("\tglim.GetBufferSubDataARB(target, offset, size, data);")
+ print("}")
+ else:
+ return_type = apiutil.ReturnType(func_name)
+ params = apiutil.Parameters(func_name)
+ print("%s VBOXGLTAG(gl%s)(%s);" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("")
+ print("%s VBOXGLTAG(gl%s)(%s)" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("{")
+ print("\t", end="")
+ if return_type != "void":
+ print("return ", end=" ")
+ print("glim.%s(%s);" % (alias, apiutil.MakeCallString(params)))
+ print("}")
+ print("")
+
+ print('/*')
+ print('* No-op stubs')
+ print('*/')
+
+ # Now generate no-op stub functions
+ for func_name in allkeys:
+ if "stub" in apiutil.ChromiumProps(func_name):
+ return_type = apiutil.ReturnType(func_name)
+ params = apiutil.Parameters(func_name)
+
+ print("%s VBOXGLTAG(gl%s)(%s);" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("")
+ print("%s VBOXGLTAG(gl%s)(%s)" % (return_type, func_name, apiutil.MakeDeclarationString(params)))
+ print("{")
+ if return_type != "void":
+ print("return (%s) 0" % return_type)
+ print("}")
+ print("")
+