1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
"""EGL Pygame test framework"""
from __future__ import print_function
import os
if not os.environ.get( 'PYOPENGL_PLATFORM' ):
os.environ['PYOPENGL_PLATFORM'] = 'egl'
import ctypes
import pygame.display
import pygame
import logging
import OpenGL
from functools import wraps
if os.environ.get( 'TEST_NO_ACCELERATE' ):
OpenGL.USE_ACCELERATE = False
from OpenGL import arrays
from OpenGL.EGL import *
log = logging.getLogger( __name__ )
DESIRED_ATTRIBUTES = [
EGL_BLUE_SIZE, 8,
EGL_RED_SIZE,8,
EGL_GREEN_SIZE,8,
EGL_DEPTH_SIZE,24,
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
EGL_CONFIG_CAVEAT, EGL_NONE, # Don't allow slow/non-conformant
]
API_BITS = {
'opengl': EGL_OPENGL_BIT,
'gl': EGL_OPENGL_BIT,
'gles2': EGL_OPENGL_ES2_BIT,
'gles1': EGL_OPENGL_ES_BIT,
'gles': EGL_OPENGL_ES_BIT,
'es2': EGL_OPENGL_ES2_BIT,
'es1': EGL_OPENGL_ES_BIT,
'es': EGL_OPENGL_ES_BIT,
}
API_NAMES = dict([
(k,{
EGL_OPENGL_BIT:EGL_OPENGL_API,
EGL_OPENGL_ES2_BIT:EGL_OPENGL_ES_API,
EGL_OPENGL_ES_BIT:EGL_OPENGL_ES_API
}[v])
for k,v in API_BITS.items()
])
def egltest( size=(300,300), name=None, api='es2', attributes=DESIRED_ATTRIBUTES ):
def gltest( function ):
"""Decorator to allow a function to run in a Pygame GLES[1,2,3] context"""
@wraps( function )
def test_function( *args, **named ):
major,minor = ctypes.c_long(),ctypes.c_long()
display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
eglInitialize( display, major, minor)
num_configs = ctypes.c_long()
configs = (EGLConfig*2)()
api_constant = API_NAMES[api.lower()]
local_attributes = attributes[:]
local_attributes.extend( [
EGL_CONFORMANT, API_BITS[api.lower()],
EGL_NONE,
])
print('local_attributes', local_attributes)
local_attributes= arrays.GLintArray.asArray( local_attributes )
eglChooseConfig(display, local_attributes, configs, 2, num_configs)
print('API', api_constant)
eglBindAPI(api_constant)
# now need to get a raw X window handle...
pygame.init()
pygame.display.set_mode( size )
window = pygame.display.get_wm_info()['window']
surface = eglCreateWindowSurface(display, configs[0], window, None )
ctx = eglCreateContext(display, configs[0], EGL_NO_CONTEXT, None)
if ctx == EGL_NO_CONTEXT:
raise RuntimeError( 'Unable to create context' )
try:
eglMakeCurrent( display, surface, surface, ctx )
function(*args, **named)
eglSwapBuffers( display, surface )
finally:
pygame.display.quit()
pygame.quit()
return test_function
return gltest
|