- 14 Apr, 2020 8 commits
-
-
David 'Digit' Turner authored
This implements external memory using a Zircon VMO handle that can be transferred between Fuchsia processes easily. Bug: b/140419396 Change-Id: I81cecec35b218eb22f3318ddec7b790b89e5ce09 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36168Tested-by:
David Turner <digit@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Nicolas Capens authored
The Modf and Frexp instructions from the GLSL.std.450 extended SPIR-V instruction set take a pointer argument to write one of their results to. This makes them the only arithmetic instructions which need to know how to explicitly access memory. This change replaces the partial duplication of store logic with a call to the underlying implementation of OpStore. To support storing intermediate values not associated with SPIR-V objects, the Operand class can now also wrap an independent Intermediate instance. Bug: b/153641251 Change-Id: Iebab43640b45ed6c27a77576168481d1a27158b6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43728 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
Nicolas Capens authored
The new Store() helper function can store Operand instances independent from SPIR-V instructions. This allows reuse of this logic for other instructions that need to store to memory, like Modf and Frexp. Bug: b/153641251 Change-Id: I453bb7cd24ba26b9a23d73568dc3374a52a36073 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43695 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com>
-
Nicolas Capens authored
The Operand class is a low-level abstraction of rvalues and constants. It should not carry the SPIR-V type ID. We only need the size in components. Bug: b/129000021 Change-Id: I6cb3ed6341b1ccf5ef759075d7410ba447617c8b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43693 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
Nicolas Capens authored
Bug: b/129000021 Change-Id: I36401de649eb53474ca74acb069351ce37f7529f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43828 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
Nicolas Capens authored
Avoid directly accessing SPIR-V instruction words. The helper methods provide self-explanatory semantics so we can eliminate local variables to store these IDs. Bug: b/129000021 Change-Id: Ie42782d53b9c24014b6a1b1f51b82085b6c2ebef Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43694 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Nicolas Capens authored
The defining instruction already contains the type ID. Bug: b/129000021 Change-Id: I0b29fda73964f5f4a73181a61a0f30cd1c47f404 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43692 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
Nicolas Capens authored
For instructions which define objects, the type ID and result ID are always the second and third SPIR-V instruction word, respectively. Bug: b/129000021 Change-Id: I6879251732860b80e1f7780d9078ad7bc9751b4c Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43691 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
- 11 Apr, 2020 1 commit
-
-
Ben Clayton authored
This has been removed in LLVM master. Bug: b/152339534 Change-Id: I613bae6c31944457bd52278228e33af6f85cce97 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43810 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 10 Apr, 2020 1 commit
-
-
David 'Digit' Turner authored
This patch modifies the CMakeLists.txt file and a few sources in order to build the SwiftShader Vulkan ICD for Fuchsia with CMake. Note that building EGL/GLES_CM/GLESv2 and tests is not supported, and should be explicitly disabled when configuring the build, e.g.: mkdir build-fuchsia && build-fuchsia cmake .. \ -DCMAKE_TOOLCHAIN_FILE=.../FuchsiaSdkToolchain.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DSWIFTSHADER_BUILD_TESTS=0 \ -DSWIFTSHADER_BUILD_EGL=0 \ -DSWIFTSHADER_BUILD_GLES_CM=0 \ -DSWIFTSHADER_BUILD_GLESv2=0 \ <other-cmake-options> make # or ninja NOTE: This should not affect the build for other platforms! This will make it easier to conditionally add Fuchsia-specific sources to the build (see discussion on b/144687651 for details). The BUILD.gn file will still be maintained in parallel for Fuchsia-specific changes. NOTE: As of now, the Fuchsia SDK doesn't provide a way for third-party code to access the framebuffer directly. Instead, client code should rely on Vulkan presentation surfaces or higher-level APIs provided by the compositor that are still in flux / unstable. Hence this will appear in a future CL. Bug: b/143122483 Bug: b/144687651 Change-Id: Ica3b98f5a8eb1370287e2bb4ff22ef938aaa4b49 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38488Reviewed-by:Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
David Turner <digit@google.com>
-
- 09 Apr, 2020 6 commits
-
-
Nicolas Capens authored
Bug: b/129000021 Change-Id: I0000fc5e65bde87e9037400002db37cb6d50960d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43688 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Ben Clayton authored
The targets `libGLESv2` and `libEGL` are no longer public to the root cmake list. Just move these copy ops into the subdirectory cmake rules without the PVR condition - the copy is cheap enough to do whether we're building PVR or not. Bug: b/145758253 Change-Id: Ic28331e3797c78e4910332fce934c06c132c3aa8 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43710 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
It correctly points out that despite `Type() = default;`, there's non-assigned const fields, so there's no way to generate a default constructor. Bug: b/145351270 Change-Id: I1c680982d960df278b5fcca5b29e837a4c82b70d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43709 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
Changes: de7dffa Socket: Use SO_REUSEADDR, disable SO_LINGER 9a9d46f Fix bad usage of std::move 3e6cfd6 CMake: Make the cppdap target's include directory public 4abe43c optional: Remove the value() method that returns non-const-ref. ced82a0 examples: Change stdin and stdout to binary mode 96b25aa src/io.cpp: Fix uninitialized variable. 93b8610 examples: Suffix package exe with .exe on Windows cdc19ac Serialization: Correctly encode structs with no fields 3a10d4c Format all source files 8633aba Add clang-format-all.sh to format all project sources 1be9bb6 launch.json - fix name of unittests to launch d19d8f8 Address #7 nits and fix compiler warning (#9) 73d697e Fix Response type info, make response 'body' field optional eab43f3 net::Server: Fix onError parameter default. Bug: b/145351270 Change-Id: I6a7767f8b763e8029571d65aa5446f5043ad83ac Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43708 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Corentin Wallez authored
Following the Vulkan 1.1 specification Section 2.9.1. "Conversion from Normalized Fixed-Point to Floating-Point": Note that while zero is exactly expressible in this representation, one value (-128 in the example) is outside the representable range, and must be clamped before use. https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#fundamentals-fixedfpconv Bug: dawn:283 Change-Id: Id548c6d67132ac36f33bc020954c5511de624ffc Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43648 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Corentin Wallez <cwallez@google.com>
-
Alexis Hetu authored
A test in dEQP was failing using SwANGLE in debug. The test was using a 1200x1200 grid -> 1,44M squares -> 2,88M triangles This was exceeding our hardcoded limit of 1 << 21 (2,097,152). Removing this code makes the test pass. Bug: b/152958809 Change-Id: I43fc3c0c9d78378911ab0238a908367ba310c09e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43668 Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Alexis Hétu <sugoi@google.com>
-
- 08 Apr, 2020 8 commits
-
-
Ben Clayton authored
Do this by breaking up the monolithic `runDaily()` function, and combining errors from the new `postDailyResults()` and `postCoverageResults()` functions. Bug: b/152192800 Change-Id: I031b37fa32d6d05ae1c38dff27a180c809aa4fe1 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43649Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Antonio Maiorano authored
Added CMakeLists.txt to the following folders that produce the following targets: src/OpenGL/common -> libGLESCommon (new) src/OpenGL/compiler -> GLCompiler src/OpenGL/libEGL -> libEGL src/OpenGL/libGLESv2 ->libGLESv2 src/OpenGL/libGLES_CM -> libGLES_CM Change-Id: I8217918b13b6963d18d1e6f89b4fa9e806bb36db Bug: b/145758253 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43588 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Antonio Maiorano authored
This change add a CMakeLists in each of the following folders, and creates the following targets: src/Common -> gl_common src/Main -> gl_main src/Renderer -> gl_renderer src/Shader -> gl_shader Bug: b/145758253 Change-Id: Ia1f68d0689f80955586235e125e0197da25d692d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43550 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Antonio Maiorano authored
This change makes it so that source/Common and source/Main are only referenced by the SwiftShader target. This will allow for better target-based sub CMakeLists. * Remove SharedLibrary.hpp/cpp from source list of libGLESv2 and libGLES_CM, as both of these depend on SwiftShader, which already builds these files. * Make libEGL depend on SwiftShader, so we can remove SharedLibrary.hpp/cpp and Main/libX11.hpp/cpp from its source list. Bug: b/145758253 Change-Id: If3d8e12cd09fb40d699080c2eeaa8243abe50512 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43528Tested-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Ben Clayton authored
This benchmarks `sw::LRUCache`, which currently resides in the `src/Device` folder (but will be moved to `src/System`) with 43489. Bug: b/153338950 Change-Id: I169b6ecb4a35349726a01b1da52472eaef3dfd74 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43492Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
This isn't used. There's another Cast() declared at vk scope, below VkCommandBuffer that actually is used. Bug: b/153462569 Change-Id: Id348676c9bb00aa934a972a2833ac6a1d3af54c1 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43575Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
Holds sw::Profiler that is entirely dead code. There's little here that looks worthy of keeping. Let's remove it. Bug: b/153462569 Change-Id: I4330781e8ba362461f164f0a52f764d4fe8f4dc4 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43574Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
This is a primitive check to ensure that .bp, .gn and .bazel files don't have source references to missing files. This can catch a common build breakage. Fixes: b/153439736 Change-Id: I95621f8775a0e536015d4da9897785935f130884 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43572 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 07 Apr, 2020 7 commits
-
-
Ben Clayton authored
The uncovered span calculations were ignoring span groups and inverted spans. This is now correctly handled by Tree.allSpans(). Bug: b/152192800 Change-Id: I2bd8afa3c956b03b598a3d5297cb775fd19da35d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43573 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
This had regressed mostly due to a single thread processing a huge number of `Span.Add()`s. Optimize for the common case, avoid `Span.Add()` in places where the data is already sorted, don't scan the entire file system for every test run. Bug: b/152192800 Change-Id: Id183468263e65bfbcf387ec1c978d8b9de547cee Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43570Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
This caused `TestTreeEncodeDecode` to fail, and would make the reparsing of a coverage file incorrect. Bug: b/152192800 Change-Id: Ic9f4c49c58350509f74755fec20f22b6c1213877 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43569Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
`include/marl/sal.h` was replaced with `include/marl/tsa.h`. Also add other missing files. Bug: b/140546382 Change-Id: I7f766b3c362de2ce6e4e317762de98db50467d8f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43571Reviewed-by:
Alexis Hétu <sugoi@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
Includes new Thread Safety Analysis helpers Changes: 539094011 CMake: Export MARL_THREAD_SAFETY_ANALYSIS_SUPPORTED c7f70ba7a CMake: Bump min version + include(CheckCXXSourceCompiles) 658a204fc Replace SAL annotations with clang's TSA annotations 9630bec2f Fix CMake warning: "Policy CMP0023 is not set" 9f369ad5d Update yarn:: to marl:: in an example Commands: ./third_party/update-marl.sh --squash Bug: b/140546382 Change-Id: Idb4253c11cece99ea4b22f965b974b63e26b51a7 -
Ben Clayton authored
539094011 CMake: Export MARL_THREAD_SAFETY_ANALYSIS_SUPPORTED c7f70ba7a CMake: Bump min version + include(CheckCXXSourceCompiles) 658a204fc Replace SAL annotations with clang's TSA annotations 9630bec2f Fix CMake warning: "Policy CMP0023 is not set" 9f369ad5d Update yarn:: to marl:: in an example git-subtree-dir: third_party/marl git-subtree-split: 53909401165022553ed9d1f0c572178559dc25ec
-
Ben Clayton authored
List all files, including those that have no coverage. Emit spans that were compiled, but not covered. Emit a % coverage per file. Bug: b/152192800 Fixes: b/153182184 Change-Id: I31c831273a8d3ee89c7ce0737b6e05398ff4f51b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43491 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 06 Apr, 2020 4 commits
-
-
Alexis Hetu authored
True integer formats should not use blend modes. This cl explicitly disables any blend operation on render targets using integer formats. Bug: b/153203552 Change-Id: Ia756953c61caef8e32e55aa31126044973ae1870 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43548 Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Alexis Hétu <sugoi@google.com>
-
Antonio Maiorano authored
Hack for minor precision issues with current implementation. Fixes 8 quality warnings from deqp-gles3 when run against SwiftShaderGL/Subzero. Bug: b/151461290 Change-Id: I4a3148add2c0987dcccca96e7c877ea4fb16ca89 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43470 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
Alexis Hetu authored
Cleaning up unused code Bug: b/153177839 Change-Id: I42479778f0f6ec9a955ba7f863766429b68c73a3 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43468 Presubmit-Ready: Alexis Hétu <sugoi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Alexis Hétu <sugoi@google.com>
-
Ben Clayton authored
These were added for the .gn build, but were never enabled for the CMake build. Test these as part of the Kokoro presubmits. Bug: b/153193374 Change-Id: I36e7428bfe1a4867bea39b2fbb302aed6c3dff7b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43488 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 04 Apr, 2020 1 commit
-
-
Ben Clayton authored
Bug: b/153168751 Bug: b/153206490 Change-Id: I2822f60aa380ae3885bc674d9f7b1f283c087e95 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43490 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 03 Apr, 2020 4 commits
-
-
Antonio Maiorano authored
Bug: none Change-Id: I9f58cc3bf6b457fc8b916a98242138865f89c577 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43469Reviewed-by:
Ben Clayton <bclayton@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com>
-
Antonio Maiorano authored
I broke this when I removed the relative path to the third_party astc include file in this change: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43269 Bug: none Change-Id: I45de8a6159c69c893df4449f6c6e10b09a9e6fe4 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43448Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com>
-
Ben Clayton authored
When `ENABLE_VK_DEBUGGER` is defined, VkDevice needs to be declared in order to build. Bug: b/148401179 Change-Id: If35f3a1425ec0d739750d632305a625c7e12b721 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43432Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
`VirtualFile`s are typically used for files with no physical backing. Use `PhysicalFile` if there's no content provided in the debug info. Bug: b/148401179 Change-Id: I1e1ed75ce9a9fb0965420267aba7f6d8de958012 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43430Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-