Commit 26177e93 by Nicolas Capens

Statically allocate one EGL display.

This reduces support to EGL_DEFAULT_DISPLAY or assumes the native display handle corresponds with the default display. Bug 24600445 Change-Id: Ieb5d08beceff1cc46557483e1bed159dd9ab1bee Reviewed-on: https://swiftshader-review.googlesource.com/4520Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 7f661449
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <fcntl.h> #include <fcntl.h>
#elif defined(__unix__) #elif defined(__linux__)
#include "Main/libX11.hpp" #include "Main/libX11.hpp"
#elif defined(__APPLE__) #elif defined(__APPLE__)
#include "OSXUtils.hpp" #include "OSXUtils.hpp"
...@@ -39,66 +39,29 @@ ...@@ -39,66 +39,29 @@
namespace egl namespace egl
{ {
egl::Display *Display::getPlatformDisplay(EGLenum platform, void *nativeDisplay) Display *Display::get(EGLDisplay dpy)
{ {
#ifndef __ANDROID__ if(dpy != (EGLDisplay)1) // We only support the default display
if(platform == EGL_UNKNOWN) // Default platform {
{ return nullptr;
#if defined(__unix__) }
if(libX11)
{
platform = EGL_PLATFORM_X11_EXT;
}
else
{
platform = EGL_PLATFORM_GBM_KHR;
}
#endif
}
if(!nativeDisplay) // Default display
{
if(platform == EGL_PLATFORM_X11_EXT)
{
#if defined(__unix__)
if(libX11->XOpenDisplay)
{
nativeDisplay = libX11->XOpenDisplay(NULL);
}
else
{
return error(EGL_BAD_PARAMETER, (egl::Display*)EGL_NO_DISPLAY);
}
#else
return error(EGL_BAD_PARAMETER, (egl::Display*)EGL_NO_DISPLAY);
#endif
}
}
else
{
// FIXME: Check if nativeDisplay is a valid display device context for <platform>
}
#endif
static std::map<void*, Display*> displays;
static sw::BackoffLock displaysMutex;
displaysMutex.lock();
egl::Display *display = displays[nativeDisplay]; static void *nativeDisplay = nullptr;
if(!display) #if defined(__linux__) && !defined(__ANDROID__)
{ // Even if the application provides a native display handle, we open (and close) our own connection
display = new egl::Display(platform, nativeDisplay); if(!nativeDisplay && libX11->XOpenDisplay)
displays[nativeDisplay] = display; {
} nativeDisplay = libX11->XOpenDisplay(NULL);
}
#endif
displaysMutex.unlock(); static Display display(nativeDisplay);
return display; return &display;
} }
Display::Display(EGLenum platform, void *nativeDisplay) : platform(platform), nativeDisplay(nativeDisplay) Display::Display(void *nativeDisplay) : nativeDisplay(nativeDisplay)
{ {
mMinSwapInterval = 1; mMinSwapInterval = 1;
mMaxSwapInterval = 1; mMaxSwapInterval = 1;
...@@ -107,6 +70,13 @@ Display::Display(EGLenum platform, void *nativeDisplay) : platform(platform), na ...@@ -107,6 +70,13 @@ Display::Display(EGLenum platform, void *nativeDisplay) : platform(platform), na
Display::~Display() Display::~Display()
{ {
terminate(); terminate();
#if defined(__linux__) && !defined(__ANDROID__)
if(nativeDisplay && libX11->XCloseDisplay)
{
libX11->XCloseDisplay((::Display*)nativeDisplay);
}
#endif
} }
static void cpuid(int registers[4], int info) static void cpuid(int registers[4], int info)
...@@ -545,7 +515,7 @@ bool Display::isValidWindow(EGLNativeWindowType window) ...@@ -545,7 +515,7 @@ bool Display::isValidWindow(EGLNativeWindowType window)
} }
return true; return true;
#elif defined(__linux__) #elif defined(__linux__)
if(platform == EGL_PLATFORM_X11_EXT) if(nativeDisplay)
{ {
XWindowAttributes windowAttributes; XWindowAttributes windowAttributes;
Status status = libX11->XGetWindowAttributes((::Display*)nativeDisplay, window, &windowAttributes); Status status = libX11->XGetWindowAttributes((::Display*)nativeDisplay, window, &windowAttributes);
...@@ -669,7 +639,7 @@ sw::Format Display::getDisplayFormat() const ...@@ -669,7 +639,7 @@ sw::Format Display::getDisplayFormat() const
// No framebuffer device found, or we're in user space // No framebuffer device found, or we're in user space
return sw::FORMAT_X8B8G8R8; return sw::FORMAT_X8B8G8R8;
#elif defined(__linux__) #elif defined(__linux__)
if(platform == EGL_PLATFORM_X11_EXT) if(nativeDisplay)
{ {
Screen *screen = libX11->XDefaultScreenOfDisplay((::Display*)nativeDisplay); Screen *screen = libX11->XDefaultScreenOfDisplay((::Display*)nativeDisplay);
unsigned int bpp = libX11->XPlanesOfScreen(screen); unsigned int bpp = libX11->XPlanesOfScreen(screen);
...@@ -682,11 +652,10 @@ sw::Format Display::getDisplayFormat() const ...@@ -682,11 +652,10 @@ sw::Format Display::getDisplayFormat() const
default: UNREACHABLE(bpp); // Unexpected display mode color depth default: UNREACHABLE(bpp); // Unexpected display mode color depth
} }
} }
else if(platform == EGL_PLATFORM_GBM_MESA) else
{ {
return sw::FORMAT_X8R8G8B8; return sw::FORMAT_X8R8G8B8;
} }
else UNREACHABLE(platform);
#elif defined(__APPLE__) #elif defined(__APPLE__)
return sw::FORMAT_A8B8G8R8; return sw::FORMAT_A8B8G8R8;
#else #else
......
...@@ -28,7 +28,7 @@ namespace egl ...@@ -28,7 +28,7 @@ namespace egl
class Display class Display
{ {
public: public:
static egl::Display *getPlatformDisplay(EGLenum platform, void *nativeDisplay); static Display *get(EGLDisplay dpy);
bool initialize(); bool initialize();
void terminate(); void terminate();
...@@ -57,12 +57,11 @@ namespace egl ...@@ -57,12 +57,11 @@ namespace egl
const char *getExtensionString() const; const char *getExtensionString() const;
private: private:
Display(EGLenum platform, void *nativeDisplay); explicit Display(void *nativeDisplay);
~Display(); ~Display();
sw::Format getDisplayFormat() const; sw::Format getDisplayFormat() const;
const EGLenum platform;
void *const nativeDisplay; void *const nativeDisplay;
EGLint mMaxSwapInterval; EGLint mMaxSwapInterval;
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include "common/debug.h" #include "common/debug.h"
#include "Main/FrameBuffer.hpp" #include "Main/FrameBuffer.hpp"
#if defined(__unix__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
#include "Main/libX11.hpp" #include "Main/libX11.hpp"
#elif defined(_WIN32) #elif defined(_WIN32)
#include <tchar.h> #include <tchar.h>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment