mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-02 16:00:09 +01:00
radv/video: handle inline queries for vulkan video encode.
This handles the new inlines queries for VK_KHR_video_maintenance1 (Decode doesn't do queries on AMD at the moment). Reviewed-by: Lynne <dev@lynne.ee> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30671>
This commit is contained in:
parent
1b4ae3d7af
commit
fc137ecaca
1 changed files with 20 additions and 5 deletions
|
|
@ -32,6 +32,7 @@
|
|||
#include "radv_entrypoints.h"
|
||||
#include "radv_image_view.h"
|
||||
#include "radv_physical_device.h"
|
||||
#include "radv_query.h"
|
||||
#include "radv_video.h"
|
||||
|
||||
#include "ac_vcn_enc.h"
|
||||
|
|
@ -1246,7 +1247,7 @@ radv_enc_bitstream(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buffe
|
|||
}
|
||||
|
||||
static void
|
||||
radv_enc_feedback(struct radv_cmd_buffer *cmd_buffer)
|
||||
radv_enc_feedback(struct radv_cmd_buffer *cmd_buffer, uint64_t feedback_query_va)
|
||||
{
|
||||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||
const struct radv_physical_device *pdev = radv_device_physical(device);
|
||||
|
|
@ -1255,8 +1256,8 @@ radv_enc_feedback(struct radv_cmd_buffer *cmd_buffer)
|
|||
|
||||
radeon_emit(cs, pdev->vcn_enc_cmds.feedback);
|
||||
radeon_emit(cs, RENCODE_FEEDBACK_BUFFER_MODE_LINEAR);
|
||||
radeon_emit(cs, cmd_buffer->video.feedback_query_va >> 32);
|
||||
radeon_emit(cs, cmd_buffer->video.feedback_query_va & 0xffffffff);
|
||||
radeon_emit(cs, feedback_query_va >> 32);
|
||||
radeon_emit(cs, feedback_query_va & 0xffffffff);
|
||||
radeon_emit(cs, 16); // buffer_size
|
||||
radeon_emit(cs, 40); // data_size
|
||||
ENC_END;
|
||||
|
|
@ -1664,7 +1665,7 @@ radv_vcn_encode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf
|
|||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||
const struct radv_physical_device *pdev = radv_device_physical(device);
|
||||
struct radv_enc_state *enc = &cmd_buffer->video.enc;
|
||||
|
||||
uint64_t feedback_query_va;
|
||||
switch (vid->vk.op) {
|
||||
case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
|
||||
case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
|
||||
|
|
@ -1674,6 +1675,20 @@ radv_vcn_encode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf
|
|||
return;
|
||||
}
|
||||
|
||||
const struct VkVideoInlineQueryInfoKHR *inline_queries = NULL;
|
||||
if (vid->vk.flags & VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR) {
|
||||
inline_queries = vk_find_struct_const(enc_info->pNext, VIDEO_INLINE_QUERY_INFO_KHR);
|
||||
|
||||
if (inline_queries) {
|
||||
VK_FROM_HANDLE(radv_query_pool, pool, inline_queries->queryPool);
|
||||
feedback_query_va = radv_buffer_get_va(pool->bo);
|
||||
feedback_query_va += pool->stride * inline_queries->firstQuery;
|
||||
}
|
||||
}
|
||||
|
||||
if (!inline_queries)
|
||||
feedback_query_va = cmd_buffer->video.feedback_query_va;
|
||||
|
||||
if (vid->enc_need_begin) {
|
||||
begin(cmd_buffer, enc_info);
|
||||
vid->enc_need_begin = false;
|
||||
|
|
@ -1711,7 +1726,7 @@ radv_vcn_encode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf
|
|||
radv_enc_bitstream(cmd_buffer, dst_buffer, enc_info->dstBufferOffset);
|
||||
|
||||
// feedback
|
||||
radv_enc_feedback(cmd_buffer);
|
||||
radv_enc_feedback(cmd_buffer, feedback_query_va);
|
||||
|
||||
// v2 encode statistics
|
||||
if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_2) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue