Store the native display as an opaque pointer.
Bug 18314459
Change-Id: I63e56d626bd1838803d1de71b417b7e40242c5e9
Reviewed-on: https://swiftshader-review.googlesource.com/4390
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Main/FrameBufferX11.cpp b/src/Main/FrameBufferX11.cpp
index 245805f..e079e8c 100644
--- a/src/Main/FrameBufferX11.cpp
+++ b/src/Main/FrameBufferX11.cpp
@@ -1,150 +1,150 @@
-// SwiftShader Software Renderer
-//
-// Copyright(c) 2005-2012 TransGaming Inc.
-//
-// All rights reserved. No part of this software may be copied, distributed, transmitted,
-// transcribed, stored in a retrieval system, translated into any human or computer
-// language by any means, or disclosed to third parties without the explicit written
-// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
-// or implied, including but not limited to any patent rights, are granted to you.
-//
-
-// Surface.cpp: Implements the egl::Surface class, representing a drawing surface
-// such as the client area of a window, including any back buffers.
-// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
-
-#include "FrameBufferX11.hpp"
-
-#include "libX11.hpp"
-
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <string.h>
-#include <assert.h>
-
-namespace sw
-{
- static int (*PreviousXErrorHandler)(Display *display, XErrorEvent *event) = 0;
- static bool shmBadAccess = false;
-
- // Catches BadAcces errors so we can fall back to not using MIT-SHM
- static int XShmErrorHandler(Display *display, XErrorEvent *event)
- {
- if(event->error_code == BadAccess)
- {
- shmBadAccess = true;
- return 0;
- }
- else
- {
- return PreviousXErrorHandler(display, event);
- }
- }
-
- FrameBufferX11::FrameBufferX11(Display *display, Window window, int width, int height) : FrameBuffer(width, height, false, false), ownX11(!display), x_display(display), x_window(window)
- {
- if(!x_display)
- {
- x_display = libX11->XOpenDisplay(0);
- }
-
- int screen = DefaultScreen(x_display);
- x_gc = libX11->XDefaultGC(x_display, screen);
- int depth = libX11->XDefaultDepth(x_display, screen);
-
- Status status = libX11->XMatchVisualInfo(x_display, screen, 32, TrueColor, &x_visual);
- bool match = (status != 0 && x_visual.blue_mask == 0xFF); // Prefer X8R8G8B8
- Visual *visual = match ? x_visual.visual : libX11->XDefaultVisual(x_display, screen);
-
- mit_shm = (libX11->XShmQueryExtension && libX11->XShmQueryExtension(x_display) == True);
-
- if(mit_shm)
- {
- x_image = libX11->XShmCreateImage(x_display, visual, depth, ZPixmap, 0, &shminfo, width, height);
-
- shminfo.shmid = shmget(IPC_PRIVATE, x_image->bytes_per_line * x_image->height, IPC_CREAT | SHM_R | SHM_W);
- shminfo.shmaddr = x_image->data = buffer = (char*)shmat(shminfo.shmid, 0, 0);
- shminfo.readOnly = False;
-
- PreviousXErrorHandler = libX11->XSetErrorHandler(XShmErrorHandler);
- libX11->XShmAttach(x_display, &shminfo); // May produce a BadAccess error
- libX11->XSync(x_display, False);
- libX11->XSetErrorHandler(PreviousXErrorHandler);
-
- if(shmBadAccess)
- {
- mit_shm = false;
-
- XDestroyImage(x_image);
- shmdt(shminfo.shmaddr);
- shmctl(shminfo.shmid, IPC_RMID, 0);
-
- shmBadAccess = false;
- }
- }
-
- if(!mit_shm)
- {
- buffer = new char[width * height * 4];
- x_image = libX11->XCreateImage(x_display, visual, depth, ZPixmap, 0, buffer, width, height, 32, width * 4);
- }
- }
-
- FrameBufferX11::~FrameBufferX11()
- {
- if(!mit_shm)
- {
- x_image->data = 0;
- XDestroyImage(x_image);
-
- delete[] buffer;
- buffer = 0;
- }
- else
- {
- libX11->XShmDetach(x_display, &shminfo);
- XDestroyImage(x_image);
- shmdt(shminfo.shmaddr);
- shmctl(shminfo.shmid, IPC_RMID, 0);
- }
-
- if(ownX11)
- {
- libX11->XCloseDisplay(x_display);
- }
- }
-
- void *FrameBufferX11::lock()
- {
- stride = x_image->bytes_per_line;
- locked = buffer;
-
- return locked;
- }
-
- void FrameBufferX11::unlock()
- {
- locked = 0;
- }
-
- void FrameBufferX11::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
- {
- copy(source, sourceFormat, sourceStride);
-
- if(!mit_shm)
- {
- libX11->XPutImage(x_display, x_window, x_gc, x_image, 0, 0, 0, 0, width, height);
- }
- else
- {
- libX11->XShmPutImage(x_display, x_window, x_gc, x_image, 0, 0, 0, 0, width, height, False);
- }
-
- libX11->XSync(x_display, False);
- }
-}
-
-sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height)
-{
- return new sw::FrameBufferX11(display, window, width, height);
-}
+// SwiftShader Software Renderer
+//
+// Copyright(c) 2005-2012 TransGaming Inc.
+//
+// All rights reserved. No part of this software may be copied, distributed, transmitted,
+// transcribed, stored in a retrieval system, translated into any human or computer
+// language by any means, or disclosed to third parties without the explicit written
+// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
+// or implied, including but not limited to any patent rights, are granted to you.
+//
+
+// Surface.cpp: Implements the egl::Surface class, representing a drawing surface
+// such as the client area of a window, including any back buffers.
+// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
+
+#include "FrameBufferX11.hpp"
+
+#include "libX11.hpp"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <string.h>
+#include <assert.h>
+
+namespace sw
+{
+ static int (*PreviousXErrorHandler)(Display *display, XErrorEvent *event) = 0;
+ static bool shmBadAccess = false;
+
+ // Catches BadAcces errors so we can fall back to not using MIT-SHM
+ static int XShmErrorHandler(Display *display, XErrorEvent *event)
+ {
+ if(event->error_code == BadAccess)
+ {
+ shmBadAccess = true;
+ return 0;
+ }
+ else
+ {
+ return PreviousXErrorHandler(display, event);
+ }
+ }
+
+ FrameBufferX11::FrameBufferX11(Display *display, Window window, int width, int height) : FrameBuffer(width, height, false, false), ownX11(!display), x_display(display), x_window(window)
+ {
+ if(!x_display)
+ {
+ x_display = libX11->XOpenDisplay(0);
+ }
+
+ int screen = DefaultScreen(x_display);
+ x_gc = libX11->XDefaultGC(x_display, screen);
+ int depth = libX11->XDefaultDepth(x_display, screen);
+
+ Status status = libX11->XMatchVisualInfo(x_display, screen, 32, TrueColor, &x_visual);
+ bool match = (status != 0 && x_visual.blue_mask == 0xFF); // Prefer X8R8G8B8
+ Visual *visual = match ? x_visual.visual : libX11->XDefaultVisual(x_display, screen);
+
+ mit_shm = (libX11->XShmQueryExtension && libX11->XShmQueryExtension(x_display) == True);
+
+ if(mit_shm)
+ {
+ x_image = libX11->XShmCreateImage(x_display, visual, depth, ZPixmap, 0, &shminfo, width, height);
+
+ shminfo.shmid = shmget(IPC_PRIVATE, x_image->bytes_per_line * x_image->height, IPC_CREAT | SHM_R | SHM_W);
+ shminfo.shmaddr = x_image->data = buffer = (char*)shmat(shminfo.shmid, 0, 0);
+ shminfo.readOnly = False;
+
+ PreviousXErrorHandler = libX11->XSetErrorHandler(XShmErrorHandler);
+ libX11->XShmAttach(x_display, &shminfo); // May produce a BadAccess error
+ libX11->XSync(x_display, False);
+ libX11->XSetErrorHandler(PreviousXErrorHandler);
+
+ if(shmBadAccess)
+ {
+ mit_shm = false;
+
+ XDestroyImage(x_image);
+ shmdt(shminfo.shmaddr);
+ shmctl(shminfo.shmid, IPC_RMID, 0);
+
+ shmBadAccess = false;
+ }
+ }
+
+ if(!mit_shm)
+ {
+ buffer = new char[width * height * 4];
+ x_image = libX11->XCreateImage(x_display, visual, depth, ZPixmap, 0, buffer, width, height, 32, width * 4);
+ }
+ }
+
+ FrameBufferX11::~FrameBufferX11()
+ {
+ if(!mit_shm)
+ {
+ x_image->data = 0;
+ XDestroyImage(x_image);
+
+ delete[] buffer;
+ buffer = 0;
+ }
+ else
+ {
+ libX11->XShmDetach(x_display, &shminfo);
+ XDestroyImage(x_image);
+ shmdt(shminfo.shmaddr);
+ shmctl(shminfo.shmid, IPC_RMID, 0);
+ }
+
+ if(ownX11)
+ {
+ libX11->XCloseDisplay(x_display);
+ }
+ }
+
+ void *FrameBufferX11::lock()
+ {
+ stride = x_image->bytes_per_line;
+ locked = buffer;
+
+ return locked;
+ }
+
+ void FrameBufferX11::unlock()
+ {
+ locked = 0;
+ }
+
+ void FrameBufferX11::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
+ {
+ copy(source, sourceFormat, sourceStride);
+
+ if(!mit_shm)
+ {
+ libX11->XPutImage(x_display, x_window, x_gc, x_image, 0, 0, 0, 0, width, height);
+ }
+ else
+ {
+ libX11->XShmPutImage(x_display, x_window, x_gc, x_image, 0, 0, 0, 0, width, height, False);
+ }
+
+ libX11->XSync(x_display, False);
+ }
+}
+
+sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height)
+{
+ return new sw::FrameBufferX11((::Display*)display, window, width, height);
+}