radv: add encoder queue support pieces and encoder queries.

This is just checks for events and avoiding an assert in the winsys,
and adds support for the encoder queries.

Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25900>
This commit is contained in:
Dave Airlie 2023-10-26 12:13:35 +10:00
parent f6c27bea26
commit 1d74661dfd
3 changed files with 56 additions and 2 deletions

View File

@ -11605,7 +11605,7 @@ write_event(struct radv_cmd_buffer *cmd_buffer, struct radv_event *event, VkPipe
struct radeon_cmdbuf *cs = cmd_buffer->cs;
uint64_t va = radv_buffer_get_va(event->bo);
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC)
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
return;
radv_emit_cache_flush(cmd_buffer);
@ -11702,7 +11702,7 @@ radv_CmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const Vk
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
struct radeon_cmdbuf *cs = cmd_buffer->cs;
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC)
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
return;
for (unsigned i = 0; i < eventCount; ++i) {

View File

@ -537,6 +537,7 @@ struct radv_cmd_buffer {
struct radv_video_session_params *params;
struct rvcn_sq_var sq;
struct rvcn_decode_buffer_s *decode_buffer;
uint64_t feedback_query_va;
} video;
struct {

View File

@ -1280,6 +1280,9 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo *
pool->stride = 16;
}
break;
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
pool->stride = 48;
break;
default:
unreachable("creating unhandled query type");
}
@ -1650,6 +1653,43 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
}
break;
}
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR: {
uint32_t *src32 = (uint32_t *)src;
uint32_t value;
do {
value = p_atomic_read(&src32[1]);
} while (value != 1 && (flags & VK_QUERY_RESULT_WAIT_BIT));
available = value != 0;
if (!available && !(flags & VK_QUERY_RESULT_PARTIAL_BIT))
result = VK_NOT_READY;
if (flags & VK_QUERY_RESULT_64_BIT) {
uint64_t *dest64 = (uint64_t *)dest;
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
dest64[0] = src32[5];
dest64[1] = src32[6];
}
dest += 16;
if (flags & VK_QUERY_RESULT_WITH_STATUS_BIT_KHR) {
dest64[2] = 1;
dest += 8;
}
} else {
uint32_t *dest32 = (uint32_t *)dest;
if (available || (flags & VK_QUERY_RESULT_PARTIAL_BIT)) {
dest32[0] = src32[5];
dest32[1] = src32[6];
}
dest += 8;
if (flags & VK_QUERY_RESULT_WITH_STATUS_BIT_KHR) {
dest32[2] = 1;
dest += 4;
}
}
break;
}
default:
unreachable("trying to get results of unhandled query type");
}
@ -1707,6 +1747,9 @@ radv_query_result_size(const struct radv_query_pool *pool, VkQueryResultFlags fl
case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT:
values += 1;
break;
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
values += 1;
break;
default:
unreachable("trying to get size of unhandled query type");
}
@ -1926,6 +1969,10 @@ radv_CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uin
uint32_t value = query_clear_value(pool->vk.query_type);
uint32_t flush_bits = 0;
if (cmd_buffer->qf == RADV_QUEUE_VIDEO_DEC || cmd_buffer->qf == RADV_QUEUE_VIDEO_ENC)
/* video queries don't work like this */
return;
/* Make sure to sync all previous work if the given command buffer has
* pending active queries. Otherwise the GPU might write queries data
* after the reset operation.
@ -2272,6 +2319,9 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo
}
break;
}
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
cmd_buffer->video.feedback_query_va = va;
break;
default:
unreachable("beginning unhandled query type");
}
@ -2489,6 +2539,9 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool,
}
break;
}
case VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR:
cmd_buffer->video.feedback_query_va = 0;
break;
default:
unreachable("ending unhandled query type");
}