llvmpipe: added some jit debug code
authorBrian Paul <brianp@vmware.com>
Thu, 29 Jul 2010 23:31:17 +0000 (17:31 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 29 Jul 2010 23:31:18 +0000 (17:31 -0600)
If we crash in the jitted function we can examine jit_line and
jit_state in gdb to learn more about the shader.

src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_rast_priv.h

index ba7b48328b04b4b8dfbdbde10ebf3a4988949daf..3215d0f65255b9ba9160934e94f4fc2adf5fc487 100644 (file)
 #include "lp_scene.h"
 
 
+#ifdef DEBUG
+int jit_line = 0;
+const struct lp_rast_state *jit_state = NULL;
+#endif
+
+
 /**
  * Begin rasterizing a scene.
  * Called once per scene by one thread.
@@ -419,6 +425,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
          depth = lp_rast_get_depth_block_pointer(task, tile_x + x, tile_y + y);
 
          /* run shader on 4x4 block */
+         BEGIN_JIT_CALL(state);
          variant->jit_function[RAST_WHOLE]( &state->jit_context,
                                             tile_x + x, tile_y + y,
                                             inputs->facing,
@@ -429,6 +436,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
                                             depth,
                                             0xffff,
                                             &task->vis_counter);
+         END_JIT_CALL();
       }
    }
 }
@@ -498,6 +506,7 @@ lp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
    assert(lp_check_alignment(state->jit_context.blend_color, 16));
 
    /* run shader on 4x4 block */
+   BEGIN_JIT_CALL(state);
    variant->jit_function[RAST_EDGE_TEST](&state->jit_context,
                                          x, y,
                                          inputs->facing,
@@ -508,6 +517,7 @@ lp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
                                          depth,
                                          mask,
                                          &task->vis_counter);
+   END_JIT_CALL();
 }
 
 
index b4a48cfd024470c4a7aaee89ba98a8f6ea30b9c5..760ab3db1f05a16d05b6f55e86b28d1eb4868eae 100644 (file)
 #include "lp_limits.h"
 
 
+/* If we crash in a jitted function, we can examine jit_line and jit_state
+ * to get some info.  This is not thread-safe, however.
+ */
+#ifdef DEBUG
+
+extern int jit_line;
+extern const struct lp_rast_state *jit_state;
+
+#define BEGIN_JIT_CALL(state) \
+   do { \
+      jit_line = __LINE__; \
+      jit_state = state; \
+   } while (0)
+
+#define END_JIT_CALL() \
+   do { \
+      jit_line = 0; \
+      jit_state = NULL; \
+   } while (0)
+
+#else
+
+#define BEGIN_JIT_CALL(X)
+#define END_JIT_CALL
+
+#endif
+
+
 struct lp_rasterizer;
 
 
@@ -249,6 +277,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
    depth = lp_rast_get_depth_block_pointer(task, x, y);
 
    /* run shader on 4x4 block */
+   BEGIN_JIT_CALL(state);
    variant->jit_function[RAST_WHOLE]( &state->jit_context,
                                       x, y,
                                       inputs->facing,
@@ -259,6 +288,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
                                       depth,
                                       0xffff,
                                       &task->vis_counter );
+   END_JIT_CALL();
 }