1111#include " dxc/DXIL/DxilSemantic.h"
1212#include " dxc/DXIL/DxilSignature.h"
1313#include " dxc/DXIL/DxilShaderModel.h"
14+ #include " dxc/DXIL/DxilUtil.h"
1415#include " dxc/Support/Global.h"
1516
1617#include < string>
@@ -24,9 +25,15 @@ namespace hlsl {
2425// Semantic class methods.
2526//
2627Semantic::Semantic (Kind Kind,
27- const char *pszName)
28+ const char *pszName,
29+ CompTy allowedTys,
30+ SizeClass minCompCount,
31+ SizeClass maxCompCount)
2832: m_Kind(Kind)
2933, m_pszName(pszName)
34+ , m_allowedTys(allowedTys)
35+ , m_minCompCount(minCompCount)
36+ , m_maxCompCount(maxCompCount)
3037{
3138}
3239
@@ -113,41 +120,159 @@ bool Semantic::IsInvalid() const {
113120 return m_Kind == Kind::Invalid;
114121}
115122
123+ Semantic::SizeClass Semantic::GetCompCount (llvm::Type* ty) const {
124+
125+ if (!ty->isVectorTy () && !dxilutil::IsIntegerOrFloatingPointType (ty))
126+ return SizeClass::Unknown;
127+
128+ if (ty->isVectorTy ()) {
129+ if (ty->getVectorNumElements () == 1 ) {
130+ return SizeClass::Scalar;
131+ }
132+ else if (ty->getVectorNumElements () == 2 ) {
133+ return SizeClass::Vec2;
134+ }
135+ else if (ty->getVectorNumElements () == 3 ) {
136+ return SizeClass::Vec3;
137+ }
138+ else if (ty->getVectorNumElements () == 4 ) {
139+ return SizeClass::Vec4;
140+ }
141+ else {
142+ DXASSERT (false , " Unexpected number of vector elements." );
143+ return SizeClass::Unknown;
144+ }
145+ }
146+
147+ return SizeClass::Scalar;
148+ }
149+
150+ Semantic::CompTy Semantic::GetCompType (llvm::Type* ty) const {
151+
152+ if (!ty->isVectorTy () && !dxilutil::IsIntegerOrFloatingPointType (ty))
153+ return CompTy::AnyTy;
154+
155+ if (ty->isVectorTy ())
156+ ty = ty->getScalarType ();
157+
158+ // must be an integer or a floating point type here
159+ DXASSERT_NOMSG (dxilutil::IsIntegerOrFloatingPointType (ty));
160+ if (ty->getScalarType ()->isIntegerTy ()) {
161+ if (ty->getScalarSizeInBits () == 1 ) {
162+ return CompTy::BoolTy;
163+ } else if (ty->getScalarSizeInBits () == 16 ) {
164+ return CompTy::Int16Ty;
165+ } else if (ty->getScalarSizeInBits () == 32 ) {
166+ return CompTy::Int32Ty;
167+ } else {
168+ return CompTy::Int64Ty;
169+ }
170+ } else {
171+ if (ty->isHalfTy ()) {
172+ return CompTy::HalfTy;
173+ } else if (ty->isFloatTy ()) {
174+ return CompTy::FloatTy;
175+ } else {
176+ DXASSERT_NOMSG (ty->isDoubleTy ());
177+ return CompTy::DoubleTy;
178+ }
179+ }
180+ }
181+
182+ static bool IsScalarOrVectorTy (llvm::Type* ty) {
183+ if (dxilutil::IsIntegerOrFloatingPointType (ty))
184+ return true ;
185+ if (ty->isVectorTy () &&
186+ dxilutil::IsIntegerOrFloatingPointType (ty->getVectorElementType ()))
187+ return true ;
188+ return false ;
189+ }
190+
191+ bool Semantic::IsSupportedType (llvm::Type* semTy) const {
192+
193+ if (m_Kind == Kind::Invalid)
194+ return false ;
195+
196+ // Skip type checking for Arbitrary kind
197+ if (m_Kind == Kind::Arbitrary)
198+ return true ;
199+
200+ if (!IsScalarOrVectorTy (semTy)) {
201+ // We only allow scalar or vector types as a valid semantic type except in some cases
202+ // such as Clip/Cull or Tessfactor.
203+ if (m_minCompCount == SizeClass::Other) {
204+ if (semTy->isArrayTy ()) {
205+ semTy = semTy->getArrayElementType ();
206+ // TessFactor or InsideTessFactor must either be float[2] or float
207+ if ((m_Kind == Kind::TessFactor ||
208+ m_Kind == Kind::InsideTessFactor) &&
209+ !dxilutil::IsIntegerOrFloatingPointType (semTy)) {
210+ return false ;
211+ }
212+ // Clip/Cull can be array of scalar or vector
213+ if ((m_Kind == Kind::ClipDistance ||
214+ m_Kind == Kind::CullDistance) &&
215+ !IsScalarOrVectorTy (semTy)) {
216+ return false ;
217+ }
218+ }
219+ else {
220+ // Do not support other types such as matrix.
221+ return false ;
222+ }
223+ }
224+ else {
225+ return false ;
226+ }
227+ }
228+
229+ if (((unsigned )m_allowedTys & (unsigned )GetCompType (semTy)) == 0 )
230+ return false ;
231+
232+ // Skip type-shape validation for semantics marked as Other
233+ if (m_minCompCount == SizeClass::Other)
234+ return true ;
235+
236+ SizeClass compSzClass = GetCompCount (semTy);
237+ return compSzClass >= m_minCompCount &&
238+ compSzClass <= m_maxCompCount;
239+ }
240+
116241typedef Semantic SP;
117242const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords ] = {
118243 // Kind Name
119- SP (Kind::Arbitrary, nullptr ),
120- SP (Kind::VertexID, " SV_VertexID" ),
121- SP (Kind::InstanceID, " SV_InstanceID" ),
122- SP (Kind::Position, " SV_Position" ),
123- SP (Kind::RenderTargetArrayIndex," SV_RenderTargetArrayIndex" ),
124- SP (Kind::ViewPortArrayIndex, " SV_ViewportArrayIndex" ),
125- SP (Kind::ClipDistance, " SV_ClipDistance" ),
126- SP (Kind::CullDistance, " SV_CullDistance" ),
127- SP (Kind::OutputControlPointID, " SV_OutputControlPointID" ),
128- SP (Kind::DomainLocation, " SV_DomainLocation" ),
129- SP (Kind::PrimitiveID, " SV_PrimitiveID" ),
130- SP (Kind::GSInstanceID, " SV_GSInstanceID" ),
131- SP (Kind::SampleIndex, " SV_SampleIndex" ),
132- SP (Kind::IsFrontFace, " SV_IsFrontFace" ),
133- SP (Kind::Coverage, " SV_Coverage" ),
134- SP (Kind::InnerCoverage, " SV_InnerCoverage" ),
135- SP (Kind::Target, " SV_Target" ),
136- SP (Kind::Depth, " SV_Depth" ),
137- SP (Kind::DepthLessEqual, " SV_DepthLessEqual" ),
138- SP (Kind::DepthGreaterEqual, " SV_DepthGreaterEqual" ),
139- SP (Kind::StencilRef, " SV_StencilRef" ),
140- SP (Kind::DispatchThreadID, " SV_DispatchThreadID" ),
141- SP (Kind::GroupID, " SV_GroupID" ),
142- SP (Kind::GroupIndex, " SV_GroupIndex" ),
143- SP (Kind::GroupThreadID, " SV_GroupThreadID" ),
144- SP (Kind::TessFactor, " SV_TessFactor" ),
145- SP (Kind::InsideTessFactor, " SV_InsideTessFactor" ),
146- SP (Kind::ViewID, " SV_ViewID" ),
147- SP (Kind::Barycentrics, " SV_Barycentrics" ),
148- SP (Kind::ShadingRate, " SV_ShadingRate" ),
149- SP (Kind::CullPrimitive, " SV_CullPrimitive" ),
150- SP (Kind::Invalid, nullptr ),
244+ SP (Kind::Arbitrary, nullptr , CompTy::AnyTy, SizeClass::Other, SizeClass::Other ),
245+ SP (Kind::VertexID, " SV_VertexID" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
246+ SP (Kind::InstanceID, " SV_InstanceID" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
247+ SP (Kind::Position, " SV_Position" , CompTy::HalfOrFloatTy, SizeClass::Vec4, SizeClass::Vec4 ),
248+ SP (Kind::RenderTargetArrayIndex," SV_RenderTargetArrayIndex" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
249+ SP (Kind::ViewPortArrayIndex, " SV_ViewportArrayIndex" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
250+ SP (Kind::ClipDistance, " SV_ClipDistance" , CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other ),
251+ SP (Kind::CullDistance, " SV_CullDistance" , CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other ),
252+ SP (Kind::OutputControlPointID, " SV_OutputControlPointID" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
253+ SP (Kind::DomainLocation, " SV_DomainLocation" , CompTy::FloatTy, SizeClass::Scalar, SizeClass::Vec3 ),
254+ SP (Kind::PrimitiveID, " SV_PrimitiveID" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
255+ SP (Kind::GSInstanceID, " SV_GSInstanceID" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
256+ SP (Kind::SampleIndex, " SV_SampleIndex" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
257+ SP (Kind::IsFrontFace, " SV_IsFrontFace" , CompTy::BoolOrInt32Ty, SizeClass::Scalar, SizeClass::Scalar ),
258+ SP (Kind::Coverage, " SV_Coverage" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
259+ SP (Kind::InnerCoverage, " SV_InnerCoverage" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
260+ SP (Kind::Target, " SV_Target" , CompTy::AnyTy, SizeClass::Scalar, SizeClass::Vec4 ),
261+ SP (Kind::Depth, " SV_Depth" , CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar ),
262+ SP (Kind::DepthLessEqual, " SV_DepthLessEqual" , CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar ),
263+ SP (Kind::DepthGreaterEqual, " SV_DepthGreaterEqual" , CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar ),
264+ SP (Kind::StencilRef, " SV_StencilRef" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
265+ SP (Kind::DispatchThreadID, " SV_DispatchThreadID" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3 ),
266+ SP (Kind::GroupID, " SV_GroupID" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3 ),
267+ SP (Kind::GroupIndex, " SV_GroupIndex" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
268+ SP (Kind::GroupThreadID, " SV_GroupThreadID" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3 ),
269+ SP (Kind::TessFactor, " SV_TessFactor" , CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other ),
270+ SP (Kind::InsideTessFactor, " SV_InsideTessFactor" , CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other ),
271+ SP (Kind::ViewID, " SV_ViewID" , CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar ),
272+ SP (Kind::Barycentrics, " SV_Barycentrics" , CompTy::HalfOrFloatTy, SizeClass::Vec3, SizeClass::Vec3 ),
273+ SP (Kind::ShadingRate, " SV_ShadingRate" , CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
274+ SP (Kind::CullPrimitive, " SV_CullPrimitive" , CompTy::BoolOrInt16Or32Ty, SizeClass::Scalar, SizeClass::Scalar ),
275+ SP (Kind::Invalid, nullptr , CompTy::AnyTy, SizeClass::Other, SizeClass::Other ),
151276};
152277
153278} // namespace hlsl
0 commit comments