199 строки
12 KiB
C++
199 строки
12 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// DxilSigPoint.cpp //
|
|
// Copyright (C) Microsoft Corporation. All rights reserved. //
|
|
// Licensed under the MIT license. See COPYRIGHT in the project root for //
|
|
// full license information. //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "dxc/HLSL/DxilSigPoint.h"
|
|
#include "dxc/Support/Global.h"
|
|
|
|
#include <string>
|
|
|
|
using std::string;
|
|
|
|
/* <py>
|
|
import hctdb_instrhelp
|
|
</py> */
|
|
|
|
namespace hlsl {
|
|
|
|
// Related points to a SigPoint that would contain the signature element for a "Shadow" element.
|
|
// A "Shadow" element isn't actually accessed through that signature's Load/Store Input/Output.
|
|
// Instead, it uses a dedicated intrinsic, but still requires that an entry exist in the signature
|
|
// for compatibility purposes.
|
|
// <py::lines('SIGPOINT-TABLE')>hctdb_instrhelp.get_sigpoint_table()</py>
|
|
// SIGPOINT-TABLE:BEGIN
|
|
// SigPoint, Related, ShaderKind, PackingKind, SignatureKind
|
|
#define DO_SIGPOINTS(DO) \
|
|
DO(VSIn, Invalid, Vertex, InputAssembler, Input) \
|
|
DO(VSOut, Invalid, Vertex, Vertex, Output) \
|
|
DO(PCIn, HSCPIn, Hull, None, Invalid) \
|
|
DO(HSIn, HSCPIn, Hull, None, Invalid) \
|
|
DO(HSCPIn, Invalid, Hull, Vertex, Input) \
|
|
DO(HSCPOut, Invalid, Hull, Vertex, Output) \
|
|
DO(PCOut, Invalid, Hull, PatchConstant, PatchConstant) \
|
|
DO(DSIn, Invalid, Domain, PatchConstant, PatchConstant) \
|
|
DO(DSCPIn, Invalid, Domain, Vertex, Input) \
|
|
DO(DSOut, Invalid, Domain, Vertex, Output) \
|
|
DO(GSVIn, Invalid, Geometry, Vertex, Input) \
|
|
DO(GSIn, GSVIn, Geometry, None, Invalid) \
|
|
DO(GSOut, Invalid, Geometry, Vertex, Output) \
|
|
DO(PSIn, Invalid, Pixel, Vertex, Input) \
|
|
DO(PSOut, Invalid, Pixel, Target, Output) \
|
|
DO(CSIn, Invalid, Compute, None, Invalid) \
|
|
DO(Invalid, Invalid, Invalid, Invalid, Invalid)
|
|
// SIGPOINT-TABLE:END
|
|
|
|
const SigPoint SigPoint::ms_SigPoints[kNumSigPointRecords] = {
|
|
#define DEF_SIGPOINT(spk, rspk, shk, pk, sigk) \
|
|
SigPoint(DXIL::SigPointKind::spk, #spk, DXIL::SigPointKind::rspk, DXIL::ShaderKind::shk, DXIL::SignatureKind::sigk, DXIL::PackingKind::pk),
|
|
DO_SIGPOINTS(DEF_SIGPOINT)
|
|
#undef DEF_SIGPOINT
|
|
};
|
|
|
|
// <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
|
|
#define DO_INTERPRETATION_TABLE(DO) \
|
|
DO(Arbitrary, Arb, Arb, NA, NA, Arb, Arb, Arb, Arb, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
|
DO(VertexID, SV, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
|
DO(InstanceID, SV, Arb, NA, NA, Arb, Arb, NA, NA, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \
|
|
DO(Position, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
|
DO(RenderTargetArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
|
DO(ViewPortArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
|
DO(ClipDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
|
DO(CullDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \
|
|
DO(OutputControlPointID, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \
|
|
DO(DomainLocation, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA) \
|
|
DO(PrimitiveID, NA, NA, NotInSig, NotInSig, NA, NA, NA, NotInSig, NA, NA, NA, Shadow, SGV, SGV, NA, NA) \
|
|
DO(GSInstanceID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA) \
|
|
DO(SampleIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Shadow _41, NA, NA) \
|
|
DO(IsFrontFace, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, SGV, SGV, NA, NA) \
|
|
DO(Coverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NotPacked _41, NA) \
|
|
DO(InnerCoverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NA, NA) \
|
|
DO(Target, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Target, NA) \
|
|
DO(Depth, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked, NA) \
|
|
DO(DepthLessEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
|
DO(DepthGreaterEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
|
DO(StencilRef, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \
|
|
DO(DispatchThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
|
DO(GroupID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
|
DO(GroupIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
|
DO(GroupThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \
|
|
DO(TessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \
|
|
DO(InsideTessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, 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 DO(k) VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::k)
|
|
#define DO_ROW(SEM, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn) \
|
|
{ DO(VSIn), DO(VSOut), DO(PCIn), DO(HSIn), DO(HSCPIn), DO(HSCPOut), DO(PCOut), DO(DSIn), DO(DSCPIn), DO(DSOut), DO(GSVIn), DO(GSIn), DO(GSOut), DO(PSIn), DO(PSOut), DO(CSIn) },
|
|
DO_INTERPRETATION_TABLE(DO_ROW)
|
|
#undef DO_ROW
|
|
#undef DO
|
|
};
|
|
|
|
// -----------------------
|
|
// SigPoint Implementation
|
|
|
|
SigPoint::SigPoint(DXIL::SigPointKind spk, const char *name, DXIL::SigPointKind rspk, DXIL::ShaderKind shk, DXIL::SignatureKind sigk, DXIL::PackingKind pk) :
|
|
m_Kind(spk), m_pszName(name), m_RelatedKind(rspk), m_ShaderKind(shk), m_SignatureKind(sigk), m_PackingKind(pk)
|
|
{}
|
|
|
|
DXIL::SignatureKind SigPoint::GetSignatureKindWithFallback() const {
|
|
DXIL::SignatureKind sigKind = GetSignatureKind();
|
|
if (sigKind == DXIL::SignatureKind::Invalid) {
|
|
DXIL::SigPointKind RK = GetRelatedKind();
|
|
if (RK != DXIL::SigPointKind::Invalid)
|
|
sigKind = SigPoint::GetSigPoint(RK)->GetSignatureKind();
|
|
}
|
|
return sigKind;
|
|
}
|
|
|
|
DXIL::SemanticInterpretationKind SigPoint::GetInterpretation(DXIL::SemanticKind SK, Kind K, unsigned MajorVersion, unsigned MinorVersion) {
|
|
if (SK < DXIL::SemanticKind::Invalid && K < Kind::Invalid) {
|
|
const VersionedSemanticInterpretation& VSI = ms_SemanticInterpretationTable[(unsigned)SK][(unsigned)K];
|
|
if (VSI.Kind != DXIL::SemanticInterpretationKind::NA) {
|
|
if (MajorVersion > (unsigned)VSI.Major ||
|
|
(MajorVersion == (unsigned)VSI.Major && MinorVersion >= (unsigned)VSI.Minor))
|
|
return VSI.Kind;
|
|
}
|
|
}
|
|
return DXIL::SemanticInterpretationKind::NA;
|
|
}
|
|
|
|
SigPoint::Kind SigPoint::RecoverKind(DXIL::SemanticKind SK, Kind K) {
|
|
if (SK == DXIL::SemanticKind::PrimitiveID && K == Kind::GSVIn)
|
|
return Kind::GSIn;
|
|
return K;
|
|
}
|
|
|
|
// --------------
|
|
// Static methods
|
|
|
|
const SigPoint* SigPoint::GetSigPoint(Kind K) {
|
|
return ((unsigned)K < kNumSigPointRecords) ? &ms_SigPoints[(unsigned)K] : &ms_SigPoints[(unsigned)Kind::Invalid];
|
|
}
|
|
|
|
DXIL::SigPointKind SigPoint::GetKind(DXIL::ShaderKind shaderKind, DXIL::SignatureKind sigKind, bool isPatchConstantFunction, bool isSpecialInput) {
|
|
if (isSpecialInput) {
|
|
switch (shaderKind) {
|
|
case DXIL::ShaderKind::Hull:
|
|
if (sigKind == DXIL::SignatureKind::Input)
|
|
return isPatchConstantFunction ? DXIL::SigPointKind::PCIn : DXIL::SigPointKind::HSIn;
|
|
case DXIL::ShaderKind::Geometry:
|
|
if (sigKind == DXIL::SignatureKind::Input)
|
|
return DXIL::SigPointKind::GSIn;
|
|
}
|
|
}
|
|
|
|
switch (shaderKind) {
|
|
case DXIL::ShaderKind::Vertex:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::VSIn;
|
|
case DXIL::SignatureKind::Output: return DXIL::SigPointKind::VSOut;
|
|
}
|
|
break;
|
|
case DXIL::ShaderKind::Hull:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::HSCPIn;
|
|
case DXIL::SignatureKind::Output: return DXIL::SigPointKind::HSCPOut;
|
|
case DXIL::SignatureKind::PatchConstant: return DXIL::SigPointKind::PCOut;
|
|
}
|
|
break;
|
|
case DXIL::ShaderKind::Domain:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::DSCPIn;
|
|
case DXIL::SignatureKind::Output: return DXIL::SigPointKind::DSOut;
|
|
case DXIL::SignatureKind::PatchConstant: return DXIL::SigPointKind::DSIn;
|
|
}
|
|
break;
|
|
case DXIL::ShaderKind::Geometry:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::GSVIn;
|
|
case DXIL::SignatureKind::Output: return DXIL::SigPointKind::GSOut;
|
|
}
|
|
break;
|
|
case DXIL::ShaderKind::Pixel:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::PSIn;
|
|
case DXIL::SignatureKind::Output: return DXIL::SigPointKind::PSOut;
|
|
}
|
|
break;
|
|
case DXIL::ShaderKind::Compute:
|
|
switch (sigKind) {
|
|
case DXIL::SignatureKind::Input: return DXIL::SigPointKind::CSIn;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return DXIL::SigPointKind::Invalid;
|
|
}
|
|
|
|
} // namespace hlsl
|