
Fixes #138997 and does refactoring for low-precision-related flags.
The shader feature flags MinimumPrecision and NativeLowPrecision were
not being set, leading to validation errors.
This PR sets these shader feature flags [as in
DXC](377c4ca6d8/lib/DXIL/DxilShaderFlags.cpp (L58-L63)
)
and adds tests for them.
This PR also performs some refactoring of low-precision-related flags to
make it less confusing.
- The `UseNativeLowPrecision` DXIL module flag has been renamed to
`NativeLowPrecisionMode` to imply that it is setting some execution
state which the module should be interpreted with
- The LLVM module flag `dx.nativelowprec` is now read only once and sets
a bool to be used by `updateFunctionFlags()` and for setting the DXIL
module flag `NativeLowPrecisionMode`
- The `MinimumPrecision`, `NativeLowPrecision`, and
`LowPrecisionPresent` shader feature flags are all set together under
`updateFunctionFlags()`
- Moved the logic for setting DXIL module flags `NativeLowPrecisionMode`
and `ResMayNotAlias` out of the per-function loop and placed it
alongside the logic for setting other DXIL module flags
(`DisableOptimizations`, `Max64UAVs`, and `UAVsAtEveryStage` flags)
---------
Co-authored-by: Justin Bogner <mail@justinbogner.com>
48 lines
1.5 KiB
LLVM
48 lines
1.5 KiB
LLVM
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
|
|
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
|
|
|
|
; Check that when the dx.nativelowprec module flag is set to 0, the module-level
|
|
; shader flag UseNativeLowPrecision is not set, and the MinimumPrecision feature
|
|
; flag is set due to the presence of half and i16 without native low precision.
|
|
|
|
target triple = "dxil-pc-shadermodel6.7-library"
|
|
|
|
;CHECK: ; Combined Shader Flags for Module
|
|
;CHECK-NEXT: ; Shader Flags Value: 0x00000020
|
|
;CHECK-NEXT: ;
|
|
;CHECK-NEXT: ; Note: shader requires additional functionality:
|
|
;CHECK-NEXT: ; Minimum-precision data types
|
|
;CHECK-NEXT: ; Note: extra DXIL module flags:
|
|
;CHECK-NEXT: ; Low-precision data types present
|
|
;CHECK-NOT: ; Enable native low-precision data types
|
|
;CHECK-NEXT: ;
|
|
;CHECK-NEXT: ; Shader Flags for Module Functions
|
|
|
|
;CHECK-LABEL: ; Function add_i16 : 0x00000020
|
|
define i16 @add_i16(i16 %a, i16 %b) "hlsl.export" {
|
|
%sum = add i16 %a, %b
|
|
ret i16 %sum
|
|
}
|
|
|
|
;CHECK-LABEL: ; Function add_i32 : 0x00000000
|
|
define i32 @add_i32(i32 %a, i32 %b) "hlsl.export" {
|
|
%sum = add i32 %a, %b
|
|
ret i32 %sum
|
|
}
|
|
|
|
;CHECK-LABEL: ; Function add_half : 0x00000020
|
|
define half @add_half(half %a, half %b) "hlsl.export" {
|
|
%sum = fadd half %a, %b
|
|
ret half %sum
|
|
}
|
|
|
|
!llvm.module.flags = !{!0}
|
|
!0 = !{i32 1, !"dx.nativelowprec", i32 0}
|
|
|
|
; DXC: - Name: SFI0
|
|
; DXC-NEXT: Size: 8
|
|
; DXC-NEXT: Flags:
|
|
; DXC: MinimumPrecision: true
|
|
; DXC: NativeLowPrecision: false
|
|
; DXC: ...
|