From da53608ebecd23bf3c1ac0ff6c390bfd43242814 Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Mon, 17 Jan 2022 11:39:37 -0500 Subject: [PATCH 1/4] [spirv] support vk::ext_execution_mode_id(..) --- include/dxc/HlslIntrinsicOp.h | 3 + lib/HLSL/HLOperationLower.cpp | 656 ++++++++++++------ .../clang/include/clang/SPIRV/SpirvBuilder.h | 9 +- tools/clang/lib/SPIRV/EmitVisitor.cpp | 12 +- tools/clang/lib/SPIRV/SpirvEmitter.cpp | 27 +- tools/clang/lib/SPIRV/SpirvEmitter.h | 3 +- .../spv.intrinsicExecutionModeId.hlsl | 10 + .../unittests/SPIRV/CodeGenSpirvTest.cpp | 1 + utils/hct/gen_intrin_main.txt | 3 +- 9 files changed, 490 insertions(+), 234 deletions(-) create mode 100644 tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl diff --git a/include/dxc/HlslIntrinsicOp.h b/include/dxc/HlslIntrinsicOp.h index e342255f2d..a3897b2d0c 100644 --- a/include/dxc/HlslIntrinsicOp.h +++ b/include/dxc/HlslIntrinsicOp.h @@ -229,6 +229,9 @@ enum class IntrinsicOp { IOP_AcceptHitAndEndSearch, #endif // ENABLE_SPIRV_CODEGEN #ifdef ENABLE_SPIRV_CODEGEN IOP_Vkext_execution_mode, +#endif // ENABLE_SPIRV_CODEGEN +#ifdef ENABLE_SPIRV_CODEGEN + IOP_Vkext_execution_mode_id, #endif // ENABLE_SPIRV_CODEGEN MOP_Append, MOP_RestartStrip, diff --git a/lib/HLSL/HLOperationLower.cpp b/lib/HLSL/HLOperationLower.cpp index 7c4d2217f1..df913a64bf 100644 --- a/lib/HLSL/HLOperationLower.cpp +++ b/lib/HLSL/HLOperationLower.cpp @@ -5442,104 +5442,198 @@ Value *StreamOutputLower(CallInst *CI, IntrinsicOp IOP, DXIL::OpCode opcode, // This table has to match IntrinsicOp orders IntrinsicLower gLowerTable[] = { - {IntrinsicOp::IOP_AcceptHitAndEndSearch, TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::AcceptHitAndEndSearch}, - {IntrinsicOp::IOP_AddUint64, TranslateAddUint64, DXIL::OpCode::UAddc}, + {IntrinsicOp::IOP_AcceptHitAndEndSearch, + TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::AcceptHitAndEndSearch}, + {IntrinsicOp::IOP_AddUint64, TranslateAddUint64, DXIL::OpCode::UAddc}, {IntrinsicOp::IOP_AllMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, DXIL::OpCode::AllocateRayQuery}, - {IntrinsicOp::IOP_CallShader, TranslateCallShader, DXIL::OpCode::CallShader}, - {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, DXIL::OpCode::CheckAccessFullyMapped}, - {IntrinsicOp::IOP_CreateResourceFromHeap, TranslateGetHandleFromHeap, DXIL::OpCode::CreateHandleFromHeap}, - {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_DispatchMesh, TrivialDispatchMesh, DXIL::OpCode::DispatchMesh }, - {IntrinsicOp::IOP_DispatchRaysDimensions, TranslateNoArgVectorOperation, DXIL::OpCode::DispatchRaysDimensions}, - {IntrinsicOp::IOP_DispatchRaysIndex, TranslateNoArgVectorOperation, DXIL::OpCode::DispatchRaysIndex}, - {IntrinsicOp::IOP_EvaluateAttributeAtSample, TranslateEvalSample, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_EvaluateAttributeCentroid, TranslateEvalCentroid, DXIL::OpCode::EvalCentroid}, - {IntrinsicOp::IOP_EvaluateAttributeSnapped, TranslateEvalSnapped, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_GeometryIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::GeometryIndex}, - {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, DXIL::OpCode::AttributeAtVertex}, - {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, DXIL::OpCode::RenderTargetGetSampleCount}, - {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, DXIL::OpCode::HitKind}, - {IntrinsicOp::IOP_IgnoreHit, TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::IgnoreHit}, - {IntrinsicOp::IOP_InstanceID, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceID}, - {IntrinsicOp::IOP_InstanceIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceIndex}, - {IntrinsicOp::IOP_InterlockedAdd, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedAnd, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareExchange, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareExchangeFloatBitwise, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareStore, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareStoreFloatBitwise, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedExchange, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedMax, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedMin, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedOr, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedXor, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_IsHelperLane, TrivialNoArgWithRetOperation, DXIL::OpCode::IsHelperLane}, - {IntrinsicOp::IOP_NonUniformResourceIndex, TranslateNonUniformResourceIndex, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ObjectRayDirection, TranslateNoArgVectorOperation, DXIL::OpCode::ObjectRayDirection}, - {IntrinsicOp::IOP_ObjectRayOrigin, TranslateNoArgVectorOperation, DXIL::OpCode::ObjectRayOrigin}, - {IntrinsicOp::IOP_ObjectToWorld, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_ObjectToWorld3x4, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_ObjectToWorld4x3, TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_PrimitiveIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::PrimitiveIndex}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessIsolineTessFactors, TranslateProcessIsolineTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_QuadReadAcrossDiagonal, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadAcrossX, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadAcrossY, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadLaneAt, TranslateQuadReadLaneAt, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_RayFlags, TrivialNoArgWithRetOperation, DXIL::OpCode::RayFlags}, - {IntrinsicOp::IOP_RayTCurrent, TrivialNoArgWithRetOperation, DXIL::OpCode::RayTCurrent}, - {IntrinsicOp::IOP_RayTMin, TrivialNoArgWithRetOperation, DXIL::OpCode::RayTMin}, - {IntrinsicOp::IOP_ReportHit, TranslateReportIntersection, DXIL::OpCode::ReportHit}, - {IntrinsicOp::IOP_SetMeshOutputCounts, TrivialSetMeshOutputCounts, DXIL::OpCode::SetMeshOutputCounts}, + {IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, TrivialBarrier, + DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, + DXIL::OpCode::AllocateRayQuery}, + {IntrinsicOp::IOP_CallShader, TranslateCallShader, + DXIL::OpCode::CallShader}, + {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, + DXIL::OpCode::CheckAccessFullyMapped}, + {IntrinsicOp::IOP_CreateResourceFromHeap, TranslateGetHandleFromHeap, + DXIL::OpCode::CreateHandleFromHeap}, + {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, + DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, + DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_DispatchMesh, TrivialDispatchMesh, + DXIL::OpCode::DispatchMesh}, + {IntrinsicOp::IOP_DispatchRaysDimensions, TranslateNoArgVectorOperation, + DXIL::OpCode::DispatchRaysDimensions}, + {IntrinsicOp::IOP_DispatchRaysIndex, TranslateNoArgVectorOperation, + DXIL::OpCode::DispatchRaysIndex}, + {IntrinsicOp::IOP_EvaluateAttributeAtSample, TranslateEvalSample, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_EvaluateAttributeCentroid, TranslateEvalCentroid, + DXIL::OpCode::EvalCentroid}, + {IntrinsicOp::IOP_EvaluateAttributeSnapped, TranslateEvalSnapped, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_GeometryIndex, TrivialNoArgWithRetOperation, + DXIL::OpCode::GeometryIndex}, + {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, + DXIL::OpCode::AttributeAtVertex}, + {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, + DXIL::OpCode::RenderTargetGetSampleCount}, + {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, + DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, + DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, + DXIL::OpCode::HitKind}, + {IntrinsicOp::IOP_IgnoreHit, TranslateNoArgNoReturnPreserveOutput, + DXIL::OpCode::IgnoreHit}, + {IntrinsicOp::IOP_InstanceID, TrivialNoArgWithRetOperation, + DXIL::OpCode::InstanceID}, + {IntrinsicOp::IOP_InstanceIndex, TrivialNoArgWithRetOperation, + DXIL::OpCode::InstanceIndex}, + {IntrinsicOp::IOP_InterlockedAdd, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedAnd, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareExchange, TranslateIopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareExchangeFloatBitwise, + TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareStore, TranslateIopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareStoreFloatBitwise, + TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedExchange, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedMax, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedMin, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedOr, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedXor, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_IsHelperLane, TrivialNoArgWithRetOperation, + DXIL::OpCode::IsHelperLane}, + {IntrinsicOp::IOP_NonUniformResourceIndex, TranslateNonUniformResourceIndex, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ObjectRayDirection, TranslateNoArgVectorOperation, + DXIL::OpCode::ObjectRayDirection}, + {IntrinsicOp::IOP_ObjectRayOrigin, TranslateNoArgVectorOperation, + DXIL::OpCode::ObjectRayOrigin}, + {IntrinsicOp::IOP_ObjectToWorld, TranslateNoArgMatrix3x4Operation, + DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_ObjectToWorld3x4, TranslateNoArgMatrix3x4Operation, + DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_ObjectToWorld4x3, + TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_PrimitiveIndex, TrivialNoArgWithRetOperation, + DXIL::OpCode::PrimitiveIndex}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsAvg, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsMax, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsMin, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessIsolineTessFactors, + TranslateProcessIsolineTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsAvg, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsMax, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsMin, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsAvg, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsMax, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsMin, TranslateProcessTessFactors, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_QuadReadAcrossDiagonal, TranslateQuadReadAcross, + DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadAcrossX, TranslateQuadReadAcross, + DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadAcrossY, TranslateQuadReadAcross, + DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadLaneAt, TranslateQuadReadLaneAt, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_RayFlags, TrivialNoArgWithRetOperation, + DXIL::OpCode::RayFlags}, + {IntrinsicOp::IOP_RayTCurrent, TrivialNoArgWithRetOperation, + DXIL::OpCode::RayTCurrent}, + {IntrinsicOp::IOP_RayTMin, TrivialNoArgWithRetOperation, + DXIL::OpCode::RayTMin}, + {IntrinsicOp::IOP_ReportHit, TranslateReportIntersection, + DXIL::OpCode::ReportHit}, + {IntrinsicOp::IOP_SetMeshOutputCounts, TrivialSetMeshOutputCounts, + DXIL::OpCode::SetMeshOutputCounts}, {IntrinsicOp::IOP_TraceRay, TranslateTraceRay, DXIL::OpCode::TraceRay}, - {IntrinsicOp::IOP_WaveActiveAllEqual, TranslateWaveAllEqual, DXIL::OpCode::WaveActiveAllEqual}, - {IntrinsicOp::IOP_WaveActiveAllTrue, TranslateWaveA2B, DXIL::OpCode::WaveAllTrue}, - {IntrinsicOp::IOP_WaveActiveAnyTrue, TranslateWaveA2B, DXIL::OpCode::WaveAnyTrue}, - {IntrinsicOp::IOP_WaveActiveBallot, TranslateWaveBallot, DXIL::OpCode::WaveActiveBallot}, - {IntrinsicOp::IOP_WaveActiveBitAnd, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveBitOr, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveBitXor, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveCountBits, TranslateWaveA2B, DXIL::OpCode::WaveAllBitCount}, - {IntrinsicOp::IOP_WaveActiveMax, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveMin, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveProduct, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveSum, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveGetLaneCount, TranslateWaveToVal, DXIL::OpCode::WaveGetLaneCount}, - {IntrinsicOp::IOP_WaveGetLaneIndex, TranslateWaveToVal, DXIL::OpCode::WaveGetLaneIndex}, - {IntrinsicOp::IOP_WaveIsFirstLane, TranslateWaveToVal, DXIL::OpCode::WaveIsFirstLane}, + {IntrinsicOp::IOP_WaveActiveAllEqual, TranslateWaveAllEqual, + DXIL::OpCode::WaveActiveAllEqual}, + {IntrinsicOp::IOP_WaveActiveAllTrue, TranslateWaveA2B, + DXIL::OpCode::WaveAllTrue}, + {IntrinsicOp::IOP_WaveActiveAnyTrue, TranslateWaveA2B, + DXIL::OpCode::WaveAnyTrue}, + {IntrinsicOp::IOP_WaveActiveBallot, TranslateWaveBallot, + DXIL::OpCode::WaveActiveBallot}, + {IntrinsicOp::IOP_WaveActiveBitAnd, TranslateWaveA2A, + DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveBitOr, TranslateWaveA2A, + DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveBitXor, TranslateWaveA2A, + DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveCountBits, TranslateWaveA2B, + DXIL::OpCode::WaveAllBitCount}, + {IntrinsicOp::IOP_WaveActiveMax, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveMin, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveProduct, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveSum, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveGetLaneCount, TranslateWaveToVal, + DXIL::OpCode::WaveGetLaneCount}, + {IntrinsicOp::IOP_WaveGetLaneIndex, TranslateWaveToVal, + DXIL::OpCode::WaveGetLaneIndex}, + {IntrinsicOp::IOP_WaveIsFirstLane, TranslateWaveToVal, + DXIL::OpCode::WaveIsFirstLane}, {IntrinsicOp::IOP_WaveMatch, TranslateWaveMatch, DXIL::OpCode::WaveMatch}, - {IntrinsicOp::IOP_WaveMultiPrefixBitAnd, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixBitOr, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixBitXor, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixCountBits, TranslateWaveMultiPrefixBitCount, DXIL::OpCode::WaveMultiPrefixBitCount}, - {IntrinsicOp::IOP_WaveMultiPrefixProduct, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixSum, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WavePrefixCountBits, TranslateWaveA2B, DXIL::OpCode::WavePrefixBitCount}, - {IntrinsicOp::IOP_WavePrefixProduct, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_WavePrefixSum, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_WaveReadLaneAt, TranslateWaveReadLaneAt, DXIL::OpCode::WaveReadLaneAt}, - {IntrinsicOp::IOP_WaveReadLaneFirst, TranslateWaveReadLaneFirst, DXIL::OpCode::WaveReadLaneFirst}, - {IntrinsicOp::IOP_WorldRayDirection, TranslateNoArgVectorOperation, DXIL::OpCode::WorldRayDirection}, - {IntrinsicOp::IOP_WorldRayOrigin, TranslateNoArgVectorOperation, DXIL::OpCode::WorldRayOrigin}, - {IntrinsicOp::IOP_WorldToObject, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::WorldToObject}, - {IntrinsicOp::IOP_WorldToObject3x4, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::WorldToObject}, - {IntrinsicOp::IOP_WorldToObject4x3, TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WaveMultiPrefixBitAnd, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixBitOr, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixBitXor, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixCountBits, + TranslateWaveMultiPrefixBitCount, DXIL::OpCode::WaveMultiPrefixBitCount}, + {IntrinsicOp::IOP_WaveMultiPrefixProduct, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixSum, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WavePrefixCountBits, TranslateWaveA2B, + DXIL::OpCode::WavePrefixBitCount}, + {IntrinsicOp::IOP_WavePrefixProduct, TranslateWaveA2A, + DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_WavePrefixSum, TranslateWaveA2A, + DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_WaveReadLaneAt, TranslateWaveReadLaneAt, + DXIL::OpCode::WaveReadLaneAt}, + {IntrinsicOp::IOP_WaveReadLaneFirst, TranslateWaveReadLaneFirst, + DXIL::OpCode::WaveReadLaneFirst}, + {IntrinsicOp::IOP_WorldRayDirection, TranslateNoArgVectorOperation, + DXIL::OpCode::WorldRayDirection}, + {IntrinsicOp::IOP_WorldRayOrigin, TranslateNoArgVectorOperation, + DXIL::OpCode::WorldRayOrigin}, + {IntrinsicOp::IOP_WorldToObject, TranslateNoArgMatrix3x4Operation, + DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WorldToObject3x4, TranslateNoArgMatrix3x4Operation, + DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WorldToObject4x3, + TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::WorldToObject}, {IntrinsicOp::IOP_abort, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_abs, TranslateAbs, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_acos, TrivialUnaryOperation, DXIL::OpCode::Acos}, @@ -5561,29 +5655,41 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_clip, TranslateClip, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_cos, TrivialUnaryOperation, DXIL::OpCode::Cos}, {IntrinsicOp::IOP_cosh, TrivialUnaryOperation, DXIL::OpCode::Hcos}, - {IntrinsicOp::IOP_countbits, TrivialUnaryOperation, DXIL::OpCode::Countbits}, + {IntrinsicOp::IOP_countbits, TrivialUnaryOperation, + DXIL::OpCode::Countbits}, {IntrinsicOp::IOP_cross, TranslateCross, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_ddx, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseX}, - {IntrinsicOp::IOP_ddx_coarse, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseX}, - {IntrinsicOp::IOP_ddx_fine, TrivialUnaryOperation, DXIL::OpCode::DerivFineX}, + {IntrinsicOp::IOP_ddx_coarse, TrivialUnaryOperation, + DXIL::OpCode::DerivCoarseX}, + {IntrinsicOp::IOP_ddx_fine, TrivialUnaryOperation, + DXIL::OpCode::DerivFineX}, {IntrinsicOp::IOP_ddy, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseY}, - {IntrinsicOp::IOP_ddy_coarse, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseY}, - {IntrinsicOp::IOP_ddy_fine, TrivialUnaryOperation, DXIL::OpCode::DerivFineY}, + {IntrinsicOp::IOP_ddy_coarse, TrivialUnaryOperation, + DXIL::OpCode::DerivCoarseY}, + {IntrinsicOp::IOP_ddy_fine, TrivialUnaryOperation, + DXIL::OpCode::DerivFineY}, {IntrinsicOp::IOP_degrees, TranslateDegrees, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_determinant, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_distance, TranslateDistance, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_dot, TranslateDot, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_dot2add, TranslateDot2Add, DXIL::OpCode::Dot2AddHalf}, - {IntrinsicOp::IOP_dot4add_i8packed, TranslateDot4AddPacked, DXIL::OpCode::Dot4AddI8Packed}, - {IntrinsicOp::IOP_dot4add_u8packed, TranslateDot4AddPacked, DXIL::OpCode::Dot4AddU8Packed}, + {IntrinsicOp::IOP_dot4add_i8packed, TranslateDot4AddPacked, + DXIL::OpCode::Dot4AddI8Packed}, + {IntrinsicOp::IOP_dot4add_u8packed, TranslateDot4AddPacked, + DXIL::OpCode::Dot4AddU8Packed}, {IntrinsicOp::IOP_dst, TranslateDst, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_exp, TranslateExp, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_exp2, TrivialUnaryOperation, DXIL::OpCode::Exp}, - {IntrinsicOp::IOP_f16tof32, TranslateF16ToF32, DXIL::OpCode::LegacyF16ToF32}, - {IntrinsicOp::IOP_f32tof16, TranslateF32ToF16, DXIL::OpCode::LegacyF32ToF16}, - {IntrinsicOp::IOP_faceforward, TranslateFaceforward, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_firstbithigh, TranslateFirstbitHi, DXIL::OpCode::FirstbitSHi}, - {IntrinsicOp::IOP_firstbitlow, TranslateFirstbitLo, DXIL::OpCode::FirstbitLo}, + {IntrinsicOp::IOP_f16tof32, TranslateF16ToF32, + DXIL::OpCode::LegacyF16ToF32}, + {IntrinsicOp::IOP_f32tof16, TranslateF32ToF16, + DXIL::OpCode::LegacyF32ToF16}, + {IntrinsicOp::IOP_faceforward, TranslateFaceforward, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_firstbithigh, TranslateFirstbitHi, + DXIL::OpCode::FirstbitSHi}, + {IntrinsicOp::IOP_firstbitlow, TranslateFirstbitLo, + DXIL::OpCode::FirstbitLo}, {IntrinsicOp::IOP_floor, TrivialUnaryOperation, DXIL::OpCode::Round_ni}, {IntrinsicOp::IOP_fma, TrivialTrinaryOperation, DXIL::OpCode::Fma}, {IntrinsicOp::IOP_fmod, TranslateFMod, DXIL::OpCode::NumOpCodes}, @@ -5608,10 +5714,10 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_mul, TranslateMul, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_normalize, TranslateNormalize, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_or, TranslateOr, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_pack_clamp_s8, TranslatePack, DXIL::OpCode::Pack4x8 }, - {IntrinsicOp::IOP_pack_clamp_u8, TranslatePack, DXIL::OpCode::Pack4x8 }, - {IntrinsicOp::IOP_pack_s8, TranslatePack, DXIL::OpCode::Pack4x8 }, - {IntrinsicOp::IOP_pack_u8, TranslatePack, DXIL::OpCode::Pack4x8 }, + {IntrinsicOp::IOP_pack_clamp_s8, TranslatePack, DXIL::OpCode::Pack4x8}, + {IntrinsicOp::IOP_pack_clamp_u8, TranslatePack, DXIL::OpCode::Pack4x8}, + {IntrinsicOp::IOP_pack_s8, TranslatePack, DXIL::OpCode::Pack4x8}, + {IntrinsicOp::IOP_pack_u8, TranslatePack, DXIL::OpCode::Pack4x8}, {IntrinsicOp::IOP_pow, TranslatePow, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_printf, TranslatePrintf, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_radians, TranslateRadians, DXIL::OpCode::NumOpCodes}, @@ -5627,7 +5733,8 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_sin, TrivialUnaryOperation, DXIL::OpCode::Sin}, {IntrinsicOp::IOP_sincos, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_sinh, TrivialUnaryOperation, DXIL::OpCode::Hsin}, - {IntrinsicOp::IOP_smoothstep, TranslateSmoothStep, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_smoothstep, TranslateSmoothStep, + DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_source_mark, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_sqrt, TrivialUnaryOperation, DXIL::OpCode::Sqrt}, {IntrinsicOp::IOP_step, TranslateStep, DXIL::OpCode::NumOpCodes}, @@ -5660,137 +5767,254 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_unpack_u8u16, TranslateUnpack, DXIL::OpCode::Unpack4x8}, {IntrinsicOp::IOP_unpack_u8u32, TranslateUnpack, DXIL::OpCode::Unpack4x8}, #ifdef ENABLE_SPIRV_CODEGEN - { IntrinsicOp::IOP_VkReadClock, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_VkRawBufferLoad, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_Vkext_execution_mode, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, + {IntrinsicOp::IOP_VkReadClock, UnsupportedVulkanIntrinsic, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_VkRawBufferLoad, UnsupportedVulkanIntrinsic, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Vkext_execution_mode, UnsupportedVulkanIntrinsic, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Vkext_execution_mode_id, UnsupportedVulkanIntrinsic, + DXIL::OpCode::NumOpCodes}, #endif // ENABLE_SPIRV_CODEGEN {IntrinsicOp::MOP_Append, StreamOutputLower, DXIL::OpCode::EmitStream}, {IntrinsicOp::MOP_RestartStrip, StreamOutputLower, DXIL::OpCode::CutStream}, - {IntrinsicOp::MOP_CalculateLevelOfDetail, TranslateCalculateLOD, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_CalculateLevelOfDetailUnclamped, TranslateCalculateLOD, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_GetDimensions, TranslateGetDimensions, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_CalculateLevelOfDetail, TranslateCalculateLOD, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_CalculateLevelOfDetailUnclamped, TranslateCalculateLOD, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_GetDimensions, TranslateGetDimensions, + DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Sample, TranslateSample, DXIL::OpCode::Sample}, {IntrinsicOp::MOP_SampleBias, TranslateSample, DXIL::OpCode::SampleBias}, {IntrinsicOp::MOP_SampleCmp, TranslateSample, DXIL::OpCode::SampleCmp}, - {IntrinsicOp::MOP_SampleCmpLevelZero, TranslateSample, DXIL::OpCode::SampleCmpLevelZero}, + {IntrinsicOp::MOP_SampleCmpLevelZero, TranslateSample, + DXIL::OpCode::SampleCmpLevelZero}, {IntrinsicOp::MOP_SampleGrad, TranslateSample, DXIL::OpCode::SampleGrad}, {IntrinsicOp::MOP_SampleLevel, TranslateSample, DXIL::OpCode::SampleLevel}, {IntrinsicOp::MOP_Gather, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GatherAlpha, TranslateGather, DXIL::OpCode::TextureGather}, + {IntrinsicOp::MOP_GatherAlpha, TranslateGather, + DXIL::OpCode::TextureGather}, {IntrinsicOp::MOP_GatherBlue, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GatherCmp, TranslateGather, DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpAlpha, TranslateGather, DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpBlue, TranslateGather, DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpGreen, TranslateGather, DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpRed, TranslateGather, DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherGreen, TranslateGather, DXIL::OpCode::TextureGather}, + {IntrinsicOp::MOP_GatherCmp, TranslateGather, + DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpAlpha, TranslateGather, + DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpBlue, TranslateGather, + DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpGreen, TranslateGather, + DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpRed, TranslateGather, + DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherGreen, TranslateGather, + DXIL::OpCode::TextureGather}, {IntrinsicOp::MOP_GatherRed, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GetSamplePosition, TranslateGetSamplePosition, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_GetSamplePosition, TranslateGetSamplePosition, + DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load2, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load3, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load4, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAdd, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAdd64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAnd, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAnd64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchange, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchange64, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchangeFloatBitwise, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStore, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStore64, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStoreFloatBitwise, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchange, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchange64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchangeFloat, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMax, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMax64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMin, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMin64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedOr, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedOr64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedXor, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedXor64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAdd, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAdd64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAnd, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAnd64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchange, TranslateMopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchange64, TranslateMopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchangeFloatBitwise, + TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStore, TranslateMopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStore64, TranslateMopAtomicCmpXChg, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStoreFloatBitwise, + TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchange, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchange64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchangeFloat, + TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMax, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMax64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMin, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMin64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedOr, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedOr64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedXor, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedXor64, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store2, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store3, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store4, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_DecrementCounter, GenerateUpdateCounter, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_IncrementCounter, GenerateUpdateCounter, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_DecrementCounter, GenerateUpdateCounter, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_IncrementCounter, GenerateUpdateCounter, + DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Consume, EmptyLower, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_WriteSamplerFeedback, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedback}, - {IntrinsicOp::MOP_WriteSamplerFeedbackBias, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackBias}, - {IntrinsicOp::MOP_WriteSamplerFeedbackGrad, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackGrad}, - {IntrinsicOp::MOP_WriteSamplerFeedbackLevel, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackLevel}, - - {IntrinsicOp::MOP_Abort, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_Abort}, - {IntrinsicOp::MOP_CandidateGeometryIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateGeometryIndex}, - {IntrinsicOp::MOP_CandidateInstanceContributionToHitGroupIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex}, - {IntrinsicOp::MOP_CandidateInstanceID, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceID}, - {IntrinsicOp::MOP_CandidateInstanceIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceIndex}, - {IntrinsicOp::MOP_CandidateObjectRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CandidateObjectRayDirection}, - {IntrinsicOp::MOP_CandidateObjectRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CandidateObjectRayOrigin}, - {IntrinsicOp::MOP_CandidateObjectToWorld3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, - {IntrinsicOp::MOP_CandidateObjectToWorld4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, - {IntrinsicOp::MOP_CandidatePrimitiveIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidatePrimitiveIndex}, - {IntrinsicOp::MOP_CandidateProceduralPrimitiveNonOpaque, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque}, - {IntrinsicOp::MOP_CandidateTriangleBarycentrics, TranslateRayQueryFloat2Getter, DXIL::OpCode::RayQuery_CandidateTriangleBarycentrics}, - {IntrinsicOp::MOP_CandidateTriangleFrontFace, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateTriangleFrontFace}, - {IntrinsicOp::MOP_CandidateTriangleRayT, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateTriangleRayT}, - {IntrinsicOp::MOP_CandidateType, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateType}, - {IntrinsicOp::MOP_CandidateWorldToObject3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, - {IntrinsicOp::MOP_CandidateWorldToObject4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, - {IntrinsicOp::MOP_CommitNonOpaqueTriangleHit, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommitNonOpaqueTriangleHit}, - {IntrinsicOp::MOP_CommitProceduralPrimitiveHit, TranslateCommitProceduralPrimitiveHit, DXIL::OpCode::RayQuery_CommitProceduralPrimitiveHit}, - {IntrinsicOp::MOP_CommittedGeometryIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedGeometryIndex}, - {IntrinsicOp::MOP_CommittedInstanceContributionToHitGroupIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex}, - {IntrinsicOp::MOP_CommittedInstanceID, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceID}, - {IntrinsicOp::MOP_CommittedInstanceIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceIndex}, - {IntrinsicOp::MOP_CommittedObjectRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CommittedObjectRayDirection}, - {IntrinsicOp::MOP_CommittedObjectRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CommittedObjectRayOrigin}, - {IntrinsicOp::MOP_CommittedObjectToWorld3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, - {IntrinsicOp::MOP_CommittedObjectToWorld4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, - {IntrinsicOp::MOP_CommittedPrimitiveIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedPrimitiveIndex}, - {IntrinsicOp::MOP_CommittedRayT, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedRayT}, - {IntrinsicOp::MOP_CommittedStatus, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedStatus}, - {IntrinsicOp::MOP_CommittedTriangleBarycentrics, TranslateRayQueryFloat2Getter, DXIL::OpCode::RayQuery_CommittedTriangleBarycentrics}, - {IntrinsicOp::MOP_CommittedTriangleFrontFace, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedTriangleFrontFace}, - {IntrinsicOp::MOP_CommittedWorldToObject3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, - {IntrinsicOp::MOP_CommittedWorldToObject4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, - {IntrinsicOp::MOP_Proceed, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_Proceed}, - {IntrinsicOp::MOP_RayFlags, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_RayFlags}, - {IntrinsicOp::MOP_RayTMin, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_RayTMin}, - {IntrinsicOp::MOP_TraceRayInline, TranslateTraceRayInline, DXIL::OpCode::RayQuery_TraceRayInline}, - {IntrinsicOp::MOP_WorldRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_WorldRayDirection}, - {IntrinsicOp::MOP_WorldRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_WorldRayOrigin}, + {IntrinsicOp::MOP_WriteSamplerFeedback, TranslateWriteSamplerFeedback, + DXIL::OpCode::WriteSamplerFeedback}, + {IntrinsicOp::MOP_WriteSamplerFeedbackBias, TranslateWriteSamplerFeedback, + DXIL::OpCode::WriteSamplerFeedbackBias}, + {IntrinsicOp::MOP_WriteSamplerFeedbackGrad, TranslateWriteSamplerFeedback, + DXIL::OpCode::WriteSamplerFeedbackGrad}, + {IntrinsicOp::MOP_WriteSamplerFeedbackLevel, TranslateWriteSamplerFeedback, + DXIL::OpCode::WriteSamplerFeedbackLevel}, + + {IntrinsicOp::MOP_Abort, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_Abort}, + {IntrinsicOp::MOP_CandidateGeometryIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateGeometryIndex}, + {IntrinsicOp::MOP_CandidateInstanceContributionToHitGroupIndex, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex}, + {IntrinsicOp::MOP_CandidateInstanceID, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateInstanceID}, + {IntrinsicOp::MOP_CandidateInstanceIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateInstanceIndex}, + {IntrinsicOp::MOP_CandidateObjectRayDirection, + TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_CandidateObjectRayDirection}, + {IntrinsicOp::MOP_CandidateObjectRayOrigin, TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_CandidateObjectRayOrigin}, + {IntrinsicOp::MOP_CandidateObjectToWorld3x4, + TranslateRayQueryMatrix3x4Operation, + DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, + {IntrinsicOp::MOP_CandidateObjectToWorld4x3, + TranslateRayQueryTransposedMatrix3x4Operation, + DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, + {IntrinsicOp::MOP_CandidatePrimitiveIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidatePrimitiveIndex}, + {IntrinsicOp::MOP_CandidateProceduralPrimitiveNonOpaque, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque}, + {IntrinsicOp::MOP_CandidateTriangleBarycentrics, + TranslateRayQueryFloat2Getter, + DXIL::OpCode::RayQuery_CandidateTriangleBarycentrics}, + {IntrinsicOp::MOP_CandidateTriangleFrontFace, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateTriangleFrontFace}, + {IntrinsicOp::MOP_CandidateTriangleRayT, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateTriangleRayT}, + {IntrinsicOp::MOP_CandidateType, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CandidateType}, + {IntrinsicOp::MOP_CandidateWorldToObject3x4, + TranslateRayQueryMatrix3x4Operation, + DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, + {IntrinsicOp::MOP_CandidateWorldToObject4x3, + TranslateRayQueryTransposedMatrix3x4Operation, + DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, + {IntrinsicOp::MOP_CommitNonOpaqueTriangleHit, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommitNonOpaqueTriangleHit}, + {IntrinsicOp::MOP_CommitProceduralPrimitiveHit, + TranslateCommitProceduralPrimitiveHit, + DXIL::OpCode::RayQuery_CommitProceduralPrimitiveHit}, + {IntrinsicOp::MOP_CommittedGeometryIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedGeometryIndex}, + {IntrinsicOp::MOP_CommittedInstanceContributionToHitGroupIndex, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex}, + {IntrinsicOp::MOP_CommittedInstanceID, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedInstanceID}, + {IntrinsicOp::MOP_CommittedInstanceIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedInstanceIndex}, + {IntrinsicOp::MOP_CommittedObjectRayDirection, + TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_CommittedObjectRayDirection}, + {IntrinsicOp::MOP_CommittedObjectRayOrigin, TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_CommittedObjectRayOrigin}, + {IntrinsicOp::MOP_CommittedObjectToWorld3x4, + TranslateRayQueryMatrix3x4Operation, + DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, + {IntrinsicOp::MOP_CommittedObjectToWorld4x3, + TranslateRayQueryTransposedMatrix3x4Operation, + DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, + {IntrinsicOp::MOP_CommittedPrimitiveIndex, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedPrimitiveIndex}, + {IntrinsicOp::MOP_CommittedRayT, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedRayT}, + {IntrinsicOp::MOP_CommittedStatus, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedStatus}, + {IntrinsicOp::MOP_CommittedTriangleBarycentrics, + TranslateRayQueryFloat2Getter, + DXIL::OpCode::RayQuery_CommittedTriangleBarycentrics}, + {IntrinsicOp::MOP_CommittedTriangleFrontFace, + TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_CommittedTriangleFrontFace}, + {IntrinsicOp::MOP_CommittedWorldToObject3x4, + TranslateRayQueryMatrix3x4Operation, + DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, + {IntrinsicOp::MOP_CommittedWorldToObject4x3, + TranslateRayQueryTransposedMatrix3x4Operation, + DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, + {IntrinsicOp::MOP_Proceed, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_Proceed}, + {IntrinsicOp::MOP_RayFlags, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_RayFlags}, + {IntrinsicOp::MOP_RayTMin, TranslateGenericRayQueryMethod, + DXIL::OpCode::RayQuery_RayTMin}, + {IntrinsicOp::MOP_TraceRayInline, TranslateTraceRayInline, + DXIL::OpCode::RayQuery_TraceRayInline}, + {IntrinsicOp::MOP_WorldRayDirection, TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_WorldRayDirection}, + {IntrinsicOp::MOP_WorldRayOrigin, TranslateRayQueryFloat3Getter, + DXIL::OpCode::RayQuery_WorldRayOrigin}, // SPIRV change starts #ifdef ENABLE_SPIRV_CODEGEN - {IntrinsicOp::MOP_SubpassLoad, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_SubpassLoad, UnsupportedVulkanIntrinsic, + DXIL::OpCode::NumOpCodes}, #endif // ENABLE_SPIRV_CODEGEN // SPIRV change ends // Manully added part. - { IntrinsicOp::IOP_InterlockedUMax, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_InterlockedUMin, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_WaveActiveUMax, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, - { IntrinsicOp::IOP_WaveActiveUMin, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, - { IntrinsicOp::IOP_WaveActiveUProduct, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, - { IntrinsicOp::IOP_WaveActiveUSum, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, - { IntrinsicOp::IOP_WaveMultiPrefixUProduct, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp }, - { IntrinsicOp::IOP_WaveMultiPrefixUSum, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp }, - { IntrinsicOp::IOP_WavePrefixUProduct, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp }, - { IntrinsicOp::IOP_WavePrefixUSum, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp }, - { IntrinsicOp::IOP_uabs, TranslateUAbs, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_uclamp, TranslateClamp, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::IOP_ufirstbithigh, TranslateFirstbitHi, DXIL::OpCode::FirstbitHi }, - { IntrinsicOp::IOP_umad, TranslateFUITrinary, DXIL::OpCode::UMad}, - { IntrinsicOp::IOP_umax, TranslateFUIBinary, DXIL::OpCode::UMax}, - { IntrinsicOp::IOP_umin, TranslateFUIBinary, DXIL::OpCode::UMin }, - { IntrinsicOp::IOP_umul, TranslateMul, DXIL::OpCode::UMul }, - { IntrinsicOp::IOP_usign, TranslateUSign, DXIL::OpCode::UMax }, - { IntrinsicOp::MOP_InterlockedUMax, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, - { IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, + {IntrinsicOp::IOP_InterlockedUMax, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedUMin, TranslateIopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_WaveActiveUMax, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveUMin, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveUProduct, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveUSum, TranslateWaveA2A, + DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveMultiPrefixUProduct, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixUSum, TranslateWaveMultiPrefix, + DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WavePrefixUProduct, TranslateWaveA2A, + DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_WavePrefixUSum, TranslateWaveA2A, + DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_uabs, TranslateUAbs, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_uclamp, TranslateClamp, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ufirstbithigh, TranslateFirstbitHi, + DXIL::OpCode::FirstbitHi}, + {IntrinsicOp::IOP_umad, TranslateFUITrinary, DXIL::OpCode::UMad}, + {IntrinsicOp::IOP_umax, TranslateFUIBinary, DXIL::OpCode::UMax}, + {IntrinsicOp::IOP_umin, TranslateFUIBinary, DXIL::OpCode::UMin}, + {IntrinsicOp::IOP_umul, TranslateMul, DXIL::OpCode::UMul}, + {IntrinsicOp::IOP_usign, TranslateUSign, DXIL::OpCode::UMax}, + {IntrinsicOp::MOP_InterlockedUMax, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation, + DXIL::OpCode::NumOpCodes}, }; } static_assert(sizeof(gLowerTable) / sizeof(gLowerTable[0]) == static_cast(IntrinsicOp::Num_Intrinsics), diff --git a/tools/clang/include/clang/SPIRV/SpirvBuilder.h b/tools/clang/include/clang/SPIRV/SpirvBuilder.h index 772145212b..010e670afe 100644 --- a/tools/clang/include/clang/SPIRV/SpirvBuilder.h +++ b/tools/clang/include/clang/SPIRV/SpirvBuilder.h @@ -585,7 +585,8 @@ class SpirvBuilder { inline SpirvInstruction *addExecutionMode(SpirvFunction *entryPoint, spv::ExecutionMode em, llvm::ArrayRef params, - SourceLocation); + SourceLocation, + bool useIdParams = false); /// \brief Adds an OpModuleProcessed instruction to the module under /// construction. @@ -888,9 +889,9 @@ SpirvBuilder::setDebugSource(uint32_t major, uint32_t minor, SpirvInstruction * SpirvBuilder::addExecutionMode(SpirvFunction *entryPoint, spv::ExecutionMode em, llvm::ArrayRef params, - SourceLocation loc) { - auto mode = - new (context) SpirvExecutionMode(loc, entryPoint, em, params, false); + SourceLocation loc, bool useIdParams) { + auto mode = new (context) + SpirvExecutionMode(loc, entryPoint, em, params, useIdParams); mod->addExecutionMode(mode); return mode; diff --git a/tools/clang/lib/SPIRV/EmitVisitor.cpp b/tools/clang/lib/SPIRV/EmitVisitor.cpp index 87663e650e..507e150dc0 100644 --- a/tools/clang/lib/SPIRV/EmitVisitor.cpp +++ b/tools/clang/lib/SPIRV/EmitVisitor.cpp @@ -587,8 +587,16 @@ bool EmitVisitor::visit(SpirvExecutionMode *inst) { initInstruction(inst); curInst.push_back(getOrAssignResultId(inst->getEntryPoint())); curInst.push_back(static_cast(inst->getExecutionMode())); - curInst.insert(curInst.end(), inst->getParams().begin(), - inst->getParams().end()); + if (inst->getopcode() == spv::Op::OpExecutionMode) { + curInst.insert(curInst.end(), inst->getParams().begin(), + inst->getParams().end()); + } else { + for (uint32_t param : inst->getParams()) { + curInst.push_back(typeHandler.getOrCreateConstantInt( + llvm::APInt(32, param), context.getUIntType(32), + /*isSpecConst */ false)); + } + } finalizeInstruction(&preambleBinary); return true; } diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 008bd73172..e810c676c0 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -7776,7 +7776,10 @@ SpirvEmitter::processIntrinsicCallExpr(const CallExpr *callExpr) { retVal = processRawBufferLoad(callExpr); break; case hlsl::IntrinsicOp::IOP_Vkext_execution_mode: - retVal = processIntrinsicExecutionMode(callExpr); + retVal = processIntrinsicExecutionMode(callExpr, false); + break; + case hlsl::IntrinsicOp::IOP_Vkext_execution_mode_id: + retVal = processIntrinsicExecutionMode(callExpr, true); break; case hlsl::IntrinsicOp::IOP_saturate: retVal = processIntrinsicSaturate(callExpr); @@ -12803,18 +12806,22 @@ SpirvInstruction *SpirvEmitter::processRawBufferLoad(const CallExpr *callExpr) { } SpirvInstruction * -SpirvEmitter::processIntrinsicExecutionMode(const CallExpr *expr) { +SpirvEmitter::processIntrinsicExecutionMode(const CallExpr *expr, + bool useIdParams) { llvm::SmallVector execModesParams; uint32_t exeMode = 0; const auto args = expr->getArgs(); for (uint32_t i = 0; i < expr->getNumArgs(); ++i) { - SpirvConstantInteger *argInst = - dyn_cast(doExpr(args[i])); - if (argInst == nullptr) { - emitError("argument should be constant interger", expr->getExprLoc()); + const auto *intLiteral = + dyn_cast(args[i]->IgnoreImplicit()); + if (intLiteral == nullptr) { + emitError("argument should be constant integer", expr->getExprLoc()); return nullptr; } - unsigned argInteger = argInst->getValue().getZExtValue(); + + uint32_t argInteger = + static_cast(intLiteral->getValue().getZExtValue()); + if (i > 0) execModesParams.push_back(argInteger); else @@ -12823,9 +12830,9 @@ SpirvEmitter::processIntrinsicExecutionMode(const CallExpr *expr) { assert(entryFunction != nullptr); assert(exeMode != 0); - return spvBuilder.addExecutionMode(entryFunction, - static_cast(exeMode), - execModesParams, expr->getExprLoc()); + return spvBuilder.addExecutionMode( + entryFunction, static_cast(exeMode), execModesParams, + expr->getExprLoc(), useIdParams); } SpirvInstruction * diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.h b/tools/clang/lib/SPIRV/SpirvEmitter.h index 4b77e6f0fb..12fafa30b1 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.h +++ b/tools/clang/lib/SPIRV/SpirvEmitter.h @@ -622,7 +622,8 @@ class SpirvEmitter : public ASTConsumer { /// Custom intrinsic to support basic buffer_reference use case SpirvInstruction *processRawBufferLoad(const CallExpr *callExpr); /// Process vk::ext_execution_mode intrinsic - SpirvInstruction *processIntrinsicExecutionMode(const CallExpr *expr); + SpirvInstruction *processIntrinsicExecutionMode(const CallExpr *expr, + bool useIdParams); private: /// Returns the for constant value 0 of the given type. diff --git a/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl new file mode 100644 index 0000000000..182abd2b76 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl @@ -0,0 +1,10 @@ +// RUN: %dxc -T ps_6_0 -E main -spirv + + +// CHECK: OpExecutionModeId {{%\w+}} LocalSizeId %uint_8 %uint_8 %uint_8 + +int main() : SV_Target0 { + + vk::ext_execution_mode_id(/*LocalSizeId*/38, 8, 8, 8); + return 3; +} diff --git a/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp b/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp index 8c675fd7a6..0ed513c008 100644 --- a/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp +++ b/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp @@ -1344,6 +1344,7 @@ TEST_F(FileTest, IntrinsicsSpirv) { runFileTest("spv.intrinsicLiteral.hlsl"); runFileTest("spv.intrinsicDecorate.hlsl", Expect::Success, false); runFileTest("spv.intrinsicExecutionMode.hlsl", Expect::Success, false); + runFileTest("spv.intrinsicExecutionModeId.hlsl", Expect::Success, false); runFileTest("spv.intrinsicStorageClass.hlsl", Expect::Success, false); runFileTest("spv.intrinsicTypeInteger.hlsl"); runFileTest("spv.intrinsicTypeRayquery.hlsl", Expect::Success, false); diff --git a/utils/hct/gen_intrin_main.txt b/utils/hct/gen_intrin_main.txt index c80a3f8aa9..2b88596c00 100644 --- a/utils/hct/gen_intrin_main.txt +++ b/utils/hct/gen_intrin_main.txt @@ -379,7 +379,8 @@ namespace VkIntrinsics { u64 [[]] ReadClock(in uint scope); uint [[ro]] RawBufferLoad(in u64 addr); -void [[]] ext_execution_mode(...); +void [[]] ext_execution_mode(in uint mode, ...); +void [[]] ext_execution_mode_id(in uint mode, ...); } namespace // SPIRV Change Ends From 87ac80986c30509574c744bc8547b90544671078 Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Mon, 17 Jan 2022 14:28:37 -0500 Subject: [PATCH 2/4] Allow users to enable capabilities and extensions via ext_execution_mode --- tools/clang/lib/SPIRV/SpirvEmitter.cpp | 86 ++++++++++--------- tools/clang/lib/SPIRV/SpirvEmitter.h | 6 ++ tools/clang/lib/Sema/SemaHLSL.cpp | 18 ++++ .../spv.intrinsicExecutionMode.hlsl | 7 +- .../spv.intrinsicExecutionModeId.hlsl | 10 ++- 5 files changed, 82 insertions(+), 45 deletions(-) diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index e810c676c0..2a82362624 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -924,11 +924,21 @@ void SpirvEmitter::doStmt(const Stmt *stmt, doForStmt(forStmt, attrs); } else if (dyn_cast(stmt)) { // For the null statement ";". We don't need to do anything. - } else if (const auto *expr = dyn_cast(stmt)) { - // All cases for expressions used as statements - doExpr(expr); } else if (const auto *attrStmt = dyn_cast(stmt)) { doStmt(attrStmt->getSubStmt(), attrStmt->getAttrs()); + } else if (const auto *expr = dyn_cast(stmt)) { + // All cases for expressions used as statements + SpirvInstruction *result = doExpr(expr); + + if (result && result->getKind() == SpirvInstruction::IK_ExecutionMode && + !attrs.empty()) { + // Handle [[vk::ext_capability(..)]] and [[vk::ext_extension(..)]] + // attributes for vk::ext_execution_mode[_id](..). + createSpirvIntrInstExt( + attrs, QualType(), expr->getExprLoc(), + /*spvArgs*/ llvm::SmallVector{}, + /*isInstr*/ false); + } } else { emitError("statement class '%0' unimplemented", stmt->getLocStart()) << stmt->getStmtClassName() << stmt->getSourceRange(); @@ -12723,32 +12733,45 @@ SpirvEmitter::processRayQueryIntrinsics(const CXXMemberCallExpr *expr, return retVal; } -SpirvInstruction * -SpirvEmitter::processSpvIntrinsicCallExpr(const CallExpr *expr) { - auto funcDecl = expr->getDirectCallee(); - auto &attrs = funcDecl->getAttrs(); - QualType retType = funcDecl->getReturnType(); - +SpirvInstruction *SpirvEmitter::createSpirvIntrInstExt( + llvm::ArrayRef attrs, QualType retType, SourceLocation loc, + const llvm::SmallVectorImpl &spvArgs, bool isInstr) { llvm::SmallVector capbilities; llvm::SmallVector extensions; llvm::StringRef instSet = ""; - uint32_t op = 0; + // For [[vk::ext_type_def]], we use dummy OpNop with no semantic meaning, + // with possible extension and capabilities. + uint32_t op = static_cast(spv::Op::OpNop); for (auto &attr : attrs) { if (auto capAttr = dyn_cast(attr)) { capbilities.push_back(capAttr->getCapability()); } else if (auto extAttr = dyn_cast(attr)) { extensions.push_back(extAttr->getName()); - } else if (auto instAttr = dyn_cast(attr)) { + } + if (!isInstr) + continue; + if (auto instAttr = dyn_cast(attr)) { op = instAttr->getOpcode(); instSet = instAttr->getInstruction_set(); } } - llvm::SmallVector spvArgs; + SpirvInstruction *retVal = spvBuilder.createSpirvIntrInstExt( + op, retType, spvArgs, extensions, instSet, capbilities, loc); + + // TODO: Revisit this r-value setting when handling vk::ext_result_id ? + retVal->setRValue(); + + return retVal; +} +SpirvInstruction * +SpirvEmitter::processSpvIntrinsicCallExpr(const CallExpr *expr) { + const auto *funcDecl = expr->getDirectCallee(); + llvm::SmallVector spvArgs; const auto args = expr->getArgs(); for (uint32_t i = 0; i < expr->getNumArgs(); ++i) { - auto param = funcDecl->getParamDecl(i); + const auto *param = funcDecl->getParamDecl(i); const Expr *arg = args[i]->IgnoreParenLValueCasts(); SpirvInstruction *argInst = doExpr(arg); if (param->hasAttr()) { @@ -12769,14 +12792,9 @@ SpirvEmitter::processSpvIntrinsicCallExpr(const CallExpr *expr) { } } - const auto loc = expr->getExprLoc(); - - SpirvInstruction *retVal = spvBuilder.createSpirvIntrInstExt( - op, retType, spvArgs, extensions, instSet, capbilities, loc); - - // TODO: Revisit this r-value setting when handling vk::ext_result_id ? - retVal->setRValue(); - return retVal; + return createSpirvIntrInstExt(funcDecl->getAttrs(), funcDecl->getReturnType(), + expr->getExprLoc(), spvArgs, + /*isInstr*/ true); } SpirvInstruction *SpirvEmitter::processRawBufferLoad(const CallExpr *callExpr) { @@ -12838,18 +12856,6 @@ SpirvEmitter::processIntrinsicExecutionMode(const CallExpr *expr, SpirvInstruction * SpirvEmitter::processSpvIntrinsicTypeDef(const CallExpr *expr) { auto funcDecl = expr->getDirectCallee(); - auto typeDefAttr = funcDecl->getAttr(); - llvm::SmallVector capbilities; - llvm::SmallVector extensions; - - for (auto &attr : funcDecl->getAttrs()) { - if (auto capAttr = dyn_cast(attr)) { - capbilities.push_back(capAttr->getCapability()); - } else if (auto extAttr = dyn_cast(attr)) { - extensions.push_back(extAttr->getName()); - } - } - SmallVector operands; const auto args = expr->getArgs(); for (uint32_t i = 0; i < expr->getNumArgs(); ++i) { @@ -12874,17 +12880,15 @@ SpirvEmitter::processSpvIntrinsicTypeDef(const CallExpr *expr) { operands.emplace_back(loadIfGLValue(arg)); } } + + auto typeDefAttr = funcDecl->getAttr(); spvContext.getSpirvIntrinsicType(typeDefAttr->getId(), typeDefAttr->getOpcode(), operands); - // Emit dummy OpNop with no semantic meaning, with possible extension and - // capabilities - SpirvInstruction *retVal = spvBuilder.createSpirvIntrInstExt( - static_cast(spv::Op::OpNop), QualType(), {}, extensions, {}, - capbilities, expr->getExprLoc()); - retVal->setRValue(); - - return retVal; + return createSpirvIntrInstExt( + funcDecl->getAttrs(), QualType(), expr->getExprLoc(), + /*spvArgs*/ llvm::SmallVector{}, + /*isInstr*/ false); } bool SpirvEmitter::spirvToolsValidate(std::vector *mod, diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.h b/tools/clang/lib/SPIRV/SpirvEmitter.h index 12fafa30b1..bf9a304815 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.h +++ b/tools/clang/lib/SPIRV/SpirvEmitter.h @@ -613,6 +613,12 @@ class SpirvEmitter : public ASTConsumer { /// Process ray query intrinsics SpirvInstruction *processRayQueryIntrinsics(const CXXMemberCallExpr *expr, hlsl::IntrinsicOp opcode); + + /// Create SpirvIntrinsicInstruction for arbitrary SPIR-V instructions + /// specified by [[vk::ext_instruction(..)]] or [[vk::ext_type_def(..)]] + SpirvInstruction *createSpirvIntrInstExt( + llvm::ArrayRef attrs, QualType retType, SourceLocation loc, + const llvm::SmallVectorImpl &spvArgs, bool isInstr); /// Process spirv intrinsic instruction SpirvInstruction *processSpvIntrinsicCallExpr(const CallExpr *expr); diff --git a/tools/clang/lib/Sema/SemaHLSL.cpp b/tools/clang/lib/Sema/SemaHLSL.cpp index 0aa9767454..645fe7f3ba 100644 --- a/tools/clang/lib/Sema/SemaHLSL.cpp +++ b/tools/clang/lib/Sema/SemaHLSL.cpp @@ -12173,6 +12173,24 @@ Attr *hlsl::ProcessStmtAttributeForHLSL(Sema &S, Stmt *St, const AttributeList & Attr * result = nullptr; Handled = true; + // SPIRV Change Starts + if (A.hasScope() && A.getScopeName()->getName().equals("vk")) { + switch (A.getKind()) { + case AttributeList::AT_VKCapabilityExt: + return ::new (S.Context) VKCapabilityExtAttr( + A.getRange(), S.Context, ValidateAttributeIntArg(S, A), + A.getAttributeSpellingListIndex()); + case AttributeList::AT_VKExtensionExt: + return ::new (S.Context) VKExtensionExtAttr( + A.getRange(), S.Context, ValidateAttributeStringArg(S, A, nullptr), + A.getAttributeSpellingListIndex()); + default: + Handled = false; + return nullptr; + } + } + // SPIRV Change Ends + switch (A.getKind()) { case AttributeList::AT_HLSLUnroll: diff --git a/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionMode.hlsl b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionMode.hlsl index 9a410b9e65..2b33c05942 100644 --- a/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionMode.hlsl +++ b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionMode.hlsl @@ -1,14 +1,17 @@ // RUN: %dxc -T ps_6_0 -E main -spirv - +// CHECK: OpCapability ShaderClockKHR +// CHECK: OpExtension "SPV_KHR_shader_clock" // CHECK: OpExecutionMode {{%\w+}} StencilRefReplacingEXT // CHECK: OpExecutionMode {{%\w+}} SubgroupSize 32 // CHECK: OpDecorate {{%\w+}} BuiltIn FragStencilRefEXT [[vk::ext_decorate(11, 5014)]] int main() : SV_Target0 { - + [[vk::ext_capability(5055)]] + [[vk::ext_extension("SPV_KHR_shader_clock")]] vk::ext_execution_mode(/*StencilRefReplacingEXT*/5027); + vk::ext_execution_mode(/*SubgroupSize*/35, 32); return 3; } diff --git a/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl index 182abd2b76..f24d3e4812 100644 --- a/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl +++ b/tools/clang/test/CodeGenSPIRV/spv.intrinsicExecutionModeId.hlsl @@ -1,10 +1,16 @@ // RUN: %dxc -T ps_6_0 -E main -spirv - +// CHECK: OpCapability ShaderClockKHR +// CHECK: OpExtension "SPV_KHR_shader_clock" // CHECK: OpExecutionModeId {{%\w+}} LocalSizeId %uint_8 %uint_8 %uint_8 +// CHECK: OpExecutionModeId {{%\w+}} LocalSizeHintId %uint_4 %uint_4 %uint_4 int main() : SV_Target0 { - vk::ext_execution_mode_id(/*LocalSizeId*/38, 8, 8, 8); + + [[vk::ext_capability(5055)]] + [[vk::ext_extension("SPV_KHR_shader_clock")]] + vk::ext_execution_mode_id(/*LocalSizeHintId*/39, 4, 4, 4); + return 3; } From 18417aa05290e8af386d40c8f77f8cb30716afab Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Mon, 17 Jan 2022 15:45:41 -0500 Subject: [PATCH 3/4] Roll back the change caused by clang-format --- lib/HLSL/HLOperationLower.cpp | 657 +++++++++++----------------------- 1 file changed, 217 insertions(+), 440 deletions(-) diff --git a/lib/HLSL/HLOperationLower.cpp b/lib/HLSL/HLOperationLower.cpp index df913a64bf..affb544e6c 100644 --- a/lib/HLSL/HLOperationLower.cpp +++ b/lib/HLSL/HLOperationLower.cpp @@ -5442,198 +5442,104 @@ Value *StreamOutputLower(CallInst *CI, IntrinsicOp IOP, DXIL::OpCode opcode, // This table has to match IntrinsicOp orders IntrinsicLower gLowerTable[] = { - {IntrinsicOp::IOP_AcceptHitAndEndSearch, - TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::AcceptHitAndEndSearch}, - {IntrinsicOp::IOP_AddUint64, TranslateAddUint64, DXIL::OpCode::UAddc}, + {IntrinsicOp::IOP_AcceptHitAndEndSearch, TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::AcceptHitAndEndSearch}, + {IntrinsicOp::IOP_AddUint64, TranslateAddUint64, DXIL::OpCode::UAddc}, {IntrinsicOp::IOP_AllMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, TrivialBarrier, - DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, - DXIL::OpCode::AllocateRayQuery}, - {IntrinsicOp::IOP_CallShader, TranslateCallShader, - DXIL::OpCode::CallShader}, - {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, - DXIL::OpCode::CheckAccessFullyMapped}, - {IntrinsicOp::IOP_CreateResourceFromHeap, TranslateGetHandleFromHeap, - DXIL::OpCode::CreateHandleFromHeap}, - {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, - DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, - DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_DispatchMesh, TrivialDispatchMesh, - DXIL::OpCode::DispatchMesh}, - {IntrinsicOp::IOP_DispatchRaysDimensions, TranslateNoArgVectorOperation, - DXIL::OpCode::DispatchRaysDimensions}, - {IntrinsicOp::IOP_DispatchRaysIndex, TranslateNoArgVectorOperation, - DXIL::OpCode::DispatchRaysIndex}, - {IntrinsicOp::IOP_EvaluateAttributeAtSample, TranslateEvalSample, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_EvaluateAttributeCentroid, TranslateEvalCentroid, - DXIL::OpCode::EvalCentroid}, - {IntrinsicOp::IOP_EvaluateAttributeSnapped, TranslateEvalSnapped, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_GeometryIndex, TrivialNoArgWithRetOperation, - DXIL::OpCode::GeometryIndex}, - {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, - DXIL::OpCode::AttributeAtVertex}, - {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, - DXIL::OpCode::RenderTargetGetSampleCount}, - {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, - DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, - DXIL::OpCode::Barrier}, - {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, - DXIL::OpCode::HitKind}, - {IntrinsicOp::IOP_IgnoreHit, TranslateNoArgNoReturnPreserveOutput, - DXIL::OpCode::IgnoreHit}, - {IntrinsicOp::IOP_InstanceID, TrivialNoArgWithRetOperation, - DXIL::OpCode::InstanceID}, - {IntrinsicOp::IOP_InstanceIndex, TrivialNoArgWithRetOperation, - DXIL::OpCode::InstanceIndex}, - {IntrinsicOp::IOP_InterlockedAdd, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedAnd, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareExchange, TranslateIopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareExchangeFloatBitwise, - TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareStore, TranslateIopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedCompareStoreFloatBitwise, - TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedExchange, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedMax, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedMin, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedOr, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedXor, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_IsHelperLane, TrivialNoArgWithRetOperation, - DXIL::OpCode::IsHelperLane}, - {IntrinsicOp::IOP_NonUniformResourceIndex, TranslateNonUniformResourceIndex, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ObjectRayDirection, TranslateNoArgVectorOperation, - DXIL::OpCode::ObjectRayDirection}, - {IntrinsicOp::IOP_ObjectRayOrigin, TranslateNoArgVectorOperation, - DXIL::OpCode::ObjectRayOrigin}, - {IntrinsicOp::IOP_ObjectToWorld, TranslateNoArgMatrix3x4Operation, - DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_ObjectToWorld3x4, TranslateNoArgMatrix3x4Operation, - DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_ObjectToWorld4x3, - TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, - {IntrinsicOp::IOP_PrimitiveIndex, TrivialNoArgWithRetOperation, - DXIL::OpCode::PrimitiveIndex}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsAvg, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsMax, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Process2DQuadTessFactorsMin, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessIsolineTessFactors, - TranslateProcessIsolineTessFactors, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsAvg, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsMax, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessQuadTessFactorsMin, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsAvg, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsMax, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ProcessTriTessFactorsMin, TranslateProcessTessFactors, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_QuadReadAcrossDiagonal, TranslateQuadReadAcross, - DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadAcrossX, TranslateQuadReadAcross, - DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadAcrossY, TranslateQuadReadAcross, - DXIL::OpCode::QuadOp}, - {IntrinsicOp::IOP_QuadReadLaneAt, TranslateQuadReadLaneAt, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_RayFlags, TrivialNoArgWithRetOperation, - DXIL::OpCode::RayFlags}, - {IntrinsicOp::IOP_RayTCurrent, TrivialNoArgWithRetOperation, - DXIL::OpCode::RayTCurrent}, - {IntrinsicOp::IOP_RayTMin, TrivialNoArgWithRetOperation, - DXIL::OpCode::RayTMin}, - {IntrinsicOp::IOP_ReportHit, TranslateReportIntersection, - DXIL::OpCode::ReportHit}, - {IntrinsicOp::IOP_SetMeshOutputCounts, TrivialSetMeshOutputCounts, - DXIL::OpCode::SetMeshOutputCounts}, + {IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, DXIL::OpCode::AllocateRayQuery}, + {IntrinsicOp::IOP_CallShader, TranslateCallShader, DXIL::OpCode::CallShader}, + {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, DXIL::OpCode::CheckAccessFullyMapped}, + {IntrinsicOp::IOP_CreateResourceFromHeap, TranslateGetHandleFromHeap, DXIL::OpCode::CreateHandleFromHeap}, + {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_DispatchMesh, TrivialDispatchMesh, DXIL::OpCode::DispatchMesh }, + {IntrinsicOp::IOP_DispatchRaysDimensions, TranslateNoArgVectorOperation, DXIL::OpCode::DispatchRaysDimensions}, + {IntrinsicOp::IOP_DispatchRaysIndex, TranslateNoArgVectorOperation, DXIL::OpCode::DispatchRaysIndex}, + {IntrinsicOp::IOP_EvaluateAttributeAtSample, TranslateEvalSample, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_EvaluateAttributeCentroid, TranslateEvalCentroid, DXIL::OpCode::EvalCentroid}, + {IntrinsicOp::IOP_EvaluateAttributeSnapped, TranslateEvalSnapped, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_GeometryIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::GeometryIndex}, + {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, DXIL::OpCode::AttributeAtVertex}, + {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, DXIL::OpCode::RenderTargetGetSampleCount}, + {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier}, + {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, DXIL::OpCode::HitKind}, + {IntrinsicOp::IOP_IgnoreHit, TranslateNoArgNoReturnPreserveOutput, DXIL::OpCode::IgnoreHit}, + {IntrinsicOp::IOP_InstanceID, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceID}, + {IntrinsicOp::IOP_InstanceIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceIndex}, + {IntrinsicOp::IOP_InterlockedAdd, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedAnd, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareExchange, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareExchangeFloatBitwise, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareStore, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedCompareStoreFloatBitwise, TranslateIopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedExchange, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedMax, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedMin, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedOr, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_InterlockedXor, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_IsHelperLane, TrivialNoArgWithRetOperation, DXIL::OpCode::IsHelperLane}, + {IntrinsicOp::IOP_NonUniformResourceIndex, TranslateNonUniformResourceIndex, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ObjectRayDirection, TranslateNoArgVectorOperation, DXIL::OpCode::ObjectRayDirection}, + {IntrinsicOp::IOP_ObjectRayOrigin, TranslateNoArgVectorOperation, DXIL::OpCode::ObjectRayOrigin}, + {IntrinsicOp::IOP_ObjectToWorld, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_ObjectToWorld3x4, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_ObjectToWorld4x3, TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::ObjectToWorld}, + {IntrinsicOp::IOP_PrimitiveIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::PrimitiveIndex}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_Process2DQuadTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessIsolineTessFactors, TranslateProcessIsolineTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessQuadTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsAvg, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsMax, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_ProcessTriTessFactorsMin, TranslateProcessTessFactors, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_QuadReadAcrossDiagonal, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadAcrossX, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadAcrossY, TranslateQuadReadAcross, DXIL::OpCode::QuadOp}, + {IntrinsicOp::IOP_QuadReadLaneAt, TranslateQuadReadLaneAt, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_RayFlags, TrivialNoArgWithRetOperation, DXIL::OpCode::RayFlags}, + {IntrinsicOp::IOP_RayTCurrent, TrivialNoArgWithRetOperation, DXIL::OpCode::RayTCurrent}, + {IntrinsicOp::IOP_RayTMin, TrivialNoArgWithRetOperation, DXIL::OpCode::RayTMin}, + {IntrinsicOp::IOP_ReportHit, TranslateReportIntersection, DXIL::OpCode::ReportHit}, + {IntrinsicOp::IOP_SetMeshOutputCounts, TrivialSetMeshOutputCounts, DXIL::OpCode::SetMeshOutputCounts}, {IntrinsicOp::IOP_TraceRay, TranslateTraceRay, DXIL::OpCode::TraceRay}, - {IntrinsicOp::IOP_WaveActiveAllEqual, TranslateWaveAllEqual, - DXIL::OpCode::WaveActiveAllEqual}, - {IntrinsicOp::IOP_WaveActiveAllTrue, TranslateWaveA2B, - DXIL::OpCode::WaveAllTrue}, - {IntrinsicOp::IOP_WaveActiveAnyTrue, TranslateWaveA2B, - DXIL::OpCode::WaveAnyTrue}, - {IntrinsicOp::IOP_WaveActiveBallot, TranslateWaveBallot, - DXIL::OpCode::WaveActiveBallot}, - {IntrinsicOp::IOP_WaveActiveBitAnd, TranslateWaveA2A, - DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveBitOr, TranslateWaveA2A, - DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveBitXor, TranslateWaveA2A, - DXIL::OpCode::WaveActiveBit}, - {IntrinsicOp::IOP_WaveActiveCountBits, TranslateWaveA2B, - DXIL::OpCode::WaveAllBitCount}, - {IntrinsicOp::IOP_WaveActiveMax, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveMin, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveProduct, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveSum, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveGetLaneCount, TranslateWaveToVal, - DXIL::OpCode::WaveGetLaneCount}, - {IntrinsicOp::IOP_WaveGetLaneIndex, TranslateWaveToVal, - DXIL::OpCode::WaveGetLaneIndex}, - {IntrinsicOp::IOP_WaveIsFirstLane, TranslateWaveToVal, - DXIL::OpCode::WaveIsFirstLane}, + {IntrinsicOp::IOP_WaveActiveAllEqual, TranslateWaveAllEqual, DXIL::OpCode::WaveActiveAllEqual}, + {IntrinsicOp::IOP_WaveActiveAllTrue, TranslateWaveA2B, DXIL::OpCode::WaveAllTrue}, + {IntrinsicOp::IOP_WaveActiveAnyTrue, TranslateWaveA2B, DXIL::OpCode::WaveAnyTrue}, + {IntrinsicOp::IOP_WaveActiveBallot, TranslateWaveBallot, DXIL::OpCode::WaveActiveBallot}, + {IntrinsicOp::IOP_WaveActiveBitAnd, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveBitOr, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveBitXor, TranslateWaveA2A, DXIL::OpCode::WaveActiveBit}, + {IntrinsicOp::IOP_WaveActiveCountBits, TranslateWaveA2B, DXIL::OpCode::WaveAllBitCount}, + {IntrinsicOp::IOP_WaveActiveMax, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveMin, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveProduct, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveActiveSum, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp}, + {IntrinsicOp::IOP_WaveGetLaneCount, TranslateWaveToVal, DXIL::OpCode::WaveGetLaneCount}, + {IntrinsicOp::IOP_WaveGetLaneIndex, TranslateWaveToVal, DXIL::OpCode::WaveGetLaneIndex}, + {IntrinsicOp::IOP_WaveIsFirstLane, TranslateWaveToVal, DXIL::OpCode::WaveIsFirstLane}, {IntrinsicOp::IOP_WaveMatch, TranslateWaveMatch, DXIL::OpCode::WaveMatch}, - {IntrinsicOp::IOP_WaveMultiPrefixBitAnd, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixBitOr, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixBitXor, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixCountBits, - TranslateWaveMultiPrefixBitCount, DXIL::OpCode::WaveMultiPrefixBitCount}, - {IntrinsicOp::IOP_WaveMultiPrefixProduct, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixSum, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WavePrefixCountBits, TranslateWaveA2B, - DXIL::OpCode::WavePrefixBitCount}, - {IntrinsicOp::IOP_WavePrefixProduct, TranslateWaveA2A, - DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_WavePrefixSum, TranslateWaveA2A, - DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_WaveReadLaneAt, TranslateWaveReadLaneAt, - DXIL::OpCode::WaveReadLaneAt}, - {IntrinsicOp::IOP_WaveReadLaneFirst, TranslateWaveReadLaneFirst, - DXIL::OpCode::WaveReadLaneFirst}, - {IntrinsicOp::IOP_WorldRayDirection, TranslateNoArgVectorOperation, - DXIL::OpCode::WorldRayDirection}, - {IntrinsicOp::IOP_WorldRayOrigin, TranslateNoArgVectorOperation, - DXIL::OpCode::WorldRayOrigin}, - {IntrinsicOp::IOP_WorldToObject, TranslateNoArgMatrix3x4Operation, - DXIL::OpCode::WorldToObject}, - {IntrinsicOp::IOP_WorldToObject3x4, TranslateNoArgMatrix3x4Operation, - DXIL::OpCode::WorldToObject}, - {IntrinsicOp::IOP_WorldToObject4x3, - TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WaveMultiPrefixBitAnd, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixBitOr, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixBitXor, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixCountBits, TranslateWaveMultiPrefixBitCount, DXIL::OpCode::WaveMultiPrefixBitCount}, + {IntrinsicOp::IOP_WaveMultiPrefixProduct, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WaveMultiPrefixSum, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp}, + {IntrinsicOp::IOP_WavePrefixCountBits, TranslateWaveA2B, DXIL::OpCode::WavePrefixBitCount}, + {IntrinsicOp::IOP_WavePrefixProduct, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_WavePrefixSum, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp}, + {IntrinsicOp::IOP_WaveReadLaneAt, TranslateWaveReadLaneAt, DXIL::OpCode::WaveReadLaneAt}, + {IntrinsicOp::IOP_WaveReadLaneFirst, TranslateWaveReadLaneFirst, DXIL::OpCode::WaveReadLaneFirst}, + {IntrinsicOp::IOP_WorldRayDirection, TranslateNoArgVectorOperation, DXIL::OpCode::WorldRayDirection}, + {IntrinsicOp::IOP_WorldRayOrigin, TranslateNoArgVectorOperation, DXIL::OpCode::WorldRayOrigin}, + {IntrinsicOp::IOP_WorldToObject, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WorldToObject3x4, TranslateNoArgMatrix3x4Operation, DXIL::OpCode::WorldToObject}, + {IntrinsicOp::IOP_WorldToObject4x3, TranslateNoArgTransposedMatrix3x4Operation, DXIL::OpCode::WorldToObject}, {IntrinsicOp::IOP_abort, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_abs, TranslateAbs, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_acos, TrivialUnaryOperation, DXIL::OpCode::Acos}, @@ -5655,41 +5561,29 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_clip, TranslateClip, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_cos, TrivialUnaryOperation, DXIL::OpCode::Cos}, {IntrinsicOp::IOP_cosh, TrivialUnaryOperation, DXIL::OpCode::Hcos}, - {IntrinsicOp::IOP_countbits, TrivialUnaryOperation, - DXIL::OpCode::Countbits}, + {IntrinsicOp::IOP_countbits, TrivialUnaryOperation, DXIL::OpCode::Countbits}, {IntrinsicOp::IOP_cross, TranslateCross, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_ddx, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseX}, - {IntrinsicOp::IOP_ddx_coarse, TrivialUnaryOperation, - DXIL::OpCode::DerivCoarseX}, - {IntrinsicOp::IOP_ddx_fine, TrivialUnaryOperation, - DXIL::OpCode::DerivFineX}, + {IntrinsicOp::IOP_ddx_coarse, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseX}, + {IntrinsicOp::IOP_ddx_fine, TrivialUnaryOperation, DXIL::OpCode::DerivFineX}, {IntrinsicOp::IOP_ddy, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseY}, - {IntrinsicOp::IOP_ddy_coarse, TrivialUnaryOperation, - DXIL::OpCode::DerivCoarseY}, - {IntrinsicOp::IOP_ddy_fine, TrivialUnaryOperation, - DXIL::OpCode::DerivFineY}, + {IntrinsicOp::IOP_ddy_coarse, TrivialUnaryOperation, DXIL::OpCode::DerivCoarseY}, + {IntrinsicOp::IOP_ddy_fine, TrivialUnaryOperation, DXIL::OpCode::DerivFineY}, {IntrinsicOp::IOP_degrees, TranslateDegrees, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_determinant, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_distance, TranslateDistance, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_dot, TranslateDot, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_dot2add, TranslateDot2Add, DXIL::OpCode::Dot2AddHalf}, - {IntrinsicOp::IOP_dot4add_i8packed, TranslateDot4AddPacked, - DXIL::OpCode::Dot4AddI8Packed}, - {IntrinsicOp::IOP_dot4add_u8packed, TranslateDot4AddPacked, - DXIL::OpCode::Dot4AddU8Packed}, + {IntrinsicOp::IOP_dot4add_i8packed, TranslateDot4AddPacked, DXIL::OpCode::Dot4AddI8Packed}, + {IntrinsicOp::IOP_dot4add_u8packed, TranslateDot4AddPacked, DXIL::OpCode::Dot4AddU8Packed}, {IntrinsicOp::IOP_dst, TranslateDst, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_exp, TranslateExp, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_exp2, TrivialUnaryOperation, DXIL::OpCode::Exp}, - {IntrinsicOp::IOP_f16tof32, TranslateF16ToF32, - DXIL::OpCode::LegacyF16ToF32}, - {IntrinsicOp::IOP_f32tof16, TranslateF32ToF16, - DXIL::OpCode::LegacyF32ToF16}, - {IntrinsicOp::IOP_faceforward, TranslateFaceforward, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_firstbithigh, TranslateFirstbitHi, - DXIL::OpCode::FirstbitSHi}, - {IntrinsicOp::IOP_firstbitlow, TranslateFirstbitLo, - DXIL::OpCode::FirstbitLo}, + {IntrinsicOp::IOP_f16tof32, TranslateF16ToF32, DXIL::OpCode::LegacyF16ToF32}, + {IntrinsicOp::IOP_f32tof16, TranslateF32ToF16, DXIL::OpCode::LegacyF32ToF16}, + {IntrinsicOp::IOP_faceforward, TranslateFaceforward, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_firstbithigh, TranslateFirstbitHi, DXIL::OpCode::FirstbitSHi}, + {IntrinsicOp::IOP_firstbitlow, TranslateFirstbitLo, DXIL::OpCode::FirstbitLo}, {IntrinsicOp::IOP_floor, TrivialUnaryOperation, DXIL::OpCode::Round_ni}, {IntrinsicOp::IOP_fma, TrivialTrinaryOperation, DXIL::OpCode::Fma}, {IntrinsicOp::IOP_fmod, TranslateFMod, DXIL::OpCode::NumOpCodes}, @@ -5714,10 +5608,10 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_mul, TranslateMul, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_normalize, TranslateNormalize, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_or, TranslateOr, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_pack_clamp_s8, TranslatePack, DXIL::OpCode::Pack4x8}, - {IntrinsicOp::IOP_pack_clamp_u8, TranslatePack, DXIL::OpCode::Pack4x8}, - {IntrinsicOp::IOP_pack_s8, TranslatePack, DXIL::OpCode::Pack4x8}, - {IntrinsicOp::IOP_pack_u8, TranslatePack, DXIL::OpCode::Pack4x8}, + {IntrinsicOp::IOP_pack_clamp_s8, TranslatePack, DXIL::OpCode::Pack4x8 }, + {IntrinsicOp::IOP_pack_clamp_u8, TranslatePack, DXIL::OpCode::Pack4x8 }, + {IntrinsicOp::IOP_pack_s8, TranslatePack, DXIL::OpCode::Pack4x8 }, + {IntrinsicOp::IOP_pack_u8, TranslatePack, DXIL::OpCode::Pack4x8 }, {IntrinsicOp::IOP_pow, TranslatePow, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_printf, TranslatePrintf, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_radians, TranslateRadians, DXIL::OpCode::NumOpCodes}, @@ -5733,8 +5627,7 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_sin, TrivialUnaryOperation, DXIL::OpCode::Sin}, {IntrinsicOp::IOP_sincos, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_sinh, TrivialUnaryOperation, DXIL::OpCode::Hsin}, - {IntrinsicOp::IOP_smoothstep, TranslateSmoothStep, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::IOP_smoothstep, TranslateSmoothStep, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_source_mark, EmptyLower, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::IOP_sqrt, TrivialUnaryOperation, DXIL::OpCode::Sqrt}, {IntrinsicOp::IOP_step, TranslateStep, DXIL::OpCode::NumOpCodes}, @@ -5767,254 +5660,138 @@ IntrinsicLower gLowerTable[] = { {IntrinsicOp::IOP_unpack_u8u16, TranslateUnpack, DXIL::OpCode::Unpack4x8}, {IntrinsicOp::IOP_unpack_u8u32, TranslateUnpack, DXIL::OpCode::Unpack4x8}, #ifdef ENABLE_SPIRV_CODEGEN - {IntrinsicOp::IOP_VkReadClock, UnsupportedVulkanIntrinsic, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_VkRawBufferLoad, UnsupportedVulkanIntrinsic, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Vkext_execution_mode, UnsupportedVulkanIntrinsic, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_Vkext_execution_mode_id, UnsupportedVulkanIntrinsic, - DXIL::OpCode::NumOpCodes}, + { IntrinsicOp::IOP_VkReadClock, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_VkRawBufferLoad, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_Vkext_execution_mode, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_Vkext_execution_mode_id, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes }, #endif // ENABLE_SPIRV_CODEGEN {IntrinsicOp::MOP_Append, StreamOutputLower, DXIL::OpCode::EmitStream}, {IntrinsicOp::MOP_RestartStrip, StreamOutputLower, DXIL::OpCode::CutStream}, - {IntrinsicOp::MOP_CalculateLevelOfDetail, TranslateCalculateLOD, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_CalculateLevelOfDetailUnclamped, TranslateCalculateLOD, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_GetDimensions, TranslateGetDimensions, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_CalculateLevelOfDetail, TranslateCalculateLOD, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_CalculateLevelOfDetailUnclamped, TranslateCalculateLOD, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_GetDimensions, TranslateGetDimensions, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Sample, TranslateSample, DXIL::OpCode::Sample}, {IntrinsicOp::MOP_SampleBias, TranslateSample, DXIL::OpCode::SampleBias}, {IntrinsicOp::MOP_SampleCmp, TranslateSample, DXIL::OpCode::SampleCmp}, - {IntrinsicOp::MOP_SampleCmpLevelZero, TranslateSample, - DXIL::OpCode::SampleCmpLevelZero}, + {IntrinsicOp::MOP_SampleCmpLevelZero, TranslateSample, DXIL::OpCode::SampleCmpLevelZero}, {IntrinsicOp::MOP_SampleGrad, TranslateSample, DXIL::OpCode::SampleGrad}, {IntrinsicOp::MOP_SampleLevel, TranslateSample, DXIL::OpCode::SampleLevel}, {IntrinsicOp::MOP_Gather, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GatherAlpha, TranslateGather, - DXIL::OpCode::TextureGather}, + {IntrinsicOp::MOP_GatherAlpha, TranslateGather, DXIL::OpCode::TextureGather}, {IntrinsicOp::MOP_GatherBlue, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GatherCmp, TranslateGather, - DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpAlpha, TranslateGather, - DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpBlue, TranslateGather, - DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpGreen, TranslateGather, - DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherCmpRed, TranslateGather, - DXIL::OpCode::TextureGatherCmp}, - {IntrinsicOp::MOP_GatherGreen, TranslateGather, - DXIL::OpCode::TextureGather}, + {IntrinsicOp::MOP_GatherCmp, TranslateGather, DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpAlpha, TranslateGather, DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpBlue, TranslateGather, DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpGreen, TranslateGather, DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherCmpRed, TranslateGather, DXIL::OpCode::TextureGatherCmp}, + {IntrinsicOp::MOP_GatherGreen, TranslateGather, DXIL::OpCode::TextureGather}, {IntrinsicOp::MOP_GatherRed, TranslateGather, DXIL::OpCode::TextureGather}, - {IntrinsicOp::MOP_GetSamplePosition, TranslateGetSamplePosition, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_GetSamplePosition, TranslateGetSamplePosition, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load2, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load3, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Load4, TranslateResourceLoad, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAdd, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAdd64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAnd, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedAnd64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchange, TranslateMopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchange64, TranslateMopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareExchangeFloatBitwise, - TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStore, TranslateMopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStore64, TranslateMopAtomicCmpXChg, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedCompareStoreFloatBitwise, - TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchange, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchange64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedExchangeFloat, - TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMax, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMax64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMin, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedMin64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedOr, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedOr64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedXor, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedXor64, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAdd, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAdd64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAnd, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedAnd64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchange, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchange64, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareExchangeFloatBitwise, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStore, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStore64, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedCompareStoreFloatBitwise, TranslateMopAtomicCmpXChg, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchange, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchange64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedExchangeFloat, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMax, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMax64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMin, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedMin64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedOr, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedOr64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedXor, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_InterlockedXor64, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store2, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store3, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Store4, TranslateResourceStore, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_DecrementCounter, GenerateUpdateCounter, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_IncrementCounter, GenerateUpdateCounter, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_DecrementCounter, GenerateUpdateCounter, DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_IncrementCounter, GenerateUpdateCounter, DXIL::OpCode::NumOpCodes}, {IntrinsicOp::MOP_Consume, EmptyLower, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_WriteSamplerFeedback, TranslateWriteSamplerFeedback, - DXIL::OpCode::WriteSamplerFeedback}, - {IntrinsicOp::MOP_WriteSamplerFeedbackBias, TranslateWriteSamplerFeedback, - DXIL::OpCode::WriteSamplerFeedbackBias}, - {IntrinsicOp::MOP_WriteSamplerFeedbackGrad, TranslateWriteSamplerFeedback, - DXIL::OpCode::WriteSamplerFeedbackGrad}, - {IntrinsicOp::MOP_WriteSamplerFeedbackLevel, TranslateWriteSamplerFeedback, - DXIL::OpCode::WriteSamplerFeedbackLevel}, - - {IntrinsicOp::MOP_Abort, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_Abort}, - {IntrinsicOp::MOP_CandidateGeometryIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateGeometryIndex}, - {IntrinsicOp::MOP_CandidateInstanceContributionToHitGroupIndex, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex}, - {IntrinsicOp::MOP_CandidateInstanceID, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateInstanceID}, - {IntrinsicOp::MOP_CandidateInstanceIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateInstanceIndex}, - {IntrinsicOp::MOP_CandidateObjectRayDirection, - TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_CandidateObjectRayDirection}, - {IntrinsicOp::MOP_CandidateObjectRayOrigin, TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_CandidateObjectRayOrigin}, - {IntrinsicOp::MOP_CandidateObjectToWorld3x4, - TranslateRayQueryMatrix3x4Operation, - DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, - {IntrinsicOp::MOP_CandidateObjectToWorld4x3, - TranslateRayQueryTransposedMatrix3x4Operation, - DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, - {IntrinsicOp::MOP_CandidatePrimitiveIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidatePrimitiveIndex}, - {IntrinsicOp::MOP_CandidateProceduralPrimitiveNonOpaque, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque}, - {IntrinsicOp::MOP_CandidateTriangleBarycentrics, - TranslateRayQueryFloat2Getter, - DXIL::OpCode::RayQuery_CandidateTriangleBarycentrics}, - {IntrinsicOp::MOP_CandidateTriangleFrontFace, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateTriangleFrontFace}, - {IntrinsicOp::MOP_CandidateTriangleRayT, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateTriangleRayT}, - {IntrinsicOp::MOP_CandidateType, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CandidateType}, - {IntrinsicOp::MOP_CandidateWorldToObject3x4, - TranslateRayQueryMatrix3x4Operation, - DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, - {IntrinsicOp::MOP_CandidateWorldToObject4x3, - TranslateRayQueryTransposedMatrix3x4Operation, - DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, - {IntrinsicOp::MOP_CommitNonOpaqueTriangleHit, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommitNonOpaqueTriangleHit}, - {IntrinsicOp::MOP_CommitProceduralPrimitiveHit, - TranslateCommitProceduralPrimitiveHit, - DXIL::OpCode::RayQuery_CommitProceduralPrimitiveHit}, - {IntrinsicOp::MOP_CommittedGeometryIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedGeometryIndex}, - {IntrinsicOp::MOP_CommittedInstanceContributionToHitGroupIndex, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex}, - {IntrinsicOp::MOP_CommittedInstanceID, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedInstanceID}, - {IntrinsicOp::MOP_CommittedInstanceIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedInstanceIndex}, - {IntrinsicOp::MOP_CommittedObjectRayDirection, - TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_CommittedObjectRayDirection}, - {IntrinsicOp::MOP_CommittedObjectRayOrigin, TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_CommittedObjectRayOrigin}, - {IntrinsicOp::MOP_CommittedObjectToWorld3x4, - TranslateRayQueryMatrix3x4Operation, - DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, - {IntrinsicOp::MOP_CommittedObjectToWorld4x3, - TranslateRayQueryTransposedMatrix3x4Operation, - DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, - {IntrinsicOp::MOP_CommittedPrimitiveIndex, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedPrimitiveIndex}, - {IntrinsicOp::MOP_CommittedRayT, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedRayT}, - {IntrinsicOp::MOP_CommittedStatus, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedStatus}, - {IntrinsicOp::MOP_CommittedTriangleBarycentrics, - TranslateRayQueryFloat2Getter, - DXIL::OpCode::RayQuery_CommittedTriangleBarycentrics}, - {IntrinsicOp::MOP_CommittedTriangleFrontFace, - TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_CommittedTriangleFrontFace}, - {IntrinsicOp::MOP_CommittedWorldToObject3x4, - TranslateRayQueryMatrix3x4Operation, - DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, - {IntrinsicOp::MOP_CommittedWorldToObject4x3, - TranslateRayQueryTransposedMatrix3x4Operation, - DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, - {IntrinsicOp::MOP_Proceed, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_Proceed}, - {IntrinsicOp::MOP_RayFlags, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_RayFlags}, - {IntrinsicOp::MOP_RayTMin, TranslateGenericRayQueryMethod, - DXIL::OpCode::RayQuery_RayTMin}, - {IntrinsicOp::MOP_TraceRayInline, TranslateTraceRayInline, - DXIL::OpCode::RayQuery_TraceRayInline}, - {IntrinsicOp::MOP_WorldRayDirection, TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_WorldRayDirection}, - {IntrinsicOp::MOP_WorldRayOrigin, TranslateRayQueryFloat3Getter, - DXIL::OpCode::RayQuery_WorldRayOrigin}, + {IntrinsicOp::MOP_WriteSamplerFeedback, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedback}, + {IntrinsicOp::MOP_WriteSamplerFeedbackBias, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackBias}, + {IntrinsicOp::MOP_WriteSamplerFeedbackGrad, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackGrad}, + {IntrinsicOp::MOP_WriteSamplerFeedbackLevel, TranslateWriteSamplerFeedback, DXIL::OpCode::WriteSamplerFeedbackLevel}, + + {IntrinsicOp::MOP_Abort, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_Abort}, + {IntrinsicOp::MOP_CandidateGeometryIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateGeometryIndex}, + {IntrinsicOp::MOP_CandidateInstanceContributionToHitGroupIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex}, + {IntrinsicOp::MOP_CandidateInstanceID, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceID}, + {IntrinsicOp::MOP_CandidateInstanceIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateInstanceIndex}, + {IntrinsicOp::MOP_CandidateObjectRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CandidateObjectRayDirection}, + {IntrinsicOp::MOP_CandidateObjectRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CandidateObjectRayOrigin}, + {IntrinsicOp::MOP_CandidateObjectToWorld3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, + {IntrinsicOp::MOP_CandidateObjectToWorld4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateObjectToWorld3x4}, + {IntrinsicOp::MOP_CandidatePrimitiveIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidatePrimitiveIndex}, + {IntrinsicOp::MOP_CandidateProceduralPrimitiveNonOpaque, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque}, + {IntrinsicOp::MOP_CandidateTriangleBarycentrics, TranslateRayQueryFloat2Getter, DXIL::OpCode::RayQuery_CandidateTriangleBarycentrics}, + {IntrinsicOp::MOP_CandidateTriangleFrontFace, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateTriangleFrontFace}, + {IntrinsicOp::MOP_CandidateTriangleRayT, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateTriangleRayT}, + {IntrinsicOp::MOP_CandidateType, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CandidateType}, + {IntrinsicOp::MOP_CandidateWorldToObject3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, + {IntrinsicOp::MOP_CandidateWorldToObject4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CandidateWorldToObject3x4}, + {IntrinsicOp::MOP_CommitNonOpaqueTriangleHit, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommitNonOpaqueTriangleHit}, + {IntrinsicOp::MOP_CommitProceduralPrimitiveHit, TranslateCommitProceduralPrimitiveHit, DXIL::OpCode::RayQuery_CommitProceduralPrimitiveHit}, + {IntrinsicOp::MOP_CommittedGeometryIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedGeometryIndex}, + {IntrinsicOp::MOP_CommittedInstanceContributionToHitGroupIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex}, + {IntrinsicOp::MOP_CommittedInstanceID, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceID}, + {IntrinsicOp::MOP_CommittedInstanceIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedInstanceIndex}, + {IntrinsicOp::MOP_CommittedObjectRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CommittedObjectRayDirection}, + {IntrinsicOp::MOP_CommittedObjectRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_CommittedObjectRayOrigin}, + {IntrinsicOp::MOP_CommittedObjectToWorld3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, + {IntrinsicOp::MOP_CommittedObjectToWorld4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedObjectToWorld3x4}, + {IntrinsicOp::MOP_CommittedPrimitiveIndex, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedPrimitiveIndex}, + {IntrinsicOp::MOP_CommittedRayT, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedRayT}, + {IntrinsicOp::MOP_CommittedStatus, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedStatus}, + {IntrinsicOp::MOP_CommittedTriangleBarycentrics, TranslateRayQueryFloat2Getter, DXIL::OpCode::RayQuery_CommittedTriangleBarycentrics}, + {IntrinsicOp::MOP_CommittedTriangleFrontFace, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_CommittedTriangleFrontFace}, + {IntrinsicOp::MOP_CommittedWorldToObject3x4, TranslateRayQueryMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, + {IntrinsicOp::MOP_CommittedWorldToObject4x3, TranslateRayQueryTransposedMatrix3x4Operation, DXIL::OpCode::RayQuery_CommittedWorldToObject3x4}, + {IntrinsicOp::MOP_Proceed, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_Proceed}, + {IntrinsicOp::MOP_RayFlags, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_RayFlags}, + {IntrinsicOp::MOP_RayTMin, TranslateGenericRayQueryMethod, DXIL::OpCode::RayQuery_RayTMin}, + {IntrinsicOp::MOP_TraceRayInline, TranslateTraceRayInline, DXIL::OpCode::RayQuery_TraceRayInline}, + {IntrinsicOp::MOP_WorldRayDirection, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_WorldRayDirection}, + {IntrinsicOp::MOP_WorldRayOrigin, TranslateRayQueryFloat3Getter, DXIL::OpCode::RayQuery_WorldRayOrigin}, // SPIRV change starts #ifdef ENABLE_SPIRV_CODEGEN - {IntrinsicOp::MOP_SubpassLoad, UnsupportedVulkanIntrinsic, - DXIL::OpCode::NumOpCodes}, + {IntrinsicOp::MOP_SubpassLoad, UnsupportedVulkanIntrinsic, DXIL::OpCode::NumOpCodes}, #endif // ENABLE_SPIRV_CODEGEN // SPIRV change ends // Manully added part. - {IntrinsicOp::IOP_InterlockedUMax, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_InterlockedUMin, TranslateIopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_WaveActiveUMax, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveUMin, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveUProduct, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveActiveUSum, TranslateWaveA2A, - DXIL::OpCode::WaveActiveOp}, - {IntrinsicOp::IOP_WaveMultiPrefixUProduct, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WaveMultiPrefixUSum, TranslateWaveMultiPrefix, - DXIL::OpCode::WaveMultiPrefixOp}, - {IntrinsicOp::IOP_WavePrefixUProduct, TranslateWaveA2A, - DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_WavePrefixUSum, TranslateWaveA2A, - DXIL::OpCode::WavePrefixOp}, - {IntrinsicOp::IOP_uabs, TranslateUAbs, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_uclamp, TranslateClamp, DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::IOP_ufirstbithigh, TranslateFirstbitHi, - DXIL::OpCode::FirstbitHi}, - {IntrinsicOp::IOP_umad, TranslateFUITrinary, DXIL::OpCode::UMad}, - {IntrinsicOp::IOP_umax, TranslateFUIBinary, DXIL::OpCode::UMax}, - {IntrinsicOp::IOP_umin, TranslateFUIBinary, DXIL::OpCode::UMin}, - {IntrinsicOp::IOP_umul, TranslateMul, DXIL::OpCode::UMul}, - {IntrinsicOp::IOP_usign, TranslateUSign, DXIL::OpCode::UMax}, - {IntrinsicOp::MOP_InterlockedUMax, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, - {IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation, - DXIL::OpCode::NumOpCodes}, + { IntrinsicOp::IOP_InterlockedUMax, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_InterlockedUMin, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_WaveActiveUMax, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, + { IntrinsicOp::IOP_WaveActiveUMin, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, + { IntrinsicOp::IOP_WaveActiveUProduct, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, + { IntrinsicOp::IOP_WaveActiveUSum, TranslateWaveA2A, DXIL::OpCode::WaveActiveOp }, + { IntrinsicOp::IOP_WaveMultiPrefixUProduct, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp }, + { IntrinsicOp::IOP_WaveMultiPrefixUSum, TranslateWaveMultiPrefix, DXIL::OpCode::WaveMultiPrefixOp }, + { IntrinsicOp::IOP_WavePrefixUProduct, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp }, + { IntrinsicOp::IOP_WavePrefixUSum, TranslateWaveA2A, DXIL::OpCode::WavePrefixOp }, + { IntrinsicOp::IOP_uabs, TranslateUAbs, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_uclamp, TranslateClamp, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::IOP_ufirstbithigh, TranslateFirstbitHi, DXIL::OpCode::FirstbitHi }, + { IntrinsicOp::IOP_umad, TranslateFUITrinary, DXIL::OpCode::UMad}, + { IntrinsicOp::IOP_umax, TranslateFUIBinary, DXIL::OpCode::UMax}, + { IntrinsicOp::IOP_umin, TranslateFUIBinary, DXIL::OpCode::UMin }, + { IntrinsicOp::IOP_umul, TranslateMul, DXIL::OpCode::UMul }, + { IntrinsicOp::IOP_usign, TranslateUSign, DXIL::OpCode::UMax }, + { IntrinsicOp::MOP_InterlockedUMax, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, + { IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes }, }; } static_assert(sizeof(gLowerTable) / sizeof(gLowerTable[0]) == static_cast(IntrinsicOp::Num_Intrinsics), From a1de0c5939f151c5b64fdafbf175fac0a48ca55a Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Tue, 18 Jan 2022 11:26:09 -0500 Subject: [PATCH 4/4] Code review --- tools/clang/lib/SPIRV/SpirvEmitter.cpp | 17 +++++++++-------- tools/clang/lib/SPIRV/SpirvEmitter.h | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 2a82362624..3a0e525ffe 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -935,9 +935,9 @@ void SpirvEmitter::doStmt(const Stmt *stmt, // Handle [[vk::ext_capability(..)]] and [[vk::ext_extension(..)]] // attributes for vk::ext_execution_mode[_id](..). createSpirvIntrInstExt( - attrs, QualType(), expr->getExprLoc(), + attrs, QualType(), /*spvArgs*/ llvm::SmallVector{}, - /*isInstr*/ false); + /*isInstr*/ false, expr->getExprLoc()); } } else { emitError("statement class '%0' unimplemented", stmt->getLocStart()) @@ -12734,8 +12734,9 @@ SpirvEmitter::processRayQueryIntrinsics(const CXXMemberCallExpr *expr, } SpirvInstruction *SpirvEmitter::createSpirvIntrInstExt( - llvm::ArrayRef attrs, QualType retType, SourceLocation loc, - const llvm::SmallVectorImpl &spvArgs, bool isInstr) { + llvm::ArrayRef attrs, QualType retType, + const llvm::SmallVectorImpl &spvArgs, bool isInstr, + SourceLocation loc) { llvm::SmallVector capbilities; llvm::SmallVector extensions; llvm::StringRef instSet = ""; @@ -12793,8 +12794,8 @@ SpirvEmitter::processSpvIntrinsicCallExpr(const CallExpr *expr) { } return createSpirvIntrInstExt(funcDecl->getAttrs(), funcDecl->getReturnType(), - expr->getExprLoc(), spvArgs, - /*isInstr*/ true); + spvArgs, + /*isInstr*/ true, expr->getExprLoc()); } SpirvInstruction *SpirvEmitter::processRawBufferLoad(const CallExpr *callExpr) { @@ -12886,9 +12887,9 @@ SpirvEmitter::processSpvIntrinsicTypeDef(const CallExpr *expr) { typeDefAttr->getOpcode(), operands); return createSpirvIntrInstExt( - funcDecl->getAttrs(), QualType(), expr->getExprLoc(), + funcDecl->getAttrs(), QualType(), /*spvArgs*/ llvm::SmallVector{}, - /*isInstr*/ false); + /*isInstr*/ false, expr->getExprLoc()); } bool SpirvEmitter::spirvToolsValidate(std::vector *mod, diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.h b/tools/clang/lib/SPIRV/SpirvEmitter.h index bf9a304815..b1873a3905 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.h +++ b/tools/clang/lib/SPIRV/SpirvEmitter.h @@ -617,8 +617,9 @@ class SpirvEmitter : public ASTConsumer { /// Create SpirvIntrinsicInstruction for arbitrary SPIR-V instructions /// specified by [[vk::ext_instruction(..)]] or [[vk::ext_type_def(..)]] SpirvInstruction *createSpirvIntrInstExt( - llvm::ArrayRef attrs, QualType retType, SourceLocation loc, - const llvm::SmallVectorImpl &spvArgs, bool isInstr); + llvm::ArrayRef attrs, QualType retType, + const llvm::SmallVectorImpl &spvArgs, bool isInstr, + SourceLocation loc); /// Process spirv intrinsic instruction SpirvInstruction *processSpvIntrinsicCallExpr(const CallExpr *expr);