mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 02:48:06 +02:00
radv/amdgpu: allow cs_execute_ib() to pass a VA instead of a BO
DGC IBs are considered external IBs because they aren't managed by the winsys and the BO itself isn't really useful. Passing a VA instead will help for future work. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29600>
This commit is contained in:
parent
e51ae61a4d
commit
030d6e6280
3 changed files with 26 additions and 30 deletions
|
|
@ -11582,8 +11582,8 @@ radv_CmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPre
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t cmdbuf_size = radv_get_indirect_cmdbuf_size(pGeneratedCommandsInfo);
|
uint32_t cmdbuf_size = radv_get_indirect_cmdbuf_size(pGeneratedCommandsInfo);
|
||||||
struct radeon_winsys_bo *ib_bo = prep_buffer->bo;
|
const uint64_t ib_va =
|
||||||
const uint64_t ib_offset = prep_buffer->offset + pGeneratedCommandsInfo->preprocessOffset;
|
radv_buffer_get_va(prep_buffer->bo) + prep_buffer->offset + pGeneratedCommandsInfo->preprocessOffset;
|
||||||
const uint32_t view_mask = cmd_buffer->state.render.view_mask;
|
const uint32_t view_mask = cmd_buffer->state.render.view_mask;
|
||||||
|
|
||||||
if (!radv_cmd_buffer_uses_mec(cmd_buffer)) {
|
if (!radv_cmd_buffer_uses_mec(cmd_buffer)) {
|
||||||
|
|
@ -11594,12 +11594,12 @@ radv_CmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPre
|
||||||
radv_cs_add_buffer(device->ws, cmd_buffer->cs, prep_buffer->bo);
|
radv_cs_add_buffer(device->ws, cmd_buffer->cs, prep_buffer->bo);
|
||||||
|
|
||||||
if (compute || !view_mask) {
|
if (compute || !view_mask) {
|
||||||
device->ws->cs_execute_ib(cmd_buffer->cs, ib_bo, ib_offset, cmdbuf_size >> 2, cmd_buffer->state.predicating);
|
device->ws->cs_execute_ib(cmd_buffer->cs, NULL, ib_va, cmdbuf_size >> 2, cmd_buffer->state.predicating);
|
||||||
} else {
|
} else {
|
||||||
u_foreach_bit (view, view_mask) {
|
u_foreach_bit (view, view_mask) {
|
||||||
radv_emit_view_index(&cmd_buffer->state, cmd_buffer->cs, view);
|
radv_emit_view_index(&cmd_buffer->state, cmd_buffer->cs, view);
|
||||||
|
|
||||||
device->ws->cs_execute_ib(cmd_buffer->cs, ib_bo, ib_offset, cmdbuf_size >> 2, cmd_buffer->state.predicating);
|
device->ws->cs_execute_ib(cmd_buffer->cs, NULL, ib_va, cmdbuf_size >> 2, cmd_buffer->state.predicating);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -289,8 +289,8 @@ struct radeon_winsys {
|
||||||
|
|
||||||
void (*cs_execute_secondary)(struct radeon_cmdbuf *parent, struct radeon_cmdbuf *child, bool allow_ib2);
|
void (*cs_execute_secondary)(struct radeon_cmdbuf *parent, struct radeon_cmdbuf *child, bool allow_ib2);
|
||||||
|
|
||||||
void (*cs_execute_ib)(struct radeon_cmdbuf *cs, struct radeon_winsys_bo *bo, const uint64_t offset,
|
void (*cs_execute_ib)(struct radeon_cmdbuf *cs, struct radeon_winsys_bo *bo, const uint64_t va, const uint32_t cdw,
|
||||||
const uint32_t cdw, const bool predicate);
|
const bool predicate);
|
||||||
|
|
||||||
void (*cs_dump)(struct radeon_cmdbuf *cs, FILE *file, const int *trace_ids, int trace_id_count,
|
void (*cs_dump)(struct radeon_cmdbuf *cs, FILE *file, const int *trace_ids, int trace_id_count,
|
||||||
enum radv_cs_dump_type type);
|
enum radv_cs_dump_type type);
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,9 @@
|
||||||
enum { VIRTUAL_BUFFER_HASH_TABLE_SIZE = 1024 };
|
enum { VIRTUAL_BUFFER_HASH_TABLE_SIZE = 1024 };
|
||||||
|
|
||||||
struct radv_amdgpu_ib {
|
struct radv_amdgpu_ib {
|
||||||
struct radeon_winsys_bo *bo;
|
struct radeon_winsys_bo *bo; /* NULL when not owned by the current CS object */
|
||||||
|
uint64_t va;
|
||||||
unsigned cdw;
|
unsigned cdw;
|
||||||
unsigned offset; /* VA offset */
|
|
||||||
bool is_external; /* Not owned by the current CS object. */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct radv_amdgpu_cs_ib_info {
|
struct radv_amdgpu_cs_ib_info {
|
||||||
|
|
@ -174,7 +173,7 @@ radv_amdgpu_cs_ib_to_info(struct radv_amdgpu_cs *cs, struct radv_amdgpu_ib ib)
|
||||||
struct radv_amdgpu_cs_ib_info info = {
|
struct radv_amdgpu_cs_ib_info info = {
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.ip_type = cs->hw_ip,
|
.ip_type = cs->hw_ip,
|
||||||
.ib_mc_address = radv_amdgpu_winsys_bo(ib.bo)->base.va + ib.offset,
|
.ib_mc_address = ib.va,
|
||||||
.size = ib.cdw,
|
.size = ib.cdw,
|
||||||
};
|
};
|
||||||
return info;
|
return info;
|
||||||
|
|
@ -197,7 +196,7 @@ radv_amdgpu_cs_destroy(struct radeon_cmdbuf *rcs)
|
||||||
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffer);
|
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffer);
|
||||||
|
|
||||||
for (unsigned i = 0; i < cs->num_ib_buffers; ++i) {
|
for (unsigned i = 0; i < cs->num_ib_buffers; ++i) {
|
||||||
if (cs->ib_buffers[i].is_external)
|
if (!cs->ib_buffers[i].bo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffers[i].bo);
|
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffers[i].bo);
|
||||||
|
|
@ -342,8 +341,7 @@ get_nop_packet(struct radv_amdgpu_cs *cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
radv_amdgpu_cs_add_ib_buffer(struct radv_amdgpu_cs *cs, struct radeon_winsys_bo *bo, uint32_t offset, uint32_t cdw,
|
radv_amdgpu_cs_add_ib_buffer(struct radv_amdgpu_cs *cs, struct radeon_winsys_bo *bo, uint64_t va, uint32_t cdw)
|
||||||
bool is_external)
|
|
||||||
{
|
{
|
||||||
if (cs->num_ib_buffers == cs->max_num_ib_buffers) {
|
if (cs->num_ib_buffers == cs->max_num_ib_buffers) {
|
||||||
unsigned max_num_ib_buffers = MAX2(1, cs->max_num_ib_buffers * 2);
|
unsigned max_num_ib_buffers = MAX2(1, cs->max_num_ib_buffers * 2);
|
||||||
|
|
@ -357,8 +355,7 @@ radv_amdgpu_cs_add_ib_buffer(struct radv_amdgpu_cs *cs, struct radeon_winsys_bo
|
||||||
}
|
}
|
||||||
|
|
||||||
cs->ib_buffers[cs->num_ib_buffers].bo = bo;
|
cs->ib_buffers[cs->num_ib_buffers].bo = bo;
|
||||||
cs->ib_buffers[cs->num_ib_buffers].offset = offset;
|
cs->ib_buffers[cs->num_ib_buffers].va = va;
|
||||||
cs->ib_buffers[cs->num_ib_buffers].is_external = is_external;
|
|
||||||
cs->ib_buffers[cs->num_ib_buffers++].cdw = cdw;
|
cs->ib_buffers[cs->num_ib_buffers++].cdw = cdw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -366,7 +363,7 @@ static void
|
||||||
radv_amdgpu_restore_last_ib(struct radv_amdgpu_cs *cs)
|
radv_amdgpu_restore_last_ib(struct radv_amdgpu_cs *cs)
|
||||||
{
|
{
|
||||||
struct radv_amdgpu_ib *ib = &cs->ib_buffers[--cs->num_ib_buffers];
|
struct radv_amdgpu_ib *ib = &cs->ib_buffers[--cs->num_ib_buffers];
|
||||||
assert(!ib->is_external);
|
assert(ib->bo);
|
||||||
cs->ib_buffer = ib->bo;
|
cs->ib_buffer = ib->bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -467,8 +464,8 @@ radv_amdgpu_cs_finalize(struct radeon_cmdbuf *_cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append the current (last) IB to the array of IB buffers. */
|
/* Append the current (last) IB to the array of IB buffers. */
|
||||||
radv_amdgpu_cs_add_ib_buffer(cs, cs->ib_buffer, 0, cs->use_ib ? G_3F2_IB_SIZE(*cs->ib_size_ptr) : cs->base.cdw,
|
radv_amdgpu_cs_add_ib_buffer(cs, cs->ib_buffer, cs->ib_buffer->va,
|
||||||
false);
|
cs->use_ib ? G_3F2_IB_SIZE(*cs->ib_size_ptr) : cs->base.cdw);
|
||||||
|
|
||||||
/* Prevent freeing this BO twice. */
|
/* Prevent freeing this BO twice. */
|
||||||
cs->ib_buffer = NULL;
|
cs->ib_buffer = NULL;
|
||||||
|
|
@ -509,7 +506,7 @@ radv_amdgpu_cs_reset(struct radeon_cmdbuf *_cs)
|
||||||
cs->ws->base.cs_add_buffer(&cs->base, cs->ib_buffer);
|
cs->ws->base.cs_add_buffer(&cs->base, cs->ib_buffer);
|
||||||
|
|
||||||
for (unsigned i = 0; i < cs->num_ib_buffers; ++i) {
|
for (unsigned i = 0; i < cs->num_ib_buffers; ++i) {
|
||||||
if (cs->ib_buffers[i].is_external)
|
if (!cs->ib_buffers[i].bo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffers[i].bo);
|
cs->ws->base.buffer_destroy(&cs->ws->base, cs->ib_buffers[i].bo);
|
||||||
|
|
@ -737,7 +734,7 @@ radv_amdgpu_cs_execute_secondary(struct radeon_cmdbuf *_parent, struct radeon_cm
|
||||||
if (child->use_ib)
|
if (child->use_ib)
|
||||||
cdw -= 4;
|
cdw -= 4;
|
||||||
|
|
||||||
assert(!ib->is_external);
|
assert(ib->bo);
|
||||||
|
|
||||||
if (parent->base.cdw + cdw > parent->base.max_dw)
|
if (parent->base.cdw + cdw > parent->base.max_dw)
|
||||||
radv_amdgpu_cs_grow(&parent->base, cdw);
|
radv_amdgpu_cs_grow(&parent->base, cdw);
|
||||||
|
|
@ -757,19 +754,19 @@ radv_amdgpu_cs_execute_secondary(struct radeon_cmdbuf *_parent, struct radeon_cm
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
radv_amdgpu_cs_execute_ib(struct radeon_cmdbuf *_cs, struct radeon_winsys_bo *bo, const uint64_t offset,
|
radv_amdgpu_cs_execute_ib(struct radeon_cmdbuf *_cs, struct radeon_winsys_bo *bo, uint64_t va, const uint32_t cdw,
|
||||||
const uint32_t cdw, const bool predicate)
|
const bool predicate)
|
||||||
{
|
{
|
||||||
struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
|
struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
|
||||||
const uint64_t va = bo->va + offset;
|
const uint64_t ib_va = bo ? bo->va : va;
|
||||||
|
|
||||||
if (cs->status != VK_SUCCESS)
|
if (cs->status != VK_SUCCESS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cs->hw_ip == AMD_IP_GFX && cs->use_ib) {
|
if (cs->hw_ip == AMD_IP_GFX && cs->use_ib) {
|
||||||
radeon_emit(&cs->base, PKT3(PKT3_INDIRECT_BUFFER, 2, predicate));
|
radeon_emit(&cs->base, PKT3(PKT3_INDIRECT_BUFFER, 2, predicate));
|
||||||
radeon_emit(&cs->base, va);
|
radeon_emit(&cs->base, ib_va);
|
||||||
radeon_emit(&cs->base, va >> 32);
|
radeon_emit(&cs->base, ib_va >> 32);
|
||||||
radeon_emit(&cs->base, cdw);
|
radeon_emit(&cs->base, cdw);
|
||||||
} else {
|
} else {
|
||||||
const uint32_t ib_size = radv_amdgpu_cs_get_initial_size(cs->ws, cs->hw_ip);
|
const uint32_t ib_size = radv_amdgpu_cs_get_initial_size(cs->ws, cs->hw_ip);
|
||||||
|
|
@ -778,7 +775,7 @@ radv_amdgpu_cs_execute_ib(struct radeon_cmdbuf *_cs, struct radeon_winsys_bo *bo
|
||||||
/* Finalize the current CS without chaining to execute the external IB. */
|
/* Finalize the current CS without chaining to execute the external IB. */
|
||||||
radv_amdgpu_cs_finalize(_cs);
|
radv_amdgpu_cs_finalize(_cs);
|
||||||
|
|
||||||
radv_amdgpu_cs_add_ib_buffer(cs, bo, offset, cdw, true);
|
radv_amdgpu_cs_add_ib_buffer(cs, bo, ib_va, cdw);
|
||||||
|
|
||||||
/* Start a new CS which isn't chained to any previous CS. */
|
/* Start a new CS which isn't chained to any previous CS. */
|
||||||
result = radv_amdgpu_cs_get_new_ib(_cs, ib_size);
|
result = radv_amdgpu_cs_get_new_ib(_cs, ib_size);
|
||||||
|
|
@ -956,7 +953,7 @@ static bool
|
||||||
radv_amdgpu_cs_has_external_ib(const struct radv_amdgpu_cs *cs)
|
radv_amdgpu_cs_has_external_ib(const struct radv_amdgpu_cs *cs)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < cs->num_ib_buffers; i++) {
|
for (unsigned i = 0; i < cs->num_ib_buffers; i++) {
|
||||||
if (cs->ib_buffers[i].is_external)
|
if (!cs->ib_buffers[i].bo)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -972,7 +969,7 @@ radv_amdgpu_get_num_ibs_per_cs(const struct radv_amdgpu_cs *cs)
|
||||||
unsigned num_external_ibs = 0;
|
unsigned num_external_ibs = 0;
|
||||||
|
|
||||||
for (unsigned i = 0; i < cs->num_ib_buffers; i++) {
|
for (unsigned i = 0; i < cs->num_ib_buffers; i++) {
|
||||||
if (cs->ib_buffers[i].is_external)
|
if (!cs->ib_buffers[i].bo)
|
||||||
num_external_ibs++;
|
num_external_ibs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1098,8 +1095,7 @@ radv_amdgpu_winsys_cs_submit_internal(struct radv_amdgpu_ctx *ctx, int queue_idx
|
||||||
ib = radv_amdgpu_cs_ib_to_info(cs, cs->ib_buffers[cs_ib_idx++]);
|
ib = radv_amdgpu_cs_ib_to_info(cs, cs->ib_buffers[cs_ib_idx++]);
|
||||||
|
|
||||||
/* Loop until the next external IB is found. */
|
/* Loop until the next external IB is found. */
|
||||||
while (!cs->ib_buffers[cur_ib_idx].is_external && !cs->ib_buffers[cs_ib_idx].is_external &&
|
while (cs->ib_buffers[cur_ib_idx].bo && cs->ib_buffers[cs_ib_idx].bo && cs_ib_idx < cs->num_ib_buffers) {
|
||||||
cs_ib_idx < cs->num_ib_buffers) {
|
|
||||||
cs_ib_idx++;
|
cs_ib_idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue