From c94fd84eff090f326403e67e712bf38e9e27c36c Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 30 Jul 2024 10:52:45 -0700 Subject: Fix SPIRV emit for small-integer texture types. (#4753) * Fix SPIRV emit for small-integer texture types. * Disable -emit-spirv-via-glsl test. --- source/slang/slang-emit-spirv.cpp | 3 ++- source/slang/slang-ir-util.cpp | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index cb9eb0ae9..23eaa4435 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -6423,11 +6423,12 @@ struct SPIRVEmitContext // If the component types are not the same, convert them to be so. if (!isTypeEqual(getVectorElementType(toType), fromElementType)) { + SpvOp convertOp = isIntegralType(fromElementType) ? (isSignedType(fromElementType) ? SpvOpSConvert : SpvOpUConvert) : SpvOpFConvert; auto newFromType = replaceVectorElementType(fromType, getVectorElementType(toType)); fromSpvInst = emitInstCustomOperandFunc( parent, nullptr, - SpvOpFConvert, + convertOp, [&]() { emitOperand(newFromType); emitOperand(kResultID), diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 8294cd533..e030b6d24 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -1557,10 +1557,24 @@ void hoistInstOutOfASMBlocks(IRBlock* block) IRType* getSPIRVSampledElementType(IRInst* sampledType) { auto sampledElementType = getVectorElementType((IRType*)sampledType); - if (sampledElementType->getOp() == kIROp_HalfType) + + IRBuilder builder(sampledType); + switch (sampledElementType->getOp()) { - IRBuilder builder(sampledType); + case kIROp_HalfType: sampledElementType = builder.getBasicType(BaseType::Float); + break; + case kIROp_UInt16Type: + case kIROp_UInt8Type: + case kIROp_CharType: + sampledElementType = builder.getBasicType(BaseType::UInt); + break; + case kIROp_Int8Type: + case kIROp_Int16Type: + sampledElementType = builder.getBasicType(BaseType::Int); + break; + default: + break; } return sampledElementType; } -- cgit v1.2.3