diff options
author | Antti Määttä <antti.maatta@qt.io> | 2020-01-08 15:11:53 +0200 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2020-01-13 11:32:08 +0200 |
commit | 7b5d524ab3e4cc6dd88987bd4afd2cee3054e9da (patch) | |
tree | cc518f4d4f8260da05564c273d1915826ca639f3 | |
parent | ad501c46845fbb2efa66ee327c63cf2e9a0c2d71 (diff) |
Add env variable to configure shader precision
Add QT3DS_PRECISION and QT3DS_SAMPLER_PRECISION to enable changing
the used precision in the shaders.
Task-number: QT3DS-1994
Change-Id: I5816fccf25a1bbebdb29f8d9db94832eea2fe97f
Reviewed-by: Janne Kangas <janne.kangas@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r-- | src/runtimerender/Qt3DSRenderShaderCache.cpp | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/src/runtimerender/Qt3DSRenderShaderCache.cpp b/src/runtimerender/Qt3DSRenderShaderCache.cpp index 4693cb6..e26405c 100644 --- a/src/runtimerender/Qt3DSRenderShaderCache.cpp +++ b/src/runtimerender/Qt3DSRenderShaderCache.cpp @@ -291,23 +291,51 @@ struct ShaderCache : public IShaderCache // add precision qualifier depending on backend if (IQt3DSRenderer::IsGlEs3Context(m_RenderContext.GetRenderContextType())) { - m_InsertStr.append("precision highp float;\n" - "precision highp int;\n"); - if( m_RenderContext.GetRenderBackendCap(render::NVRenderBackend::NVRenderBackendCaps::gpuShader5) ) { - m_InsertStr.append("precision mediump sampler2D;\n" - "precision mediump sampler2DArray;\n" - "precision mediump sampler2DShadow;\n"); + QString precision = qEnvironmentVariable("QT3DS_PRECISION"); + QString samplerPrecision = qEnvironmentVariable("QT3DS_SAMPLER_PRECISION"); + + if ((!precision.isEmpty() && precision != QStringLiteral("mediump") + && precision != QStringLiteral("lowp") + && precision != QStringLiteral("highp")) || precision.isEmpty()) { + precision = "highp"; + } + if ((!samplerPrecision.isEmpty() + && samplerPrecision != QStringLiteral("mediump") + && samplerPrecision != QStringLiteral("lowp") + && samplerPrecision != QStringLiteral("highp")) + || samplerPrecision.isEmpty()) { + samplerPrecision = "mediump"; + } + + QString precisionQualifiers("precision %1 float;\n" + "precision %1 int;\n"); + m_InsertStr.append(precisionQualifiers.arg(precision)); + if (m_RenderContext.GetRenderBackendCap( + NVRenderBackend::NVRenderBackendCaps::gpuShader5)) { + QString samplerQualifiers("precision %1 sampler2D;\n" + "precision %1 sampler2DArray;\n" + "precision %1 sampler2DShadow;\n"); + m_InsertStr.append(samplerQualifiers.arg(samplerPrecision)); if (m_RenderContext.IsShaderImageLoadStoreSupported()) { - m_InsertStr.append("precision mediump image2D;\n"); + QString imageQualifiers("precision %1 image2D;\n"); + m_InsertStr.append(imageQualifiers.arg(samplerPrecision)); } } AddBackwardCompatibilityDefines(shaderType); } else { // GLES2 - m_InsertStr.append("precision mediump float;\n" - "precision mediump int;\n" - "#define texture texture2D\n"); + QString precision = qEnvironmentVariable("QT3DS_PRECISION"); + if ((!precision.isEmpty() && precision != QStringLiteral("mediump") + && precision != QStringLiteral("lowp") + && precision != QStringLiteral("highp")) || precision.isEmpty()) { + precision = "mediump"; + } + QString precisionQualifiers("precision %1 float;\n" + "precision %1 int;\n"); + m_InsertStr.append(precisionQualifiers.arg(precision)); + m_InsertStr.append("#define texture texture2D\n"); + if (m_RenderContext.IsTextureLodSupported()) m_InsertStr.append("#define textureLod texture2DLodEXT\n"); else |