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>
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#if defined(__ANDROID__) #if defined(__ANDROID__)
#include <system/window.h> #include <system/window.h>
#elif defined(__linux__)
#include "Main/libX11.hpp"
#endif #endif
#include <string.h> #include <string.h>
...@@ -108,14 +110,12 @@ EGLDisplay GetDisplay(EGLNativeDisplayType display_id) ...@@ -108,14 +110,12 @@ EGLDisplay GetDisplay(EGLNativeDisplayType display_id)
{ {
TRACE("(EGLNativeDisplayType display_id = %p)", display_id); TRACE("(EGLNativeDisplayType display_id = %p)", display_id);
if(display_id == EGL_DEFAULT_DISPLAY) if(display_id != EGL_DEFAULT_DISPLAY)
{ {
return egl::Display::getPlatformDisplay(EGL_UNKNOWN, nullptr); // FIXME: Check if display_id is the default display
}
else
{
return egl::Display::getPlatformDisplay(EGL_UNKNOWN, reinterpret_cast<void*>((uintptr_t)display_id));
} }
return success((EGLDisplay)1); // We only support the default display
} }
EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
...@@ -128,7 +128,7 @@ EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) ...@@ -128,7 +128,7 @@ EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
return error(EGL_BAD_DISPLAY, EGL_FALSE); return error(EGL_BAD_DISPLAY, EGL_FALSE);
} }
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!display->initialize()) if(!display->initialize())
{ {
...@@ -150,7 +150,7 @@ EGLBoolean Terminate(EGLDisplay dpy) ...@@ -150,7 +150,7 @@ EGLBoolean Terminate(EGLDisplay dpy)
return error(EGL_BAD_DISPLAY, EGL_FALSE); return error(EGL_BAD_DISPLAY, EGL_FALSE);
} }
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
display->terminate(); display->terminate();
...@@ -161,15 +161,17 @@ const char *QueryString(EGLDisplay dpy, EGLint name) ...@@ -161,15 +161,17 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
{ {
TRACE("(EGLDisplay dpy = %p, EGLint name = %d)", dpy, name); TRACE("(EGLDisplay dpy = %p, EGLint name = %d)", dpy, name);
if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) #if defined(__linux__) && !defined(__ANDROID__)
{ if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)
return success("EGL_KHR_platform_gbm " {
"EGL_KHR_platform_x11 " return success("EGL_KHR_platform_gbm "
"EGL_EXT_client_extensions " "EGL_KHR_platform_x11 "
"EGL_EXT_platform_base"); "EGL_EXT_client_extensions "
} "EGL_EXT_platform_base");
}
#endif
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -203,7 +205,7 @@ EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EG ...@@ -203,7 +205,7 @@ EGLBoolean GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EG
"EGLint config_size = %d, EGLint *num_config = %p)", "EGLint config_size = %d, EGLint *num_config = %p)",
dpy, configs, config_size, num_config); dpy, configs, config_size, num_config);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -231,7 +233,7 @@ EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *co ...@@ -231,7 +233,7 @@ EGLBoolean ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *co
"EGLConfig *configs = %p, EGLint config_size = %d, EGLint *num_config = %p)", "EGLConfig *configs = %p, EGLint config_size = %d, EGLint *num_config = %p)",
dpy, attrib_list, configs, config_size, num_config); dpy, attrib_list, configs, config_size, num_config);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -263,7 +265,7 @@ EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, E ...@@ -263,7 +265,7 @@ EGLBoolean GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, E
TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLint attribute = %d, EGLint *value = %p)", TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLint attribute = %d, EGLint *value = %p)",
dpy, config, attribute, value); dpy, config, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateConfig(display, config)) if(!validateConfig(display, config))
{ {
...@@ -283,7 +285,7 @@ EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindow ...@@ -283,7 +285,7 @@ EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindow
TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativeWindowType win = %p, " TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativeWindowType win = %p, "
"const EGLint *attrib_list = %p)", dpy, config, window, attrib_list); "const EGLint *attrib_list = %p)", dpy, config, window, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateConfig(display, config)) if(!validateConfig(display, config))
{ {
...@@ -303,7 +305,7 @@ EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint * ...@@ -303,7 +305,7 @@ EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *
TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, const EGLint *attrib_list = %p)", TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, const EGLint *attrib_list = %p)",
dpy, config, attrib_list); dpy, config, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateConfig(display, config)) if(!validateConfig(display, config))
{ {
...@@ -318,7 +320,7 @@ EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmap ...@@ -318,7 +320,7 @@ EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmap
TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativePixmapType pixmap = %p, " TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativePixmapType pixmap = %p, "
"const EGLint *attrib_list = %p)", dpy, config, pixmap, attrib_list); "const EGLint *attrib_list = %p)", dpy, config, pixmap, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateConfig(display, config)) if(!validateConfig(display, config))
{ {
...@@ -334,7 +336,7 @@ EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface) ...@@ -334,7 +336,7 @@ EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface)
{ {
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface); TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -357,7 +359,7 @@ EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EG ...@@ -357,7 +359,7 @@ EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EG
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint *value = %p)", TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint *value = %p)",
dpy, surface, attribute, value); dpy, surface, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = (egl::Surface*)surface; egl::Surface *eglSurface = (egl::Surface*)surface;
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -493,7 +495,7 @@ EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, E ...@@ -493,7 +495,7 @@ EGLBoolean SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, E
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint value = %d)", TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint attribute = %d, EGLint value = %d)",
dpy, surface, attribute, value); dpy, surface, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -528,7 +530,7 @@ EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) ...@@ -528,7 +530,7 @@ EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
{ {
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer); TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -570,7 +572,7 @@ EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) ...@@ -570,7 +572,7 @@ EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
{ {
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer); TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLint buffer = %d)", dpy, surface, buffer);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -607,7 +609,7 @@ EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval) ...@@ -607,7 +609,7 @@ EGLBoolean SwapInterval(EGLDisplay dpy, EGLint interval)
{ {
TRACE("(EGLDisplay dpy = %p, EGLint interval = %d)", dpy, interval); TRACE("(EGLDisplay dpy = %p, EGLint interval = %d)", dpy, interval);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -647,7 +649,7 @@ EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_cont ...@@ -647,7 +649,7 @@ EGLContext CreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_cont
} }
} }
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Context *shareContext = static_cast<egl::Context*>(share_context); egl::Context *shareContext = static_cast<egl::Context*>(share_context);
if(!validateConfig(display, config)) if(!validateConfig(display, config))
...@@ -667,7 +669,7 @@ EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx) ...@@ -667,7 +669,7 @@ EGLBoolean DestroyContext(EGLDisplay dpy, EGLContext ctx)
{ {
TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p)", dpy, ctx); TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p)", dpy, ctx);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Context *context = static_cast<egl::Context*>(ctx); egl::Context *context = static_cast<egl::Context*>(ctx);
if(!validateContext(display, context)) if(!validateContext(display, context))
...@@ -690,7 +692,7 @@ EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCont ...@@ -690,7 +692,7 @@ EGLBoolean MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLCont
TRACE("(EGLDisplay dpy = %p, EGLSurface draw = %p, EGLSurface read = %p, EGLContext ctx = %p)", TRACE("(EGLDisplay dpy = %p, EGLSurface draw = %p, EGLSurface read = %p, EGLContext ctx = %p)",
dpy, draw, read, ctx); dpy, draw, read, ctx);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Context *context = static_cast<egl::Context*>(ctx); egl::Context *context = static_cast<egl::Context*>(ctx);
egl::Surface *drawSurface = static_cast<egl::Surface*>(draw); egl::Surface *drawSurface = static_cast<egl::Surface*>(draw);
egl::Surface *readSurface = static_cast<egl::Surface*>(read); egl::Surface *readSurface = static_cast<egl::Surface*>(read);
...@@ -785,7 +787,7 @@ EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint ...@@ -785,7 +787,7 @@ EGLBoolean QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint
TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLint attribute = %d, EGLint *value = %p)", TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLint attribute = %d, EGLint *value = %p)",
dpy, ctx, attribute, value); dpy, ctx, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Context *context = static_cast<egl::Context*>(ctx); egl::Context *context = static_cast<egl::Context*>(ctx);
if(!validateContext(display, context)) if(!validateContext(display, context))
...@@ -820,7 +822,7 @@ EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface) ...@@ -820,7 +822,7 @@ EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface)
{ {
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface); TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = (egl::Surface*)surface; egl::Surface *eglSurface = (egl::Surface*)surface;
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -842,7 +844,7 @@ EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType t ...@@ -842,7 +844,7 @@ EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType t
{ {
TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLNativePixmapType target = %p)", dpy, surface, target); TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p, EGLNativePixmapType target = %p)", dpy, surface, target);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Surface *eglSurface = static_cast<egl::Surface*>(surface); egl::Surface *eglSurface = static_cast<egl::Surface*>(surface);
if(!validateSurface(display, eglSurface)) if(!validateSurface(display, eglSurface))
...@@ -859,7 +861,7 @@ EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLCl ...@@ -859,7 +861,7 @@ EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLCl
{ {
TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLint attrib_list = %p)", dpy, ctx, target, buffer, attrib_list); TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLint attrib_list = %p)", dpy, ctx, target, buffer, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
egl::Context *context = static_cast<egl::Context*>(ctx); egl::Context *context = static_cast<egl::Context*>(ctx);
if(!validateDisplay(display)) if(!validateDisplay(display))
...@@ -941,7 +943,7 @@ EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) ...@@ -941,7 +943,7 @@ EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
{ {
TRACE("(EGLDisplay dpy = %p, EGLImageKHR image = %p)", dpy, image); TRACE("(EGLDisplay dpy = %p, EGLImageKHR image = %p)", dpy, image);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -963,7 +965,39 @@ EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const E ...@@ -963,7 +965,39 @@ EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const E
{ {
TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list); TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list);
return egl::Display::getPlatformDisplay(platform, native_display); switch(platform)
{
#if defined(__linux__) && !defined(__ANDROID__)
case EGL_PLATFORM_X11_EXT: break;
case EGL_PLATFORM_GBM_KHR: break;
#endif
default:
return error(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
}
#if defined(__linux__) && !defined(__ANDROID__)
if(platform == EGL_PLATFORM_X11_EXT)
{
if(!libX11)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY);
}
if(native_display != (void*)EGL_DEFAULT_DISPLAY || attrib_list != NULL)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY); // Unimplemented
}
}
else if(platform == EGL_PLATFORM_GBM_KHR)
{
if(native_display != (void*)EGL_DEFAULT_DISPLAY || attrib_list != NULL)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY); // Unimplemented
}
}
#endif
return success((EGLDisplay)1); // We only support the default display
} }
EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list) EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
...@@ -1004,7 +1038,7 @@ EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list ...@@ -1004,7 +1038,7 @@ EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list
{ {
TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLint *attrib_list=%p)", dpy, type, attrib_list); TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLint *attrib_list=%p)", dpy, type, attrib_list);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
...@@ -1035,7 +1069,7 @@ EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) ...@@ -1035,7 +1069,7 @@ EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
{ {
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p)", dpy, sync); TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p)", dpy, sync);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
FenceSync *eglSync = static_cast<FenceSync*>(sync); FenceSync *eglSync = static_cast<FenceSync*>(sync);
if(!validateDisplay(display)) if(!validateDisplay(display))
...@@ -1052,7 +1086,7 @@ EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeK ...@@ -1052,7 +1086,7 @@ EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeK
{ {
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint flags = %x, EGLTimeKHR value = %llx)", dpy, sync, flags, timeout); TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint flags = %x, EGLTimeKHR value = %llx)", dpy, sync, flags, timeout);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
FenceSync *eglSync = static_cast<FenceSync*>(sync); FenceSync *eglSync = static_cast<FenceSync*>(sync);
if(!validateDisplay(display)) if(!validateDisplay(display))
...@@ -1075,7 +1109,7 @@ EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, E ...@@ -1075,7 +1109,7 @@ EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, E
{ {
TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint attribute = %x, EGLint *value = %p)", dpy, sync, attribute, value); TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint attribute = %x, EGLint *value = %p)", dpy, sync, attribute, value);
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = egl::Display::get(dpy);
if(!validateDisplay(display)) if(!validateDisplay(display))
{ {
......
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