vk: do not crash on corrupted scopes stack
This is not a valid reason to assert/crash, even though it is clearly a programming mistake. If the stack is corrupted, just print its contents as an S_ERROR and continue. Also: - Fix the ultimate reason for stack being unbalanced for #604 - Do not analyze scopes when not needed, i.e. when `r_speeds` is zero. Fixes #604
This commit is contained in:
parent
f1c8b3ef2f
commit
5698746f42
|
@ -213,10 +213,24 @@ static void drawCPUProfilerScopes(int draw, const aprof_event_t *events, uint64_
|
||||||
ASSERT(depth > 0);
|
ASSERT(depth > 0);
|
||||||
--depth;
|
--depth;
|
||||||
|
|
||||||
ASSERT(stack[depth].scope_id == scope_id);
|
|
||||||
ASSERT(scope_id >= 0);
|
ASSERT(scope_id >= 0);
|
||||||
ASSERT(scope_id < APROF_MAX_SCOPES);
|
ASSERT(scope_id < APROF_MAX_SCOPES);
|
||||||
|
|
||||||
|
if (stack[depth].scope_id != scope_id) {
|
||||||
|
gEngine.Con_Printf(S_ERROR "scope_id mismatch at stack depth=%d: found %d(%s), expected %d(%s)\n",
|
||||||
|
depth,
|
||||||
|
scope_id, g_aprof.scopes[scope_id].name,
|
||||||
|
stack[depth].scope_id, g_aprof.scopes[stack[depth].scope_id].name);
|
||||||
|
|
||||||
|
gEngine.Con_Printf(S_ERROR "Full stack:\n");
|
||||||
|
for (int i = depth; i >= 0; --i) {
|
||||||
|
gEngine.Con_Printf(S_ERROR " %d: scope_id=%d(%s)\n", i,
|
||||||
|
stack[i].scope_id, g_aprof.scopes[stack[i].scope_id].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const aprof_scope_t *const scope = g_aprof.scopes + scope_id;
|
const aprof_scope_t *const scope = g_aprof.scopes + scope_id;
|
||||||
const uint64_t delta_ns = timestamp_ns - stack[depth].begin_ns;
|
const uint64_t delta_ns = timestamp_ns - stack[depth].begin_ns;
|
||||||
|
|
||||||
|
@ -482,7 +496,7 @@ static void drawGPUProfilerScopes(qboolean draw, int y, uint64_t frame_begin_tim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drawFrames( int draw, uint32_t prev_frame_index, int y, const vk_combuf_scopes_t *gpurofls, int gpurofls_count) {
|
static int analyzeScopesAndDrawFrames( int draw, uint32_t prev_frame_index, int y, const vk_combuf_scopes_t *gpurofls, int gpurofls_count) {
|
||||||
// Draw latest 2 frames; find their boundaries
|
// Draw latest 2 frames; find their boundaries
|
||||||
uint32_t rewind_frame = prev_frame_index;
|
uint32_t rewind_frame = prev_frame_index;
|
||||||
const int max_frames_to_draw = 2;
|
const int max_frames_to_draw = 2;
|
||||||
|
@ -974,10 +988,11 @@ void R_SpeedsDisplayMore(uint32_t prev_frame_index, const struct vk_combuf_scope
|
||||||
|
|
||||||
handlePause( prev_frame_index );
|
handlePause( prev_frame_index );
|
||||||
|
|
||||||
|
if (speeds_bits != 0)
|
||||||
{
|
{
|
||||||
int y = 100;
|
int y = 100;
|
||||||
const int draw_frame = speeds_bits & SPEEDS_BIT_FRAME;
|
const int draw_frame = speeds_bits & SPEEDS_BIT_FRAME;
|
||||||
y = drawFrames( draw_frame, prev_frame_index, y, gpurofl, gpurofl_count );
|
y = analyzeScopesAndDrawFrames( draw_frame, prev_frame_index, y, gpurofl, gpurofl_count );
|
||||||
|
|
||||||
const int draw_graphs = speeds_bits & SPEEDS_BIT_GRAPHS;
|
const int draw_graphs = speeds_bits & SPEEDS_BIT_GRAPHS;
|
||||||
if (draw_graphs)
|
if (draw_graphs)
|
||||||
|
|
|
@ -558,7 +558,7 @@ void VK_RayFrameEnd(const vk_ray_frame_render_args_t* args)
|
||||||
|
|
||||||
// Do not draw when we have no swapchain
|
// Do not draw when we have no swapchain
|
||||||
if (args->dst.image_view == VK_NULL_HANDLE)
|
if (args->dst.image_view == VK_NULL_HANDLE)
|
||||||
return;
|
goto tail;
|
||||||
|
|
||||||
if (g_ray_model_state.frame.instances_count == 0) {
|
if (g_ray_model_state.frame.instances_count == 0) {
|
||||||
const r_vkimage_blit_args blit_args = {
|
const r_vkimage_blit_args blit_args = {
|
||||||
|
@ -592,6 +592,7 @@ void VK_RayFrameEnd(const vk_ray_frame_render_args_t* args)
|
||||||
performTracing( args->combuf, &trace_args );
|
performTracing( args->combuf, &trace_args );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tail:
|
||||||
APROF_SCOPE_END(ray_frame_end);
|
APROF_SCOPE_END(ray_frame_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue