[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:
Родитель
6d8645f985
Коммит
ae9b762a30
|
@ -1890,7 +1890,10 @@ const uint64_t ShaderFeatureInfo_WriteableMSAATextures = 0x40000000;
|
||||||
// WaveMMA slots in between two SM 6.6 feature bits.
|
// WaveMMA slots in between two SM 6.6 feature bits.
|
||||||
const uint64_t ShaderFeatureInfo_WaveMMA = 0x8000000;
|
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
|
// DxilSubobjectType must match D3D12_STATE_SUBOBJECT_TYPE, with
|
||||||
// certain values reserved, since they cannot be used from Dxil.
|
// certain values reserved, since they cannot be used from Dxil.
|
||||||
|
|
|
@ -197,6 +197,14 @@ public:
|
||||||
void SetWaveMMA(bool flag) { m_bWaveMMA = flag; }
|
void SetWaveMMA(bool flag) { m_bWaveMMA = flag; }
|
||||||
bool GetWaveMMA() const { return m_bWaveMMA; }
|
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:
|
private:
|
||||||
unsigned
|
unsigned
|
||||||
m_bDisableOptimizations : 1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
|
m_bDisableOptimizations : 1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
|
||||||
|
@ -276,8 +284,10 @@ private:
|
||||||
|
|
||||||
// SM 6.8+
|
// SM 6.8+
|
||||||
unsigned m_bWaveMMA : 1; // SHADER_FEATURE_WAVE_MMA
|
unsigned m_bWaveMMA : 1; // SHADER_FEATURE_WAVE_MMA
|
||||||
|
unsigned
|
||||||
uint32_t m_align1 : 27; // align to 64 bit.
|
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
|
} // namespace hlsl
|
||||||
|
|
|
@ -45,7 +45,8 @@ ShaderFlags::ShaderFlags()
|
||||||
m_bSamplerDescriptorHeapIndexing(false),
|
m_bSamplerDescriptorHeapIndexing(false),
|
||||||
m_bAtomicInt64OnHeapResource(false), m_bResMayNotAlias(false),
|
m_bAtomicInt64OnHeapResource(false), m_bResMayNotAlias(false),
|
||||||
m_bAdvancedTextureOps(false), m_bWriteableMSAATextures(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
|
// Silence unused field warnings
|
||||||
(void)m_align1;
|
(void)m_align1;
|
||||||
}
|
}
|
||||||
|
@ -125,6 +126,14 @@ uint64_t ShaderFlags::GetFeatureInfo() const {
|
||||||
|
|
||||||
Flags |= m_bWaveMMA ? hlsl::DXIL::ShaderFeatureInfo_WaveMMA : 0;
|
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;
|
return Flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,6 +194,8 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() {
|
||||||
Flags.SetAdvancedTextureOps(true);
|
Flags.SetAdvancedTextureOps(true);
|
||||||
Flags.SetWriteableMSAATextures(true);
|
Flags.SetWriteableMSAATextures(true);
|
||||||
Flags.SetWaveMMA(true);
|
Flags.SetWaveMMA(true);
|
||||||
|
Flags.SetSampleCmpGradientOrBias(true);
|
||||||
|
Flags.SetExtendedCommandInfo(true);
|
||||||
return Flags.GetShaderFlagsRaw();
|
return Flags.GetShaderFlagsRaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,8 +425,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
||||||
|
|
||||||
bool hasAdvancedTextureOps = false;
|
bool hasAdvancedTextureOps = false;
|
||||||
bool hasWriteableMSAATextures = false;
|
bool hasWriteableMSAATextures = false;
|
||||||
|
bool hasSampleCmpGradientOrBias = false;
|
||||||
|
|
||||||
bool hasWaveMMA = false;
|
bool hasWaveMMA = false;
|
||||||
|
bool hasExtendedCommandInfo = false;
|
||||||
|
|
||||||
// Try to maintain compatibility with a v1.0 validator if that's what we have.
|
// Try to maintain compatibility with a v1.0 validator if that's what we have.
|
||||||
uint32_t valMajor, valMinor;
|
uint32_t valMajor, valMinor;
|
||||||
|
@ -590,6 +603,7 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
||||||
case DXIL::OpCode::SampleCmpGrad:
|
case DXIL::OpCode::SampleCmpGrad:
|
||||||
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
|
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
|
||||||
hasLodClamp |= hasSampleClamp(CI);
|
hasLodClamp |= hasSampleClamp(CI);
|
||||||
|
hasSampleCmpGradientOrBias = dxilOp == DXIL::OpCode::SampleCmpGrad;
|
||||||
break;
|
break;
|
||||||
case DXIL::OpCode::Sample:
|
case DXIL::OpCode::Sample:
|
||||||
case DXIL::OpCode::SampleBias:
|
case DXIL::OpCode::SampleBias:
|
||||||
|
@ -597,6 +611,7 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
||||||
case DXIL::OpCode::SampleCmpBias:
|
case DXIL::OpCode::SampleCmpBias:
|
||||||
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
|
hasAdvancedTextureOps |= hasNonConstantSampleOffsets(CI);
|
||||||
hasLodClamp |= hasSampleClamp(CI);
|
hasLodClamp |= hasSampleClamp(CI);
|
||||||
|
hasSampleCmpGradientOrBias = dxilOp == DXIL::OpCode::SampleCmpBias;
|
||||||
LLVM_FALLTHROUGH;
|
LLVM_FALLTHROUGH;
|
||||||
case DXIL::OpCode::DerivFineX:
|
case DXIL::OpCode::DerivFineX:
|
||||||
case DXIL::OpCode::DerivFineY:
|
case DXIL::OpCode::DerivFineY:
|
||||||
|
@ -644,6 +659,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
||||||
case DXIL::OpCode::WaveMatrix_SumAccumulate:
|
case DXIL::OpCode::WaveMatrix_SumAccumulate:
|
||||||
hasWaveMMA = true;
|
hasWaveMMA = true;
|
||||||
break;
|
break;
|
||||||
|
case DXIL::OpCode::StartVertexLocation:
|
||||||
|
case DXIL::OpCode::StartInstanceLocation:
|
||||||
|
hasExtendedCommandInfo = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// Normal opcodes.
|
// Normal opcodes.
|
||||||
break;
|
break;
|
||||||
|
@ -761,10 +780,11 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
|
||||||
flag.SetAdvancedTextureOps(hasAdvancedTextureOps);
|
flag.SetAdvancedTextureOps(hasAdvancedTextureOps);
|
||||||
flag.SetWriteableMSAATextures(hasWriteableMSAATextures);
|
flag.SetWriteableMSAATextures(hasWriteableMSAATextures);
|
||||||
flag.SetWaveMMA(hasWaveMMA);
|
flag.SetWaveMMA(hasWaveMMA);
|
||||||
|
|
||||||
// Only bother setting the flag when there are UAVs.
|
// Only bother setting the flag when there are UAVs.
|
||||||
flag.SetResMayNotAlias(canSetResMayNotAlias && hasUAVs &&
|
flag.SetResMayNotAlias(canSetResMayNotAlias && hasUAVs &&
|
||||||
!M->GetResMayAlias());
|
!M->GetResMayAlias());
|
||||||
|
flag.SetSampleCmpGradientOrBias(hasSampleCmpGradientOrBias);
|
||||||
|
flag.SetExtendedCommandInfo(hasExtendedCommandInfo);
|
||||||
|
|
||||||
return flag;
|
return flag;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
|
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: SampleCmp with gradient or bias
|
||||||
SamplerComparisonState samp1;
|
SamplerComparisonState samp1;
|
||||||
Texture1D<float4> tex1d;
|
Texture1D<float4> tex1d;
|
||||||
Texture1DArray<float4> tex1d_array;
|
Texture1DArray<float4> tex1d_array;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
|
// RUN: %dxc -Tps_6_8 %s | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: SampleCmp with gradient or bias
|
||||||
SamplerComparisonState samp1;
|
SamplerComparisonState samp1;
|
||||||
|
|
||||||
Texture2D<float4> tex2d;
|
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_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
|
// 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
|
// 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
|
// 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
|
// 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
|
// RUN: %dxilver 1.8 | %dxc -E test_samplecg -T ps_6_8 %s | FileCheck %s -check-prefixes=CMPBG,CHECK
|
||||||
|
|
||||||
// LOD clamp requires TiledResources feature
|
// LOD clamp requires TiledResources feature
|
||||||
// From DXC disassembly comment:
|
// From DXC disassembly comment:
|
||||||
// CHECK: Note: shader requires additional functionality:
|
// CHECK: Note: shader requires additional functionality:
|
||||||
// CHECK-NEXT: Tiled resources
|
// CHECK-NEXT: Tiled resources
|
||||||
|
// CMPBG-NEXT: SampleCmp with gradient or bias
|
||||||
|
|
||||||
// CHECK:define void @[[name:[a-z_]+]]()
|
// CHECK:define void @[[name:[a-z_]+]]()
|
||||||
|
|
||||||
|
@ -16,7 +17,10 @@
|
||||||
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}
|
// CHECK: ![[entryPoints]] = !{void ()* @[[name]], !"[[name]]", !{{[0-9]+}}, !{{[0-9]+}}, ![[extAttr:[0-9]+]]}
|
||||||
|
|
||||||
// tag 0: ShaderFlags, 4096 = Tiled resources
|
// 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;
|
Texture2D T2D;
|
||||||
SamplerState S;
|
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_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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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.
|
// Make sure no tile resources when no lod clamp or clamp is 0.
|
||||||
|
|
||||||
// CHECK-NOT: Tiled resources
|
// CHECK-NOT: Tiled resources
|
||||||
|
// CMPBG: SampleCmp with gradient or bias
|
||||||
|
|
||||||
// CHECK:define void @[[name:[a-z_]+]]()
|
// CHECK:define void @[[name:[a-z_]+]]()
|
||||||
|
|
||||||
// CHECK: !dx.entryPoints = !{![[entryPoints:[0-9]+]]}
|
// 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
|
// 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;
|
Texture2D T2D;
|
||||||
SamplerState S;
|
SamplerState S;
|
||||||
|
|
|
@ -1,15 +1,19 @@
|
||||||
// RUN: %dxc -E main -T vs_6_8 %s | FileCheck %s
|
// RUN: %dxc -E main -T vs_6_8 %s | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: Extended command info
|
||||||
// CHECK: @main
|
// CHECK: @main
|
||||||
|
|
||||||
// CHECK: call i32 @dx.op.startInstanceLocation.i32(i32 257)
|
// CHECK: call i32 @dx.op.startInstanceLocation.i32(i32 257)
|
||||||
// CHECK: call i32 @dx.op.startVertexLocation.i32(i32 256)
|
// CHECK: call i32 @dx.op.startVertexLocation.i32(i32 256)
|
||||||
|
|
||||||
// Make sure no input element is generated for the entry point.
|
// 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
|
// The input should be null
|
||||||
// CHECK: ![[SIG]] = !{null,
|
// CHECK: ![[SIG]] = !{null,
|
||||||
|
|
||||||
|
// tag 0: ShaderFlags, 274877906944 = SampleCmpGradientOrBias
|
||||||
|
// CHECK: ![[extAttr]] = !{i32 0, i64 274877906944}
|
||||||
|
|
||||||
float4 main(int loc : SV_StartVertexLocation
|
float4 main(int loc : SV_StartVertexLocation
|
||||||
, uint loc2 : SV_StartInstanceLocation
|
, uint loc2 : SV_StartInstanceLocation
|
||||||
) : SV_Position
|
) : SV_Position
|
||||||
|
|
|
@ -347,6 +347,8 @@ PCSTR g_pFeatureInfoNames[] = {
|
||||||
"64-bit Atomics on Heap Resources",
|
"64-bit Atomics on Heap Resources",
|
||||||
"Advanced Texture Ops",
|
"Advanced Texture Ops",
|
||||||
"Writeable MSAA Textures",
|
"Writeable MSAA Textures",
|
||||||
|
"SampleCmp with gradient or bias",
|
||||||
|
"Extended command info",
|
||||||
};
|
};
|
||||||
static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount,
|
static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount,
|
||||||
"g_pFeatureInfoNames needs to be updated");
|
"g_pFeatureInfoNames needs to be updated");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче