Mesa (master): aux/trace: dump current fb state on trigger-mode draw if it hasn't been seen yet

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 13 02:28:40 UTC 2021


Module: Mesa
Branch: master
Commit: 5ac3bb806b5f7bb13b9d85de162e4ff38a419f28
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5ac3bb806b5f7bb13b9d85de162e4ff38a419f28

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Apr  7 08:53:40 2021 -0400

aux/trace: dump current fb state on trigger-mode draw if it hasn't been seen yet

this info is important to have for a given frame, but it requires that the base
structs be copied and stored to the trace context for later use

Acked-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10093>

---

 src/gallium/auxiliary/driver_trace/tr_context.c | 122 +++++++++++++++++++-----
 src/gallium/auxiliary/driver_trace/tr_context.h |   8 ++
 2 files changed, 105 insertions(+), 25 deletions(-)

diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c
index 25f0821a2ef..ea2ef265c4a 100644
--- a/src/gallium/auxiliary/driver_trace/tr_context.c
+++ b/src/gallium/auxiliary/driver_trace/tr_context.c
@@ -25,9 +25,11 @@
  *
  **************************************************************************/
 
+#include "util/ralloc.h"
 #include "util/u_inlines.h"
 #include "util/u_memory.h"
 #include "util/simple_list.h"
+#include "util/u_framebuffer.h"
 
 #include "pipe/p_format.h"
 #include "pipe/p_screen.h"
@@ -86,6 +88,20 @@ trace_surface_unwrap(struct trace_context *tr_ctx,
    return tr_surf->surface;
 }
 
+static void
+dump_fb_state(struct trace_context *tr_ctx,
+              const char *method)
+{
+   struct pipe_context *pipe = tr_ctx->pipe;
+
+   trace_dump_call_begin("pipe_context", method);
+
+   trace_dump_arg(ptr, pipe);
+   trace_dump_arg(framebuffer_state, &tr_ctx->unwrapped_state);
+   trace_dump_call_end();
+
+   tr_ctx->seen_fb_state = true;
+}
 
 static void
 trace_context_draw_vbo(struct pipe_context *_pipe,
@@ -97,6 +113,9 @@ trace_context_draw_vbo(struct pipe_context *_pipe,
    struct trace_context *tr_ctx = trace_context(_pipe);
    struct pipe_context *pipe = tr_ctx->pipe;
 
+   if (!tr_ctx->seen_fb_state && trace_dump_is_triggered())
+      dump_fb_state(tr_ctx, "current_framebuffer_state");
+
    trace_dump_call_begin("pipe_context", "draw_vbo");
 
    trace_dump_arg(ptr,  pipe);
@@ -291,6 +310,12 @@ trace_context_create_blend_state(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
+   struct pipe_blend_state *blend = ralloc(tr_ctx, struct pipe_blend_state);
+   if (blend) {
+      memcpy(blend, state, sizeof(struct pipe_blend_state));
+      _mesa_hash_table_insert(&tr_ctx->blend_states, result, blend);
+   }
+
    return result;
 }
 
@@ -305,9 +330,13 @@ trace_context_bind_blend_state(struct pipe_context *_pipe,
    trace_dump_call_begin("pipe_context", "bind_blend_state");
 
    trace_dump_arg(ptr, pipe);
-   if (trace_dump_is_triggered())
-      trace_dump_arg(blend_state, state);
-   else
+   if (state && trace_dump_is_triggered()) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
+      if (he)
+         trace_dump_arg(blend_state, he->data);
+      else
+         trace_dump_arg(blend_state, NULL);
+   } else
       trace_dump_arg(ptr, state);
 
    pipe->bind_blend_state(pipe, state);
@@ -330,6 +359,14 @@ trace_context_delete_blend_state(struct pipe_context *_pipe,
 
    pipe->delete_blend_state(pipe, state);
 
+   if (state) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
+      if (he) {
+         free(he->data);
+         _mesa_hash_table_remove(&tr_ctx->blend_states, he);
+      }
+   }
+
    trace_dump_call_end();
 }
 
@@ -421,6 +458,12 @@ trace_context_create_rasterizer_state(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
+   struct pipe_rasterizer_state *rasterizer = ralloc(tr_ctx, struct pipe_rasterizer_state);
+   if (rasterizer) {
+      memcpy(rasterizer, state, sizeof(struct pipe_rasterizer_state));
+      _mesa_hash_table_insert(&tr_ctx->rasterizer_states, result, rasterizer);
+   }
+
    return result;
 }
 
@@ -435,9 +478,13 @@ trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
    trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
 
    trace_dump_arg(ptr, pipe);
-   if (trace_dump_is_triggered())
-      trace_dump_arg(rasterizer_state, state);
-   else
+   if (state && trace_dump_is_triggered()) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
+      if (he)
+         trace_dump_arg(rasterizer_state, he->data);
+      else
+         trace_dump_arg(rasterizer_state, NULL);
+   } else
       trace_dump_arg(ptr, state);
 
    pipe->bind_rasterizer_state(pipe, state);
@@ -461,6 +508,14 @@ trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
    pipe->delete_rasterizer_state(pipe, state);
 
    trace_dump_call_end();
