d3d12: d3d12_video_encoder_negotiate_current_h264_slices_configuration to use correct mode when intra-refresh is on

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27367>
This commit is contained in:
Sil Vilerino
2024-01-30 12:52:41 -05:00
committed by Marge Bot
parent 45a6e1dc89
commit 01a99f5d4d

View File

@@ -425,7 +425,28 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
pD3D12Enc->m_currentEncodeConfig.m_currentResolution.Width / D3D12_VIDEO_H264_MB_IN_PIXELS;
bool bSliceAligned = ((picture->slices_descriptors[0].num_macroblocks % mbPerScanline) == 0);
if (bUniformSizeSlices && bSliceAligned &&
if (bUniformSizeSlices) {
if (picture->intra_refresh.mode != INTRA_REFRESH_MODE_NONE) {
/*
* When intra-refresh is active, we must use D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME
*/
if (d3d12_video_encoder_check_subregion_mode_support(
pD3D12Enc,
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME)) {
requestedSlicesMode =
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME;
requestedSlicesConfig.NumberOfSlicesPerFrame = picture->num_slice_descriptors;
debug_printf("[d3d12_video_encoder_h264] Intra-refresh is active and per DX12 spec it requires using multi slice encoding mode: "
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME "
"with %d slices per frame.\n",
requestedSlicesConfig.NumberOfSlicesPerFrame);
} else {
debug_printf("[d3d12_video_encoder_h264] Intra-refresh is active which requires "
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME "
"mode but there is HW support for such mode.\n");
return false;
}
} else if (bSliceAligned &&
d3d12_video_encoder_check_subregion_mode_support(
pD3D12Enc,
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_ROWS_PER_SUBREGION)) {
@@ -438,8 +459,7 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_ROWS_PER_SUBREGION with "
"%d macroblocks rows per slice.\n",
requestedSlicesConfig.NumberOfRowsPerSlice);
} else if (bUniformSizeSlices &&
d3d12_video_encoder_check_subregion_mode_support(
} else if (d3d12_video_encoder_check_subregion_mode_support(
pD3D12Enc,
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME)) {
requestedSlicesMode =
@@ -449,8 +469,7 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME "
"with %d slices per frame.\n",
requestedSlicesConfig.NumberOfSlicesPerFrame);
} else if (bUniformSizeSlices &&
d3d12_video_encoder_check_subregion_mode_support(
} else if (d3d12_video_encoder_check_subregion_mode_support(
pD3D12Enc,
D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_SQUARE_UNITS_PER_SUBREGION_ROW_UNALIGNED)) {
requestedSlicesMode =
@@ -460,7 +479,13 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_SQUARE_UNITS_PER_SUBREGION_ROW_UNALIGNED "
"with %d NumberOfCodingUnitsPerSlice per frame.\n",
requestedSlicesConfig.NumberOfCodingUnitsPerSlice);
} else {
debug_printf("[d3d12_video_encoder_h264] Requested slice control mode is not supported by hardware: No HW support for "
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_ROWS_PER_SUBREGION or"
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_UNIFORM_PARTITIONING_SUBREGIONS_PER_FRAME or"
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_SQUARE_UNITS_PER_SUBREGION_ROW_UNALIGNED.\n");
return false;
}
} else {
debug_printf("[d3d12_video_encoder_h264] Requested slice control mode is not supported: All slices must "
"have the same number of macroblocks.\n");
@@ -479,8 +504,8 @@ d3d12_video_encoder_negotiate_current_h264_slices_configuration(struct d3d12_vid
"with %d MaxBytesPerSlice per frame.\n",
requestedSlicesConfig.MaxBytesPerSlice);
} else {
debug_printf("[d3d12_video_encoder_h264] Requested slice control mode is not supported: All slices must "
"have the same number of macroblocks.\n");
debug_printf("[d3d12_video_encoder_h264] Requested slice control mode is not supported: No HW support for "
"D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_BYTES_PER_SUBREGION.\n");
return false;
}
} else {