Steps to reproduce
- On my embedded system (arm64), run a.out which is generated by opengles.cpp as follow
#include <string.h>
#include <stdio.h>
#include <gtk/gtk.h>
#include <epoxy/gl.h>
unsigned int WIDTH = 800;
unsigned int HEIGHT = 600;
const GLchar *VERTEX_SOURCE =
"#version 300 es\n"
"layout (location = 0) in vec3 aPosition;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPosition, 1.0);\n"
"}\n";
const GLchar *FRAGMENT_SOURCE =
"#version 300 es\n"
"precision mediump float;\n"
"out mediump vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n";
static GtkWidget *gl_area = NULL;
static GLuint vbo;
static GLuint vao;
static GLuint vertex, fragment;
static GLuint program;
static const GLfloat vertex_data[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
static GLuint
create_shader (int type)
{
GLuint shader, program;
shader = glCreateShader (type);
if (type== GL_FRAGMENT_SHADER){
glShaderSource (shader, 1, &FRAGMENT_SOURCE, NULL);
}
if (type== GL_VERTEX_SHADER){
glShaderSource (shader, 1, &VERTEX_SOURCE, NULL);
}
glCompileShader (shader);
return shader;
}
static void
realize (GtkWidget *widget)
{
GdkGLContext *context;
gtk_gl_area_make_current (GTK_GL_AREA (widget));
if (gtk_gl_area_get_error (GTK_GL_AREA (widget)) != NULL)
return;
context = gtk_gl_area_get_context (GTK_GL_AREA (widget));
glGenVertexArrays (1, &vao);
glBindVertexArray (vao);
glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray (0);
vertex = create_shader(GL_VERTEX_SHADER);
fragment = create_shader(GL_FRAGMENT_SHADER);
program = glCreateProgram ();
glAttachShader (program, vertex);
glAttachShader (program, fragment);
glLinkProgram (program);
glDetachShader (program, vertex);
glDetachShader (program, fragment);
}
static gboolean
render (GtkGLArea *area,
GdkGLContext *context)
{
if (gtk_gl_area_get_error (area) != NULL)
return FALSE;
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram (program);
glBindVertexArray (vao);
glDrawArrays (GL_TRIANGLES, 0, 3);
gtk_gl_area_queue_render (area);
return TRUE;
}
int main(int argc, char **argv)
{
GtkWidget *window, *box;
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW(window), WIDTH, HEIGHT);
gtk_window_set_title (GTK_WINDOW(window), "GL Area");
gtk_container_set_border_width (GTK_CONTAINER(window), 10);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
g_object_set (box, "margin", 12, NULL);
gtk_box_set_spacing (GTK_BOX (box), 6);
gtk_container_add (GTK_CONTAINER (window), box);
gl_area = gtk_gl_area_new ();
gtk_box_pack_start (GTK_BOX(box), gl_area, 1, 1, 0);
g_signal_connect (gl_area, "realize", G_CALLBACK (realize), NULL);
g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
g_signal_connect (G_OBJECT(window), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all (GTK_WIDGET(window));
gtk_main();
return 0;
}
- GLArea shows “No GL implementation is available”
Current behavior
Expected outcome
print a triangle on GLArea
Version information
GTK 3.24.34
Additional information
- My environment has installed OpenGL ES, cause I can run
xeglgears
successfully - I even try to not include <epoxy/gl.h>, but include <GLES3/gl3.h> and still get nothing
- the opengles.cpp can run on Ubuntu successfully