diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index f960cfbf..eeb37f11 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -2692,11 +2692,13 @@ out vec4 fragColor; float fma (float a, float b, float c) { return a * b + c; } float sinh(float x, float y) { return x * y; } +float length_squared(vec3 value) { return dot(value, value); } float round(float x) { return floor(x + 0.5); } float min3(float a, float b, float c) { return min(min(a, b), c); } void main() { - fragColor = vec4(fma(0.1, 0.2, 0.3), sinh(0.4, 2.0), round(1.25), min3(0.1, 0.2, 0.3)); + fragColor = vec4(fma(0.1, 0.2, 0.3), sinh(0.4, 2.0), round(1.25), + min3(0.1, 0.2, 0.3) + length_squared(vec3(0.1, 0.2, 0.3))); } )"; GLuint vs = CompileShaderChecked(GL_VERTEX_SHADER, vsSource); @@ -2707,6 +2709,7 @@ void main() { if (essl.find("fragColor") == String::npos) continue; // fragment module only EXPECT_NE(essl.find("mg_fma("), String::npos) << essl; EXPECT_NE(essl.find("mg_sinh("), String::npos) << essl; + EXPECT_NE(essl.find("mg_length_squared("), String::npos) << essl; EXPECT_NE(essl.find("mg_round("), String::npos) << essl; EXPECT_NE(essl.find("mg_min3("), String::npos) << essl; EXPECT_EQ(essl.find("float fma("), String::npos) << essl; diff --git a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp index 8161fe8f..22c5b3b2 100644 --- a/MobileGL/MG_Test/Program/ProgramUtilTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramUtilTest.cpp @@ -52,20 +52,24 @@ TEST_F(ProgramUtilTest, RenameSamplerFunctionParameterInSpirvPass) { OpEntryPoint Fragment %main "main" %outColor OpExecutionMode %main OriginUpperLeft OpName %globalSampler "sampler" + OpName %globalNew "new" OpName %paramSampler "sampler" + OpName %paramNew "new" OpName %main "main" OpDecorate %outColor Location 0 %void = OpTypeVoid %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %mainFn = OpTypeFunction %void - %paramFn = OpTypeFunction %void %float + %paramFn = OpTypeFunction %void %float %float %outV4Ptr = OpTypePointer Output %v4float %privatePtr = OpTypePointer Private %float %outColor = OpVariable %outV4Ptr Output %globalSampler = OpVariable %privatePtr Private + %globalNew = OpVariable %privatePtr Private %helper = OpFunction %void None %paramFn %paramSampler = OpFunctionParameter %float + %paramNew = OpFunctionParameter %float %helperBody = OpLabel OpReturn OpFunctionEnd @@ -91,6 +95,7 @@ TEST_F(ProgramUtilTest, RenameSamplerFunctionParameterInSpirvPass) { ASSERT_TRUE(tools.Disassemble(outputBinary, &outputText)); EXPECT_NE(outputText.find("\"MGL_COMPAT_sampler\""), String::npos); + EXPECT_NE(outputText.find("\"MGL_COMPAT_new\""), String::npos); SizeT exactSamplerNameCount = 0; SizeT searchOffset = 0; @@ -99,6 +104,14 @@ TEST_F(ProgramUtilTest, RenameSamplerFunctionParameterInSpirvPass) { searchOffset += std::strlen("\"sampler\""); } EXPECT_EQ(exactSamplerNameCount, 1u); + + SizeT exactNewNameCount = 0; + searchOffset = 0; + while ((searchOffset = outputText.find("\"new\"", searchOffset)) != String::npos) { + ++exactNewNameCount; + searchOffset += std::strlen("\"new\""); + } + EXPECT_EQ(exactNewNameCount, 1u); } TEST_F(ProgramUtilTest, UnformattedFloatStorageImagesKeepIntegerAtomicImagesTyped) { diff --git a/MobileGL/MG_Util/ShaderTranspiler/EsslBuiltinFunctionNames.h b/MobileGL/MG_Util/ShaderTranspiler/EsslBuiltinFunctionNames.h index afee2921..8f1aea53 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/EsslBuiltinFunctionNames.h +++ b/MobileGL/MG_Util/ShaderTranspiler/EsslBuiltinFunctionNames.h @@ -61,7 +61,7 @@ namespace MobileGL { "imageAtomicXor", "imageLoad", "imageSize", "imageStore", "imulExtended", "intBitsToFloat", "interpolateAtCentroid", "interpolateAtOffset", "interpolateAtSample", "inverse", "inversesqrt", "isinf", "isnan", - "ldexp", "length", "lessThan", "lessThanEqual", "log", "log2", + "ldexp", "length", "length_squared", "lessThan", "lessThanEqual", "log", "log2", "matrixCompMult", "max", "max3", "memoryBarrier", "memoryBarrierAtomicCounter", "memoryBarrierBuffer", "memoryBarrierImage", "memoryBarrierShared", "mid3", "min", "min3", "mix", "mod", "modf", diff --git a/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RenameSamplerFunctionParameterPass.cpp b/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RenameSamplerFunctionParameterPass.cpp index d36d6013..32967af7 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RenameSamplerFunctionParameterPass.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RenameSamplerFunctionParameterPass.cpp @@ -19,23 +19,27 @@ namespace MobileGL { namespace MG_Util { namespace ShaderTranspiler { namespace { - constexpr const char* kConflictingName = "sampler"; - constexpr const char* kCompatName = "MGL_COMPAT_sampler"; + const char* GetCompatName(StringView name) { + if (name == "sampler") return "MGL_COMPAT_sampler"; + if (name == "new") return "MGL_COMPAT_new"; + return nullptr; + } - Bool IsNamedSamplerFunctionParameter(spvtools::opt::IRContext* context, - spvtools::opt::Instruction& nameInst) { + const char* GetConflictingFunctionParameterCompatName(spvtools::opt::IRContext* context, + spvtools::opt::Instruction& nameInst) { if (nameInst.opcode() != spv::Op::OpName || nameInst.NumInOperands() < 2) { - return false; + return nullptr; } - if (nameInst.GetInOperand(1).AsString() != kConflictingName) { - return false; + const char* compatName = GetCompatName(nameInst.GetInOperand(1).AsString()); + if (compatName == nullptr) { + return nullptr; } auto* defUseMgr = context->get_def_use_mgr(); const Uint32 targetId = nameInst.GetSingleWordInOperand(0); const auto* target = defUseMgr->GetDef(targetId); - return target != nullptr && target->opcode() == spv::Op::OpFunctionParameter; + return target != nullptr && target->opcode() == spv::Op::OpFunctionParameter ? compatName : nullptr; } } // namespace @@ -44,12 +48,13 @@ namespace MobileGL { auto* irContext = context(); for (auto& debugInst : irContext->debugs2()) { - if (!IsNamedSamplerFunctionParameter(irContext, debugInst)) { + const char* compatName = GetConflictingFunctionParameterCompatName(irContext, debugInst); + if (compatName == nullptr) { continue; } debugInst.SetInOperand( - 1, spvtools::utils::MakeVector(kCompatName)); + 1, spvtools::utils::MakeVector(compatName)); modified = true; }