xorg-x11-server/0009-glamor-Error-out-on-out-of-memory-when-allocating-PB.patch
Olivier Fourdan 1e468bc44a xserver 1.20.7
- backport from stable "xserver-1.20-branch" up to commit ad7364d8d
  (for mutter fullscreen unredirect on Wayland)
- Update videodrv minor ABI as 1.20.7 changed the minor ABI version
  (backward compatible, API addition in glamor)
- Rebase Xwayland randr resolution change emulation support patches
2020-03-13 09:54:18 +01:00

67 lines
2.5 KiB
Diff

From a7b165d994d74131778a5a9bcffec957f1d1cacb Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Date: Mon, 10 Feb 2020 10:20:04 +0100
Subject: [PATCH xserver 09/22] glamor: Error out on out-of-memory when
allocating PBO for FBO access
Packed buffer allocation (which happens at glBufferData time with the
buffer bound) can fail when there is no GL memory left.
Pick up the error when it happens, print a proper error message, do
some cleanup and bail.
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
(cherry picked from commit bc2e12239f86e5a4acd220744f42eb83ba55d328)
---
glamor/glamor_prepare.c | 17 +++++++++++++++++
glamor/glamor_priv.h | 1 +
2 files changed, 18 insertions(+)
diff --git a/glamor/glamor_prepare.c b/glamor/glamor_prepare.c
index 5a73e6c7d..6b35936fc 100644
--- a/glamor/glamor_prepare.c
+++ b/glamor/glamor_prepare.c
@@ -88,10 +88,27 @@ glamor_prep_pixmap_box(PixmapPtr pixmap, glamor_access_t access, BoxPtr box)
gl_usage = GL_STREAM_READ;
+ glamor_priv->suppress_gl_out_of_memory_logging = true;
+
glBindBuffer(GL_PIXEL_PACK_BUFFER, priv->pbo);
glBufferData(GL_PIXEL_PACK_BUFFER,
pixmap->devKind * pixmap->drawable.height, NULL,
gl_usage);
+
+ glamor_priv->suppress_gl_out_of_memory_logging = false;
+
+ if (glGetError() == GL_OUT_OF_MEMORY) {
+ if (!glamor_priv->logged_any_pbo_allocation_failure) {
+ LogMessageVerb(X_WARNING, 0, "glamor: Failed to allocate %d "
+ "bytes PBO due to GL_OUT_OF_MEMORY.\n",
+ pixmap->devKind * pixmap->drawable.height);
+ glamor_priv->logged_any_pbo_allocation_failure = true;
+ }
+ glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+ glDeleteBuffers(1, &priv->pbo);
+ priv->pbo = 0;
+ return FALSE;
+ }
} else {
pixmap->devPrivate.ptr = xallocarray(pixmap->devKind,
pixmap->drawable.height);
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 661c11d90..1686ef5a4 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -289,6 +289,7 @@ typedef struct glamor_screen_private {
Bool suppress_gl_out_of_memory_logging;
Bool logged_any_fbo_allocation_failure;
+ Bool logged_any_pbo_allocation_failure;
/* xv */
glamor_program xv_prog;
--
2.24.1