diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c index 3f35852a75b..b451a34d1ed 100644 --- a/src/gallium/auxiliary/driver_trace/tr_context.c +++ b/src/gallium/auxiliary/driver_trace/tr_context.c @@ -141,6 +141,39 @@ trace_context_draw_vbo(struct pipe_context *_pipe, } +static void +trace_context_draw_vertex_state(struct pipe_context *_pipe, + struct pipe_vertex_state *state, + uint32_t partial_velem_mask, + struct pipe_draw_vertex_state_info info, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws) +{ + 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", true); + + trace_dump_call_begin("pipe_context", "draw_vertex_state"); + + trace_dump_arg(ptr, pipe); + trace_dump_arg(ptr, state); + trace_dump_arg(uint, partial_velem_mask); + trace_dump_arg(draw_vertex_state_info, info); + trace_dump_arg_begin("draws"); + trace_dump_struct_array(draw_start_count, draws, num_draws); + trace_dump_arg_end(); + trace_dump_arg(uint, num_draws); + + trace_dump_trace_flush(); + + pipe->draw_vertex_state(pipe, state, partial_velem_mask, info, draws, + num_draws); + trace_dump_call_end(); +} + + static struct pipe_query * trace_context_create_query(struct pipe_context *_pipe, unsigned query_type, @@ -2177,6 +2210,7 @@ trace_context_create(struct trace_screen *tr_scr, tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL TR_CTX_INIT(draw_vbo); + TR_CTX_INIT(draw_vertex_state); TR_CTX_INIT(render_condition); TR_CTX_INIT(create_query); TR_CTX_INIT(destroy_query); diff --git a/src/gallium/auxiliary/driver_trace/tr_dump_state.c b/src/gallium/auxiliary/driver_trace/tr_dump_state.c index 3d49ff42838..1f5da80193f 100644 --- a/src/gallium/auxiliary/driver_trace/tr_dump_state.c +++ b/src/gallium/auxiliary/driver_trace/tr_dump_state.c @@ -834,6 +834,17 @@ void trace_dump_draw_info(const struct pipe_draw_info *state) trace_dump_struct_end(); } +void trace_dump_draw_vertex_state_info(struct pipe_draw_vertex_state_info state) +{ + if (!trace_dumping_enabled_locked()) + return; + + trace_dump_struct_begin("pipe_draw_vertex_state_info"); + trace_dump_member(uint, &state, mode); + trace_dump_member(uint, &state, take_vertex_state_ownership); + trace_dump_struct_end(); +} + void trace_dump_draw_start_count(const struct pipe_draw_start_count_bias *state) { if (!trace_dumping_enabled_locked()) diff --git a/src/gallium/auxiliary/driver_trace/tr_dump_state.h b/src/gallium/auxiliary/driver_trace/tr_dump_state.h index f3d89ebd7a3..f5633b3be12 100644 --- a/src/gallium/auxiliary/driver_trace/tr_dump_state.h +++ b/src/gallium/auxiliary/driver_trace/tr_dump_state.h @@ -86,6 +86,8 @@ void trace_dump_shader_buffer(const struct pipe_shader_buffer *buffer); void trace_dump_draw_info(const struct pipe_draw_info *state); +void trace_dump_draw_vertex_state_info(struct pipe_draw_vertex_state_info state); + void trace_dump_draw_start_count(const struct pipe_draw_start_count_bias *state); void trace_dump_draw_indirect_info(const struct pipe_draw_indirect_info *state); diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c index 082bc70f67b..02562e565c7 100644 --- a/src/gallium/auxiliary/driver_trace/tr_screen.c +++ b/src/gallium/auxiliary/driver_trace/tr_screen.c @@ -1040,6 +1040,49 @@ trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t mo return ret; } +static struct pipe_vertex_state * +trace_screen_create_vertex_state(struct pipe_screen *_screen, + struct pipe_vertex_buffer *buffer, + const struct pipe_vertex_element *elements, + unsigned num_elements, + struct pipe_resource *indexbuf, + uint32_t full_velem_mask) +{ + struct trace_screen *tr_scr = trace_screen(_screen); + struct pipe_screen *screen = tr_scr->screen; + + trace_dump_call_begin("pipe_screen", "create_vertex_state"); + + trace_dump_arg(ptr, screen); + trace_dump_arg(ptr, buffer->buffer.resource); + trace_dump_arg(vertex_buffer, buffer); + trace_dump_struct_array(vertex_element, elements, num_elements); + trace_dump_arg(uint, num_elements); + trace_dump_arg(ptr, indexbuf); + trace_dump_arg(uint, full_velem_mask); + + struct pipe_vertex_state *vstate = + screen->create_vertex_state(screen, buffer, elements, num_elements, + indexbuf, full_velem_mask); + trace_dump_ret(ptr, vstate); + trace_dump_call_end(); + return vstate; +} + +static void trace_screen_vertex_state_destroy(struct pipe_screen *_screen, + struct pipe_vertex_state *state) +{ + struct trace_screen *tr_scr = trace_screen(_screen); + struct pipe_screen *screen = tr_scr->screen; + + trace_dump_call_begin("pipe_screen", "vertex_state_destroy"); + trace_dump_arg(ptr, screen); + trace_dump_arg(ptr, state); + trace_dump_call_end(); + + screen->vertex_state_destroy(screen, state); +} + bool trace_enabled(void) { @@ -1134,6 +1177,8 @@ trace_screen_create(struct pipe_screen *screen) SCR_INIT(get_driver_uuid); SCR_INIT(get_device_uuid); SCR_INIT(finalize_nir); + SCR_INIT(create_vertex_state); + SCR_INIT(vertex_state_destroy); tr_scr->base.transfer_helper = screen->transfer_helper; tr_scr->screen = screen;