aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorDaniel Rakos <daniel.rakos@rastergrid.com>2025-08-18 13:14:36 +0200
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2025-08-25 16:27:02 -0500
commit4844cfd17d51e9e1a578dbc4b23bc9433382b880 (patch)
tree2f20b433cc5ccfca6d0ea7972ef0ca28ca89ec47 /scripts
parent0eb12b4ea70b15be6a10f6212c1633e5c9ce0cca (diff)
downloadusermoji-4844cfd17d51e9e1a578dbc4b23bc9433382b880.tar.xz
mock_icd: Remove legacy video support
Diffstat (limited to 'scripts')
-rw-r--r--scripts/mock_icd_generator.py856
1 files changed, 2 insertions, 854 deletions
diff --git a/scripts/mock_icd_generator.py b/scripts/mock_icd_generator.py
index 641a5b9d..f64f4af0 100644
--- a/scripts/mock_icd_generator.py
+++ b/scripts/mock_icd_generator.py
@@ -1117,862 +1117,10 @@ CUSTOM_C_INTERCEPTS = {
return VK_SUCCESS;
''',
'vkGetPhysicalDeviceVideoCapabilitiesKHR': '''
- // We include some reasonable set of capability combinations to cover a wide range of use cases
- auto caps = pCapabilities;
- auto caps_decode = lvl_find_mod_in_chain<VkVideoDecodeCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_decode_h264 = lvl_find_mod_in_chain<VkVideoDecodeH264CapabilitiesKHR>(pCapabilities->pNext);
- auto caps_decode_h265 = lvl_find_mod_in_chain<VkVideoDecodeH265CapabilitiesKHR>(pCapabilities->pNext);
- auto caps_decode_av1 = lvl_find_mod_in_chain<VkVideoDecodeAV1CapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode = lvl_find_mod_in_chain<VkVideoEncodeCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_quantization_map =
- lvl_find_mod_in_chain<VkVideoEncodeQuantizationMapCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_h264_quantization_map =
- lvl_find_mod_in_chain<VkVideoEncodeH264QuantizationMapCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_h265_quantization_map =
- lvl_find_mod_in_chain<VkVideoEncodeH265QuantizationMapCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_av1_quantization_map =
- lvl_find_mod_in_chain<VkVideoEncodeAV1QuantizationMapCapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_h264 = lvl_find_mod_in_chain<VkVideoEncodeH264CapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_h265 = lvl_find_mod_in_chain<VkVideoEncodeH265CapabilitiesKHR>(pCapabilities->pNext);
- auto caps_encode_av1 = lvl_find_mod_in_chain<VkVideoEncodeAV1CapabilitiesKHR>(pCapabilities->pNext);
-
- switch (pVideoProfile->videoCodecOperation) {
- case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoDecodeH264ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_BASELINE &&
- profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_MAIN) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 256;
- caps->minBitstreamBufferSizeAlignment = 256;
- caps->pictureAccessGranularity = {16,16};
- caps->minCodedExtent = {16,16};
- caps->maxCodedExtent = {1920,1080};
- caps->maxDpbSlots = 33;
- caps->maxActiveReferencePictures = 32;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME,
- sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- if (profile->pictureLayout != VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
- caps_decode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_6_2;
- caps_decode_h264->fieldOffsetGranularity = {0,0};
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- if (profile->pictureLayout != VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR &&
- profile->pictureLayout != VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_0;
- caps_decode_h264->fieldOffsetGranularity = {0,16};
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- if (profile->pictureLayout != VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR &&
- profile->pictureLayout != VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR
- | VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_3_2;
- caps_decode_h264->fieldOffsetGranularity = {0,1};
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoDecodeH265ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 64;
- caps->minBitstreamBufferSizeAlignment = 64;
- caps->pictureAccessGranularity = {32,32};
- caps->minCodedExtent = {48,48};
- caps->maxCodedExtent = {3840,2160};
- caps->maxDpbSlots = 16;
- caps->maxActiveReferencePictures = 15;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME,
- sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
- caps_decode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_6_0;
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_5_2;
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR
- | VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_4_1;
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoDecodeAV1ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfile != STD_VIDEO_AV1_PROFILE_MAIN) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 256;
- caps->minBitstreamBufferSizeAlignment = 256;
- caps->pictureAccessGranularity = {16,16};
- caps->minCodedExtent = {16,16};
- caps->maxCodedExtent = {1920,1080};
- caps->maxDpbSlots = 8;
- caps->maxActiveReferencePictures = 7;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME,
- sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
- caps_decode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_6_2;
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- if (profile->filmGrainSupport) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_5_0;
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- caps_decode->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR
- | VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
- caps_decode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_3_2;
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoEncodeH264ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_BASELINE) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 4096;
- caps->minBitstreamBufferSizeAlignment = 4096;
- caps->pictureAccessGranularity = {16,16};
- caps->minCodedExtent = {160,128};
- caps->maxCodedExtent = {1920,1080};
- caps->maxDpbSlots = 10;
- caps->maxActiveReferencePictures = 4;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME,
- sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR
- | VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
- | VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 4;
- caps_encode->maxBitrate = 800000000;
- caps_encode->maxQualityLevels = 4;
- caps_encode->encodeInputPictureGranularity = {16,16};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR;
- caps_encode_h264->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR;
- caps_encode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_6_2;
- caps_encode_h264->maxSliceCount = 8;
- caps_encode_h264->maxPPictureL0ReferenceCount = 4;
- caps_encode_h264->maxBPictureL0ReferenceCount = 3;
- caps_encode_h264->maxL1ReferenceCount = 2;
- caps_encode_h264->maxTemporalLayerCount = 4;
- caps_encode_h264->expectDyadicTemporalLayerPattern = VK_FALSE;
- caps_encode_h264->minQp = 0;
- caps_encode_h264->maxQp = 51;
- caps_encode_h264->prefersGopRemainingFrames = VK_FALSE;
- caps_encode_h264->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 15) / 16,
- (caps->maxCodedExtent.height + 15) / 16};
- }
-
- if (caps_encode_h264_quantization_map) {
- caps_encode_h264_quantization_map->minQpDelta = -26;
- caps_encode_h264_quantization_map->maxQpDelta = +25;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR
- | VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 1;
- caps_encode->maxBitrate = 480000000;
- caps_encode->maxQualityLevels = 3;
- caps_encode->encodeInputPictureGranularity = {32,32};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_h264->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR;
- caps_encode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_6_1;
- caps_encode_h264->maxSliceCount = 4;
- caps_encode_h264->maxPPictureL0ReferenceCount = 4;
- caps_encode_h264->maxBPictureL0ReferenceCount = 0;
- caps_encode_h264->maxL1ReferenceCount = 0;
- caps_encode_h264->maxTemporalLayerCount = 4;
- caps_encode_h264->expectDyadicTemporalLayerPattern = VK_TRUE;
- caps_encode_h264->minQp = 0;
- caps_encode_h264->maxQp = 30;
- caps_encode_h264->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_h264->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 15) / 16,
- (caps->maxCodedExtent.height + 15) / 16};
- }
-
- if (caps_encode_h264_quantization_map) {
- caps_encode_h264_quantization_map->minQpDelta = 0;
- caps_encode_h264_quantization_map->maxQpDelta = 0;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- caps_encode->flags = 0;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 1;
- caps_encode->maxBitrate = 240000000;
- caps_encode->maxQualityLevels = 1;
- caps_encode->encodeInputPictureGranularity = {1,1};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_h264->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR
- | VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR;
- caps_encode_h264->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_1;
- caps_encode_h264->maxSliceCount = 1;
- caps_encode_h264->maxPPictureL0ReferenceCount = 0;
- caps_encode_h264->maxBPictureL0ReferenceCount = 2;
- caps_encode_h264->maxL1ReferenceCount = 2;
- caps_encode_h264->maxTemporalLayerCount = 1;
- caps_encode_h264->expectDyadicTemporalLayerPattern = VK_FALSE;
- caps_encode_h264->minQp = 5;
- caps_encode_h264->maxQp = 40;
- caps_encode_h264->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_h264->requiresGopRemainingFrames = VK_TRUE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {0, 0};
- }
-
- if (caps_encode_h264_quantization_map) {
- caps_encode_h264_quantization_map->minQpDelta = 0;
- caps_encode_h264_quantization_map->maxQpDelta = 0;
- }
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoEncodeH265ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 1;
- caps->minBitstreamBufferSizeAlignment = 1;
- caps->pictureAccessGranularity = {8,8};
- caps->minCodedExtent = {64,48};
- caps->maxCodedExtent = {4096,2560};
- caps->maxDpbSlots = 8;
- caps->maxActiveReferencePictures = 2;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME, sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 1;
- caps_encode->maxBitrate = 800000000;
- caps_encode->maxQualityLevels = 1;
- caps_encode->encodeInputPictureGranularity = {64,64};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_h265->flags = VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR;
- caps_encode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_6_2;
- caps_encode_h265->maxSliceSegmentCount = 8;
- caps_encode_h265->maxTiles = {1,1};
- caps_encode_h265->ctbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- caps_encode_h265->transformBlockSizes = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR
- | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR
- | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR;
- caps_encode_h265->maxPPictureL0ReferenceCount = 4;
- caps_encode_h265->maxBPictureL0ReferenceCount = 3;
- caps_encode_h265->maxL1ReferenceCount = 2;
- caps_encode_h265->maxSubLayerCount = 1;
- caps_encode_h265->expectDyadicTemporalSubLayerPattern = VK_FALSE;
- caps_encode_h265->minQp = 16;
- caps_encode_h265->maxQp = 32;
- caps_encode_h265->prefersGopRemainingFrames = VK_FALSE;
- caps_encode_h265->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 3) / 4,
- (caps->maxCodedExtent.height + 3) / 4};
- }
-
- if (caps_encode_h265_quantization_map) {
- caps_encode_h265_quantization_map->minQpDelta = -16;
- caps_encode_h265_quantization_map->maxQpDelta = +15;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
- caps_encode->maxRateControlLayers = 0;
- caps_encode->maxBitrate = 480000000;
- caps_encode->maxQualityLevels = 2;
- caps_encode->encodeInputPictureGranularity = {32,32};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_h265->flags = VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR;
- caps_encode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_6_1;
- caps_encode_h265->maxSliceSegmentCount = 4;
- caps_encode_h265->maxTiles = {2,2};
- caps_encode_h265->ctbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- caps_encode_h265->transformBlockSizes = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR
- | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR
- | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR;
- caps_encode_h265->maxPPictureL0ReferenceCount = 4;
- caps_encode_h265->maxBPictureL0ReferenceCount = 0;
- caps_encode_h265->maxL1ReferenceCount = 0;
- caps_encode_h265->maxSubLayerCount = 1;
- caps_encode_h265->expectDyadicTemporalSubLayerPattern = VK_FALSE;
- caps_encode_h265->minQp = 0;
- caps_encode_h265->maxQp = 51;
- caps_encode_h265->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_h265->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 31) / 32,
- (caps->maxCodedExtent.height + 31) / 32};
- }
-
- if (caps_encode_h265_quantization_map) {
- caps_encode_h265_quantization_map->minQpDelta = 0;
- caps_encode_h265_quantization_map->maxQpDelta = 0;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 2;
- caps_encode->maxBitrate = 240000000;
- caps_encode->maxQualityLevels = 3;
- caps_encode->encodeInputPictureGranularity = {16,16};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR;
- caps_encode_h265->flags = VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR
- | VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR;
- caps_encode_h265->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_5_1;
- caps_encode_h265->maxSliceSegmentCount = 1;
- caps_encode_h265->maxTiles = {2,2};
- caps_encode_h265->ctbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR;
- caps_encode_h265->transformBlockSizes = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR;
- caps_encode_h265->maxPPictureL0ReferenceCount = 0;
- caps_encode_h265->maxBPictureL0ReferenceCount = 2;
- caps_encode_h265->maxL1ReferenceCount = 2;
- caps_encode_h265->maxSubLayerCount = 4;
- caps_encode_h265->expectDyadicTemporalSubLayerPattern = VK_TRUE;
- caps_encode_h265->minQp = 16;
- caps_encode_h265->maxQp = 51;
- caps_encode_h265->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_h265->requiresGopRemainingFrames = VK_TRUE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {0, 0};
- }
-
- if (caps_encode_h265_quantization_map) {
- caps_encode_h265_quantization_map->minQpDelta = 0;
- caps_encode_h265_quantization_map->maxQpDelta = 0;
- }
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR: {
- auto profile = lvl_find_in_chain<VkVideoEncodeAV1ProfileInfoKHR>(pVideoProfile->pNext);
- if (profile->stdProfile != STD_VIDEO_AV1_PROFILE_MAIN) {
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
-
- caps->flags = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR;
- caps->minBitstreamBufferOffsetAlignment = 1;
- caps->minBitstreamBufferSizeAlignment = 1;
- caps->pictureAccessGranularity = {8,8};
- caps->minCodedExtent = {192,128};
- caps->maxCodedExtent = {4096,2560};
- caps->maxDpbSlots = 8;
- caps->maxActiveReferencePictures = 2;
- std::strncpy(caps->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME, sizeof(caps->stdHeaderVersion.extensionName));
- caps->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION;
-
- switch (pVideoProfile->chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR
- | VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 1;
- caps_encode->maxBitrate = 800000000;
- caps_encode->maxQualityLevels = 1;
- caps_encode->encodeInputPictureGranularity = {64,64};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_av1->flags = VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR;
- caps_encode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_6_2;
- caps_encode_av1->maxTiles = {1,1};
- caps_encode_av1->minTileSize = {64,64};
- caps_encode_av1->maxTileSize = {4096,2560};
- caps_encode_av1->superblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR;
- caps_encode_av1->maxSingleReferenceCount = 1;
- caps_encode_av1->singleReferenceNameMask = 0x7B;
- caps_encode_av1->maxUnidirectionalCompoundReferenceCount = 0;
- caps_encode_av1->maxUnidirectionalCompoundGroup1ReferenceCount = 0;
- caps_encode_av1->unidirectionalCompoundReferenceNameMask = 0x00;
- caps_encode_av1->maxBidirectionalCompoundReferenceCount = 0;
- caps_encode_av1->maxBidirectionalCompoundGroup1ReferenceCount = 0;
- caps_encode_av1->maxBidirectionalCompoundGroup2ReferenceCount = 0;
- caps_encode_av1->bidirectionalCompoundReferenceNameMask = 0x00;
- caps_encode_av1->maxTemporalLayerCount = 1;
- caps_encode_av1->maxSpatialLayerCount = 1;
- caps_encode_av1->maxOperatingPoints = 1;
- caps_encode_av1->minQIndex = 32;
- caps_encode_av1->maxQIndex = 128;
- caps_encode_av1->prefersGopRemainingFrames = VK_FALSE;
- caps_encode_av1->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 7) / 8,
- (caps->maxCodedExtent.height + 7) / 8};
- }
-
- if (caps_encode_av1_quantization_map) {
- caps_encode_av1_quantization_map->minQIndexDelta = -64;
- caps_encode_av1_quantization_map->maxQIndexDelta = +64;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
- caps_encode->maxRateControlLayers = 0;
- caps_encode->maxBitrate = 480000000;
- caps_encode->maxQualityLevels = 2;
- caps_encode->encodeInputPictureGranularity = {32,32};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
- caps_encode_av1->flags = VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR
- | VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR
- | VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR;
- caps_encode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_6_1;
- caps_encode_av1->maxTiles = {2,2};
- caps_encode_av1->minTileSize = {128,128};
- caps_encode_av1->maxTileSize = {4096,2048};
- caps_encode_av1->superblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR
- | VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR;
- caps_encode_av1->maxSingleReferenceCount = 0;
- caps_encode_av1->singleReferenceNameMask = 0x00;
- caps_encode_av1->maxUnidirectionalCompoundReferenceCount = 2;
- caps_encode_av1->maxUnidirectionalCompoundGroup1ReferenceCount = 2;
- caps_encode_av1->unidirectionalCompoundReferenceNameMask = 0x5F;
- caps_encode_av1->maxBidirectionalCompoundReferenceCount = 2;
- caps_encode_av1->maxBidirectionalCompoundGroup1ReferenceCount = 2;
- caps_encode_av1->maxBidirectionalCompoundGroup2ReferenceCount = 2;
- caps_encode_av1->bidirectionalCompoundReferenceNameMask = 0x5F;
- caps_encode_av1->maxTemporalLayerCount = 4;
- caps_encode_av1->maxSpatialLayerCount = 1;
- caps_encode_av1->maxOperatingPoints = 4;
- caps_encode_av1->minQIndex = 0;
- caps_encode_av1->maxQIndex = 255;
- caps_encode_av1->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_av1->requiresGopRemainingFrames = VK_FALSE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 63) / 64,
- (caps->maxCodedExtent.height + 63) / 64};
- }
-
- if (caps_encode_av1_quantization_map) {
- caps_encode_av1_quantization_map->minQIndexDelta = -255;
- caps_encode_av1_quantization_map->maxQIndexDelta = +255;
- }
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- caps_encode->flags = VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR
- | VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR;
- caps_encode->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR
- | VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
- caps_encode->maxRateControlLayers = 2;
- caps_encode->maxBitrate = 240000000;
- caps_encode->maxQualityLevels = 3;
- caps_encode->encodeInputPictureGranularity = {16,16};
- caps_encode->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR
- | VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR;
- caps_encode_av1->flags = VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR
- | VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR
- | VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR;
- caps_encode_av1->maxLevel = STD_VIDEO_AV1_LEVEL_5_1;
- caps_encode_av1->maxTiles = {4,4};
- caps_encode_av1->minTileSize = {128,128};
- caps_encode_av1->maxTileSize = {2048,2048};
- caps_encode_av1->superblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR;
- caps_encode_av1->maxSingleReferenceCount = 1;
- caps_encode_av1->singleReferenceNameMask = 0x5F;
- caps_encode_av1->maxUnidirectionalCompoundReferenceCount = 4;
- caps_encode_av1->maxUnidirectionalCompoundGroup1ReferenceCount = 4;
- caps_encode_av1->unidirectionalCompoundReferenceNameMask = 0x5B;
- caps_encode_av1->maxBidirectionalCompoundReferenceCount = 0;
- caps_encode_av1->maxBidirectionalCompoundGroup1ReferenceCount = 0;
- caps_encode_av1->maxBidirectionalCompoundGroup2ReferenceCount = 0;
- caps_encode_av1->bidirectionalCompoundReferenceNameMask = 0x00;
- caps_encode_av1->maxTemporalLayerCount = 4;
- caps_encode_av1->maxSpatialLayerCount = 2;
- caps_encode_av1->maxOperatingPoints = 2;
- caps_encode_av1->minQIndex = 16;
- caps_encode_av1->maxQIndex = 96;
- caps_encode_av1->prefersGopRemainingFrames = VK_TRUE;
- caps_encode_av1->requiresGopRemainingFrames = VK_TRUE;
-
- if (caps_encode_quantization_map) {
- caps_encode_quantization_map->maxQuantizationMapExtent = {(caps->maxCodedExtent.width + 127) / 128,
- (caps->maxCodedExtent.height + 127) / 128};
- }
-
- if (caps_encode_av1_quantization_map) {
- caps_encode_av1_quantization_map->minQIndexDelta = -64;
- caps_encode_av1_quantization_map->maxQIndexDelta = +63;
- }
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- }
- default:
- break;
- }
- return VK_SUCCESS;
+ return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
''',
'vkGetPhysicalDeviceVideoFormatPropertiesKHR': '''
- // We include some reasonable set of format combinations to cover a wide range of use cases
- auto profile_list = lvl_find_in_chain<VkVideoProfileListInfoKHR>(pVideoFormatInfo->pNext);
- if (profile_list->profileCount != 1) {
- return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
- }
-
- struct VideoFormatProperties {
- VkVideoFormatPropertiesKHR props;
- VkVideoFormatQuantizationMapPropertiesKHR props_quantization_map;
- VkVideoFormatH265QuantizationMapPropertiesKHR props_h265_quantization_map;
- VkVideoFormatAV1QuantizationMapPropertiesKHR props_av1_quantization_map;
- };
-
- std::vector<VideoFormatProperties> format_props{};
-
- VideoFormatProperties fmt = {};
- fmt.props.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
- fmt.props.imageCreateFlags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_ALIAS_BIT |
- VK_IMAGE_CREATE_EXTENDED_USAGE_BIT | VK_IMAGE_CREATE_PROTECTED_BIT | VK_IMAGE_CREATE_DISJOINT_BIT;
- fmt.props.imageType = VK_IMAGE_TYPE_2D;
- fmt.props.imageTiling = VK_IMAGE_TILING_OPTIMAL;
- fmt.props_quantization_map.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR;
- fmt.props_h265_quantization_map.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR;
- fmt.props_av1_quantization_map.sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR;
-
- // Populate DPB and input/output formats
- switch (profile_list->pProfiles[0].videoCodecOperation) {
- case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
- case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
- case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
- switch (profile_list->pProfiles[0].chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
- fmt.props.imageUsageFlags =
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR |
- VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM;
- fmt.props.imageUsageFlags =
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR |
- VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
- case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR:
- switch (profile_list->pProfiles[0].chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
- fmt.props.imageUsageFlags =
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- fmt.props.format = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM;
- fmt.props.imageUsageFlags =
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
- format_props.push_back(fmt);
- break;
- default:
- return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
- }
- break;
-
- default:
- break;
- }
-
- // Populate quantization map formats
- fmt.props.imageCreateFlags = VK_IMAGE_CREATE_PROTECTED_BIT;
- fmt.props.imageTiling = VK_IMAGE_TILING_LINEAR;
- switch (profile_list->pProfiles[0].videoCodecOperation) {
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
- switch (profile_list->pProfiles[0].chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- fmt.props.format = VK_FORMAT_R32_SINT;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {16, 16};
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_R8_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- fmt.props.format = VK_FORMAT_R8_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {16, 16};
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- break;
- default:
- break;
- }
- break;
- case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
- switch (profile_list->pProfiles[0].chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- fmt.props.format = VK_FORMAT_R8_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {4, 4};
- fmt.props_h265_quantization_map.compatibleCtbSizes =
- VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR | VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props_quantization_map.quantizationMapTexelSize = {8, 8};
- format_props.push_back(fmt);
- fmt.props_quantization_map.quantizationMapTexelSize = {32, 32};
- format_props.push_back(fmt);
- fmt.props_quantization_map.quantizationMapTexelSize = {64, 64};
- fmt.props_h265_quantization_map.compatibleCtbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- fmt.props.format = VK_FORMAT_R32_SINT;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {32, 32};
- fmt.props_h265_quantization_map.compatibleCtbSizes =
- VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR | VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props_quantization_map.quantizationMapTexelSize = {64, 64};
- fmt.props_h265_quantization_map.compatibleCtbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- break;
- default:
- break;
- }
- break;
- case VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR:
- switch (profile_list->pProfiles[0].chromaSubsampling) {
- case VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR:
- fmt.props.format = VK_FORMAT_R32_SINT;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {8, 8};
- fmt.props_av1_quantization_map.compatibleSuperblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props.format = VK_FORMAT_R8_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {64, 64};
- fmt.props_av1_quantization_map.compatibleSuperblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR:
- fmt.props.format = VK_FORMAT_R32_SINT;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {64, 64};
- fmt.props_av1_quantization_map.compatibleSuperblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR;
- format_props.push_back(fmt);
- fmt.props_quantization_map.quantizationMapTexelSize = {128, 128};
- fmt.props_av1_quantization_map.compatibleSuperblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR;
- format_props.push_back(fmt);
- break;
- case VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR:
- fmt.props.format = VK_FORMAT_R8_UNORM;
- fmt.props.imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR;
- fmt.props_quantization_map.quantizationMapTexelSize = {128, 128};
- fmt.props_av1_quantization_map.compatibleSuperblockSizes = VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR;
- format_props.push_back(fmt);
- break;
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- std::vector<VideoFormatProperties> filtered;
- for (const auto& format : format_props) {
- if ((pVideoFormatInfo->imageUsage & format.props.imageUsageFlags) == pVideoFormatInfo->imageUsage) {
- filtered.push_back(format);
- }
- }
-
- if (pVideoFormatProperties != nullptr) {
- for (uint32_t i = 0; i < (std::min)(*pVideoFormatPropertyCount, (uint32_t)filtered.size()); ++i) {
- void* saved_pNext = pVideoFormatProperties[i].pNext;
- pVideoFormatProperties[i] = filtered[i].props;
- pVideoFormatProperties[i].pNext = saved_pNext;
-
- auto* props_quantization_map = lvl_find_mod_in_chain<VkVideoFormatQuantizationMapPropertiesKHR>(saved_pNext);
- auto* props_h265_quantization_map = lvl_find_mod_in_chain<VkVideoFormatH265QuantizationMapPropertiesKHR>(saved_pNext);
- auto* props_av1_quantization_map = lvl_find_mod_in_chain<VkVideoFormatAV1QuantizationMapPropertiesKHR>(saved_pNext);
-
- if (props_quantization_map != nullptr) {
- saved_pNext = props_quantization_map->pNext;
- *props_quantization_map = filtered[i].props_quantization_map;
- props_quantization_map->pNext = saved_pNext;
- }
-
- if (props_h265_quantization_map != nullptr) {
- saved_pNext = props_h265_quantization_map->pNext;
- *props_h265_quantization_map = filtered[i].props_h265_quantization_map;
- props_h265_quantization_map->pNext = saved_pNext;
- }
-
- if (props_av1_quantization_map != nullptr) {
- saved_pNext = props_av1_quantization_map->pNext;
- *props_av1_quantization_map = filtered[i].props_av1_quantization_map;
- props_av1_quantization_map->pNext = saved_pNext;
- }
- }
- }
- *pVideoFormatPropertyCount = (uint32_t)filtered.size();
- return VK_SUCCESS;
+ return VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR;
''',
'vkGetDescriptorSetLayoutSupport':'''
if (pSupport) {