1from pyglet.libs.egl import egl as libegl
2from pyglet.libs.egl.egl import *
3
4
5_buffer_types = {EGL_SINGLE_BUFFER: "EGL_RENDER_BUFFER",
6                 EGL_BACK_BUFFER: "EGL_BACK_BUFFER",
7                 EGL_NONE: "EGL_NONE"}
8
9_api_types = {EGL_OPENGL_API: "EGL_OPENGL_API",
10              EGL_OPENGL_ES_API: "EGL_OPENGL_ES_API",
11              EGL_NONE: "EGL_NONE"}
12
13# Initialize a display:
14display = libegl.EGLNativeDisplayType()
15display_connection = libegl.eglGetDisplay(display)
16
17majorver = libegl.EGLint()
18minorver = libegl.EGLint()
19result = libegl.eglInitialize(display_connection, majorver, minorver)
20assert result == 1, "EGL Initialization Failed"
21egl_version = majorver.value, minorver.value
22print(f"EGL version: {egl_version}")
23
24# Get the number of configs:
25num_configs = libegl.EGLint()
26config_size = libegl.EGLint()
27result = libegl.eglGetConfigs(display_connection, None, config_size, num_configs)
28assert result == 1, "Failed to query Configs"
29
30print("Number of configs available: ", num_configs.value)
31
32# Choose a config:
33config_attribs = (EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
34                  EGL_BLUE_SIZE, 8,
35                  EGL_GREEN_SIZE, 8,
36                  EGL_RED_SIZE, 8,
37                  EGL_DEPTH_SIZE, 8,
38                  EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
39                  EGL_NONE)
40config_attrib_array = (libegl.EGLint * len(config_attribs))(*config_attribs)
41egl_config = libegl.EGLConfig()
42result = libegl.eglChooseConfig(display_connection, config_attrib_array, egl_config, 1, num_configs)
43assert result == 1, "Failed to choose Config"
44
45# Create a surface:
46pbufferwidth = 1
47pbufferheight = 1
48pbuffer_attribs = (EGL_WIDTH, pbufferwidth, EGL_HEIGHT, pbufferheight, EGL_NONE)
49pbuffer_attrib_array = (libegl.EGLint * len(pbuffer_attribs))(*pbuffer_attribs)
50surface = libegl.eglCreatePbufferSurface(display_connection, egl_config, pbuffer_attrib_array)
51print("Surface: ", surface)
52
53# Bind the API:
54result = libegl.eglBindAPI(libegl.EGL_OPENGL_API)
55assert result == 1, "Failed to bind EGL_OPENGL_API"
56
57# Create a context:
58context_attribs = (EGL_CONTEXT_MAJOR_VERSION, 2, EGL_NONE)
59context_attrib_array = (libegl.EGLint * len(context_attribs))(*context_attribs)
60context = libegl.eglCreateContext(display_connection, egl_config, None, context_attrib_array)
61print("Context: ", context)
62
63# Make context current:
64result = libegl.eglMakeCurrent(display_connection, surface, surface, context)
65assert result == 1, "Failed to make context current"
66
67error_code = libegl.eglGetError()
68assert error_code == EGL_SUCCESS, "EGL Error code {} returned".format(error_code)
69
70# Print some context details:
71buffer_type = libegl.EGLint()
72libegl.eglQueryContext(display_connection, context, EGL_RENDER_BUFFER, buffer_type)
73print("Buffer type: ", _buffer_types.get(buffer_type.value, "Unknown"))
74print("API type: ", _api_types.get(libegl.eglQueryAPI(), "Unknown"))
75
76# Terminate EGL:
77libegl.eglTerminate(display_connection)
78