|
bf4e1b73
|
2016-12-09T11:30:15
|
|
Split TIntermInvariantDeclaration from TIntermAggregate
This change is pure refactoring and doesn't fix bugs related to
invariant declarations. Invariant declarations are supposed to accept
a list of identifiers, but this refactoring keeps the current behavior
of only accepting a single identifier in an invariant declaration.
When the bug will be fixed, the new TIntermInvariantDeclaration class
that now has only a single child node can be changed so that it may
have multiple children.
TIntermAggregate is still used for function calls, function
prototypes and function parameter lists.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I3e22092c87e1c06445fd7e123d9922c2fcb59428
Reviewed-on: https://chromium-review.googlesource.com/419415
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
da9fb093
|
2016-12-09T17:32:29
|
|
Work around atan(y, x) bug on NVIDIA
atan(y, x) is not always returning expected results on NVIDIA OpenGL
drivers between versions 367 and 375. Work around this by emulating
atan(y, x) using the regular atan(x) function. A fix to the driver is
expected in a future release.
It is most convenient to implement the vector atan(y, x) functions by
using the scalar atan(y, x) function. Support for simple dependencies
between emulated functions is added to BuiltInFunctionEmulator. In the
current implementation one function is allowed to have at most one
other function as its dependency.
BUG=chromium:672380
TEST=angle_end2end_tests
Change-Id: I9eba8b0b7979c7c7eaed353b264932e41830beb1
Reviewed-on: https://chromium-review.googlesource.com/419016
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
b8b0122f
|
2016-11-20T23:25:53
|
|
Add compiler support for shared memory
The patch adds handling of the 'shared' qualifier in the shader
compiler.
BUG=angleproject:1442
TEST=angle_unittests
Change-Id: Iaa288026af0faf2a30e40495faa6ea1f5ff02323
Reviewed-on: https://chromium-review.googlesource.com/413200
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
f832c9dd
|
2016-12-12T17:38:48
|
|
Fix style in the preprocessor.
Again using git cl format.
BUG=angleproject:650
Change-Id: I8898d00bfc6a50db50bffd2cc30c3eda7c08c6c2
Reviewed-on: https://chromium-review.googlesource.com/419097
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
d7b1ab58
|
2016-12-12T14:42:19
|
|
Fix up translator style.
Using git cl format.
BUG=angleproject:650
Change-Id: I7d3f98d2b0dcfb0a8de6c35327db74e55c28d761
Reviewed-on: https://chromium-review.googlesource.com/419059
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
36fd100d
|
2016-12-08T11:30:44
|
|
GLSLTest: test interaction of declaration splitting with other passes
In TranslatorHLSL a number of AST simplifications are done, that must
happen in a precise order for things to be correct:
- First for-loops must be split
- Then multideclarations must be split
- Finally comma operators must be split
This adds tests for interaction between this passes to make sure they
are done in the right order.
BUG=668028
Change-Id: I306915b51011bb5467d117352becfd60cbe77be4
Reviewed-on: https://chromium-review.googlesource.com/417989
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
|
|
f52fe93d
|
2016-12-07T13:39:15
|
|
Work around unary minus operator float issue on Intel Mac 10.11
Result of -float is wrong on Intel Mac 10.11 drivers. Replace -float
with 0.0 - float to work around this issue.
BUG=308366
BUG=672380
Change-Id: I53bc2eda7259fff5805bec39896fc7b7a6eaf665
Reviewed-on: https://chromium-review.googlesource.com/417169
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
aecfa8e6
|
2016-12-09T12:47:26
|
|
Constant fold compute shader local work group size
gl_WorkGroupSize should be written into the AST as a constant node
instead of a symbol node. In correct shaders, local size is guaranteed
to have been declared before any references to gl_WorkGroupSize -
otherwise the shader translator was already generating an error.
This ensures that work group size can be used to size arrays as
specified and also works around a crash issue on NVIDIA Linux OpenGL
driver.
BUG=angleproject:1442
TEST=angle_unittests
Change-Id: I9b1a4bff16ecf2c3db1511c3702756346cdd2f6b
Reviewed-on: https://chromium-review.googlesource.com/418735
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
8c04d077
|
2016-12-09T15:30:48
|
|
Make minimum GLSL version for compute shaders GLSL 430
Compute shaders were added to the core OpenGL spec in version 4.3.
Also don't output GL_ARB_explicit_attrib_location extension directive
for compute shaders. This extension is only relevant for vertex and
fragment shaders.
BUG=angleproject:1442
TEST=angle_end2end_tests
Change-Id: I92021ac048b38ffbc5a61af408b37c387193389b
Reviewed-on: https://chromium-review.googlesource.com/418657
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
56a2f95f
|
2016-12-08T12:16:27
|
|
Output infinity and NaN literals correctly in shaders
Previously infinity and NaN resulting from constant folding would be
clamped to finite 32-bit float range when they were written in shader
output. Now they are written as a bit pattern in case the shader
version allows it.
This does not guarantee that NaNs work, but this is fine, since ESSL
3.00.6 spec has very loose requirements when it comes to NaNs.
BUG=angleproject:1654
TEST=angle_end2end_tests
Change-Id: I9997000beeaa8ed22523c22d5cf6929cdfc93f60
Reviewed-on: https://chromium-review.googlesource.com/417301
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
1212bcac
|
2016-11-23T13:44:05
|
|
translator: separate declarations after rewriting loops
Otherwise when trying to add the declarations back, things might fail
because the loop initialization is a sequence and not a block.
BUG=668028
Change-Id: I8d84a25c25765e9655c16ce56604ae08f0f8176c
Reviewed-on: https://chromium-review.googlesource.com/414305
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
|
|
2d73665d
|
2016-11-30T10:37:49
|
|
Handle constant folding arithmetic involving infinity
Constant folding arithmetic operations that involve infinity are now
handled correctly in the cases where the result is infinity or zero.
The implementation mostly relies on C++ to implement IEEE float
arithmetic correctly so that unnecessary overhead is avoided.
Constant folding arithmetic operations that result in overflow now
issue a warning but result in infinity. This is not mandated by the
spec but is a reasonable choice since it is the behavior of the
default IEEE rounding mode.
Constant folding arithmetic operations that result in NaN in IEEE will
generate a warning but the NaN is kept. This is also not mandated by
the spec, but is among the allowed behaviors.
There's no special handling for ESSL 1.00. ESSL 1.00 doesn't really
have the concept of NaN, but since it is not feasible to control
generating NaNs at shader run time either way, it should not be a big
issue if constant folding may generate them as well.
TEST=angle_unittests
BUG=chromium:661857
Change-Id: I06116c6fdd02f224939d4a651e4e62f2fd4c98a8
Reviewed-on: https://chromium-review.googlesource.com/414911
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
729a9c97
|
2016-12-05T14:22:47
|
|
Don't require GL_ARB_gpu_shader5 in order to support ES 3.0.
ES 3.0 doesn't require non-constant sampler array indexing, and we
can't require it for ES 2 without breaking WebGL for some users.
BUG=671280
Change-Id: Ib04446284acc92410a90c683a3d222871de554a8
Reviewed-on: https://chromium-review.googlesource.com/416195
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
|
|
fb02830d
|
2016-11-28T18:21:57
|
|
The return type of imageSize(gimageCube) is int2, not int3
BUG=angleproject:1442
Change-Id: I18bee163e7c7ce159cd23d6136486c49b7d9ec94
Reviewed-on: https://chromium-review.googlesource.com/414950
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
f1cf5e63
|
2016-11-22T17:36:49
|
|
Prevent stack overflow in macro expansion
Add a configurable limit for how many nested MacroExpander objects can
be created in the preprocessor, so that stack overflow can be
prevented in case of malicious shaders. By default the limit is set to
1000. In unit tests the limit is set lower to make the test run
faster.
Includes refactoring of most of the preprocessor tests so that they
use utility functions provided by the test class instead of repeating
the same code for initializing the preprocessor.
BUG=angleproject:1600
TEST=angle_unittests
Change-Id: I23b5140d9f2dc52df96111650db63150f7238494
Reviewed-on: https://chromium-review.googlesource.com/413986
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
28cb0368
|
2016-11-22T15:42:37
|
|
Check for misconfiguration of shader built-ins
Fail compiler initialization if the built-in resources are invalid.
This avoids creating zero-sized arrays out of built-ins into the
symbol table, which could later lead to asserts when these built-ins
were indexed by constants.
BUG=chromium:667468
TEST=angle_unittests
Change-Id: I9553c7c91ea355abb35b9cc6088ee14b40b0922b
Reviewed-on: https://chromium-review.googlesource.com/413037
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
29ab9ff8
|
2015-08-06T16:58:30
|
|
translator: fix a typo in comment
Change-Id: Ibfd39bc478c4e9ddf40138ccf6bd37f247f83632
Reviewed-on: https://chromium-review.googlesource.com/413036
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
78b0c91d
|
2016-11-21T14:23:06
|
|
Fix infinite recursion in macro expansion
BUG=angleproject:1600
TEST=angle_unittests
Change-Id: I72bf81ec060f36255a0f13b132a4fd69b89672ff
Reviewed-on: https://chromium-review.googlesource.com/412744
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
1b896c62
|
2016-11-16T13:10:44
|
|
translator: remove code related to for-loop unrolling
For loop unrolling is not used and causes the translator fuzzer to find
a hang when unrolling tons of nested loops (duh).
Also remove MMap.h which was unused.
This is essentially a revert of https://codereview.appspot.com/4331048
BUG=chromium:665255
Change-Id: Id6940f7e306d4ed53bc992f751e9ffe733190f17
Reviewed-on: https://chromium-review.googlesource.com/412023
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
99bd5f40
|
2016-11-07T12:44:29
|
|
Fix GLSL float parsing corner cases
This fixes parsing floats that are out-of-range, and floats that have
more digits than the standard library float parsing functions can
handle. In these cases, we now fall back to a custom implementation of
float parsing. The custom parsing path can correctly process floats
with up to hundreds of millions of digits in their mantissa part.
Rounding behavior of the custom float parser may not be entirely
consistent with the standard parser, but the error should be at most
a few ULP. This can be considered acceptable since floating point
operations are not expected to be exact in GLSL in general. Settling
for lower accuracy also enables the parser to run in constant memory,
instead of having to store all the significant digits of the decimal
mantissa being parsed.
BUG=angleproject:1613
TEST=angle_unittests
Change-Id: I04a5d9ae5aaca48ef14b79cca5b997078614eb1c
Reviewed-on: https://chromium-review.googlesource.com/412082
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
41f9f673
|
2016-11-16T17:04:36
|
|
Remove invariant qualifier for ESSL 3.0 on AMD driver
AMD driver in Linux requires invariant qualifier to match between
shaders even for GLSL >= 4.2. This conflicts with ESSL 3.0 which
disallows invariant qualifier in fragment shader. Remove invariant
qualifier in vertex shader to workaround AMD driver bug.
BUG=chromium:639760
TEST=webgl2_conformance
Change-Id: Id5adf7e7032105486df90a1f200471ea81ee5c36
Reviewed-on: https://chromium-review.googlesource.com/411917
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
|
|
ea586549
|
2016-11-10T17:33:43
|
|
Cleanup after translator component removal
- Unite translator with translator_lib
- Remove flags and defines for shared library exports
BUG=angleproject:1596
Change-Id: Icd145a4b79e2472766a2b56017bb0f36f244482e
Reviewed-on: https://chromium-review.googlesource.com/410261
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
|
|
049edfa2
|
2016-11-11T14:35:37
|
|
Add volatile, coherent and restrict memory qualifiers
The patch adds support for the three remaining memory qualifiers:
volatile, coherent and restrict.
BUG=angleproject:1442
TEST=angle_unittests
TEST=angle_end2end_tests
Change-Id: Ie662d304af2399468df1d976e04c38dada1e2cec
Reviewed-on: https://chromium-review.googlesource.com/385876
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
d7490967
|
2016-11-09T15:49:51
|
|
Fix linkage.html failures on Mac.
The failure is due to when we initialize variables to 0, we re-create
the struct TType, and it contains a different unique id from the
original struct TType, thus leading to a different hashed name.
BUG=chromium:641129
TEST=webgl_conformance,webgl2_conformance
Change-Id: I267b97fa496f55ea59dacee93af8f6a90f3e66cb
Reviewed-on: https://chromium-review.googlesource.com/409602
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
89dd8f37
|
2016-11-09T12:59:30
|
|
Remove invariant declaration in vertex shader for translation from ESSL 3.00 to GLSL <= 4.1
This is a follow-up patch of
https://chromium-review.googlesource.com/408569. This CL removes
invariant declaration in ESSL 3.00 vertex shader, such like:
"
out vec4 foo;
invariant foo;
"
This CL also adds the workarounds in libANGLE.
BUG=chromium:639760
TEST=webgl2_conformance
Change-Id: I568ab51a9a2f5da10d1aff0b63aae8805097e081
Reviewed-on: https://chromium-review.googlesource.com/409157
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
b7bf7426
|
2016-11-08T14:44:05
|
|
Don't ouput "invarant" and "centroid" in GLSL 4.1 or older.
BUG=chromium:639760,chromium:641129
TEST=webgl2_conformance
Change-Id: I5fe87246eaea78888529d7b45b79399e6065daa9
Reviewed-on: https://chromium-review.googlesource.com/408569
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
|
|
55644211
|
2016-11-08T11:07:34
|
|
Fix constant folding right shift corner cases
Right-shifting the minimum signed integer needs to be handled as a
special case, since it can't go through the usual path that clears the
sign bit.
Code for right-shifting by zero also had a typo that resulted in
setting the wrong value to the result.
BUG=chromium:662706
TEST=angle_unittests
Change-Id: Ief24d738064906a72212242e0917ce30e45d6b25
Reviewed-on: https://chromium-review.googlesource.com/408158
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
71d4c026
|
2016-11-02T19:51:08
|
|
SimplifyLoopConditions: handle empty for expressions
BUG=661558
Change-Id: I7a4af71fafacc31aeae0c52d79641ea5e61d6b24
Reviewed-on: https://chromium-review.googlesource.com/406545
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
80bfe0f4
|
2016-11-07T13:50:31
|
|
translator: Fix style in CodeGen.cpp.
BUG=None
Change-Id: I321ec7af6779c6524b83959da21520a4fb09d8e2
Reviewed-on: https://chromium-review.googlesource.com/408317
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
45bcc784
|
2016-11-07T13:58:48
|
|
translator: Scope all classes with "sh".
I was seeing an odd problem with our PoolAlloc conflicting with the
glslang/Vulkan TIntermNode, so the fix was to move everything to a
separate namespace.
The bison grammars are also regenerated. No functional changes.
BUG=angleproject:1576
Change-Id: I959c7afe4c092f0d458432c07b4dcee4d39513f3
Reviewed-on: https://chromium-review.googlesource.com/408267
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
8bbbb820
|
2016-11-07T13:50:29
|
|
translator: Remove deprecated HLSL output flags.
These flags were adding redundant configs to the fuzzer.
BUG=angleproject:1522
Change-Id: I49ad56f0d7aceaae326d2d4387c4c750866465f3
Reviewed-on: https://chromium-review.googlesource.com/408338
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
acb4b81a
|
2016-11-07T13:50:29
|
|
translator: Put ShaderLang APIs in "sh" namespace.
Working with glslang in Vulkan means we are static linking libANGLE
with functions that have the same name as our translator APIs. We
can fix this by scoping our APIs. We don't need to scope the types
of the file, since they don't conflict.
This will require a follow-up patch to remove the unscoped APIs
once we switch over Chromium.
We also scope TCompiler and some related classes to avoid multiply
defined link errors with glslang.
BUG=angleproject:1576
Change-Id: I729b19467d2ff7d374a82044b16dbebdf2dc8f16
Reviewed-on: https://chromium-review.googlesource.com/408337
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
bbe9fb5e
|
2016-11-03T17:16:05
|
|
Check that implicitly sized array constructors have arguments
Array size must be greater than zero according to the ESSL 3.00.6
spec.
BUG=angleproject:1602
TEST=angle_unittests
Change-Id: I1fa54b143bc821583822cbc5139464cdd058b6c1
Reviewed-on: https://chromium-review.googlesource.com/407257
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
d1d1dff6
|
2016-11-03T14:56:14
|
|
Fix undefined modulus in ExpressionParser
In constant folding of integer expressions this case is already being
handled.
BUG=angleproject:1599
Change-Id: Ifb3ea0279467f216e1c93909647b79fca24fcaf2
Reviewed-on: https://chromium-review.googlesource.com/406868
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
e7dc9d71
|
2016-11-03T16:58:47
|
|
Fix handling bvec on the right hand side of a logical op
The vector/matrix size matching is not done for logical ops similarly
to other binary ops. For that reason both left and right hand side
need to be checked for being scalar.
BUG=angleproject:1601
TEST=angle_unittests
Change-Id: Ie87da68d6cb0d439f0e6273d374fc7d836c82309
Reviewed-on: https://chromium-review.googlesource.com/406988
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
02bd82cd
|
2016-11-03T10:29:43
|
|
Fix handling unsized arrays with incorrect initializer
In case the initializer of an unsized array is not an array, the array
size still needs to be set to some value > 0 in order to not hit
asserts in the code that parses accessing the array. An error was
already being generated in the case an unsized array has a non-array
initializer, but the variable will still have an array type in the
symbol table.
BUG=chromium:661592
TEST=angle_unittests
Change-Id: I4a11527eab0404ba9e59ebb7227faef13dbea62c
Reviewed-on: https://chromium-review.googlesource.com/407256
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
b990b55e
|
2016-10-27T12:29:17
|
|
Clean up temporary variable usage in ScalarizeVecAndMatConstructorArgs
Use common helper functions instead of manually creating temporary
variable nodes. Also clean up the interface provided by the traverser.
BUG=angleproject:1597
Test=WebGL conformance tests
Change-Id: Ifd8d3815ff9e75e1a2040d65db9d4b3d6a9a9273
Reviewed-on: https://chromium-review.googlesource.com/403950
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
0982a2bf
|
2016-11-01T15:13:46
|
|
Prefix internal names in GLSL output
Prefixing internal names will avoid clashes with user-defined names.
We use prefix webgl_angle_ so that the internal names are both
reserved in WebGL on one hand and clearly separated from hashed names
starting with just webgl_ on the other hand.
BUG=angleproject:1597
TEST=WebGL conformance tests
Change-Id: I7deef9c1a38105c8b57eda13c84eec13e515a91a
Reviewed-on: https://chromium-review.googlesource.com/406247
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
cfe7b2c4
|
2016-11-01T13:18:10
|
|
Add finite check to lexer float constants.
The fuzzer was generating cases where floating point constants would
someone return as valid when they were beyond max float. I was unable
to reproduce this in a standalone test, but confirmed this check
fixes the fuzzer error.
BUG=660702
Change-Id: I9e6b883958013638ea509e38b30e812a9e74fbc1
Reviewed-on: https://chromium-review.googlesource.com/406268
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
60e6edfa
|
2016-10-31T12:17:19
|
|
Make ASSERT reference the conditional expression.
This should prevent further unexpected bot breakage due to
unreferenced variables in the ASSERT expression.
Also remove the no longer needed variable referencing macro.
BUG=angleproject:1586
Change-Id: I127695165bdfe39c51fe8d17e00daf6bf2fa8252
Reviewed-on: https://chromium-review.googlesource.com/404948
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
1df16022
|
2016-10-27T08:16:56
|
|
TranslatorGLSL: collect variables when flattening pramga invariant all
BUG=chromium:659472
Change-Id: Icfeada9f09fff5d28eb3f4fafb2c94d57598af1f
Reviewed-on: https://chromium-review.googlesource.com/403849
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
705a9194
|
2016-08-29T10:05:27
|
|
Reland "Remove invariant qualifier for input in fragment shader"
This relands https://chromium-review.googlesource.com/#/c/400005/.
ESSL and GLSL are not consistent on invariant matching in vertex shader
and fragment shader. See the following rules:
ESSL 1.00 - input and output must match
ESSL 3.00 - only output, inputs cannot be declared as invariant.
GLSL 1.10.59 - does not exist
GLSL 1.20.8 - input and output must match
GLSL 1.30.10 - input and output must match
GLSL 1.40.8 - input and output must match
GLSL 1.50.11 - input and output must match
GLSL 3.30.6 - input and output must match
GLSL 4.00.9 - input and output must match
GLSL 4.10.6 - input and output must match
GLSL 4.20.11 - input can omit invariant
GLSL 4.30.8 - input can omit invariant
GLSL 4.40.9 - input can omit invariant
GLSL 4.50.5 - input can omit invariant
Since GLSL 4.20, invariant qualifier description were changed to:
"
Only variables output from a shader (including those that are then input
to a subsequent shader) can be candidates for invariance. This includes
user-defined output variables and the built-in output variables. As only
outputs need be declared with invariant, an output from one shader stage
will still match an input of a subsequent stage without the input being
declared as invariant.
"
It's not very clear if input in fragment can be declared as invariant.
Mesa driver disallows use of input declared as invariant in fragment
shader, while other drivers may allow it. This CL removes invariant
declaration for input in fragment shader except AMD driver in Linux.
AMD's driver obviously contradicts the spec by forcing invariance to
match between vertex and fragment shaders.
BUG=chromium:639760, chromium:659326
TEST=conformance/glsl/misc/shaders-with-invariance.html and
conformance/glsl/bugs/invariant-does-not-leak-across-shaders.html
Change-Id: I0aa9be14f0cee7a11a249c91fba27c570c52ca1b
Reviewed-on: https://chromium-review.googlesource.com/404228
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
|
|
0e3aee3f
|
2016-10-27T12:56:38
|
|
Check precision qualification for all declarations
Precision qualification is now checked properly also for declarations
that don't have qualifiers.
BUG=angleproject:1574
TEST=angle_unittests
Change-Id: I3d186df0763e071614c1da9a355a6f6fefdc8091
Reviewed-on: https://chromium-review.googlesource.com/403949
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
13389b66
|
2016-10-16T11:48:18
|
|
Split TIntermDeclaration from TIntermAggregate
The new class TIntermDeclaration is now used for struct, interface
block and variable declarations. TIntermDeclaration nodes do not have
a type - rather the type is stored in each child node. The types may
differ in case the declaration is a series of array declarators with
mismatching sizes.
TIntermAggregate is still used for function calls, function
prototypes, function parameter lists and invariant declarations.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I0457188f354481470855f61ac1c878fc2579b1d1
Reviewed-on: https://chromium-review.googlesource.com/400023
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
449a8030
|
2016-10-26T08:05:54
|
|
MacroExpander: bump expansionCount before peeking for "("
BUG=658555
Change-Id: I578b8aff37a116fd7b2b387388311a27bb8a2809
Reviewed-on: https://chromium-review.googlesource.com/403848
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
c5fa0ad5
|
2016-10-25T21:36:54
|
|
Revert "Remove invariant qualifier for input in fragment shader"
This reverts commit d842a6b2014447db0676c8a3f5a5e9ae4ce67d9a.
Because of WebglConformance_conformance_glsl_bugs_invariant_does_not_leak_across_shaders failure
BUG=chromium:659326
Change-Id: I0602e24f3d34ccf852cda865f673c5c7634f82a6
Reviewed-on: https://chromium-review.googlesource.com/403230
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
|
|
de318b26
|
2016-10-25T16:18:25
|
|
Disallow samplers as ternary operands
Quoting the ESSL 1.00 spec section 4.1.7: "Except for parameters to
texture lookup functions, array indexing, structure field selection,
and parentheses, samplers are not allowed to be operands in
expressions."
ESSL 3.00 has a similar passage related to opaque types.
Validate this correctly. Compatibility risk should be low, since
attempting to use samplers in ternary operators was already failing
before this in most cases.
BUG=angleproject:1551
TEST=angle_unittests
Change-Id: I6cbb536f473ba9674d558b14a458f3799f9c7c9c
Reviewed-on: https://chromium-review.googlesource.com/402694
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
d842a6b2
|
2016-08-29T10:05:27
|
|
Remove invariant qualifier for input in fragment shader
ESSL and GLSL are not consistent on invariant matching in vertex shader
and fragment shader. See the following rules:
ESSL 1.00 - input and output must match
ESSL 3.00 - only output, inputs cannot be declared as invariant.
GLSL 1.10.59 - does not exist
GLSL 1.20.8 - input and output must match
GLSL 1.30.10 - input and output must match
GLSL 1.40.8 - input and output must match
GLSL 1.50.11 - input and output must match
GLSL 3.30.6 - input and output must match
GLSL 4.00.9 - input and output must match
GLSL 4.10.6 - input and output must match
GLSL 4.20.11 - input can omit invariant
GLSL 4.30.8 - input can omit invariant
GLSL 4.40.9 - input can omit invariant
GLSL 4.50.5 - input can omit invariant
Since GLSL 4.20, invariant qualifier description were changed to:
"
Only variables output from a shader (including those that are then input
to a subsequent shader) can be candidates for invariance. This includes
user-defined output variables and the built-in output variables. As only
outputs need be declared with invariant, an output from one shader stage
will still match an input of a subsequent stage without the input being
declared as invariant.
"
It's not very clear if input in fragment can be declared as invariant.
Mesa driver disallows use of input declared as invariant in fragment
shader, while other drivers may allow it.
In ESSL 3.00, inputs cannot be declared as invariant. ANGLE should
follow this rule for GLSL >= 4.20.
BUG=chromium:639760
Change-Id: I7f7a07401381ac970488b69752f6d50d4f19d31f
Reviewed-on: https://chromium-review.googlesource.com/400005
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
2cc85b3b
|
2016-08-05T16:22:53
|
|
Add support for images in the compiler
The patch adds support for GLSL ES 3.1 image types.
Internal format layout qualifiers for images are added.
Support for the readonly and writeonly qualifiers are added. The other
memory qualifiers are omitted as to make the patch simpler.
Tests are added which check for correct and incorrect usage of images,
internal format layout and memory qualifiers.
BUG=angleproject:1442
TEST=angle_unittests
TEST=angle_end2end_tests
Change-Id: Ie4d3acb2a195de11b405ad54110a04c4c1de0b7e
Reviewed-on: https://chromium-review.googlesource.com/378855
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
f0173153
|
2016-10-17T09:05:03
|
|
Forbid shared and packed layouts in WebGL
WebGL 2.0 spec section 5.25 specifies this.
BUG=angleproject:1542
TEST=WebGL 2 conformance tests
Change-Id: Ic5758bc0e767a8e6dd032e42c0a69bcae06381c4
Reviewed-on: https://chromium-review.googlesource.com/399682
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
250ae902
|
2016-10-20T16:32:03
|
|
Remove unused function getInterpolationString
BUG=
Change-Id: I4135f4ae939043efa8ccab65ef1a5eb441370828
Reviewed-on: https://chromium-review.googlesource.com/401673
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
635671dc
|
2016-10-20T07:57:36
|
|
Fix pruning empty declarations from loop headers
Empty declarations are possible in loop init expressions. Make
PruneEmptyDeclarations take this into account.
BUG=angleproject:1550
TEST=angle_unittests
Change-Id: If407babf9b6f7a26dfcf73ff345493d3e2af3f9a
Reviewed-on: https://chromium-review.googlesource.com/401147
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
|
|
14ac0d77
|
2016-10-20T16:17:46
|
|
Remove break after a return in switch block
BUG=
Change-Id: I5f36d5c51aa3eb6d498ff21733e67de418c26386
Reviewed-on: https://chromium-review.googlesource.com/401164
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
|
|
9e77ce35
|
2016-09-27T17:05:44
|
|
Prevent fallback on default branch for case EbtSamplerCubeShadow
BUG=angleproject:1549
Change-Id: I8f003257b6f39282cb52ccdbacb73860ab37c919
Reviewed-on: https://chromium-review.googlesource.com/390271
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
b2792db1
|
2016-10-07T11:21:09
|
|
translator: Reject invalid combination of compile flags
ADD_AND_TRUE_TO_LOOP_CONDITION breaks loop unrolling because LoopInfo
expects the loop condition to have been validated to be "symbol < constant"
and stayed that way.
BUG=chromium:653454
BUG=chromium:653694
Change-Id: I2057fde3a308623bd2dd7571ee878dd42b1fdac3
Reviewed-on: https://chromium-review.googlesource.com/395306
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
4db7ded5
|
2016-10-13T12:23:11
|
|
Change comma nodes to TIntermBinary
Comma nodes always have just two parameters. If there's an expression
with several commas in the middle, it's parsed as a tree of comma
operations. It makes more sense to represent it as a binary node
rather than an aggregate node.
After this patch, TIntermAggregate is still used for function
prototypes, function parameter lists, function calls, and variable and
invariant declarations.
BUG=angleproject:1490
TEST=angle_unittests, angle_end2end_tests
Change-Id: I66be10624bf27bcf25987b4d93958d4a07600771
Reviewed-on: https://chromium-review.googlesource.com/397320
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
13e4d21b
|
2016-10-13T11:50:27
|
|
Add switch and case node support to intermediate output
After this all node types are printed correctly in intermediate
output.
BUG=angleproject:1544
TEST=shader_translator -i
Change-Id: I5c120b0ff69f66b00db88e8423a1c698d339af22
Reviewed-on: https://chromium-review.googlesource.com/397319
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
336b1470
|
2016-10-05T16:37:55
|
|
Split TIntermFunctionDefinition from TIntermAggregate
This makes the code easier to understand. Function definition nodes
always have just two children, the parameters node and the function
body node, so there was no proper reason why they should be aggregate
nodes.
As a part of this change, intermediate output is modified to print
symbol table ids of functions so that debugging function id related
functionality will be easier in the future.
After this patch, TIntermAggregate is still used for function
prototypes, function parameter lists, function calls, variable and
invariant declarations and the comma (sequence) operator.
BUG=angleproject:1490
TEST=angle_unittests, angle_end2end_tests
Change-Id: Ib88b4ca5d21abd5f126836ca5900d0baecabd19e
Reviewed-on: https://chromium-review.googlesource.com/394707
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
7835b525
|
2016-10-08T11:20:17
|
|
Reland "Add workaround for unused std140 and shared uniform blocks on MacOS"
On some Mac drivers with shader version 4.1, they will
treat unused std140 and shared uniform blocks' members as inactive. However,
WebGL2.0 based on OpenGL ES3.0.4 requires all members of a named uniform block
declared with a shared or std140 layout qualifier to be considered active.
The uniform block itself is also considered active.
This workaround is to reference all members of unused std140 and shared uniform blocks
at the beginning of the vertex/fragment shader's main().
BUG=chromium:618464
TEST=UniformBufferTest.ActiveUniformBlockNumber
Change-Id: I18da4e2b61b0170068bf5ea38ce54667b0737780
Reviewed-on: https://chromium-review.googlesource.com/395648
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
bd674557
|
2016-10-06T13:28:42
|
|
Separate function info from TIntermAggregate
This change will make it easier to split types of TIntermAggregate
nodes representing functions and function calls into different node
classes.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I730aa7858fe31fda86218fc685980c6ad486f5e0
Reviewed-on: https://chromium-review.googlesource.com/394706
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
476197f9
|
2016-10-11T13:59:08
|
|
Clean up TSymbol initialization
Now TSymbol objects always get their id when they are constructed. The
id cannot be changed after the TSymbol is created.
This makes it simpler to insert both mangled and unmangled versions of
a function to the symbol table. These can now both share the same
TSymbol object, unlike before, when inserting the same symbol twice
would have changed its symbol id.
This requires changes to function definition parsing: function
definition nodes now share any symbol created by previous prototype
declarations of the function. The parameters on the symbol get set to
the parameters in the function definition header.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I8e600e9b5e5de27d64b85c5042cfd23ff02abe63
Reviewed-on: https://chromium-review.googlesource.com/396838
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
4310354e
|
2016-10-10T12:28:13
|
|
Handle corner cases of shifting signed integers better
Right-shifting a negative number should sign-extend according to the
ESSL 3.00.6 spec. Implement sign-extending right shift so that it
doesn't hit any undefined behavior in the C++ spec. Negative lhs
operands are now allowed for bit-shift right.
Also implement bit-shift left via conversion to unsigned integer, so
that it does not hit signed integer overflow. Negative lhs operands
are now allowed also for bit-shift left as well.
BUG=chromium:654103
TEST=angle_unittests
Change-Id: Iee241de9fd0d74c2f8a88219bddec690bb8e4db2
Reviewed-on: https://chromium-review.googlesource.com/395688
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
894a6343
|
2016-10-11T14:54:51
|
|
Add missing override identifier for getSequence
Fixed the compiling error in Mac by adding missing override identifier
for getSequence.
BUG=angleproject:1490
TEST=compile on macOS Sierra 10.12
Change-Id: I8f8d556c82885bbee1712e1b6e5f439b67906023
Reviewed-on: https://chromium-review.googlesource.com/396403
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
f8fd2bd3
|
2016-10-10T14:08:59
|
|
Add missing virtual destructor on TIntermAggregateBase
BUG=angleproject:1490
TEST=build on Linux GCC
Change-Id: I64f53d636d4acee0469b6e9ba1201322087d5f65
Reviewed-on: https://chromium-review.googlesource.com/395732
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
6d40bbdd
|
2016-09-30T13:49:38
|
|
Split TIntermBlock from TIntermAggregate
The new TIntermBlock node class replaces TIntermAggregate nodes with
the EOpSequence op. It represents the root node of the tree which is
a list of declarations and function definitions, and any code blocks
that can be denoted by curly braces. These include function and loop
bodies, and if-else branches.
This change enables a bunch of more compile-time type checking, and
makes the AST code easier to understand and less error-prone.
The PostProcess step that used to be done to ensure that the root node
is TIntermAggregate is removed in favor of making sure that the root
node is a TIntermBlock in the glslang.y parsing code.
Intermediate output formatting is improved to print the EOpNull error
in a clearer way.
After this patch, TIntermAggregate is still used for function
definitions, function prototypes, function parameter lists, function
calls, variable and invariant declarations and the comma (sequence)
operator.
BUG=angleproject:1490
TEST=angle_unittests, angle_end2end_tests
Change-Id: I04044affff979a11577bc1fe75d747e538b799c8
Reviewed-on: https://chromium-review.googlesource.com/393726
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
08e229e7
|
2016-10-05T17:16:13
|
|
translator: Return null uniform map if no HLSL.
This replaces the global empty map.
BUG=angleproject:1459
Change-Id: If7d824cbf4492e722cbf99d1045402a26535af5c
Reviewed-on: https://chromium-review.googlesource.com/394236
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
5878f832
|
2016-10-07T10:14:58
|
|
Fix formatting of OutputHLSL::visitAggregate
Subsequent refactoring of this code will be easier to review if there
won't be unrelated style changes that git cl format insists on doing.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I102fd73bd92317ab438e1676422212f644d2859b
Reviewed-on: https://chromium-review.googlesource.com/394649
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
65c79dbc
|
2016-10-06T17:11:28
|
|
Clean up RecordConstantPrecision interaction with switch/case
There were two bugs here that were masking each other:
1. Case nodes were not being added to AST traversal path.
2. RecordConstantPrecision did not check if a constant was a child of
a case node.
Fix these.
BUG=angleproject:1490
TEST=WebGL 2 conformance tests
Change-Id: Ic6cb7942bf57870fa26eb6a011919a2d7951cc85
Reviewed-on: https://chromium-review.googlesource.com/394588
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
d569619d
|
2016-10-06T11:09:24
|
|
translator: Fail compilation if precision emu unsupported.
The fuzzer uncovered a case where we were trying to emulate precision
on HLSL 3.0, causing an ASSERT crash.
BUG=chromium:653276
Change-Id: I2e666a1ff4f605541e25f04264146063559cb835
Reviewed-on: https://chromium-review.googlesource.com/394237
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
5b7d40b3
|
2016-10-06T11:41:02
|
|
translator: Avoid divide-by-zero in error case.
In some code path found by a fuzzer, we would have a zero sized
array, which would trigger a zero divide. I was unable to extract
the failing shader from the fuzzer case trivially.
BUG=chromium:653274
Change-Id: Ia2558ae828fa73615c901fd1cda9ddaa3a72f1a9
Reviewed-on: https://chromium-review.googlesource.com/394238
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
32db19b7
|
2016-10-04T14:43:16
|
|
Ensure that if-else branches are always sequence nodes
This mainly affects RewriteElseBlocks, which was the only piece of
code still adding TIntermIfElse nodes directly as children of other
TIntermIfElse nodes.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I5b25c2fb9c642424417cd6c29e37c20482c6ffaf
Reviewed-on: https://chromium-review.googlesource.com/392847
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
7f9a55f7
|
2016-10-03T14:32:08
|
|
Fix integer math overflows in the preprocessor
Evaluating integer expressions in the ESSL preprocessor may result in
overflowing the signed integer range. Implement wrapping overflow for
preprocessor expressions in a way that doesn't hit any undefined
behavior. In the ESSL spec, preprocessor expressions are defined to
have mostly the same semantics as in C++. Since C++ doesn't define
what happens on signed integer overflow, we choose to make most of the
operators wrap on overflow for backward compatibility and consistency
with the rest of the ESSL spec.
We reuse the existing wrapping overflow helpers that are
used for constant folding. To be able to do this, the type used in the
preprocessor expression parser is changed from 64-bit to 32-bit.
Shifting negative numbers is implemented as a logical shift. This
cannot be disallowed since dEQP requires shaders shifting negative
numbers to pass compilation.
Undefined bitwise shifts where the offset is greater than 31 will now
result in a compile-time error.
A couple of test cases are now covered by the preprocessor tests
rather than full compilation tests. This isolates the tests better and
they run faster.
BUG=chromium:652223
TEST=angle_unittests
Change-Id: I84be40d404c10ecd0846c5d477e626a94a2a8587
Reviewed-on: https://chromium-review.googlesource.com/392146
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
f51fdd2e
|
2016-10-03T10:03:40
|
|
Ensure that all functions have a body node in the AST
Some traversers that insert code to main() assume that the main()
function has a non-null body node in place. This assumption was
previously wrong, since functions could be missing the body node
in case the function body was empty.
Fix possible invalid dereferencing of missing function body nodes by
always adding an empty sequence node to represent the body of
functions that have an empty body in the ESSL source. This also
enables simplifying some tree traversers that used to take the
possibility of missing function body nodes into account.
Also fix AddDefaultReturnStatements to check the last statement inside
the function body for a return statement, instead of checking the
first statement.
BUG=angleproject:1539
TEST=angle_unittests, angle_end2end_tests
Change-Id: I2fbd18c78653fa2f1a96dbd9a619accc4874030d
Reviewed-on: https://chromium-review.googlesource.com/392046
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
c9e6026c
|
2016-09-30T17:15:07
|
|
Revert "Add workaround for unused std140 and shared uniform blocks on MacOS"
This reverts commit 9aa83fe302578d226f195fff5fb3f0e2fb723a4c.
The new test UniformBufferTest.ActiveUniformNumberAndName/ES3_OPENGL is failing on multiple platforms. Examples:
https://build.chromium.org/p/chromium.gpu.fyi/builders/Mac%2010.10%20Release%20%28ATI%29/builds/12285
https://build.chromium.org/p/chromium.gpu.fyi/builders/Linux%20Release%20(ATI)
Change-Id: I78b1a4d58e9a291e40ad304eb32f990e0518f7ee
Reviewed-on: https://chromium-review.googlesource.com/391049
Reviewed-by: Kenneth Russell <kbr@chromium.org>
|
|
b6fa043d
|
2016-09-28T16:28:05
|
|
Split vector swizzle AST nodes into a different node class
This avoids creating a weird aggregate node with a sequence of
constant union nodes to store the offsets. They're stored neatly
inside a vector instead. This makes code that needs to iterate
over the swizzle offsets much simpler.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I156b95723529ee05a94d30295ffb6d0952a98564
Reviewed-on: https://chromium-review.googlesource.com/390832
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
9aa83fe3
|
2016-09-29T08:42:42
|
|
Add workaround for unused std140 and shared uniform blocks on MacOS
On some Mac drivers with shader version 4.1, they will
treat unused std140 and shared uniform blocks' members as inactive. However,
WebGL2.0 based on OpenGL ES3.0.4 requires all members of a named uniform block
declared with a shared or std140 layout qualifier to be considered active.
The uniform block itself is also considered active.
This workaround is to reference all members of unused std140 and shared uniform blocks
at the beginning of the vertex/fragment shader's main().
BUG=chromium:618464
TEST=UniformBufferTest.ActiveUniformBlockNumber
Change-Id: I1d2c5e3e8da04786ac6a37fd26f7bb9c14cd76ed
Reviewed-on: https://chromium-review.googlesource.com/387169
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
6f0a0dca
|
2016-09-27T13:51:29
|
|
Workaround isnan() on Intel drivers
On some Intel drivers, calling function isnan() on highp float will get wrong
answer. This patch work arounds this bug by using an expression to emulate
this function.
BUG=chromium:650547
Change-Id: I5bc5e0352c434f42cd2c55103a74f9f7ba51a72c
Reviewed-on: https://chromium-review.googlesource.com/389834
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
42fad76d
|
2016-09-28T10:06:29
|
|
Handle negation of minimum representable integer
Negating the minimum representable integer overflows, so it
has undefined behavior in C++. Handle this as a special case in the
code.
BUG=chromium:637050
TEST=angle_unittests
Change-Id: Ic6e6d638faddad9b70b5d1637bb4b42ef4f43784
Reviewed-on: https://chromium-review.googlesource.com/390551
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
1be4d493
|
2016-09-27T11:15:38
|
|
Fix handling integer overflow in constant folding
Integer operations that overflow are defined to wrap in the ESSL
3.00.6 spec. Constant folding that happens inside the shader
translator should also follow the wrapping rules.
The new implementations of wrapping integer addition and subtraction
use unsigned integers to perform calculations. Unsigned integers are
defined to implement arithmetic in modulo 2^n in the C++ spec. This
behavior is also leveraged to implement wrapping unsigned integer
multiplication.
The implementation of wrapping signed integer multiplication is
slightly trickier. The operands are casted to a wider type to perform
the multiplication in a way that doesn't overflow, and then the result
is truncated and casted back to the narrower integer type.
Incorrect tests that expected errors to be generated from integer
overflow in constant folding are removed.
BUG=chromium:637050
TEST=angle_unittests
Change-Id: I0de7e25881d254803455fbf22907c192f49d09ff
Reviewed-on: https://chromium-review.googlesource.com/390252
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
d4453573
|
2016-09-27T13:21:46
|
|
Fix integer division constant folding corner cases
ESSL has undefined behavior when the integer modulus operator is used
on negative operands. Generate a warning and fold the result to zero
in this case.
In case the minimum representable signed integer is divided by -1, the
result is defined to be either the maximum or minimum representable
value. We choose to fold the calculation to the maximum representable
value in this case.
BUG=angleproject:1537
TEST=angle_unittests
Change-Id: I57fac6b54a3553b7a0f0e36cc6ba0ed59a88eea9
Reviewed-on: https://chromium-review.googlesource.com/390251
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
2cacb778
|
2016-09-26T08:50:40
|
|
Fix folding shifts when operands have different signedness
The code used to incorrectly assert that the right-hand side of shift
should have the same signedness as the left-hand side. Instead simply
assert that both the lhs and rhs are integer typed, and also don't
rely on aliasing via union when accessing bit shift operands.
Also disallow constant folded bit shifts where the right hand side is
greater than 31. Shifting with values greater than the width of the
type has undefined results in both ESSL and C++.
BUG=chromium:648135
TEST=angle_unittests
Change-Id: I84a99abc55f0eeda549b4781e954d17ba7b87552
Reviewed-on: https://chromium-review.googlesource.com/389351
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
054f7ed0
|
2016-09-20T17:15:59
|
|
preprocessor: Miscellaneous cleanups
- Use full header paths in includes
- Use ASSERT instead of assert
- Use angle::NonCopyable instead of PP_DISALLOW_COPY_AND_ASSIGN
- Use range-for in a couple places
- Remove pp_utils.h
BUG=angleproject:1522
Change-Id: If107fef89e8465bca65cf664926d1051c5d1e232
Reviewed-on: https://chromium-review.googlesource.com/387212
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
28a97ee1
|
2016-09-22T13:01:26
|
|
Generate unique HLSL texture function names for external textures.
Because 2D and external textures have the same HLSL texture type, they were
generating texture functions with the same name. This causes conflicts when
both 2D and external textures are used in the same shader.
BUG=angleproject:1534
BUG=645532
Change-Id: I4b324014b7d9b4851d358730cf4e31fc8461584c
Reviewed-on: https://chromium-review.googlesource.com/388551
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
44ebf6b4
|
2016-09-22T13:00:02
|
|
ConstantUnion: Error on undefined shift.
BUG=chromium:648135
Change-Id: I41581f63af650564a0f61c1baeeb38017c8513ed
Reviewed-on: https://chromium-review.googlesource.com/387470
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
2bd9c443
|
2016-09-20T16:39:18
|
|
preprocessor: add a limit to the number of token expanded
BUG=angleproject:1522
BUG=chromium:648074
Change-Id: Ibf0858aaeb81933dd221ac82a49160169b48a495
Reviewed-on: https://chromium-review.googlesource.com/387211
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
596018ce
|
2016-09-21T12:57:03
|
|
translator: Refactor Constant Union shift ops.
In preparation for making them robust.
BUG=chromium:648135
Change-Id: I88fc87d8887064fda04087c56de05d8725a6fe5f
Reviewed-on: https://chromium-review.googlesource.com/387469
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
d2f195b5
|
2016-09-19T15:53:33
|
|
preprocessor: Fix use after free when #undef the macro being invoked
BUG=chromium:648031
BUG=angleproject:1522
Change-Id: I825cea9e736a2c99133408249cfcd525431d31de
Reviewed-on: https://chromium-review.googlesource.com/386853
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
f979524a
|
2016-09-21T15:19:00
|
|
Remove redundant code in RewriteTexelFetchOffset
Remove useTemporaryIndex() in function RewriteTexelFetchOffset since
no temporary variables will be created in this function.
BUG=angleproject:1469
Change-Id: Ibed56f0ba5c89b6ae1ab1611de39514c3fbb600f
Reviewed-on: https://chromium-review.googlesource.com/387198
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
93561c3a
|
2016-09-20T10:22:55
|
|
Regenerate the preprocessor with the latest versions of flex and bison.
BUG=648063
Change-Id: Ia90d12c8cb4ae0a694227145267e78ca02dcc2b0
Reviewed-on: https://chromium-review.googlesource.com/387114
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
d4a07fbb
|
2016-09-20T10:24:23
|
|
Disallow bit-shifting when the left operand is negative.
BUG=648063
Change-Id: I82d9fbdaf8791a396dd71eeb57d93967ba5d65bf
Reviewed-on: https://chromium-review.googlesource.com/387115
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
a59fcdf4
|
2016-09-14T10:52:14
|
|
CallDAG: rewrite assignIndicesInternal as iterative,
Since the CallDAG is needed to check for the call graph depth, its
creation code must be robust to very deep call graphs.
BUG=angleproject:1517
Change-Id: I753ab84ad4ced6363a212f0fe94a89aabf4e3c3e
Reviewed-on: https://chromium-review.googlesource.com/385496
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
e292e902
|
2016-09-07T10:49:01
|
|
Workaround the unary minus operator issue on Intel
On some Intel D3D drivers, evaluating unary minor operator on an
integer variable may get wrong answer in vertex shader.
This patch works around this bug by replacing -(int) with ~(int)+1
on Windows Intel.
BUG=chromium:644033
Change-Id: I0af719e84d618a33f25bcb33bde0c381fb462a31
Reviewed-on: https://chromium-review.googlesource.com/381675
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
5db69f57
|
2016-09-15T12:47:32
|
|
Add robust math to constant folding.
Previously our multiplication and other operators could
do overflows, which can lead to security bugs.
BUG=chromium:637050
Change-Id: Icee22a87909e205b71bda1c5bc1627fcf5e26e90
Reviewed-on: https://chromium-review.googlesource.com/382678
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
8b28a8b0
|
2016-09-15T19:47:56
|
|
translator/Compiler.cpp: fixup includes
A stray iostream got introduced in
28b6528ca2119d6715bb5e9eafa5a2dc8c968361
BUG=angleproject:1522
Change-Id: Ib0b14b47d4786309ec2d39acb5531f3772b91f20
Reviewed-on: https://chromium-review.googlesource.com/386256
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
415f29e0
|
2016-09-07T16:37:38
|
|
Disallow layout+invariant combo on ESSL 3.00 variable declarations
This combination is not allowed by the formal grammar in the ESSL 3.00
spec, and should still be disallowed in ESSL 3.00 shaders even though
the shader parser now implements the more flexible ESSL 3.10 grammar.
BUG=angleproject:1507
TEST=angle_unittests
Change-Id: I766a468fd7314c7e60e020b5b204aa6950263633
Reviewed-on: https://chromium-review.googlesource.com/381933
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
5796127e
|
2016-09-14T13:57:46
|
|
Rename TIntermSelection to TIntermIfElse
Now that ternary nodes are not represented by TIntermSelection any
more, TIntermIfElse is an easier name to understand for newcomers to
the code.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: Ia1e04e356ab93409400245092a84533d7dfd129d
Reviewed-on: https://chromium-review.googlesource.com/385416
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
|
|
28b6528c
|
2016-06-16T07:24:50
|
|
Add a fuzzer for the shader translator.
BUG=angleproject:1522
Change-Id: Idbe8194ba478366e99c7460d403d03fe27dd89d0
Reviewed-on: https://chromium-review.googlesource.com/353153
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
09cfac60
|
2016-09-06T17:25:16
|
|
Work around For and While loop bugs on Intel Mac OSX
Condition calculation in for and while loops has bug on Intel Mac. Work
around it by converting "CONDITION" to "CONDITION && true".
This CL also adds previous SH_EMULATE_ABS_INT_FUNCTION workaround to
the ANGLE GL back-end on OSX
BUG=chromium:644669
TEST=deqp/functional/gles3/shaderloop_for/while.html
Change-Id: I910f662b054f259fcb601b9938841b3a2d066840
Reviewed-on: https://chromium-review.googlesource.com/381678
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Qiankun Miao <qiankun.miao@intel.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
|
|
7ebb97fc
|
2016-09-08T18:01:50
|
|
Use 64-bits compile options
BUG=chromium:645071
Change-Id: I31825123bf4cb45fb37a93f538e8936487beb5ff
Reviewed-on: https://chromium-review.googlesource.com/382712
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
47cb73ab
|
2016-09-09T11:41:44
|
|
Refactor TConstantUnion.
In preparation for constant folding fixes.
BUG=chromium:637050
Change-Id: I9ea49ce96b34c6ac3d2f0478b8fc6732c59e28be
Reviewed-on: https://chromium-review.googlesource.com/373741
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|