Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion llvm/include/llvm/BinaryFormat/DXContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ enum class PartType {
#include "DXContainerConstants.def"
};

#define SHADER_FEATURE_FLAG(Num, Val, Str) Val = 1ull << Num,
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) Val = 1ull << Num,
enum class FeatureFlags : uint64_t {
#include "DXContainerConstants.def"
};
Expand Down
97 changes: 57 additions & 40 deletions llvm/include/llvm/BinaryFormat/DXContainerConstants.def
Original file line number Diff line number Diff line change
Expand Up @@ -9,46 +9,63 @@ CONTAINER_PART(OSG1)
CONTAINER_PART(PSG1)

#undef CONTAINER_PART
#endif
#endif // CONTAINER_PART

#ifdef SHADER_FEATURE_FLAG

SHADER_FEATURE_FLAG(0, Doubles, "Double-precision floating point")
SHADER_FEATURE_FLAG(1, ComputeShadersPlusRawAndStructuredBuffers, "Raw and Structured buffers")
SHADER_FEATURE_FLAG(2, UAVsAtEveryStage, "UAVs at every shader stage")
SHADER_FEATURE_FLAG(3, Max64UAVs, "64 UAV slots")
SHADER_FEATURE_FLAG(4, MinimumPrecision, "Minimum-precision data types")
SHADER_FEATURE_FLAG(5, DX11_1_DoubleExtensions, "Double-precision extensions for 11.1")
SHADER_FEATURE_FLAG(6, DX11_1_ShaderExtensions, "Shader extensions for 11.1")
SHADER_FEATURE_FLAG(7, LEVEL9ComparisonFiltering, "Comparison filtering for feature level 9")
SHADER_FEATURE_FLAG(8, TiledResources, "Tiled resources")
SHADER_FEATURE_FLAG(9, StencilRef, "PS Output Stencil Ref")
SHADER_FEATURE_FLAG(10, InnerCoverage, "PS Inner Coverage")
SHADER_FEATURE_FLAG(11, TypedUAVLoadAdditionalFormats, "Typed UAV Load Additional Formats")
SHADER_FEATURE_FLAG(12, ROVs, "Raster Ordered UAVs")
SHADER_FEATURE_FLAG(13, ViewportAndRTArrayIndexFromAnyShaderFeedingRasterizer, "SV_RenderTargetArrayIndex or SV_ViewportArrayIndex from any shader feeding rasterizer")
SHADER_FEATURE_FLAG(14, WaveOps, "Wave level operations")
SHADER_FEATURE_FLAG(15, Int64Ops, "64-Bit integer")
SHADER_FEATURE_FLAG(16, ViewID, "View Instancing")
SHADER_FEATURE_FLAG(17, Barycentrics, "Barycentrics")
SHADER_FEATURE_FLAG(18, NativeLowPrecision, "Use native low precision")
SHADER_FEATURE_FLAG(19, ShadingRate, "Shading Rate")
SHADER_FEATURE_FLAG(20, Raytracing_Tier_1_1, "Raytracing tier 1.1 features")
SHADER_FEATURE_FLAG(21, SamplerFeedback, "Sampler feedback")
SHADER_FEATURE_FLAG(22, AtomicInt64OnTypedResource, "64-bit Atomics on Typed Resources")
SHADER_FEATURE_FLAG(23, AtomicInt64OnGroupShared, "64-bit Atomics on Group Shared")
SHADER_FEATURE_FLAG(24, DerivativesInMeshAndAmpShaders, "Derivatives in mesh and amplification shaders")
SHADER_FEATURE_FLAG(25, ResourceDescriptorHeapIndexing, "Resource descriptor heap indexing")
SHADER_FEATURE_FLAG(26, SamplerDescriptorHeapIndexing, "Sampler descriptor heap indexing")
SHADER_FEATURE_FLAG(27, RESERVED, "<RESERVED>")
SHADER_FEATURE_FLAG(28, AtomicInt64OnHeapResource, "64-bit Atomics on Heap Resources")
SHADER_FEATURE_FLAG(29, AdvancedTextureOps, "Advanced Texture Ops")
SHADER_FEATURE_FLAG(30, WriteableMSAATextures, "Writeable MSAA Textures")

