1111#include " dxc/DXIL/DxilSemantic.h"
1212#include " dxc/DXIL/DxilSignature.h"
1313#include " dxc/DXIL/DxilShaderModel.h"
14- #include " dxc/DXIL/DxilUtil.h"
1514#include " dxc/Support/Global.h"
1615
1716#include < string>
@@ -25,15 +24,9 @@ namespace hlsl {
2524// Semantic class methods.
2625//
2726Semantic::Semantic (Kind Kind,
28- const char *pszName,
29- CompTy allowedTys,
30- SizeClass minCompCount,
31- SizeClass maxCompCount)
27+ const char *pszName)
3228: m_Kind(Kind)
3329, m_pszName(pszName)
34- , m_allowedTys(allowedTys)
35- , m_minCompCount(minCompCount)
36- , m_maxCompCount(maxCompCount)
3730{
3831}
3932
@@ -120,159 +113,41 @@ bool Semantic::IsInvalid() const {
120113 return m_Kind == Kind::Invalid;
121114}
122115
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-
241116typedef Semantic SP;
242117const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords ] = {
243118 // Kind Name
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 ),
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 ),
276151};
277152
278153} // namespace hlsl
0 commit comments