radv: Fix emitting SQTT userdata.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 13 Sep 2020 14:19:17 +0000 (16:19 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 28 Sep 2020 15:46:08 +0000 (15:46 +0000)
Otherwise some marker packets were missing ...

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6550>

src/amd/vulkan/layers/radv_sqtt_layer.c
src/amd/vulkan/radv_cs.h
src/amd/vulkan/radv_private.h
src/amd/vulkan/radv_sqtt.c

index af4264b..2b3f13a 100644 (file)
@@ -361,7 +361,7 @@ radv_write_begin_general_api_marker(struct radv_cmd_buffer *cmd_buffer,
        marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API;
        marker.api_type = api_type;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -375,7 +375,7 @@ radv_write_end_general_api_marker(struct radv_cmd_buffer *cmd_buffer,
        marker.api_type = api_type;
        marker.is_end = 1;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -406,7 +406,7 @@ radv_write_event_marker(struct radv_cmd_buffer *cmd_buffer,
        marker.instance_offset_reg_idx = instance_offset_user_data;
        marker.draw_index_reg_idx = draw_index_user_data;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -427,7 +427,7 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer,
        marker.thread_y = y;
        marker.thread_z = z;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -452,7 +452,7 @@ radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
        if (cmd_buffer->queue_family_index == RADV_QUEUE_GENERAL)
                marker.queue_flags |= VK_QUEUE_GRAPHICS_BIT;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -470,7 +470,7 @@ radv_describe_end_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
        marker.device_id_low = device_id;
        marker.device_id_high = device_id >> 32;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -522,7 +522,7 @@ radv_describe_barrier_start(struct radv_cmd_buffer *cmd_buffer,
        marker.cb_id = 0;
        marker.dword02 = reason;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -541,7 +541,7 @@ radv_describe_barrier_end(struct radv_cmd_buffer *cmd_buffer)
 
        /* TODO: fill pipeline stalls, cache flushes, etc */
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 
        cmd_buffer->state.num_layout_transitions = 0;
 }
@@ -566,7 +566,7 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer,
        marker.fmask_color_expand = barrier->layout_transitions.fmask_color_expand;
        marker.init_mask_ram = barrier->layout_transitions.init_mask_ram;
 
-       radv_emit_thread_trace_userdata(cs, &marker, sizeof(marker) / 4);
+       radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
 
        cmd_buffer->state.num_layout_transitions++;
 }
index 2bef75c..c6f9e4e 100644 (file)
@@ -136,6 +136,16 @@ static inline void radeon_set_uconfig_reg_seq(struct radeon_cmdbuf *cs, unsigned
        radeon_emit(cs, (reg - CIK_UCONFIG_REG_OFFSET) >> 2);
 }
 
+static inline void radeon_set_uconfig_reg_seq_perfctr(struct radeon_cmdbuf *cs,
+                                                     unsigned reg, unsigned num)
+{
+       assert(reg >= CIK_UCONFIG_REG_OFFSET && reg < CIK_UCONFIG_REG_END);
+       assert(cs->cdw + 2 + num <= cs->max_dw);
+       assert(num);
+       radeon_emit(cs, PKT3(PKT3_SET_UCONFIG_REG, num, 1));
+       radeon_emit(cs, (reg - CIK_UCONFIG_REG_OFFSET) >> 2);
+}
+
 static inline void radeon_set_uconfig_reg(struct radeon_cmdbuf *cs, unsigned reg, unsigned value)
 {
        radeon_set_uconfig_reg_seq(cs, reg, 1);
index 30d750b..4f954d5 100644 (file)
@@ -2491,7 +2491,8 @@ bool radv_begin_thread_trace(struct radv_queue *queue);
 bool radv_end_thread_trace(struct radv_queue *queue);
 bool radv_get_thread_trace(struct radv_queue *queue,
                           struct radv_thread_trace *thread_trace);
-void radv_emit_thread_trace_userdata(struct radeon_cmdbuf *cs,
+void radv_emit_thread_trace_userdata(const struct radv_device *device,
+                                    struct radeon_cmdbuf *cs,
                                     const void *data, uint32_t num_dwords);
 
 /* radv_rgp.c */
index 669c6fb..da18ce6 100644 (file)
@@ -342,7 +342,8 @@ radv_emit_thread_trace_stop(struct radv_device *device,
 }
 
 void
-radv_emit_thread_trace_userdata(struct radeon_cmdbuf *cs,
+radv_emit_thread_trace_userdata(const struct radv_device *device,
+                               struct radeon_cmdbuf *cs,
                                const void *data, uint32_t num_dwords)
 {
        const uint32_t *dwords = (uint32_t *)data;
@@ -350,7 +351,12 @@ radv_emit_thread_trace_userdata(struct radeon_cmdbuf *cs,
        while (num_dwords > 0) {
                uint32_t count = MIN2(num_dwords, 2);
 
-               radeon_set_uconfig_reg_seq(cs, R_030D08_SQ_THREAD_TRACE_USERDATA_2, count);
+               /* Without the perfctr bit the CP might not always pass the
+                * write on correctly. */
+               if (device->physical_device->rad_info.chip_class >= GFX10)
+                       radeon_set_uconfig_reg_seq_perfctr(cs, R_030D08_SQ_THREAD_TRACE_USERDATA_2, count);
+               else
+                       radeon_set_uconfig_reg_seq(cs, R_030D08_SQ_THREAD_TRACE_USERDATA_2, count);
                radeon_emit_array(cs, dwords, count);
 
                dwords += count;