OSDN Git Service

Add support for Android window size.
authorGreg Hartman <ghartman@google.com>
Fri, 20 Mar 2015 20:25:37 +0000 (13:25 -0700)
committerGreg Hartman <ghartman@google.com>
Tue, 24 Mar 2015 19:59:31 +0000 (19:59 +0000)
Change-Id: Ib96c227367fe10890e576bf99a654b50fa9e06c4
Reviewed-on: https://swiftshader-review.googlesource.com/2671
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Greg Hartman <ghartman@google.com>
src/OpenGL/libEGL/Display.cpp
src/OpenGL/libEGL/Surface.cpp

index 2013e7b..e9be15e 100644 (file)
 #include "libEGL/Context.hpp"
 #include "common/debug.h"
 
+#ifdef __ANDROID__
+#include <system/window.h>
+#include <GceFrameBufferConfig.h>
+#endif
+
 #include <algorithm>
 #include <vector>
 #include <map>
@@ -31,28 +36,30 @@ DisplayMap displays;
 
 egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId)
 {
-    if(platform == EGL_UNKNOWN)   // Default
-    {
-        #if defined(__unix__)
-            platform = EGL_PLATFORM_X11_EXT;
-        #endif
-    }
-
-    if(displayId == EGL_DEFAULT_DISPLAY)
-    {
-        if(platform == EGL_PLATFORM_X11_EXT)
+    #ifndef __ANDROID__
+        if(platform == EGL_UNKNOWN)   // Default
         {
             #if defined(__unix__)
-                displayId = XOpenDisplay(NULL);
-            #else
-                return error(EGL_BAD_PARAMETER, (egl::Display*)EGL_NO_DISPLAY);
+                platform = EGL_PLATFORM_X11_EXT;
             #endif
         }
-    }
-    else
-    {
-        // FIXME: Check if displayId is a valid display device context for <platform>
-    }
+
+        if(displayId == EGL_DEFAULT_DISPLAY)
+        {
+            if(platform == EGL_PLATFORM_X11_EXT)
+            {
+                #if defined(__unix__)
+                    displayId = XOpenDisplay(NULL);
+                #else
+                    return error(EGL_BAD_PARAMETER, (egl::Display*)EGL_NO_DISPLAY);
+                #endif
+            }
+        }
+        else
+        {
+            // FIXME: Check if displayId is a valid display device context for <platform>
+        }
+    #endif
 
     if(displays.find(displayId) != displays.end())
     {
@@ -459,6 +466,18 @@ bool Display::isValidWindow(EGLNativeWindowType window)
 {
     #if defined(_WIN32)
         return IsWindow(window) == TRUE;
+    #elif defined(__ANDROID__)
+               if(!window)
+               {
+                       ALOGE("%s called with window==NULL %s:%d", __FUNCTION__, __FILE__, __LINE__);
+                       return false;
+               }
+               if(static_cast<ANativeWindow*>(window)->common.magic != ANDROID_NATIVE_WINDOW_MAGIC)
+               {
+                       ALOGE("%s called with window==%p bad magic %s:%d", __FUNCTION__, window, __FILE__, __LINE__);
+                       return false;
+               }
+               return true;
     #else
         if(platform == EGL_PLATFORM_X11_EXT)
         {
@@ -467,7 +486,7 @@ bool Display::isValidWindow(EGLNativeWindowType window)
 
             return status == True;
         }
-       #endif
+    #endif
 
     return false;
 }
@@ -521,7 +540,12 @@ DisplayMode Display::getDisplayMode() const
                }
 
                ReleaseDC(0, deviceContext);
-       #else
+       #elif defined(__ANDROID__)
+               displayMode.width = GceFrameBufferConfig::getInstance()->x_res();
+               displayMode.height = GceFrameBufferConfig::getInstance()->y_res();
+               displayMode.format = sw::FORMAT_X8R8G8B8;
+               ALOGI("Returning framebuffer config width=%d height=%d, format=%d", displayMode.width, displayMode.height, displayMode.format);
+    #else
         if(platform == EGL_PLATFORM_X11_EXT)
         {
             Screen *screen = XDefaultScreenOfDisplay(displayId);
index 7a152aa..7d99988 100644 (file)
@@ -118,6 +118,8 @@ bool Surface::reset()
                GetClientRect(mWindow, &windowRect);\r
 \r
                return reset(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);\r
+       #elif defined(__ANDROID__)\r
+               return reset(ANativeWindow_getWidth(mWindow), ANativeWindow_getHeight(mWindow));\r
        #else\r
                XWindowAttributes windowAttributes;\r
                XGetWindowAttributes(mDisplay->getNativeDisplay(), mWindow, &windowAttributes);\r
@@ -285,6 +287,9 @@ bool Surface::checkForResize()
 \r
                int clientWidth = client.right - client.left;\r
                int clientHeight = client.bottom - client.top;\r
+       #elif defined(__ANDROID__)\r
+               int clientWidth = ANativeWindow_getWidth(mWindow);\r
+               int clientHeight = ANativeWindow_getHeight(mWindow);\r
        #else\r
                XWindowAttributes windowAttributes;\r
                XGetWindowAttributes(mDisplay->getNativeDisplay(), mWindow, &windowAttributes);\r