|
@@ -11,6 +11,7 @@
|
|
|
#include "dxc/DXIL/DxilSemantic.h"
|
|
|
#include "dxc/DXIL/DxilSignature.h"
|
|
|
#include "dxc/DXIL/DxilShaderModel.h"
|
|
|
+#include "dxc/DXIL/DxilUtil.h"
|
|
|
#include "dxc/Support/Global.h"
|
|
|
|
|
|
#include <string>
|
|
@@ -24,9 +25,15 @@ namespace hlsl {
|
|
|
// Semantic class methods.
|
|
|
//
|
|
|
Semantic::Semantic(Kind Kind,
|
|
|
- const char *pszName)
|
|
|
+ const char *pszName,
|
|
|
+ CompTy allowedTys,
|
|
|
+ SizeClass minCompCount,
|
|
|
+ SizeClass maxCompCount)
|
|
|
: m_Kind(Kind)
|
|
|
, m_pszName(pszName)
|
|
|
+, m_allowedTys(allowedTys)
|
|
|
+, m_minCompCount(minCompCount)
|
|
|
+, m_maxCompCount(maxCompCount)
|
|
|
{
|
|
|
}
|
|
|
|
|
@@ -113,41 +120,159 @@ bool Semantic::IsInvalid() const {
|
|
|
return m_Kind == Kind::Invalid;
|
|
|
}
|
|
|
|
|
|
+Semantic::SizeClass Semantic::GetCompCount(llvm::Type* ty) const {
|
|
|
+
|
|
|
+ if (!ty->isVectorTy() && !dxilutil::IsIntegerOrFloatingPointType(ty))
|
|
|
+ return SizeClass::Unknown;
|
|
|
+
|
|
|
+ if (ty->isVectorTy()) {
|
|
|
+ if (ty->getVectorNumElements() == 1) {
|
|
|
+ return SizeClass::Scalar;
|
|
|
+ }
|
|
|
+ else if (ty->getVectorNumElements() == 2) {
|
|
|
+ return SizeClass::Vec2;
|
|
|
+ }
|
|
|
+ else if (ty->getVectorNumElements() == 3) {
|
|
|
+ return SizeClass::Vec3;
|
|
|
+ }
|
|
|
+ else if (ty->getVectorNumElements() == 4) {
|
|
|
+ return SizeClass::Vec4;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DXASSERT(false, "Unexpected number of vector elements.");
|
|
|
+ return SizeClass::Unknown;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return SizeClass::Scalar;
|
|
|
+}
|
|
|
+
|
|
|
+Semantic::CompTy Semantic::GetCompType(llvm::Type* ty) const {
|
|
|
+
|
|
|
+ if (!ty->isVectorTy() && !dxilutil::IsIntegerOrFloatingPointType(ty))
|
|
|
+ return CompTy::AnyTy;
|
|
|
+
|
|
|
+ if (ty->isVectorTy())
|
|
|
+ ty = ty->getScalarType();
|
|
|
+
|
|
|
+ // must be an integer or a floating point type here
|
|
|
+ DXASSERT_NOMSG(dxilutil::IsIntegerOrFloatingPointType(ty));
|
|
|
+ if (ty->getScalarType()->isIntegerTy()) {
|
|
|
+ if (ty->getScalarSizeInBits() == 1) {
|
|
|
+ return CompTy::BoolTy;
|
|
|
+ } else if (ty->getScalarSizeInBits() == 16) {
|
|
|
+ return CompTy::Int16Ty;
|
|
|
+ } else if (ty->getScalarSizeInBits() == 32) {
|
|
|
+ return CompTy::Int32Ty;
|
|
|
+ } else {
|
|
|
+ return CompTy::Int64Ty;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (ty->isHalfTy()) {
|
|
|
+ return CompTy::HalfTy;
|
|
|
+ } else if (ty->isFloatTy()) {
|
|
|
+ return CompTy::FloatTy;
|
|
|
+ } else {
|
|
|
+ DXASSERT_NOMSG(ty->isDoubleTy());
|
|
|
+ return CompTy::DoubleTy;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static bool IsScalarOrVectorTy(llvm::Type* ty) {
|
|
|
+ if (dxilutil::IsIntegerOrFloatingPointType(ty))
|
|
|
+ return true;
|
|
|
+ if (ty->isVectorTy() &&
|
|
|
+ dxilutil::IsIntegerOrFloatingPointType(ty->getVectorElementType()))
|
|
|
+ return true;
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool Semantic::IsSupportedType(llvm::Type* semTy) const {
|
|
|
+
|
|
|
+ if (m_Kind == Kind::Invalid)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Skip type checking for Arbitrary kind
|
|
|
+ if (m_Kind == Kind::Arbitrary)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if (!IsScalarOrVectorTy(semTy)) {
|
|
|
+ // We only allow scalar or vector types as a valid semantic type except in some cases
|
|
|
+ // such as Clip/Cull or Tessfactor.
|
|
|
+ if (m_minCompCount == SizeClass::Other) {
|
|
|
+ if (semTy->isArrayTy()) {
|
|
|
+ semTy = semTy->getArrayElementType();
|
|
|
+ // TessFactor or InsideTessFactor must either be float[2] or float
|
|
|
+ if ((m_Kind == Kind::TessFactor ||
|
|
|
+ m_Kind == Kind::InsideTessFactor) &&
|
|
|
+ !dxilutil::IsIntegerOrFloatingPointType(semTy)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // Clip/Cull can be array of scalar or vector
|
|
|
+ if ((m_Kind == Kind::ClipDistance ||
|
|
|
+ m_Kind == Kind::CullDistance) &&
|
|
|
+ !IsScalarOrVectorTy(semTy)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // Do not support other types such as matrix.
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (((unsigned)m_allowedTys & (unsigned)GetCompType(semTy)) == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Skip type-shape validation for semantics marked as Other
|
|
|
+ if (m_minCompCount == SizeClass::Other)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ SizeClass compSzClass = GetCompCount(semTy);
|
|
|
+ return compSzClass >= m_minCompCount &&
|
|
|
+ compSzClass <= m_maxCompCount;
|
|
|
+}
|
|
|
+
|
|
|
typedef Semantic SP;
|
|
|
const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords] = {
|
|
|
// Kind Name
|
|
|
- SP(Kind::Arbitrary, nullptr),
|
|
|
- SP(Kind::VertexID, "SV_VertexID"),
|
|
|
- SP(Kind::InstanceID, "SV_InstanceID"),
|
|
|
- SP(Kind::Position, "SV_Position"),
|
|
|
- SP(Kind::RenderTargetArrayIndex,"SV_RenderTargetArrayIndex"),
|
|
|
- SP(Kind::ViewPortArrayIndex, "SV_ViewportArrayIndex"),
|
|
|
- SP(Kind::ClipDistance, "SV_ClipDistance"),
|
|
|
- SP(Kind::CullDistance, "SV_CullDistance"),
|
|
|
- SP(Kind::OutputControlPointID, "SV_OutputControlPointID"),
|
|
|
- SP(Kind::DomainLocation, "SV_DomainLocation"),
|
|
|
- SP(Kind::PrimitiveID, "SV_PrimitiveID"),
|
|
|
- SP(Kind::GSInstanceID, "SV_GSInstanceID"),
|
|
|
- SP(Kind::SampleIndex, "SV_SampleIndex"),
|
|
|
- SP(Kind::IsFrontFace, "SV_IsFrontFace"),
|
|
|
- SP(Kind::Coverage, "SV_Coverage"),
|
|
|
- SP(Kind::InnerCoverage, "SV_InnerCoverage"),
|
|
|
- SP(Kind::Target, "SV_Target"),
|
|
|
- SP(Kind::Depth, "SV_Depth"),
|
|
|
- SP(Kind::DepthLessEqual, "SV_DepthLessEqual"),
|
|
|
- SP(Kind::DepthGreaterEqual, "SV_DepthGreaterEqual"),
|
|
|
- SP(Kind::StencilRef, "SV_StencilRef"),
|
|
|
- SP(Kind::DispatchThreadID, "SV_DispatchThreadID"),
|
|
|
- SP(Kind::GroupID, "SV_GroupID"),
|
|
|
- SP(Kind::GroupIndex, "SV_GroupIndex"),
|
|
|
- SP(Kind::GroupThreadID, "SV_GroupThreadID"),
|
|
|
- SP(Kind::TessFactor, "SV_TessFactor"),
|
|
|
- SP(Kind::InsideTessFactor, "SV_InsideTessFactor"),
|
|
|
- SP(Kind::ViewID, "SV_ViewID"),
|
|
|
- SP(Kind::Barycentrics, "SV_Barycentrics"),
|
|
|
- SP(Kind::ShadingRate, "SV_ShadingRate"),
|
|
|
- SP(Kind::CullPrimitive, "SV_CullPrimitive"),
|
|
|
- SP(Kind::Invalid, nullptr),
|
|
|
+ SP(Kind::Arbitrary, nullptr, CompTy::AnyTy, SizeClass::Other, SizeClass::Other),
|
|
|
+ SP(Kind::VertexID, "SV_VertexID", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::InstanceID, "SV_InstanceID", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::Position, "SV_Position", CompTy::HalfOrFloatTy, SizeClass::Vec4, SizeClass::Vec4),
|
|
|
+ SP(Kind::RenderTargetArrayIndex,"SV_RenderTargetArrayIndex", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::ViewPortArrayIndex, "SV_ViewportArrayIndex", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::ClipDistance, "SV_ClipDistance", CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other),
|
|
|
+ SP(Kind::CullDistance, "SV_CullDistance", CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other),
|
|
|
+ SP(Kind::OutputControlPointID, "SV_OutputControlPointID", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::DomainLocation, "SV_DomainLocation", CompTy::FloatTy, SizeClass::Scalar, SizeClass::Vec3),
|
|
|
+ SP(Kind::PrimitiveID, "SV_PrimitiveID", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::GSInstanceID, "SV_GSInstanceID", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::SampleIndex, "SV_SampleIndex", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::IsFrontFace, "SV_IsFrontFace", CompTy::BoolOrInt32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::Coverage, "SV_Coverage", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::InnerCoverage, "SV_InnerCoverage", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::Target, "SV_Target", CompTy::AnyTy, SizeClass::Scalar, SizeClass::Vec4),
|
|
|
+ SP(Kind::Depth, "SV_Depth", CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::DepthLessEqual, "SV_DepthLessEqual", CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::DepthGreaterEqual, "SV_DepthGreaterEqual", CompTy::HalfOrFloatTy, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::StencilRef, "SV_StencilRef", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::DispatchThreadID, "SV_DispatchThreadID", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3),
|
|
|
+ SP(Kind::GroupID, "SV_GroupID", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3),
|
|
|
+ SP(Kind::GroupIndex, "SV_GroupIndex", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::GroupThreadID, "SV_GroupThreadID", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Vec3),
|
|
|
+ SP(Kind::TessFactor, "SV_TessFactor", CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other),
|
|
|
+ SP(Kind::InsideTessFactor, "SV_InsideTessFactor", CompTy::HalfOrFloatTy, SizeClass::Other, SizeClass::Other),
|
|
|
+ SP(Kind::ViewID, "SV_ViewID", CompTy::Int32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::Barycentrics, "SV_Barycentrics", CompTy::HalfOrFloatTy, SizeClass::Vec3, SizeClass::Vec3),
|
|
|
+ SP(Kind::ShadingRate, "SV_ShadingRate", CompTy::Int16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::CullPrimitive, "SV_CullPrimitive", CompTy::BoolOrInt16Or32Ty, SizeClass::Scalar, SizeClass::Scalar),
|
|
|
+ SP(Kind::Invalid, nullptr, CompTy::AnyTy, SizeClass::Other, SizeClass::Other),
|
|
|
};
|
|
|
|
|
|
} // namespace hlsl
|