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 @@
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <fcntl.h>
#elif defined(__unix__)
#elif defined(__linux__)
#include "Main/libX11.hpp"
#elif defined(__APPLE__)
#include "OSXUtils.hpp"
......@@ -39,66 +39,29 @@
namespace egl
{
egl::Display *Display::getPlatformDisplay(EGLenum platform, void *nativeDisplay)
Display *Display::get(EGLDisplay dpy)
{
#ifndef __ANDROID__
if(platform == EGL_UNKNOWN) // Default platform
{
#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();
if(dpy != (EGLDisplay)1) // We only support the default display
{
return nullptr;
}
egl::Display *display = displays[nativeDisplay];
static void *nativeDisplay = nullptr;
if(!display)
{
display = new egl::Display(platform, nativeDisplay);
displays[nativeDisplay] = display;
}
#if defined(__linux__) && !defined(__ANDROID__)
// Even if the application provides a native display handle, we open (and close) our own connection
if(!nativeDisplay && libX11->XOpenDisplay)
{
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;
mMaxSwapInterval = 1;
......@@ -107,6 +70,13 @@ Display::Display(EGLenum platform, void *nativeDisplay) : platform(platform), na
Display::~Display()
{
terminate();
#if defined(__linux__) && !defined(__ANDROID__)
if(nativeDisplay && libX11->XCloseDisplay)
{
libX11->XCloseDisplay((::Display*)nativeDisplay);
}
#endif
}
static void cpuid(int registers[4], int info)
......@@ -545,7 +515,7 @@ bool Display::isValidWindow(EGLNativeWindowType window)
}
return true;
#elif defined(__linux__)
if(platform == EGL_PLATFORM_X11_EXT)
if(nativeDisplay)
{
XWindowAttributes windowAttributes;
Status status = libX11->XGetWindowAttributes((::Display*)nativeDisplay, window, &windowAttributes);
......@@ -669,7 +639,7 @@ sw::Format Display::getDisplayFormat() const
// No framebuffer device found, or we're in user space
return sw::FORMAT_X8B8G8R8;
#elif defined(__linux__)
if(platform == EGL_PLATFORM_X11_EXT)
if(nativeDisplay)
{
Screen *screen = libX11->XDefaultScreenOfDisplay((::Display*)nativeDisplay);
unsigned int bpp = libX11->XPlanesOfScreen(screen);
......@@ -682,11 +652,10 @@ sw::Format Display::getDisplayFormat() const
default: UNREACHABLE(bpp); // Unexpected display mode color depth
}
}
else if(platform == EGL_PLATFORM_GBM_MESA)
else
{
return sw::FORMAT_X8R8G8B8;
}
else UNREACHABLE(platform);
#elif defined(__APPLE__)
return sw::FORMAT_A8B8G8R8;
#else
......
......@@ -28,7 +28,7 @@ namespace egl
class Display
{
public:
static egl::Display *getPlatformDisplay(EGLenum platform, void *nativeDisplay);
static Display *get(EGLDisplay dpy);
bool initialize();
void terminate();
......@@ -57,12 +57,11 @@ namespace egl
const char *getExtensionString() const;
private:
Display(EGLenum platform, void *nativeDisplay);
explicit Display(void *nativeDisplay);
~Display();
sw::Format getDisplayFormat() const;
const EGLenum platform;
void *const nativeDisplay;
EGLint mMaxSwapInterval;
......
......@@ -23,7 +23,7 @@
#include "common/debug.h"
#include "Main/FrameBuffer.hpp"
#if defined(__unix__) && !defined(__ANDROID__)
#if defined(__linux__) && !defined(__ANDROID__)
#include "Main/libX11.hpp"
#elif defined(_WIN32)
#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