summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-09-30 20:03:29 -0700
committerEmil Velikov <emil.l.velikov@gmail.com>2014-10-03 01:27:42 +0100
commitccf908e382c6dbd4d44cbe6473cdaa0d405ea62f (patch)
tree63391fbf5ae7bc571b076baa5f55ac9181fb2dd3
parented440234d4111322ff8d23fa137db9944bcc5a72 (diff)
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 <keithp@keithp.com> Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Matt Turner <mattst88@gmail.com> (cherry picked from commit 3202926746298468805f54ac5b39d62f9585dabf)
-rw-r--r--src/glx/dri3_glx.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index e3fc4def86e..ed3009435a6 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -813,11 +813,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
*/
@@ -826,8 +830,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,
@@ -838,8 +844,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,
@@ -847,8 +855,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,
@@ -858,19 +868,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)),
@@ -910,6 +926,7 @@ no_buffer:
xshmfence_unmap_shm(shm_fence);
no_shm_fence:
close(fence_fd);
+ ErrorMessageF("DRI3 alloc_render_buffer failed\n");
return NULL;
}