Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46b4253b authored by Duane Sand's avatar Duane Sand
Browse files

[MIPS] Add MIPS architecture support to opengl framework

Change-Id: Id7704d35bed14d96a85dc1f29db0566cd03872b5
parent cd91024c
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ namespace android {

#if USE_FAST_TLS_KEY

    #if defined(__arm__)

    #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n"

    #define API_ENTRY(_api) __attribute__((naked)) _api
@@ -57,6 +59,41 @@ namespace android {
            :                                                   \
            );

    #elif defined(__mips__)

        #define API_ENTRY(_api) __attribute__((noinline)) _api

        #define CALL_GL_EXTENSION_API(_api, ...)                    \
            register unsigned int t0 asm("t0");                     \
            register unsigned int fn asm("t1");                     \
            register unsigned int tls asm("v1");                    \
            asm volatile(                                           \
                ".set  push\n\t"                                    \
                ".set  noreorder\n\t"                               \
                ".set  mips32r2\n\t"                                \
                "rdhwr %[tls], $29\n\t"                             \
                "lw    %[t0], %[OPENGL_API](%[tls])\n\t"            \
                "beqz  %[t0], 1f\n\t"                               \
                " move %[fn], $ra\n\t"                              \
                "lw    %[fn], %[API](%[t0])\n\t"                    \
                "movz  %[fn], $ra, %[fn]\n\t"                       \
                "1:\n\t"                                            \
                "j     %[fn]\n\t"                                   \
                " nop\n\t"                                          \
                ".set  pop\n\t"                                     \
                : [fn] "=c"(fn),                                    \
                  [tls] "=&r"(tls),                                 \
                  [t0] "=&r"(t0)                                    \
                : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4),          \
                  [API] "I"(__builtin_offsetof(gl_hooks_t,          \
                                          ext.extensions[_api]))    \
                :                                                   \
            );

    #else
        #error Unsupported architecture
    #endif

    #define GL_EXTENSION_NAME(_n)   __glExtFwd##_n

    #define GL_EXTENSION(_n)                         \
+40 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ using namespace android;

#if USE_FAST_TLS_KEY

  #if defined(__arm__)

    #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n"

    #define API_ENTRY(_api) __attribute__((naked)) _api
@@ -59,6 +61,44 @@ using namespace android;
            :                                                   \
            );

  #elif defined(__mips__)

    #define API_ENTRY(_api) __attribute__((noinline)) _api

    #define CALL_GL_API(_api, ...)                               \
        register unsigned int t0 asm("t0");                      \
        register unsigned int fn asm("t1");                      \
        register unsigned int tls asm("v1");                     \
        register unsigned int v0 asm("v0");                      \
        asm volatile(                                            \
            ".set  push\n\t"                                     \
            ".set  noreorder\n\t"                                \
            ".set mips32r2\n\t"                                  \
            "rdhwr %[tls], $29\n\t"                              \
            "lw    %[t0], %[OPENGL_API](%[tls])\n\t"             \
            "beqz  %[t0], 1f\n\t"                                \
            " move %[fn],$ra\n\t"                                \
            "lw    %[fn], %[API](%[t0])\n\t"                     \
            "movz  %[fn], $ra, %[fn]\n\t"                        \
            "1:\n\t"                                             \
            "j     %[fn]\n\t"                                    \
            " move %[v0], $0\n\t"                                \
            ".set  pop\n\t"                                      \
            : [fn] "=c"(fn),                                     \
              [tls] "=&r"(tls),                                  \
              [t0] "=&r"(t0),                                    \
              [v0] "=&r"(v0)                                     \
            : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4),           \
              [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \
            :                                                    \
            );

  #else

    #error Unsupported architecture

  #endif

    #define CALL_GL_API_RETURN(_api, ...) \
        CALL_GL_API(_api, __VA_ARGS__) \
        return 0; // placate gcc's warnings. never reached.
+38 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,

#if USE_FAST_TLS_KEY && !CHECK_FOR_GL_ERRORS

  #if defined(__arm__)

    #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n"

    #define API_ENTRY(_api) __attribute__((naked)) _api
@@ -115,6 +117,42 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
            :                                                   \
            );

  #elif defined(__mips__)

    #define API_ENTRY(_api) __attribute__((noinline)) _api

    #define CALL_GL_API(_api, ...)                               \
        register unsigned int t0 asm("t0");                      \
        register unsigned int fn asm("t1");                      \
        register unsigned int tls asm("v1");                     \
        register unsigned int v0 asm("v0");                      \
        asm volatile(                                            \
            ".set  push\n\t"                                     \
            ".set  noreorder\n\t"                                \
            ".set  mips32r2\n\t"                                 \
            "rdhwr %[tls], $29\n\t"                              \
            "lw    %[t0], %[OPENGL_API](%[tls])\n\t"             \
            "beqz  %[t0], 1f\n\t"                                \
            " move %[fn], $ra\n\t"                               \
            "lw    %[fn], %[API](%[t0])\n\t"                     \
            "movz  %[fn], $ra, %[fn]\n\t"                        \
            "1:\n\t"                                             \
            "j     %[fn]\n\t"                                    \
            " move %[v0], $0\n\t"                                \
            ".set  pop\n\t"                                      \
            : [fn] "=c"(fn),                                     \
              [tls] "=&r"(tls),                                  \
              [t0] "=&r"(t0),                                    \
              [v0] "=&r"(v0)                                     \
            : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4),           \
              [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \
            :                                                    \
            );

  #else
    #error Unsupported architecture
  #endif

    #define CALL_GL_API_RETURN(_api, ...) \
        CALL_GL_API(_api, __VA_ARGS__) \
        return 0; // placate gcc's warnings. never reached.
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

#if !defined(__arm__)
#if !defined(__arm__) && !defined(__mips__)
#define USE_SLOW_BINDING            1
#else
#define USE_SLOW_BINDING            0