mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +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
|