use rspirv::spirv::Op;
trait Pat {
const ANY: Self;
}
#[derive(Debug, PartialEq, Eq)]
pub enum StorageClassPat {
Any,
Var(usize),
}
impl Pat for StorageClassPat {
const ANY: Self = Self::Any;
}
impl StorageClassPat {
pub const S: Self = Self::Var(0);
}
#[derive(Debug, PartialEq, Eq)]
pub enum TyPat<'a> {
Any,
Var(usize),
Either(&'a TyPat<'a>, &'a TyPat<'a>),
Void,
Pointer(&'a StorageClassPat, &'a TyPat<'a>),
Array(&'a TyPat<'a>),
Vector(&'a TyPat<'a>),
Vector4(&'a TyPat<'a>),
Matrix(&'a TyPat<'a>),
Image(&'a TyPat<'a>),
Pipe(&'a TyPat<'a>),
SampledImage(&'a TyPat<'a>),
Struct(&'a TyListPat<'a>),
Function(&'a TyPat<'a>, &'a TyListPat<'a>),
IndexComposite(&'a TyPat<'a>),
}
impl Pat for TyPat<'_> {
const ANY: Self = Self::Any;
}
impl TyPat<'_> {
pub const T: Self = Self::Var(0);
}
#[derive(Debug, PartialEq, Eq)]
pub enum TyListPat<'a> {
Any,
Var(usize),
Repeat(&'a TyListPat<'a>),
Nil,
Cons {
first: &'a TyPat<'a>,
suffix: &'a TyListPat<'a>,
},
}
impl Pat for TyListPat<'_> {
const ANY: Self = Self::Any;
}
impl TyListPat<'_> {
pub const TS: Self = Self::Var(0);
}
#[derive(Copy, Clone, Debug)]
pub struct InstSig<'a> {
pub storage_class: Option<&'a StorageClassPat>,
pub input_types: &'a TyListPat<'a>,
pub output_type: Option<&'a TyPat<'a>>,
}
pub fn instruction_signatures(op: Op) -> Option<&'static [InstSig<'static>]> {
mod pat_ctors {
pub const S: super::StorageClassPat = super::StorageClassPat::S;
pub use super::TyPat::{
Array, Either, Function, Image, IndexComposite, Matrix, Pipe, Pointer, SampledImage,
Struct, Vector, Vector4, Void,
};
pub const T: super::TyPat<'_> = super::TyPat::T;
pub use super::TyListPat::Repeat;
pub const TS: super::TyListPat<'_> = super::TyListPat::TS;
}
macro_rules! pat {
(_) => { &Pat::ANY };
($ctor:ident $(($($inner:tt $(($($inner_args:tt)+))?),+))?) => {
&pat_ctors::$ctor $(($(pat!($inner $(($($inner_args)+))?)),+))?
};
([]) => { &TyListPat::Nil };
([..]) => { &TyListPat::Any };
([...$($rest:tt)+]) => { pat!($($rest)+) };
([$first:tt $(($($first_args:tt)+))? $(, $($rest:tt)*)?]) => {
&TyListPat::Cons {
first: pat!($first $(($($first_args)+))?),
suffix: pat!([$($($rest)*)?]),
}
}
}
macro_rules! optionify {
() => {
None
};
($x:expr) => {
Some($x)
};
}
macro_rules! sig {
($(
$({$($storage_class:tt)*})?
($($in_tys:tt)*)
$(-> $out_ty:tt $(($($out_ty_args:tt)+))?)?
)|+) => {
return Some(&[$(InstSig {
storage_class: optionify!($(pat!($($storage_class)*))?),
input_types: pat!([$($in_tys)*]),
output_type: optionify!($(pat!($out_ty $(($($out_ty_args)+))?))?),
}),*])
};
}
macro_rules! reserved {
($ext:ident) => {
unreachable!(concat!("Op{:?} is reserved for ", stringify!($ext)), op)
};
}
#[allow(clippy::match_same_arms)]
match op {
Op::Nop | Op::Undef => {}
Op::SizeOf => {}
Op::SourceContinued
| Op::Source
| Op::SourceExtension
| Op::Name
| Op::MemberName
| Op::String
| Op::Line => {}
Op::NoLine => {}
Op::ModuleProcessed => {}
Op::Decorate
| Op::MemberDecorate
| Op::DecorationGroup
| Op::GroupDecorate
| Op::GroupMemberDecorate => {}
Op::DecorateId => {}
Op::DecorateString | Op::MemberDecorateString => {}
Op::Extension | Op::ExtInstImport | Op::ExtInst => {}
Op::MemoryModel | Op::EntryPoint | Op::ExecutionMode | Op::Capability => {}
Op::ExecutionModeId => {}
Op::TypeVoid
| Op::TypeBool
| Op::TypeInt
| Op::TypeFloat
| Op::TypeVector
| Op::TypeMatrix
| Op::TypeImage
| Op::TypeSampler
| Op::TypeSampledImage
| Op::TypeArray
| Op::TypeRuntimeArray
| Op::TypeStruct
| Op::TypeOpaque
| Op::TypePointer
| Op::TypeFunction
| Op::TypeEvent
| Op::TypeDeviceEvent
| Op::TypeReserveId
| Op::TypeQueue
| Op::TypePipe
| Op::TypeForwardPointer => {}
Op::TypePipeStorage => {}
Op::TypeNamedBarrier => {}
Op::ConstantTrue | Op::ConstantFalse | Op::Constant => {}
Op::ConstantComposite | Op::SpecConstantComposite => sig! {
(...TS) -> Struct(TS) |
(...Repeat([T])) -> Array(T) |
(...Repeat([T])) -> Vector(T) |
(...Repeat([T])) -> Matrix(T)
},
Op::ConstantSampler
| Op::ConstantNull
| Op::SpecConstantTrue
| Op::SpecConstantFalse
| Op::SpecConstant => {}
Op::SpecConstantOp => {
unreachable!(
"Op{:?} should be specially handled outside spirv_type_constraints",
op
);
}
Op::Variable => sig! {
{S} () -> Pointer(S, _) |
{S} (T) -> Pointer(S, T)
},
Op::ImageTexelPointer => sig! { (Pointer(_, Image(T)), _, _) -> Pointer(_, T) },
Op::Load => sig! { (Pointer(_, T)) -> T },
Op::Store => sig! { (Pointer(_, T), T) },
Op::CopyMemory => sig! { (Pointer(_, T), Pointer(_, T)) },
Op::CopyMemorySized => {}
Op::AccessChain | Op::InBoundsAccessChain => sig! {
(Pointer(S, T), ..) -> Pointer(S, IndexComposite(T))
},
Op::PtrAccessChain | Op::InBoundsPtrAccessChain => sig! {
(Pointer(S, T), _, ..) -> Pointer(S, IndexComposite(T))
},
Op::ArrayLength | Op::GenericPtrMemSemantics => {}
Op::PtrEqual | Op::PtrNotEqual | Op::PtrDiff => sig! {
(Pointer(_, T), Pointer(_, T)) -> _
},
Op::Function => {}
Op::FunctionParameter | Op::FunctionEnd => {
unreachable!(
"Op{:?} should be specially handled outside spirv_type_constraints",
op
);
}
Op::FunctionCall => sig! { (Function(T, TS), ...TS) -> T },
Op::SampledImage => sig! { (T, _) -> SampledImage(T) },
Op::ImageSampleImplicitLod
| Op::ImageSampleExplicitLod
| Op::ImageSampleProjImplicitLod
| Op::ImageSampleProjExplicitLod
| Op::ImageGather
| Op::ImageDrefGather => sig! {
(SampledImage(Image(Either(Void, T))), ..) -> Vector4(T)
},
Op::ImageSampleDrefImplicitLod
| Op::ImageSampleDrefExplicitLod
| Op::ImageSampleProjDrefImplicitLod
| Op::ImageSampleProjDrefExplicitLod => sig! {
(SampledImage(Image(T)), ..) -> T
},
Op::ImageFetch => sig! {
(Image(Either(Void, T)), ..) -> Vector4(T)
},
Op::ImageRead => sig! {
(Image(Either(Void, T)), ..) -> Either(Vector(T), T)
},
Op::ImageWrite => sig! {
(Image(Either(Void, T)), _, Either(Vector(T), T))
},
Op::Image => sig! { (SampledImage(T)) -> T },
Op::ImageQueryFormat
| Op::ImageQueryOrder
| Op::ImageQuerySizeLod
| Op::ImageQuerySize
| Op::ImageQueryLod
| Op::ImageQueryLevels
| Op::ImageQuerySamples => {}
Op::ImageSparseSampleImplicitLod
| Op::ImageSparseSampleExplicitLod
| Op::ImageSparseSampleProjImplicitLod
| Op::ImageSparseSampleProjExplicitLod
| Op::ImageSparseGather
| Op::ImageSparseDrefGather => sig! {
(SampledImage(Image(Either(Void, T))), ..) -> Struct([_, Vector4(T)])
},
Op::ImageSparseSampleDrefImplicitLod
| Op::ImageSparseSampleDrefExplicitLod
| Op::ImageSparseSampleProjDrefImplicitLod
| Op::ImageSparseSampleProjDrefExplicitLod => sig! {
(SampledImage(Image(T)), ..) -> Struct([_, T])
},
Op::ImageSparseFetch => sig! {
(Image(Either(Void, T)), ..) -> Struct([_, Vector4(T)])
},
Op::ImageSparseTexelsResident => {}
Op::ImageSparseRead => sig! {
(Image(Either(Void, T)), ..) -> Struct([_, Either(Vector(T), T)])
},
Op::ImageSampleFootprintNV => {}
Op::ConvertFToU
| Op::ConvertFToS
| Op::ConvertSToF
| Op::ConvertUToF
| Op::UConvert
| Op::SConvert
| Op::FConvert => {}
Op::QuantizeToF16 => sig! { (T) -> T },
Op::ConvertPtrToU | Op::SatConvertSToU | Op::SatConvertUToS | Op::ConvertUToPtr => {}
Op::PtrCastToGeneric | Op::GenericCastToPtr => sig! { (Pointer(_, T)) -> Pointer(_, T) },
Op::GenericCastToPtrExplicit => sig! { {S} (Pointer(_, T)) -> Pointer(S, T) },
Op::Bitcast => {}
Op::VectorExtractDynamic => sig! { (Vector(T), _) -> T },
Op::VectorInsertDynamic => sig! {
(T, _, _) -> T
},
Op::VectorShuffle => sig! { (Vector(T), Vector(T)) -> Vector(T) },
Op::CompositeConstruct => sig! {
(...TS) -> Struct(TS) |
(...Repeat([T])) -> Array(T) |
(...Repeat([T])) -> Matrix(T) |
(...Repeat([Either(Vector(T), T)])) -> Vector(T)
},
Op::CompositeExtract => sig! { (T, ..) -> IndexComposite(T) },
Op::CompositeInsert => sig! { (IndexComposite(T), T, ..) -> T },
Op::CopyObject => sig! { (T) -> T },
Op::Transpose => sig! { (Matrix(Vector(T))) -> Matrix(Vector(T)) },
Op::CopyLogical => sig! {
(Array(T)) -> Array(T) |
(Struct(TS)) -> Struct(TS)
},
Op::SNegate => {}
Op::FNegate => sig! { (T) -> T },
Op::IAdd | Op::ISub | Op::IMul | Op::SDiv | Op::SRem | Op::SMod => {}
Op::FAdd | Op::FSub | Op::FMul | Op::UDiv | Op::FDiv | Op::UMod | Op::FRem | Op::FMod => {
sig! { (T, T) -> T }
}
Op::VectorTimesScalar => sig! {
(Vector(T), T) -> Vector(T)
},
Op::MatrixTimesScalar => sig! {
(Matrix(Vector(T)), T) -> Matrix(Vector(T))
},
Op::VectorTimesMatrix => sig! { (Vector(T), Matrix(Vector(T))) -> Vector(T) },
Op::MatrixTimesVector => sig! {
(Matrix(Vector(T)), Vector(T)) -> Vector(T)
},
Op::MatrixTimesMatrix => sig! {
(Matrix(Vector(T)), Matrix(Vector(T))) -> Matrix(Vector(T))
},
Op::OuterProduct => sig! {
(Vector(T), Vector(T)) -> Matrix(Vector(T))
},
Op::Dot => sig! {
(Vector(T), T) -> Vector(T)
},
Op::IAddCarry | Op::ISubBorrow | Op::UMulExtended | Op::SMulExtended => sig! {
(T, T) -> Struct([T, T])
},
Op::ShiftRightLogical
| Op::ShiftRightArithmetic
| Op::ShiftLeftLogical
| Op::BitwiseOr
| Op::BitwiseXor
| Op::BitwiseAnd
| Op::Not => {}
Op::BitFieldInsert => sig! { (T, T, _, _) -> T },
Op::BitFieldSExtract | Op::BitFieldUExtract => sig! { (T, _, _) -> T },
Op::BitReverse => sig! { (T) -> T },
Op::BitCount => {}
Op::Any
| Op::All
| Op::IsNan
| Op::IsInf
| Op::IsFinite
| Op::IsNormal
| Op::SignBitSet => {}
Op::LessOrGreater | Op::Ordered | Op::Unordered => sig! { (T, T) -> _ },
Op::LogicalEqual | Op::LogicalNotEqual | Op::LogicalOr | Op::LogicalAnd => sig! {
(T, T) -> T
},
Op::LogicalNot => sig! { (T) -> T },
Op::Select => sig! { (_, T, T) -> T },
Op::IEqual
| Op::INotEqual
| Op::UGreaterThan
| Op::SGreaterThan
| Op::UGreaterThanEqual
| Op::SGreaterThanEqual
| Op::ULessThan
| Op::SLessThan
| Op::ULessThanEqual
| Op::SLessThanEqual => {}
Op::FOrdEqual
| Op::FUnordEqual
| Op::FOrdNotEqual
| Op::FUnordNotEqual
| Op::FOrdLessThan
| Op::FUnordLessThan
| Op::FOrdGreaterThan
| Op::FUnordGreaterThan
| Op::FOrdLessThanEqual
| Op::FUnordLessThanEqual
| Op::FOrdGreaterThanEqual
| Op::FUnordGreaterThanEqual => sig! { (T, T) -> _ },
Op::DPdx
| Op::DPdy
| Op::Fwidth
| Op::DPdxFine
| Op::DPdyFine
| Op::FwidthFine
| Op::DPdxCoarse
| Op::DPdyCoarse
| Op::FwidthCoarse => sig! { (T) -> T },
Op::Phi => sig! { (...Repeat([T, _])) -> T },
Op::LoopMerge
| Op::SelectionMerge
| Op::Label
| Op::Branch
| Op::BranchConditional
| Op::Switch
| Op::Kill => {}
Op::Return | Op::ReturnValue => {
unreachable!(
"Op{:?} should be specially handled outside spirv_type_constraints",
op
);
}
Op::Unreachable | Op::LifetimeStart | Op::LifetimeStop | Op::TerminateInvocation => {}
Op::AtomicLoad | Op::AtomicIIncrement | Op::AtomicIDecrement => sig! {
(Pointer(_, T), _, _) -> T
},
Op::AtomicStore => sig! { (Pointer(_, T), _, _, T) },
Op::AtomicExchange
| Op::AtomicIAdd
| Op::AtomicISub
| Op::AtomicSMin
| Op::AtomicUMin
| Op::AtomicSMax
| Op::AtomicUMax
| Op::AtomicAnd
| Op::AtomicOr
| Op::AtomicXor => sig! { (Pointer(_, T), _, _, T) -> T },
Op::AtomicCompareExchange | Op::AtomicCompareExchangeWeak => sig! {
(Pointer(_, T), _, _, _, T, T) -> T
},
Op::AtomicFlagTestAndSet | Op::AtomicFlagClear => {}
Op::AtomicFAddEXT => sig! { (Pointer(_, T), _, _, T) -> T },
Op::EmitVertex | Op::EndPrimitive | Op::EmitStreamVertex | Op::EndStreamPrimitive => {}
Op::ControlBarrier | Op::MemoryBarrier => {}
Op::NamedBarrierInitialize | Op::MemoryNamedBarrier => {}
Op::GroupAsyncCopy => sig! { (_, Pointer(_, T), Pointer(_, T), _, _, _) -> _ },
Op::GroupWaitEvents => {}
Op::GroupAll | Op::GroupAny => {}
Op::GroupBroadcast => sig! { (_, T, _) -> T },
Op::GroupIAdd
| Op::GroupFAdd
| Op::GroupFMin
| Op::GroupUMin
| Op::GroupSMin
| Op::GroupFMax
| Op::GroupUMax
| Op::GroupSMax => sig! { (_, T) -> T },
Op::SubgroupBallotKHR => {}
Op::SubgroupFirstInvocationKHR => sig! { (T) -> T },
Op::SubgroupAllKHR | Op::SubgroupAnyKHR | Op::SubgroupAllEqualKHR => {}
Op::SubgroupReadInvocationKHR => sig! { (T, _) -> T },
Op::GroupIAddNonUniformAMD
| Op::GroupFAddNonUniformAMD
| Op::GroupFMinNonUniformAMD
| Op::GroupUMinNonUniformAMD
| Op::GroupSMinNonUniformAMD
| Op::GroupFMaxNonUniformAMD
| Op::GroupUMaxNonUniformAMD
| Op::GroupSMaxNonUniformAMD => sig! { (_, T) -> T },
Op::SubgroupShuffleINTEL | Op::SubgroupShuffleXorINTEL => sig! { (T, _) -> T },
Op::SubgroupShuffleDownINTEL | Op::SubgroupShuffleUpINTEL => sig! { (T, T, _) -> T },
Op::SubgroupBlockReadINTEL => sig! { (Pointer(_, T)) -> T },
Op::SubgroupBlockWriteINTEL => sig! { (Pointer(_, T), T) },
Op::SubgroupImageBlockReadINTEL | Op::SubgroupImageBlockWriteINTEL => {}
Op::SubgroupImageMediaBlockReadINTEL | Op::SubgroupImageMediaBlockWriteINTEL => {}
Op::EnqueueMarker
| Op::EnqueueKernel
| Op::GetKernelNDrangeSubGroupCount
| Op::GetKernelNDrangeMaxSubGroupSize
| Op::GetKernelWorkGroupSize
| Op::GetKernelPreferredWorkGroupSizeMultiple
| Op::RetainEvent
| Op::ReleaseEvent
| Op::CreateUserEvent
| Op::IsValidEvent
| Op::SetUserEventStatus
| Op::CaptureEventProfilingInfo
| Op::GetDefaultQueue => {}
Op::BuildNDRange => sig! { (T, T, T) -> _ },
Op::GetKernelLocalSizeForSubgroupCount | Op::GetKernelMaxNumSubgroups => {}
Op::ReadPipe | Op::WritePipe => sig! { (Pipe(T), Pointer(_, T), _, _) -> _ },
Op::ReservedReadPipe | Op::ReservedWritePipe => sig! {
(Pipe(T), _, _, Pointer(_, T), _, _) -> _
},
Op::ReserveReadPipePackets
| Op::ReserveWritePipePackets
| Op::CommitReadPipe
| Op::CommitWritePipe
| Op::IsValidReserveId
| Op::GetNumPipePackets
| Op::GetMaxPipePackets
| Op::GroupReserveReadPipePackets
| Op::GroupReserveWritePipePackets
| Op::GroupCommitReadPipe
| Op::GroupCommitWritePipe => {}
Op::ConstantPipeStorage | Op::CreatePipeFromPipeStorage => {}
Op::ReadPipeBlockingINTEL | Op::WritePipeBlockingINTEL => sig! {
(Pipe(T), Pointer(_, T), _, _)
},
Op::GroupNonUniformElect
| Op::GroupNonUniformAll
| Op::GroupNonUniformAny
| Op::GroupNonUniformAllEqual => {}
Op::GroupNonUniformBroadcast => sig! { (_, T, _) -> T },
Op::GroupNonUniformBroadcastFirst => sig! { (_, T) -> T },
Op::GroupNonUniformBallot
| Op::GroupNonUniformInverseBallot
| Op::GroupNonUniformBallotBitExtract
| Op::GroupNonUniformBallotBitCount
| Op::GroupNonUniformBallotFindLSB
| Op::GroupNonUniformBallotFindMSB => {}
Op::GroupNonUniformShuffle
| Op::GroupNonUniformShuffleXor
| Op::GroupNonUniformShuffleUp
| Op::GroupNonUniformShuffleDown
| Op::GroupNonUniformIAdd
| Op::GroupNonUniformFAdd
| Op::GroupNonUniformIMul
| Op::GroupNonUniformFMul
| Op::GroupNonUniformSMin
| Op::GroupNonUniformUMin
| Op::GroupNonUniformFMin
| Op::GroupNonUniformSMax
| Op::GroupNonUniformUMax
| Op::GroupNonUniformFMax
| Op::GroupNonUniformBitwiseAnd
| Op::GroupNonUniformBitwiseOr
| Op::GroupNonUniformBitwiseXor
| Op::GroupNonUniformLogicalAnd
| Op::GroupNonUniformLogicalOr
| Op::GroupNonUniformLogicalXor
| Op::GroupNonUniformQuadBroadcast
| Op::GroupNonUniformQuadSwap => sig! { (_, T, ..) -> T },
Op::GroupNonUniformPartitionNV => {}
Op::TraceRayKHR
| Op::ExecuteCallableKHR
| Op::ConvertUToAccelerationStructureKHR
| Op::IgnoreIntersectionKHR
| Op::TerminateRayKHR => {
}
Op::TypeRayQueryKHR
| Op::RayQueryInitializeKHR
| Op::RayQueryTerminateKHR
| Op::RayQueryGenerateIntersectionKHR
| Op::RayQueryConfirmIntersectionKHR
| Op::RayQueryProceedKHR
| Op::RayQueryGetIntersectionTypeKHR => {
}
Op::FragmentMaskFetchAMD | Op::FragmentFetchAMD => reserved!(SPV_AMD_shader_fragment_mask),
Op::ReadClockKHR => {
}
Op::WritePackedPrimitiveIndices4x8NV => reserved!(SPV_NV_mesh_shader),
Op::ReportIntersectionNV
| Op::IgnoreIntersectionNV
| Op::TerminateRayNV
| Op::TraceNV
| Op::TypeAccelerationStructureNV
| Op::ExecuteCallableNV => {
}
Op::TypeCooperativeMatrixNV
| Op::CooperativeMatrixLoadNV
| Op::CooperativeMatrixStoreNV
| Op::CooperativeMatrixMulAddNV
| Op::CooperativeMatrixLengthNV => reserved!(SPV_NV_cooperative_matrix),
Op::BeginInvocationInterlockEXT | Op::EndInvocationInterlockEXT => {
reserved!(SPV_EXT_fragment_shader_interlock);
}
Op::DemoteToHelperInvocationEXT | Op::IsHelperInvocationEXT => {
}
Op::UCountLeadingZerosINTEL | Op::UCountTrailingZerosINTEL => {
}
Op::AbsISubINTEL
| Op::AbsUSubINTEL
| Op::IAddSatINTEL
| Op::UAddSatINTEL
| Op::IAverageINTEL
| Op::UAverageINTEL
| Op::IAverageRoundedINTEL
| Op::UAverageRoundedINTEL
| Op::ISubSatINTEL
| Op::USubSatINTEL
| Op::IMul32x16INTEL
| Op::UMul32x16INTEL => reserved!(SPV_INTEL_shader_integer_functions2),
Op::LoopControlINTEL => reserved!(SPV_INTEL_unstructured_loop_controls),
Op::FPGARegINTEL => reserved!(SPV_INTEL_fpga_reg),
Op::RayQueryGetRayTMinKHR
| Op::RayQueryGetRayFlagsKHR
| Op::RayQueryGetIntersectionTKHR
| Op::RayQueryGetIntersectionInstanceCustomIndexKHR
| Op::RayQueryGetIntersectionInstanceIdKHR
| Op::RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR
| Op::RayQueryGetIntersectionGeometryIndexKHR
| Op::RayQueryGetIntersectionPrimitiveIndexKHR
| Op::RayQueryGetIntersectionBarycentricsKHR
| Op::RayQueryGetIntersectionFrontFaceKHR
| Op::RayQueryGetIntersectionCandidateAABBOpaqueKHR
| Op::RayQueryGetIntersectionObjectRayDirectionKHR
| Op::RayQueryGetIntersectionObjectRayOriginKHR
| Op::RayQueryGetWorldRayDirectionKHR
| Op::RayQueryGetWorldRayOriginKHR
| Op::RayQueryGetIntersectionObjectToWorldKHR
| Op::RayQueryGetIntersectionWorldToObjectKHR => {
}
Op::FunctionPointerINTEL | Op::FunctionPointerCallINTEL => {
reserved!(SPV_INTEL_function_pointers);
}
Op::VmeImageINTEL
| Op::TypeVmeImageINTEL
| Op::TypeAvcImePayloadINTEL
| Op::TypeAvcRefPayloadINTEL
| Op::TypeAvcSicPayloadINTEL
| Op::TypeAvcMcePayloadINTEL
| Op::TypeAvcMceResultINTEL
| Op::TypeAvcImeResultINTEL
| Op::TypeAvcImeResultSingleReferenceStreamoutINTEL
| Op::TypeAvcImeResultDualReferenceStreamoutINTEL
| Op::TypeAvcImeSingleReferenceStreaminINTEL
| Op::TypeAvcImeDualReferenceStreaminINTEL
| Op::TypeAvcRefResultINTEL
| Op::TypeAvcSicResultINTEL
| Op::SubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL
| Op::SubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL
| Op::SubgroupAvcMceGetDefaultInterShapePenaltyINTEL
| Op::SubgroupAvcMceSetInterShapePenaltyINTEL
| Op::SubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL
| Op::SubgroupAvcMceSetInterDirectionPenaltyINTEL
| Op::SubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL
| Op::SubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL
| Op::SubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL
| Op::SubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL
| Op::SubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL
| Op::SubgroupAvcMceSetMotionVectorCostFunctionINTEL
| Op::SubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL
| Op::SubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL
| Op::SubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL
| Op::SubgroupAvcMceSetAcOnlyHaarINTEL
| Op::SubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL
| Op::SubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL
| Op::SubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL
| Op::SubgroupAvcMceConvertToImePayloadINTEL
| Op::SubgroupAvcMceConvertToImeResultINTEL
| Op::SubgroupAvcMceConvertToRefPayloadINTEL
| Op::SubgroupAvcMceConvertToRefResultINTEL
| Op::SubgroupAvcMceConvertToSicPayloadINTEL
| Op::SubgroupAvcMceConvertToSicResultINTEL
| Op::SubgroupAvcMceGetMotionVectorsINTEL
| Op::SubgroupAvcMceGetInterDistortionsINTEL
| Op::SubgroupAvcMceGetBestInterDistortionsINTEL
| Op::SubgroupAvcMceGetInterMajorShapeINTEL
| Op::SubgroupAvcMceGetInterMinorShapeINTEL
| Op::SubgroupAvcMceGetInterDirectionsINTEL
| Op::SubgroupAvcMceGetInterMotionVectorCountINTEL
| Op::SubgroupAvcMceGetInterReferenceIdsINTEL
| Op::SubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL
| Op::SubgroupAvcImeInitializeINTEL
| Op::SubgroupAvcImeSetSingleReferenceINTEL
| Op::SubgroupAvcImeSetDualReferenceINTEL
| Op::SubgroupAvcImeRefWindowSizeINTEL
| Op::SubgroupAvcImeAdjustRefOffsetINTEL
| Op::SubgroupAvcImeConvertToMcePayloadINTEL
| Op::SubgroupAvcImeSetMaxMotionVectorCountINTEL
| Op::SubgroupAvcImeSetUnidirectionalMixDisableINTEL
| Op::SubgroupAvcImeSetEarlySearchTerminationThresholdINTEL
| Op::SubgroupAvcImeSetWeightedSadINTEL
| Op::SubgroupAvcImeEvaluateWithSingleReferenceINTEL
| Op::SubgroupAvcImeEvaluateWithDualReferenceINTEL
| Op::SubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL
| Op::SubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL
| Op::SubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL
| Op::SubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL
| Op::SubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL
| Op::SubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL
| Op::SubgroupAvcImeConvertToMceResultINTEL
| Op::SubgroupAvcImeGetSingleReferenceStreaminINTEL
| Op::SubgroupAvcImeGetDualReferenceStreaminINTEL
| Op::SubgroupAvcImeStripSingleReferenceStreamoutINTEL
| Op::SubgroupAvcImeStripDualReferenceStreamoutINTEL
| Op::SubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL
| Op::SubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL
| Op::SubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL
| Op::SubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL
| Op::SubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL
| Op::SubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL
| Op::SubgroupAvcImeGetBorderReachedINTEL
| Op::SubgroupAvcImeGetTruncatedSearchIndicationINTEL
| Op::SubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL
| Op::SubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL
| Op::SubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL
| Op::SubgroupAvcFmeInitializeINTEL
| Op::SubgroupAvcBmeInitializeINTEL
| Op::SubgroupAvcRefConvertToMcePayloadINTEL
| Op::SubgroupAvcRefSetBidirectionalMixDisableINTEL
| Op::SubgroupAvcRefSetBilinearFilterEnableINTEL
| Op::SubgroupAvcRefEvaluateWithSingleReferenceINTEL
| Op::SubgroupAvcRefEvaluateWithDualReferenceINTEL
| Op::SubgroupAvcRefEvaluateWithMultiReferenceINTEL
| Op::SubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL
| Op::SubgroupAvcRefConvertToMceResultINTEL
| Op::SubgroupAvcSicInitializeINTEL
| Op::SubgroupAvcSicConfigureSkcINTEL
| Op::SubgroupAvcSicConfigureIpeLumaINTEL
| Op::SubgroupAvcSicConfigureIpeLumaChromaINTEL
| Op::SubgroupAvcSicGetMotionVectorMaskINTEL
| Op::SubgroupAvcSicConvertToMcePayloadINTEL
| Op::SubgroupAvcSicSetIntraLumaShapePenaltyINTEL
| Op::SubgroupAvcSicSetIntraLumaModeCostFunctionINTEL
| Op::SubgroupAvcSicSetIntraChromaModeCostFunctionINTEL
| Op::SubgroupAvcSicSetBilinearFilterEnableINTEL
| Op::SubgroupAvcSicSetSkcForwardTransformEnableINTEL
| Op::SubgroupAvcSicSetBlockBasedRawSkipSadINTEL
| Op::SubgroupAvcSicEvaluateIpeINTEL
| Op::SubgroupAvcSicEvaluateWithSingleReferenceINTEL
| Op::SubgroupAvcSicEvaluateWithDualReferenceINTEL
| Op::SubgroupAvcSicEvaluateWithMultiReferenceINTEL
| Op::SubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL
| Op::SubgroupAvcSicConvertToMceResultINTEL
| Op::SubgroupAvcSicGetIpeLumaShapeINTEL
| Op::SubgroupAvcSicGetBestIpeLumaDistortionINTEL
| Op::SubgroupAvcSicGetBestIpeChromaDistortionINTEL
| Op::SubgroupAvcSicGetPackedIpeLumaModesINTEL
| Op::SubgroupAvcSicGetIpeChromaModeINTEL
| Op::SubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL
| Op::SubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL
| Op::SubgroupAvcSicGetInterRawSadsINTEL => {
reserved!(SPV_INTEL_device_side_avc_motion_estimation);
}
}
None
}