Add SV_ShadingRate plus optional feature flag
- Move/fix flag collection based on signature properties to be computed per entry function (including for libraries)
This commit is contained in:
Родитель
79bc013b4d
Коммит
ecb4e3b4bb
|
@ -662,39 +662,40 @@ Semantic Interpretations for each SemanticKind at each SigPointKind are as follo
|
|||
.. <py::lines('SEMINT-TABLE-RST')>hctdb_instrhelp.get_sem_interpretation_table_rst()</py>
|
||||
.. SEMINT-TABLE-RST:BEGIN
|
||||
|
||||
====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ========
|
||||
Semantic VSIn VSOut PCIn HSIn HSCPIn HSCPOut PCOut DSIn DSCPIn DSOut GSVIn GSIn GSOut PSIn PSOut CSIn
|
||||
====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ========
|
||||
Arbitrary Arb Arb NA NA Arb Arb Arb Arb Arb Arb Arb NA Arb Arb NA NA
|
||||
VertexID SV NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
|
||||
InstanceID SV Arb NA NA Arb Arb NA NA Arb Arb Arb NA Arb Arb NA NA
|
||||
Position Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
RenderTargetArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
ViewPortArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
ClipDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
CullDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
OutputControlPointID NA NA NA NotInSig NA NA NA NA NA NA NA NA NA NA NA NA
|
||||
DomainLocation NA NA NA NA NA NA NA NotInSig NA NA NA NA NA NA NA NA
|
||||
PrimitiveID NA NA NotInSig NotInSig NA NA NA NotInSig NA NA NA Shadow SGV SGV NA NA
|
||||
GSInstanceID NA NA NA NA NA NA NA NA NA NA NA NotInSig NA NA NA NA
|
||||
SampleIndex NA NA NA NA NA NA NA NA NA NA NA NA NA Shadow _41 NA NA
|
||||
IsFrontFace NA NA NA NA NA NA NA NA NA NA NA NA SGV SGV NA NA
|
||||
Coverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NotPacked _41 NA
|
||||
InnerCoverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NA NA
|
||||
Target NA NA NA NA NA NA NA NA NA NA NA NA NA NA Target NA
|
||||
Depth NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked NA
|
||||
DepthLessEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
DepthGreaterEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
StencilRef NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
DispatchThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupIndex NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
TessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA
|
||||
InsideTessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA
|
||||
ViewID NotInSig _61 NA NotInSig _61 NotInSig _61 NA NA NA NotInSig _61 NA NA NA NotInSig _61 NA NotInSig _61 NA NA
|
||||
Barycentrics NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _61 NA NA
|
||||
====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ========
|
||||
====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ========
|
||||
Semantic VSIn VSOut PCIn HSIn HSCPIn HSCPOut PCOut DSIn DSCPIn DSOut GSVIn GSIn GSOut PSIn PSOut CSIn
|
||||
====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ========
|
||||
Arbitrary Arb Arb NA NA Arb Arb Arb Arb Arb Arb Arb NA Arb Arb NA NA
|
||||
VertexID SV NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
|
||||
InstanceID SV Arb NA NA Arb Arb NA NA Arb Arb Arb NA Arb Arb NA NA
|
||||
Position Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
RenderTargetArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
ViewPortArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
ClipDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
CullDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA
|
||||
OutputControlPointID NA NA NA NotInSig NA NA NA NA NA NA NA NA NA NA NA NA
|
||||
DomainLocation NA NA NA NA NA NA NA NotInSig NA NA NA NA NA NA NA NA
|
||||
PrimitiveID NA NA NotInSig NotInSig NA NA NA NotInSig NA NA NA Shadow SGV SGV NA NA
|
||||
GSInstanceID NA NA NA NA NA NA NA NA NA NA NA NotInSig NA NA NA NA
|
||||
SampleIndex NA NA NA NA NA NA NA NA NA NA NA NA NA Shadow _41 NA NA
|
||||
IsFrontFace NA NA NA NA NA NA NA NA NA NA NA NA SGV SGV NA NA
|
||||
Coverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NotPacked _41 NA
|
||||
InnerCoverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NA NA
|
||||
Target NA NA NA NA NA NA NA NA NA NA NA NA NA NA Target NA
|
||||
Depth NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked NA
|
||||
DepthLessEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
DepthGreaterEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
StencilRef NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA
|
||||
DispatchThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupIndex NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
GroupThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig
|
||||
TessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA
|
||||
InsideTessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA
|
||||
ViewID NotInSig _61 NA NotInSig _61 NotInSig _61 NA NA NA NotInSig _61 NA NA NA NotInSig _61 NA NotInSig _61 NA NA
|
||||
Barycentrics NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _61 NA NA
|
||||
ShadingRate NA SV _64 NA NA SV _64 SV _64 NA NA SV _64 SV _64 SV _64 NA SV _64 SV _64 NA NA
|
||||
====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ========
|
||||
|
||||
.. SEMINT-TABLE-RST:END
|
||||
|
||||
|
|
|
@ -168,6 +168,7 @@ namespace DXIL {
|
|||
InsideTessFactor,
|
||||
ViewID,
|
||||
Barycentrics,
|
||||
ShadingRate,
|
||||
Invalid,
|
||||
};
|
||||
// SemanticKind-ENUM:END
|
||||
|
@ -1139,8 +1140,9 @@ namespace DXIL {
|
|||
const uint64_t ShaderFeatureInfo_ViewID = 0x10000;
|
||||
const uint64_t ShaderFeatureInfo_Barycentrics = 0x20000;
|
||||
const uint64_t ShaderFeatureInfo_NativeLowPrecision = 0x40000;
|
||||
const uint64_t ShaderFeatureInfo_ShadingRate = 0x80000;
|
||||
|
||||
const unsigned ShaderFeatureInfoCount = 19;
|
||||
const unsigned ShaderFeatureInfoCount = 20;
|
||||
|
||||
extern const char* kLegacyLayoutString;
|
||||
extern const char* kNewLayoutString;
|
||||
|
|
|
@ -129,6 +129,7 @@ public:
|
|||
void CloneDxilEntryProps(llvm::Function *F, llvm::Function *NewF);
|
||||
bool HasDxilEntryProps(const llvm::Function *F) const;
|
||||
DxilEntryProps &GetDxilEntryProps(const llvm::Function *F);
|
||||
const DxilEntryProps &GetDxilEntryProps(const llvm::Function *F) const;
|
||||
|
||||
// DxilFunctionProps.
|
||||
bool HasDxilFunctionProps(const llvm::Function *F) const;
|
||||
|
|
|
@ -105,6 +105,9 @@ namespace hlsl {
|
|||
void SetUseNativeLowPrecision(bool flag) { m_bUseNativeLowPrecision = flag; }
|
||||
bool GetUseNativeLowPrecision() const { return m_bUseNativeLowPrecision; }
|
||||
|
||||
void SetShadingRate(bool flag) { m_bShadingRate = flag; }
|
||||
bool GetShadingRate() const { return m_bShadingRate; }
|
||||
|
||||
private:
|
||||
unsigned m_bDisableOptimizations :1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
|
||||
unsigned m_bDisableMathRefactoring :1; //~D3D10_SB_GLOBAL_FLAG_REFACTORING_ALLOWED
|
||||
|
@ -138,7 +141,9 @@ namespace hlsl {
|
|||
|
||||
unsigned m_bUseNativeLowPrecision : 1;
|
||||
|
||||
unsigned m_align0 : 8; // align to 32 bit.
|
||||
unsigned m_bShadingRate : 1; // SHADER_FEATURE_SHADINGRATE
|
||||
|
||||
unsigned m_align0 : 7; // align to 32 bit.
|
||||
uint32_t m_align1; // align to 64 bit.
|
||||
};
|
||||
|
||||
|
|
|
@ -49,43 +49,45 @@ const SigPoint SigPoint::ms_SigPoints[kNumSigPointRecords] = {
|
|||
|
||||
// <py::lines('INTERPRETATION-TABLE')>hctdb_instrhelp.get_interpretation_table()</py>
|
||||
// INTERPRETATION-TABLE:BEGIN
|
||||
// Semantic, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn
|
||||
// Semantic, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn
|
||||
#define DO_INTERPRETATION_TABLE(ROW) \
|
||||
ROW(Arbitrary, Arb, Arb, NA, NA, Arb, Arb, Arb, Arb, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
||||
ROW(VertexID, SV, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(InstanceID, SV, Arb, NA, NA, Arb, Arb, NA, NA, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
||||
ROW(Position, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(RenderTargetArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(ViewPortArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(ClipDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(CullDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(OutputControlPointID, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(DomainLocation, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(PrimitiveID, NA, NA, NotInSig, NotInSig, NA, NA, NA, NotInSig, NA, NA, NA, Shadow, SGV, SGV, NA, NA) \
|
||||
ROW(GSInstanceID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA) \
|
||||
ROW(SampleIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Shadow _41, NA, NA) \
|
||||
ROW(IsFrontFace, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, SGV, SGV, NA, NA) \
|
||||
ROW(Coverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NotPacked _41, NA) \
|
||||
ROW(InnerCoverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NA, NA) \
|
||||
ROW(Target, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Target, NA) \
|
||||
ROW(Depth, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked, NA) \
|
||||
ROW(DepthLessEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(DepthGreaterEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(StencilRef, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(DispatchThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(TessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(InsideTessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(ViewID, NotInSig _61, NA, NotInSig _61, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NotInSig _61, NA, NA) \
|
||||
ROW(Barycentrics, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _61, NA, NA)
|
||||
ROW(Arbitrary, Arb, Arb, NA, NA, Arb, Arb, Arb, Arb, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
||||
ROW(VertexID, SV, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(InstanceID, SV, Arb, NA, NA, Arb, Arb, NA, NA, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
||||
ROW(Position, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(RenderTargetArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(ViewPortArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(ClipDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(CullDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
||||
ROW(OutputControlPointID, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(DomainLocation, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(PrimitiveID, NA, NA, NotInSig, NotInSig, NA, NA, NA, NotInSig, NA, NA, NA, Shadow, SGV, SGV, NA, NA) \
|
||||
ROW(GSInstanceID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA) \
|
||||
ROW(SampleIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Shadow _41, NA, NA) \
|
||||
ROW(IsFrontFace, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, SGV, SGV, NA, NA) \
|
||||
ROW(Coverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NotPacked _41, NA) \
|
||||
ROW(InnerCoverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NA, NA) \
|
||||
ROW(Target, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Target, NA) \
|
||||
ROW(Depth, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked, NA) \
|
||||
ROW(DepthLessEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(DepthGreaterEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(StencilRef, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
||||
ROW(DispatchThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(GroupThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
||||
ROW(TessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(InsideTessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \
|
||||
ROW(ViewID, NotInSig _61, NA, NotInSig _61, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NotInSig _61, NA, NA) \
|
||||
ROW(Barycentrics, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _61, NA, NA) \
|
||||
ROW(ShadingRate, NA, SV _64, NA, NA, SV _64, SV _64, NA, NA, SV _64, SV _64, SV _64, NA, SV _64, SV _64, NA, NA)
|
||||
// INTERPRETATION-TABLE:END
|
||||
|
||||
const VersionedSemanticInterpretation SigPoint::ms_SemanticInterpretationTable[(unsigned)DXIL::SemanticKind::Invalid][(unsigned)SigPoint::Kind::Invalid] = {
|
||||
#define _41 ,4,1
|
||||
#define _50 ,5,0
|
||||
#define _61 ,6,1
|
||||
#define _64 ,6,4
|
||||
#define DO_ROW(SEM, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn) \
|
||||
{ VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::VSIn), \
|
||||
VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::VSOut), \
|
||||
|
|
|
@ -143,6 +143,7 @@ enum class DxilProgramSigSemantic : uint32_t {
|
|||
FinalLineDetailTessfactor = 15,
|
||||
FinalLineDensityTessfactor = 16,
|
||||
Barycentrics = 23,
|
||||
ShadingRate = 24,
|
||||
Target = 64,
|
||||
Depth = 65,
|
||||
Coverage = 66,
|
||||
|
|
|
@ -266,53 +266,6 @@ void DxilModule::CollectShaderFlagsForModule(ShaderFlags &Flags) {
|
|||
};
|
||||
|
||||
const ShaderModel *SM = GetShaderModel();
|
||||
if (SM->IsPS()) {
|
||||
bool hasStencilRef = false;
|
||||
DxilSignature &outS = GetOutputSignature();
|
||||
for (auto &&E : outS.GetElements()) {
|
||||
if (E->GetKind() == Semantic::Kind::StencilRef) {
|
||||
hasStencilRef = true;
|
||||
} else if (E->GetKind() == Semantic::Kind::InnerCoverage) {
|
||||
Flags.SetInnerCoverage(true);
|
||||
}
|
||||
}
|
||||
|
||||
Flags.SetStencilRef(hasStencilRef);
|
||||
}
|
||||
|
||||
bool checkInputRTArrayIndex =
|
||||
SM->IsGS() || SM->IsDS() || SM->IsHS() || SM->IsPS();
|
||||
if (checkInputRTArrayIndex) {
|
||||
bool hasViewportArrayIndex = false;
|
||||
bool hasRenderTargetArrayIndex = false;
|
||||
DxilSignature &inS = GetInputSignature();
|
||||
for (auto &E : inS.GetElements()) {
|
||||
if (E->GetKind() == Semantic::Kind::ViewPortArrayIndex) {
|
||||
hasViewportArrayIndex = true;
|
||||
} else if (E->GetKind() == Semantic::Kind::RenderTargetArrayIndex) {
|
||||
hasRenderTargetArrayIndex = true;
|
||||
}
|
||||
}
|
||||
Flags.SetViewportAndRTArrayIndex(hasViewportArrayIndex |
|
||||
hasRenderTargetArrayIndex);
|
||||
}
|
||||
|
||||
bool checkOutputRTArrayIndex =
|
||||
SM->IsVS() || SM->IsDS() || SM->IsHS() || SM->IsPS();
|
||||
if (checkOutputRTArrayIndex) {
|
||||
bool hasViewportArrayIndex = false;
|
||||
bool hasRenderTargetArrayIndex = false;
|
||||
DxilSignature &outS = GetOutputSignature();
|
||||
for (auto &E : outS.GetElements()) {
|
||||
if (E->GetKind() == Semantic::Kind::ViewPortArrayIndex) {
|
||||
hasViewportArrayIndex = true;
|
||||
} else if (E->GetKind() == Semantic::Kind::RenderTargetArrayIndex) {
|
||||
hasRenderTargetArrayIndex = true;
|
||||
}
|
||||
}
|
||||
Flags.SetViewportAndRTArrayIndex(hasViewportArrayIndex |
|
||||
hasRenderTargetArrayIndex);
|
||||
}
|
||||
|
||||
unsigned NumUAVs = m_UAVs.size();
|
||||
const unsigned kSmallUAVCount = 8;
|
||||
|
@ -985,6 +938,10 @@ DxilEntryProps &DxilModule::GetDxilEntryProps(const llvm::Function *F) {
|
|||
DXASSERT(m_DxilEntryPropsMap.count(F) != 0, "cannot find F in map");
|
||||
return *m_DxilEntryPropsMap.find(F)->second.get();
|
||||
}
|
||||
const DxilEntryProps &DxilModule::GetDxilEntryProps(const llvm::Function *F) const {
|
||||
DXASSERT(m_DxilEntryPropsMap.count(F) != 0, "cannot find F in map");
|
||||
return *m_DxilEntryPropsMap.find(F)->second.get();
|
||||
}
|
||||
|
||||
bool DxilModule::HasDxilFunctionProps(const llvm::Function *F) const {
|
||||
return m_DxilEntryPropsMap.find(F) != m_DxilEntryPropsMap.end();
|
||||
|
|
|
@ -145,6 +145,7 @@ const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords] = {
|
|||
SP(Kind::InsideTessFactor, "SV_InsideTessFactor"),
|
||||
SP(Kind::ViewID, "SV_ViewID"),
|
||||
SP(Kind::Barycentrics, "SV_Barycentrics"),
|
||||
SP(Kind::ShadingRate, "SV_ShadingRate"),
|
||||
SP(Kind::Invalid, nullptr),
|
||||
};
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "dxc/DXIL/DxilEntryProps.h"
|
||||
|
||||
using namespace hlsl;
|
||||
using namespace llvm;
|
||||
|
@ -45,6 +46,7 @@ ShaderFlags::ShaderFlags():
|
|||
, m_bViewID(false)
|
||||
, m_bBarycentrics(false)
|
||||
, m_bUseNativeLowPrecision(false)
|
||||
, m_bShadingRate(false)
|
||||
, m_align0(0)
|
||||
, m_align1(0)
|
||||
{}
|
||||
|
@ -90,6 +92,7 @@ uint64_t ShaderFlags::GetFeatureInfo() const {
|
|||
: 0;
|
||||
Flags |= m_bViewID ? hlsl::DXIL::ShaderFeatureInfo_ViewID : 0;
|
||||
Flags |= m_bBarycentrics ? hlsl::DXIL::ShaderFeatureInfo_Barycentrics : 0;
|
||||
Flags |= m_bShadingRate ? hlsl::DXIL::ShaderFeatureInfo_ShadingRate : 0;
|
||||
|
||||
return Flags;
|
||||
}
|
||||
|
@ -141,6 +144,7 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() {
|
|||
Flags.SetCSRawAndStructuredViaShader4X(true);
|
||||
Flags.SetViewID(true);
|
||||
Flags.SetBarycentrics(true);
|
||||
Flags.SetShadingRate(true);
|
||||
return Flags.GetShaderFlagsRaw();
|
||||
}
|
||||
|
||||
|
@ -237,9 +241,13 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
|||
bool hasWaveOps = false;
|
||||
bool hasCheckAccessFully = false;
|
||||
bool hasMSAD = false;
|
||||
bool hasStencilRef = false;
|
||||
bool hasInnerCoverage = false;
|
||||
bool hasViewID = false;
|
||||
bool hasMulticomponentUAVLoads = false;
|
||||
bool hasViewportOrRTArrayIndex = false;
|
||||
bool hasShadingRate = false;
|
||||
|
||||
// Try to maintain compatibility with a v1.0 validator if that's what we have.
|
||||
uint32_t valMajor, valMinor;
|
||||
M->GetValidatorVersion(valMajor, valMinor);
|
||||
|
@ -379,8 +387,59 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If this function is a shader, add flags based on signatures
|
||||
if (M->HasDxilEntryProps(F)) {
|
||||
const DxilEntryProps &entryProps = M->GetDxilEntryProps(F);
|
||||
|
||||
bool checkInputRTArrayIndex =
|
||||
entryProps.props.IsGS() || entryProps.props.IsDS() ||
|
||||
entryProps.props.IsHS() || entryProps.props.IsPS();
|
||||
bool checkOutputRTArrayIndex =
|
||||
entryProps.props.IsVS() || entryProps.props.IsDS() ||
|
||||
entryProps.props.IsHS() || entryProps.props.IsPS();
|
||||
|
||||
for (auto &&E : entryProps.sig.InputSignature.GetElements()) {
|
||||
switch (E->GetKind()) {
|
||||
case Semantic::Kind::ViewPortArrayIndex:
|
||||
case Semantic::Kind::RenderTargetArrayIndex:
|
||||
if (checkInputRTArrayIndex)
|
||||
hasViewportOrRTArrayIndex = true;
|
||||
break;
|
||||
case Semantic::Kind::ShadingRate:
|
||||
hasShadingRate = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &&E : entryProps.sig.OutputSignature.GetElements()) {
|
||||
switch (E->GetKind()) {
|
||||
case Semantic::Kind::ViewPortArrayIndex:
|
||||
case Semantic::Kind::RenderTargetArrayIndex:
|
||||
if (checkOutputRTArrayIndex)
|
||||
hasViewportOrRTArrayIndex = true;
|
||||
break;
|
||||
case Semantic::Kind::StencilRef:
|
||||
if (entryProps.props.IsPS())
|
||||
hasStencilRef = true;
|
||||
break;
|
||||
case Semantic::Kind::InnerCoverage:
|
||||
if (entryProps.props.IsPS())
|
||||
hasInnerCoverage = true;
|
||||
break;
|
||||
case Semantic::Kind::ShadingRate:
|
||||
hasShadingRate = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flag.SetEnableDoublePrecision(hasDouble);
|
||||
flag.SetStencilRef(hasStencilRef);
|
||||
flag.SetInnerCoverage(hasInnerCoverage);
|
||||
flag.SetInt64Ops(has64Int);
|
||||
flag.SetLowPrecisionPresent(has16);
|
||||
|
@ -390,6 +449,8 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
|||
flag.SetEnableMSAD(hasMSAD);
|
||||
flag.SetUAVLoadAdditionalFormats(hasMulticomponentUAVLoads);
|
||||
flag.SetViewID(hasViewID);
|
||||
flag.SetViewportAndRTArrayIndex(hasViewportOrRTArrayIndex);
|
||||
flag.SetShadingRate(hasShadingRate);
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
|
|
@ -54,6 +54,7 @@ static DxilProgramSigSemantic KindToSystemValue(Semantic::Kind kind, DXIL::Tesse
|
|||
case Semantic::Kind::ClipDistance: return DxilProgramSigSemantic::ClipDistance;
|
||||
case Semantic::Kind::CullDistance: return DxilProgramSigSemantic::CullDistance;
|
||||
case Semantic::Kind::Barycentrics: return DxilProgramSigSemantic::Barycentrics;
|
||||
case Semantic::Kind::ShadingRate: return DxilProgramSigSemantic::ShadingRate;
|
||||
case Semantic::Kind::TessFactor: {
|
||||
switch (domain) {
|
||||
case DXIL::TessellatorDomain::IsoLine:
|
||||
|
|
|
@ -4027,6 +4027,7 @@ static void ValidateSignatureElement(DxilSignatureElement &SE,
|
|||
case DXIL::SemanticKind::GSInstanceID:
|
||||
case DXIL::SemanticKind::SampleIndex:
|
||||
case DXIL::SemanticKind::StencilRef:
|
||||
case DXIL::SemanticKind::ShadingRate:
|
||||
if ((compKind != CompType::Kind::U32 && compKind != CompType::Kind::U16) || SE.GetCols() != 1) {
|
||||
ValCtx.EmitFormatError(ValidationRule::MetaSemanticCompType,
|
||||
{SE.GetSemantic()->GetName(), "uint"});
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %dxc -E main -T ps_6_4 %s | FileCheck %s
|
||||
|
||||
// CHECK: ; Note: shader requires additional functionality:
|
||||
// CHECK-NEXT: ; Shading Rate
|
||||
// CHECK: ; Input signature:
|
||||
// CHECK: ; SV_ShadingRate 0 x 1 NONE uint
|
||||
// CHECK: ; Output signature:
|
||||
// CHECK: ; Input signature:
|
||||
// CHECK: ; SV_ShadingRate 0 nointerpolation
|
||||
// CHECK: ; Output signature:
|
||||
// CHECK: !{i32 1, !"SV_ShadingRate", i8 5, i8 29,
|
||||
|
||||
float2 main(float2 v0 : Texcoord0, uint rate : SV_ShadingRate) : SV_Target {
|
||||
uint2 rate2 = uint2(1 << (rate & 0x3), 1 << ((rate >> 2) & 0x3));
|
||||
return v0 * rate2;
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
// RUN: %dxc -E main -T vs_6_4 %s | FileCheck %s
|
||||
|
||||
// CHECK: ; Note: shader requires additional functionality:
|
||||
// CHECK-NEXT: ; Shading Rate
|
||||
// CHECK: ; Input signature:
|
||||
// CHECK: ; Output signature:
|
||||
// CHECK: ; SV_ShadingRate 0 x 1 NONE uint
|
||||
// CHECK: ; Input signature:
|
||||
// CHECK: ; Output signature:
|
||||
// CHECK: ; SV_ShadingRate 0 nointerpolation
|
||||
// CHECK: !{i32 1, !"SV_ShadingRate", i8 5, i8 29,
|
||||
|
||||
struct VS_OUT {
|
||||
float4 pos : SV_Position;
|
||||
uint rate : SV_ShadingRate;
|
||||
};
|
||||
|
||||
VS_OUT main(float4 pos : Pos, uint rate : ShadingRate) {
|
||||
VS_OUT Out;
|
||||
Out.pos = pos;
|
||||
Out.rate = rate;
|
||||
return Out;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %dxc -E main -T vs_6_4 %s | FileCheck %s
|
||||
|
||||
// CHECK: error: invalid semantic 'SV_ShadingRate'
|
||||
|
||||
struct VS_OUT {
|
||||
float4 pos : SV_Position;
|
||||
uint rate : ShadingRate;
|
||||
};
|
||||
|
||||
VS_OUT main(float4 pos : Pos, uint rate : SV_ShadingRate) {
|
||||
VS_OUT Out;
|
||||
Out.pos = pos;
|
||||
Out.rate = rate;
|
||||
return Out;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %dxc -E main -T vs_6_3 %s | FileCheck %s
|
||||
|
||||
// TODO: fix consistency of error between invalid for shader model vs. invalid location
|
||||
// CHECK: error: Semantic SV_ShadingRate is invalid for shader model: vs
|
||||
|
||||
struct VS_OUT {
|
||||
float4 pos : SV_Position;
|
||||
uint rate : SV_ShadingRate;
|
||||
};
|
||||
|
||||
VS_OUT main(float4 pos : Pos, uint rate : ShadingRate) {
|
||||
VS_OUT Out;
|
||||
Out.pos = pos;
|
||||
Out.rate = rate;
|
||||
return Out;
|
||||
}
|
|
@ -38,6 +38,7 @@
|
|||
#define Def_GSInstanceID DECLARE(uint gsiid : SV_GSInstanceID) USE(uint, gsiid)
|
||||
#define Def_ViewID DECLARE(uint viewID : SV_ViewID) USE(uint, viewID)
|
||||
#define Def_Barycentrics DECLARE(float3 BaryWeights : SV_Barycentrics) USE(float, BaryWeights.x) USE(float, BaryWeights.y) USE(float, BaryWeights.z)
|
||||
#define Def_ShadingRate DECLARE(uint rate : SV_ShadingRate) USE(uint, rate)
|
||||
|
||||
#define Domain_Quad 0
|
||||
#define Domain_Tri 1
|
||||
|
|
|
@ -322,7 +322,8 @@ PCSTR g_pFeatureInfoNames[] = {
|
|||
"64-Bit integer",
|
||||
"View Instancing",
|
||||
"Barycentrics",
|
||||
"Use native low precision"
|
||||
"Use native low precision",
|
||||
"Shading Rate"
|
||||
};
|
||||
static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount, "g_pFeatureInfoNames needs to be updated");
|
||||
|
||||
|
|
|
@ -1700,7 +1700,8 @@ class db_dxil(object):
|
|||
(26, "InsideTessFactor", ""),
|
||||
(27, "ViewID", ""),
|
||||
(28, "Barycentrics", ""),
|
||||
(29, "Invalid", ""),
|
||||
(29, "ShadingRate", ""),
|
||||
(30, "Invalid", ""),
|
||||
])
|
||||
self.enums.append(SemanticKind)
|
||||
SigPointKind = db_dxil_enum("SigPointKind", "Signature Point is more specific than shader stage or signature as it is unique in both stage and item dimensionality or frequency.", [
|
||||
|
@ -1819,6 +1820,7 @@ class db_dxil(object):
|
|||
InsideTessFactor,NA,NA,NA,NA,NA,NA,TessFactor,TessFactor,NA,NA,NA,NA,NA,NA,NA,NA
|
||||
ViewID,NotInSig _61,NA,NotInSig _61,NotInSig _61,NA,NA,NA,NotInSig _61,NA,NA,NA,NotInSig _61,NA,NotInSig _61,NA,NA
|
||||
Barycentrics,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NotPacked _61,NA,NA
|
||||
ShadingRate,NA,SV _64,NA,NA,SV _64,SV _64,NA,NA,SV _64,SV _64,SV _64,NA,SV _64,SV _64,NA,NA
|
||||
"""
|
||||
table = [list(map(str.strip, line.split(','))) for line in SemanticInterpretationCSV.splitlines() if line.strip()]
|
||||
for row in table[1:]: assert(len(row) == len(table[0])) # Ensure table is rectangular
|
||||
|
|
Загрузка…
Ссылка в новой задаче