- 16 Jun, 2020 5 commits
-
-
Ben Clayton authored
Changes: 5c6c1532220 Fix Android build Commands: ./third_party/update-marl.sh --squash Bug: b/140546382 Change-Id: Ibb733d85c64a183f4fbe1a803d3d569a37e858a1 -
Ben Clayton authored
5c6c1532220 Fix Android build git-subtree-dir: third_party/marl git-subtree-split: 5c6c1532220096dd470549312053a445d7d95a2c
-
Ben Clayton authored
* changes: Update Marl to c51271125 Squashed 'third_party/marl/' changes from 38c0c7a0f..c51271125 Repoint marl branch from master to main SubzeroReactor: Use new marl::Scheduler::Config API.
-
Ben Clayton authored
In-memory data visualizations of vector types were using indices for displaying vector elements. For non-memory data, we use .x .y .z .w for vectors <= 4 elements. Mirror this for in-memory data. Bug: b/148401179 Change-Id: Ib2e8e2019ab274dfae2d6e18978f41c721c800a1 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45609 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
to debug::Object. This used to be unnecessary as the debug objects used to contain POD, but we now also have std::string and std::vector fields in these objects, and we need them to destruct. Bug: b/148401179 Change-Id: I28637f645a96e3e895e7ae5f3028eb7872c92dd3 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45608 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
- 15 Jun, 2020 5 commits
-
-
Ben Clayton authored
Changes: c51271125 README.md: Repoint link from `master` to `main` da0a9c610 Add basic CMake rules for versioning marl 0e639c3c7 Benchmarks: Simplify tests further. 32af8bb50 Kokoro: Enable debug checks 8cf8dc033 Wrap all stl containers with a marl::StlAllocator 325b072b9 Support specifying worker thread affinities 49fe9a17f marl::containers: Add const methods 11f31bfbe Benchmarks: Warn if benchmarking with sanitizers bfdf613e7 Benchmarks: Add MARL_FULL_BENCHMARK flag 5e2383370 Benchmarks: Allow running with custom Config c277c61b0 marl::containers::vector fixes fcbe1f279 Add issue number to MARL_DEPRECATED() 1f010cad7 Warn about use of deprecated APIs d2e553bff Don't use deprecated scheduler methods Commands: ./third_party/update-marl.sh --squash Bug: b/140546382 Change-Id: I3e59c425cbdc868e5de44a00a5523392044a3352 -
Ben Clayton authored
c51271125 README.md: Repoint link from `master` to `main` da0a9c610 Add basic CMake rules for versioning marl 0e639c3c7 Benchmarks: Simplify tests further. 32af8bb50 Kokoro: Enable debug checks 8cf8dc033 Wrap all stl containers with a marl::StlAllocator 325b072b9 Support specifying worker thread affinities 49fe9a17f marl::containers: Add const methods 11f31bfbe Benchmarks: Warn if benchmarking with sanitizers bfdf613e7 Benchmarks: Add MARL_FULL_BENCHMARK flag 5e2383370 Benchmarks: Allow running with custom Config c277c61b0 marl::containers::vector fixes fcbe1f279 Add issue number to MARL_DEPRECATED() 1f010cad7 Warn about use of deprecated APIs d2e553bff Don't use deprecated scheduler methods git-subtree-dir: third_party/marl git-subtree-split: c51271125451c599efb9ec58b355a4c434296a8f
-
Ben Clayton authored
See https://github.com/google/marl/issues/153 for more details Bug: b/140546382 Change-Id: I73cd3e575b781890e82eda94285e8a585bd879d5
-
Ben Clayton authored
`marl::Scheduler::setWorkerThreadCount()` and `marl::Scheduler::setThreadInitializer()` have been deprecated. `marl::Scheduler::Config` is the new API. This got missed from 45493. See https://github.com/google/marl/issues/139 for context. Bug: b/140546382 Change-Id: Ic09c196b4c81f316cbf73de5395757108c16945c
-
Antonio Maiorano authored
This change now also makes it so that when rr::Print is enabled, it will output to stdout and to the debugger, if available. For now, that means it calls OutputDebugString on Windows. This is useful when it is difficult to capture stdout (e.g. debugging Chrome). Also, you can now modify Reactor.cpp and uncomment `#define RR_PRINT_OUTPUT_TYPE_STUB` to stub out the function itself. This is useful in combination with ENABLE_RR_EMIT_PRINT_LOCATION in that debugging the code-gen assembly allows you to inspect the string argument to rr::DebugPrintf and see exactly where you are in Reactor code without paying the performance cost of actually printing. Bug: b/158678105 Change-Id: Ie1bd85888405e189200c0e5f8f3449551327e0ab Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45669 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com>
-
- 11 Jun, 2020 8 commits
-
-
Alexis Hetu authored
The 37 failures in dEQP-VK.texture.explicit_lod.2d.* originated from a dEQP test issue which is now fixed: https://github.com/KhronosGroup/VK-GL-CTS/commit/ad89e118084d08fa1f14ad5801b996c62eb113cc Bug: b/151214291 Change-Id: I383a859945141ed04e4c49bab47a43692d02c060 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45668Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Alexis Hétu <sugoi@google.com>
-
Nicolas Capens authored
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkShaderModuleCreateInfo.html states that the "code must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix" This makes it the application's responsibility to only pass valid SPIR-V code to vkCreateShaderModule. However, improperly validated code may cause bugs which are hard to root cause, so validate in our implementation as well in debug builds. This can also help with fuzzing efforts. Bug: b/158228522 Change-Id: Ib4f41fa70a021fb902e1f8504005b87c92286942 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45569Tested-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com>
-
Nicolas Capens authored
This benchmark renders a single triangle to a double-buffered swapchain. It uses a passthrough vertex and fragment shader written in GLSL and compiled into SPIR-V using glslang. Bug: b/158231104 Change-Id: I21f00f8f8595e018ff0d05f5af898a1f64d4dd12 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45629 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com>
-
Nicolas Capens authored
Note glslang's build targets may already have been added by the PowerVR SDK. In that case, we use their copy. This is not optimal since it potentially makes our test results depend on whether or not building the PowerVR samples has been enabled, but it prevents duplicate targets. Bug: b/158655757 Change-Id: Ic4e9292da9b1bb498164929cc7f93e73bf1fd6e6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45628 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Nicolas Capens authored
This will be used by benchmarks and unit tests. Bug: b/158655757 Change-Id: Idca9f31be946dc3209b8c93cd2195dd43b1e4233 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45649 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Nicolas Capens authored
This refactoring is part of a hack which will allow us to add glslang for use by unit tests and benchmarks, but skip it when PowerVR already provides glslang. Bug: b/158655757 Change-Id: I1991ea5ea7524ba71ce9bc2c1d55114318ba434f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45648 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Nicolas Capens authored
vkCmdClearColorImage() and vkCmdClearDepthStencilImage() are currently implemented using Blitter::clear(), which delegates to fastClear() for certain formats, or falls back to using a generic Reactor routine. This change benchmarks the performance for: - VK_FORMAT_R8G8B8A8_UNORM (fast path) - VK_FORMAT_R32_SFLOAT (slow path) - VK_FORMAT_D32_SFLOAT (slow path) Bug: b/158231104 Change-Id: I5383b322e3ea5de6b21113843fb665a22a92b9bf Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45470 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com>
-
Nicolas Capens authored
Using https://github.com/KhronosGroup/Vulkan-Headers at tag v1.2.141. Vulkan-Hpp is useful for writing unit tests and microbenchmarks, since it includes support for loading a specific dynamically linked library: https://github.com/KhronosGroup/Vulkan-Hpp#extensions--per-device-function-pointers It also provides some abstraction to make tests more succinct and less bug prone. Bug: b/144696871 Change-Id: I4b22aefd205c01094e525b051b088ea9df14cca8 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45568 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
- 05 Jun, 2020 1 commit
-
-
Caio Marcelo de Oliveira Filho authored
In 34c59c9b ("Update Vulkan headers to version 1.1.111") the Vulkan Headers were inadvertently converted to CRLF line endings, convert them back. Bug: b/157893908 Change-Id: I4ce4edd941e55cbfb7172c8d6041bf9e9a0254d3 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45430Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
- 04 Jun, 2020 1 commit
-
-
Ari Suonpaa authored
Bug: b/157926124 Change-Id: Iba985aa82cbda2d2d9778909d47abda2f0a7322b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45489 Presubmit-Ready: Alexis Hétu <sugoi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Tested-by:
Ari Suonpää <ari.suonpaa@siru.fi>
-
- 02 Jun, 2020 18 commits
-
-
Trevor David Black authored
Bug: b/155664177 Change-Id: I9322be202434908dfd652980f50e1024cf2efa2d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45368 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Chris Forbes <chrisforbes@google.com> Tested-by:
Trevor Black <vantablack@google.com> Presubmit-Ready: Trevor Black <vantablack@google.com>
-
Ben Clayton authored
`marl::Scheduler::setWorkerThreadCount()` and `marl::Scheduler::setThreadInitializer()` have been deprecated. `marl::Scheduler::Config` is the new API. See https://github.com/google/marl/issues/139 for context. Bug: b/140546382 Change-Id: Ida768eea98a7ca5d22f55f5055ca288b41b353d0 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45493Tested-by:
Ben Clayton <bclayton@google.com> Presubmit-Ready: Ben Clayton <bclayton@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
Bug: b/152339534 Change-Id: Icfbd4d3a00ffb322d083dccd7aee980ae1ee91d6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43109Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com>
-
Ben Clayton authored
* changes: Update Marl to 38c0c7a0f Squashed 'third_party/marl/' changes from 3c643dd4c..38c0c7a0f Fix LLVM_VERSION_MAJOR for LLVM 10 on macOS
-
Ben Clayton authored
Changes: 38c0c7a0f Add Scheduler::Config and deprecate old [gs]etters 17b12a448 Use CreateFiberEx instead of CreateFiber (#141) 7236bd098 Test build / warning fixes for iOS c716869a7 Enable FreeBSD support 00433d418 Add tests for using a marl::Scheduler without binding 6b4f6472e Fix CMake warning when not built as subproject 0591f0ef0 Kokoro Ubuntu: Switch to docker image bf9255db7 Optimization for marl::parallelize Commands: ./third_party/update-marl.sh --squash Bug: b/140546382 Change-Id: I5eaceebcbfef7636fd711d9e4dc7ae4a946e8a34 -
Ben Clayton authored
38c0c7a0f Add Scheduler::Config and deprecate old [gs]etters 17b12a448 Use CreateFiberEx instead of CreateFiber (#141) 7236bd098 Test build / warning fixes for iOS c716869a7 Enable FreeBSD support 00433d418 Add tests for using a marl::Scheduler without binding 6b4f6472e Fix CMake warning when not built as subproject 0591f0ef0 Kokoro Ubuntu: Switch to docker image bf9255db7 Optimization for marl::parallelize git-subtree-dir: third_party/marl git-subtree-split: 38c0c7a0fb1ceec42fb48d9c5380026a9eb9b076
-
Ben Clayton authored
Looks like I generated the configs using ToT which had already bumped version, insteaad of the snapshot held by SwiftShader `third_party/llvm-10.0` Bug: b/152339534 Change-Id: I7d01a3c8d308916c6fa699ba73f0b3201fdf1658
-
Caio Marcelo de Oliveira Filho authored
Bug: b/157856449 Change-Id: I8363688a32df093244dd0b043ae2ce271e7387d6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45428 Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
Caio Marcelo de Oliveira Filho authored
Using headers from https://github.com/KhronosGroup/Vulkan-Headers at tag v1.2.141. * Modified vulkan.h to still include vulkan_fuchsia_extras.h like before. * VK_NVX_device_generated_commands was replaced with a non-experimental version VK_NV_device_generated_commands. So replaced the symbols in VkStringify too. * Preserved the line endings of the existing files. * Note that VK_PIPELINE_BIND_POINT_RANGE_SIZE doesn't include the Ray Tracing pipeline bind point. This is fine since it is not supported by SwiftShader. Bug: b/157856449 Change-Id: I85f865e128dc034d39a24223621c105f9d1f5b03 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45429 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com>
-
Ben Clayton authored
and move pointer typeinfo value construction from build time to runtime. While this may seem counter-intuitive for performance, it's actually a big win, as shader compilation can take a significant amount of time with the amount of debug logic generated. This is also a first step towards lazy/static `vk::dbg::Value` generation for array types. Bug: b/124388146 Change-Id: I3448ffdabd553db17a22090081ac4809e0555b1d Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45488 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Ben Clayton authored
The 'builtins' scope was rather specific to the initial SPIR-V SSA debugging functionality, and doesn't really fit with the rich debug model. Just replace it with a more sensible globals scope. Fixes issues where these globals were only visible in the initial stack frame. Bug: b/148401179 Change-Id: Id229e891edb8ece3694d989b48d3399d5d489d47 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45356Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
Bug: b/148401179 Change-Id: I0f9458c8e7c8bb04b3b4443f30bb1b7f6c98d686 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45354Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
The spec states that opaque types can have a None size instead of a constant integer size. Bug: b/148401179 Change-Id: I52eeabe2336775643787599890857169825f3230 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45353Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
The type info is parsed into the corresponding structs, but nothing consumes these just yet. Bug: b/148401179 Change-Id: I0568ea61fe22a5e8be5d6dc07e43868a6e5a35ec Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45352Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
-
Ben Clayton authored
Arrays are still WIP. While I'm still working on these, don't fall through to the SSA handler. This can dramatically affect performance for large arrays. Bug: b/148401179 Change-Id: I77e972f13cf9a1ce2b0d47a883194b6bceb68f4b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45351 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Ben Clayton authored
If the shader contains `OpenCL.DebugInfo.100` rich debug info instructions, don't also include raw SSA values in the watch window. Bug: b/148401179 Change-Id: Id70a702bbb24fb0bf79faa55cd22c0a87c973f62 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45350 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Ben Clayton <bclayton@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Nicolas Capens authored
As part of chromium:944811, LLVM_ENABLE_THREADS was turned off, but since https://swiftshader-review.googlesource.com/c/SwiftShader/+/33484 we may invoke Reactor JIT-compilation on multiple threads. Instead of re-enabling LLVM_ENABLE_THREADS wholesale, just make ManagedStatic thread-safe. Since sys::Mutex usage is not thread-safe without LLVM_ENABLE_THREADS, use standard C++ synchronization primitives instead. Note this change only affects the Subzero JIT backend, not the LLVM JIT. Bug: chromium:950343 Change-Id: Ie70be4adb2c395459cb9bbd4f6699e0b04969c74 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45328 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com>
-
Nicolas Capens authored
Previously only changes authored by Googlers would be tested, leaving external contributions untested until the next 'daily' run. This change enables testing of external contributions when a Googler added a Code-Review+1, Code-Review+2, or Presubmit-Ready+1 vote. Change-Id: I2f5c327848ad507d75967c9fd7f16085d0729a1a Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45508Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Antonio Maiorano <amaiorano@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com>
-
- 01 Jun, 2020 2 commits
-
-
Nicolas Capens authored
This header is now pre-built as part of third_party/SPIRV-Headers It was first added by https://swiftshader-review.googlesource.com/c/SwiftShader/+/43035 Bug: b/150936967 Change-Id: I2931cb6475fd2d99cdc015d1a2e3bd759f9255d6 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45309Tested-by:
Nicolas Capens <nicolascapens@google.com> Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by:
Ben Clayton <bclayton@google.com>
-
Nicolas Capens authored
When pCreateInfo->setLayoutCount is 0, descriptorSets[0].bindings would not be assigned the initial bindingStorage value, which is the start of the additional memory that is allocated for the PipelineLayout object. It is used in PipelineLayout::destroy() for deallocating said memory, which leads to attempting to free an initialized pointer. This was a regression caused by https://swiftshader-review.googlesource.com/c/SwiftShader/+/44328 Bug: b/154522740 Change-Id: I98f63d58e9d64b36f15d966afd1bc70c1ec97f59 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45448 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by:
Nicolas Capens <nicolascapens@google.com> Reviewed-by:
Alexis Hétu <sugoi@google.com> Reviewed-by:
Trevor Black <vantablack@google.com>
-