diff --git a/lib/DXIL/DxilShaderFlags.cpp b/lib/DXIL/DxilShaderFlags.cpp index 71c7305b68..90b7d033b5 100644 --- a/lib/DXIL/DxilShaderFlags.cpp +++ b/lib/DXIL/DxilShaderFlags.cpp @@ -586,6 +586,8 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F, continue; if (hlsl::OP::IsDxilOpWave(dxilOp)) hasWaveOps = true; + if (hlsl::OP::IsDxilOpFeedback(dxilOp)) + hasSamplerFeedback = true; switch (dxilOp) { case DXIL::OpCode::CheckAccessFullyMapped: hasCheckAccessFully = true; @@ -821,6 +823,11 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F, // Before validator version 1.8, RequiresGroup flag did not exist. requiresGroup = false; } + if (hasSamplerFeedback && + DXIL::CompareVersions(valMajor, valMinor, 1, 9) < 0) { + // Before validator version 1.9, SamplerFeedback flag was not set. + hasSamplerFeedback = false; + } flag.SetEnableDoublePrecision(hasDouble); flag.SetStencilRef(hasStencilRef); diff --git a/tools/clang/test/HLSLFileCheck/hlsl/objects/FeedbackTexture/feedback_shader_flag.hlsl b/tools/clang/test/HLSLFileCheck/hlsl/objects/FeedbackTexture/feedback_shader_flag.hlsl new file mode 100644 index 0000000000..e3c7378a6b --- /dev/null +++ b/tools/clang/test/HLSLFileCheck/hlsl/objects/FeedbackTexture/feedback_shader_flag.hlsl @@ -0,0 +1,20 @@ +// RUN: %dxc -E main -T ps_6_5 %s | FileCheck %s -check-prefix=FLAG +// RUN: %dxc -E main -T ps_6_5 -validator-version 1.8 %s | FileCheck %s -check-prefix=NOFLAG + +// Verify that the Sampler feedback shader feature flag is set when any +// sampler feedback instruction is used, and that it is gated off for +// validator versions before 1.9. + +// FLAG: Note: shader requires additional functionality: +// FLAG: Sampler feedback + +// NOFLAG-NOT: Sampler feedback + +FeedbackTexture2D feedbackMinMip; +Texture2D texture2D; +SamplerState samp; + +float main() : SV_Target { + feedbackMinMip.WriteSamplerFeedback(texture2D, samp, (float2)0); + return 0; +}