Use unix domain sockets to connect to a debugger and send the information the debugger will use to properly handle debug events.
Signed-off-by: Ben Widawsky <b...@bwidawsk.net> --- src/mesa/drivers/dri/i965/brw_wm_debug.c | 66 ++++++++++++++++++++++++++++- 1 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_wm_debug.c b/src/mesa/drivers/dri/i965/brw_wm_debug.c index 41ee926..bc84aa0 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_debug.c +++ b/src/mesa/drivers/dri/i965/brw_wm_debug.c @@ -172,9 +172,60 @@ void brw_wm_print_program( struct brw_wm_compile *c, printf("\n"); } -/* This define should be shared with the debugger. Not sure of the best place - * for it */ -#define SCRATCH_SIZE (512 * 1024) +#define SCRATCH_SIZE (1 << 20) +#ifndef NO_DEBUGGER_LISTENING +#include <unistd.h> +#include <sys/un.h> +#include <sys/socket.h> +#include "intel_debug.h" + +static int +attach_to_debugger(int flink_handle) +{ + struct sockaddr_un addr; + struct debug_handshake dh; + int reply, fd, ret; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) + return -1; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, SHADER_DEBUG_SOCKET, sizeof(addr.sun_path) - 1); + + ret = connect(fd, &addr, sizeof(addr)); + if (ret == -1) + goto done; + + dh.version = DEBUG_HANDSHAKE_VERSION; + dh.flink_handle = flink_handle; + dh.per_thread_scratch = SCRATCH_SIZE; + ret = write(fd, &dh, sizeof(dh)); + if (ret != sizeof(dh)) { + ret = -1; + goto done; + } + + ret = read(fd, &reply, sizeof(reply)); + if (ret != sizeof(reply)) { + ret = -1; + goto done; + } + + if (strncmp(DEBUG_HANDSHAKE_ACK, (char *)&reply, strlen(DEBUG_HANDSHAKE_ACK))) { + ret = 1; + goto done; + } + + ret = 0; + +done: + close(fd); + return ret; +} +#endif + void brw_wm_init_debug( struct brw_context *brw, const char *sr_path ) { @@ -228,6 +279,7 @@ void brw_wm_init_debug( struct brw_context *brw, 4096); assert(brw->wm.scratch_bo); + /* Put a nice pattern in the buffer to hopefully help detect errors */ drm_intel_bo_map(brw->wm.scratch_bo, 0); memset(brw->wm.scratch_bo->virtual, 0xa5, SCRATCH_SIZE * brw->wm_max_threads); drm_intel_bo_unmap(brw->wm.scratch_bo); @@ -235,6 +287,14 @@ void brw_wm_init_debug( struct brw_context *brw, ret = drm_intel_bo_flink(brw->wm.scratch_bo, &name); assert(ret == 0); + /* Simple system routines do not need a debugger present */ + #ifndef NO_DEBUGGER_LISTENING + if (attach_to_debugger(name) != 0) { + fprintf(stderr, "Failed to attach to debugger\n"); + goto done; + } + #endif + brw->wm.debugging = GL_TRUE; done: -- 1.7.5.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev