diff --git a/lib/DXIL/DxilOperations.cpp b/lib/DXIL/DxilOperations.cpp index 1e38138347..0e8835c69c 100644 --- a/lib/DXIL/DxilOperations.cpp +++ b/lib/DXIL/DxilOperations.cpp @@ -2763,17 +2763,17 @@ static const OP::OpCodeProperty ExperimentalOps_OpCodeProps[] = { OCC::RayQuery_StateScalar, "rayQuery_StateScalar", Attribute::ReadOnly, - 0, - {}, - {}}, // Overloads: v + 1, + {{0x40}}, + {{0x0}}}, // Overloads: i {OC::RayQuery_CommittedClusterID, "RayQuery_CommittedClusterID", OCC::RayQuery_StateScalar, "rayQuery_StateScalar", Attribute::ReadOnly, - 0, - {}, - {}}, // Overloads: v + 1, + {{0x40}}, + {{0x0}}}, // Overloads: i // Shader Execution Reordering {OC::HitObject_ClusterID, @@ -2781,9 +2781,9 @@ static const OP::OpCodeProperty ExperimentalOps_OpCodeProps[] = { OCC::HitObject_StateScalar, "hitObject_StateScalar", Attribute::ReadNone, - 0, - {}, - {}}, // Overloads: v + 1, + {{0x40}}, + {{0x0}}}, // Overloads: i // Raytracing System Values {OC::TriangleObjectPosition, @@ -4637,7 +4637,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { case OpCode::CheckAccessFullyMapped: A(pI1); A(pI32); - A(pI32); + A(pETy); break; case OpCode::GetDimensions: A(pDim); @@ -4725,9 +4725,9 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pI32); A(pRes); A(pRes); - A(pF32); - A(pF32); - A(pF32); + A(pETy); + A(pETy); + A(pETy); A(pI1); break; @@ -4786,36 +4786,36 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pI8); break; case OpCode::SampleIndex: - A(pI32); + A(pETy); A(pI32); break; case OpCode::Coverage: - A(pI32); + A(pETy); A(pI32); break; case OpCode::InnerCoverage: - A(pI32); + A(pETy); A(pI32); break; // Compute/Mesh/Amplification/Node shader case OpCode::ThreadId: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::GroupId: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::ThreadIdInGroup: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::FlattenedThreadIdInGroup: - A(pI32); + A(pETy); A(pI32); break; @@ -4836,13 +4836,13 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pI8); break; case OpCode::GSInstanceID: - A(pI32); + A(pETy); A(pI32); break; // Double precision case OpCode::MakeDouble: - A(pF64); + A(pETy); A(pI32); A(pI32); A(pI32); @@ -4850,7 +4850,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { case OpCode::SplitDouble: A(pSDT); A(pI32); - A(pF64); + A(pETy); break; // Domain and hull shader @@ -4872,7 +4872,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Domain shader case OpCode::DomainLocation: - A(pF32); + A(pETy); A(pI32); A(pI8); break; @@ -4887,13 +4887,13 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pETy); break; case OpCode::OutputControlPointID: - A(pI32); + A(pETy); A(pI32); break; // Hull, Domain and Geometry shaders case OpCode::PrimitiveID: - A(pI32); + A(pETy); A(pI32); break; @@ -5067,7 +5067,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Graphics shader case OpCode::ViewID: - A(pI32); + A(pETy); A(pI32); break; @@ -5097,71 +5097,71 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Raytracing object space uint System Values case OpCode::InstanceID: - A(pI32); + A(pETy); A(pI32); break; case OpCode::InstanceIndex: - A(pI32); + A(pETy); A(pI32); break; // Raytracing hit uint System Values case OpCode::HitKind: - A(pI32); + A(pETy); A(pI32); break; // Raytracing uint System Values case OpCode::RayFlags: - A(pI32); + A(pETy); A(pI32); break; // Ray Dispatch Arguments case OpCode::DispatchRaysIndex: - A(pI32); + A(pETy); A(pI32); A(pI8); break; case OpCode::DispatchRaysDimensions: - A(pI32); + A(pETy); A(pI32); A(pI8); break; // Ray Vectors case OpCode::WorldRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pI8); break; case OpCode::WorldRayDirection: - A(pF32); + A(pETy); A(pI32); A(pI8); break; // Ray object space Vectors case OpCode::ObjectRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pI8); break; case OpCode::ObjectRayDirection: - A(pF32); + A(pETy); A(pI32); A(pI8); break; // Ray Transforms case OpCode::ObjectToWorld: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::WorldToObject: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); @@ -5169,11 +5169,11 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // RayT case OpCode::RayTMin: - A(pF32); + A(pETy); A(pI32); break; case OpCode::RayTCurrent: - A(pF32); + A(pETy); A(pI32); break; @@ -5230,7 +5230,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Raytracing object space uint System Values case OpCode::PrimitiveIndex: - A(pI32); + A(pETy); A(pI32); break; @@ -5245,16 +5245,16 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pF16); break; case OpCode::Dot4AddI8Packed: + A(pETy); A(pI32); - A(pI32); - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::Dot4AddU8Packed: + A(pETy); A(pI32); - A(pI32); - A(pI32); + A(pETy); A(pI32); A(pI32); break; @@ -5414,7 +5414,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pF32); break; case OpCode::RayQuery_Proceed: - A(pI1); + A(pETy); A(pI32); A(pI32); break; @@ -5435,162 +5435,162 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pF32); break; case OpCode::RayQuery_CommittedStatus: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateType: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateObjectToWorld3x4: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CandidateWorldToObject3x4: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CommittedObjectToWorld3x4: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CommittedWorldToObject3x4: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque: - A(pI1); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateTriangleFrontFace: - A(pI1); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedTriangleFrontFace: - A(pI1); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateTriangleBarycentrics: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CommittedTriangleBarycentrics: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_RayFlags: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_WorldRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_WorldRayDirection: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_RayTMin: - A(pF32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateTriangleRayT: - A(pF32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedRayT: - A(pF32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateInstanceIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateInstanceID: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateGeometryIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidatePrimitiveIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CandidateObjectRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CandidateObjectRayDirection: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CommittedInstanceIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedInstanceID: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedGeometryIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedPrimitiveIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedObjectRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); break; case OpCode::RayQuery_CommittedObjectRayDirection: - A(pF32); + A(pETy); A(pI32); A(pI32); A(pI8); @@ -5598,18 +5598,18 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Raytracing object space uint System Values, raytracing tier 1.1 case OpCode::GeometryIndex: - A(pI32); + A(pETy); A(pI32); break; // Inline Ray Query case OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex: - A(pI32); + A(pETy); A(pI32); A(pI32); break; @@ -5657,7 +5657,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Helper Lanes case OpCode::IsHelperLane: - A(pI1); + A(pETy); A(pI32); break; @@ -5909,11 +5909,11 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Extended Command Information case OpCode::StartVertexLocation: - A(pI32); + A(pETy); A(pI32); break; case OpCode::StartInstanceLocation: - A(pI32); + A(pETy); A(pI32); break; @@ -6003,100 +6003,100 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { A(pI32); break; case OpCode::HitObject_IsMiss: - A(pI1); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_IsHit: - A(pI1); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_IsNop: - A(pI1); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_RayFlags: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_RayTMin: - A(pF32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_RayTCurrent: - A(pF32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_WorldRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); break; case OpCode::HitObject_WorldRayDirection: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); break; case OpCode::HitObject_ObjectRayOrigin: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); break; case OpCode::HitObject_ObjectRayDirection: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); break; case OpCode::HitObject_ObjectToWorld3x4: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); A(pI32); break; case OpCode::HitObject_WorldToObject3x4: - A(pF32); + A(pETy); A(pI32); A(pHit); A(pI32); A(pI32); break; case OpCode::HitObject_GeometryIndex: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_InstanceIndex: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_InstanceID: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_PrimitiveIndex: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_HitKind: - A(pI32); + A(pETy); A(pI32); A(pHit); break; case OpCode::HitObject_ShaderTableIndex: - A(pI32); + A(pETy); A(pI32); A(pHit); break; @@ -6291,44 +6291,44 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) { // Inline Ray Query case OpCode::RayQuery_CandidateClusterID: - A(pI32); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedClusterID: - A(pI32); + A(pETy); A(pI32); A(pI32); break; // Shader Execution Reordering case OpCode::HitObject_ClusterID: - A(pI32); + A(pETy); A(pI32); A(pHit); break; // Raytracing System Values case OpCode::TriangleObjectPosition: - A(pV); + A(pETy); A(pI32); break; // Inline Ray Query case OpCode::RayQuery_CandidateTriangleObjectPosition: - A(pV); + A(pETy); A(pI32); A(pI32); break; case OpCode::RayQuery_CommittedTriangleObjectPosition: - A(pV); + A(pETy); A(pI32); A(pI32); break; // Shader Execution Reordering case OpCode::HitObject_TriangleObjectPosition: - A(pV); + A(pETy); A(pI32); A(pHit); break; @@ -6499,6 +6499,8 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) { case OpCode::UDiv: case OpCode::UAddc: case OpCode::USubb: + case OpCode::CheckAccessFullyMapped: + case OpCode::SplitDouble: case OpCode::WaveActiveAllEqual: case OpCode::CreateHandleForLib: case OpCode::WaveMatch: @@ -6514,16 +6516,17 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) { if (FT->getNumParams() <= 5) return nullptr; return FT->getParamType(5); - case OpCode::TraceRay: - case OpCode::HitObject_TraceRay: - if (FT->getNumParams() <= 15) - return nullptr; - return FT->getParamType(15); + case OpCode::CalculateLOD: case OpCode::ReportHit: case OpCode::HitObject_FromRayQueryWithAttrs: if (FT->getNumParams() <= 3) return nullptr; return FT->getParamType(3); + case OpCode::TraceRay: + case OpCode::HitObject_TraceRay: + if (FT->getNumParams() <= 15) + return nullptr; + return FT->getParamType(15); case OpCode::CreateHandle: case OpCode::BufferUpdateCounter: case OpCode::GetDimensions: @@ -6626,105 +6629,8 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) { case OpCode::GetGroupWaveIndex: case OpCode::GetGroupWaveCount: case OpCode::ClusterID: - case OpCode::RayQuery_CandidateClusterID: - case OpCode::RayQuery_CommittedClusterID: - case OpCode::HitObject_ClusterID: return Type::getVoidTy(Ctx); - case OpCode::CheckAccessFullyMapped: - case OpCode::SampleIndex: - case OpCode::Coverage: - case OpCode::InnerCoverage: - case OpCode::ThreadId: - case OpCode::GroupId: - case OpCode::ThreadIdInGroup: - case OpCode::FlattenedThreadIdInGroup: - case OpCode::GSInstanceID: - case OpCode::OutputControlPointID: - case OpCode::PrimitiveID: - case OpCode::ViewID: - case OpCode::InstanceID: - case OpCode::InstanceIndex: - case OpCode::HitKind: - case OpCode::RayFlags: - case OpCode::DispatchRaysIndex: - case OpCode::DispatchRaysDimensions: - case OpCode::PrimitiveIndex: - case OpCode::Dot4AddI8Packed: - case OpCode::Dot4AddU8Packed: - case OpCode::RayQuery_CommittedStatus: - case OpCode::RayQuery_CandidateType: - case OpCode::RayQuery_RayFlags: - case OpCode::RayQuery_CandidateInstanceIndex: - case OpCode::RayQuery_CandidateInstanceID: - case OpCode::RayQuery_CandidateGeometryIndex: - case OpCode::RayQuery_CandidatePrimitiveIndex: - case OpCode::RayQuery_CommittedInstanceIndex: - case OpCode::RayQuery_CommittedInstanceID: - case OpCode::RayQuery_CommittedGeometryIndex: - case OpCode::RayQuery_CommittedPrimitiveIndex: - case OpCode::GeometryIndex: - case OpCode::RayQuery_CandidateInstanceContributionToHitGroupIndex: - case OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex: - case OpCode::StartVertexLocation: - case OpCode::StartInstanceLocation: - case OpCode::HitObject_RayFlags: - case OpCode::HitObject_GeometryIndex: - case OpCode::HitObject_InstanceIndex: - case OpCode::HitObject_InstanceID: - case OpCode::HitObject_PrimitiveIndex: - case OpCode::HitObject_HitKind: - case OpCode::HitObject_ShaderTableIndex: - return IntegerType::get(Ctx, 32); - case OpCode::CalculateLOD: - case OpCode::DomainLocation: - case OpCode::WorldRayOrigin: - case OpCode::WorldRayDirection: - case OpCode::ObjectRayOrigin: - case OpCode::ObjectRayDirection: - case OpCode::ObjectToWorld: - case OpCode::WorldToObject: - case OpCode::RayTMin: - case OpCode::RayTCurrent: - case OpCode::RayQuery_CandidateObjectToWorld3x4: - case OpCode::RayQuery_CandidateWorldToObject3x4: - case OpCode::RayQuery_CommittedObjectToWorld3x4: - case OpCode::RayQuery_CommittedWorldToObject3x4: - case OpCode::RayQuery_CandidateTriangleBarycentrics: - case OpCode::RayQuery_CommittedTriangleBarycentrics: - case OpCode::RayQuery_WorldRayOrigin: - case OpCode::RayQuery_WorldRayDirection: - case OpCode::RayQuery_RayTMin: - case OpCode::RayQuery_CandidateTriangleRayT: - case OpCode::RayQuery_CommittedRayT: - case OpCode::RayQuery_CandidateObjectRayOrigin: - case OpCode::RayQuery_CandidateObjectRayDirection: - case OpCode::RayQuery_CommittedObjectRayOrigin: - case OpCode::RayQuery_CommittedObjectRayDirection: - case OpCode::HitObject_RayTMin: - case OpCode::HitObject_RayTCurrent: - case OpCode::HitObject_WorldRayOrigin: - case OpCode::HitObject_WorldRayDirection: - case OpCode::HitObject_ObjectRayOrigin: - case OpCode::HitObject_ObjectRayDirection: - case OpCode::HitObject_ObjectToWorld3x4: - case OpCode::HitObject_WorldToObject3x4: - case OpCode::TriangleObjectPosition: - case OpCode::RayQuery_CandidateTriangleObjectPosition: - case OpCode::RayQuery_CommittedTriangleObjectPosition: - case OpCode::HitObject_TriangleObjectPosition: - return Type::getFloatTy(Ctx); - case OpCode::MakeDouble: - case OpCode::SplitDouble: - return Type::getDoubleTy(Ctx); - case OpCode::RayQuery_Proceed: - case OpCode::RayQuery_CandidateProceduralPrimitiveNonOpaque: - case OpCode::RayQuery_CandidateTriangleFrontFace: - case OpCode::RayQuery_CommittedTriangleFrontFace: - case OpCode::IsHelperLane: case OpCode::QuadVote: - case OpCode::HitObject_IsMiss: - case OpCode::HitObject_IsHit: - case OpCode::HitObject_IsNop: return IntegerType::get(Ctx, 1); case OpCode::CBufferLoadLegacy: case OpCode::Sample: diff --git a/utils/hct/hctdb.py b/utils/hct/hctdb.py index 2ae135ebc8..a3b22024ff 100644 --- a/utils/hct/hctdb.py +++ b/utils/hct/hctdb.py @@ -162,10 +162,47 @@ def process_oload_types(self): self.num_oloads = 0 + # Overload Note: There are operations that really didn't need + # overload types, and originally did not use any overload types in the + # operands, but specified a single overload type in the oload_types. + # These have been updated to use the overload type in the appropriate + # place, rather than changing the overload type to "v", because Changing + # the oload_types to "v" would change the name of the function in DXIL, + # which could be breaking for some DXIL consumers, depending on how they + # interpret the DXIL. So, there are "Overload Note:" comments on + # certain DXIL op definitions to highlight these cases. + + # While these could technically be cleaned up, the external impact would + # be large and it's unlikely to ever be worth it. + + # Other cases specified one overload type and could potentially have + # used the specified overload, but were not currently using it in the + # operands (like system value getters). These have been updated to use + # the overload type in the operands, without adding the comment, and + # could support additional overloads in the future (like for half or + # int16). + + def uses_oload_types(inst): + "Return true if any operand uses an overload type." + for op in inst.ops: + # All overload types start with a '$' + if op.llvm_type[0] == "$": + return True + # Early out for void overloads. if self.oload_types == "v": + if uses_oload_types(self): + raise ValueError( + f"void overloads 'v' used with overloaded operand type(s) for '({self.name})'" + ) return + if not uses_oload_types(self): + raise ValueError( + f"'({self.name})' specifies overloads ({self.oload_types}), " + + "but no overload types used in operands" + ) + if self.oload_types == "": raise ValueError( f"overload for '{self.name}' should not be empty - use void if n/a" @@ -2523,6 +2560,9 @@ def UFI(name, **mappings): ], counters=("atomic",), ) + # Overload Note: CheckAccessFullyMapped is overloaded "i" for historical + # reasons, but doesn't use this. Note that "$o" for operand 2 here can + # only ever be "i32". add_dxil_op( "CheckAccessFullyMapped", "CheckAccessFullyMapped", @@ -2538,7 +2578,7 @@ def UFI(name, **mappings): ), db_dxil_param( 2, - "u32", + "$o", "status", "status result from the Sample, Gather or Load operation", ), @@ -2734,6 +2774,10 @@ def UFI(name, **mappings): ) # Pixel shader + # Overload Note: CalculateLOD is overloaded "f", but didn't use + # any overload type. Operands 4-6 used to be "f", but have been changed + # to use the overload type "$o". In the future, this operation could be + # overloaded for half precision coordinates. add_dxil_op( "CalculateLOD", "CalculateLOD", @@ -2744,9 +2788,9 @@ def UFI(name, **mappings): db_dxil_param(0, "f", "", "level of detail"), db_dxil_param(2, "res", "handle", "resource handle"), db_dxil_param(3, "res", "sampler", "sampler handle"), - db_dxil_param(4, "f", "coord0", "coordinate"), - db_dxil_param(5, "f", "coord1", "coordinate"), - db_dxil_param(6, "f", "coord2", "coordinate"), + db_dxil_param(4, "$o", "coord0", "coordinate"), + db_dxil_param(5, "$o", "coord1", "coordinate"), + db_dxil_param(6, "$o", "coord2", "coordinate"), db_dxil_param( 7, "i1", @@ -2902,7 +2946,7 @@ def UFI(name, **mappings): "returns the sample index in a sample-frequency pixel shader", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( "Coverage", @@ -2910,7 +2954,7 @@ def UFI(name, **mappings): "returns the coverage mask input in a pixel shader", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( "InnerCoverage", @@ -2918,7 +2962,7 @@ def UFI(name, **mappings): "returns underestimated coverage input from conservative rasterization in a pixel shader", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # Compute shader. @@ -2929,7 +2973,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "thread ID component"), + db_dxil_param(0, "$o", "", "thread ID component"), db_dxil_param(2, "i32", "component", "component to read (x,y,z)"), ], ) @@ -2940,7 +2984,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "group ID component"), + db_dxil_param(0, "$o", "", "group ID component"), db_dxil_param(2, "i32", "component", "component to read"), ], ) @@ -2951,7 +2995,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "thread ID in group component"), + db_dxil_param(0, "$o", "", "thread ID in group component"), db_dxil_param(2, "i32", "component", "component to read (x,y,z)"), ], ) @@ -2961,7 +3005,7 @@ def UFI(name, **mappings): "provides a flattened index for a given thread within a given group (SV_GroupIndex)", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # Geometry shader @@ -3007,10 +3051,12 @@ def UFI(name, **mappings): "GSInstanceID", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # Double precision + # Overload Note: MakeDouble is overloaded "d" for historical reasons, + # but doesn't use this. The result "$o" can only ever be "double". add_dxil_op( "MakeDouble", "MakeDouble", @@ -3018,11 +3064,13 @@ def UFI(name, **mappings): "d", "rn", [ - db_dxil_param(0, "d", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i32", "lo", "low part of double"), db_dxil_param(3, "i32", "hi", "high part of double"), ], ) + # Overload Note: SplitDouble is overloaded "d" for historical reasons, + # but doesn't use this. Operand 2 "$o" can only ever be "double". add_dxil_op( "SplitDouble", "SplitDouble", @@ -3031,7 +3079,7 @@ def UFI(name, **mappings): "rn", [ db_dxil_param(0, "splitdouble", "", "result"), - db_dxil_param(2, "d", "value", "value to split"), + db_dxil_param(2, "$o", "value", "value to split"), ], ) @@ -3074,7 +3122,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "component", "input", is_const=True), ], ) @@ -3101,7 +3149,7 @@ def UFI(name, **mappings): "OutputControlPointID", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( "PrimitiveID", @@ -3109,7 +3157,7 @@ def UFI(name, **mappings): "PrimitiveID", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3546,7 +3594,7 @@ def UFI(name, **mappings): "returns the view index", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # End of DXIL 1.1 opcodes. @@ -3641,7 +3689,7 @@ def UFI(name, **mappings): "The user-provided InstanceID on the bottom-level acceleration structure instance within the top-level structure", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3650,7 +3698,7 @@ def UFI(name, **mappings): "The autogenerated index of the current instance in the top-level structure", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3659,7 +3707,7 @@ def UFI(name, **mappings): "Returns the value passed as HitKind in ReportIntersection(). If intersection was reported by fixed-function triangle intersection, HitKind will be one of HIT_KIND_TRIANGLE_FRONT_FACE or HIT_KIND_TRIANGLE_BACK_FACE.", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3668,7 +3716,7 @@ def UFI(name, **mappings): "uint containing the current ray flags.", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3678,7 +3726,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3690,7 +3738,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3702,7 +3750,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3714,7 +3762,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3726,7 +3774,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3738,7 +3786,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i8", "col", "column, relative to the element"), ], ) @@ -3750,7 +3798,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i32", "row", "row, relative to the element"), db_dxil_param(3, "i8", "col", "column, relative to the element"), ], @@ -3763,7 +3811,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "result"), + db_dxil_param(0, "$o", "", "result"), db_dxil_param(2, "i32", "row", "row, relative to the element"), db_dxil_param(3, "i8", "col", "column, relative to the element"), ], @@ -3775,7 +3823,7 @@ def UFI(name, **mappings): "float representing the parametric starting point for the ray.", "f", "rn", - [db_dxil_param(0, "f", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3784,7 +3832,7 @@ def UFI(name, **mappings): "float representing the current parametric ending point for the ray", "f", "ro", - [db_dxil_param(0, "f", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -3854,7 +3902,7 @@ def UFI(name, **mappings): db_dxil_param(15, "f", "TMax", "Tmax of the ray"), db_dxil_param( 16, - "udt", + "$udt", "payload", "User-defined intersection attribute structure", ), @@ -3880,7 +3928,7 @@ def UFI(name, **mappings): ), db_dxil_param( 4, - "udt", + "$udt", "Attributes", "User-defined intersection attribute structure", ), @@ -3903,7 +3951,7 @@ def UFI(name, **mappings): ), db_dxil_param( 3, - "udt", + "$udt", "Parameter", "User-defined parameters to pass to the callable shader,This parameter structure must match the parameter structure used in the callable shader pointed to in the shader table", ), @@ -3918,7 +3966,7 @@ def UFI(name, **mappings): "ro", [ db_dxil_param(0, "res", "", "result"), - db_dxil_param(2, "obj", "Resource", "resource to create the handle"), + db_dxil_param(2, "$obj", "Resource", "resource to create the handle"), ], ) @@ -3929,7 +3977,7 @@ def UFI(name, **mappings): "PrimitiveIndex for raytracing shaders", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # End of DXIL 1.3 opcodes. @@ -3965,8 +4013,8 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "accumulated result"), - db_dxil_param(2, "i32", "acc", "input accumulator"), + db_dxil_param(0, "$o", "", "accumulated result"), + db_dxil_param(2, "$o", "acc", "input accumulator"), db_dxil_param(3, "i32", "a", "first packed 4 x i8 for dot product"), db_dxil_param(4, "i32", "b", "second packed 4 x i8 for dot product"), ], @@ -3980,8 +4028,8 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "accumulated result"), - db_dxil_param(2, "i32", "acc", "input accumulator"), + db_dxil_param(0, "$o", "", "accumulated result"), + db_dxil_param(2, "$o", "acc", "input accumulator"), db_dxil_param(3, "i32", "a", "first packed 4 x u8 for dot product"), db_dxil_param(4, "i32", "b", "second packed 4 x u8 for dot product"), ], @@ -4344,7 +4392,7 @@ def UFI(name, **mappings): "1", "", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4395,7 +4443,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4407,7 +4455,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4419,7 +4467,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i32", "row", "row [0..2], relative to the element"), db_dxil_param(4, "i8", "col", "column [0..3], relative to the element"), @@ -4433,7 +4481,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i32", "row", "row [0..2], relative to the element"), db_dxil_param(4, "i8", "col", "column [0..3], relative to the element"), @@ -4447,7 +4495,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i32", "row", "row [0..2], relative to the element"), db_dxil_param(4, "i8", "col", "column [0..3], relative to the element"), @@ -4461,7 +4509,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i32", "row", "row [0..2], relative to the element"), db_dxil_param(4, "i8", "col", "column [0..3], relative to the element"), @@ -4475,7 +4523,7 @@ def UFI(name, **mappings): "1", "ro", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4487,7 +4535,7 @@ def UFI(name, **mappings): "1", "ro", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4499,7 +4547,7 @@ def UFI(name, **mappings): "1", "ro", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4511,7 +4559,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4524,7 +4572,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4537,7 +4585,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4549,7 +4597,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4562,7 +4610,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4575,7 +4623,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4587,7 +4635,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4599,7 +4647,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4611,7 +4659,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4623,7 +4671,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4635,7 +4683,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4647,7 +4695,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4659,7 +4707,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4672,7 +4720,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4685,7 +4733,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4697,7 +4745,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4709,7 +4757,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4721,7 +4769,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4733,7 +4781,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4746,7 +4794,7 @@ def UFI(name, **mappings): "f", "ro", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), db_dxil_param(3, "i8", "component", "component [0..2]", is_const=True), ], @@ -4758,7 +4806,7 @@ def UFI(name, **mappings): "The autogenerated index of the current geometry in the bottom-level structure", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -4768,7 +4816,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4780,7 +4828,7 @@ def UFI(name, **mappings): "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -4888,13 +4936,15 @@ def UFI(name, **mappings): ], ) + # Overload Note: IsHelperLane specifies overloads "1" for historical + # reasons, but doesn't use this. The return "$o" will always be i1. add_dxil_op( "IsHelperLane", "IsHelperLane", "returns true on helper lanes in pixel shaders", "1", "ro", - [db_dxil_param(0, "i1", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # End of DXIL 1.6 opcodes. @@ -5408,7 +5458,7 @@ def UFI(name, **mappings): "returns the BaseVertexLocation from DrawIndexedInstanced or StartVertexLocation from DrawInstanced", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) add_dxil_op( @@ -5417,7 +5467,7 @@ def UFI(name, **mappings): "returns the StartInstanceLocation from Draw*Instanced", "i", "rn", - [db_dxil_param(0, "i32", "", "result")], + [db_dxil_param(0, "$o", "", "result")], ) # End of DXIL 1.8 opcodes. @@ -5511,7 +5561,7 @@ def UFI(name, **mappings): db_dxil_param(15, "f", "TMax", "Tmax of the ray"), db_dxil_param( 16, - "udt", + "$udt", "payload", "User-defined payload structure", ), @@ -5549,7 +5599,7 @@ def UFI(name, **mappings): "HitKind", "User-specified value in range of 0-127 to identify the type of hit", ), - db_dxil_param(4, "udt", "CommittedAttribs", "Committed attributes"), + db_dxil_param(4, "$udt", "CommittedAttribs", "Committed attributes"), ], ) @@ -5594,7 +5644,7 @@ def UFI(name, **mappings): db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param( 3, - "udt", + "$udt", "payload", "User-defined payload structure", ), @@ -5627,7 +5677,7 @@ def UFI(name, **mappings): "1", "rn", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5639,7 +5689,7 @@ def UFI(name, **mappings): "1", "rn", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5651,7 +5701,7 @@ def UFI(name, **mappings): "1", "rn", [ - db_dxil_param(0, "i1", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5663,7 +5713,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5675,7 +5725,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5687,7 +5737,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5699,7 +5749,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param(3, "i32", "component", "component [0..2]", is_const=True), ], @@ -5712,7 +5762,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param(3, "i32", "component", "component [0..2]", is_const=True), ], @@ -5725,7 +5775,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param(3, "i32", "component", "component [0..2]", is_const=True), ], @@ -5738,7 +5788,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param(3, "i32", "component", "component [0..2]", is_const=True), ], @@ -5751,7 +5801,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param( 3, @@ -5777,7 +5827,7 @@ def UFI(name, **mappings): "f", "rn", [ - db_dxil_param(0, "f", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param( 3, @@ -5803,7 +5853,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5815,7 +5865,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5827,7 +5877,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5839,7 +5889,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5851,7 +5901,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5863,7 +5913,7 @@ def UFI(name, **mappings): "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -5906,7 +5956,7 @@ def UFI(name, **mappings): retvoid_param, db_dxil_param(2, "hit_object", "hitObject", "hit"), db_dxil_param( - 3, "udt", "attributes", "pointer to store the attributes to" + 3, "$udt", "attributes", "pointer to store the attributes to" ), ], ) @@ -6175,10 +6225,10 @@ def populate_ExperimentalOps(self): "RayQuery_CandidateClusterID", "RayQuery_StateScalar", "returns candidate hit cluster ID", - "v", + "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -6186,10 +6236,10 @@ def populate_ExperimentalOps(self): "RayQuery_CommittedClusterID", "RayQuery_StateScalar", "returns committed hit cluster ID", - "v", + "i", "ro", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -6197,10 +6247,10 @@ def populate_ExperimentalOps(self): "HitObject_ClusterID", "HitObject_StateScalar", "returns the cluster ID of this committed hit", - "v", + "i", "rn", [ - db_dxil_param(0, "i32", "", "operation result"), + db_dxil_param(0, "$o", "", "operation result"), db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -6213,7 +6263,7 @@ def populate_ExperimentalOps(self): "f", "rn", [ - db_dxil_param(0, "v", "", "operation result"), # TODO: $vec9 + db_dxil_param(0, "$o", "", "operation result"), # TODO: $vec9 ], ) add_dxil_op( @@ -6223,7 +6273,7 @@ def populate_ExperimentalOps(self): "f", "ro", [ - db_dxil_param(0, "v", "", "operation result"), # TODO: $vec9 + db_dxil_param(0, "$o", "", "operation result"), # TODO: $vec9 db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -6234,7 +6284,7 @@ def populate_ExperimentalOps(self): "f", "ro", [ - db_dxil_param(0, "v", "", "operation result"), # TODO: $vec9 + db_dxil_param(0, "$o", "", "operation result"), # TODO: $vec9 db_dxil_param(2, "i32", "rayQueryHandle", "RayQuery handle"), ], ) @@ -6245,7 +6295,7 @@ def populate_ExperimentalOps(self): "f", "rn", [ - db_dxil_param(0, "v", "", "operation result"), # TODO: $vec9 + db_dxil_param(0, "$o", "", "operation result"), # TODO: $vec9 db_dxil_param(2, "hit_object", "hitObject", "hit"), ], ) @@ -6285,10 +6335,12 @@ def finalize_dxil_operations(self): ) self.verify_dense(i.ops, lambda x: x.pos, lambda x: i.name) - # Verify that all operations in each class have the same signature. + self.verify_dxil_op_classes() + + def verify_dxil_op_classes(self): + "Verify that all DXIL operations in each class have the same signature." import itertools - class_sort_func = lambda x, y: x < y class_key_func = lambda x: x.dxil_class instr_ordered_by_class = sorted(self.get_dxil_ops(), key=class_key_func) instr_grouped_by_class = itertools.groupby( @@ -6296,20 +6348,39 @@ def finalize_dxil_operations(self): ) def calc_oload_sig(inst): - result = "" - for o in inst.ops: - result += o.llvm_type + # if function class is ever overloaded, no "v" oload should be used + oload = "void" if inst.oload_types == "v" else "overloaded" + result = f"{inst.fn_attr}|{oload}(" + result += ",".join([o.llvm_type for o in inst.ops]) + ")" return result + inconsistencies = [] for k, g in instr_grouped_by_class: + inconsistencies_in_class = [] group = list(g) if len(group) > 1: first = group[0] - first_group = calc_oload_sig(first) + first_sig = calc_oload_sig(first) for other in group[1:]: - other_group = calc_oload_sig(other) - # TODO: uncomment assert when opcodes are fixed - # assert first_group == other_group, "overload signature %s for instruction %s differs from %s in %s" % (first.name, first_group, other.name, other_group) + if other.name == "WavePrefixBitCount": + # known exception - this op is overloaded but has different signature for "v" oload + continue + other_sig = calc_oload_sig(other) + if first_sig != other_sig: + inconsistencies_in_class.append((other, other_sig)) + if inconsistencies_in_class: + inconsistencies.append( + "Inconsistent overload signatures for DXIL op class " + + f"{first.dxil_class} first: {first.name} '{first_sig}', others:\n" + + "\n".join( + [ + f" {other.name} '{other_sig}'" + for other, other_sig in inconsistencies_in_class + ] + ) + ) + if inconsistencies: + raise RuntimeError("\n".join(inconsistencies)) def populate_extended_docs(self): "Update the documentation with text from external files." diff --git a/utils/hct/hctdb_instrhelp.py b/utils/hct/hctdb_instrhelp.py index 33c87e25ef..b703772ebc 100644 --- a/utils/hct/hctdb_instrhelp.py +++ b/utils/hct/hctdb_instrhelp.py @@ -612,7 +612,6 @@ def print_opfunc_table(self): "i32c": "A(pI32C);", "i64": "A(pI64);", "i8": "A(pI8);", - "$u4": "A(pI4S);", "pf32": "A(pPF32);", "res": "A(pRes);", "splitdouble": "A(pSDT);", @@ -631,15 +630,11 @@ def print_opfunc_table(self): "u8": "A(pI8);", "v": "A(pV);", "$vec4": "VEC4(pETy);", - "w": "A(pWav);", "SamplePos": "A(pPos);", - "udt": "A(udt);", - "obj": "A(obj);", + "$udt": "A(udt);", + "$obj": "A(obj);", "resproperty": "A(resProperty);", "resbind": "A(resBind);", - "waveMat": "A(pWaveMatPtr);", - "waveMatProps": "A(pWaveMatProps);", - "$gsptr": "A(pGSEltPtrTy);", "nodehandle": "A(pNodeHandle);", "noderecordhandle": "A(pNodeRecordHandle);", "nodeproperty": "A(nodeProperty);", @@ -674,8 +669,8 @@ def print_opfunc_oload_type(self): elt_ty = "$o" res_ret_ty = "$r" cb_ret_ty = "$cb" - udt_ty = "udt" - obj_ty = "obj" + udt_ty = "$udt" + obj_ty = "$obj" vec_ty = "$vec" gsptr_ty = "$gsptr" extended_ty = "$x" @@ -769,7 +764,7 @@ def print_opfunc_oload_type(self): "v": "Type::getVoidTy(Ctx)", # No other types should be referenced here. } - assert ty in type_code_texts, "llvm type %s is unknown" % (ty) + assert ty in type_code_texts, f"llvm type {ty} is unknown, '{instr.name}'" ty_code = type_code_texts[ty] if ty_code not in single_dict: