Hash :
1a5c7a16
Author :
Date :
2020-02-25T12:02:31
Reland "Vulkan:Include precision qualifier in GLSL" Currently still ignoring precision qualifiers for Vulkan shaders by default, but have added feature "enablePrecisionQualifiers" that can be enabled in order to include precision qualifiers. With this initial implementation, it's possible to get precision qualifier mis-matches in the generated GLSL 4.50. According to the spec this is allowed. From GLSLangSpec 4.50 section 4.7 "Precision and Precision Qualifiers": For the purposes of determining if an output from one shader stage matches an input of the next stage, the precision qualifier need not match. However, when converted to SPIR-V and run through the shader validation any mismatches will cause shader validation errors. Initially just ignoring those errors with this commit. Bug: angleproject:3078 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2057749 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tobin Ehlis <tobine@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Tobin Ehlis <tobine@google.com> Change-Id: Ieecca604bb2c834c9b1c2bcab85279d1f8755dfa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2086280
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
//
// Copyright (c) 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// TOutputVulkanGLSLForMetal:
// This is a special version Vulkan GLSL output that will make some special
// considerations for Metal backend limitations.
//
#include "compiler/translator/OutputVulkanGLSLForMetal.h"
#include "common/apple_platform_utils.h"
#include "compiler/translator/BaseTypes.h"
#include "compiler/translator/Symbol.h"
#include "compiler/translator/util.h"
namespace sh
{
namespace
{
bool gOverrideRemoveInvariant = false;
bool ShoudRemoveInvariant(const TType &type)
{
if (gOverrideRemoveInvariant)
{
return true;
}
if (type.getQualifier() != EvqPosition)
{
// Metal only supports invariant for gl_Position
return true;
}
if (ANGLE_APPLE_AVAILABLE_XCI(10.14, 13.0, 12))
{
return false;
}
else
{
// Metal 2.1 is not available, so we need to remove "invariant" keyword
return true;
}
}
}
// static
void TOutputVulkanGLSLForMetal::RemoveInvariantForTest(bool remove)
{
gOverrideRemoveInvariant = remove;
}
TOutputVulkanGLSLForMetal::TOutputVulkanGLSLForMetal(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
ShCompileOptions compileOptions)
: TOutputVulkanGLSL(objSink,
clampingStrategy,
hashFunction,
nameMap,
symbolTable,
shaderType,
shaderVersion,
output,
false,
true,
compileOptions)
{}
void TOutputVulkanGLSLForMetal::writeVariableType(const TType &type,
const TSymbol *symbol,
bool isFunctionArgument)
{
TType overrideType(type);
// Remove invariant keyword if required.
if (type.isInvariant() && ShoudRemoveInvariant(type))
{
overrideType.setInvariant(false);
}
TOutputVulkanGLSL::writeVariableType(overrideType, symbol, isFunctionArgument);
}
bool TOutputVulkanGLSLForMetal::visitGlobalQualifierDeclaration(
Visit visit,
TIntermGlobalQualifierDeclaration *node)
{
TInfoSinkBase &out = objSink();
ASSERT(visit == PreVisit);
const TIntermSymbol *symbol = node->getSymbol();
// No support for the |precise| keyword from EXT_gpu_shader5 (or ES3.2).
ASSERT(node->isInvariant());
if (!ShoudRemoveInvariant(symbol->getType()))
{
out << "invariant ";
}
out << hashName(&symbol->variable());
return false;
}
} // namespace sh