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

New feature flag ShaderFeatureInfo_SampleCmpGradientOrBias = 0x80000000
and
ShaderFeatureInfo_ExtendedCommandInfo = 0x100000000 were added. 
They will be set when SampleCmpBias/Grad startInstance/VertexLocation
exists.

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
Xiang Li 2024-01-19 20:01:56 -08:00 коммит произвёл GitHub
Родитель 6d8645f985
Коммит ae9b762a30
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
9 изменённых файлов: 77 добавлений и 27 удалений

Просмотреть файл

@ -1890,7 +1890,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.

Просмотреть файл

@ -197,6 +197,14 @@ public:
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
@ -276,8 +284,10 @@ private:
// 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

Просмотреть файл

@ -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;
}
@ -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;
}
@ -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();
}
@ -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;
@ -590,6 +603,7 @@ 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:
@ -597,6 +611,7 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
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:
@ -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;
@ -761,10 +780,11 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
flag.SetAdvancedTextureOps(hasAdvancedTextureOps);
flag.SetWriteableMSAATextures(hasWriteableMSAATextures);
flag.SetWaveMMA(hasWaveMMA);
// Only bother setting the flag when there are UAVs.
flag.SetResMayNotAlias(canSetResMayNotAlias && hasUAVs &&
!M->GetResMayAlias());
flag.SetSampleCmpGradientOrBias(hasSampleCmpGradientOrBias);
flag.SetExtendedCommandInfo(hasExtendedCommandInfo);
return flag;
}

Просмотреть файл

@ -1,5 +1,6 @@
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
// CHECK: SampleCmp with gradient or bias
SamplerComparisonState samp1;
Texture1D<float4> tex1d;
Texture1DArray<float4> tex1d_array;

Просмотреть файл

@ -1,5 +1,6 @@
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
// CHECK: SampleCmp with gradient or bias
SamplerComparisonState samp1;
Texture2D<float4> tex2d;

Просмотреть файл

@ -1,14 +1,15 @@
// RUN: %dxilver 1.8 | %dxc -E test_sample -T ps_6_8 %s | FileCheck %s
// 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_sample -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleb -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleg -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplec -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// LOD clamp requires TiledResources feature
// From DXC disassembly comment:
// CHECK: Note: shader requires additional functionality:
// CHECK-NEXT: Tiled resources
// CMPBG-NEXT: SampleCmp with gradient or bias
// CHECK:define void @[[name:[a-z_]+]]()
@ -16,7 +17,10 @@
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}
// tag 0: ShaderFlags, 4096 = Tiled resources
// CHECK: ![[extAttr]] = !{i32 0, i64 4096}
// NRM: ![[extAttr]] = !{i32 0, i64 4096}
// tag 0: ShaderFlags, 137438957568 = Tiled resources and SampleCmpGradientOrBias
// CMPBG: ![[extAttr]] = !{i32 0, i64 137438957568}
Texture2D T2D;
SamplerState S;

Просмотреть файл

@ -1,27 +1,32 @@
// RUN: %dxilver 1.8 | %dxc -E test_sample -T ps_6_8 %s | FileCheck %s
// 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_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_sample -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleb -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleg -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplec -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecb -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sample_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleb_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_sampleg_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplec_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=NRM,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecb_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// RUN: %dxilver 1.8 | %dxc -E test_samplecg_zero -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
// Make sure no tile resources when no lod clamp or clamp is 0.
// CHECK-NOT: Tiled resources
// CMPBG: SampleCmp with gradient or bias
// CHECK:define void @[[name:[a-z_]+]]()
// CHECK: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, null}
// NRM: ![[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}
// NRM-NOT:!{i32 0, i64 4096}
// tag 0: ShaderFlags, 137438953472 = SampleCmpGradientOrBias
// CMPBG: ![[extAttr]] = !{i32 0, i64 137438953472}
Texture2D T2D;
SamplerState S;

Просмотреть файл

@ -1,15 +1,19 @@
// RUN: %dxc -E main -T vs_6_8 %s | FileCheck %s
// CHECK: Extended command info
// 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

Просмотреть файл

@ -347,6 +347,8 @@ PCSTR g_pFeatureInfoNames[] = {
"64-bit Atomics on Heap Resources",
"Advanced Texture Ops",
"Writeable MSAA Textures",
"SampleCmp with gradient or bias",
"Extended command info",
};
static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount,
"g_pFeatureInfoNames needs to be updated");