1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Basic example of OpenGL ES 2.0 usage from the book OpenGL ES 2.0 Programming Guide.
20 # https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c
21 module opengles2_hello_triangle
25 import mnit_linux
# for sdl
28 if "NIT_TESTING".environ
== "true" then exit
(0)
30 var window_width
= 800
31 var window_height
= 600
36 var sdl_display
= new SDLDisplay(window_width
, window_height
)
37 var sdl_wm_info
= new SDLSystemWindowManagerInfo
38 var x11_window_handle
= sdl_wm_info
.x11_window_handle
43 var x_display
= x_open_default_display
44 assert x_display
!= 0 else print
"x11 fail"
49 var egl_display
= new EGLDisplay(x_display
)
50 assert egl_display
.is_valid
else print
"EGL display is not valid"
51 egl_display
.initialize
53 print
"EGL version: {egl_display.version}"
54 print
"EGL vendor: {egl_display.vendor}"
55 print
"EGL extensions: {egl_display.extensions.join(", ")}"
56 print
"EGL client APIs: {egl_display.client_apis.join(", ")}"
58 assert egl_display
.is_valid
else print egl_display
.error
60 var config_chooser
= new EGLConfigChooser
61 #config_chooser.surface_type_egl
62 config_chooser
.blue_size
= 8
63 config_chooser
.green_size
= 8
64 config_chooser
.red_size
= 8
65 #config_chooser.alpha_size = 8
66 #config_chooser.depth_size = 8
67 #config_chooser.stencil_size = 8
68 #config_chooser.sample_buffers = 1
71 var configs
= config_chooser
.choose
(egl_display
)
72 assert configs
!= null else print
"choosing config failed: {egl_display.error}"
73 assert not configs
.is_empty
else print
"no EGL config"
75 var config
= configs
.first
77 var format
= config
.attribs
(egl_display
).native_visual_id
80 # Opengles1Display_midway_init(recv, format);
82 var surface
= egl_display
.create_window_surface
(config
, x11_window_handle
, [0])
83 assert surface
.is_ok
else print egl_display
.error
85 var context
= egl_display
.create_context
(config
)
86 assert context
.is_ok
else print egl_display
.error
88 var make_current_res
= egl_display
.make_current
(surface
, surface
, context
)
89 assert make_current_res
91 var width
= surface
.attribs
(egl_display
).width
92 var height
= surface
.attribs
(egl_display
).height
93 print
"Width: {width}"
94 print
"Height: {height}"
96 assert egl_bind_opengl_es_api
else print
"eglBingAPI failed: {egl_display.error}"
102 print
"Can compile shaders? {gl_shader_compiler}"
105 assert gl_shader_compiler
else print
"Cannot compile shaders"
109 var program
= new GLProgram
110 if not program
.is_ok
then
111 print
"Program is not ok: {gl_error.to_s}\nLog:"
112 print program
.info_log
118 var vertex_shader
= new GLVertexShader
119 assert vertex_shader
.is_ok
else print
"Vertex shader is not ok: {gl_error}"
120 vertex_shader
.source
= """
121 attribute vec4 vPosition;
124 gl_Position = vPosition;
126 vertex_shader
.compile
127 assert vertex_shader
.is_compiled
else print
"Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}"
131 var fragment_shader
= new GLFragmentShader
132 assert fragment_shader
.is_ok
else print
"Fragment shader is not ok: {gl_error}"
133 fragment_shader
.source
= """
134 precision mediump float;
137 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
140 fragment_shader
.compile
141 assert fragment_shader
.is_compiled
else print
"Fragment shader compilation failed with: {fragment_shader.info_log}"
144 program
.attach_shader vertex_shader
145 program
.attach_shader fragment_shader
146 program
.bind_attrib_location
(0, "vPosition")
148 assert program
.is_linked
else print
"Linking failed: {program.info_log}"
152 var vertices
= [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0]
153 var vertex_array
= new VertexArray(0, 3, vertices
)
154 vertex_array
.attrib_pointer
155 gl_clear_color
(0.5, 0.0, 0.5, 1.0)
156 for i
in [0..10000[ do
159 gl_viewport
(0, 0, width
, height
)
160 gl_clear_color_buffer
163 vertex_array
.draw_arrays_triangles
164 egl_display
.swap_buffers
(surface
)
170 fragment_shader
.delete
176 egl_display
.make_current
(new EGLSurface.none
, new EGLSurface.none
, new EGLContext.none
)
177 egl_display
.destroy_context
(context
)
178 egl_display
.destroy_surface
(surface
)