/**
* Indirect compute parameters resource.
*/
- struct radv_buffer *indirect;
- uint64_t indirect_offset;
+ struct radeon_winsys_bo *indirect;
+ uint64_t va;
};
static void
}
if (info->indirect) {
- uint64_t va = radv_buffer_get_va(info->indirect->bo);
-
- va += info->indirect->offset + info->indirect_offset;
-
- radv_cs_add_buffer(ws, cs, info->indirect->bo);
+ radv_cs_add_buffer(ws, cs, info->indirect);
if (loc->sgpr_idx != -1) {
for (unsigned i = 0; i < 3; ++i) {
radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0));
radeon_emit(cs,
COPY_DATA_SRC_SEL(COPY_DATA_SRC_MEM) | COPY_DATA_DST_SEL(COPY_DATA_REG));
- radeon_emit(cs, (va + 4 * i));
- radeon_emit(cs, (va + 4 * i) >> 32);
+ radeon_emit(cs, (info->va + 4 * i));
+ radeon_emit(cs, (info->va + 4 * i) >> 32);
radeon_emit(cs, ((R_00B900_COMPUTE_USER_DATA_0 + loc->sgpr_idx * 4) >> 2) + i);
radeon_emit(cs, 0);
}
if (radv_cmd_buffer_uses_mec(cmd_buffer)) {
radeon_emit(cs, PKT3(PKT3_DISPATCH_INDIRECT, 2, predicating) | PKT3_SHADER_TYPE_S(1));
- radeon_emit(cs, va);
- radeon_emit(cs, va >> 32);
+ radeon_emit(cs, info->va);
+ radeon_emit(cs, info->va >> 32);
radeon_emit(cs, dispatch_initiator);
} else {
radeon_emit(cs, PKT3(PKT3_SET_BASE, 2, 0) | PKT3_SHADER_TYPE_S(1));
radeon_emit(cs, 1);
- radeon_emit(cs, va);
- radeon_emit(cs, va >> 32);
+ radeon_emit(cs, info->va);
+ radeon_emit(cs, info->va >> 32);
radeon_emit(cs, PKT3(PKT3_DISPATCH_INDIRECT, 1, predicating) | PKT3_SHADER_TYPE_S(1));
radeon_emit(cs, 0);
RADV_FROM_HANDLE(radv_buffer, buffer, _buffer);
struct radv_dispatch_info info = {0};
- info.indirect = buffer;
- info.indirect_offset = offset;
+ info.indirect = buffer->bo;
+ info.va = radv_buffer_get_va(buffer->bo) + buffer->offset + offset;
radv_compute_dispatch(cmd_buffer, &info);
}
radv_compute_dispatch(cmd_buffer, &info);
}
+void
+radv_indirect_dispatch(struct radv_cmd_buffer *cmd_buffer, struct radeon_winsys_bo *bo, uint64_t va)
+{
+ struct radv_dispatch_info info = {0};
+
+ info.indirect = bo;
+ info.va = va;
+
+ radv_compute_dispatch(cmd_buffer, &info);
+}
+
static void
radv_rt_dispatch(struct radv_cmd_buffer *cmd_buffer, const struct radv_dispatch_info *info)
{