From cf8cbf0647afc6fad4d964a9e0b24be0f4a2eef0 Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Sat, 28 Oct 2023 11:42:56 -0400 Subject: [PATCH] d3d12: Disable codecs according to meson video-codecs option Reviewed-by: Jesse Natalie Part-of: --- src/gallium/drivers/d3d12/d3d12_video_dec.cpp | 116 ++++++++++---- src/gallium/drivers/d3d12/d3d12_video_enc.cpp | 148 ++++++++++++++++-- .../drivers/d3d12/d3d12_video_enc_h264.cpp | 31 ---- .../drivers/d3d12/d3d12_video_screen.cpp | 37 ++++- src/gallium/drivers/d3d12/meson.build | 64 ++++++-- 5 files changed, 304 insertions(+), 92 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp index 499eb982933..f6becbc5dc2 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_dec.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_dec.cpp @@ -27,10 +27,18 @@ #include "d3d12_screen.h" #include "d3d12_surface.h" #include "d3d12_video_dec.h" +#if VIDEO_CODEC_H264DEC #include "d3d12_video_dec_h264.h" +#endif +#if VIDEO_CODEC_H265DEC #include "d3d12_video_dec_hevc.h" +#endif +#if VIDEO_CODEC_AV1DEC #include "d3d12_video_dec_av1.h" +#endif +#if VIDEO_CODEC_VP9DEC #include "d3d12_video_dec_vp9.h" +#endif #include "d3d12_video_buffer.h" #include "d3d12_residency.h" @@ -348,30 +356,34 @@ d3d12_video_decoder_store_upper_layer_references(struct d3d12_video_decoder *pD3 { pD3D12Dec->m_pCurrentDecodeTarget = target; switch (pD3D12Dec->m_d3d12DecProfileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { pipe_h264_picture_desc *pPicControlH264 = (pipe_h264_picture_desc *) picture; pD3D12Dec->m_pCurrentReferenceTargets = pPicControlH264->ref; } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { pipe_h265_picture_desc *pPicControlHevc = (pipe_h265_picture_desc *) picture; pD3D12Dec->m_pCurrentReferenceTargets = pPicControlHevc->ref; } break; - +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { pipe_av1_picture_desc *pPicControlAV1 = (pipe_av1_picture_desc *) picture; pD3D12Dec->m_pCurrentReferenceTargets = pPicControlAV1->ref; } break; - +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { pipe_vp9_picture_desc *pPicControlVP9 = (pipe_vp9_picture_desc *) picture; pD3D12Dec->m_pCurrentReferenceTargets = pPicControlVP9->ref; } break; - +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1061,38 +1073,41 @@ d3d12_video_decoder_prepare_for_decode_frame(struct d3d12_video_decoder *pD3D12D // If decoded needs reference_only entries in the dpb, use the reference_only allocation for current frame // otherwise, use the standard output resource - ID3D12Resource *pCurrentFrameDPBEntry = fReferenceOnly ? *ppRefOnlyOutTexture2D : *ppOutTexture2D; - uint32_t currentFrameDPBEntrySubresource = fReferenceOnly ? *pRefOnlyOutSubresourceIndex : *pOutSubresourceIndex; - + [[maybe_unused]] ID3D12Resource *pCurrentFrameDPBEntry = fReferenceOnly ? *ppRefOnlyOutTexture2D : *ppOutTexture2D; + [[maybe_unused]] uint32_t currentFrameDPBEntrySubresource = fReferenceOnly ? *pRefOnlyOutSubresourceIndex : *pOutSubresourceIndex; switch (pD3D12Dec->m_d3d12DecProfileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { d3d12_video_decoder_prepare_current_frame_references_h264(pD3D12Dec, pCurrentFrameDPBEntry, currentFrameDPBEntrySubresource); } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { d3d12_video_decoder_prepare_current_frame_references_hevc(pD3D12Dec, pCurrentFrameDPBEntry, currentFrameDPBEntrySubresource); } break; - +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { d3d12_video_decoder_prepare_current_frame_references_av1(pD3D12Dec, pCurrentFrameDPBEntry, currentFrameDPBEntrySubresource); } break; - +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { d3d12_video_decoder_prepare_current_frame_references_vp9(pD3D12Dec, pCurrentFrameDPBEntry, currentFrameDPBEntrySubresource); } break; - +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1201,26 +1216,30 @@ void d3d12_video_decoder_refresh_dpb_active_references(struct d3d12_video_decoder *pD3D12Dec) { switch (pD3D12Dec->m_d3d12DecProfileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { d3d12_video_decoder_refresh_dpb_active_references_h264(pD3D12Dec); } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { d3d12_video_decoder_refresh_dpb_active_references_hevc(pD3D12Dec); } break; - +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { d3d12_video_decoder_refresh_dpb_active_references_av1(pD3D12Dec); } break; - +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { d3d12_video_decoder_refresh_dpb_active_references_vp9(pD3D12Dec); } break; - +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1238,26 +1257,30 @@ d3d12_video_decoder_get_frame_info( isInterlaced = false; switch (pD3D12Dec->m_d3d12DecProfileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { d3d12_video_decoder_get_frame_info_h264(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced); } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { d3d12_video_decoder_get_frame_info_hevc(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced); } break; - +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { d3d12_video_decoder_get_frame_info_av1(pD3D12Dec, pWidth, pHeight, pMaxDPB, isInterlaced); } break; - +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { d3d12_video_decoder_get_frame_info_vp9(pD3D12Dec, pWidth, pHeight, pMaxDPB, &isInterlaced); } break; - +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1289,6 +1312,7 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input( auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)]; inFlightResources.qp_matrix_frame_argument_enabled = false; switch (profileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_H264); @@ -1311,7 +1335,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input( true; // We don't have a way of knowing from the pipe params so send always d3d12_video_decoder_store_dxva_qmatrix_in_qmatrix_buffer(codec, &dxvaQmatrixH264, dxvaQMatrixBufferSize); } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_HEVC); @@ -1331,6 +1356,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input( inFlightResources.qp_matrix_frame_argument_enabled); d3d12_video_decoder_store_dxva_qmatrix_in_qmatrix_buffer(codec, &dxvaQmatrixHEVC, dxvaQMatrixBufferSize); } break; +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_AV1); @@ -1343,6 +1370,8 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input( d3d12_video_decoder_store_dxva_picparams_in_picparams_buffer(codec, &dxvaPicParamsAV1, dxvaPicParamsBufferSize); inFlightResources.qp_matrix_frame_argument_enabled = false; } break; +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { size_t dxvaPicParamsBufferSize = sizeof(DXVA_PicParams_VP9); @@ -1353,6 +1382,7 @@ d3d12_video_decoder_store_converted_dxva_picparams_from_pipe_input( d3d12_video_decoder_store_dxva_picparams_in_picparams_buffer(codec, &dxvaPicParamsVP9, dxvaPicParamsBufferSize); inFlightResources.qp_matrix_frame_argument_enabled = false; } break; +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1365,36 +1395,42 @@ d3d12_video_decoder_prepare_dxva_slices_control( struct d3d12_video_decoder *pD3D12Dec, // input argument, current decoder struct pipe_picture_desc *picture) { - auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)]; + [[maybe_unused]] auto &inFlightResources = pD3D12Dec->m_inflightResourcesPool[d3d12_video_decoder_pool_current_index(pD3D12Dec)]; d3d12_video_decode_profile_type profileType = d3d12_video_decoder_convert_pipe_video_profile_to_profile_type(pD3D12Dec->base.profile); switch (profileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: { d3d12_video_decoder_prepare_dxva_slices_control_h264(pD3D12Dec, inFlightResources.m_SliceControlBuffer, (struct pipe_h264_picture_desc *) picture); } break; - +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { d3d12_video_decoder_prepare_dxva_slices_control_hevc(pD3D12Dec, inFlightResources.m_SliceControlBuffer, (struct pipe_h265_picture_desc *) picture); } break; +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: { d3d12_video_decoder_prepare_dxva_slices_control_av1(pD3D12Dec, inFlightResources.m_SliceControlBuffer, (struct pipe_av1_picture_desc *) picture); } break; +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { d3d12_video_decoder_prepare_dxva_slices_control_vp9(pD3D12Dec, inFlightResources.m_SliceControlBuffer, (struct pipe_vp9_picture_desc *) picture); } break; - +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); @@ -1436,12 +1472,30 @@ d3d12_video_decoder_supports_aot_dpb(D3D12_FEATURE_DATA_VIDEO_DECODE_SUPPORT dec { bool supportedProfile = false; switch (profileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: - case d3d12_video_decode_profile_type_hevc: - case d3d12_video_decode_profile_type_av1: - case d3d12_video_decode_profile_type_vp9: + { supportedProfile = true; - break; + } break; +#endif +#if VIDEO_CODEC_H265DEC + case d3d12_video_decode_profile_type_hevc: + { + supportedProfile = true; + } break; +#endif +#if VIDEO_CODEC_AV1DEC + case d3d12_video_decode_profile_type_av1: + { + supportedProfile = true; + } break; +#endif +#if VIDEO_CODEC_VP9DEC + case d3d12_video_decode_profile_type_vp9: + { + supportedProfile = true; + } break; +#endif default: supportedProfile = false; break; @@ -1506,8 +1560,11 @@ GUID d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType, DXGI_FORMAT decode_format) { switch (profileType) { +#if VIDEO_CODEC_H264DEC case d3d12_video_decode_profile_type_h264: return D3D12_VIDEO_DECODE_PROFILE_H264; +#endif +#if VIDEO_CODEC_H265DEC case d3d12_video_decode_profile_type_hevc: { switch (decode_format) { @@ -1521,9 +1578,13 @@ d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType, } break; } } break; +#endif +#if VIDEO_CODEC_AV1DEC case d3d12_video_decode_profile_type_av1: return D3D12_VIDEO_DECODE_PROFILE_AV1_PROFILE0; break; +#endif +#if VIDEO_CODEC_VP9DEC case d3d12_video_decode_profile_type_vp9: { switch (decode_format) { @@ -1537,6 +1598,7 @@ d3d12_video_decoder_resolve_profile(d3d12_video_decode_profile_type profileType, } break; } } break; +#endif default: { unreachable("Unsupported d3d12_video_decode_profile_type"); diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp index 3740d5cc6fb..821fbd88d27 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp @@ -30,11 +30,17 @@ #include "d3d12_screen.h" #include "d3d12_surface.h" #include "d3d12_video_enc.h" +#if VIDEO_CODEC_H264ENC #include "d3d12_video_enc_h264.h" +#endif +#if VIDEO_CODEC_H265ENC #include "d3d12_video_enc_hevc.h" +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) #include "d3d12_video_enc_av1.h" #endif +#endif #include "d3d12_video_buffer.h" #include "d3d12_video_texture_array_dpb_manager.h" #include "d3d12_video_array_of_textures_dpb_manager.h" @@ -53,6 +59,37 @@ #include +D3D12_VIDEO_ENCODER_CODEC +d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(enum pipe_video_profile profile) +{ + switch (u_reduce_video_profile(profile)) { + case PIPE_VIDEO_FORMAT_MPEG4_AVC: + { + return D3D12_VIDEO_ENCODER_CODEC_H264; + } break; + case PIPE_VIDEO_FORMAT_HEVC: + { + return D3D12_VIDEO_ENCODER_CODEC_HEVC; + } break; +#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) + case PIPE_VIDEO_FORMAT_AV1: + { + return D3D12_VIDEO_ENCODER_CODEC_AV1; + } break; +#endif + case PIPE_VIDEO_FORMAT_MPEG12: + case PIPE_VIDEO_FORMAT_MPEG4: + case PIPE_VIDEO_FORMAT_VC1: + case PIPE_VIDEO_FORMAT_JPEG: + case PIPE_VIDEO_FORMAT_VP9: + case PIPE_VIDEO_FORMAT_UNKNOWN: + default: + { + unreachable("Unsupported pipe_video_profile"); + } break; + } +} + uint64_t d3d12_video_encoder_pool_current_index(struct d3d12_video_encoder *pD3D12Enc) { @@ -262,20 +299,25 @@ d3d12_video_encoder_update_picparams_tracking(struct d3d12_video_encoder *pD3D12 enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); bool bUsedAsReference = false; switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { d3d12_video_encoder_update_current_frame_pic_params_info_h264(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference); } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { d3d12_video_encoder_update_current_frame_pic_params_info_hevc(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference); } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { d3d12_video_encoder_update_current_frame_pic_params_info_av1(pD3D12Enc, srcTexture, picture, currentPicParams, bUsedAsReference); } break; +#endif #endif default: { @@ -496,6 +538,7 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder pD3D12Enc->m_upBitstreamBuilder.reset(); enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { bool gopHasPFrames = @@ -513,7 +556,8 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder pD3D12Enc->m_upBitstreamBuilder = std::make_unique(); } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { bool gopHasPFrames = @@ -531,6 +575,8 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder pD3D12Enc->m_upBitstreamBuilder = std::make_unique(); } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -548,6 +594,7 @@ d3d12_video_encoder_create_reference_picture_manager(struct d3d12_video_encoder // We use packed headers and pist encode execution syntax for AV1 pD3D12Enc->m_upBitstreamBuilder = std::make_unique(); } break; +#endif #endif default: { @@ -561,6 +608,7 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA subregionData = {}; @@ -572,7 +620,8 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder } return subregionData; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA subregionData = {}; @@ -584,6 +633,8 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder } return subregionData; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -596,6 +647,7 @@ d3d12_video_encoder_get_current_slice_param_settings(struct d3d12_video_encoder } return subregionData; } break; +#endif #endif default: { @@ -609,6 +661,7 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curPicParamsData = {}; @@ -616,7 +669,8 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_H264PicData); return curPicParamsData; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curPicParamsData = {}; @@ -624,6 +678,8 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_HEVCPicData); return curPicParamsData; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -632,6 +688,7 @@ d3d12_video_encoder_get_current_picture_param_settings(struct d3d12_video_encode curPicParamsData.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderPicParamsDesc.m_AV1PicData); return curPicParamsData; } break; +#endif #endif default: { @@ -743,6 +800,7 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_LEVEL_SETTING curLevelDesc = {}; @@ -750,7 +808,8 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_H264LevelSetting); return curLevelDesc; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_LEVEL_SETTING curLevelDesc = {}; @@ -758,6 +817,8 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_HEVCLevelSetting); return curLevelDesc; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -766,6 +827,7 @@ d3d12_video_encoder_get_current_level_desc(struct d3d12_video_encoder *pD3D12Enc curLevelDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderLevelDesc.m_AV1LevelSetting); return curLevelDesc; } break; +#endif #endif default: { @@ -781,25 +843,28 @@ d3d12_video_encoder_build_pre_encode_codec_headers(struct d3d12_video_encoder *p { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { postEncodeHeadersNeeded = false; preEncodeGeneratedHeadersByteSize = d3d12_video_encoder_build_codec_headers_h264(pD3D12Enc); } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { postEncodeHeadersNeeded = false; preEncodeGeneratedHeadersByteSize = d3d12_video_encoder_build_codec_headers_hevc(pD3D12Enc); } break; - +#endif +#if VIDEO_CODEC_AV1ENC case PIPE_VIDEO_FORMAT_AV1: { pD3D12Enc->m_BitstreamHeadersBuffer.resize(0); postEncodeHeadersNeeded = true; preEncodeGeneratedHeadersByteSize = 0; } break; - +#endif default: { unreachable("Unsupported pipe_video_format"); @@ -812,6 +877,7 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc) { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE curGOPDesc = {}; @@ -820,7 +886,8 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc) curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_H264GroupOfPictures); return curGOPDesc; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE curGOPDesc = {}; @@ -829,7 +896,8 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc) curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_HEVCGroupOfPictures); return curGOPDesc; } break; - +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -839,6 +907,7 @@ d3d12_video_encoder_get_current_gop_desc(struct d3d12_video_encoder *pD3D12Enc) curGOPDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderGOPConfigDesc.m_AV1SequenceStructure); return curGOPDesc; } break; +#endif #endif default: { @@ -852,6 +921,7 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codecConfigDesc = {}; @@ -860,7 +930,8 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_H264Config); return codecConfigDesc; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codecConfigDesc = {}; @@ -869,7 +940,8 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_HEVCConfig); return codecConfigDesc; } break; - +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -879,6 +951,7 @@ d3d12_video_encoder_get_current_codec_config_desc(struct d3d12_video_encoder *pD sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderCodecSpecificConfigDesc.m_AV1Config); return codecConfigDesc; } break; +#endif #endif default: { @@ -892,19 +965,25 @@ d3d12_video_encoder_get_current_codec(struct d3d12_video_encoder *pD3D12Enc) { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { return D3D12_VIDEO_ENCODER_CODEC_H264; } break; +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { return D3D12_VIDEO_ENCODER_CODEC_HEVC; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { return D3D12_VIDEO_ENCODER_CODEC_AV1; } break; +#endif #endif default: { @@ -1203,6 +1282,7 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3 enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { capEncoderSupportData1.SuggestedProfile.pH264Profile = @@ -1214,7 +1294,8 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3 capEncoderSupportData1.SuggestedLevel.DataSize = sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_H264LevelSetting); } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { capEncoderSupportData1.SuggestedProfile.pHEVCProfile = @@ -1226,7 +1307,8 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3 capEncoderSupportData1.SuggestedLevel.DataSize = sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_HEVCLevelSetting); } break; - +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -1239,6 +1321,7 @@ bool d3d12_video_encoder_query_d3d12_driver_caps(struct d3d12_video_encoder *pD3 capEncoderSupportData1.SuggestedLevel.DataSize = sizeof(pD3D12Enc->m_currentEncodeCapabilities.m_encoderLevelSuggestedDesc.m_AV1LevelSetting); } break; +#endif #endif default: { @@ -1299,6 +1382,7 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { D3D12_VIDEO_ENCODER_PROFILE_DESC curProfDesc = {}; @@ -1306,7 +1390,8 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_H264Profile); return curProfDesc; } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { D3D12_VIDEO_ENCODER_PROFILE_DESC curProfDesc = {}; @@ -1314,6 +1399,8 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_HEVCProfile); return curProfDesc; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -1322,6 +1409,7 @@ d3d12_video_encoder_get_current_profile_desc(struct d3d12_video_encoder *pD3D12E curProfDesc.DataSize = sizeof(pD3D12Enc->m_currentEncodeConfig.m_encoderProfileDesc.m_AV1Profile); return curProfDesc; } break; +#endif #endif default: { @@ -1343,20 +1431,25 @@ d3d12_video_encoder_update_current_encoder_config_state(struct d3d12_video_encod { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { return d3d12_video_encoder_update_current_encoder_config_state_h264(pD3D12Enc, srcTexture, picture); } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { return d3d12_video_encoder_update_current_encoder_config_state_hevc(pD3D12Enc, srcTexture, picture); } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { return d3d12_video_encoder_update_current_encoder_config_state_av1(pD3D12Enc, srcTexture, picture); } break; +#endif #endif default: { @@ -1648,15 +1741,22 @@ d3d12_video_encoder_calculate_metadata_resolved_buffer_size(enum pipe_video_form (maxSliceNumber * sizeof(D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA)); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: + break; +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { size_t extra_av1_size = d3d12_video_encoder_calculate_metadata_resolved_buffer_size_av1(maxSliceNumber); bufferSize += extra_av1_size; } break; +#endif #endif default: { @@ -2191,11 +2291,19 @@ d3d12_video_encoder_build_post_encode_codec_bitstream(struct d3d12_video_encoder { enum pipe_video_format codec_format = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec_format) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: + { + return 0; + } break; +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { return 0; } break; // Do not need post encode values in headers +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -2208,6 +2316,7 @@ d3d12_video_encoder_build_post_encode_codec_bitstream(struct d3d12_video_encoder associatedMetadata ); } break; +#endif #endif default: unreachable("Unsupported pipe_video_format"); @@ -2316,20 +2425,25 @@ d3d12_video_encoder_store_current_picture_references(d3d12_video_encoder *pD3D12 { enum pipe_video_format codec = u_reduce_video_profile(pD3D12Enc->base.profile); switch (codec) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { // Not needed (not post encode headers) } break; - +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { // Not needed (not post encode headers) } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { d3d12_video_encoder_store_current_picture_references_av1(pD3D12Enc, current_metadata_slot); } break; +#endif #endif default: { diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp index 44bc71ddc44..36215843522 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc_h264.cpp @@ -994,37 +994,6 @@ d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_h264(enum pipe_video_pr } } -D3D12_VIDEO_ENCODER_CODEC -d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(enum pipe_video_profile profile) -{ - switch (u_reduce_video_profile(profile)) { - case PIPE_VIDEO_FORMAT_MPEG4_AVC: - { - return D3D12_VIDEO_ENCODER_CODEC_H264; - } break; - case PIPE_VIDEO_FORMAT_HEVC: - { - return D3D12_VIDEO_ENCODER_CODEC_HEVC; - } break; -#if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) - case PIPE_VIDEO_FORMAT_AV1: - { - return D3D12_VIDEO_ENCODER_CODEC_AV1; - } break; -#endif - case PIPE_VIDEO_FORMAT_MPEG12: - case PIPE_VIDEO_FORMAT_MPEG4: - case PIPE_VIDEO_FORMAT_VC1: - case PIPE_VIDEO_FORMAT_JPEG: - case PIPE_VIDEO_FORMAT_VP9: - case PIPE_VIDEO_FORMAT_UNKNOWN: - default: - { - unreachable("Unsupported pipe_video_profile"); - } break; - } -} - bool d3d12_video_encoder_compare_slice_config_h264_hevc( D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE targetMode, diff --git a/src/gallium/drivers/d3d12/d3d12_video_screen.cpp b/src/gallium/drivers/d3d12/d3d12_video_screen.cpp index 4253f243afe..691d23a2337 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_screen.cpp @@ -149,20 +149,37 @@ d3d12_has_video_decode_support(struct pipe_screen *pscreen, enum pipe_video_prof // Supported profiles below bool supportsProfile = false; switch (profile) { +#if VIDEO_CODEC_H264DEC case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED: case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10: + { + supportsProfile = true; + } break; +#endif +#if VIDEO_CODEC_H265DEC case PIPE_VIDEO_PROFILE_HEVC_MAIN: case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: + { + supportsProfile = true; + } break; +#endif +#if VIDEO_CODEC_AV1DEC case PIPE_VIDEO_PROFILE_AV1_MAIN: + { + supportsProfile = true; + } break; +#endif +#if VIDEO_CODEC_VP9DEC case PIPE_VIDEO_PROFILE_VP9_PROFILE0: case PIPE_VIDEO_PROFILE_VP9_PROFILE2: { supportsProfile = true; } break; +#endif default: supportsProfile = false; } @@ -804,6 +821,7 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen, D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT d3d12_codec_support = { }; bool supportsProfile = false; switch (profile) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: @@ -877,6 +895,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen, codecSupport); } } break; +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_PROFILE_HEVC_MAIN: case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: { @@ -1043,6 +1063,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen, } } } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_PROFILE_AV1_MAIN: { @@ -1300,7 +1322,8 @@ d3d12_has_video_encode_support(struct pipe_screen *pscreen, } } } break; -#endif +#endif // #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) +#endif // #if VIDEO_CODEC_AV1ENC default: supportsProfile = false; } @@ -1767,28 +1790,39 @@ is_d3d12_video_encode_format_supported(struct pipe_screen *screen, pipe_format format, enum pipe_video_profile profile) { +#if VIDEO_CODEC_H264ENC D3D12_VIDEO_ENCODER_PROFILE_H264 profH264 = {}; +#endif +#if VIDEO_CODEC_H265ENC D3D12_VIDEO_ENCODER_PROFILE_HEVC profHEVC = {}; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) D3D12_VIDEO_ENCODER_AV1_PROFILE profAV1 = {}; +#endif #endif D3D12_FEATURE_DATA_VIDEO_ENCODER_INPUT_FORMAT capDataFmt = {}; capDataFmt.NodeIndex = 0; capDataFmt.Codec = d3d12_video_encoder_convert_codec_to_d3d12_enc_codec(profile); capDataFmt.Format = d3d12_get_format(format); switch (u_reduce_video_profile(profile)) { +#if VIDEO_CODEC_H264ENC case PIPE_VIDEO_FORMAT_MPEG4_AVC: { profH264 = d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_h264(profile); capDataFmt.Profile.DataSize = sizeof(profH264); capDataFmt.Profile.pH264Profile = &profH264; } break; +#endif +#if VIDEO_CODEC_H265ENC case PIPE_VIDEO_FORMAT_HEVC: { profHEVC = d3d12_video_encoder_convert_profile_to_d3d12_enc_profile_hevc(profile); capDataFmt.Profile.DataSize = sizeof(profHEVC); capDataFmt.Profile.pHEVCProfile = &profHEVC; } break; +#endif +#if VIDEO_CODEC_AV1ENC #if ((D3D12_SDK_VERSION >= 611) && (D3D12_PREVIEW_SDK_VERSION >= 712)) case PIPE_VIDEO_FORMAT_AV1: { @@ -1797,6 +1831,7 @@ is_d3d12_video_encode_format_supported(struct pipe_screen *screen, capDataFmt.Profile.pAV1Profile = &profAV1; } break; #endif +#endif default: { unreachable("Unsupported pipe_video_format"); diff --git a/src/gallium/drivers/d3d12/meson.build b/src/gallium/drivers/d3d12/meson.build index 66f26a28a7d..a2ed8b3981d 100644 --- a/src/gallium/drivers/d3d12/meson.build +++ b/src/gallium/drivers/d3d12/meson.build @@ -50,37 +50,69 @@ if with_gallium_d3d12_video files_libd3d12 += [ 'd3d12_video_dec.cpp', 'd3d12_video_dec_references_mgr.cpp', - 'd3d12_video_dec_h264.cpp', 'd3d12_video_buffer.cpp', 'd3d12_video_enc.cpp', - 'd3d12_video_enc_h264.cpp', - 'd3d12_video_encoder_references_manager_h264.cpp', - 'd3d12_video_encoder_nalu_writer_h264.cpp', - 'd3d12_video_encoder_bitstream_builder_h264.cpp', 'd3d12_video_encoder_bitstream.cpp', 'd3d12_video_texture_array_dpb_manager.cpp', 'd3d12_video_array_of_textures_dpb_manager.cpp', 'd3d12_video_screen.cpp', 'd3d12_video_proc.cpp', + ] + +if _codecs.contains('h264dec') + files_libd3d12 += [ + 'd3d12_video_dec_h264.cpp', + ] +endif + +if _codecs.contains('h265dec') + files_libd3d12 += [ 'd3d12_video_dec_hevc.cpp', + ] +endif + +if _codecs.contains('av1dec') + files_libd3d12 += [ + 'd3d12_video_dec_av1.cpp', + ] +endif + +if _codecs.contains('vp9dec') + files_libd3d12 += [ + 'd3d12_video_dec_vp9.cpp', + ] +endif + +if _codecs.contains('h264enc') + files_libd3d12 += [ + 'd3d12_video_enc_h264.cpp', + 'd3d12_video_encoder_references_manager_h264.cpp', + 'd3d12_video_encoder_nalu_writer_h264.cpp', + 'd3d12_video_encoder_bitstream_builder_h264.cpp', + ] +endif + +if _codecs.contains('h265enc') + files_libd3d12 += [ 'd3d12_video_enc_hevc.cpp', 'd3d12_video_encoder_bitstream_builder_hevc.cpp', 'd3d12_video_encoder_nalu_writer_hevc.cpp', 'd3d12_video_encoder_references_manager_hevc.cpp', - 'd3d12_video_dec_av1.cpp', - 'd3d12_video_dec_vp9.cpp', ] - - if (dep_dxheaders.version().version_compare('>= 1.611.0') and dep_dxheaders.version().version_compare('< 1.700.0')) or dep_dxheaders.version().version_compare('>= 1.712.0') - files_libd3d12 += [ - 'd3d12_video_enc_av1.cpp', - 'd3d12_video_encoder_references_manager_av1.cpp', - 'd3d12_video_encoder_bitstream_builder_av1.cpp', - ] - endif - endif +if _codecs.contains('av1enc') + if (dep_dxheaders.version().version_compare('>= 1.611.0') and dep_dxheaders.version().version_compare('< 1.700.0')) or dep_dxheaders.version().version_compare('>= 1.712.0') + files_libd3d12 += [ + 'd3d12_video_enc_av1.cpp', + 'd3d12_video_encoder_references_manager_av1.cpp', + 'd3d12_video_encoder_bitstream_builder_av1.cpp', + ] + endif +endif + +endif # with_gallium_d3d12_video + is_xbox = target_machine.system().startswith('Gaming.Xbox') if host_machine.system() == 'windows' if is_xbox