radv: Don't assume there is always at least 1 preamble.
This fixes a mistake which assumes there is always at least 1 preamble.
This assumption is currently incorrect on transfer queues.
Fixes: e10b2f273e
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20401>
This commit is contained in:
@@ -5647,16 +5647,22 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi
|
|||||||
* before starting the next cmdbuffer, so we need to do it here.
|
* before starting the next cmdbuffer, so we need to do it here.
|
||||||
*/
|
*/
|
||||||
const bool need_wait = submission->wait_count > 0;
|
const bool need_wait = submission->wait_count > 0;
|
||||||
|
unsigned num_preambles = 0;
|
||||||
|
struct radeon_cmdbuf *preambles[4] = {0};
|
||||||
|
|
||||||
struct radeon_cmdbuf *preambles[4] = {
|
if (queue->state.qf == RADV_QUEUE_GENERAL || queue->state.qf == RADV_QUEUE_COMPUTE) {
|
||||||
need_wait ? queue->state.initial_full_flush_preamble_cs : queue->state.initial_preamble_cs,
|
preambles[num_preambles++] =
|
||||||
};
|
need_wait ? queue->state.initial_full_flush_preamble_cs : queue->state.initial_preamble_cs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned num_1q_preambles = num_preambles;
|
||||||
|
|
||||||
if (use_ace) {
|
if (use_ace) {
|
||||||
preambles[1] = queue->state.gang_wait_preamble_cs;
|
preambles[num_preambles++] = queue->state.gang_wait_preamble_cs;
|
||||||
preambles[2] = queue->ace_internal_state->gang_wait_preamble_cs;
|
preambles[num_preambles++] = queue->ace_internal_state->gang_wait_preamble_cs;
|
||||||
preambles[3] = need_wait ? queue->ace_internal_state->initial_full_flush_preamble_cs
|
preambles[num_preambles++] = need_wait
|
||||||
: queue->ace_internal_state->initial_preamble_cs;
|
? queue->ace_internal_state->initial_full_flush_preamble_cs
|
||||||
|
: queue->ace_internal_state->initial_preamble_cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct radv_winsys_submit_info submit = {
|
struct radv_winsys_submit_info submit = {
|
||||||
@@ -5709,7 +5715,7 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi
|
|||||||
cs_array[num_submitted_cs++] = perf_ctr_unlock_cs;
|
cs_array[num_submitted_cs++] = perf_ctr_unlock_cs;
|
||||||
|
|
||||||
submit.cs_count = num_submitted_cs;
|
submit.cs_count = num_submitted_cs;
|
||||||
submit.preamble_count = submit_ace ? 4 : 1;
|
submit.preamble_count = submit_ace ? num_preambles : num_1q_preambles;
|
||||||
|
|
||||||
result = queue->device->ws->cs_submit(
|
result = queue->device->ws->cs_submit(
|
||||||
ctx, &submit, j == 0 ? submission->wait_count : 0, submission->waits,
|
ctx, &submit, j == 0 ? submission->wait_count : 0, submission->waits,
|
||||||
|
@@ -1193,9 +1193,9 @@ radv_amdgpu_winsys_cs_submit_sysmem(struct radv_amdgpu_ctx *ctx, int queue_idx,
|
|||||||
|
|
||||||
u_rwlock_rdlock(&aws->global_bo_list.lock);
|
u_rwlock_rdlock(&aws->global_bo_list.lock);
|
||||||
|
|
||||||
result =
|
result = radv_amdgpu_get_bo_list(cs0->ws, &cs_array[i], cnt,
|
||||||
radv_amdgpu_get_bo_list(cs0->ws, &cs_array[i], cnt, (struct radv_amdgpu_winsys_bo **)bos,
|
(struct radv_amdgpu_winsys_bo **)bos, number_of_ibs,
|
||||||
number_of_ibs, &preamble_cs, 1, &num_handles, &handles);
|
&preamble_cs, preamble_cs ? 1 : 0, &num_handles, &handles);
|
||||||
if (result != VK_SUCCESS) {
|
if (result != VK_SUCCESS) {
|
||||||
free(ibs);
|
free(ibs);
|
||||||
free(bos);
|
free(bos);
|
||||||
|
Reference in New Issue
Block a user