From 581bf2e3b0ca81e0af613dce0fc7ffb210a24e2c Mon Sep 17 00:00:00 2001 From: David Rosca Date: Thu, 21 May 2026 16:07:44 +0200 Subject: [PATCH] ac/cmdbuf: Add ac_emit_video_write_timestamp Reviewed-by: Samuel Pitoiset Reviewed-by: Benjamin Cheng Part-of: --- src/amd/common/ac_cmdbuf_video.c | 11 +++++++++++ src/amd/common/ac_cmdbuf_video.h | 3 +++ src/amd/common/ac_vcn.h | 6 ++++++ src/amd/common/ac_video.c | 1 + src/amd/common/ac_video.h | 1 + 5 files changed, 22 insertions(+) diff --git a/src/amd/common/ac_cmdbuf_video.c b/src/amd/common/ac_cmdbuf_video.c index 2ea3cc23435..b2bec4ac60a 100644 --- a/src/amd/common/ac_cmdbuf_video.c +++ b/src/amd/common/ac_cmdbuf_video.c @@ -55,3 +55,14 @@ ac_emit_video_write_memory(struct ac_cmdbuf *cs, const struct radeon_info *info, write_memory->data = value; } } + +void +ac_emit_video_write_timestamp(struct ac_cmdbuf *cs, enum amd_ip_type ip_type, uint64_t va) +{ + if (ip_type == AMD_IP_VCN_ENC) { + struct rvcn_cmn_engine_op_timestamp *timestamp = + vcn_common_cmd(cs, RADEON_VCN_IB_COMMON_OP_TIMESTAMP, sizeof(struct rvcn_cmn_engine_op_timestamp)); + timestamp->timestamp_addr_lo = va & 0xffffffff; + timestamp->timestamp_addr_hi = va >> 32; + } +} diff --git a/src/amd/common/ac_cmdbuf_video.h b/src/amd/common/ac_cmdbuf_video.h index 43c5b28f013..3829d32e9d5 100644 --- a/src/amd/common/ac_cmdbuf_video.h +++ b/src/amd/common/ac_cmdbuf_video.h @@ -22,6 +22,9 @@ void ac_emit_video_write_memory(struct ac_cmdbuf *cs, const struct radeon_info *info, enum amd_ip_type ip_type, uint64_t va, uint64_t value); +void +ac_emit_video_write_timestamp(struct ac_cmdbuf *cs, enum amd_ip_type ip_type, uint64_t va); + #ifdef __cplusplus } #endif diff --git a/src/amd/common/ac_vcn.h b/src/amd/common/ac_vcn.h index a5ba4d812a1..036405bc557 100644 --- a/src/amd/common/ac_vcn.h +++ b/src/amd/common/ac_vcn.h @@ -36,6 +36,7 @@ #define RADEON_VCN_SIGNATURE_SIZE (0x00000010) #define RADEON_VCN_IB_COMMON_OP_WRITEMEMORY (0x33000001) +#define RADEON_VCN_IB_COMMON_OP_TIMESTAMP (0x31000001) #define RADEON_VCN_IB_COMMON_OP_RESOLVEINPUTPARAMLAYOUT (0x31000007) #define RADEON_VCN_RESOLVE_INPUT_PARAM_LAYOUT_TYPE_QPMAP_INT8 1 @@ -52,6 +53,11 @@ struct rvcn_cmn_engine_ib_package { unsigned int package_type; }; +struct rvcn_cmn_engine_op_timestamp { + unsigned int timestamp_addr_lo; /* Low address of Timestamp */ + unsigned int timestamp_addr_hi; /* High address of Timestamp */ +}; + struct rvcn_cmn_engine_op_writememory { unsigned int dest_addr_lo; // Low address of memory unsigned int dest_addr_hi; // High address of memory diff --git a/src/amd/common/ac_video.c b/src/amd/common/ac_video.c index 01f7c21a304..51df3c9b4e1 100644 --- a/src/amd/common/ac_video.c +++ b/src/amd/common/ac_video.c @@ -615,6 +615,7 @@ ac_fill_video_info(struct radeon_info *info, struct ac_drm_device *dev) cap->dec = info->vcn_ip_version >= VCN_4_0_0 ? 1 : 0; cap->enc = vcn_dec_only(info) ? 0 : 1; cap->write_memory = write_memory_supported(info); + cap->timestamp = info->vcn_ip_version >= VCN_2_0_0; if (cap->dec) vcn_dec_caps(info); if (cap->enc) diff --git a/src/amd/common/ac_video.h b/src/amd/common/ac_video.h index 4caf960e226..9475baac916 100644 --- a/src/amd/common/ac_video.h +++ b/src/amd/common/ac_video.h @@ -219,6 +219,7 @@ struct ac_video_queue_caps { uint32_t supported; }; enum ac_video_write_memory_support write_memory; + bool timestamp; }; struct ac_video_caps {