[Title] Implemented fastpath for OpenGL ES 3.0 (FINAL)
authorHaegeun Park <haegeun.park@samsung.com>
Tue, 19 Nov 2013 12:57:06 +0000 (04:57 -0800)
committerHaegeun Park <haegeun.park@samsung.com>
Wed, 20 Nov 2013 05:57:42 +0000 (21:57 -0800)
[Issue#]
[Problem]
[Cause]
[Solution]

[INTERNAL] Stabilized logics with Adreno

Makefile
src/coregl_internal.h
src/modules/fastpath/coregl_fastpath.c
src/modules/fastpath/coregl_fastpath_gl.c
src/modules/fastpath/coregl_fastpath_state.h
src/modules/tracepath/coregl_tracepath.c

index c70fa48..15a1477 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ COMPILE_DATE = "\"`git log -1 --pretty=format:%ci`\""
 VENDOR_EGL_LIB_PATH = "\"/usr/lib/egl/libEGL.so\""
 VENDOR_GL_LIB_PATH = "\"/usr/lib/egl/libGLESv2.so\""
 
-CFLAGS = -g -O2 -fvisibility=hidden -fPIC -Wall -std=c99 -D_COREGL_COMPILE_DATE=$(COMPILE_DATE)
+CFLAGS = -g -O2 -fvisibility=hidden -fPIC -fno-strict-aliasing -Wall -std=c99 -D_COREGL_COMPILE_DATE=$(COMPILE_DATE)
 CFLAGS += -D_COREGL_VENDOR_EGL_LIB_PATH=$(VENDOR_EGL_LIB_PATH)
 CFLAGS += -D_COREGL_VENDOR_GL_LIB_PATH=$(VENDOR_GL_LIB_PATH)
 CFLAGS += `pkg-config --cflags dlog`
index 328fd47..c9990bf 100644 (file)
@@ -57,6 +57,9 @@
        fflush(trace_fp)
 #define _COREGL_TRACE_OUTPUT_INTERVAL_SEC 5
 
+static inline GLint GET_INT_FROM_FLOAT(GLfloat value) { return *((GLint *)&value); }
+static inline GLuint GET_UINT_FROM_FLOAT(GLfloat value) { return *((GLint *)&value); }
+
 
 #ifdef COREGL_DEBUG
 # define AST(expr) \
index 5a0facf..21de2a1 100644 (file)
@@ -109,7 +109,11 @@ _state_get_uniform_buffer_bindings(GLuint *params)
        int i;
        for (i = 0; i < initial_ctx->gl_num_uniform_buffer_bindings[0]; i++)
        {
-               _orig_fastpath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, &(((GLint *)params)[i]));
+/////////////////////////////////////////////////////////////////////////////////
+// XXXX : AVOID SEGFAULT in ADRENO
+               ((GLint *)params)[i] = 0;
+//             _orig_fastpath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, &(((GLint *)params)[i]));
+/////////////////////////////////////////////////////////////////////////////////
        }
 }
 
index 692ba35..aaf5114 100644 (file)
@@ -243,16 +243,54 @@ fastpath_release_gl_context(GLGlueContext *gctx)
        }
 }
 
+
+static float
+_get_gl_version()
+{
+       float GLver = 0.0;
+       const char *vret;
+       int vlen = _COREGL_INT_INIT_VALUE;
+       int i = _COREGL_INT_INIT_VALUE;
+       char vret_tmp[80 + 1] = { 0 };
+       IF_GL_SUCCESS(vret = (const char *)_orig_fastpath_glGetString(GL_VERSION))
+       {
+               vlen = (int)strlen(vret);
+               if (!strncmp(vret, "OpenGL ES", 9) && vlen >= 11)
+               {
+                       int stp = 10;
+                       if (vret[9] == '-')
+                       {
+                               if (vlen < 14) return 0.0f;
+                               stp = 13;
+                       }
+
+                       for (i = stp; ; i++)
+                       {
+                               if (vret[i] == ' ' || vret[i] == 0x00 || i >= 80)
+                               {
+                                       strncpy(vret_tmp, &vret[stp], i - stp);
+                                       vret_tmp[i - stp] = 0x00;
+                                       break;
+                               }
+                       }
+                       if (vret_tmp[0] != 0x00)
+                               GLver = atof(vret_tmp);
+               }
+       }
+       return GLver;
+}
+
+
 Mutex extension_check_mutex = MUTEX_INITIALIZER;
 char string_extensions[16384] = { 0x00 };
 char string_each_extensions[128][64];
 int gl_extension_count = 0;
 