+
+   if (state) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
+      if (he) {
+         free(he->data);
+         _mesa_hash_table_remove(&tr_ctx->rasterizer_states, he);
+      }
+   }
 }
 
 
@@ -483,6 +538,12 @@ trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
+   struct pipe_depth_stencil_alpha_state *depth_stencil_alpha = ralloc(tr_ctx, struct pipe_depth_stencil_alpha_state);
+   if (depth_stencil_alpha) {
+      memcpy(depth_stencil_alpha, state, sizeof(struct pipe_depth_stencil_alpha_state));
+      _mesa_hash_table_insert(&tr_ctx->depth_stencil_alpha_states, result, depth_stencil_alpha);
+   }
+
    return result;
 }
 
@@ -497,9 +558,13 @@ trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
    trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
 
    trace_dump_arg(ptr, pipe);
-   if (trace_dump_is_triggered())
-      trace_dump_arg(depth_stencil_alpha_state, state);
-   else
+   if (state && trace_dump_is_triggered()) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
+      if (he)
+         trace_dump_arg(depth_stencil_alpha_state, he->data);
+      else
+         trace_dump_arg(depth_stencil_alpha_state, NULL);
+   } else
       trace_dump_arg(ptr, state);
 
    pipe->bind_depth_stencil_alpha_state(pipe, state);
@@ -523,6 +588,14 @@ trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
    pipe->delete_depth_stencil_alpha_state(pipe, state);
 
    trace_dump_call_end();
+
+   if (state) {
+      struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
+      if (he) {
+         free(he->data);
+         _mesa_hash_table_remove(&tr_ctx->depth_stencil_alpha_states, he);
+      }
+   }
 }
 
 
@@ -786,27 +859,20 @@ trace_context_set_framebuffer_state(struct pipe_context *_pipe,
 {
    struct trace_context *tr_ctx = trace_context(_pipe);
    struct pipe_context *pipe = tr_ctx->pipe;
-   struct pipe_framebuffer_state unwrapped_state;
    unsigned i;
 
-
    /* Unwrap the input state */
-   memcpy(&unwrapped_state, state, sizeof(unwrapped_state));
+   memcpy(&tr_ctx->unwrapped_state, state, sizeof(tr_ctx->unwrapped_state));
    for (i = 0; i < state->nr_cbufs; ++i)
-      unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
+      tr_ctx->unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
    for (i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
-      unwrapped_state.cbufs[i] = NULL;
-   unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
-   state = &unwrapped_state;
+      tr_ctx->unwrapped_state.cbufs[i] = NULL;
+   tr_ctx->unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
+   state = &tr_ctx->unwrapped_state;
 
-   trace_dump_call_begin("pipe_context", "set_framebuffer_state");
-
-   trace_dump_arg(ptr, pipe);
-   trace_dump_arg(framebuffer_state, state);
+   dump_fb_state(tr_ctx, "set_framebuffer_state");
 
    pipe->set_framebuffer_state(pipe, state);
-
-   trace_dump_call_end();
 }
 
 static void
@@ -1380,8 +1446,10 @@ trace_context_flush(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
-   if (flags & PIPE_FLUSH_END_OF_FRAME)
+   if (flags & PIPE_FLUSH_END_OF_FRAME) {
       trace_dump_check_trigger();
+      tr_ctx->seen_fb_state = false;
+   }
 }
 
 
@@ -1473,7 +1541,7 @@ trace_context_destroy(struct pipe_context *_pipe)
 
    pipe->destroy(pipe);
 
-   FREE(tr_ctx);
+   ralloc_free(tr_ctx);
 }
 
 
@@ -1984,10 +2052,14 @@ trace_context_create(struct trace_screen *tr_scr,
    if (!trace_enabled())
       goto error1;
 
-   tr_ctx = CALLOC_STRUCT(trace_context);
+   tr_ctx = ralloc(NULL, struct trace_context);
    if (!tr_ctx)
       goto error1;
 
+   _mesa_hash_table_init(&tr_ctx->blend_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
+   _mesa_hash_table_init(&tr_ctx->rasterizer_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
+   _mesa_hash_table_init(&tr_ctx->depth_stencil_alpha_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
+
    tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
    tr_ctx->base.screen = &tr_scr->base;
    tr_ctx->base.stream_uploader = pipe->stream_uploader;
diff --git a/src/gallium/auxiliary/driver_trace/tr_context.h b/src/gallium/auxiliary/driver_trace/tr_context.h
index ad57d9d5243..95469e87530 100644
--- a/src/gallium/auxiliary/driver_trace/tr_context.h
+++ b/src/gallium/auxiliary/driver_trace/tr_context.h
@@ -31,6 +31,7 @@
 
 #include "pipe/p_compiler.h"
 #include "util/u_debug.h"
+#include "util/hash_table.h"
 #include "pipe/p_context.h"
 
 #include "tr_screen.h"
@@ -46,7 +47,14 @@ struct trace_context
 {
    struct pipe_context base;
 
+   struct hash_table blend_states;
+   struct hash_table rasterizer_states;
+   struct hash_table depth_stencil_alpha_states;
+
    struct pipe_context *pipe;
+
+   struct pipe_framebuffer_state unwrapped_state;
+   bool seen_fb_state;
 };
 
 



More information about the mesa-commit mailing list