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