-
Notifications
You must be signed in to change notification settings - Fork 342
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9e0447d
commit 5c5b014
Showing
8 changed files
with
217 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +0,0 @@ | ||
from .framework import * | ||
from .render import * | ||
from .cam_render import * | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
"""Headless GPU-accelerated OpenGL context creation on Google Colaboratory. | ||
Typical usage: | ||
# Optional PyOpenGL configuratiopn can be done here. | ||
# import OpenGL | ||
# OpenGL.ERROR_CHECKING = True | ||
# 'glcontext' must be imported before any OpenGL.* API. | ||
from lucid.misc.gl.glcontext import create_opengl_context | ||
# Now it's safe to import OpenGL and EGL functions | ||
import OpenGL.GL as gl | ||
# create_opengl_context() creates a GL context that is attached to an | ||
# offscreen surface of the specified size. Note that rendering to buffers | ||
# of other sizes and formats is still possible with OpenGL Framebuffers. | ||
# | ||
# Users are expected to directly use the EGL API in case more advanced | ||
# context management is required. | ||
width, height = 640, 480 | ||
create_opengl_context((width, height)) | ||
# OpenGL context is available here. | ||
""" | ||
|
||
from __future__ import print_function | ||
|
||
# pylint: disable=unused-import,g-import-not-at-top,g-statement-before-imports | ||
|
||
try: | ||
import OpenGL | ||
except: | ||
print('This module depends on PyOpenGL.') | ||
print('Please run "\033[1m!pip install -q pyopengl\033[0m" ' | ||
'prior importing this module.') | ||
raise | ||
|
||
import ctypes | ||
from ctypes import pointer, util | ||
import os | ||
|
||
os.environ['PYOPENGL_PLATFORM'] = 'egl' | ||
|
||
# OpenGL loading workaround. | ||
# | ||
# * PyOpenGL tries to load libGL, but we need libOpenGL, see [1,2]. | ||
# This could have been solved by a symlink libGL->libOpenGL, but: | ||
# | ||
# * Python 2.7 can't find libGL and linEGL due to a bug (see [3]) | ||
# in ctypes.util, that was only wixed in Python 3.6. | ||
# | ||
# So, the only solution I've found is to monkeypatch ctypes.util | ||
# [1] https://devblogs.nvidia.com/egl-eye-opengl-visualization-without-x-server/ | ||
# [2] https://devblogs.nvidia.com/linking-opengl-server-side-rendering/ | ||
# [3] https://bugs.python.org/issue9998 | ||
_find_library_old = ctypes.util.find_library | ||
try: | ||
|
||
def _find_library_new(name): | ||
return { | ||
'GL': 'libOpenGL.so', | ||
'EGL': 'libEGL.so', | ||
}.get(name, _find_library_old(name)) | ||
util.find_library = _find_library_new | ||
import OpenGL.GL as gl | ||
import OpenGL.EGL as egl | ||
except: | ||
print('Unable to load OpenGL libraries. ' | ||
'Make sure you use GPU-enabled backend.') | ||
print('Press "Runtime->Change runtime type" and set ' | ||
'"Hardware accelerator" to GPU.') | ||
raise | ||
finally: | ||
util.find_library = _find_library_old | ||
|
||
|
||
def create_opengl_context(surface_size=(640, 480)): | ||
"""Create offscreen OpenGL context and make it current. | ||
Users are expected to directly use EGL API in case more advanced | ||
context management is required. | ||
Args: | ||
surface_size: (width, height), size of the offscreen rendering surface. | ||
""" | ||
egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) | ||
|
||
major, minor = egl.EGLint(), egl.EGLint() | ||
egl.eglInitialize(egl_display, pointer(major), pointer(minor)) | ||
|
||
config_attribs = [ | ||
egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT, egl.EGL_BLUE_SIZE, 8, | ||
egl.EGL_GREEN_SIZE, 8, egl.EGL_RED_SIZE, 8, egl.EGL_DEPTH_SIZE, 24, | ||
egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT, egl.EGL_NONE | ||
] | ||
config_attribs = (egl.EGLint * len(config_attribs))(*config_attribs) | ||
|
||
num_configs = egl.EGLint() | ||
egl_cfg = egl.EGLConfig() | ||
egl.eglChooseConfig(egl_display, config_attribs, pointer(egl_cfg), 1, | ||
pointer(num_configs)) | ||
|
||
width, height = surface_size | ||
pbuffer_attribs = [ | ||
egl.EGL_WIDTH, | ||
width, | ||
egl.EGL_HEIGHT, | ||
height, | ||
egl.EGL_NONE, | ||
] | ||
pbuffer_attribs = (egl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs) | ||
egl_surf = egl.eglCreatePbufferSurface(egl_display, egl_cfg, pbuffer_attribs) | ||
|
||
egl.eglBindAPI(egl.EGL_OPENGL_API) | ||
|
||
egl_context = egl.eglCreateContext(egl_display, egl_cfg, egl.EGL_NO_CONTEXT, | ||
None) | ||
egl.eglMakeCurrent(egl_display, egl_surf, egl_surf, egl_context) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
_glut_window = None | ||
_context_inited = None | ||
|
||
def initialize_GL_context(width=512, height=512, egl=False): | ||
''' | ||
default context uses GLUT | ||
''' | ||
if not egl: | ||
import OpenGL.GLUT as GLUT | ||
display_mode = GLUT.GLUT_DOUBLE | GLUT.GLUT_RGB | GLUT.GLUT_DEPTH | ||
global _glut_window | ||
if _glut_window is None: | ||
GLUT.glutInit() | ||
GLUT.glutInitDisplayMode(display_mode) | ||
GLUT.glutInitWindowSize(width, height) | ||
GLUT.glutInitWindowPosition(0, 0) | ||
_glut_window = GLUT.glutCreateWindow("My Render.") | ||
else: | ||
from .glcontext import create_opengl_context | ||
global _context_inited | ||
if _context_inited is None: | ||
create_opengl_context((width, height)) | ||
_context_inited = True | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.