+
 static void
 _valid_extension_string()
 {
        char string_tmpbuf[2048];
-       int i = _COREGL_INT_INIT_VALUE;
        const char *res = NULL;
 
        AST(mutex_lock(&extension_check_mutex) == 1);
@@ -263,29 +301,7 @@ _valid_extension_string()
                {
                        if (string_extensions[0] == 0x00)
                        {
-                               double GLver = 0.0;
-                               const char *vret;
-                               char vret_tmp[80] = { 0 };
-                               IF_GL_SUCCESS(vret = (const char *)_orig_fastpath_glGetString(GL_VERSION))
-                               {
-                                       if (!strncmp(vret, "OpenGL ES", 9))
-                                       {
-                                               int stp = 10;
-                                               if (vret[9] == '-') stp = 13;
-
-                                               for (i = stp; ; i++)
-                                               {
-                                                       if (vret[i] == ' ' || vret[i] == 0x00 || i >= 80)
-                                                       {
-                                                               strncpy(vret_tmp, &vret[stp], i - stp);
-                                                               vret_tmp[i - stp] = 0x00;
-                                                               break;
-                                                       }
-                                               }
-                                               if (vret_tmp[0] != 0x00)
-                                                       GLver = atof(vret_tmp);
-                                       }
-                               }
+                               double GLver = _get_gl_version();
 
                                strcpy(string_tmpbuf, res);
                                char *fstr = &string_tmpbuf[0], *estr = NULL;
@@ -354,6 +370,7 @@ fastpath_glGetString(GLenum name)
 {
        const char *ret = NULL;
        static const char *string_gles20 = "OpenGL ES 2.0";
+       static const char *string_gles30 = "OpenGL ES 3.0";
 
        DEFINE_FASTPAH_GL_FUNC();
        _COREGL_FASTPATH_FUNC_BEGIN();
@@ -364,7 +381,13 @@ fastpath_glGetString(GLenum name)
                case GL_VERSION:
                        IF_GL_SUCCESS(ret = (const char *)_orig_fastpath_glGetString(name))
                        {
-                               if (strncmp(ret, "OpenGL ES 2.0", 13))
+                               double GLver = _get_gl_version();
+                               if (GLver > 3.0)
+                               {
+                                       COREGL_WRN("\E[40;31;1mFastpath can't support %s (Fixed to %s)\E[0m\n", ret, string_gles30);
+                                       ret = string_gles30;
+                               }
+                               if (GLver < 2.0)
                                {
                                        COREGL_WRN("\E[40;31;1mFastpath can't support %s (Fixed to %s)\E[0m\n", ret, string_gles20);
                                        ret = string_gles20;
index 866dffc..7a2cfb6 100644 (file)
@@ -210,11 +210,11 @@ GLUE_STATE(GLfloat, gl_vertex_attrib_value, 4 * INITIAL_CTX->gl_num_vertex_attri
            SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, SET_4(0, 0, 0, 1)),
            SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, _sym_glGetVertexAttribfv(i, GL_CURRENT_VERTEX_ATTRIB, (GLfloat *)value);))
 GLUE_STATE(GLint, gl_vertex_attrib_value_integer, 4 * INITIAL_CTX->gl_num_vertex_attribs[0], MAX_VERTEX_ATTRIBS,
-           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, SET_4(0, 0, 0, 1)),
-           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, _sym_glGetVertexAttribfv(i, GL_CURRENT_VERTEX_ATTRIB, (GLfloat *)value);))
+           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, SET_4(0, 0, 0, GET_INT_FROM_FLOAT(1.0f))),
+           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, _sym_glGetVertexAttribIiv(i, GL_CURRENT_VERTEX_ATTRIB, (GLint *)value);))
 GLUE_STATE(GLuint, gl_vertex_attrib_value_unsigned_integer, 4 * INITIAL_CTX->gl_num_vertex_attribs[0], MAX_VERTEX_ATTRIBS,
-           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, SET_4(0, 0, 0, 1)),
-           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, _sym_glGetVertexAttribfv(i, GL_CURRENT_VERTEX_ATTRIB, (GLfloat *)value);))
+           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, SET_4(0, 0, 0, GET_UINT_FROM_FLOAT(1.0f))),
+           SET_N(INITIAL_CTX->gl_num_vertex_attribs[0], 4, _sym_glGetVertexAttribIuiv(i, GL_CURRENT_VERTEX_ATTRIB, (GLuint *)value);))
 
 // MISC FLAG 3
 GLUE_STATE(GLenum, gl_read_buffer, 1, 1, SET_1(GL_BACK), _sym_glGetIntegerv(GL_READ_BUFFER, (GLint *)value);)
index ec34b73..af6a512 100755 (executable)
@@ -168,7 +168,11 @@ _state_get_uniform_buffer_bindings(GLuint *params)
        int i;
        for (i = 0; i < initial_fake_ctx->gl_num_uniform_buffer_bindings[0]; i++)
        {
-               _orig_tracepath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, &(((GLint *)params)[i]));
+/////////////////////////////////////////////////////////////////////////////////
+// XXXX : AVOID SEGFAULT in ADRENO
+               ((GLint *)params)[i] = 0;
+//             _orig_tracepath_glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, &(((GLint *)params)[i]));
+/////////////////////////////////////////////////////////////////////////////////
        }
 }