pyglet 2.1.12__py3-none-any.whl → 3.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyglet/__init__.py +67 -61
- pyglet/__init__.pyi +15 -8
- pyglet/app/__init__.py +22 -13
- pyglet/app/async_app.py +212 -0
- pyglet/app/base.py +2 -1
- pyglet/app/{xlib.py → linux.py} +3 -3
- pyglet/config/__init__.py +101 -0
- pyglet/config/gl/__init__.py +30 -0
- pyglet/config/gl/egl.py +120 -0
- pyglet/config/gl/macos.py +262 -0
- pyglet/config/gl/windows.py +267 -0
- pyglet/config/gl/x11.py +142 -0
- pyglet/customtypes.py +43 -2
- pyglet/display/__init__.py +8 -6
- pyglet/display/base.py +3 -63
- pyglet/display/cocoa.py +12 -17
- pyglet/display/emscripten.py +39 -0
- pyglet/display/headless.py +23 -30
- pyglet/display/wayland.py +157 -0
- pyglet/display/win32.py +4 -17
- pyglet/display/xlib.py +19 -27
- pyglet/display/xlib_vidmoderestore.py +2 -2
- pyglet/enums.py +183 -0
- pyglet/event.py +0 -1
- pyglet/experimental/geoshader_sprite.py +15 -13
- pyglet/experimental/hidraw.py +6 -15
- pyglet/experimental/multitexture_sprite.py +31 -19
- pyglet/experimental/particles.py +13 -35
- pyglet/font/__init__.py +251 -85
- pyglet/font/base.py +116 -61
- pyglet/font/dwrite/__init__.py +349 -204
- pyglet/font/dwrite/dwrite_lib.py +27 -5
- pyglet/font/fontconfig.py +14 -6
- pyglet/font/freetype.py +138 -87
- pyglet/font/freetype_lib.py +19 -0
- pyglet/font/group.py +179 -0
- pyglet/font/harfbuzz/__init__.py +3 -3
- pyglet/font/pyodide_js.py +310 -0
- pyglet/font/quartz.py +319 -126
- pyglet/font/ttf.py +45 -3
- pyglet/font/user.py +14 -19
- pyglet/font/win32.py +45 -21
- pyglet/graphics/__init__.py +8 -787
- pyglet/graphics/allocation.py +115 -1
- pyglet/graphics/api/__init__.py +77 -0
- pyglet/graphics/api/base.py +299 -0
- pyglet/graphics/api/gl/__init__.py +58 -0
- pyglet/graphics/api/gl/base.py +24 -0
- pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
- pyglet/graphics/api/gl/cocoa/context.py +76 -0
- pyglet/graphics/api/gl/context.py +391 -0
- pyglet/graphics/api/gl/default_shaders.py +0 -0
- pyglet/graphics/api/gl/draw.py +627 -0
- pyglet/graphics/api/gl/egl/__init__.py +0 -0
- pyglet/graphics/api/gl/egl/context.py +92 -0
- pyglet/graphics/api/gl/enums.py +76 -0
- pyglet/graphics/api/gl/framebuffer.py +315 -0
- pyglet/graphics/api/gl/gl.py +5463 -0
- pyglet/graphics/api/gl/gl_info.py +188 -0
- pyglet/graphics/api/gl/global_opengl.py +226 -0
- pyglet/{gl → graphics/api/gl}/lib.py +34 -18
- pyglet/graphics/api/gl/shader.py +1476 -0
- pyglet/graphics/api/gl/shapes.py +55 -0
- pyglet/graphics/api/gl/sprite.py +102 -0
- pyglet/graphics/api/gl/state.py +219 -0
- pyglet/graphics/api/gl/text.py +190 -0
- pyglet/graphics/api/gl/texture.py +1526 -0
- pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
- pyglet/graphics/api/gl/vertexdomain.py +751 -0
- pyglet/graphics/api/gl/win32/__init__.py +0 -0
- pyglet/graphics/api/gl/win32/context.py +108 -0
- pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
- pyglet/graphics/api/gl/xlib/__init__.py +0 -0
- pyglet/graphics/api/gl/xlib/context.py +174 -0
- pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
- pyglet/graphics/api/gl1/__init__.py +0 -0
- pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
- pyglet/graphics/api/gl2/__init__.py +0 -0
- pyglet/graphics/api/gl2/buffer.py +320 -0
- pyglet/graphics/api/gl2/draw.py +600 -0
- pyglet/graphics/api/gl2/global_opengl.py +122 -0
- pyglet/graphics/api/gl2/shader.py +200 -0
- pyglet/graphics/api/gl2/shapes.py +51 -0
- pyglet/graphics/api/gl2/sprite.py +79 -0
- pyglet/graphics/api/gl2/text.py +175 -0
- pyglet/graphics/api/gl2/vertexdomain.py +364 -0
- pyglet/graphics/api/webgl/__init__.py +233 -0
- pyglet/graphics/api/webgl/buffer.py +302 -0
- pyglet/graphics/api/webgl/context.py +234 -0
- pyglet/graphics/api/webgl/draw.py +590 -0
- pyglet/graphics/api/webgl/enums.py +76 -0
- pyglet/graphics/api/webgl/framebuffer.py +360 -0
- pyglet/graphics/api/webgl/gl.py +1537 -0
- pyglet/graphics/api/webgl/gl_info.py +130 -0
- pyglet/graphics/api/webgl/shader.py +1346 -0
- pyglet/graphics/api/webgl/shapes.py +92 -0
- pyglet/graphics/api/webgl/sprite.py +102 -0
- pyglet/graphics/api/webgl/state.py +227 -0
- pyglet/graphics/api/webgl/text.py +187 -0
- pyglet/graphics/api/webgl/texture.py +1227 -0
- pyglet/graphics/api/webgl/vertexarray.py +54 -0
- pyglet/graphics/api/webgl/vertexdomain.py +616 -0
- pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
- pyglet/{image → graphics}/atlas.py +33 -32
- pyglet/graphics/base.py +10 -0
- pyglet/graphics/buffer.py +245 -0
- pyglet/graphics/draw.py +578 -0
- pyglet/graphics/framebuffer.py +26 -0
- pyglet/graphics/instance.py +178 -69
- pyglet/graphics/shader.py +267 -1553
- pyglet/graphics/state.py +83 -0
- pyglet/graphics/texture.py +703 -0
- pyglet/graphics/vertexdomain.py +695 -538
- pyglet/gui/ninepatch.py +10 -10
- pyglet/gui/widgets.py +120 -10
- pyglet/image/__init__.py +20 -1973
- pyglet/image/animation.py +12 -12
- pyglet/image/base.py +730 -0
- pyglet/image/codecs/__init__.py +9 -0
- pyglet/image/codecs/bmp.py +53 -30
- pyglet/image/codecs/dds.py +53 -31
- pyglet/image/codecs/gdiplus.py +38 -14
- pyglet/image/codecs/gdkpixbuf2.py +0 -2
- pyglet/image/codecs/js_image.py +99 -0
- pyglet/image/codecs/ktx2.py +161 -0
- pyglet/image/codecs/pil.py +1 -1
- pyglet/image/codecs/png.py +1 -1
- pyglet/image/codecs/wic.py +11 -2
- pyglet/info.py +26 -24
- pyglet/input/__init__.py +8 -0
- pyglet/input/base.py +163 -105
- pyglet/input/controller.py +13 -19
- pyglet/input/controller_db.py +39 -24
- pyglet/input/emscripten/__init__.py +18 -0
- pyglet/input/emscripten/gamepad_js.py +397 -0
- pyglet/input/linux/__init__.py +11 -5
- pyglet/input/linux/evdev.py +10 -11
- pyglet/input/linux/x11_xinput.py +2 -2
- pyglet/input/linux/x11_xinput_tablet.py +1 -1
- pyglet/input/macos/__init__.py +7 -2
- pyglet/input/macos/darwin_gc.py +559 -0
- pyglet/input/win32/__init__.py +1 -1
- pyglet/input/win32/directinput.py +34 -29
- pyglet/input/win32/xinput.py +11 -61
- pyglet/lib.py +3 -3
- pyglet/libs/__init__.py +1 -1
- pyglet/{gl → libs/darwin}/agl.py +1 -1
- pyglet/libs/darwin/cocoapy/__init__.py +2 -2
- pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
- pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
- pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
- pyglet/libs/darwin/cocoapy/runtime.py +81 -45
- pyglet/libs/darwin/coreaudio.py +4 -4
- pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
- pyglet/libs/darwin/quartzkey.py +1 -3
- pyglet/libs/egl/__init__.py +2 -0
- pyglet/libs/egl/egl_lib.py +576 -0
- pyglet/libs/egl/eglext.py +51 -5
- pyglet/libs/linux/__init__.py +0 -0
- pyglet/libs/linux/egl/__init__.py +0 -0
- pyglet/libs/linux/egl/eglext.py +22 -0
- pyglet/libs/linux/glx/__init__.py +0 -0
- pyglet/{gl → libs/linux/glx}/glx.py +13 -14
- pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
- pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
- pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
- pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
- pyglet/libs/linux/wayland/__init__.py +0 -0
- pyglet/libs/linux/wayland/client.py +1068 -0
- pyglet/libs/linux/wayland/lib_wayland.py +207 -0
- pyglet/libs/linux/wayland/wayland_egl.py +38 -0
- pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
- pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
- pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
- pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
- pyglet/libs/linux/x11/xrandr.py +0 -0
- pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
- pyglet/libs/shared/__init__.py +0 -0
- pyglet/libs/shared/spirv/__init__.py +0 -0
- pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
- pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
- pyglet/libs/win32/__init__.py +27 -5
- pyglet/libs/win32/constants.py +59 -48
- pyglet/libs/win32/context_managers.py +20 -3
- pyglet/libs/win32/dinput.py +105 -88
- pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
- pyglet/libs/win32/types.py +58 -23
- pyglet/{gl → libs/win32}/wgl.py +32 -25
- pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
- pyglet/media/__init__.py +9 -10
- pyglet/media/codecs/__init__.py +12 -1
- pyglet/media/codecs/base.py +99 -96
- pyglet/media/codecs/ffmpeg.py +2 -2
- pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
- pyglet/media/codecs/webaudio_pyodide.py +111 -0
- pyglet/media/drivers/__init__.py +9 -4
- pyglet/media/drivers/base.py +4 -4
- pyglet/media/drivers/openal/__init__.py +1 -1
- pyglet/media/drivers/openal/adaptation.py +3 -3
- pyglet/media/drivers/pulse/__init__.py +1 -1
- pyglet/media/drivers/pulse/adaptation.py +3 -3
- pyglet/media/drivers/pyodide_js/__init__.py +8 -0
- pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
- pyglet/media/drivers/xaudio2/adaptation.py +3 -3
- pyglet/media/player.py +276 -193
- pyglet/media/player_worker_thread.py +1 -1
- pyglet/model/__init__.py +39 -29
- pyglet/model/codecs/base.py +4 -4
- pyglet/model/codecs/gltf.py +3 -3
- pyglet/model/codecs/obj.py +71 -43
- pyglet/resource.py +129 -78
- pyglet/shapes.py +147 -177
- pyglet/sprite.py +47 -164
- pyglet/text/__init__.py +44 -54
- pyglet/text/caret.py +12 -7
- pyglet/text/document.py +19 -17
- pyglet/text/formats/html.py +2 -2
- pyglet/text/formats/structured.py +10 -40
- pyglet/text/layout/__init__.py +20 -13
- pyglet/text/layout/base.py +176 -287
- pyglet/text/layout/incremental.py +9 -10
- pyglet/text/layout/scrolling.py +7 -95
- pyglet/window/__init__.py +183 -172
- pyglet/window/cocoa/__init__.py +62 -51
- pyglet/window/cocoa/pyglet_delegate.py +2 -25
- pyglet/window/cocoa/pyglet_view.py +9 -8
- pyglet/window/dialog/__init__.py +184 -0
- pyglet/window/dialog/base.py +99 -0
- pyglet/window/dialog/darwin.py +121 -0
- pyglet/window/dialog/linux.py +72 -0
- pyglet/window/dialog/windows.py +194 -0
- pyglet/window/emscripten/__init__.py +779 -0
- pyglet/window/headless/__init__.py +44 -28
- pyglet/window/key.py +2 -0
- pyglet/window/mouse.py +2 -2
- pyglet/window/wayland/__init__.py +377 -0
- pyglet/window/win32/__init__.py +101 -46
- pyglet/window/xlib/__init__.py +104 -66
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
- pyglet-3.0.dev1.dist-info/RECORD +322 -0
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
- pyglet/gl/__init__.py +0 -208
- pyglet/gl/base.py +0 -499
- pyglet/gl/cocoa.py +0 -309
- pyglet/gl/gl.py +0 -4625
- pyglet/gl/gl.pyi +0 -2320
- pyglet/gl/gl_compat.pyi +0 -3097
- pyglet/gl/gl_info.py +0 -190
- pyglet/gl/headless.py +0 -166
- pyglet/gl/wgl_info.py +0 -36
- pyglet/gl/wglext_nv.py +0 -1096
- pyglet/gl/win32.py +0 -268
- pyglet/gl/xlib.py +0 -295
- pyglet/image/buffer.py +0 -274
- pyglet/image/codecs/s3tc.py +0 -354
- pyglet/libs/x11/xrandr.py +0 -166
- pyglet-2.1.12.dist-info/RECORD +0 -234
- /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
- /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
- /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
- /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
- /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
- {pyglet-2.1.12.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
pyglet/gl/gl_info.py
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
"""Information about version and extensions of current GL implementation.
|
|
2
|
-
|
|
3
|
-
Usage::
|
|
4
|
-
|
|
5
|
-
from pyglet.gl import gl_info
|
|
6
|
-
|
|
7
|
-
if gl_info.have_extension('GL_NV_register_combiners'):
|
|
8
|
-
# ...
|
|
9
|
-
|
|
10
|
-
If you are using more than one context, you can set up a separate GLInfo
|
|
11
|
-
object for each context. Call `set_active_context` after switching to the
|
|
12
|
-
context::
|
|
13
|
-
|
|
14
|
-
from pyglet.gl.gl_info import GLInfo
|
|
15
|
-
|
|
16
|
-
info = GLInfo()
|
|
17
|
-
info.set_active_context()
|
|
18
|
-
|
|
19
|
-
if info.have_version(4, 5):
|
|
20
|
-
# ...
|
|
21
|
-
|
|
22
|
-
"""
|
|
23
|
-
from __future__ import annotations
|
|
24
|
-
|
|
25
|
-
import warnings
|
|
26
|
-
from ctypes import c_char_p, cast
|
|
27
|
-
|
|
28
|
-
from pyglet.gl.gl import GL_EXTENSIONS, GL_MAJOR_VERSION, GL_MINOR_VERSION, GL_RENDERER, GL_VENDOR, GL_VERSION, GLint
|
|
29
|
-
from pyglet.gl.lib import GLException
|
|
30
|
-
from pyglet.util import asstr
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def _get_number(parameter: int) -> int:
|
|
34
|
-
from pyglet.gl.gl import glGetIntegerv
|
|
35
|
-
number = GLint()
|
|
36
|
-
glGetIntegerv(parameter, number)
|
|
37
|
-
return number.value
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class GLInfo:
|
|
41
|
-
"""Information interface for a single GL context.
|
|
42
|
-
|
|
43
|
-
A default instance is created automatically when the first OpenGL context
|
|
44
|
-
is created. You can use the module functions as a convenience for
|
|
45
|
-
this default instance's methods.
|
|
46
|
-
|
|
47
|
-
If you are using more than one context, you must call `set_active_context`
|
|
48
|
-
when the context is active for this `GLInfo` instance.
|
|
49
|
-
"""
|
|
50
|
-
extensions: set[str]
|
|
51
|
-
vendor: str = ''
|
|
52
|
-
renderer: str = ''
|
|
53
|
-
version: str = '0.0'
|
|
54
|
-
major_version: int = 0
|
|
55
|
-
minor_version: int = 0
|
|
56
|
-
opengl_api: str = 'gl'
|
|
57
|
-
|
|
58
|
-
_have_context: bool = False
|
|
59
|
-
_have_info = False
|
|
60
|
-
|
|
61
|
-
def __init__(self) -> None: # noqa: D107
|
|
62
|
-
super().__init__()
|
|
63
|
-
self.extensions = set()
|
|
64
|
-
|
|
65
|
-
def set_active_context(self) -> None:
|
|
66
|
-
"""Store information for the currently active context.
|
|
67
|
-
|
|
68
|
-
This method is called automatically for the default context.
|
|
69
|
-
"""
|
|
70
|
-
self._have_context = True
|
|
71
|
-
|
|
72
|
-
if not self._have_info:
|
|
73
|
-
|
|
74
|
-
from pyglet.gl.gl import GL_NUM_EXTENSIONS, glGetString, glGetStringi
|
|
75
|
-
|
|
76
|
-
self.vendor = asstr(cast(glGetString(GL_VENDOR), c_char_p).value)
|
|
77
|
-
self.renderer = asstr(cast(glGetString(GL_RENDERER), c_char_p).value)
|
|
78
|
-
self.version = asstr(cast(glGetString(GL_VERSION), c_char_p).value)
|
|
79
|
-
# NOTE: The version string requirements for gles is a lot stricter
|
|
80
|
-
# so using this to rely on detecting the API is not too unreasonable
|
|
81
|
-
self.opengl_api = "gles" if "opengl es" in self.version.lower() else "gl"
|
|
82
|
-
|
|
83
|
-
try:
|
|
84
|
-
self.major_version = _get_number(GL_MAJOR_VERSION)
|
|
85
|
-
self.minor_version = _get_number(GL_MINOR_VERSION)
|
|
86
|
-
num_ext = _get_number(GL_NUM_EXTENSIONS)
|
|
87
|
-
self.extensions = (asstr(cast(glGetStringi(GL_EXTENSIONS, i), c_char_p).value) for i in range(num_ext))
|
|
88
|
-
self.extensions = set(self.extensions)
|
|
89
|
-
except GLException:
|
|
90
|
-
pass # GL3 is likely not available
|
|
91
|
-
|
|
92
|
-
self._have_info = True
|
|
93
|
-
|
|
94
|
-
def remove_active_context(self) -> None:
|
|
95
|
-
self._have_context = False
|
|
96
|
-
self._have_info = False
|
|
97
|
-
|
|
98
|
-
def have_context(self) -> bool:
|
|
99
|
-
return self._have_context
|
|
100
|
-
|
|
101
|
-
def have_extension(self, extension: str) -> bool:
|
|
102
|
-
"""Determine if an OpenGL extension is available.
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
extension:
|
|
106
|
-
The name of the extension to test for, including its ``GL_`` prefix.
|
|
107
|
-
|
|
108
|
-
Returns:
|
|
109
|
-
True if the extension is provided by the driver.
|
|
110
|
-
"""
|
|
111
|
-
if not self._have_context:
|
|
112
|
-
warnings.warn('No GL context created yet.')
|
|
113
|
-
return extension in self.extensions
|
|
114
|
-
|
|
115
|
-
def get_extensions(self) -> set[str]:
|
|
116
|
-
"""Get a set of available OpenGL extensions."""
|
|
117
|
-
if not self._have_context:
|
|
118
|
-
warnings.warn('No GL context created yet.')
|
|
119
|
-
return self.extensions
|
|
120
|
-
|
|
121
|
-
def get_version(self) -> tuple[int, int]:
|
|
122
|
-
"""Get the current major and minor version of OpenGL."""
|
|
123
|
-
if not self._have_context:
|
|
124
|
-
warnings.warn('No GL context created yet.')
|
|
125
|
-
return self.major_version, self.minor_version
|
|
126
|
-
|
|
127
|
-
def get_version_string(self) -> str:
|
|
128
|
-
"""Get the current OpenGL version string."""
|
|
129
|
-
if not self._have_context:
|
|
130
|
-
warnings.warn('No GL context created yet.')
|
|
131
|
-
return self.version
|
|
132
|
-
|
|
133
|
-
def have_version(self, major: int, minor: int = 0) -> bool:
|
|
134
|
-
"""Determine if a version of OpenGL is supported.
|
|
135
|
-
|
|
136
|
-
Args:
|
|
137
|
-
major:
|
|
138
|
-
The major revision number (typically 1 or 2).
|
|
139
|
-
minor:
|
|
140
|
-
The minor revision number.
|
|
141
|
-
|
|
142
|
-
Returns:
|
|
143
|
-
``True`` if the requested or a later version is supported.
|
|
144
|
-
"""
|
|
145
|
-
if not self._have_context:
|
|
146
|
-
warnings.warn('No GL context created yet.')
|
|
147
|
-
if not self.major_version and not self.minor_version:
|
|
148
|
-
return False
|
|
149
|
-
|
|
150
|
-
return (self.major_version > major or
|
|
151
|
-
(self.major_version == major and self.minor_version >= minor) or
|
|
152
|
-
(self.major_version == major and self.minor_version == minor))
|
|
153
|
-
|
|
154
|
-
def get_renderer(self) -> str:
|
|
155
|
-
"""Determine the renderer string of the OpenGL context."""
|
|
156
|
-
if not self._have_context:
|
|
157
|
-
warnings.warn('No GL context created yet.')
|
|
158
|
-
return self.renderer
|
|
159
|
-
|
|
160
|
-
def get_vendor(self) -> str:
|
|
161
|
-
"""Determine the vendor string of the OpenGL context."""
|
|
162
|
-
if not self._have_context:
|
|
163
|
-
warnings.warn('No GL context created yet.')
|
|
164
|
-
return self.vendor
|
|
165
|
-
|
|
166
|
-
def get_opengl_api(self) -> str:
|
|
167
|
-
"""Determine the OpenGL API version.
|
|
168
|
-
|
|
169
|
-
Usually ``gl`` or ``gles``.
|
|
170
|
-
"""
|
|
171
|
-
if not self._have_context:
|
|
172
|
-
warnings.warn('No GL context created yet.')
|
|
173
|
-
return self.opengl_api
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
# Single instance useful for apps with only a single context
|
|
177
|
-
# (or all contexts have the same GL driver, a common case).
|
|
178
|
-
_gl_info = GLInfo()
|
|
179
|
-
|
|
180
|
-
get_extensions = _gl_info.get_extensions
|
|
181
|
-
get_version = _gl_info.get_version
|
|
182
|
-
get_version_string = _gl_info.get_version_string
|
|
183
|
-
have_version = _gl_info.have_version
|
|
184
|
-
get_renderer = _gl_info.get_renderer
|
|
185
|
-
get_vendor = _gl_info.get_vendor
|
|
186
|
-
get_opengl_api = _gl_info.get_opengl_api
|
|
187
|
-
have_extension = _gl_info.have_extension
|
|
188
|
-
have_context = _gl_info.have_context
|
|
189
|
-
remove_active_context = _gl_info.remove_active_context
|
|
190
|
-
set_active_context = _gl_info.set_active_context
|
pyglet/gl/headless.py
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from ctypes import byref
|
|
4
|
-
|
|
5
|
-
from pyglet import gl
|
|
6
|
-
from pyglet.display.headless import HeadlessCanvas
|
|
7
|
-
from pyglet.libs.egl import egl
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
from .base import DisplayConfig, Config, Context
|
|
11
|
-
|
|
12
|
-
_fake_gl_attributes = {
|
|
13
|
-
'double_buffer': 0,
|
|
14
|
-
'stereo': 0,
|
|
15
|
-
'aux_buffers': 0,
|
|
16
|
-
'accum_red_size': 0,
|
|
17
|
-
'accum_green_size': 0,
|
|
18
|
-
'accum_blue_size': 0,
|
|
19
|
-
'accum_alpha_size': 0,
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class HeadlessConfig(Config): # noqa: D101
|
|
24
|
-
def match(self, canvas: HeadlessCanvas) -> list[HeadlessDisplayConfig]:
|
|
25
|
-
if not isinstance(canvas, HeadlessCanvas):
|
|
26
|
-
msg = 'Canvas must be an instance of HeadlessCanvas'
|
|
27
|
-
raise RuntimeError(msg)
|
|
28
|
-
|
|
29
|
-
display_connection = canvas.display._display_connection # noqa: SLF001
|
|
30
|
-
|
|
31
|
-
# Construct array of attributes
|
|
32
|
-
attrs = []
|
|
33
|
-
for name, value in self.get_gl_attributes():
|
|
34
|
-
if name == 'double_buffer':
|
|
35
|
-
continue
|
|
36
|
-
attr = HeadlessDisplayConfig.attribute_ids.get(name, None)
|
|
37
|
-
if attr and value is not None:
|
|
38
|
-
attrs.extend([attr, int(value)])
|
|
39
|
-
attrs.extend([egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT])
|
|
40
|
-
if self.opengl_api == "gl":
|
|
41
|
-
attrs.extend([egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT])
|
|
42
|
-
elif self.opengl_api == "gles":
|
|
43
|
-
attrs.extend([egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_ES3_BIT])
|
|
44
|
-
else:
|
|
45
|
-
msg = f"Unknown OpenGL API: {self.opengl_api}"
|
|
46
|
-
raise ValueError(msg)
|
|
47
|
-
attrs.extend([egl.EGL_NONE])
|
|
48
|
-
attrs_list = (egl.EGLint * len(attrs))(*attrs)
|
|
49
|
-
|
|
50
|
-
num_config = egl.EGLint()
|
|
51
|
-
egl.eglChooseConfig(display_connection, attrs_list, None, 0, byref(num_config))
|
|
52
|
-
configs = (egl.EGLConfig * num_config.value)()
|
|
53
|
-
egl.eglChooseConfig(display_connection, attrs_list, configs,
|
|
54
|
-
num_config.value, byref(num_config))
|
|
55
|
-
|
|
56
|
-
return [HeadlessDisplayConfig(canvas, c, self) for c in configs]
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class HeadlessDisplayConfig(DisplayConfig): # noqa: D101
|
|
60
|
-
canvas: HeadlessCanvas
|
|
61
|
-
config: HeadlessConfig
|
|
62
|
-
|
|
63
|
-
attribute_ids = { # noqa: RUF012
|
|
64
|
-
'buffer_size': egl.EGL_BUFFER_SIZE,
|
|
65
|
-
'level': egl.EGL_LEVEL, # Not supported
|
|
66
|
-
'red_size': egl.EGL_RED_SIZE,
|
|
67
|
-
'green_size': egl.EGL_GREEN_SIZE,
|
|
68
|
-
'blue_size': egl.EGL_BLUE_SIZE,
|
|
69
|
-
'alpha_size': egl.EGL_ALPHA_SIZE,
|
|
70
|
-
'depth_size': egl.EGL_DEPTH_SIZE,
|
|
71
|
-
'stencil_size': egl.EGL_STENCIL_SIZE,
|
|
72
|
-
'sample_buffers': egl.EGL_SAMPLE_BUFFERS,
|
|
73
|
-
'samples': egl.EGL_SAMPLES,
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
def __init__(self, canvas: HeadlessCanvas, egl_config: egl.EGLConfig, config: HeadlessConfig) -> None: # noqa: D107
|
|
77
|
-
super().__init__(canvas, config)
|
|
78
|
-
self._egl_config = egl_config
|
|
79
|
-
context_attribs = (egl.EGL_CONTEXT_MAJOR_VERSION, config.major_version or 2,
|
|
80
|
-
egl.EGL_CONTEXT_MINOR_VERSION, config.minor_version or 0,
|
|
81
|
-
egl.EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE, config.forward_compatible or 0,
|
|
82
|
-
egl.EGL_CONTEXT_OPENGL_DEBUG, config.debug or 0,
|
|
83
|
-
egl.EGL_NONE)
|
|
84
|
-
self._context_attrib_array = (egl.EGLint * len(context_attribs))(*context_attribs)
|
|
85
|
-
|
|
86
|
-
for name, attr in self.attribute_ids.items():
|
|
87
|
-
value = egl.EGLint()
|
|
88
|
-
egl.eglGetConfigAttrib(canvas.display._display_connection, egl_config, attr, byref(value)) # noqa: SLF001
|
|
89
|
-
setattr(self, name, value.value)
|
|
90
|
-
|
|
91
|
-
for name, value in _fake_gl_attributes.items():
|
|
92
|
-
setattr(self, name, value)
|
|
93
|
-
|
|
94
|
-
def compatible(self, canvas: HeadlessCanvas) -> bool:
|
|
95
|
-
return isinstance(canvas, HeadlessCanvas)
|
|
96
|
-
|
|
97
|
-
def create_context(self, share: HeadlessContext | None) -> HeadlessContext:
|
|
98
|
-
return HeadlessContext(self, share)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
class HeadlessContext(Context): # noqa: D101
|
|
102
|
-
display_connection: egl.EGLDisplay
|
|
103
|
-
config: HeadlessDisplayConfig
|
|
104
|
-
|
|
105
|
-
def __init__(self, config: HeadlessDisplayConfig, share: HeadlessContext | None) -> None: # noqa: D107
|
|
106
|
-
super().__init__(config, share)
|
|
107
|
-
|
|
108
|
-
self.display_connection = config.canvas.display._display_connection # noqa: SLF001
|
|
109
|
-
|
|
110
|
-
self.egl_context = self._create_egl_context(share)
|
|
111
|
-
if not self.egl_context:
|
|
112
|
-
msg = 'Could not create GL context'
|
|
113
|
-
raise gl.ContextException(msg)
|
|
114
|
-
|
|
115
|
-
def _create_egl_context(self, share: HeadlessContext | None) -> egl.EGLContext:
|
|
116
|
-
if share:
|
|
117
|
-
share_context = share.egl_context
|
|
118
|
-
else:
|
|
119
|
-
share_context = None
|
|
120
|
-
|
|
121
|
-
if self.config.opengl_api == "gl":
|
|
122
|
-
egl.eglBindAPI(egl.EGL_OPENGL_API)
|
|
123
|
-
elif self.config.opengl_api == "gles":
|
|
124
|
-
egl.eglBindAPI(egl.EGL_OPENGL_ES_API)
|
|
125
|
-
return egl.eglCreateContext(self.config.canvas.display._display_connection, # noqa: SLF001
|
|
126
|
-
self.config._egl_config, share_context, # noqa: SLF001
|
|
127
|
-
self.config._context_attrib_array) # noqa: SLF001
|
|
128
|
-
|
|
129
|
-
def attach(self, canvas: HeadlessCanvas) -> None:
|
|
130
|
-
if canvas is self.canvas:
|
|
131
|
-
return
|
|
132
|
-
|
|
133
|
-
super().attach(canvas)
|
|
134
|
-
|
|
135
|
-
self.egl_surface = canvas.egl_surface
|
|
136
|
-
self.set_current()
|
|
137
|
-
|
|
138
|
-
def set_current(self) -> None:
|
|
139
|
-
egl.eglMakeCurrent(
|
|
140
|
-
self.display_connection, self.egl_surface, self.egl_surface, self.egl_context)
|
|
141
|
-
super().set_current()
|
|
142
|
-
|
|
143
|
-
def detach(self) -> None:
|
|
144
|
-
if not self.canvas:
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
self.set_current()
|
|
148
|
-
gl.glFlush() # needs to be in try/except?
|
|
149
|
-
|
|
150
|
-
super().detach()
|
|
151
|
-
|
|
152
|
-
egl.eglMakeCurrent(
|
|
153
|
-
self.display_connection, 0, 0, None)
|
|
154
|
-
self.egl_surface = None
|
|
155
|
-
|
|
156
|
-
def destroy(self) -> None:
|
|
157
|
-
super().destroy()
|
|
158
|
-
if self.egl_context:
|
|
159
|
-
egl.eglDestroyContext(self.display_connection, self.egl_context)
|
|
160
|
-
self.egl_context = None
|
|
161
|
-
|
|
162
|
-
def flip(self) -> None:
|
|
163
|
-
if not self.egl_surface:
|
|
164
|
-
return
|
|
165
|
-
|
|
166
|
-
egl.eglSwapBuffers(self.display_connection, self.egl_surface)
|
pyglet/gl/wgl_info.py
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"""Cached information about version and extensions of current WGL implementation."""
|
|
2
|
-
from __future__ import annotations
|
|
3
|
-
|
|
4
|
-
import warnings
|
|
5
|
-
from ctypes import c_char_p, cast
|
|
6
|
-
|
|
7
|
-
from pyglet.gl import gl_info
|
|
8
|
-
from pyglet.gl.gl import GL_EXTENSIONS, glGetString
|
|
9
|
-
from pyglet.gl.lib import MissingFunctionException
|
|
10
|
-
from pyglet.gl.wglext_arb import wglGetExtensionsStringEXT
|
|
11
|
-
from pyglet.util import asstr
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class WGLInfoException(Exception): # noqa: D101, N818
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class WGLInfo: # noqa: D101
|
|
19
|
-
def get_extensions(self) -> list[str]:
|
|
20
|
-
if not gl_info.have_context():
|
|
21
|
-
warnings.warn("Can't query WGL until a context is created.")
|
|
22
|
-
return []
|
|
23
|
-
|
|
24
|
-
try:
|
|
25
|
-
return asstr(wglGetExtensionsStringEXT()).split()
|
|
26
|
-
except MissingFunctionException:
|
|
27
|
-
return asstr(cast(glGetString(GL_EXTENSIONS), c_char_p).value).split()
|
|
28
|
-
|
|
29
|
-
def have_extension(self, extension: str) -> bool:
|
|
30
|
-
return extension in self.get_extensions()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
_wgl_info = WGLInfo()
|
|
34
|
-
|
|
35
|
-
get_extensions = _wgl_info.get_extensions
|
|
36
|
-
have_extension = _wgl_info.have_extension
|