Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SM68] Add feature flag for SampleCmpBias/Grad and StartInstance/VertexLocation #6164

Merged
Merged
Show file tree
Hide file tree
Changes from 4 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
5 changes: 4 additions & 1 deletion include/dxc/DXIL/DxilConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -1888,7 +1888,10 @@ const uint64_t ShaderFeatureInfo_WriteableMSAATextures = 0x40000000;
// WaveMMA slots in between two SM 6.6 feature bits.
const uint64_t ShaderFeatureInfo_WaveMMA = 0x8000000;

const unsigned ShaderFeatureInfoCount = 31;
const uint64_t ShaderFeatureInfo_SampleCmpGradientOrBias = 0x80000000;
const uint64_t ShaderFeatureInfo_ExtendedCommandInfo = 0x100000000;

const unsigned ShaderFeatureInfoCount = 33;

// DxilSubobjectType must match D3D12_STATE_SUBOBJECT_TYPE, with
// certain values reserved, since they cannot be used from Dxil.
Expand Down
14 changes: 12 additions & 2 deletions include/dxc/DXIL/DxilShaderFlags.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,14 @@ class ShaderFlags {
void SetWaveMMA(bool flag) { m_bWaveMMA = flag; }
bool GetWaveMMA() const { return m_bWaveMMA; }

void SetSampleCmpGradientOrBias(bool flag) {
m_bSampleCmpGradientOrBias = flag;
}
bool GetSampleCmpGradientOrBias() const { return m_bSampleCmpGradientOrBias; }

void SetExtendedCommandInfo(bool flag) { m_bExtendedCommandInfo = flag; }
bool GetExtendedCommandInfo() const { return m_bExtendedCommandInfo; }

private:
unsigned
m_bDisableOptimizations : 1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
Expand Down Expand Up @@ -276,8 +284,10 @@ class ShaderFlags {

// SM 6.8+
unsigned m_bWaveMMA : 1; // SHADER_FEATURE_WAVE_MMA

uint32_t m_align1 : 27; // align to 64 bit.
unsigned
m_bSampleCmpGradientOrBias : 1; // SHADER_FEATURE_SAMPLE_CMP_GRADIENT_OR_BIAS
unsigned m_bExtendedCommandInfo : 1; // SHADER_FEATURE_EXTENDED_COMMAND_INFO
uint32_t m_align1 : 25; // align to 64 bit.
};

} // namespace hlsl
24 changes: 22 additions & 2 deletions lib/DXIL/DxilShaderFlags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ ShaderFlags::ShaderFlags()
m_bSamplerDescriptorHeapIndexing(false),
m_bAtomicInt64OnHeapResource(false), m_bResMayNotAlias(false),
m_bAdvancedTextureOps(false), m_bWriteableMSAATextures(false),
m_bWaveMMA(false), m_align1(0) {
m_bWaveMMA(false), m_bSampleCmpGradientOrBias(false),
m_bExtendedCommandInfo(false), m_align1(0) {
// Silence unused field warnings
(void)m_align1;
}
Expand Down Expand Up @@ -125,6 +126,14 @@ uint64_t ShaderFlags::GetFeatureInfo() const {

Flags |= m_bWaveMMA ? hlsl::DXIL::ShaderFeatureInfo_WaveMMA : 0;

Flags |= m_bSampleCmpGradientOrBias
? hlsl::DXIL::ShaderFeatureInfo_SampleCmpGradientOrBias
: 0;

Flags |= m_bExtendedCommandInfo
? hlsl::DXIL::ShaderFeatureInfo_ExtendedCommandInfo
: 0;

return Flags;
}

Expand Down Expand Up @@ -185,6 +194,8 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() {
Flags.SetAdvancedTextureOps(true);
Flags.SetWriteableMSAATextures(true);
Flags.SetWaveMMA(true);
Flags.SetSampleCmpGradientOrBias(true);
Flags.SetExtendedCommandInfo(true);
return Flags.GetShaderFlagsRaw();
}

Expand Down Expand Up @@ -414,8 +425,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,

bool hasAdvancedTextureOps = false;
bool hasWriteableMSAATextures = false;
bool hasSampleCmpGradientOrBias = false;

bool hasWaveMMA = false;
bool hasExtendedCommandInfo = false;

// Try to maintain compatibility with a v1.0 validator if that's what we have.
uint32_t valMajor, valMinor;
Expand Down Expand Up @@ -590,13 +603,15 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
case DXIL::OpCode::SampleCmpGrad:
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
hasLodClamp |= hasSampleClamp(CI);
hasSampleCmpGradientOrBias = dxilOp == DXIL::OpCode::SampleCmpGrad;
break;
case DXIL::OpCode::Sample:
case DXIL::OpCode::SampleBias:
case DXIL::OpCode::SampleCmp:
case DXIL::OpCode::SampleCmpBias:
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
hasLodClamp |= hasSampleClamp(CI);
hasSampleCmpGradientOrBias = dxilOp == DXIL::OpCode::SampleCmpBias;
LLVM_FALLTHROUGH;
case DXIL::OpCode::DerivFineX:
case DXIL::OpCode::DerivFineY:
Expand Down Expand Up @@ -644,6 +659,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
case DXIL::OpCode::WaveMatrix_SumAccumulate:
hasWaveMMA = true;
break;
case DXIL::OpCode::StartVertexLocation:
case DXIL::OpCode::StartInstanceLocation:
hasExtendedCommandInfo = true;
break;
default:
// Normal opcodes.
break;
Expand Down Expand Up @@ -761,10 +780,11 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
flag.SetAdvancedTextureOps(hasAdvancedTextureOps);
flag.SetWriteableMSAATextures(hasWriteableMSAATextures);
flag.SetWaveMMA(hasWaveMMA);

flag.SetSampleCmpGradientOrBias(hasSampleCmpGradientOrBias);
// Only bother setting the flag when there are UAVs.
flag.SetResMayNotAlias(canSetResMayNotAlias && hasUAVs &&
!M->GetResMayAlias());
flag.SetExtendedCommandInfo(hasExtendedCommandInfo);

return flag;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RUN: %dxc -Tps_6_8 %s | FileCheck %s

// CHECK: SampleCmpGradientOrBias
SamplerComparisonState samp1;
Texture1D<float4> tex1d;
Texture1DArray<float4> tex1d_array;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RUN: %dxc -Tps_6_8 %s | FileCheck %s

// CHECK: SampleCmpGradientOrBias
SamplerComparisonState samp1;

Texture2D<float4> tex2d;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,31 @@
// RUN: %dxilver 1.8 | %dxc -E test_sampleb -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_sampleg -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplec -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG

// LOD clamp requires TiledResources feature
// From DXC disassembly comment:
// CHECK: Note: shader requires additional functionality:
// CMPBG: Note: shader requires additional functionality:
// CHECK-NEXT: Tiled resources
// CMPBG-NEXT: Tiled resources
// CMPBG-NEXT: SampleCmpGradientOrBias

// CHECK:define void @[[name:[a-z_]+]]()
// CMPBG:define void @[[name:[a-z_]+]]()

// CHECK: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
// CMPBG: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}
// CMPBG: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}

// tag 0: ShaderFlags, 4096 = Tiled resources
// CHECK: ![[extAttr]] = !{i32 0, i64 4096}

// tag 0: ShaderFlags, 137438957568 = Tiled resources and SampleCmpGradientOrBias
// CMPBG: ![[extAttr]] = !{i32 0, i64 137438957568}

Texture2D T2D;
SamplerState S;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,35 @@
// RUN: %dxilver 1.8 | %dxc -E test_sampleb -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_sampleg -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplec -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG
// RUN: %dxilver 1.8 | %dxc -E test_sample_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_sampleb_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_sampleg_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplec_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecg_zero -T ps_6_8 %s | FileCheck %s
// RUN: %dxilver 1.8 | %dxc -E test_samplecb_zero -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG
// RUN: %dxilver 1.8 | %dxc -E test_samplecg_zero -T ps_6_8 %s | FileCheck %s -check-prefix=CMPBG

// Make sure no tile resources when no lod clamp or clamp is 0.

// CHECK-NOT: Tiled resources
// CMPBG-NOT: Tiled resources
// CMPBG: SampleCmpGradientOrBias

// CHECK:define void @[[name:[a-z_]+]]()
// CMPBG:define void @[[name:[a-z_]+]]()

// CHECK: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
// CMPBG: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, null}
// CMPBG: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}

// tag 0: ShaderFlags, 4096 = Tiled resources
// CHECK-NOT:!{i32 0, i64 4096}

// tag 0: ShaderFlags, 137438953472 = SampleCmpGradientOrBias
// CMPBG: ![[extAttr]] = !{i32 0, i64 137438953472}

Texture2D T2D;
SamplerState S;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
// RUN: %dxc -E main -T vs_6_8 %s | FileCheck %s

// CHECK: ExtendedCommandInfo
// CHECK: @main

// CHECK: call i32 @dx.op.startInstanceLocation.i32(i32 257)
// CHECK: call i32 @dx.op.startVertexLocation.i32(i32 256)

// Make sure no input element is generated for the entry point.
// CHECK: !{void ()* @main, !"main", ![[SIG:[0-9]+]], null, null}
// CHECK: !{void ()* @main, !"main", ![[SIG:[0-9]+]], null, ![[extAttr:[0-9]+]]}
// The input should be null
// CHECK: ![[SIG]] = !{null,

// tag 0: ShaderFlags, 274877906944 = SampleCmpGradientOrBias
// CHECK: ![[extAttr]] = !{i32 0, i64 274877906944}

float4 main(int loc : SV_StartVertexLocation
, uint loc2 : SV_StartInstanceLocation
) : SV_Position
Expand Down
2 changes: 2 additions & 0 deletions tools/clang/tools/dxcompiler/dxcdisassembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ PCSTR g_pFeatureInfoNames[] = {
"64-bit Atomics on Heap Resources",
"Advanced Texture Ops",
"Writeable MSAA Textures",
"SampleCmpGradientOrBias",
"ExtendedCommandInfo",
};
static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount,
"g_pFeatureInfoNames needs to be updated");
Expand Down
Loading