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
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);
}
......@@ -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 @@
namespace egl
{
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
// Protects the global displays map.
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)
egl::Display *Display::getPlatformDisplay(EGLenum platform, void *nativeDisplay)
{
#ifndef __ANDROID__
if(platform == EGL_UNKNOWN) // Default
if(platform == EGL_UNKNOWN) // Default platform
{
#if defined(__unix__)
if(libX11)
......@@ -68,14 +56,14 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType
#endif
}
if(displayId == EGL_DEFAULT_DISPLAY)
if(!nativeDisplay) // Default display
{
if(platform == EGL_PLATFORM_X11_EXT)
{
#if defined(__unix__)
if(libX11->XOpenDisplay)
{
displayId = libX11->XOpenDisplay(NULL);
nativeDisplay = libX11->XOpenDisplay(NULL);
}
else
{
......@@ -88,26 +76,29 @@ egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType
}
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
egl::Display *rval;
displays_lock.lock();
DisplayMap* displays = getDisplays();
if (displays->find(displayId) != displays->end())
{
rval = (*displays)[displayId];
} else {
rval = new egl::Display(platform, displayId);
static std::map<void*, Display*> displays;
static sw::BackoffLock displaysMutex;
displaysMutex.lock();
(*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;
mMaxSwapInterval = 1;
......@@ -116,10 +107,6 @@ Display::Display(EGLenum platform, EGLNativeDisplayType displayId) : platform(pl
Display::~Display()
{
terminate();
displays_lock.lock();
getDisplays()->erase(displayId);
displays_lock.unlock();
}
static void cpuid(int registers[4], int info)
......@@ -561,7 +548,7 @@ bool Display::isValidWindow(EGLNativeWindowType window)
if(platform == EGL_PLATFORM_X11_EXT)
{
XWindowAttributes windowAttributes;
Status status = libX11->XGetWindowAttributes(displayId, window, &windowAttributes);
Status status = libX11->XGetWindowAttributes((::Display*)nativeDisplay, window, &windowAttributes);
return status == True;
}
......@@ -596,9 +583,9 @@ EGLint Display::getMaxSwapInterval() const
return mMaxSwapInterval;
}
EGLNativeDisplayType Display::getNativeDisplay() const
void *Display::getNativeDisplay() const
{
return displayId;
return nativeDisplay;
}
sw::Format Display::getDisplayFormat() const
......@@ -680,7 +667,7 @@ sw::Format Display::getDisplayFormat() const
#else
if(platform == EGL_PLATFORM_X11_EXT)
{
Screen *screen = libX11->XDefaultScreenOfDisplay(displayId);
Screen *screen = libX11->XDefaultScreenOfDisplay((::Display*)nativeDisplay);
unsigned int bpp = libX11->XPlanesOfScreen(screen);
switch(bpp)
......
......@@ -28,9 +28,7 @@ namespace egl
class Display
{
public:
~Display();
static egl::Display *getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId);
static egl::Display *getPlatformDisplay(EGLenum platform, void *nativeDisplay);
bool initialize();
void terminate();
......@@ -55,16 +53,17 @@ namespace egl
EGLint getMinSwapInterval() const;
EGLint getMaxSwapInterval() const;
EGLNativeDisplayType getNativeDisplay() const;
void *getNativeDisplay() const;
const char *getExtensionString() const;
private:
Display(EGLenum platform, EGLNativeDisplayType displayId);
Display(EGLenum platform, void *nativeDisplay);
~Display();
sw::Format getDisplayFormat() const;
const EGLenum platform;
const EGLNativeDisplayType displayId;
void *const nativeDisplay;
EGLint mMaxSwapInterval;
EGLint mMinSwapInterval;
......
......@@ -246,7 +246,7 @@ bool WindowSurface::initialize()
return reset(width, height);
#else
XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes);
libX11->XGetWindowAttributes((::Display*)display->getNativeDisplay(), window, &windowAttributes);
return reset(windowAttributes.width, windowAttributes.height);
#endif
......@@ -286,7 +286,7 @@ bool WindowSurface::checkForResize()
int clientHeight; window->query(window, NATIVE_WINDOW_HEIGHT, &clientHeight);
#else
XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes);
libX11->XGetWindowAttributes((::Display*)display->getNativeDisplay(), window, &windowAttributes);
int clientWidth = windowAttributes.width;
int clientHeight = windowAttributes.height;
......
......@@ -108,7 +108,14 @@ EGLDisplay GetDisplay(EGLNativeDisplayType 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)
......@@ -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);
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)
......
......@@ -66,6 +66,6 @@ const T &error(GLenum errorCode, const T &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_
......@@ -208,7 +208,7 @@ public:
__eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname);
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);
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
......
......@@ -337,7 +337,7 @@ egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *sh
extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);
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);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType window, int width, int height);
extern "C"
{
......
......@@ -229,7 +229,7 @@ public:
__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
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);
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
sw::FrameBuffer *(*createFrameBuffer)(void *display, EGLNativeWindowType window, int width, int height);
};
class LibGLESv2
......
......@@ -1333,7 +1333,7 @@ egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *sh
extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
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);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType window, int width, int height);
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