mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # This file is part of NIT ( http://www.nitlanguage.org ).
 | |
| #
 | |
| # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| # Basic example of OpenGL ES 2.0 usage from the book OpenGL ES 2.0 Programming Guide.
 | |
| #
 | |
| # Code reference:
 | |
| # https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c 
 | |
| module opengles2_hello_triangle
 | |
| 
 | |
| import glesv2
 | |
| import egl
 | |
| import mnit_linux # for sdl
 | |
| import x11
 | |
| 
 | |
| if "NIT_TESTING".environ == "true" then exit(0)
 | |
| 
 | |
| var window_width = 800
 | |
| var window_height = 600
 | |
| 
 | |
| #
 | |
| ## SDL
 | |
| #
 | |
| var sdl_display = new SDLDisplay(window_width, window_height)
 | |
| var sdl_wm_info = new SDLSystemWindowManagerInfo
 | |
| var x11_window_handle = sdl_wm_info.x11_window_handle
 | |
| 
 | |
| #
 | |
| ## X11
 | |
| #
 | |
| var x_display = x_open_default_display
 | |
| assert x_display != 0 else print "x11 fail"
 | |
| 
 | |
| #
 | |
| ## EGL
 | |
| #
 | |
| var egl_display = new EGLDisplay(x_display)
 | |
| assert egl_display.is_valid else print "EGL display is not valid"
 | |
| egl_display.initialize
 | |
| 
 | |
| print "EGL version: {egl_display.version}"
 | |
| print "EGL vendor: {egl_display.vendor}"
 | |
| print "EGL extensions: {egl_display.extensions.join(", ")}"
 | |
| print "EGL client APIs: {egl_display.client_apis.join(", ")}"
 | |
| 
 | |
| assert egl_display.is_valid else print egl_display.error
 | |
| 
 | |
| var config_chooser = new EGLConfigChooser
 | |
| #config_chooser.surface_type_egl
 | |
| config_chooser.blue_size = 8
 | |
| config_chooser.green_size = 8
 | |
| config_chooser.red_size = 8
 | |
| #config_chooser.alpha_size = 8
 | |
| #config_chooser.depth_size = 8
 | |
| #config_chooser.stencil_size = 8
 | |
| #config_chooser.sample_buffers = 1
 | |
| config_chooser.close
 | |
| 
 | |
| var configs = config_chooser.choose(egl_display)
 | |
| assert configs != null else print "choosing config failed: {egl_display.error}"
 | |
| assert not configs.is_empty else print "no EGL config"
 | |
| 
 | |
| print "{configs.length} EGL configs available"
 | |
| for config in configs do
 | |
| 	var attribs = config.attribs(egl_display)
 | |
| 	print "* caveats: {attribs.caveat}"
 | |
| 	print "  conformant to: {attribs.conformant}"
 | |
| 	print "  size of RGBA: {attribs.red_size} {attribs.green_size} {attribs.blue_size} {attribs.alpha_size}"
 | |
| 	print "  buffer, depth, stencil: {attribs.buffer_size} {attribs.depth_size} {attribs.stencil_size}"
 | |
| end
 | |
| 
 | |
| var config = configs.first
 | |
| 
 | |
| var format = config.attribs(egl_display).native_visual_id
 | |
| 
 | |
| # TODO android part
 | |
| # Opengles1Display_midway_init(recv, format);
 | |
| 
 | |
| var surface = egl_display.create_window_surface(config, x11_window_handle, [0])
 | |
| assert surface.is_ok else print egl_display.error
 | |
| 
 | |
| var context = egl_display.create_context(config)
 | |
| assert context.is_ok else print egl_display.error
 | |
| 
 | |
| var make_current_res = egl_display.make_current(surface, surface, context)
 | |
| assert make_current_res
 | |
| 
 | |
| var width = surface.attribs(egl_display).width
 | |
| var height = surface.attribs(egl_display).height
 | |
| print "Width: {width}"
 | |
| print "Height: {height}"
 | |
| 
 | |
| assert egl_bind_opengl_es_api else print "eglBingAPI failed: {egl_display.error}"
 | |
| 
 | |
| #
 | |
| ## GLESv2
 | |
| #
 | |
| 
 | |
| print "Can compile shaders? {gl_shader_compiler}"
 | |
| assert_no_gl_error
 | |
| 
 | |
| assert gl_shader_compiler else print "Cannot compile shaders"
 | |
| 
 | |
| # gl program
 | |
| print gl_error.to_s
 | |
| var program = new GLProgram
 | |
| if not program.is_ok then
 | |
| 	print "Program is not ok: {gl_error.to_s}\nLog:"
 | |
| 	print program.info_log
 | |
| 	abort
 | |
| end
 | |
| assert_no_gl_error
 | |
| 
 | |
| # vertex shader
 | |
| var vertex_shader = new GLVertexShader
 | |
| assert vertex_shader.is_ok else print "Vertex shader is not ok: {gl_error}"
 | |
| vertex_shader.source = """
 | |
| attribute vec4 vPosition;   
 | |
| void main()                 
 | |
| {                           
 | |
|   gl_Position = vPosition;  
 | |
| }                           """
 | |
| vertex_shader.compile
 | |
| assert vertex_shader.is_compiled else print "Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}"
 | |
| assert_no_gl_error
 | |
| 
 | |
| # fragment shader
 | |
| var fragment_shader = new GLFragmentShader
 | |
| assert fragment_shader.is_ok else print "Fragment shader is not ok: {gl_error}"
 | |
| fragment_shader.source = """
 | |
| precision mediump float;
 | |
| void main()
 | |
| {
 | |
| 	gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
 | |
| }
 | |
| """
 | |
| fragment_shader.compile
 | |
| assert fragment_shader.is_compiled else print "Fragment shader compilation failed with: {fragment_shader.info_log}"
 | |
| assert_no_gl_error
 | |
| 
 | |
| program.attach_shader vertex_shader
 | |
| program.attach_shader fragment_shader
 | |
| program.bind_attrib_location(0, "vPosition")
 | |
| program.link
 | |
| assert program.is_linked else print "Linking failed: {program.info_log}"
 | |
| assert_no_gl_error
 | |
| 
 | |
| # draw!
 | |
| var vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0]
 | |
| var vertex_array = new VertexArray(0, 3, vertices)
 | |
| vertex_array.attrib_pointer
 | |
| gl_clear_color(0.5, 0.0, 0.5, 1.0)
 | |
| for i in [0..10000[ do
 | |
| 	printn "."
 | |
| 	assert_no_gl_error
 | |
| 	gl_viewport(0, 0, width, height)
 | |
| 	gl_clear_color_buffer
 | |
| 	program.use
 | |
| 	vertex_array.enable
 | |
| 	vertex_array.draw_arrays_triangles
 | |
| 	egl_display.swap_buffers(surface)
 | |
| end
 | |
| 
 | |
| # delete
 | |
| program.delete
 | |
| vertex_shader.delete
 | |
| fragment_shader.delete
 | |
| 
 | |
| #
 | |
| ## EGL
 | |
| #
 | |
| # close
 | |
| egl_display.make_current(new EGLSurface.none, new EGLSurface.none, new EGLContext.none)
 | |
| egl_display.destroy_context(context)
 | |
| egl_display.destroy_surface(surface)
 | |
| 
 | |
| #
 | |
| ## SDL
 | |
| #
 | |
| # close
 | |
| sdl_display.destroy
 |