SHADER_FEATURE_FLAG(31, NextUnusedBit, "Next reserved shader flag bit (not a flag)")
// SHADER_FEATURE_FLAG(bit offset for the shader info flag, bit offset for DXIL module flag, name, description.

SHADER_FEATURE_FLAG(0, 2, Doubles, "Double-precision floating point")
SHADER_FEATURE_FLAG(1, 17, ComputeShadersPlusRawAndStructuredBuffers, "Raw and Structured buffers")
SHADER_FEATURE_FLAG(2, 16, UAVsAtEveryStage, "UAVs at every shader stage")
SHADER_FEATURE_FLAG(3, 15, Max64UAVs, "64 UAV slots")
SHADER_FEATURE_FLAG(4, -1, MinimumPrecision, "Minimum-precision data types")
SHADER_FEATURE_FLAG(5, 6, DX11_1_DoubleExtensions, "Double-precision extensions for 11.1")
SHADER_FEATURE_FLAG(6, 7, DX11_1_ShaderExtensions, "Shader extensions for 11.1")
SHADER_FEATURE_FLAG(7, 14, LEVEL9ComparisonFiltering, "Comparison filtering for feature level 9")
SHADER_FEATURE_FLAG(8, 12, TiledResources, "Tiled resources")
SHADER_FEATURE_FLAG(9, 11, StencilRef, "PS Output Stencil Ref")
SHADER_FEATURE_FLAG(10, 10, InnerCoverage, "PS Inner Coverage")
SHADER_FEATURE_FLAG(11, 13, TypedUAVLoadAdditionalFormats, "Typed UAV Load Additional Formats")
SHADER_FEATURE_FLAG(12, 18, ROVs, "Raster Ordered UAVs")
SHADER_FEATURE_FLAG(13, 9, ViewportAndRTArrayIndexFromAnyShaderFeedingRasterizer, "SV_RenderTargetArrayIndex or SV_ViewportArrayIndex from any shader feeding rasterizer")
SHADER_FEATURE_FLAG(14, 19, WaveOps, "Wave level operations")
SHADER_FEATURE_FLAG(15, 20, Int64Ops, "64-Bit integer")
SHADER_FEATURE_FLAG(16, 21, ViewID, "View Instancing")
SHADER_FEATURE_FLAG(17, 22, Barycentrics, "Barycentrics")
SHADER_FEATURE_FLAG(18, -1, NativeLowPrecision, "Use native low precision")
SHADER_FEATURE_FLAG(19, 24, ShadingRate, "Shading Rate")
SHADER_FEATURE_FLAG(20, 25, Raytracing_Tier_1_1, "Raytracing tier 1.1 features")
SHADER_FEATURE_FLAG(21, 26, SamplerFeedback, "Sampler feedback")
SHADER_FEATURE_FLAG(22, 27, AtomicInt64OnTypedResource, "64-bit Atomics on Typed Resources")
SHADER_FEATURE_FLAG(23, 28, AtomicInt64OnGroupShared, "64-bit Atomics on Group Shared")
SHADER_FEATURE_FLAG(24, 29, DerivativesInMeshAndAmpShaders, "Derivatives in mesh and amplification shaders")
SHADER_FEATURE_FLAG(25, 30, ResourceDescriptorHeapIndexing, "Resource descriptor heap indexing")
SHADER_FEATURE_FLAG(26, 31, SamplerDescriptorHeapIndexing, "Sampler descriptor heap indexing")
SHADER_FEATURE_FLAG(27, 63, RESERVED, "<RESERVED>")
SHADER_FEATURE_FLAG(28, 32, AtomicInt64OnHeapResource, "64-bit Atomics on Heap Resources")
SHADER_FEATURE_FLAG(29, 34, AdvancedTextureOps, "Advanced Texture Ops")
SHADER_FEATURE_FLAG(30, 35, WriteableMSAATextures, "Writeable MSAA Textures")

SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a flag)")

#undef SHADER_FEATURE_FLAG
#endif
#endif // SHADER_FEATURE_FLAG

