Skip to content

Commit

Permalink
almost everything needed to support opengl on win32:
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
totaam committed Dec 25, 2012
1 parent 4c41ef7 commit 51625fe
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 48 deletions.
17 changes: 3 additions & 14 deletions src/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 ):
Expand Down
76 changes: 76 additions & 0 deletions src/xpra/gl/gl_check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# This file is part of Parti.
# Copyright (C) 2012 Serviware (Arthur Huillet, <ahuillet@serviware.com>)
# Copyright (C) 2012 Antoine Martin <antoine@devloop.org.uk>
# 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)
37 changes: 3 additions & 34 deletions src/xpra/gl/gl_client_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down

0 comments on commit 51625fe

Please sign in to comment.