@@ -677,7 +677,7 @@ RootSignatureParser::parseStaticSamplerParams() {
677
677
if (consumeExpectedToken (TokenKind::pu_equal))
678
678
return std::nullopt;
679
679
680
- auto MipLODBias = parseUIntParam ();
680
+ auto MipLODBias = parseFloatParam ();
681
681
if (!MipLODBias.has_value ())
682
682
return std::nullopt;
683
683
Params.MipLODBias = (float )*MipLODBias;
@@ -730,6 +730,30 @@ std::optional<Register> RootSignatureParser::parseRegister() {
730
730
return Reg;
731
731
}
732
732
733
+ std::optional<float > RootSignatureParser::parseFloatParam () {
734
+ assert (CurToken.TokKind == TokenKind::pu_equal &&
735
+ " Expects to only be invoked starting at given keyword" );
736
+ // Consume sign modifier
737
+ bool Signed = tryConsumeExpectedToken ({TokenKind::pu_plus, TokenKind::pu_minus});
738
+ bool Negated = Signed && CurToken.TokKind == TokenKind::pu_minus;
739
+
740
+ // Handle an uint and interpret it as a float
741
+ if (!Signed && tryConsumeExpectedToken (TokenKind::int_literal)) {
742
+ auto UInt = handleUIntLiteral ();
743
+ if (!UInt.has_value ())
744
+ return std::nullopt;
745
+ return (float )UInt.value ();
746
+ } else if (tryConsumeExpectedToken (TokenKind::int_literal)) {
747
+ auto Int = handleIntLiteral (Negated);
748
+ if (!Int.has_value ())
749
+ return std::nullopt;
750
+
751
+ return (float )Int.value ();
752
+ }
753
+
754
+ return std::nullopt;
755
+ }
756
+
733
757
std::optional<llvm::hlsl::rootsig::ShaderVisibility>
734
758
RootSignatureParser::parseShaderVisibility () {
735
759
assert (CurToken.TokKind == TokenKind::pu_equal &&
@@ -856,6 +880,31 @@ std::optional<uint32_t> RootSignatureParser::handleUIntLiteral() {
856
880
return Val.getExtValue ();
857
881
}
858
882
883
+ std::optional<int32_t > RootSignatureParser::handleIntLiteral (bool Negated) {
884
+ // Parse the numeric value and do semantic checks on its specification
885
+ clang::NumericLiteralParser Literal (CurToken.NumSpelling , CurToken.TokLoc ,
886
+ PP.getSourceManager (), PP.getLangOpts (),
887
+ PP.getTargetInfo (), PP.getDiagnostics ());
888
+ if (Literal.hadError )
889
+ return true ; // Error has already been reported so just return
890
+
891
+ assert (Literal.isIntegerLiteral () && " IsNumberChar will only support digits" );
892
+
893
+ llvm::APSInt Val = llvm::APSInt (32 , true );
894
+ if (Literal.GetIntegerValue (Val) || INT32_MAX < Val.getExtValue ()) {
895
+ // Report that the value has overflowed
896
+ PP.getDiagnostics ().Report (CurToken.TokLoc ,
897
+ diag::err_hlsl_number_literal_overflow)
898
+ << 0 << CurToken.NumSpelling ;
899
+ return std::nullopt;
900
+ }
901
+
902
+ if (Negated)
903
+ return static_cast <int32_t >((-Val).getExtValue ());
904
+
905
+ return static_cast <int32_t >(Val.getExtValue ());
906
+ }
907
+
859
908
bool RootSignatureParser::verifyZeroFlag () {
860
909
assert (CurToken.TokKind == TokenKind::int_literal);
861
910
auto X = handleUIntLiteral ();
0 commit comments