Hi, igor
Thank you for suggesting.
However, for right now, i changed the yocto image to use fb backend.
After changing to that, i was able to see fbCreateWindow and other functions to init egl and gles works normally.
However, 'glClear' function cause segmentation fault error.
I checked using gdb and gdb shows the below message.
===========================================
Program received signal SIGSEGV, Segmentation fault.
__glEvaluateSystemDrawableChange (gc=0x12539c, flags=1) at src/glcore/gc_es_context.c:676
676 src/glcore/gc_es_context.c: No such file or directory.
===========================================
Could you suggest the solution of this problem?
The whole source code is below.
============================================
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <EGL/egl.h>
#include <EGL/eglvivante.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <cstring>
#include <unistd.h>
//Configure window size here
#define WIDTH 720
#define HEIGHT 576
#define TRUE 1
#define FALSE 0
EGLNativeDisplayType display;
EGLNativeWindowType window;
EGLDisplay _eglDisplay;
EGLSurface _eglSurface;
EGLContext _eglContext;
EGLint numConfigs = 0;
EGLConfig eglConfig;
void init_egl()
{
display = fbGetDisplayByIndex( 0 );
assert( display );
// setup attribs
static const EGLint configAttribs[] =
{
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8, // buffers with the smallest alpha component size are preferred
EGL_DEPTH_SIZE, 1,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};
// create a context
EGLint contextAttribs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
_eglDisplay = eglGetDisplay( display );
assert( EGL_SUCCESS == eglGetError() );
assert( 0 != _eglDisplay );
eglInitialize( _eglDisplay, NULL, NULL );
assert( EGL_SUCCESS == eglGetError() );
eglBindAPI(EGL_OPENGL_ES_API);
eglChooseConfig( _eglDisplay, configAttribs, &eglConfig, 1, &numConfigs );
assert( EGL_SUCCESS == eglGetError() );
assert( 1 == numConfigs );
window = fbCreateWindow( display, 0, 0, WIDTH, HEIGHT );
assert( window );
printf("DEBUG : fbCreateWindow done.\n");
_eglSurface = eglCreateWindowSurface( _eglDisplay, eglConfig, window, NULL );
EGLint iErr = eglGetError();
switch(iErr) {
case EGL_SUCCESS :
printf("EGL_SUCCESS");
break;
case EGL_NOT_INITIALIZED :
printf("EGL_NOT_INITIALIZED");
break;
case EGL_BAD_ACCESS :
printf("EGL_BAD_ACCESS");
break;
case EGL_BAD_ALLOC :
printf("EGL_SUCCESS");
break;
case EGL_BAD_ATTRIBUTE :
printf("EGL_SUCCESS");
break;
default :
printf("Another error");
break;
}
printf("\n");
assert( EGL_SUCCESS == eglGetError() );
printf("DEBUG : eglCreateWindowSurface Done.\n");
//assert( EGL_SUCCESS == eglGetError() );
_eglContext = eglCreateContext( _eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs );
assert( EGL_SUCCESS == eglGetError() );
iErr = eglGetError();
switch(iErr) {
case EGL_SUCCESS :
printf("EGL_SUCCESS");
break;
case EGL_NOT_INITIALIZED :
printf("EGL_NOT_INITIALIZED");
break;
case EGL_BAD_ACCESS :
printf("EGL_BAD_ACCESS");
break;
case EGL_BAD_ALLOC :
printf("EGL_SUCCESS");
break;
case EGL_BAD_ATTRIBUTE :
printf("EGL_SUCCESS");
break;
default :
printf("Another error");
break;
}
printf("\n");
assert( EGL_SUCCESS == eglGetError() );
printf("DEBUG : eglCreateContext Done.\n");
eglMakeCurrent( _eglDisplay, _eglSurface, _eglSurface, _eglContext );
assert( EGL_SUCCESS == eglGetError() );
iErr = eglGetError();
switch(iErr) {
case EGL_SUCCESS :
printf("EGL_SUCCESS");
break;
case EGL_NOT_INITIALIZED :
printf("EGL_NOT_INITIALIZED");
break;
case EGL_BAD_ACCESS :
printf("EGL_BAD_ACCESS");
break;
case EGL_BAD_ALLOC :
printf("EGL_SUCCESS");
break;
case EGL_BAD_ATTRIBUTE :
printf("EGL_SUCCESS");
break;
default :
printf("Another error");
break;
}
printf("\n");
printf("DEBUG : eglMakeCurrent Done.\n");
}
const char* vertexShaderStr =
"attribute vec4 vPosition; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
"} \n";
const char* fragmentShaderStr =
"precision mediump float; \n"
"void main() \n"
"{ \n"
" gl_FragColor = vec4(0.0, 1.0, 0.0 ,1.0);\n"
"} \n";
GLfloat vVertices[] = { -0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f, };
GLuint shaderProgram = 0;
GLuint textureId;
GLint positionLoc;
GLint texCoordLoc;
GLint samplerLoc;
GLint length;
GLint ret;
GLuint vertexShader;
GLuint fragmentShader;
GLuint loadShader (const char *shaderSrc, GLenum type)
{
GLuint shader;
GLint compiled;
/* Create the shader object */
shader = glCreateShader(type);
if (shader == 0)
{
printf("Failed to create Shader..\n");
return FALSE;
}
/* Load the shader source */
glShaderSource(shader, 1, &shaderSrc, NULL);
/* Compile the shader */
glCompileShader(shader);
/* Check the compile status */
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (!compiled)
{
GLint infoLen = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1)
{
char *infoLog = (char*)malloc(sizeof(char) * infoLen);
glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
printf("Error compiling shader:\n%s\n", infoLog);
free(infoLog);
}
glDeleteShader(shader);
return FALSE;
}
return shader;
}
int glesInit()
{
vertexShader = loadShader(vertexShaderStr, GL_VERTEX_SHADER);
fragmentShader = loadShader(fragmentShaderStr, GL_FRAGMENT_SHADER);
shaderProgram = glCreateProgram();
if (shaderProgram == 0)
{
printf("Failed to create Shader program..\n");
return FALSE;
}
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
/* Bind vPosition to attribute 0 */
glBindAttribLocation(shaderProgram, 0, "vPosition");
/* Link the program */
glLinkProgram(shaderProgram);
/* Check the link status */
GLint linked;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linked);
if (!linked)
{
GLint infoLen = 0;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1)
{
char *infoLog = (char*)malloc(sizeof(char) * infoLen);
glGetProgramInfoLog(shaderProgram, infoLen, NULL, infoLog);
printf("Failed to link Shader program..\n%s\n", infoLog);
free(infoLog);
}
glDeleteProgram(shaderProgram);
return FALSE;
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
return TRUE;
}
int main(int argc,char *argv[])
{
init_egl();
printf("egl Init Done.\n");
/* init GLES */
if (glesInit() != TRUE)
{
printf("Failed to initialize GLES..\n");
return -1;
}
printf("gles Init Done.\n");
int ret = 0;
int running = 1;
GLenum err;
while( running && ret != -1 )
{
/* Draw */
glViewport(0, 0, WIDTH, HEIGHT);
printf("glViewport.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
printf("before glClear.\n");
glClear(GL_COLOR_BUFFER_BIT); /**************Segmentation Fault here************************/
printf("glClear.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
glUseProgram(shaderProgram);
printf("glUseProgram.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
printf("glVertexAttribPointer.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
glEnableVertexAttribArray(0);
printf("glEnableVertexAttribArray.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
glDrawArrays(GL_TRIANGLES, 0, 3);
printf("glDrawArrays.\n");
err = glGetError();
if (err != GL_NO_ERROR)
printf("0x%x\n", err);
eglSwapBuffers(_eglDisplay, _eglSurface);
EGLint iErr = eglGetError();
switch(iErr) {
case EGL_SUCCESS :
printf("EGL_SUCCESS");
break;
case EGL_NOT_INITIALIZED :
printf("EGL_NOT_INITIALIZED");
break;
case EGL_BAD_ACCESS :
printf("EGL_BAD_ACCESS");
break;
case EGL_BAD_ALLOC :
printf("EGL_SUCCESS");
break;
case EGL_BAD_ATTRIBUTE :
printf("EGL_SUCCESS");
break;
default :
printf("Another error");
break;
}
printf("\n");
}
return 0;
}
Best Regards,
Yoo