in src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp [800:960]
SPIRVCodeGenerator::Intrinsic SPIRVCodeGenerator::getIntrinsic(IntrinsicKind ik) const {
#define ALL_GLSL(x) Intrinsic{kGLSL_STD_450_IntrinsicOpcodeKind, GLSLstd450 ## x, \
GLSLstd450 ## x, GLSLstd450 ## x, GLSLstd450 ## x}
#define BY_TYPE_GLSL(ifFloat, ifInt, ifUInt) Intrinsic{kGLSL_STD_450_IntrinsicOpcodeKind, \
GLSLstd450 ## ifFloat, \
GLSLstd450 ## ifInt, \
GLSLstd450 ## ifUInt, \
SpvOpUndef}
#define ALL_SPIRV(x) Intrinsic{kSPIRV_IntrinsicOpcodeKind, \
SpvOp ## x, SpvOp ## x, SpvOp ## x, SpvOp ## x}
#define BOOL_SPIRV(x) Intrinsic{kSPIRV_IntrinsicOpcodeKind, \
SpvOpUndef, SpvOpUndef, SpvOpUndef, SpvOp ## x}
#define FLOAT_SPIRV(x) Intrinsic{kSPIRV_IntrinsicOpcodeKind, \
SpvOp ## x, SpvOpUndef, SpvOpUndef, SpvOpUndef}
#define SPECIAL(x) Intrinsic{kSpecial_IntrinsicOpcodeKind, k ## x ## _SpecialIntrinsic, \
k ## x ## _SpecialIntrinsic, k ## x ## _SpecialIntrinsic, \
k ## x ## _SpecialIntrinsic}
switch (ik) {
case k_round_IntrinsicKind: return ALL_GLSL(Round);
case k_roundEven_IntrinsicKind: return ALL_GLSL(RoundEven);
case k_trunc_IntrinsicKind: return ALL_GLSL(Trunc);
case k_abs_IntrinsicKind: return BY_TYPE_GLSL(FAbs, SAbs, SAbs);
case k_sign_IntrinsicKind: return BY_TYPE_GLSL(FSign, SSign, SSign);
case k_floor_IntrinsicKind: return ALL_GLSL(Floor);
case k_ceil_IntrinsicKind: return ALL_GLSL(Ceil);
case k_fract_IntrinsicKind: return ALL_GLSL(Fract);
case k_radians_IntrinsicKind: return ALL_GLSL(Radians);
case k_degrees_IntrinsicKind: return ALL_GLSL(Degrees);
case k_sin_IntrinsicKind: return ALL_GLSL(Sin);
case k_cos_IntrinsicKind: return ALL_GLSL(Cos);
case k_tan_IntrinsicKind: return ALL_GLSL(Tan);
case k_asin_IntrinsicKind: return ALL_GLSL(Asin);
case k_acos_IntrinsicKind: return ALL_GLSL(Acos);
case k_atan_IntrinsicKind: return SPECIAL(Atan);
case k_sinh_IntrinsicKind: return ALL_GLSL(Sinh);
case k_cosh_IntrinsicKind: return ALL_GLSL(Cosh);
case k_tanh_IntrinsicKind: return ALL_GLSL(Tanh);
case k_asinh_IntrinsicKind: return ALL_GLSL(Asinh);
case k_acosh_IntrinsicKind: return ALL_GLSL(Acosh);
case k_atanh_IntrinsicKind: return ALL_GLSL(Atanh);
case k_pow_IntrinsicKind: return ALL_GLSL(Pow);
case k_exp_IntrinsicKind: return ALL_GLSL(Exp);
case k_log_IntrinsicKind: return ALL_GLSL(Log);
case k_exp2_IntrinsicKind: return ALL_GLSL(Exp2);
case k_log2_IntrinsicKind: return ALL_GLSL(Log2);
case k_sqrt_IntrinsicKind: return ALL_GLSL(Sqrt);
case k_inverse_IntrinsicKind: return ALL_GLSL(MatrixInverse);
case k_outerProduct_IntrinsicKind: return ALL_SPIRV(OuterProduct);
case k_transpose_IntrinsicKind: return ALL_SPIRV(Transpose);
case k_isinf_IntrinsicKind: return ALL_SPIRV(IsInf);
case k_isnan_IntrinsicKind: return ALL_SPIRV(IsNan);
case k_inversesqrt_IntrinsicKind: return ALL_GLSL(InverseSqrt);
case k_determinant_IntrinsicKind: return ALL_GLSL(Determinant);
case k_matrixCompMult_IntrinsicKind: return SPECIAL(MatrixCompMult);
case k_matrixInverse_IntrinsicKind: return ALL_GLSL(MatrixInverse);
case k_mod_IntrinsicKind: return SPECIAL(Mod);
case k_modf_IntrinsicKind: return ALL_GLSL(Modf);
case k_min_IntrinsicKind: return SPECIAL(Min);
case k_max_IntrinsicKind: return SPECIAL(Max);
case k_clamp_IntrinsicKind: return SPECIAL(Clamp);
case k_saturate_IntrinsicKind: return SPECIAL(Saturate);
case k_dot_IntrinsicKind: return FLOAT_SPIRV(Dot);
case k_mix_IntrinsicKind: return SPECIAL(Mix);
case k_step_IntrinsicKind: return SPECIAL(Step);
case k_smoothstep_IntrinsicKind: return SPECIAL(SmoothStep);
case k_fma_IntrinsicKind: return ALL_GLSL(Fma);
case k_frexp_IntrinsicKind: return ALL_GLSL(Frexp);
case k_ldexp_IntrinsicKind: return ALL_GLSL(Ldexp);
#define PACK(type) case k_pack##type##_IntrinsicKind: return ALL_GLSL(Pack##type); \
case k_unpack##type##_IntrinsicKind: return ALL_GLSL(Unpack##type)
PACK(Snorm4x8);
PACK(Unorm4x8);
PACK(Snorm2x16);
PACK(Unorm2x16);
PACK(Half2x16);
#undef PACK
case k_length_IntrinsicKind: return ALL_GLSL(Length);
case k_distance_IntrinsicKind: return ALL_GLSL(Distance);
case k_cross_IntrinsicKind: return ALL_GLSL(Cross);
case k_normalize_IntrinsicKind: return ALL_GLSL(Normalize);
case k_faceforward_IntrinsicKind: return ALL_GLSL(FaceForward);
case k_reflect_IntrinsicKind: return ALL_GLSL(Reflect);
case k_refract_IntrinsicKind: return ALL_GLSL(Refract);
case k_bitCount_IntrinsicKind: return ALL_SPIRV(BitCount);
case k_findLSB_IntrinsicKind: return ALL_GLSL(FindILsb);
case k_findMSB_IntrinsicKind: return BY_TYPE_GLSL(FindSMsb, FindSMsb, FindUMsb);
case k_dFdx_IntrinsicKind: return FLOAT_SPIRV(DPdx);
case k_dFdy_IntrinsicKind: return SPECIAL(DFdy);
case k_fwidth_IntrinsicKind: return FLOAT_SPIRV(Fwidth);
case k_sample_IntrinsicKind: return SPECIAL(Texture);
case k_sampleGrad_IntrinsicKind: return SPECIAL(TextureGrad);
case k_sampleLod_IntrinsicKind: return SPECIAL(TextureLod);
case k_subpassLoad_IntrinsicKind: return SPECIAL(SubpassLoad);
case k_textureRead_IntrinsicKind: return SPECIAL(TextureRead);
case k_textureWrite_IntrinsicKind: return SPECIAL(TextureWrite);
case k_textureWidth_IntrinsicKind: return SPECIAL(TextureWidth);
case k_textureHeight_IntrinsicKind: return SPECIAL(TextureHeight);
case k_floatBitsToInt_IntrinsicKind: return ALL_SPIRV(Bitcast);
case k_floatBitsToUint_IntrinsicKind: return ALL_SPIRV(Bitcast);
case k_intBitsToFloat_IntrinsicKind: return ALL_SPIRV(Bitcast);
case k_uintBitsToFloat_IntrinsicKind: return ALL_SPIRV(Bitcast);
case k_any_IntrinsicKind: return BOOL_SPIRV(Any);
case k_all_IntrinsicKind: return BOOL_SPIRV(All);
case k_not_IntrinsicKind: return BOOL_SPIRV(LogicalNot);
case k_equal_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFOrdEqual,
SpvOpIEqual,
SpvOpIEqual,
SpvOpLogicalEqual};
case k_notEqual_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFUnordNotEqual,
SpvOpINotEqual,
SpvOpINotEqual,
SpvOpLogicalNotEqual};
case k_lessThan_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFOrdLessThan,
SpvOpSLessThan,
SpvOpULessThan,
SpvOpUndef};
case k_lessThanEqual_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFOrdLessThanEqual,
SpvOpSLessThanEqual,
SpvOpULessThanEqual,
SpvOpUndef};
case k_greaterThan_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFOrdGreaterThan,
SpvOpSGreaterThan,
SpvOpUGreaterThan,
SpvOpUndef};
case k_greaterThanEqual_IntrinsicKind:
return Intrinsic{kSPIRV_IntrinsicOpcodeKind,
SpvOpFOrdGreaterThanEqual,
SpvOpSGreaterThanEqual,
SpvOpUGreaterThanEqual,
SpvOpUndef};
case k_atomicAdd_IntrinsicKind: return SPECIAL(AtomicAdd);
case k_atomicLoad_IntrinsicKind: return SPECIAL(AtomicLoad);
case k_atomicStore_IntrinsicKind: return SPECIAL(AtomicStore);
case k_storageBarrier_IntrinsicKind: return SPECIAL(StorageBarrier);
case k_workgroupBarrier_IntrinsicKind: return SPECIAL(WorkgroupBarrier);
default:
return Intrinsic{kInvalid_IntrinsicOpcodeKind, 0, 0, 0, 0};
}
}