src/compiler


Log

Author Commit Date CI Message
Olli Etuaho 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>
Olli Etuaho 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>
Martin Radev 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>
Jamie Madill 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>
Jamie Madill 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>
Corentin Wallez 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>
Qiankun Miao 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Corentin Wallez 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>
Olli Etuaho 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>
Corentin Wallez 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>
Xinghua Cao 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>
Olli Etuaho 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>
Olli Etuaho 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>
He Yunchao 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>
Olli Etuaho 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>
Corentin Wallez 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>
Olli Etuaho 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>
Qiankun Miao 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>
Yuly Novikov 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>
Martin Radev 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>
Zhenyao Mo 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>
Qiankun Miao 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>
Zhenyao Mo 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>
Olli Etuaho 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>
Corentin Wallez 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>
Jamie Madill 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>
Jamie Madill 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>
Jamie Madill 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>
Jamie Madill 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Jamie Madill 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>
Jamie Madill 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>
Corentin Wallez 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>
Qiankun Miao 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>
Olli Etuaho 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>
Olli Etuaho 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>
Corentin Wallez 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>
Yuly Novikov 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>
Olli Etuaho 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>
Qiankun Miao 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>
Martin Radev 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>
Olli Etuaho 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>
Qiankun Miao 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>
Olli Etuaho 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>
Qiankun Miao 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>
Andi-Bogdan Postelnicu 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>
Corentin Wallez 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Qin Jiajia 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Qin Jiajia 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>
Olli Etuaho 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>
Olli Etuaho 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>
Jamie Madill 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>
Olli Etuaho 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>
Olli Etuaho 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>
Jamie Madill 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>
Jamie Madill 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Kenneth Russell 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>
Olli Etuaho 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>
Qin Jiajia 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>
Shao 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Olli Etuaho 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>
Corentin Wallez 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>
Geoff Lang 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>
Jamie Madill 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>
Corentin Wallez 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>
Jamie Madill 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>
Corentin Wallez 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>
Jiawei-Shao 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>
Geoff Lang 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>
Geoff Lang 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>
Corentin Wallez 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>
Jiawei-Shao 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>
Jamie Madill 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>
Corentin Wallez 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>
Olli Etuaho 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>
Olli Etuaho 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>
Corentin Wallez 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>
Qiankun Miao 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>
Qiankun Miao 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>
Jamie Madill 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>