summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--slang.h19
-rw-r--r--source/slang/compiler.cpp16
-rw-r--r--source/slang/compiler.h8
-rw-r--r--source/slang/diagnostic-defs.h1
-rw-r--r--source/slang/dxc-support.cpp10
-rw-r--r--source/slang/options.cpp50
-rw-r--r--source/slang/slang.cpp9
7 files changed, 111 insertions, 2 deletions
diff --git a/slang.h b/slang.h
index 83aece07f..f774ab323 100644
--- a/slang.h
+++ b/slang.h
@@ -451,6 +451,17 @@ extern "C"
};
/*!
+ @brief Options to control floating-point precision guarantees for a target.
+ */
+ typedef unsigned int SlangFloatingPointMode;
+ enum
+ {
+ SLANG_FLOATING_POINT_MODE_DEFAULT = 0,
+ SLANG_FLOATING_POINT_MODE_FAST,
+ SLANG_FLOATING_POINT_MODE_PRECISE,
+ };
+
+ /*!
@brief Options to control emission of `#line` directives
*/
typedef unsigned int SlangLineDirectiveMode;
@@ -877,6 +888,14 @@ extern "C"
int targetIndex,
SlangTargetFlags flags);
+ /*!
+ @brief Set the floating point mode (e.g., precise or fast) to use a target.
+ */
+ SLANG_API void spSetTargetFloatingPointMode(
+ SlangCompileRequest* request,
+ int targetIndex,
+ SlangFloatingPointMode mode);
+
/* DEPRECATED: use `spSetMatrixLayoutMode` instead. */
SLANG_API void spSetTargetMatrixLayoutMode(
SlangCompileRequest* request,
diff --git a/source/slang/compiler.cpp b/source/slang/compiler.cpp
index ed222d181..52a31645c 100644
--- a/source/slang/compiler.cpp
+++ b/source/slang/compiler.cpp
@@ -428,6 +428,18 @@ namespace Slang
dxMacros = dxMacrosStorage.Buffer();
}
+ DWORD flags = 0;
+
+ switch( targetReq->floatingPointMode )
+ {
+ default:
+ break;
+
+ case FloatingPointMode::Precise:
+ flags |= D3DCOMPILE_IEEE_STRICTNESS;
+ break;
+ }
+
ID3DBlob* codeBlob;
ID3DBlob* diagnosticsBlob;
HRESULT hr = D3DCompile_(
@@ -438,8 +450,8 @@ namespace Slang
nullptr,
getText(entryPoint->name).begin(),
GetHLSLProfileName(profile).Buffer(),
- 0,
- 0,
+ flags,
+ 0, // unused: effect flags
&codeBlob,
&diagnosticsBlob);
diff --git a/source/slang/compiler.h b/source/slang/compiler.h
index c62daf228..1f4a4736a 100644
--- a/source/slang/compiler.h
+++ b/source/slang/compiler.h
@@ -203,6 +203,13 @@ namespace Slang
RefPtr<IRModule> irModule;
};
+ enum class FloatingPointMode : SlangFloatingPointMode
+ {
+ Default = SLANG_FLOATING_POINT_MODE_DEFAULT,
+ Fast = SLANG_FLOATING_POINT_MODE_FAST,
+ Precise = SLANG_FLOATING_POINT_MODE_PRECISE,
+ };
+
// A request to generate output in some target format
class TargetRequest : public RefObject
{
@@ -211,6 +218,7 @@ namespace Slang
CodeGenTarget target;
SlangTargetFlags targetFlags = 0;
Slang::Profile targetProfile = Slang::Profile();
+ FloatingPointMode floatingPointMode = FloatingPointMode::Default;
// Requested output paths for each entry point.
// An empty string indices no output desired for
diff --git a/source/slang/diagnostic-defs.h b/source/slang/diagnostic-defs.h
index a32dbb315..277e9a48f 100644
--- a/source/slang/diagnostic-defs.h
+++ b/source/slang/diagnostic-defs.h
@@ -73,6 +73,7 @@ DIAGNOSTIC( 20, Error, entryPointsNeedToBeAssociatedWithTranslationUnits, "wh
DIAGNOSTIC( 21, Error, expectedArgumentForOption, "expected an argument for command-line option '$0'");
DIAGNOSTIC( 24, Error, unknownLineDirectiveMode, "unknown '#line' directive mode '$0'");
+DIAGNOSTIC( 25, Error, unknownFloatingPointMode, "unknown floating-point mode '$0'");
DIAGNOSTIC( 30, Error, sameStageSpecifiedMoreThanOnce, "the stage '$0' was specified more than once for entry point '$1'")
DIAGNOSTIC( 31, Error, conflictingStagesForEntryPoint, "conflicting stages have been specified for entry point '$0'")
diff --git a/source/slang/dxc-support.cpp b/source/slang/dxc-support.cpp
index 7c42ad242..0478eef25 100644
--- a/source/slang/dxc-support.cpp
+++ b/source/slang/dxc-support.cpp
@@ -132,6 +132,16 @@ namespace Slang
break;
}
+ switch( targetReq->floatingPointMode )
+ {
+ default:
+ break;
+
+ case FloatingPointMode::Precise:
+ args[argCount++] = L"-Gis"; // "force IEEE strictness"
+ break;
+ }
+
// Slang strives to produce correct code, and by default
// we do not show the user warnings produced by a downstream
// compiler. When the downstream compiler *does* produce an
diff --git a/source/slang/options.cpp b/source/slang/options.cpp
index 485b7d78b..cfa631340 100644
--- a/source/slang/options.cpp
+++ b/source/slang/options.cpp
@@ -147,6 +147,7 @@ struct OptionsParser
ProfileVersion profileVersion = ProfileVersion::Unknown;
SlangTargetFlags targetFlags = 0;
int targetID = -1;
+ FloatingPointMode floatingPointMode = FloatingPointMode::Default;
// State for tracking command-line errors
bool conflictingProfilesSet = false;
@@ -402,6 +403,11 @@ struct OptionsParser
rawTarget->profileVersion = profileVersion;
}
+ void setFloatingPointMode(RawTarget* rawTarget, FloatingPointMode mode)
+ {
+ rawTarget->floatingPointMode = mode;
+ }
+
SlangResult parse(
int argc,
char const* const* argv)
@@ -660,6 +666,28 @@ struct OptionsParser
spSetLineDirectiveMode(compileRequest, mode);
}
+ else if( argStr == "-fp-mode" || argStr == "-floating-point-mode" )
+ {
+ String name;
+ SLANG_RETURN_ON_FAIL(tryReadCommandLineArgument(sink, arg, &argCursor, argEnd, name));
+
+ FloatingPointMode mode = FloatingPointMode::Default;
+ if(name == "fast")
+ {
+ mode = FloatingPointMode::Fast;
+ }
+ else if(name == "precise")
+ {
+ mode = FloatingPointMode::Precise;
+ }
+ else
+ {
+ sink->diagnose(SourceLoc(), Diagnostics::unknownFloatingPointMode, name);
+ return SLANG_FAIL;
+ }
+
+ setFloatingPointMode(getCurrentTarget(), mode);
+ }
else if (argStr == "--")
{
// The `--` option causes us to stop trying to parse options,
@@ -983,6 +1011,11 @@ struct OptionsParser
}
getCurrentTarget()->targetFlags |= defaultTarget.targetFlags;
+
+ if( defaultTarget.floatingPointMode != FloatingPointMode::Default )
+ {
+ setFloatingPointMode(getCurrentTarget(), defaultTarget.floatingPointMode);
+ }
}
else
{
@@ -1018,6 +1051,18 @@ struct OptionsParser
}
}
+ if( defaultTarget.floatingPointMode != FloatingPointMode::Default )
+ {
+ if( rawTargets.Count() == 0 )
+ {
+ sink->diagnose(SourceLoc(), Diagnostics::targetFlagsIgnoredBecauseNoTargets);
+ }
+ else
+ {
+ sink->diagnose(SourceLoc(), Diagnostics::targetFlagsIgnoredBecauseBeforeAllTargets);
+ }
+ }
+
}
for(auto& rawTarget : rawTargets)
@@ -1054,6 +1099,11 @@ struct OptionsParser
{
spSetTargetFlags(compileRequest, targetID, rawTarget.targetFlags);
}
+
+ if( rawTarget.floatingPointMode != FloatingPointMode::Default )
+ {
+ spSetTargetFloatingPointMode(compileRequest, targetID, SlangFloatingPointMode(rawTarget.floatingPointMode));
+ }
}
if(defaultMatrixLayoutMode != SLANG_MATRIX_LAYOUT_MODE_UNKNOWN)
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index f67123cc6..1e3d1e716 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -1229,6 +1229,15 @@ SLANG_API void spSetTargetFlags(
req->targets[targetIndex]->targetFlags = flags;
}
+SLANG_API void spSetTargetFloatingPointMode(
+ SlangCompileRequest* request,
+ int targetIndex,
+ SlangFloatingPointMode mode)
+{
+ auto req = REQ(request);
+ req->targets[targetIndex]->floatingPointMode = Slang::FloatingPointMode(mode);
+}
+
SLANG_API void spSetMatrixLayoutMode(
SlangCompileRequest* request,
SlangMatrixLayoutMode mode)