diff --git a/external/SPIRV-Headers b/external/SPIRV-Headers index f31ca173ef..465055f6c9 160000 --- a/external/SPIRV-Headers +++ b/external/SPIRV-Headers @@ -1 +1 @@ -Subproject commit f31ca173eff866369e54d35e53375fadbabd58f4 +Subproject commit 465055f6c9128772e20082e893d974146acf7a02 diff --git a/external/SPIRV-Tools b/external/SPIRV-Tools index 64f5770f59..8a13595dd4 160000 --- a/external/SPIRV-Tools +++ b/external/SPIRV-Tools @@ -1 +1 @@ -Subproject commit 64f5770f59db933d46b9cad6edc42b4186409ef4 +Subproject commit 8a13595dd4ae5049ef42d0f30297d0c427db54b5 diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 34d480566a..95889d8d9a 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -8031,7 +8031,10 @@ SpirvInstruction *SpirvEmitter::createVectorSplat(const Expr *scalarExpr, // Should find a more meaningful one. if (auto *constVal = dyn_cast(scalarVal)) { llvm::SmallVector elements(size_t(size), constVal); - const bool isSpecConst = constVal->getopcode() == spv::Op::OpSpecConstant; + const bool isSpecConst = + constVal->getopcode() == spv::Op::OpSpecConstant || + constVal->getopcode() == spv::Op::OpSpecConstantFalse || + constVal->getopcode() == spv::Op::OpSpecConstantTrue; auto *value = spvBuilder.getConstantComposite(vecType, elements, isSpecConst); if (!value) diff --git a/tools/clang/test/CodeGenSPIRV/vk.spec-constant.reuse.hlsl b/tools/clang/test/CodeGenSPIRV/vk.spec-constant.reuse.hlsl index 95fb0502d7..885c0f55e1 100644 --- a/tools/clang/test/CodeGenSPIRV/vk.spec-constant.reuse.hlsl +++ b/tools/clang/test/CodeGenSPIRV/vk.spec-constant.reuse.hlsl @@ -1,10 +1,12 @@ // RUN: %dxc -T ps_6_0 -HV 2018 -E main -fcgl %s -spirv | FileCheck %s // CHECK: OpDecorate %y SpecId 0 +// CHECK: %y = OpSpecConstantFalse %bool [[vk::constant_id(0)]] const bool y = false; + [shader("pixel")] float4 main(float4 position : SV_Position) : SV_Target0 { -// CHECK: OpConstantComposite %v4bool %y %y %y %y +// CHECK: OpSpecConstantComposite %v4bool %y %y %y %y return y ? position : 1.0; }