pyglet 2.1.13__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 +5 -21
- 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 +28 -8
- 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 +154 -194
- 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.13.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
- pyglet-3.0.dev1.dist-info/RECORD +322 -0
- {pyglet-2.1.13.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.13.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.13.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
import weakref
|
|
5
|
+
from typing import Callable, TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from pyglet.graphics.api.gl import gl, gl_info, ObjectSpace
|
|
8
|
+
from pyglet.graphics.api.base import SurfaceContext
|
|
9
|
+
from pyglet.graphics.api.gl.gl import GLFunctions, GLuint, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from pyglet.config import SurfaceConfig
|
|
14
|
+
from pyglet.graphics.api.gl.shader import GLDataType, GLFunc
|
|
15
|
+
from ctypes import Array
|
|
16
|
+
from pyglet.window import Window
|
|
17
|
+
from pyglet.graphics.api.gl.xlib.glx_info import GLXInfo
|
|
18
|
+
from pyglet.graphics.api.gl.win32.wgl_info import WGLInfo
|
|
19
|
+
from pyglet.graphics.api.gl.global_opengl import OpenGLBackend
|
|
20
|
+
from pyglet.graphics.api.gl.framebuffer import Framebuffer
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class OpenGLSurfaceContext(SurfaceContext, GLFunctions):
|
|
24
|
+
"""A base OpenGL context for drawing.
|
|
25
|
+
|
|
26
|
+
Use ``DisplayConfig.create_context`` to create a context.
|
|
27
|
+
"""
|
|
28
|
+
gles_pixel_fbo: Framebuffer | None
|
|
29
|
+
#: gl_info.GLInfo instance, filled in on first set_current
|
|
30
|
+
_info: gl_info.GLInfo | None = None
|
|
31
|
+
|
|
32
|
+
#: A container which is shared between all contexts that share GL objects.
|
|
33
|
+
object_space: ObjectSpace
|
|
34
|
+
config: SurfaceConfig
|
|
35
|
+
context_share: OpenGLSurfaceContext | None
|
|
36
|
+
|
|
37
|
+
def __init__(self, core: OpenGLBackend,
|
|
38
|
+
window: Window,
|
|
39
|
+
config: SurfaceConfig,
|
|
40
|
+
platform_info: GLXInfo | WGLInfo | None = None,
|
|
41
|
+
context_share: OpenGLSurfaceContext | None = None,
|
|
42
|
+
platform_func_class: type | None = None) -> None:
|
|
43
|
+
"""Initialize a context.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
config:
|
|
47
|
+
An operating system specific config.
|
|
48
|
+
context_share:
|
|
49
|
+
A context to share objects with. Use ``None`` to disable sharing.
|
|
50
|
+
"""
|
|
51
|
+
self._context = None
|
|
52
|
+
self.core = core
|
|
53
|
+
self.window = window
|
|
54
|
+
self.config = config
|
|
55
|
+
#super().__init__(core, window, config)
|
|
56
|
+
self.context_share = context_share
|
|
57
|
+
self.is_current = False
|
|
58
|
+
self._info = gl_info.GLInfo(platform_info)
|
|
59
|
+
self.platform_func_class = platform_func_class
|
|
60
|
+
self.platform_func = None
|
|
61
|
+
|
|
62
|
+
self.doomed_vaos = []
|
|
63
|
+
self.doomed_framebuffers = []
|
|
64
|
+
|
|
65
|
+
if context_share:
|
|
66
|
+
self.object_space = context_share.object_space
|
|
67
|
+
else:
|
|
68
|
+
self.object_space = ObjectSpace()
|
|
69
|
+
|
|
70
|
+
self.cached_programs = weakref.WeakValueDictionary()
|
|
71
|
+
|
|
72
|
+
# GLES needs an FBO to read pixel data.
|
|
73
|
+
self.gles_pixel_fbo = None
|
|
74
|
+
|
|
75
|
+
def resized(self, width, height):
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
def detach(self):
|
|
79
|
+
self.context = None
|
|
80
|
+
|
|
81
|
+
def __repr__(self) -> str:
|
|
82
|
+
return f"{self.__class__.__name__}(id={id(self)}, share={self.context_share})"
|
|
83
|
+
|
|
84
|
+
def __enter__(self) -> None:
|
|
85
|
+
self.set_current()
|
|
86
|
+
|
|
87
|
+
def __exit__(self, *_args) -> None: # noqa: ANN002
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
def set_clear_color(self, r: float, g: float, b: float, a: float) -> None:
|
|
91
|
+
self.glClearColor(r, g, b, a)
|
|
92
|
+
|
|
93
|
+
def clear(self) -> None:
|
|
94
|
+
self.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
|
95
|
+
|
|
96
|
+
def attach(self, window: Window) -> None:
|
|
97
|
+
"""Attaches a Window and context to the current window.
|
|
98
|
+
|
|
99
|
+
The OS specific child classes create contexts or GL related OS resources.
|
|
100
|
+
|
|
101
|
+
This mostly exists because of Xlib, as GLXWindow requires XWindow creation before the GLXWindow is created.
|
|
102
|
+
However, the GLX Context needs to be created before the XWindow, due to matching
|
|
103
|
+
assign_config (glx_context is created) -> XWindow creation -> Create GLXWindow
|
|
104
|
+
"""
|
|
105
|
+
# if not self.config.compatible(canvas):
|
|
106
|
+
# msg = f'Cannot attach {canvas} to {self}'
|
|
107
|
+
# raise RuntimeError(msg)
|
|
108
|
+
self.window = window
|
|
109
|
+
|
|
110
|
+
def before_draw(self) -> None:
|
|
111
|
+
self.set_current()
|
|
112
|
+
|
|
113
|
+
def set_current(self) -> None:
|
|
114
|
+
"""Make this the active Context.
|
|
115
|
+
|
|
116
|
+
Setting the Context current will also delete any OpenGL
|
|
117
|
+
objects that have been queued for deletion. IE: any objects
|
|
118
|
+
that were created in this Context, but have been called for
|
|
119
|
+
deletion while another Context was active.
|
|
120
|
+
"""
|
|
121
|
+
# Not per-thread
|
|
122
|
+
self.core.current_context = self
|
|
123
|
+
|
|
124
|
+
if not self._info.was_queried:
|
|
125
|
+
GLFunctions.__init__(self)
|
|
126
|
+
# Move this later to a better platform implementation.
|
|
127
|
+
if not self.platform_func and self.platform_func_class:
|
|
128
|
+
self.platform_func = self.platform_func_class()
|
|
129
|
+
self.uniform_getters, self.uniform_setters = self._get_uniform_func_tables()
|
|
130
|
+
self._info.query(self)
|
|
131
|
+
if self.get_info().get_opengl_api() == "gles":
|
|
132
|
+
from pyglet.graphics.api.gl.framebuffer import Framebuffer
|
|
133
|
+
self.gles_pixel_fbo = Framebuffer(context=self)
|
|
134
|
+
|
|
135
|
+
if self.object_space.doomed_textures:
|
|
136
|
+
self._delete_objects(self.object_space.doomed_textures, self.glDeleteTextures)
|
|
137
|
+
if self.object_space.doomed_buffers:
|
|
138
|
+
self._delete_objects(self.object_space.doomed_buffers, self.glDeleteBuffers)
|
|
139
|
+
if self.object_space.doomed_shader_programs:
|
|
140
|
+
self._delete_objects_one_by_one(self.object_space.doomed_shader_programs,
|
|
141
|
+
self.glDeleteProgram)
|
|
142
|
+
if self.object_space.doomed_shaders:
|
|
143
|
+
self._delete_objects_one_by_one(self.object_space.doomed_shaders, self.glDeleteShader)
|
|
144
|
+
if self.object_space.doomed_renderbuffers:
|
|
145
|
+
self._delete_objects(self.object_space.doomed_renderbuffers, self.glDeleteRenderbuffers)
|
|
146
|
+
|
|
147
|
+
if self.doomed_vaos:
|
|
148
|
+
self._delete_objects(self.doomed_vaos, self.glDeleteVertexArrays)
|
|
149
|
+
if self.doomed_framebuffers:
|
|
150
|
+
self._delete_objects(self.doomed_framebuffers, self.glDeleteFramebuffers)
|
|
151
|
+
|
|
152
|
+
# For the static functions below:
|
|
153
|
+
# The garbage collector introduces a race condition.
|
|
154
|
+
# The provided list might be appended to (and only appended to) while this
|
|
155
|
+
# method runs, as it's a `doomed_*` list either on the context or its bject
|
|
156
|
+
# space. If `count` wasn't stored in a local, this method might leak objects.
|
|
157
|
+
@staticmethod
|
|
158
|
+
def _delete_objects(list_: list, deletion_func: Callable[[int, Array[GLuint]], None]) -> None:
|
|
159
|
+
"""Release all OpenGL objects in the given list.
|
|
160
|
+
|
|
161
|
+
Uses the supplied deletion function with the signature ``(GLuint count, GLuint *names)``.
|
|
162
|
+
"""
|
|
163
|
+
count = len(list_)
|
|
164
|
+
to_delete = list_[:count]
|
|
165
|
+
del list_[:count]
|
|
166
|
+
|
|
167
|
+
deletion_func(count, (GLuint * count)(*to_delete))
|
|
168
|
+
|
|
169
|
+
@staticmethod
|
|
170
|
+
def _delete_objects_one_by_one(list_: list, deletion_func: Callable[[GLuint], None]) -> None:
|
|
171
|
+
"""Release all OpenGL objects in the given list.
|
|
172
|
+
|
|
173
|
+
Similar to ``_delete_objects``, but assumes the deletion function's signature to be ``(GLuint name)``.
|
|
174
|
+
|
|
175
|
+
The function is called for each object.
|
|
176
|
+
"""
|
|
177
|
+
count = len(list_)
|
|
178
|
+
to_delete = list_[:count]
|
|
179
|
+
del list_[:count]
|
|
180
|
+
|
|
181
|
+
for name in to_delete:
|
|
182
|
+
deletion_func(GLuint(name))
|
|
183
|
+
|
|
184
|
+
def destroy(self) -> None:
|
|
185
|
+
"""Release the Context.
|
|
186
|
+
|
|
187
|
+
The context will not be useable after being destroyed. Each platform
|
|
188
|
+
has its own convention for releasing the context and the buffer(s)
|
|
189
|
+
that depend on it in the correct order; this should never be called
|
|
190
|
+
by an application.
|
|
191
|
+
"""
|
|
192
|
+
self.detach()
|
|
193
|
+
|
|
194
|
+
if self.core.current_context is self:
|
|
195
|
+
self.core.current_context = None
|
|
196
|
+
#gl_info.remove_active_context()
|
|
197
|
+
|
|
198
|
+
def _safe_to_operate_on_object_space(self) -> bool:
|
|
199
|
+
"""Check if it's safe to interact with this context's object space.
|
|
200
|
+
|
|
201
|
+
This is considered to be the case if the currently active context's
|
|
202
|
+
object space is the same as this context's object space and this
|
|
203
|
+
method is called from the main thread.
|
|
204
|
+
"""
|
|
205
|
+
return (self.object_space is self.core.current_context.object_space and
|
|
206
|
+
threading.current_thread() is threading.main_thread())
|
|
207
|
+
|
|
208
|
+
def _safe_to_operate_on(self) -> bool:
|
|
209
|
+
"""Check whether it is safe to interact with this context.
|
|
210
|
+
|
|
211
|
+
This is considered to be the case if it's the current context and this
|
|
212
|
+
method is called from the main thread.
|
|
213
|
+
"""
|
|
214
|
+
return self.core.current_context is self and threading.current_thread() is threading.main_thread()
|
|
215
|
+
|
|
216
|
+
def delete_texture(self, texture_id: int) -> None:
|
|
217
|
+
"""Safely delete a Texture belonging to this context's object space.
|
|
218
|
+
|
|
219
|
+
This method will delete the texture immediately via
|
|
220
|
+
``glDeleteTextures`` if the current context's object space is the same
|
|
221
|
+
as this context's object space, and it is called from the main thread.
|
|
222
|
+
|
|
223
|
+
Otherwise, the texture will only be marked for deletion, postponing
|
|
224
|
+
it until any context with the same object space becomes active again.
|
|
225
|
+
|
|
226
|
+
This makes it safe to call from anywhere, including other threads.
|
|
227
|
+
"""
|
|
228
|
+
if self._safe_to_operate_on_object_space():
|
|
229
|
+
self.glDeleteTextures(1, GLuint(texture_id))
|
|
230
|
+
else:
|
|
231
|
+
self.object_space.doomed_textures.append(texture_id)
|
|
232
|
+
|
|
233
|
+
def delete_buffer(self, buffer_id: int) -> None:
|
|
234
|
+
"""Safely delete a Buffer belonging to this context's object space.
|
|
235
|
+
|
|
236
|
+
This method behaves similarly to ``delete_texture``, though for
|
|
237
|
+
``glDeleteBuffers`` instead of ``glDeleteTextures``.
|
|
238
|
+
"""
|
|
239
|
+
if self._safe_to_operate_on_object_space():
|
|
240
|
+
self.glDeleteBuffers(1, GLuint(buffer_id))
|
|
241
|
+
else:
|
|
242
|
+
self.object_space.doomed_buffers.append(buffer_id)
|
|
243
|
+
|
|
244
|
+
def delete_shader_program(self, program_id: int) -> None:
|
|
245
|
+
"""Safely delete a ShaderProgram belonging to this context's object space.
|
|
246
|
+
|
|
247
|
+
This method behaves similarly to ``delete_texture``, though for
|
|
248
|
+
``glDeleteProgram`` instead of ``glDeleteTextures``.
|
|
249
|
+
"""
|
|
250
|
+
if self._safe_to_operate_on_object_space():
|
|
251
|
+
self.glDeleteProgram(GLuint(program_id))
|
|
252
|
+
else:
|
|
253
|
+
self.object_space.doomed_shader_programs.append(program_id)
|
|
254
|
+
|
|
255
|
+
def delete_shader(self, shader_id: int) -> None:
|
|
256
|
+
"""Safely delete a Shader belonging to this context's object space.
|
|
257
|
+
|
|
258
|
+
This method behaves similarly to ``delete_texture``, though for
|
|
259
|
+
``glDeleteShader`` instead of ``glDeleteTextures``.
|
|
260
|
+
"""
|
|
261
|
+
if self._safe_to_operate_on_object_space():
|
|
262
|
+
self.glDeleteShader(GLuint(shader_id))
|
|
263
|
+
else:
|
|
264
|
+
self.object_space.doomed_shaders.append(shader_id)
|
|
265
|
+
|
|
266
|
+
def delete_renderbuffer(self, rbo_id: int) -> None:
|
|
267
|
+
"""Safely delete a Renderbuffer belonging to this context's object space.
|
|
268
|
+
|
|
269
|
+
This method behaves similarly to ``delete_texture``, though for
|
|
270
|
+
``glDeleteRenderbuffers`` instead of ``glDeleteTextures``.
|
|
271
|
+
"""
|
|
272
|
+
if self._safe_to_operate_on_object_space():
|
|
273
|
+
self.glDeleteRenderbuffers(1, GLuint(rbo_id))
|
|
274
|
+
else:
|
|
275
|
+
self.object_space.doomed_renderbuffers.append(rbo_id)
|
|
276
|
+
|
|
277
|
+
def delete_vao(self, vao_id: int) -> None:
|
|
278
|
+
"""Safely delete a Vertex Array Object belonging to this context.
|
|
279
|
+
|
|
280
|
+
If this context is not the current context or this method is not
|
|
281
|
+
called from the main thread, its deletion will be postponed until
|
|
282
|
+
this context is next made active again.
|
|
283
|
+
|
|
284
|
+
Otherwise, this method will immediately delete the VAO via
|
|
285
|
+
``glDeleteVertexArrays``.
|
|
286
|
+
"""
|
|
287
|
+
if self._safe_to_operate_on():
|
|
288
|
+
self.glDeleteVertexArrays(1, GLuint(vao_id))
|
|
289
|
+
else:
|
|
290
|
+
self.doomed_vaos.append(vao_id)
|
|
291
|
+
|
|
292
|
+
def delete_framebuffer(self, fbo_id: int) -> None:
|
|
293
|
+
"""Safely delete a Framebuffer Object belonging to this context.
|
|
294
|
+
|
|
295
|
+
This method behaves similarly to ``delete_vao``, though for
|
|
296
|
+
``glDeleteFramebuffers`` instead of ``glDeleteVertexArrays``.
|
|
297
|
+
"""
|
|
298
|
+
if self._safe_to_operate_on():
|
|
299
|
+
self.glDeleteFramebuffers(1, GLuint(fbo_id))
|
|
300
|
+
else:
|
|
301
|
+
self.doomed_framebuffers.append(fbo_id)
|
|
302
|
+
|
|
303
|
+
def get_info(self) -> gl_info.GLInfo:
|
|
304
|
+
"""Get the :py:class:`~GLInfo` instance for this context."""
|
|
305
|
+
return self._info
|
|
306
|
+
|
|
307
|
+
def _get_uniform_func_tables(self):
|
|
308
|
+
_uniform_getters: dict[GLDataType, Callable] = {
|
|
309
|
+
gl.GLint: self.glGetUniformiv,
|
|
310
|
+
gl.GLfloat: self.glGetUniformfv,
|
|
311
|
+
gl.GLboolean: self.glGetUniformiv,
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
_uniform_setters: dict[int, tuple[GLDataType, GLFunc, GLFunc, int]] = {
|
|
315
|
+
# uniform: gl_type, legacy_setter, setter, length
|
|
316
|
+
gl.GL_BOOL: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
317
|
+
gl.GL_BOOL_VEC2: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
|
|
318
|
+
gl.GL_BOOL_VEC3: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
319
|
+
gl.GL_BOOL_VEC4: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 4),
|
|
320
|
+
|
|
321
|
+
gl.GL_INT: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
322
|
+
gl.GL_INT_VEC2: (gl.GLint, self.glUniform2iv, self.glProgramUniform2iv, 2),
|
|
323
|
+
gl.GL_INT_VEC3: (gl.GLint, self.glUniform3iv, self.glProgramUniform3iv, 3),
|
|
324
|
+
gl.GL_INT_VEC4: (gl.GLint, self.glUniform4iv, self.glProgramUniform4iv, 4),
|
|
325
|
+
|
|
326
|
+
gl.GL_FLOAT: (gl.GLfloat, self.glUniform1fv, self.glProgramUniform1fv, 1),
|
|
327
|
+
gl.GL_FLOAT_VEC2: (gl.GLfloat, self.glUniform2fv, self.glProgramUniform2fv, 2),
|
|
328
|
+
gl.GL_FLOAT_VEC3: (gl.GLfloat, self.glUniform3fv, self.glProgramUniform3fv, 3),
|
|
329
|
+
gl.GL_FLOAT_VEC4: (gl.GLfloat, self.glUniform4fv, self.glProgramUniform4fv, 4),
|
|
330
|
+
|
|
331
|
+
# 1D Samplers
|
|
332
|
+
gl.GL_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
333
|
+
gl.GL_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
334
|
+
gl.GL_INT_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
335
|
+
gl.GL_INT_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
336
|
+
gl.GL_UNSIGNED_INT_SAMPLER_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
337
|
+
gl.GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
338
|
+
|
|
339
|
+
# 2D Samplers
|
|
340
|
+
gl.GL_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
341
|
+
gl.GL_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
342
|
+
gl.GL_INT_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
343
|
+
gl.GL_INT_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
344
|
+
gl.GL_UNSIGNED_INT_SAMPLER_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
345
|
+
gl.GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
346
|
+
# Multisample
|
|
347
|
+
gl.GL_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
348
|
+
gl.GL_INT_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
349
|
+
gl.GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
350
|
+
|
|
351
|
+
# Cube Samplers
|
|
352
|
+
gl.GL_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
353
|
+
gl.GL_INT_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
354
|
+
gl.GL_UNSIGNED_INT_SAMPLER_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
355
|
+
gl.GL_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
356
|
+
gl.GL_INT_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
357
|
+
gl.GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
358
|
+
|
|
359
|
+
# 3D Samplers
|
|
360
|
+
gl.GL_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
361
|
+
gl.GL_INT_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
362
|
+
gl.GL_UNSIGNED_INT_SAMPLER_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
363
|
+
|
|
364
|
+
gl.GL_FLOAT_MAT2: (gl.GLfloat, self.glUniformMatrix2fv, self.glProgramUniformMatrix2fv, 4),
|
|
365
|
+
gl.GL_FLOAT_MAT3: (gl.GLfloat, self.glUniformMatrix3fv, self.glProgramUniformMatrix3fv, 6),
|
|
366
|
+
gl.GL_FLOAT_MAT4: (gl.GLfloat, self.glUniformMatrix4fv, self.glProgramUniformMatrix4fv, 16),
|
|
367
|
+
|
|
368
|
+
# TODO: test/implement these:
|
|
369
|
+
# GL_FLOAT_MAT2x3: glUniformMatrix2x3fv, glProgramUniformMatrix2x3fv,
|
|
370
|
+
# GL_FLOAT_MAT2x4: glUniformMatrix2x4fv, glProgramUniformMatrix2x4fv,
|
|
371
|
+
# GL_FLOAT_MAT3x2: glUniformMatrix3x2fv, glProgramUniformMatrix3x2fv,
|
|
372
|
+
# GL_FLOAT_MAT3x4: glUniformMatrix3x4fv, glProgramUniformMatrix3x4fv,
|
|
373
|
+
# GL_FLOAT_MAT4x2: glUniformMatrix4x2fv, glProgramUniformMatrix4x2fv,
|
|
374
|
+
# GL_FLOAT_MAT4x3: glUniformMatrix4x3fv, glProgramUniformMatrix4x3fv,
|
|
375
|
+
|
|
376
|
+
gl.GL_IMAGE_1D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
377
|
+
gl.GL_IMAGE_2D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
|
|
378
|
+
gl.GL_IMAGE_2D_RECT: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
379
|
+
gl.GL_IMAGE_3D: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
380
|
+
|
|
381
|
+
gl.GL_IMAGE_1D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
|
|
382
|
+
gl.GL_IMAGE_2D_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
383
|
+
|
|
384
|
+
gl.GL_IMAGE_2D_MULTISAMPLE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 2),
|
|
385
|
+
gl.GL_IMAGE_2D_MULTISAMPLE_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
386
|
+
|
|
387
|
+
gl.GL_IMAGE_BUFFER: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
388
|
+
gl.GL_IMAGE_CUBE: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 1),
|
|
389
|
+
gl.GL_IMAGE_CUBE_MAP_ARRAY: (gl.GLint, self.glUniform1iv, self.glProgramUniform1iv, 3),
|
|
390
|
+
}
|
|
391
|
+
return _uniform_getters, _uniform_setters
|
|
File without changes
|