From 9580e311e0cefb0f8e11afc316783a67201654eb Mon Sep 17 00:00:00 2001 From: Mukund Keshava Date: Thu, 20 Feb 2025 14:12:15 +0530 Subject: HLSL: Add 'f' suffix to float literals in code generation (#6381) * HLSL: Add 'f' suffix to float literals in code generation Fixes #6078 1) Previously, Slang would emit HLSL float literals without a suffix (e.g.,"1.5"), which caused DXC to interpret them as 64-bit doubles by default unless the -HV 202x flag was used. This could cause validation errors when these literals were used with intrinsics that only accept 32-bit floats (like ddx, ddy). This change modifies the HLSL emitter to explicitly add 'f' suffix to 32-bit float literals, ensuring they are correctly typed regardless of DXC's version or flags. For example: - "1.5" becomes "1.5f" - "(0.0 / 0.0)" becomes "(0.0f / 0.0f)" for NaN - "float4(1.0, 2.0, 3.0, 4.0)" becomes "float4(1.0f, 2.0f, 3.0f, 4.0f)" 2) Added a test case to verify the behavior with various float literal scenarios including basic literals, intrinsic calls, and vector construction. 3) Remove some tests that were marked as known failures * Add dxil test as suggested by jkwak-work --- source/slang/slang-emit-hlsl.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'source') diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp index 1cb9b769f..59d40d3a1 100644 --- a/source/slang/slang-emit-hlsl.cpp +++ b/source/slang/slang-emit-hlsl.cpp @@ -1252,23 +1252,30 @@ void HLSLSourceEmitter::emitSimpleValueImpl(IRInst* inst) { case IRConstant::FloatKind::Nan: { - m_writer->emit("(0.0 / 0.0)"); + m_writer->emit("(0.0f / 0.0f)"); return; } case IRConstant::FloatKind::PositiveInfinity: { - m_writer->emit("(1.0 / 0.0)"); + m_writer->emit("(1.0f / 0.0f)"); return; } case IRConstant::FloatKind::NegativeInfinity: { - m_writer->emit("(-1.0 / 0.0)"); + m_writer->emit("(-1.0f / 0.0f)"); return; } default: - break; + { + m_writer->emit(constantInst->value.floatVal); + // Add 'f' suffix for 32-bit float literals to ensure DXC treats them as float + if (constantInst->getDataType()->getOp() == kIROp_FloatType) + { + m_writer->emit("f"); + } + return; + } } - break; } default: -- cgit v1.2.3