Remove X11 window validation.
Despite being a 'client resource', the window can become invalid due to
events outside of the client code's control, which causes
XGetWindowAttributes to fail because it retrieves servers-side data
that is no longer available. Hence it is something we should expect to
see happen, and not (always) an indication of a bug that needs fixing.
Also, we should be able to safely continue with an invalid window.
At this point it's up to the client code to catch the X error and
handle it appropriately. The EGL spec does not indicate that it should
catch it instead and generate an error (eglSwapBuffers can generate
EGL_CONTEXT_LOST but that's reserved for power management events).
Bug chromium:861882
Bug chromium:824522
Change-Id: I78a364516b9466f652c94de68553369935590bde
Reviewed-on: https://swiftshader-review.googlesource.com/19868
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Main/FrameBufferX11.cpp b/src/Main/FrameBufferX11.cpp
index ca56b59..b3ae3b4 100644
--- a/src/Main/FrameBufferX11.cpp
+++ b/src/Main/FrameBufferX11.cpp
@@ -50,12 +50,11 @@
assert(x_display);
}
- validateWindow();
-
int screen = DefaultScreen(x_display);
x_gc = libX11->XDefaultGC(x_display, screen);
int depth = libX11->XDefaultDepth(x_display, screen);
+ XVisualInfo x_visual;
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);
@@ -118,9 +117,6 @@
shmctl(shminfo.shmid, IPC_RMID, 0);
}
- // Last chance to check the window before we close the display.
- validateWindow();
-
if(ownX11)
{
libX11->XCloseDisplay(x_display);
@@ -147,8 +143,6 @@
{
copy(source);
- assert(validateWindow());
-
if(!mit_shm)
{
libX11->XPutImage(x_display, x_window, x_gc, x_image, 0, 0, 0, 0, width, height);
@@ -190,21 +184,6 @@
libX11->XDrawString(x_display, x_window, x_gc, 50, 50, string, strlen(string));
}
}
-
- bool FrameBufferX11::validateWindow()
- {
- // Since we don't own the window, it is the external client code's responsibility
- // to not destroy it until we're done with it. We help out by validating it.
- XWindowAttributes windowAttributes;
- Status status = libX11->XGetWindowAttributes(x_display, x_window, &windowAttributes);
-
- if(status != True)
- {
- abort(); // Fail hard if we can't obtain the window's attributes.
- }
-
- return true;
- }
}
NO_SANITIZE_FUNCTION sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height)
diff --git a/src/Main/FrameBufferX11.hpp b/src/Main/FrameBufferX11.hpp
index aa06276..dc96331 100644
--- a/src/Main/FrameBufferX11.hpp
+++ b/src/Main/FrameBufferX11.hpp
@@ -31,21 +31,18 @@
~FrameBufferX11() override;
- void flip(sw::Surface *source) override {blit(source, nullptr, nullptr);};
+ void flip(sw::Surface *source) override { blit(source, nullptr, nullptr); }
void blit(sw::Surface *source, const Rect *sourceRect, const Rect *destRect) override;
void *lock() override;
void unlock() override;
private:
- bool validateWindow();
-
- bool ownX11;
+ const bool ownX11;
Display *x_display;
- Window x_window;
- XImage *x_image;
+ const Window x_window;
+ XImage *x_image = nullptr;
GC x_gc;
- XVisualInfo x_visual;
bool mit_shm;
XShmSegmentInfo shminfo;