From 51625fe48f1d5ba2bbcbe13539cc12f3bd6277aa Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Tue, 25 Dec 2012 18:19:31 +0000 Subject: [PATCH] almost everything needed to support opengl on win32: * bundle OpenGL modules by hand (as py2exe makes a mess of it) * move openg support checks to dedicated class (and hack it for win32 using a temporary window..) still disabled by default in setup.py as it still does not work here (fragment program not supported error) - could be my vbox drivers though git-svn-id: https://xpra.org/svn/Xpra/trunk@2361 3bb7dfac-3a0b-4e04-842a-767bc560f471 --- src/setup.py | 17 ++------ src/xpra/gl/gl_check.py | 76 +++++++++++++++++++++++++++++++++ src/xpra/gl/gl_client_window.py | 37 ++-------------- 3 files changed, 82 insertions(+), 48 deletions(-) create mode 100644 src/xpra/gl/gl_check.py diff --git a/src/setup.py b/src/setup.py index 6b8498aecf..6ffd5209be 100755 --- a/src/setup.py +++ b/src/setup.py @@ -424,17 +424,6 @@ def add_to_PATH(bindir): "PIL", "win32con", "win32gui", "win32process", "win32api"] if opengl_ENABLED: - #import OpenGL.GL #@UnusedImport - #import OpenGL.platform.win32 #@UnusedImport - #import OpenGL_accelerate #@UnusedImport @UnresolvedImport - #py2exe_includes += ["OpenGL.platform.win32", "OpenGL.GL", - # "OpenGL_accelerate.formathandler", - # "OpenGL.GL.ARB.fragment_program", - # "OpenGL.arrays.ctypesarrays", "OpenGL.arrays.ctypesparameters", - # "OpenGL.arrays.numpymodule", "OpenGL.arrays.numeric", - # "OpenGL.arrays.nones", - # "OpenGL.arrays.vbo", - # "OpenGL.arrays.lists", "OpenGL.arrays.numbers", "OpenGL.arrays.strings"] py2exe_includes += ["ctypes", "platform"] py2exe_excludes += ["OpenGL", "OpenGL_accelerate"] #for this hack to work, you must add "." to the sys.path @@ -443,11 +432,11 @@ def add_to_PATH(bindir): import OpenGL import shutil print "*** copy PyOpenGL module ***" - opengl_dir = os.path.dirname( OpenGL.__file__ ) #@UndefinedVariable + opengl_dir = os.path.dirname(OpenGL.__file__ ) #@UndefinedVariable try: shutil.copytree( - opengl_dir, os.path.join( "dist", "OpenGL" ), - ignore = shutil.ignore_patterns( "*.py", "*.pyc", "GLUT", "Tk" ), + opengl_dir, os.path.join("dist", "OpenGL"), + ignore = shutil.ignore_patterns("Tk",) ) except WindowsError, error: #@UndefinedVariable if not "already exists" in str( error ): diff --git a/src/xpra/gl/gl_check.py b/src/xpra/gl/gl_check.py new file mode 100644 index 0000000000..81c5eb8d89 --- /dev/null +++ b/src/xpra/gl/gl_check.py @@ -0,0 +1,76 @@ +# This file is part of Parti. +# Copyright (C) 2012 Serviware (Arthur Huillet, ) +# Copyright (C) 2012 Antoine Martin +# Parti is released under the terms of the GNU GPL v2, or, at your option, any +# later version. See the file COPYING for details. + +from wimpiggy.log import Logger +log = Logger() + +import gtk.gdkgl, gtk.gtkgl #@UnresolvedImport +assert gtk.gdkgl is not None and gtk.gtkgl is not None + +#sanity checks: OpenGL version and fragment program support: +def check_GL_support(gldrawable, glcontext): + if not gldrawable.gl_begin(glcontext): + raise ImportError("gl_begin failed on %s" % gldrawable) + log("pygdkglext version=%s", gtk.gdkgl.pygdkglext_version) + log("pygdkglext OpenGL version=%s", gtk.gdkgl.query_version()) + try: + from OpenGL.GL import GL_VERSION + from OpenGL.GL import glGetString + gl_major = int(glGetString(GL_VERSION)[0]) + gl_minor = int(glGetString(GL_VERSION)[2]) + if gl_major<=1 and gl_minor<1: + raise ImportError("** OpenGL output requires OpenGL version 1.1 or greater, not %s.%s" % (gl_major, gl_minor)) + log("found valid OpenGL version: %s.%s", gl_major, gl_minor) + + #this allows us to do CSC via OpenGL: + #see http://www.opengl.org/registry/specs/ARB/fragment_program.txt + from OpenGL.GL.ARB.fragment_program import glInitFragmentProgramARB + if not glInitFragmentProgramARB(): + raise ImportError("OpenGL output requires glInitFragmentProgramARB") + finally: + gldrawable.gl_end() + +def check_support(): + try: + from gtk import gdk + assert gtk.gdkgl.query_extension() + + #tricks to get py2exe to include what we need / load it from its unusual path: + import sys, os + if sys.platform.startswith("win"): + log("has frozen: %s", hasattr(sys, "frozen")) + if hasattr(sys, "frozen"): + log("found frozen path: %s", sys.frozen) + if sys.frozen in ("windows_exe", "console_exe"): + main_dir = os.path.dirname(unicode(sys.executable, sys.getfilesystemencoding())) + log("main_dir=%s", main_dir) + sys.path.insert(0, main_dir) + os.chdir(main_dir) + else: + sys.path.insert(0, ".") + #FIXME: ugly win32 hack for getting a drawable and context, we must use a window... + w = gtk.Window() + glconfig = gtk.gdkgl.Config(mode=gtk.gdkgl.MODE_RGB|gtk.gdkgl.MODE_SINGLE) + glarea = gtk.gtkgl.DrawingArea(glconfig) + glarea.show() + w.add(glarea) + w.show() + gldrawable = glarea.get_gl_drawable() + glcontext = glarea.get_gl_context() + try: + check_GL_support(gldrawable, glcontext) + finally: + w.destroy() + del glcontext, gldrawable, glconfig + else: + glconfig = gtk.gdkgl.Config(mode=gtk.gdkgl.MODE_RGB|gtk.gdkgl.MODE_SINGLE) + glext = gtk.gdkgl.ext(gdk.Pixmap(gdk.get_default_root_window(), 1, 1)) + gldrawable = glext.set_gl_capability(glconfig) + glcontext = gtk.gdkgl.Context(gldrawable, direct=True) + check_GL_support(gldrawable, glcontext) + del glcontext, gldrawable, glext, glconfig + except Exception, e: + raise ImportError("** OpenGL initialization error: %s" % e) diff --git a/src/xpra/gl/gl_client_window.py b/src/xpra/gl/gl_client_window.py index 27a402c8d7..a1b72d9477 100644 --- a/src/xpra/gl/gl_client_window.py +++ b/src/xpra/gl/gl_client_window.py @@ -7,43 +7,12 @@ from wimpiggy.log import Logger log = Logger() +from xpra.gl.gl_check import check_support +check_support() + from xpra.client_window import ClientWindow from xpra.gl.gl_window_backing import GLPixmapBacking -import gtk.gdkgl, gtk.gtkgl #@UnresolvedImport -assert gtk.gdkgl is not None and gtk.gtkgl is not None - -from OpenGL.GL import GL_VERSION, glGetString -from OpenGL.GL.ARB.fragment_program import glInitFragmentProgramARB - -#sanity checks: OpenGL version -try: - from gtk import gdk - assert gtk.gdkgl.query_extension() - log("pygdkglext version=%s", gtk.gdkgl.pygdkglext_version) - log("pygdkglext OpenGL version=%s", gtk.gdkgl.query_version()) - glconfig = gtk.gdkgl.Config(mode=gtk.gdkgl.MODE_RGB|gtk.gdkgl.MODE_SINGLE) - glext = gtk.gdkgl.ext(gdk.Pixmap(gdk.get_default_root_window(), 1, 1)) - gldrawable = glext.set_gl_capability(glconfig) - glcontext = gtk.gdkgl.Context(gldrawable, direct=True) - if not gldrawable.gl_begin(glcontext): - raise ImportError("gl_begin failed on %s" % gldrawable) - try: - gl_major = int(glGetString(GL_VERSION)[0]) - gl_minor = int(glGetString(GL_VERSION)[2]) - if gl_major<=1 and gl_minor<1: - raise ImportError("** OpenGL output requires OpenGL version 1.1 or greater, not %s.%s" % (gl_major, gl_minor)) - log("found valid OpenGL: %s.%s", gl_major, gl_minor) - #this allows us to do CSC via OpenGL: - #see http://www.opengl.org/registry/specs/ARB/fragment_program.txt - if not glInitFragmentProgramARB(): - raise ImportError("** OpenGL output requires glInitFragmentProgramARB") - finally: - gldrawable.gl_end() - del glcontext, gldrawable, glext, glconfig -except Exception, e: - raise ImportError("** OpenGL initialization error: %s" % e) - class GLClientWindow(ClientWindow):