anv: inline query for vulkan video encode

Follow up of the work performed in decode to
support inline query.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Hyunjun Ko <zzoon@igalia.com>
Signed-off-by: Stéphane Cerveau <scerveau@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31765>
This commit is contained in:
Stéphane Cerveau
2024-10-21 16:15:30 +02:00
committed by Marge Bot
parent be81c8b8db
commit aaa5770d4b
+54
View File
@@ -25,6 +25,7 @@
#include "genxml/gen_macros.h"
#include "genxml/genX_pack.h"
#include "genX_mi_builder.h"
static int
anv_get_max_vmv_range(StdVideoH264LevelIdc level)
@@ -2386,12 +2387,62 @@ anv_h265_encode_video(struct anv_cmd_buffer *cmd, const VkVideoEncodeInfoKHR *en
}
static void
emit_query_mi_availability(struct mi_builder *b,
struct anv_address addr,
bool available)
{
mi_store(b, mi_mem64(addr), mi_imm(available));
}
#if GFX_VER < 11
#define MFC_BITSTREAM_BYTECOUNT_FRAME_REG 0x128A0
#define HCP_BITSTREAM_BYTECOUNT_FRAME_REG 0x1E9A0
#elif GFX_VER >= 11
#define MFC_BITSTREAM_BYTECOUNT_FRAME_REG 0x1C08A0
#define HCP_BITSTREAM_BYTECOUNT_FRAME_REG 0x1C28A0
#endif
static void
handle_inline_query_end(struct anv_cmd_buffer *cmd_buffer,
const VkVideoInlineQueryInfoKHR *inline_query)
{
uint32_t reg_addr;
struct mi_builder b;
ANV_FROM_HANDLE(anv_query_pool, pool, inline_query->queryPool);
if (pool == VK_NULL_HANDLE)
return;
struct anv_address query_addr = {
.bo = pool->bo,
.offset = inline_query->firstQuery * pool->stride,
};
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);
const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &query_addr);
mi_builder_set_mocs(&b, mocs);
if (pool->codec & VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR) {
reg_addr = MFC_BITSTREAM_BYTECOUNT_FRAME_REG;
} else if (pool->codec & VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR) {
reg_addr = HCP_BITSTREAM_BYTECOUNT_FRAME_REG;
} else {
unreachable("Invalid codec operation");
}
mi_store(&b, mi_mem64(anv_address_add(query_addr, 8)), mi_reg32(reg_addr));
emit_query_mi_availability(&b, query_addr, true);
}
void
genX(CmdEncodeVideoKHR)(VkCommandBuffer commandBuffer,
const VkVideoEncodeInfoKHR *pEncodeInfo)
{
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
const VkVideoInlineQueryInfoKHR *inline_query =
vk_find_struct_const(pEncodeInfo->pNext, VIDEO_INLINE_QUERY_INFO_KHR);
switch (cmd_buffer->video.vid->vk.op) {
case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
anv_h264_encode_video(cmd_buffer, pEncodeInfo);
@@ -2402,4 +2453,7 @@ genX(CmdEncodeVideoKHR)(VkCommandBuffer commandBuffer,
default:
assert(0);
}
if (inline_query)
handle_inline_query_end(cmd_buffer, inline_query);
}