diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index d4654e902f2..46abd985b9e 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -1458,6 +1458,7 @@ radv_BindVideoSessionMemoryKHR(VkDevice _device, VkVideoSessionKHR videoSession, const VkBindVideoSessionMemoryInfoKHR *pBindSessionMemoryInfos) { VK_FROM_HANDLE(radv_video_session, vid, videoSession); + struct radv_device *device = radv_device_from_handle(_device); for (unsigned i = 0; i < videoSessionBindMemoryCount; i++) { switch (pBindSessionMemoryInfos[i].memoryBindIndex) { @@ -1466,6 +1467,22 @@ radv_BindVideoSessionMemoryKHR(VkDevice _device, VkVideoSessionKHR videoSession, break; case RADV_BIND_DECODER_CTX: copy_bind(&vid->ctx, &pBindSessionMemoryInfos[i]); + + if (vid->encode) { + radv_video_enc_init_ctx(device, vid); + } else { + if (vid->stream_type == RDECODE_CODEC_VP9) { + uint8_t *ctxptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); + ctxptr += vid->ctx.offset; + ac_vcn_vp9_fill_probs_table(ctxptr); + device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); + } else if (vid->stream_type == RDECODE_CODEC_AV1) { + uint8_t *ctxptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); + ctxptr += vid->ctx.offset; + ac_vcn_av1_init_probs(radv_device_physical(device)->av1_version, ctxptr); + device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); + } + } break; case RADV_BIND_INTRA_ONLY: { VkBindImageMemoryInfo bind_image = { @@ -3253,18 +3270,6 @@ radv_vcn_cmd_reset(struct radv_cmd_buffer *cmd_buffer) void *ptr; uint32_t out_offset; - if (vid->stream_type == RDECODE_CODEC_VP9) { - uint8_t *ctxptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); - ctxptr += vid->ctx.offset; - ac_vcn_vp9_fill_probs_table(ctxptr); - device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); - } - if (vid->stream_type == RDECODE_CODEC_AV1) { - uint8_t *ctxptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); - ctxptr += vid->ctx.offset; - ac_vcn_av1_init_probs(pdev->av1_version, ctxptr); - device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); - } radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr); if (pdev->vid_decode_ip == AMD_IP_VCN_UNIFIED) diff --git a/src/amd/vulkan/radv_video.h b/src/amd/vulkan/radv_video.h index 85c2665cd1a..1bd0f036c49 100644 --- a/src/amd/vulkan/radv_video.h +++ b/src/amd/vulkan/radv_video.h @@ -90,6 +90,7 @@ void radv_vcn_write_memory(struct radv_cmd_buffer *cmd_buffer, uint64_t va, unsi void radv_init_physical_device_encoder(struct radv_physical_device *pdevice); void radv_probe_video_decode(struct radv_physical_device *pdev); void radv_probe_video_encode(struct radv_physical_device *pdev); +void radv_video_enc_init_ctx(struct radv_device *device, struct radv_video_session *vid); void radv_video_enc_control_video_coding(struct radv_cmd_buffer *cmd_buffer, const VkVideoCodingControlInfoKHR *pCodingControlInfo); void radv_video_enc_begin_video_coding(struct radv_cmd_buffer *cmd_buffer, const VkVideoBeginCodingInfoKHR *pBeginInfo); diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index d02bdd66636..93c1c303941 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -3025,6 +3025,17 @@ radv_vcn_encode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf } } +void +radv_video_enc_init_ctx(struct radv_device *device, struct radv_video_session *vid) +{ + if (vid->enc_standard == RENCODE_ENCODE_STANDARD_AV1) { + uint8_t *cdfptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); + cdfptr += vid->ctx.offset; + memcpy(cdfptr, rvcn_av1_cdf_default_table, VCN_ENC_AV1_DEFAULT_CDF_SIZE); + device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); + } +} + void radv_video_enc_control_video_coding(struct radv_cmd_buffer *cmd_buffer, const VkVideoCodingControlInfoKHR *control_info) { @@ -3032,22 +3043,6 @@ radv_video_enc_control_video_coding(struct radv_cmd_buffer *cmd_buffer, const Vk struct radv_physical_device *pdev = radv_device_physical(device); struct radv_video_session *vid = cmd_buffer->video.vid; - switch (vid->vk.op) { - case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: - case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: - break; - case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR: - if (control_info->flags & VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR) { - uint8_t *cdfptr = radv_buffer_map(device->ws, vid->ctx.mem->bo); - cdfptr += vid->ctx.offset; - memcpy(cdfptr, rvcn_av1_cdf_default_table, VCN_ENC_AV1_DEFAULT_CDF_SIZE); - device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false); - } - break; - default: - UNREACHABLE("Unsupported\n"); - } - bool session_init = false; bool rate_control_init = false; uint32_t vbv_buffer_level = 64;