Mercurial > touhou
annotate pytouhou/ui/opengl/backend.pyx @ 595:b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 19 Oct 2014 17:22:26 +0200 |
parents | 974decb8df4f |
children | 23b9418e4b2f |
rev | line source |
---|---|
589
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1 from pytouhou.lib import sdl |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 from pytouhou.lib cimport sdl |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
3 from pytouhou.lib.sdl cimport Window |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
4 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
5 from pytouhou.lib.opengl cimport \ |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
6 (glEnable, glHint, glEnableClientState, GL_TEXTURE_2D, GL_BLEND, |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
7 GL_PERSPECTIVE_CORRECTION_HINT, GL_FOG_HINT, GL_NICEST, |
579
b8df946d394d
Add grouping for OpenGL calls, making traces much more readable.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
559
diff
changeset
|
8 GL_COLOR_ARRAY, GL_VERTEX_ARRAY, GL_TEXTURE_COORD_ARRAY, |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
9 glPushDebugGroup, GL_DEBUG_SOURCE_APPLICATION, glPopDebugGroup, |
585
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
10 epoxy_gl_version, epoxy_is_desktop_gl, epoxy_has_gl_extension, |
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
11 GL_PRIMITIVE_RESTART, glPrimitiveRestartIndex, glPixelStorei, |
593
974decb8df4f
Only selects between GL_TRIANGLE_STRIP and GL_TRIANGLES once, in the backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
12 GL_PACK_INVERT_MESA, GL_TRIANGLE_STRIP, GL_TRIANGLES) |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
13 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
14 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
15 GameRenderer = None |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
16 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
17 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
18 def init(options): |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
19 ''' |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
20 Initialize the OpenGL module, and raise if something bad prevents it from |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
21 working. |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
22 ''' |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
23 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
24 cdef str flavor |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
25 |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
26 global profile, major, minor, double_buffer, is_legacy, GameRenderer |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
27 |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
28 flavor = options['flavor'] |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
29 assert flavor in ('core', 'es', 'compatibility', 'legacy') |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
30 profile = (sdl.GL_CONTEXT_PROFILE_CORE if flavor == 'core' else |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
31 sdl.GL_CONTEXT_PROFILE_ES if flavor == 'es' else |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
32 sdl.GL_CONTEXT_PROFILE_COMPATIBILITY) |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
33 |
556
c34b23e29d16
Make the OpenGL flavor and version options work.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
555
diff
changeset
|
34 version = str(options['version']) |
c34b23e29d16
Make the OpenGL flavor and version options work.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
555
diff
changeset
|
35 assert len(version) == 3 and version[1] == '.' |
c34b23e29d16
Make the OpenGL flavor and version options work.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
555
diff
changeset
|
36 major = int(version[0]) |
c34b23e29d16
Make the OpenGL flavor and version options work.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
555
diff
changeset
|
37 minor = int(version[2]) |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
38 |
554
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
39 maybe_double_buffer = options['double-buffer'] |
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
40 double_buffer = maybe_double_buffer if maybe_double_buffer is not None else -1 |
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
41 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
42 is_legacy = flavor == 'legacy' or flavor == 'compatibility' and major < 2 |
557
0f2af7552462
Don’t hardcode GLSL version in our shaders, instead make them dependent on GL version.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
556
diff
changeset
|
43 |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
44 #TODO: check for framebuffer/renderbuffer support. |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
45 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
46 from pytouhou.ui.opengl.gamerenderer import GameRenderer |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
47 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
48 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
49 cdef void discover_features() except *: |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
50 '''Discover which features are supported by our context.''' |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
51 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
52 global use_debug_group, use_vao, use_primitive_restart, use_framebuffer_blit, use_pack_invert |
593
974decb8df4f
Only selects between GL_TRIANGLE_STRIP and GL_TRIANGLES once, in the backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
53 global primitive_mode |
974decb8df4f
Only selects between GL_TRIANGLE_STRIP and GL_TRIANGLES once, in the backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
54 global shader_header |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
55 global is_legacy |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
56 |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
57 version = epoxy_gl_version() |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
58 is_desktop = epoxy_is_desktop_gl() |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
59 is_legacy = is_desktop and version < 20 |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
60 |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
61 use_debug_group = (is_desktop and version >= 43) or epoxy_has_gl_extension('GL_KHR_debug') |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
62 use_vao = (is_desktop and version >= 30) or epoxy_has_gl_extension('GL_ARB_vertex_array_object') |
585
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
63 use_primitive_restart = (is_desktop and version >= 31) |
587
6c9d8a3d853f
Use ARB_framebuffer_blit instead of a second rendering pass for scaled rendering, if supported, and remove framebuffer stuff from the Renderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
585
diff
changeset
|
64 use_framebuffer_blit = (is_desktop and version >= 30) |
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
65 use_pack_invert = epoxy_has_gl_extension('GL_MESA_pack_invert') |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
66 |
593
974decb8df4f
Only selects between GL_TRIANGLE_STRIP and GL_TRIANGLES once, in the backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
67 primitive_mode = GL_TRIANGLE_STRIP if use_primitive_restart else GL_TRIANGLES |
974decb8df4f
Only selects between GL_TRIANGLE_STRIP and GL_TRIANGLES once, in the backend.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
592
diff
changeset
|
68 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
69 if not is_legacy: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
70 if is_desktop: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
71 # gl_FragColor isn’t supported anymore starting with GLSL 4.2. |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
72 if version >= 42: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
73 version = 41 |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
74 try: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
75 glsl_version = {20: 110, 21: 120, 30: 130, 31: 140, 32: 150}[version] |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
76 except KeyError: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
77 assert version >= 33 |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
78 glsl_version = version * 10 |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
79 shader_header = ('#version %d\n\n' % glsl_version).encode() |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
80 else: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
81 # The attribute keyword isn’t supported past GLSL ES 3.0. |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
82 if version >= 30: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
83 version = 20 |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
84 glsl_version = {20: '100', 30: '300 es'}[version] |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
85 shader_header = ('#version %s\n\nprecision highp float;\n\n' % glsl_version).encode() |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
86 |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
87 |
589
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
88 def create_window(title, x, y, width, height, swap_interval): |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
89 '''Create a window (using SDL) and an OpenGL context.''' |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
90 |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
91 sdl.gl_set_attribute(sdl.GL_CONTEXT_PROFILE_MASK, profile) |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
92 sdl.gl_set_attribute(sdl.GL_CONTEXT_MAJOR_VERSION, major) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
93 sdl.gl_set_attribute(sdl.GL_CONTEXT_MINOR_VERSION, minor) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
94 sdl.gl_set_attribute(sdl.GL_DEPTH_SIZE, 24) |
554
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
95 if double_buffer >= 0: |
653a9f087673
Make both double- and single-buffer available on the CLI, but default to SDL’s default.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
553
diff
changeset
|
96 sdl.gl_set_attribute(sdl.GL_DOUBLEBUFFER, double_buffer) |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
97 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
98 flags = sdl.WINDOW_SHOWN | sdl.WINDOW_OPENGL |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
99 if not is_legacy: |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
100 flags |= sdl.WINDOW_RESIZABLE |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
101 |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
102 window = Window(title, x, y, width, height, flags) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
103 window.gl_create_context() |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
104 |
583
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
105 discover_features() |
47cf4e3d159d
Use libepoxy to discover the actual GL version we are using, and available extensions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
582
diff
changeset
|
106 |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
107 #TODO: legacy could support one of the framebuffer extensions for resize, |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
108 # but for now set the window to a fixed size. |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
109 if is_legacy and flags & sdl.WINDOW_RESIZABLE: |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
110 flags &= ~sdl.WINDOW_RESIZABLE |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
111 window = Window(title, x, y, width, height, flags) |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
112 window.gl_create_context() |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
113 |
582
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
114 if use_debug_group: |
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
115 glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, "OpenGL initialisation") |
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
116 |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
117 # Initialize OpenGL |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
118 glEnable(GL_BLEND) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
119 if is_legacy: |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
120 glEnable(GL_TEXTURE_2D) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
121 glHint(GL_FOG_HINT, GL_NICEST) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
122 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
123 glEnableClientState(GL_COLOR_ARRAY) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
124 glEnableClientState(GL_VERTEX_ARRAY) |
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
125 glEnableClientState(GL_TEXTURE_COORD_ARRAY) |
582
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
126 |
585
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
127 if use_primitive_restart: |
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
128 glEnable(GL_PRIMITIVE_RESTART) |
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
129 glPrimitiveRestartIndex(0xFFFF); |
e0166cda75d5
Use primitive-restart to lower the size of our ibo, if supported.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
583
diff
changeset
|
130 |
592
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
131 if use_pack_invert: |
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
132 glPixelStorei(GL_PACK_INVERT_MESA, True) |
19d930f9e3f0
Add the screenshot feature, using P or Home like the original game.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
590
diff
changeset
|
133 |
582
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
134 if use_debug_group: |
6e79756b7f42
Don’t call gl*DebugGroup if it isn’t exposed by the driver.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
579
diff
changeset
|
135 glPopDebugGroup() |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
136 |
589
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
137 if swap_interval is not None: |
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
138 try: |
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
139 sdl.gl_set_swap_interval(swap_interval) |
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
140 except sdl.SDLError: |
595
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
141 # The OpenGL context doesn’t support setting the swap interval, |
b7b4a234bf70
Fix legacy OpenGL support, and detect the absence of non-legacy context with libepoxy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
593
diff
changeset
|
142 # we’ll probably fallback to SDL_Delay-based clocking. |
589
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
143 pass |
0768122da817
Add a frameskip option, and use swap interval to implement it.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
144 |
553
8f51e34d911c
Refactor graphics backend selection, to make them fallbackable and optional.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
145 return window |