#ifdef DXIL_MODULE_FLAG

// Only save DXIL module flags which not map to feature flags here.
DXIL_MODULE_FLAG( 0, DisableOptimizations, "D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION")
DXIL_MODULE_FLAG( 1, DisableMathRefactoring, "D3D10_SB_GLOBAL_FLAG_REFACTORING_ALLOWED")
DXIL_MODULE_FLAG( 3, ForceEarlyDepthStencil, "D3D11_SB_GLOBAL_FLAG_FORCE_EARLY_DEPTH_STENCIL")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The *_SB_GLOBAL_FLAG_* values were carried over from DXBC, and were global for a particular shader. Most of these can be considered global module-level flags, but not ForceEarlyDepthStencil, which applies to a particular pixel shader only (which only makes a difference for libraries). However, we could also potentially support some at a more granular level, such as DisableOptimizations or DisableMathRefactoring, though more granular settings for these could be expressed differently.

That said, there are ones missing from this list, and there may be overlap between flags that could be exposed through feature flags or global flags corresponding to DXBC's *_SB_GLOBAL_FLAG_*, such as DX11_1_ShaderExtensions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DX11_1_ShaderExtension is marked as map to DxilModuleFlag bit offset 7.

DXIL_MODULE_FLAG( 4, EnableRawAndStructuredBuffers, "D3D11_SB_GLOBAL_FLAG_ENABLE_RAW_AND_STRUCTURED_BUFFERS")
DXIL_MODULE_FLAG( 5, LowPrecisionPresent, "D3D11_1_SB_GLOBAL_FLAG_ENABLE_MINIMUM_PRECISION")
DXIL_MODULE_FLAG( 8, AllResourcesBound, "D3D12_SB_GLOBAL_FLAG_ALL_RESOURCES_BOUND")
DXIL_MODULE_FLAG(23, UseNativeLowPrecision, "Native 16bit types enabled")
DXIL_MODULE_FLAG(33, ResMayNotAlias, "Any UAV may not alias any other UAV")

#undef DXIL_MODULE_FLAG
#endif // DXIL_MODULE_FLAG

#ifdef SEMANTIC_KIND

Expand Down Expand Up @@ -86,7 +103,7 @@ SEMANTIC_KIND(30, CullPrimitive)
SEMANTIC_KIND(30, Invalid)

#undef SEMANTIC_KIND
#endif
#endif // SEMANTIC_KIND

#ifdef COMPONENT_TYPE

Expand All @@ -102,7 +119,7 @@ COMPONENT_TYPE(8, SInt64)
COMPONENT_TYPE(9, Float64)

#undef COMPONENT_TYPE
#endif
#endif // COMPONENT_TYPE

#ifdef COMPONENT_PRECISION

Expand All @@ -116,7 +133,7 @@ COMPONENT_PRECISION(0xf0, Any16)
COMPONENT_PRECISION(0xf1, Any10)

#undef COMPONENT_PRECISION
#endif
#endif // COMPONENT_PRECISION

#ifdef INTERPOLATION_MODE

Expand All @@ -131,7 +148,7 @@ INTERPOLATION_MODE(7, LinearNoperspectiveSample)
INTERPOLATION_MODE(8, Invalid)

#undef INTERPOLATION_MODE
#endif
#endif // INTERPOLATION_MODE

#ifdef D3D_SYSTEM_VALUE

Expand Down Expand Up @@ -165,4 +182,4 @@ D3D_SYSTEM_VALUE(70, InnerCoverage)

#undef D3D_SYSTEM_VALUE

#endif
#endif // D3D_SYSTEM_VALUE
2 changes: 1 addition & 1 deletion llvm/include/llvm/ObjectYAML/DXContainerYAML.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct DXILProgram {
std::optional<std::vector<llvm::yaml::Hex8>> DXIL;
};

#define SHADER_FEATURE_FLAG(Num, Val, Str) bool Val = false;
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) bool Val = false;
struct ShaderFeatureFlags {
ShaderFeatureFlags() = default;
ShaderFeatureFlags(uint64_t FlagData);
Expand Down
7 changes: 4 additions & 3 deletions llvm/lib/ObjectYAML/DXContainerYAML.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
"Shader flag bits exceed enum size.");

DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
#define SHADER_FEATURE_FLAG(Num, Val, Str) \
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}

uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
uint64_t Flag = 0;
#define SHADER_FEATURE_FLAG(Num, Val, Str) \
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
if (Val) \
Flag |= (uint64_t)dxbc::FeatureFlags::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
Expand Down Expand Up @@ -105,7 +105,8 @@ void MappingTraits<DXContainerYAML::DXILProgram>::mapping(

void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(
IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {
#define SHADER_FEATURE_FLAG(Num, Val, Str) IO.mapRequired(#Val, Flags.Val);
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
IO.mapRequired(#Val, Flags.Val);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}

Expand Down
19 changes: 11 additions & 8 deletions llvm/lib/Target/DirectX/DXContainerGlobals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ using namespace llvm::dxil;
namespace {
class DXContainerGlobals : public llvm::ModulePass {

GlobalVariable *getShaderFlags(Module &M);
GlobalVariable *getFeatureFlags(Module &M);
GlobalVariable *computeShaderHash(Module &M);

public:
Expand All @@ -53,21 +53,24 @@ class DXContainerGlobals : public llvm::ModulePass {

bool DXContainerGlobals::runOnModule(Module &M) {
llvm::SmallVector<GlobalValue *> Globals;
Globals.push_back(getShaderFlags(M));
Globals.push_back(getFeatureFlags(M));
Globals.push_back(computeShaderHash(M));

appendToCompilerUsed(M, Globals);
return true;
}

GlobalVariable *DXContainerGlobals::getShaderFlags(Module &M) {
const uint64_t Flags =
(uint64_t)(getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags());
GlobalVariable *DXContainerGlobals::getFeatureFlags(Module &M) {
const uint64_t FeatureFlags =
static_cast<uint64_t>(getAnalysis<ShaderFlagsAnalysisWrapper>()
.getShaderFlags()
.getFeatureFlags());

Constant *FlagsConstant = ConstantInt::get(M.getContext(), APInt(64, Flags));
auto *GV = new llvm::GlobalVariable(M, FlagsConstant->getType(), true,
Constant *FeatureFlagsConstant =
ConstantInt::get(M.getContext(), APInt(64, FeatureFlags));
auto *GV = new llvm::GlobalVariable(M, FeatureFlagsConstant->getType(), true,
GlobalValue::PrivateLinkage,
FlagsConstant, "dx.sfi0");
FeatureFlagsConstant, "dx.sfi0");
GV->setSection("SFI0");
GV->setAlignment(Align(4));
return GV;
Expand Down
9 changes: 7 additions & 2 deletions llvm/lib/Target/DirectX/DXILShaderFlags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,14 @@ void ComputedShaderFlags::print(raw_ostream &OS) const {
if (FlagVal == 0)
return;
OS << "; Note: shader requires additional functionality:\n";
#define SHADER_FEATURE_FLAG(bit, FlagName, Str) \
#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleNum, FlagName, Str) \
if (FlagName) \
OS << "; " Str "\n";
(OS << ";").indent(7) << Str << "\n";
#include "llvm/BinaryFormat/DXContainerConstants.def"
OS << "; Note: extra DXIL module flags:\n";
#define DXIL_MODULE_FLAG(DxilModuleBit, FlagName, Str) \
if (FlagName) \
(OS << ";").indent(7) << Str << "\n";
#include "llvm/BinaryFormat/DXContainerConstants.def"
OS << ";\n";
}
Expand Down
26 changes: 20 additions & 6 deletions llvm/lib/Target/DirectX/DXILShaderFlags.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#ifndef LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H
#define LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H

#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/Support/Compiler.h"
Expand All @@ -29,22 +28,37 @@ class GlobalVariable;
namespace dxil {

struct ComputedShaderFlags {
#define SHADER_FEATURE_FLAG(bit, FlagName, Str) bool FlagName : 1;
#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleBit, FlagName, Str) \
bool FlagName : 1;
#define DXIL_MODULE_FLAG(DxilModuleBit, FlagName, Str) bool FlagName : 1;
#include "llvm/BinaryFormat/DXContainerConstants.def"

#define SHADER_FEATURE_FLAG(bit, FlagName, Str) FlagName = false;
#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleBit, FlagName, Str) \
FlagName = false;
#define DXIL_MODULE_FLAG(DxilModuleBit, FlagName, Str) FlagName = false;
ComputedShaderFlags() {
#include "llvm/BinaryFormat/DXContainerConstants.def"
}

constexpr uint64_t getMask(int Bit) const {
return Bit != -1 ? 1ull << Bit : 0;
}
operator uint64_t() const {
uint64_t FlagValue = 0;
#define SHADER_FEATURE_FLAG(bit, FlagName, Str) \
FlagValue |= \
FlagName ? static_cast<uint64_t>(dxbc::FeatureFlags::FlagName) : 0ull;
#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleBit, FlagName, Str) \
FlagValue |= FlagName ? getMask(DxilModuleBit) : 0ull;
#define DXIL_MODULE_FLAG(DxilModuleBit, FlagName, Str) \
FlagValue |= FlagName ? getMask(DxilModuleBit) : 0ull;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return FlagValue;
}
uint64_t getFeatureFlags() const {
uint64_t FeatureFlags = 0;
#define SHADER_FEATURE_FLAG(FeatureBit, DxilModuleBit, FlagName, Str) \
FeatureFlags |= FlagName ? getMask(FeatureBit) : 0ull;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return FeatureFlags;
}

static ComputedShaderFlags computeFlags(Module &M);
void print(raw_ostream &OS = dbgs()) const;
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ bool DXILTranslateMetadata::runOnModule(Module &M) {
getAnalysis<DXILResourceWrapper>().getDXILResource();
Res.write(M);

const uint64_t Flags =
(uint64_t)(getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags());
const uint64_t Flags = static_cast<uint64_t>(
getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags());
dxil::createEntryMD(M, Flags);

return false;
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/DirectX/ShaderFlags/double-extensions.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@

target triple = "dxil-pc-shadermodel6.7-library"

; CHECK: ; Shader Flags Value: 0x00000021
; CHECK: ; Shader Flags Value: 0x00000044
; CHECK: ; Note: shader requires additional functionality:
; CHECK-NEXT: ; Double-precision floating point
; CHECK-NEXT: ; Double-precision extensions for 11.1
; CHECK-NEXT: ; Note: extra DXIL module flags:
; CHECK-NEXT: {{^;$}}
define double @div(double %a, double %b) {
%res = fdiv double %a, %b
Expand Down
4 changes: 3 additions & 1 deletion llvm/test/CodeGen/DirectX/ShaderFlags/doubles.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

target triple = "dxil-pc-shadermodel6.7-library"

; CHECK: ; Shader Flags Value: 0x00000001
; CHECK: ; Shader Flags Value: 0x00000004
; CHECK: ; Note: shader requires additional functionality:
; CHECK-NEXT: ; Double-precision floating point
; CHECK-NEXT: ; Note: extra DXIL module flags:
; CHECK-NEXT: {{^;$}}

define double @add(double %a, double %b) {
%sum = fadd double %a, %b
ret double %sum
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/DirectX/lib_entry.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ target triple = "dxil-unknown-shadermodel6.7-library"
; Make sure generate empty entry for lib profile.
;CHECK:![[empty_entry]] = !{null, !"", null, null, ![[shader_flags:[0-9]+]]}
; Make sure double is marked for shader flags.
;CHECK:![[shader_flags]] = !{i32 0, i64 1}
;CHECK:![[shader_flags]] = !{i32 0, i64 4}
;CHECK:![[entry]] = !{ptr @entry, !"entry", null, null, ![[extra:[0-9]+]]}
;CHECK:![[extra]] = !{i32 8, i32 5, i32 4, ![[numthreads:[0-9]+]]}
;CHECK:![[numthreads]] = !{i32 1, i32 2, i32 1}
Expand Down