Commit e63db96b by Nicolas Capens

Store the native display as an opaque pointer.

Bug 18314459 Change-Id: I63e56d626bd1838803d1de71b417b7e40242c5e9 Reviewed-on: https://swiftshader-review.googlesource.com/4390Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 5524f05f
...@@ -69,7 +69,7 @@ sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int heigh ...@@ -69,7 +69,7 @@ sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int heigh
return 0; return 0;
} }
sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height) sw::FrameBuffer *createFrameBuffer(void *display, HWND window, int width, int height)
{ {
return createFrameBufferWin(window, width, height, false, false); return createFrameBufferWin(window, width, height, false, false);
} }
...@@ -144,7 +144,7 @@ namespace sw ...@@ -144,7 +144,7 @@ namespace sw
} }
} }
sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height) sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height)
{ {
return new sw::FrameBufferX11(display, window, width, height); return new sw::FrameBufferX11((::Display*)display, window, width, height);
} }
...@@ -38,23 +38,11 @@ ...@@ -38,23 +38,11 @@
namespace egl namespace egl
{ {
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
// Protects the global displays map. egl::Display *Display::getPlatformDisplay(EGLenum platform, void *nativeDisplay)
sw::BackoffLock displays_lock;
// The order of construction of globals is undefined in C++.
// This function ensures that construction has completed before we attempt
// to access displays.
DisplayMap* getDisplays() {
static DisplayMap displays;
return &displays;
}
egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId)
{ {
#ifndef __ANDROID__ #ifndef __ANDROID__
if(platform == EGL_UNKNOWN) // Default if(platform == EGL_UNKNOWN) // Default platform
{ {
#if defined(__unix__) #if defined(__unix__)
if(libX11) if(libX11)
...@@ -68,14 +56,14 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType ...@@ -68,14 +56,14 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType
#endif #endif
} }
if(displayId == EGL_DEFAULT_DISPLAY) if(!nativeDisplay) // Default display
{ {
if(platform == EGL_PLATFORM_X11_EXT) if(platform == EGL_PLATFORM_X11_EXT)
{ {
#if defined(__unix__) #if defined(__unix__)
if(libX11->XOpenDisplay) if(libX11->XOpenDisplay)
{ {
displayId = libX11->XOpenDisplay(NULL); nativeDisplay = libX11->XOpenDisplay(NULL);
} }
else else
{ {
...@@ -88,26 +76,29 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType ...@@ -88,26 +76,29 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType
} }
else else
{ {
// FIXME: Check if displayId is a valid display device context for <platform> // FIXME: Check if nativeDisplay is a valid display device context for <platform>
} }
#endif #endif
egl::Display *rval; static std::map<void*, Display*> displays;
displays_lock.lock(); static sw::BackoffLock displaysMutex;
DisplayMap* displays = getDisplays();
if (displays->find(displayId) != displays->end()) displaysMutex.lock();
{
rval = (*displays)[displayId];
} else {
rval = new egl::Display(platform, displayId);
(*displays)[displayId] = rval; egl::Display *display = displays[nativeDisplay];
if(!display)
{
display = new egl::Display(platform, nativeDisplay);
displays[nativeDisplay] = display;
} }
displays_lock.unlock();
return rval; displaysMutex.unlock();
return display;
} }
Display::Display(EGLenum platform, EGLNativeDisplayType displayId) : platform(platform), displayId(displayId) Display::Display(EGLenum platform, void *nativeDisplay) : platform(platform), nativeDisplay(nativeDisplay)
{ {
mMinSwapInterval = 1; mMinSwapInterval = 1;
mMaxSwapInterval = 1; mMaxSwapInterval = 1;
...@@ -116,10 +107,6 @@ Display::Display(EGLenum platform, EGLNativeDisplayType displayId) : platform(pl ...@@ -116,10 +107,6 @@ Display::Display(EGLenum platform, EGLNativeDisplayType displayId) : platform(pl
Display::~Display() Display::~Display()
{ {
terminate(); terminate();
displays_lock.lock();
getDisplays()->erase(displayId);
displays_lock.unlock();
} }
static void cpuid(int registers[4], int info) static void cpuid(int registers[4], int info)
...@@ -561,7 +548,7 @@ bool Display::isValidWindow(EGLNativeWindowType window) ...@@ -561,7 +548,7 @@ bool Display::isValidWindow(EGLNativeWindowType window)
if(platform == EGL_PLATFORM_X11_EXT) if(platform == EGL_PLATFORM_X11_EXT)
{ {
XWindowAttributes windowAttributes; XWindowAttributes windowAttributes;
Status status = libX11->XGetWindowAttributes(displayId, window, &windowAttributes); Status status = libX11->XGetWindowAttributes((::Display*)nativeDisplay, window, &windowAttributes);
return status == True; return status == True;
} }
...@@ -596,9 +583,9 @@ EGLint Display::getMaxSwapInterval() const ...@@ -596,9 +583,9 @@ EGLint Display::getMaxSwapInterval() const
return mMaxSwapInterval; return mMaxSwapInterval;
} }
EGLNativeDisplayType Display::getNativeDisplay() const void *Display::getNativeDisplay() const
{ {
return displayId; return nativeDisplay;
} }
sw::Format Display::getDisplayFormat() const sw::Format Display::getDisplayFormat() const
...@@ -680,7 +667,7 @@ sw::Format Display::getDisplayFormat() const ...@@ -680,7 +667,7 @@ sw::Format Display::getDisplayFormat() const
#else #else
if(platform == EGL_PLATFORM_X11_EXT) if(platform == EGL_PLATFORM_X11_EXT)
{ {
Screen *screen = libX11->XDefaultScreenOfDisplay(displayId); Screen *screen = libX11->XDefaultScreenOfDisplay((::Display*)nativeDisplay);
unsigned int bpp = libX11->XPlanesOfScreen(screen); unsigned int bpp = libX11->XPlanesOfScreen(screen);
switch(bpp) switch(bpp)
......
...@@ -28,9 +28,7 @@ namespace egl ...@@ -28,9 +28,7 @@ namespace egl
class Display class Display
{ {
public: public:
~Display(); static egl::Display *getPlatformDisplay(EGLenum platform, void *nativeDisplay);
static egl::Display *getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId);
bool initialize(); bool initialize();
void terminate(); void terminate();
...@@ -55,16 +53,17 @@ namespace egl ...@@ -55,16 +53,17 @@ namespace egl
EGLint getMinSwapInterval() const; EGLint getMinSwapInterval() const;
EGLint getMaxSwapInterval() const; EGLint getMaxSwapInterval() const;
EGLNativeDisplayType getNativeDisplay() const; void *getNativeDisplay() const;
const char *getExtensionString() const; const char *getExtensionString() const;
private: private:
Display(EGLenum platform, EGLNativeDisplayType displayId); Display(EGLenum platform, void *nativeDisplay);
~Display();
sw::Format getDisplayFormat() const; sw::Format getDisplayFormat() const;
const EGLenum platform; const EGLenum platform;
const EGLNativeDisplayType displayId; void *const nativeDisplay;
EGLint mMaxSwapInterval; EGLint mMaxSwapInterval;
EGLint mMinSwapInterval; EGLint mMinSwapInterval;
......
...@@ -246,7 +246,7 @@ bool WindowSurface::initialize() ...@@ -246,7 +246,7 @@ bool WindowSurface::initialize()
return reset(width, height); return reset(width, height);
#else #else
XWindowAttributes windowAttributes; XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes); libX11->XGetWindowAttributes((::Display*)display->getNativeDisplay(), window, &windowAttributes);
return reset(windowAttributes.width, windowAttributes.height); return reset(windowAttributes.width, windowAttributes.height);
#endif #endif
...@@ -286,7 +286,7 @@ bool WindowSurface::checkForResize() ...@@ -286,7 +286,7 @@ bool WindowSurface::checkForResize()
int clientHeight; window->query(window, NATIVE_WINDOW_HEIGHT, &clientHeight); int clientHeight; window->query(window, NATIVE_WINDOW_HEIGHT, &clientHeight);
#else #else
XWindowAttributes windowAttributes; XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes); libX11->XGetWindowAttributes((::Display*)display->getNativeDisplay(), window, &windowAttributes);
int clientWidth = windowAttributes.width; int clientWidth = windowAttributes.width;
int clientHeight = windowAttributes.height; int clientHeight = windowAttributes.height;
......
...@@ -108,7 +108,14 @@ EGLDisplay GetDisplay(EGLNativeDisplayType display_id) ...@@ -108,7 +108,14 @@ EGLDisplay GetDisplay(EGLNativeDisplayType display_id)
{ {
TRACE("(EGLNativeDisplayType display_id = %p)", display_id); TRACE("(EGLNativeDisplayType display_id = %p)", display_id);
return egl::Display::getPlatformDisplay(EGL_UNKNOWN, display_id); if(display_id == EGL_DEFAULT_DISPLAY)
{
return egl::Display::getPlatformDisplay(EGL_UNKNOWN, nullptr);
}
else
{
return egl::Display::getPlatformDisplay(EGL_UNKNOWN, reinterpret_cast<void*>((uintptr_t)display_id));
}
} }
EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) EGLBoolean Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
...@@ -948,7 +955,7 @@ EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const E ...@@ -948,7 +955,7 @@ 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, (EGLNativeDisplayType)native_display); return egl::Display::getPlatformDisplay(platform, native_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)
......
...@@ -66,6 +66,6 @@ const T &error(GLenum errorCode, const T &returnValue) ...@@ -66,6 +66,6 @@ const T &error(GLenum errorCode, const T &returnValue)
return returnValue; return returnValue;
} }
extern sw::FrameBuffer *createFrameBuffer(NativeDisplayType display, NativeWindowType window, int width, int height); extern sw::FrameBuffer *createFrameBuffer(void *display, NativeWindowType window, int width, int height);
#endif // LIBGL_MAIN_H_ #endif // LIBGL_MAIN_H_
...@@ -208,7 +208,7 @@ public: ...@@ -208,7 +208,7 @@ public:
__eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname); __eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config); egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height); sw::FrameBuffer *(*createFrameBuffer)(void *display, EGLNativeWindowType window, int width, int height);
}; };
class LibGLES_CM class LibGLES_CM
......
...@@ -337,7 +337,7 @@ egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *sh ...@@ -337,7 +337,7 @@ egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *sh
extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname); extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config); egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height); sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType window, int width, int height);
extern "C" extern "C"
{ {
......
...@@ -229,7 +229,7 @@ public: ...@@ -229,7 +229,7 @@ public:
__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname); __eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config); egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height); sw::FrameBuffer *(*createFrameBuffer)(void *display, EGLNativeWindowType window, int width, int height);
}; };
class LibGLESv2 class LibGLESv2
......
...@@ -1333,7 +1333,7 @@ egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *sh ...@@ -1333,7 +1333,7 @@ egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *sh
extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname); extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config); egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height); sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType window, int width, int height);
LibGLESv2exports::LibGLESv2exports() LibGLESv2exports::LibGLESv2exports()
{ {
......
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