From: Jerome St-Louis Date: Thu, 18 Jun 2015 05:01:41 +0000 (-0400) Subject: ecere/gui;gfx: ODROID Support X-Git-Tag: 0.44.13~8 X-Git-Url: http://ecere.com/cgi-bin/gitweb.cgi?p=sdk;a=commitdiff_plain;h=e3faf4c44e84e254fe03bb28aa8c2cd5caa7ab8f ecere/gui;gfx: ODROID Support --- diff --git a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec index 6f450e7..59a24df 100644 --- a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec +++ b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec @@ -18,7 +18,7 @@ namespace gfx::drivers; #else - #if !defined(__ANDROID__) + #if !defined(__ANDROID__) && !defined(__ODROID__) #define property _property #define new _new @@ -75,11 +75,37 @@ namespace gfx::drivers; #undef String #endif -#if defined(__ANDROID__) +#if defined(__ANDROID__) || defined(__ODROID__) + +#define uint _uint +#define property _property +#define new _new +#define class _class +#define Window X11Window +#define Cursor X11Cursor +#define Font X11Font +#define Display X11Display +#define Time X11Time +#define KeyCode X11KeyCode +#define Picture X11Picture +#define Bool X11Bool #include #include +#undef Bool +#undef Picture +#undef Window +#undef Cursor +#undef Font +#undef Display +#undef Time +#undef KeyCode +#undef uint +#undef new +#undef property +#undef class + #else #include @@ -87,13 +113,17 @@ namespace gfx::drivers; #endif +#if defined(__ODROID__) && !defined(_GLES) +#define _GLES +#endif + #undef pointer import "Display" #if defined(__unix__) || defined(__APPLE__) - #ifndef __ANDROID__ + #if !defined(__ANDROID__) && !defined(__ODROID__) import "XInterface" #endif @@ -374,6 +404,84 @@ public void glesSetNearPlane(double value) static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; +#elif defined(__ANDROID__) || defined(__ODROID__) + + #define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES + #define GL_RENDERBUFFER GL_RENDERBUFFER_OES + #define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES + + #define GL_POLYGON_STIPPLE 0xFFFF + #define GL_LINE_STIPPLE 0xFFFF + #define GL_LINE 0xFFFF + #define GL_FILL 0xFFFF + #define GL_ALL_ATTRIB_BITS 0xFFFF + #define GL_LIGHT_MODEL_LOCAL_VIEWER 0xFFFF + + #define GL_POLYGON 9 + #define GL_QUADS 7 + + //#define GL_QUADS 0 + #define GL_QUAD_STRIP 0 + //#define GL_DOUBLE 0 + //#define GL_UNSIGNED_INT 0 + //#define GL_FILL 0 + //#define GL_LINE 0 + //#define GL_LINE_STIPPLE 0 + #define GL_BGRA_EXT 0 + #define GL_UNPACK_ROW_LENGTH 0 + #define GL_UNPACK_SKIP_PIXELS 0 + #define GL_UNPACK_SKIP_ROWS 0 + #define GL_RGBA8 0 + #define GL_PACK_ROW_LENGTH 0 + #define GL_PACK_SKIP_ROWS 0 + #define GL_PACK_SKIP_PIXELS 0 + +#endif + +#if defined(ECERE_NO3D) || defined(ECERE_VANILLA) +public union Matrix +{ + double array[16]; + double m[4][4]; + + void Identity() + { + FillBytesBy4(this, 0, sizeof(Matrix) >> 2); + m[0][0]=m[1][1]=m[2][2]=m[3][3]=1; + } + + void Transpose(Matrix source) + { + int i,j; + for(i=0; i<4; i++) + for(j=0; j<4; j++) + m[j][i] = source.m[i][j]; + } + + void Multiply(Matrix a, Matrix b) + { + // We need a full matrix multiplication for the Projection matrix + m[0][0]=a.m[0][0]*b.m[0][0] + a.m[0][1]*b.m[1][0] + a.m[0][2]*b.m[2][0] + a.m[0][3]*b.m[3][0]; + m[0][1]=a.m[0][0]*b.m[0][1] + a.m[0][1]*b.m[1][1] + a.m[0][2]*b.m[2][1] + a.m[0][3]*b.m[3][1]; + m[0][2]=a.m[0][0]*b.m[0][2] + a.m[0][1]*b.m[1][2] + a.m[0][2]*b.m[2][2] + a.m[0][3]*b.m[3][2]; + m[0][3]=a.m[0][0]*b.m[0][3] + a.m[0][1]*b.m[1][3] + a.m[0][2]*b.m[2][3] + a.m[0][3]*b.m[3][3]; + + m[1][0]=a.m[1][0]*b.m[0][0] + a.m[1][1]*b.m[1][0] + a.m[1][2]*b.m[2][0] + a.m[1][3]*b.m[3][0]; + m[1][1]=a.m[1][0]*b.m[0][1] + a.m[1][1]*b.m[1][1] + a.m[1][2]*b.m[2][1] + a.m[1][3]*b.m[3][1]; + m[1][2]=a.m[1][0]*b.m[0][2] + a.m[1][1]*b.m[1][2] + a.m[1][2]*b.m[2][2] + a.m[1][3]*b.m[3][2]; + m[1][3]=a.m[1][0]*b.m[0][3] + a.m[1][1]*b.m[1][3] + a.m[1][2]*b.m[2][3] + a.m[1][3]*b.m[3][3]; + + m[2][0]=a.m[2][0]*b.m[0][0] + a.m[2][1]*b.m[1][0] + a.m[2][2]*b.m[2][0] + a.m[2][3]*b.m[3][0]; + m[2][1]=a.m[2][0]*b.m[0][1] + a.m[2][1]*b.m[1][1] + a.m[2][2]*b.m[2][1] + a.m[2][3]*b.m[3][1]; + m[2][2]=a.m[2][0]*b.m[0][2] + a.m[2][1]*b.m[1][2] + a.m[2][2]*b.m[2][2] + a.m[2][3]*b.m[3][2]; + m[2][3]=a.m[2][0]*b.m[0][3] + a.m[2][1]*b.m[1][3] + a.m[2][2]*b.m[2][3] + a.m[2][3]*b.m[3][3]; + + m[3][0]=a.m[3][0]*b.m[0][0] + a.m[3][1]*b.m[1][0] + a.m[3][2]*b.m[2][0] + a.m[3][3]*b.m[3][0]; + m[3][1]=a.m[3][0]*b.m[0][1] + a.m[3][1]*b.m[1][1] + a.m[3][2]*b.m[2][1] + a.m[3][3]*b.m[3][1]; + m[3][2]=a.m[3][0]*b.m[0][2] + a.m[3][1]*b.m[1][2] + a.m[3][2]*b.m[2][2] + a.m[3][3]*b.m[3][2]; + m[3][3]=a.m[3][0]*b.m[0][3] + a.m[3][1]*b.m[1][3] + a.m[3][2]*b.m[2][3] + a.m[3][3]*b.m[3][3]; + } +}; #endif // Our own matrix stack @@ -384,7 +492,7 @@ static int curStack = 0; #if defined(_GLES) // OpenGL ES Porting Kit -#if defined(__ANDROID__) +#if defined(__ANDROID__) || defined(__ODROID__) #define glBindFramebuffer glBindFramebufferOES #define glBindRenderbuffer glBindRenderbufferOES #define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES @@ -473,13 +581,17 @@ static int curStack = 0; #endif -#if defined(__ANDROID__) +#if defined(__ANDROID__) || defined(__ODROID__) static EGLDisplay eglDisplay; static EGLSurface eglSurface; static EGLContext eglContext; static int eglWidth, eglHeight; +#if defined(__ANDROID__) static bool egl_init_display(ANativeWindow* window) +#else + static bool egl_init_display(uint window) +#endif { const EGLint attribs[] = { @@ -1178,7 +1290,7 @@ public void glesLightModeli( unsigned int pname, int param ) glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, param); } -#ifdef __ANDROID__ +#if defined(__ANDROID__) || defined(__ODROID__) void glClearDepth( double depth ) { glClearDepthf((float)depth); } void glFogi( unsigned int pname, int param ) { } void glPolygonMode( unsigned int i, unsigned int j ) { } @@ -1202,7 +1314,7 @@ void glDrawPixels(int a, int b, int c, int d, void * e) { } #endif -#if !defined(__APPLE__) && !defined(__WIN32__) +#if !defined(__APPLE__) && !defined(__WIN32__) && !defined(__ODROID__) void (APIENTRY * glBindBufferARB) (GLenum target, GLuint buffer); void (APIENTRY * glGenBuffersARB) (GLsizei n, GLuint *buffers); void (APIENTRY * glDeleteBuffersARB) (GLsizei n, const GLuint *buffers); @@ -1318,7 +1430,7 @@ public struct GLEAB public void GLGenBuffers(int count, GLAB * buffers) { -#if defined(__ANDROID__) +#if defined(__ANDROID__) || defined(__ODROID__) glGenBuffers(count, (GLuint *)buffers); #else #if defined(__WIN32__) @@ -1330,7 +1442,7 @@ public void GLGenBuffers(int count, GLAB * buffers) public void GLDeleteBuffers(int count, GLAB * buffers) { -#if defined(__ANDROID__) +#if defined(__ANDROID__) || defined(__ODROID__) glDeleteBuffers(count, (GLuint *)buffers); #else #if defined(__WIN32__) @@ -1342,7 +1454,7 @@ public void GLDeleteBuffers(int count, GLAB * buffers) void GLBindBuffer(int target, uint buffer) { -#ifdef __ANDROID__ +#if defined(__ANDROID__) || defined(__ODROID__) glBindBuffer(target, buffer); #else #if defined(__WIN32__) @@ -1378,7 +1490,7 @@ public void GLBufferData(int type, GLenum target, int size, const GLvoid *data, else #endif -#ifdef __ANDROID__ +#if defined(__ANDROID__) || defined(__ODROID__) glBufferData(target, size, data, usage); #else @@ -1438,7 +1550,7 @@ class OGLDisplay : struct int imageBuffers[2]; byte * pboMemory1, * pboMemory2; */ -#elif !defined(__ANDROID__) +#elif !defined(__ANDROID__) && !defined(__ODROID__) GLXContext glContext; Pixmap pixmap; @@ -1472,7 +1584,7 @@ class OGLSystem : struct HDC hdc; HGLRC glrc; HWND hwnd; -#elif !defined(__ANDROID__) +#elif !defined(__ANDROID__) && !defined(__ODROID__) XVisualInfo * visualInfo; GLXContext glContext; GLXDrawable glxDrawable; @@ -1514,7 +1626,7 @@ class OpenGLDisplayDriver : DisplayDriver bool LockSystem(DisplaySystem displaySystem) { -#if !defined(__ANDROID__) +#if !defined(__ANDROID__) && !defined(__ODROID__) OGLSystem oglSystem = displaySystem.driverData; if(useSingleGLContext) return true; #if defined(__WIN32__) @@ -1536,7 +1648,7 @@ class OpenGLDisplayDriver : DisplayDriver wglMakeCurrent(null, null); #elif defined(__unix__) || defined(__APPLE__) // printf("Making NULL current\n"); - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) #else glXMakeCurrent(xGlobalDisplay, None, null); #endif @@ -1546,7 +1658,7 @@ class OpenGLDisplayDriver : DisplayDriver bool Lock(Display display) { -#if !defined(__ANDROID__) +#if !defined(__ANDROID__) && !defined(__ODROID__) OGLDisplay oglDisplay = display.driverData; if(useSingleGLContext) return true; #if defined(__WIN32__) @@ -1594,7 +1706,7 @@ class OpenGLDisplayDriver : DisplayDriver if(oglDisplay.memBitmap) DeleteObject(oglDisplay.memBitmap); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) #else if(oglDisplay.shapePixmap) XFreePixmap(xGlobalDisplay, oglDisplay.shapePixmap); @@ -1774,6 +1886,8 @@ class OpenGLDisplayDriver : DisplayDriver vboAvailable = true; #if defined(__ANDROID__) egl_init_display(guiApp.desktop.windowHandle); + #elif defined(__ODROID__) + egl_init_display((uint)displaySystem.window); CheckExtensions(oglSystem); result = true; #else @@ -1838,7 +1952,7 @@ class OpenGLDisplayDriver : DisplayDriver DestroyWindow(oglSystem.hwnd); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) egl_term_display(); #else if(oglSystem.visualInfo) @@ -1864,7 +1978,7 @@ class OpenGLDisplayDriver : DisplayDriver { bool result = false; OGLDisplay oglDisplay = display.driverData; -#if !defined(__ANDROID__) +#if !defined(__ANDROID__) && !defined(__ODROID__) OGLSystem oglSystem = display.displaySystem.driverData; #endif if(!oglDisplay) @@ -1887,7 +2001,7 @@ class OpenGLDisplayDriver : DisplayDriver else ReleaseDC(display.window, oglDisplay.hdc); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) #else XVisualInfo * visualInfo = ((XWindowData)display.windowDriverData).visual; /* @@ -1970,13 +2084,19 @@ class OpenGLDisplayDriver : DisplayDriver #if defined(__WIN32__) wglMakeCurrent(null, null); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) result = true; #else glXMakeCurrent(xGlobalDisplay, None, null); #endif #endif } + else + { + #if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__) + result = true; + #endif + } return result; } @@ -2147,7 +2267,7 @@ class OpenGLDisplayDriver : DisplayDriver ReleaseDC(display.window, hdc); } #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) result = true; #else int attrib[] = @@ -2311,7 +2431,7 @@ class OpenGLDisplayDriver : DisplayDriver #if defined(__WIN32__) wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) width = eglWidth; height = eglHeight; #else @@ -2449,7 +2569,7 @@ class OpenGLDisplayDriver : DisplayDriver ReleaseDC(0, hdc); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) #else XTransform transform = { @@ -2479,7 +2599,7 @@ class OpenGLDisplayDriver : DisplayDriver //wglSwapLayerBuffers(oglDisplay.hdc,WGL_SWAP_MAIN_PLANE); SwapBuffers(oglDisplay.hdc); #elif defined(__unix__) || defined(__APPLE__) - #if defined(__ANDROID__) + #if defined(__ANDROID__) || defined(__ODROID__) eglSwapBuffers(eglDisplay, eglSurface); #else glXSwapBuffers(xGlobalDisplay, (GLXDrawable)display.window); @@ -3966,7 +4086,7 @@ class OpenGLDisplayDriver : DisplayDriver { //Logf("SelectMesh\n"); -#if !defined( __ANDROID__) && !defined(__APPLE__) +#if !defined( __ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) #if defined(__WIN32__) if(glUnlockArraysEXT) @@ -4038,7 +4158,7 @@ class OpenGLDisplayDriver : DisplayDriver glDisableClientState(GL_COLOR_ARRAY); } -#if !defined(__ANDROID__) && !defined(__APPLE__) +#if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) #if defined(__WIN32__) if(glLockArraysEXT) @@ -4164,11 +4284,11 @@ IS_GLGetContext(DisplaySystem displaySystem) #if defined(__WIN32__) OGLSystem system = displaySystem.driverData; return system.glrc; -#elif !defined(__ANDROID__) +#elif defined(__ANDROID__) || defined(__ODROID__) + return eglContext; +#else OGLSystem system = displaySystem.driverData; return system.glContext; -#else - return eglContext; #endif } return null; diff --git a/ecere/src/gui/drivers/XInterface.ec b/ecere/src/gui/drivers/XInterface.ec index f2cf2be..9570ec4 100644 --- a/ecere/src/gui/drivers/XInterface.ec +++ b/ecere/src/gui/drivers/XInterface.ec @@ -1,7 +1,7 @@ namespace gui::drivers; import "instance" -#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL) +#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL) && !defined(__ODROID__) import "OpenGLDisplayDriver" #endif @@ -56,7 +56,7 @@ typedef int X11Bool; #include #include #include -#if !defined(ECERE_NO3D) && !defined(ECERE_NOGL) +#if !defined(ECERE_NO3D) && !defined(ECERE_NOGL) //&& !defined(__ODROID__) #include #endif #include @@ -2448,7 +2448,7 @@ class XInterface : Interface attributes.override_redirect = (window.interim || (!atomsSupported[_net_wm_state] && !window.nativeDecorations)) ? True : False; attributes.event_mask = EVENT_MASK; //printf("%s\n", guiApp.defaultDisplayDriver); -#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL) +#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL) && !defined(__ODROID__) if(window.dispDriver == class(OpenGLDisplayDriver) || !strcmp(guiApp.defaultDisplayDriver, "OpenGL")) { int samples; @@ -2547,6 +2547,20 @@ class XInterface : Interface }; visualInfo = glXChooseVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrList); } +#elif defined(__ODROID__) + if(!visualInfo) + { + // System visual not working on ODROID? + int attrList[] = + { + GLX_USE_GL, GLX_DEPTH_SIZE, 1, + GLX_RGBA, + GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + visualInfo = glXChooseVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrList); + } #endif depth = visualInfo ? visualInfo->depth : (window.alphaBlend ? 32 : xSystemDepth); visual = visualInfo ? visualInfo->visual : (window.alphaBlend ? FindFullColorVisual (xGlobalDisplay, &depth) : xSystemVisual);