From 3202926746298468805f54ac5b39d62f9585dabf Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 30 Sep 2014 20:03:29 -0700 Subject: [PATCH] glx/dri3: Provide error diagnostics when DRI3 allocation fails Instead of just segfaulting in the driver when a buffer allocation fails, report error messages indicating what went wrong so that we can debug things. As a simple example, chromium wraps Mesa in a sandbox which doesn't allow access to most syscalls, including the ability to create shared memory segments for fences. Before, you'd get a simple segfault in mesa and your 3D acceleration would fail. Now you get: $ chromium --disable-gpu-blacklist [10618:10643:0930/200525:ERROR:nss_util.cc(856)] After loading Root Certs, loaded==false: NSS error code: -8018 libGL: pci id for fd 12: 8086:0a16, driver i965 libGL: OpenDriver: trying /local-miki/src/mesa/mesa/lib/i965_dri.so libGL: Can't open configuration file /home/keithp/.drirc: Operation not permitted. libGL: Can't open configuration file /home/keithp/.drirc: Operation not permitted. libGL error: DRI3 Fence object allocation failure Operation not permitted [10618:10618:0930/200525:ERROR:command_buffer_proxy_impl.cc(153)] Could not send GpuCommandBufferMsg_Initialize. [10618:10618:0930/200525:ERROR:webgraphicscontext3d_command_buffer_impl.cc(236)] CommandBufferProxy::Initialize failed. [10618:10618:0930/200525:ERROR:webgraphicscontext3d_command_buffer_impl.cc(256)] Failed to initialize command buffer. This made it pretty easy to diagnose the problem in the referenced bug report. Bugzilla: https://code.google.com/p/chromium/issues/detail?id=415681 Signed-off-by: Keith Packard Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Matt Turner --- src/glx/dri3_glx.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 753b8d88de4..e8e5c4ab28a 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -816,11 +816,15 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, */ fence_fd = xshmfence_alloc_shm(); - if (fence_fd < 0) + if (fence_fd < 0) { + ErrorMessageF("DRI3 Fence object allocation failure %s\n", strerror(errno)); return NULL; + } shm_fence = xshmfence_map_shm(fence_fd); - if (shm_fence == NULL) + if (shm_fence == NULL) { + ErrorMessageF("DRI3 Fence object map failure %s\n", strerror(errno)); goto no_shm_fence; + } /* Allocate the image from the driver */ @@ -829,8 +833,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, goto no_buffer; buffer->cpp = dri3_cpp_for_format(format); - if (!buffer->cpp) + if (!buffer->cpp) { + ErrorMessageF("DRI3 buffer format %d invalid\n", format); goto no_image; + } if (!psc->is_different_gpu) { buffer->image = (*psc->image->createImage) (psc->driScreen, @@ -841,8 +847,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, buffer); pixmap_buffer = buffer->image; - if (!buffer->image) + if (!buffer->image) { + ErrorMessageF("DRI3 gpu image creation failure\n"); goto no_image; + } } else { buffer->image = (*psc->image->createImage) (psc->driScreen, width, height, @@ -850,8 +858,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, 0, buffer); - if (!buffer->image) + if (!buffer->image) { + ErrorMessageF("DRI3 other gpu image creation failure\n"); goto no_image; + } buffer->linear_buffer = (*psc->image->createImage) (psc->driScreen, width, height, @@ -861,19 +871,25 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, buffer); pixmap_buffer = buffer->linear_buffer; - if (!buffer->linear_buffer) + if (!buffer->linear_buffer) { + ErrorMessageF("DRI3 gpu linear image creation failure\n"); goto no_linear_buffer; + } } /* X wants the stride, so ask the image for it */ - if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_STRIDE, &stride)) + if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_STRIDE, &stride)) { + ErrorMessageF("DRI3 get image stride failed\n"); goto no_buffer_attrib; + } buffer->pitch = stride; - if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_FD, &buffer_fd)) + if (!(*psc->image->queryImage)(pixmap_buffer, __DRI_IMAGE_ATTRIB_FD, &buffer_fd)) { + ErrorMessageF("DRI3 get image FD failed\n"); goto no_buffer_attrib; + } xcb_dri3_pixmap_from_buffer(c, (pixmap = xcb_generate_id(c)), @@ -913,6 +929,7 @@ no_buffer: xshmfence_unmap_shm(shm_fence); no_shm_fence: close(fence_fd); + ErrorMessageF("DRI3 alloc_render_buffer failed\n"); return NULL; } -- 2.30.2