Hash :
1b680b77
Author :
Date :
2021-06-02T22:04:45
Reland "Make SH_CLAMP_INDIRECT_ARRAY_BOUNDS do proper AST transformation" This is a reland of a474fd7de769ae817db83490d410510cdbed75b2 The integer clamp used in this transformation is not available in es100 shaders, and float clamp is used instead. Original change's description: > Make SH_CLAMP_INDIRECT_ARRAY_BOUNDS do proper AST transformation > > This translator flag adds a clamp to non-literal indices to arrays. Two > strategies were provisioned, using the clamp intrinsic or a hand-written > function. The latter is ununsed in angle, chromium, firefox and > webkit, so this change removes this option and uses the clamp intrinsic > unconditionally. > > The clamp itself was added at output generation time with special flags > set on the index node. This is changed such that a proper AST > transformation is done and no-special handling would be necessary. > > Bug: angleproject:4361 > Bug: angleproject:4889 > Change-Id: Ieccfd2c1c347563fb5282e9fa66d39304e62f2ca > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2935041 > Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> > Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Bug: angleproject:4361 Bug: angleproject:4889 Change-Id: I9397ec7e6bdfb706c2a891b33fd3b2b79e883ccc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2940902 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
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
//
// Copyright 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,
ShHashFunction64 hashFunction,
NameMap &nameMap,
TSymbolTable *symbolTable,
sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput output,
ShCompileOptions compileOptions)
: TOutputVulkanGLSL(objSink,
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