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
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
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
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
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
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
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
/* 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;
}
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++;
}
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);
}
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;
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;