From 07ddd52dcf90ca72af3d8fb1e21dfa204dfb4dde Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Thu, 4 Feb 2021 12:40:21 -0800 Subject: [PATCH] Add getVertexIndex API for vertex shaders (#3493) --- docs/Materials.md.html | 1 + libs/filamat/src/GLSLPostProcessor.cpp | 10 +++++++--- libs/filamat/src/GLSLPostProcessor.h | 1 + libs/filamat/src/MaterialBuilder.cpp | 2 ++ libs/filamat/src/sca/GLSLTools.cpp | 14 ++++++++++---- libs/filamat/src/sca/GLSLTools.h | 4 ++-- shaders/src/getters.vs | 9 +++++++++ 7 files changed, 32 insertions(+), 9 deletions(-) diff --git a/docs/Materials.md.html b/docs/Materials.md.html index 0148faed18..e5d6a33829 100644 --- a/docs/Materials.md.html +++ b/docs/Materials.md.html @@ -1920,6 +1920,7 @@ The following APIs are only available from the vertex block: **getCustom0()** to **getCustom7()** | float4 | Custom vertex attribute **getWorldFromModelMatrix()** | float4x4 | Matrix that converts from model (object) space to world space **getWorldFromModelNormalMatrix()** | float3x3 | Matrix that converts normals from model (object) space to world space +**getVertexIndex()** | int | Index of the current vertex ### Fragment only diff --git a/libs/filamat/src/GLSLPostProcessor.cpp b/libs/filamat/src/GLSLPostProcessor.cpp index 07ec121a2c..5b2f8f897b 100644 --- a/libs/filamat/src/GLSLPostProcessor.cpp +++ b/libs/filamat/src/GLSLPostProcessor.cpp @@ -158,8 +158,11 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co std::string* outputGlsl, SpirvBlob* outputSpirv, std::string* outputMsl) { // If TargetApi is Vulkan, then we need post-processing even if there's no optimization. + // If we're using framebuffer fetch, we also need to force our compilation target to Vulkan, as + // it is only supported in GLSL for Vulkan. using TargetApi = MaterialBuilder::TargetApi; - const TargetApi targetApi = outputSpirv ? TargetApi::VULKAN : TargetApi::OPENGL; + const TargetApi targetApi = (outputSpirv || config.hasFramebufferFetch) ? TargetApi::VULKAN : + TargetApi::OPENGL; if (targetApi == TargetApi::OPENGL && mOptimization == MaterialBuilder::Optimization::NONE) { *outputGlsl = inputShader; if (mPrintShaders) { @@ -190,7 +193,8 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co tShader.setStrings(&shaderCString, 1); internalConfig.langVersion = GLSLTools::glslangVersionFromShaderModel(config.shaderModel); - GLSLTools::prepareShaderParser(tShader, internalConfig.shLang, internalConfig.langVersion, mOptimization); + GLSLTools::prepareShaderParser(targetApi, tShader, internalConfig.shLang, + internalConfig.langVersion, mOptimization); EShMessages msg = GLSLTools::glslangFlagsFromTargetApi(targetApi); bool ok = tShader.parse(&DefaultTBuiltInResource, internalConfig.langVersion, false, msg); if (!ok) { @@ -277,7 +281,7 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, const char* shaderCString = glsl.c_str(); spirvShader.setStrings(&shaderCString, 1); - GLSLTools::prepareShaderParser(spirvShader, + GLSLTools::prepareShaderParser(targetApi, spirvShader, internalConfig.shLang, internalConfig.langVersion, mOptimization); ok = spirvShader.parse(&DefaultTBuiltInResource, internalConfig.langVersion, false, msg); program.addShader(&spirvShader); diff --git a/libs/filamat/src/GLSLPostProcessor.h b/libs/filamat/src/GLSLPostProcessor.h index 78bc529a3b..8096e8a098 100644 --- a/libs/filamat/src/GLSLPostProcessor.h +++ b/libs/filamat/src/GLSLPostProcessor.h @@ -50,6 +50,7 @@ public: struct Config { filament::backend::ShaderType shaderType; filament::backend::ShaderModel shaderModel; + bool hasFramebufferFetch; struct { std::vector> subpassInputToColorLocation; } glsl; diff --git a/libs/filamat/src/MaterialBuilder.cpp b/libs/filamat/src/MaterialBuilder.cpp index 18379bc74e..e636b25810 100644 --- a/libs/filamat/src/MaterialBuilder.cpp +++ b/libs/filamat/src/MaterialBuilder.cpp @@ -712,6 +712,8 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector