Skip to content

Commit a48b473

Browse files
opt: Add QuadControlKHR to trim pass and allow lists (#6068)
Part of microsoft/DirectXShaderCompiler#7247
1 parent a4adb9a commit a48b473

6 files changed

Lines changed: 72 additions & 4 deletions

source/opt/aggressive_dead_code_elim_pass.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,8 @@ void AggressiveDCEPass::InitExtensions() {
10371037
"SPV_NV_cooperative_matrix",
10381038
"SPV_KHR_cooperative_matrix",
10391039
"SPV_KHR_ray_tracing_position_fetch",
1040-
"SPV_KHR_fragment_shading_rate"
1040+
"SPV_KHR_fragment_shading_rate",
1041+
"SPV_KHR_quad_control",
10411042
});
10421043
// clang-format on
10431044
}

source/opt/local_access_chain_convert_pass.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,8 @@ void LocalAccessChainConvertPass::InitExtensions() {
433433
"SPV_EXT_fragment_shader_interlock",
434434
"SPV_KHR_compute_shader_derivatives", "SPV_NV_cooperative_matrix",
435435
"SPV_KHR_cooperative_matrix", "SPV_KHR_ray_tracing_position_fetch",
436-
"SPV_AMDX_shader_enqueue", "SPV_KHR_fragment_shading_rate"});
436+
"SPV_AMDX_shader_enqueue", "SPV_KHR_fragment_shading_rate",
437+
"SPV_KHR_quad_control"});
437438
}
438439

439440
bool LocalAccessChainConvertPass::AnyIndexIsOutOfBounds(

source/opt/local_single_block_elim_pass.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,8 @@ void LocalSingleBlockLoadStoreElimPass::InitExtensions() {
298298
"SPV_NV_cooperative_matrix",
299299
"SPV_KHR_cooperative_matrix",
300300
"SPV_KHR_ray_tracing_position_fetch",
301-
"SPV_KHR_fragment_shading_rate"});
301+
"SPV_KHR_fragment_shading_rate",
302+
"SPV_KHR_quad_control"});
302303
}
303304

304305
} // namespace opt

source/opt/local_single_store_elim_pass.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ void LocalSingleStoreElimPass::InitExtensionAllowList() {
149149
"SPV_KHR_ray_tracing_position_fetch",
150150
"SPV_AMDX_shader_enqueue",
151151
"SPV_KHR_fragment_shading_rate",
152-
"SPV_KHR_ray_tracing"});
152+
"SPV_KHR_ray_tracing",
153+
"SPV_KHR_quad_control"});
153154
}
154155
bool LocalSingleStoreElimPass::ProcessVariable(Instruction* var_inst) {
155156
std::vector<Instruction*> users;

source/opt/trim_capabilities_pass.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class TrimCapabilitiesPass : public Pass {
107107
spv::Capability::StorageUniform16,
108108
spv::Capability::StorageUniformBufferBlock16,
109109
spv::Capability::VulkanMemoryModelDeviceScope,
110+
spv::Capability::QuadControlKHR,
110111
// clang-format on
111112
};
112113

test/opt/trim_capabilities_pass_test.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3543,6 +3543,69 @@ TEST_F(TrimCapabilitiesPassTest,
35433543
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
35443544
}
35453545

3546+
TEST_F(TrimCapabilitiesPassTest, QuadControlKHR_RemoveIfNotUsed) {
3547+
const std::string kTest = R"(
3548+
OpCapability Shader
3549+
OpCapability QuadControlKHR
3550+
; CHECK-NOT: OpCapability QuadControlKHR
3551+
OpExtension "SPV_KHR_quad_control"
3552+
; CHECK-NOT: OpExtension "SPV_KHR_quad_control"
3553+
OpMemoryModel Logical GLSL450
3554+
OpEntryPoint Fragment %main "main" %out_var_SV_Target
3555+
OpExecutionMode %main OriginUpperLeft
3556+
OpSource HLSL 660
3557+
OpName %out_var_SV_Target "out.var.SV_Target"
3558+
OpName %main "main"
3559+
OpDecorate %out_var_SV_Target Location 0
3560+
%float = OpTypeFloat 32
3561+
%v4float = OpTypeVector %float 4
3562+
%_ptr_Output_v4float = OpTypePointer Output %v4float
3563+
%void = OpTypeVoid
3564+
%7 = OpTypeFunction %void
3565+
%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output
3566+
%main = OpFunction %void None %7
3567+
%8 = OpLabel
3568+
OpReturn
3569+
OpFunctionEnd
3570+
)";
3571+
const auto result =
3572+
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
3573+
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange);
3574+
}
3575+
3576+
TEST_F(TrimCapabilitiesPassTest, QuadControlKHR_RemainsWithQuadAny) {
3577+
const std::string kTest = R"(
3578+
OpCapability Shader
3579+
OpCapability QuadControlKHR
3580+
; CHECK: OpCapability QuadControlKHR
3581+
OpExtension "SPV_KHR_quad_control"
3582+
; CHECK: OpExtension "SPV_KHR_quad_control"
3583+
OpMemoryModel Logical GLSL450
3584+
OpEntryPoint Fragment %main "main" %out_var_SV_Target
3585+
OpExecutionMode %main OriginUpperLeft
3586+
OpSource HLSL 660
3587+
OpName %out_var_SV_Target "out.var.SV_Target"
3588+
OpName %main "main"
3589+
OpDecorate %out_var_SV_Target Location 0
3590+
%bool = OpTypeBool
3591+
%float = OpTypeFloat 32
3592+
%v4float = OpTypeVector %float 4
3593+
%_ptr_Output_v4float = OpTypePointer Output %v4float
3594+
%void = OpTypeVoid
3595+
%7 = OpTypeFunction %void
3596+
%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output
3597+
%main = OpFunction %void None %7
3598+
%8 = OpLabel
3599+
%true = OpConstantTrue %bool
3600+
%10 = OpGroupNonUniformQuadAnyKHR %bool %true
3601+
OpReturn
3602+
OpFunctionEnd
3603+
)";
3604+
const auto result =
3605+
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
3606+
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
3607+
}
3608+
35463609
INSTANTIATE_TEST_SUITE_P(
35473610
TrimCapabilitiesPassTestSubgroupClustered_Unsigned_I,
35483611
TrimCapabilitiesPassTestSubgroupClustered_Unsigned,

0 commit comments

Comments
 (0)