Change-Id: I16c763a0e2634c9c408c25dbf26caf3c28b2ba79
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/487226
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
This is a reland of e1e1c03229
Original change's description:
> Start on custom mesh API
>
> Bug: skia:12720
> Change-Id: I8ed0555f1c5b8b0e97e73a657635dac2c0df0ccf
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/482457
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Brian Salomon <bsalomon@google.com>
Bug: skia:12720
Change-Id: I5c54f37949d8bd45ea606264c439912b65158b79
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/487220
Commit-Queue: Brian Salomon <bsalomon@google.com>
Auto-Submit: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Bug: skia:12720
Change-Id: I8ed0555f1c5b8b0e97e73a657635dac2c0df0ccf
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/482457
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Simplified - "no static instructions"
Added to skslc with .cpp -> .html
Change-Id: I0b56ea0480f868ca4182acb7a23c03acf7f57519
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/473659
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Julia Lavrova <jlavrova@google.com>
This also allows the KeyBuilder class to be used in Graphite. In Graphite
I plan to use it for other keys besides building up shaders/processors
so I dropped that from the name. There was nothing special abouts its
implementation that made it specific to Processors anyways.
Bug: skia:12754
Change-Id: I1b25730b061f9342b61e3b2e4ac43328b8074d59
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/486897
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
This is a reland of 6927ab9311
Original change's description:
> Add support for explicit attribute offsets and strides.
>
> Previously attribute offsets were always computed based on their
> position in an attribute array and the stride was determined
> by the offset and size of the last attribute.
>
> Now a GP has the option to create attributes with explicit offsets
> and specify an explicit vertex stride. All attributes must either
> be implicit or explicit (enforced by assert).
>
> GrGeometryProcessor::AttributeSet is now responsible for handling
> implicitly determined attribute offsets and strides. The backends
> no longer compute them.
>
> Bug: skia:12720
> Change-Id: I0211673dc70d4797c2d66b2555d8f5fb430be056
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484736
> Reviewed-by: Greg Daniel <egdaniel@google.com>
> Reviewed-by: Michael Ludwig <michaelludwig@google.com>
> Commit-Queue: Brian Salomon <bsalomon@google.com>
Bug: skia:12720
Change-Id: Ic4975b5b2e52f2d8213154da0e585eca6dfdd78d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/486098
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Bug: b/195936927
On Android, we may need to be able to seek the stream, but the input may
not be seekable. Copy in SkWuffsCodec as needed.
Change-Id: I7d5742e478532943a90400267175da80411cacd9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485636
Commit-Queue: Leon Scroggins <scroggo@google.com>
Auto-Submit: Leon Scroggins <scroggo@google.com>
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Kevin Lubick <kjlubick@google.com>
6706799186..b9f2d9cc14
2021-12-16 gman@chromium.org Use text expectations to skip a test
2021-12-16 cclao@google.com Vulkan: Replace BufferVk::getBufferAndOffset() with getBuffer()
2021-12-16 lubosz.sarnecki@collabora.com Tests: Add My Talking Tom Friends trace.
2021-12-16 lfy@google.com Vulkan: Track enabled in VertexArray
2021-12-16 cclao@google.com Vulkan: Implement BufferPool using VMA's virtual allocator
2021-12-16 lfy@google.com Vulkan: Dirty vertex buffers if default attrib values changed
2021-12-16 cclao@google.com Vulkan: Disable protected memory for ARM
2021-12-16 msisov@igalia.com Add support for GL_MESA_framebuffer_flip_y 1/*
2021-12-16 lubosz.sarnecki@collabora.com Tests: Add Dota Underlords trace.
2021-12-16 lubosz.sarnecki@collabora.com Tests: Add My Talking Tom 2 trace.
2021-12-16 angle-autoroll@skia-public.iam.gserviceaccount.com Roll vulkan-deps from a8221eed5970 to 39f3a18bdfbe (5 revisions)
2021-12-16 lubosz.sarnecki@collabora.com system_utils_posix: Check for SEGV_MAPERR si_code.
2021-12-16 penghuang@chromium.org Support more ImageLayout in ConvertImageLayoutToGLImageLayout
2021-12-16 gman@chromium.org Metal: Remove references to xfbActiveUnpaused uniform
2021-12-16 angle-autoroll@skia-public.iam.gserviceaccount.com Roll Chromium from 2dae07eeb163 to 3f6c88f5581a (414 revisions)
2021-12-16 lexa.knyazev@gmail.com Metal: Enable OES_fbo_render_mipmap
If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/angle-skia-autoroll
Please CC bungeman@google.com on the revert to ensure that a human
is aware of the problem.
To file a bug in ANGLE: https://bugs.chromium.org/p/angleproject/issues/entry
To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Cq-Include-Trybots: skia/skia.primary:Build-Debian10-Clang-x86_64-Release-ANGLE;skia/skia.primary:Test-Win10-Clang-AlphaR2-GPU-RadeonR9M470X-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC5i7RYH-GPU-IntelIris6100-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC8i5BEK-GPU-IntelIris655-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Debug-All-ANGLE
Tbr: bungeman@google.com
Test: Test: angle_perftests --gtest_filter="*dota_underlords*"
Test: Test: angle_perftests --gtest_filter="*my_talking_tom2*"
Test: Test: angle_perftests --gtest_filter="*my_talking_tom_friends*"
Test: Test: angle_unittests --gtest_filter="SystemUtils.PageFaultHandler*"
Change-Id: Ib12d39cec46ecc7ad45871ed1a3f261f58693b04
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/486217
Commit-Queue: skia-autoroll <skia-autoroll@skia-public.iam.gserviceaccount.com>
Bot-Commit: skia-autoroll <skia-autoroll@skia-public.iam.gserviceaccount.com>
The implementation is similar to other platforms.
Bug: chromium:1260529
Change-Id: I61749796fe822c4d1f73a6fab4276633b12185ae
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484616
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
...due to their age and Apple's no longer supporting them, as per my
discussion with Heather Miller.
Change-Id: Iccd80296379af113aa8bea4f833eb999b1828f78
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/486096
Commit-Queue: Leandro Lovisolo <lovisolo@google.com>
Reviewed-by: Leandro Lovisolo <lovisolo@google.com>
Commit-Queue: Erik Rose <erikrose@google.com>
Store the max glyph dimension in the digest for fast scaling
calculations for drawing of last resort.
Bug: skia:12744
Change-Id: I453dac4ab855abfd8a107f6ee24d1fd308cb2bb4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485793
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Line numbers were previously Text. They are now SmallButtons; clicking
them sets and clears breakpoints. The set of active breakpoints is
stored in an unordered_set of line numbers. Breakpoints are visualized
by setting the color of the SmallButton controls to red.
We now also have "Reset" (start over) and "Run to Breakpoint" buttons.
http://screen/8rtenW2vszxDgCp
Change-Id: I30a79bb09811e1d8a4e4e8535cbe62020f20f111
Bug: skia:12747
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485861
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
This reverts commit 6927ab9311.
Reason for revert: breaking roll?
Original change's description:
> Add support for explicit attribute offsets and strides.
>
> Previously attribute offsets were always computed based on their
> position in an attribute array and the stride was determined
> by the offset and size of the last attribute.
>
> Now a GP has the option to create attributes with explicit offsets
> and specify an explicit vertex stride. All attributes must either
> be implicit or explicit (enforced by assert).
>
> GrGeometryProcessor::AttributeSet is now responsible for handling
> implicitly determined attribute offsets and strides. The backends
> no longer compute them.
>
> Bug: skia:12720
> Change-Id: I0211673dc70d4797c2d66b2555d8f5fb430be056
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484736
> Reviewed-by: Greg Daniel <egdaniel@google.com>
> Reviewed-by: Michael Ludwig <michaelludwig@google.com>
> Commit-Queue: Brian Salomon <bsalomon@google.com>
Bug: skia:12720
Change-Id: I938bc3776d598f0906465eb2677208c79676642f
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/486016
Auto-Submit: Brian Salomon <bsalomon@google.com>
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Users expect that breakpoints will be hit even when stepping over or
stepping out. Rather than have one step call which honors breakpoints,
now the trace holds an unordered_set of breakpoints which all step calls
will honor.
Change-Id: I4055fc008e8cce4c413f357f375ae4038a7bd2a9
Bug: skia:12747
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485918
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
This allows the user to run up to a specified line (or until execution
is complete).
Change-Id: Ied34798d2df1b4a9e1d723c8d2eff3d579ca9b2d
Bug: skia:12747
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485860
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Bug: skia:12466
Change-Id: I0fe00c3cd4c79191d2dfe8b7db0f14098af0de2b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/475636
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Fix a use-after-move issue in DSLVarBase, as found by clang-tidy:
sksl/dsl/DSLVar.cpp:49:
'type' used after it was moved
sksl/dsl/DSLVar.cpp:40:
move occurred here
Bug: chromium:1122844
Change-Id: Ibb4cff71b3e27e1490baa1ae06f853711a84bbc4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484180
Auto-Submit: Maksim Ivanov <emaxx@chromium.org>
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Previously attribute offsets were always computed based on their
position in an attribute array and the stride was determined
by the offset and size of the last attribute.
Now a GP has the option to create attributes with explicit offsets
and specify an explicit vertex stride. All attributes must either
be implicit or explicit (enforced by assert).
GrGeometryProcessor::AttributeSet is now responsible for handling
implicitly determined attribute offsets and strides. The backends
no longer compute them.
Bug: skia:12720
Change-Id: I0211673dc70d4797c2d66b2555d8f5fb430be056
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484736
Reviewed-by: Greg Daniel <egdaniel@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
bfc7f09ae9..6706799186
2021-12-16 kpiddington@apple.com Metal: Fix Webkit warnings in ANGLE build
2021-12-16 gman@chromium.org Add guards for 64 bit types on 32bit systems
2021-12-16 ynovikov@chromium.org Skip SimpleStateChangeTestES3.OutOfBoundsByteAttribute on Pixel4 GLES
2021-12-15 abdolrashidi@google.com Vulkan: Fix the UAF issue with BufferData
2021-12-15 gman@chromium.org Metal: Integrate Metal Binary Shader generation
2021-12-15 kpiddington@apple.com Metal: Fix macOS ANGLE build on Catalina (10.15) SDK
2021-12-15 abdolrashidi@google.com Vulkan: Set content undefined on eglSwapBuffers
2021-12-15 cnorthrop@google.com Tests: Add Asphalt 9 trace
2021-12-15 syoussefi@chromium.org Vulkan: Disable async command queue with Vulkan SCBs
2021-12-15 m.maiya@samsung.com Invalidate EGL handles during eglTerminate
2021-12-15 lexa.knyazev@gmail.com Expand WebGLCompressedTextureAvailabilityTest
2021-12-15 jmadill@chromium.org end2end_tests: Add SwS + AsyncQueue testing.
2021-12-15 gman@chromium.org Update warning message for invalid include
2021-12-15 sugoi@google.com Return full error info when opening a library with dlopen
2021-12-15 syoussefi@chromium.org Vulkan: Fix desc set updates with Vulkan SCBs
2021-12-15 angle-autoroll@skia-public.iam.gserviceaccount.com Roll vulkan-deps from c03890076954 to a8221eed5970 (2 revisions)
2021-12-15 angle-autoroll@skia-public.iam.gserviceaccount.com Roll Chromium from 0c0a3654694f to 2dae07eeb163 (450 revisions)
If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/angle-skia-autoroll
Please CC bungeman@google.com on the revert to ensure that a human
is aware of the problem.
To file a bug in ANGLE: https://bugs.chromium.org/p/angleproject/issues/entry
To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry
To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Cq-Include-Trybots: skia/skia.primary:Build-Debian10-Clang-x86_64-Release-ANGLE;skia/skia.primary:Test-Win10-Clang-AlphaR2-GPU-RadeonR9M470X-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC5i7RYH-GPU-IntelIris6100-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUC8i5BEK-GPU-IntelIris655-x86_64-Debug-All-ANGLE;skia/skia.primary:Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Debug-All-ANGLE
Tbr: bungeman@google.com
Test: Test: Android CTS WrapperTest.testThreadCleanup
Test: Test: EGLMultiContextTest.NegativeTestAfterEglTerminate*
Test: Test: EGLMultiContextTest.RepeatedEglInitAndTerminate*
Test: Test: angle_perftests --gtest_filter="*asphalt_9*"
Change-Id: Id0c91d0718d90afc9bf535c684a1a22733899411
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485658
Commit-Queue: skia-autoroll <skia-autoroll@skia-public.iam.gserviceaccount.com>
Bot-Commit: skia-autoroll <skia-autoroll@skia-public.iam.gserviceaccount.com>
This is useful to know because breakpoints can only meaningfully be set
on a line of code which is reachable. In other words, we know the
entire execution path ahead of time, so we can tell you that some
branches aren't actually taken without needing to set a breakpoint at
all.
Change-Id: I72b2cddcf92fd6f75ea12d302230bae42b7112bc
Bug: skia:12666
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485218
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Without this, stencil-only passes would write the hard-coded blue to the
color buffer as well.
Cq-Include-Trybots: luci.skia.skia.primary:Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite,Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite,Build-Mac-Clang-arm64-Release-iOS_Graphite,Build-Mac-Clang-arm64-Release-Graphite,Build-Mac-Clang-arm64-Debug-iOS_Graphite,Build-Mac-Clang-arm64-Debug-Graphite_NoGpu,Build-Mac-Clang-arm64-Debug-Graphite,Build-Mac-Clang-arm64-Debug-ASAN_Graphite
Bug: skia:12703
Change-Id: I1f9bfc4723be1fed9ef7fc3fedea67b5a1de1d2a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484438
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
The problem is using the dimensions of the path glyphs to
approximate what will happen when we scale things to fit in
the atlas constraints. The path dimensions do necessarily scale to
represent the RGB dimensions of the emoji.
Round the max dimension up to provide a better margin of error.
The better solution will be to calculate the maxDimension in
MakeMask instead of MakePath, but this is a bigger engineering
exercise.
Bug: chromium:1280180
Change-Id: I994ed2b3461677890418d0472f31bd1b2651b037
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485216
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
We now track each slot's scope depth when it is written, and when scopes
are closed, we remove variables from display which fall out of scope.
Note that we DON'T have a specific trace-op dedicated to setting a
variable's stack depth when it is first declared. This is okay because
the SkVM code generation always stores a zero to a variable's slots as
soon as the variable is declared. This will consistently initialize its
depth to the depth of its initial declaration.
Change-Id: I68f76dfe2930fcd415ba635206cce3d0b94d1aac
Bug: skia:12741
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484564
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Trying to land on more consistent terminology:
- builtin: Any symbol or program element that's declared in the one of
the modules/pre-includes.
- intrinsic: The specific functions that are declared, but not defined
in the modules. These are implemented by the generators.
- builtin functions: Use this to refer to functions that are both
declared and defined in the modules. (eg unpremul)
Note that Module is still a term, and that may go away as well. This was
focused on reducing overloaded terminology around the elements
themselves (and not referring to things like "unpremul" as an intrinsic,
in the case of "referencedIntrinsics").
Change-Id: I2b55c4628e9263a7f7a4faad005a653592e9724c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484677
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Ordering of bit fields within the storage is actually implementation
defined, so the previous implementation didn't necessarily order keys
correctly when the struct bitfields were memcpy'ed into a uint64_t.
Cq-Include-Trybots: luci.skia.skia.primary:Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Release-All-Graphite,Test-Mac11-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All-ASAN_Graphite,Build-Mac-Clang-arm64-Release-iOS_Graphite,Build-Mac-Clang-arm64-Release-Graphite,Build-Mac-Clang-arm64-Debug-iOS_Graphite,Build-Mac-Clang-arm64-Debug-Graphite_NoGpu,Build-Mac-Clang-arm64-Debug-Graphite,Build-Mac-Clang-arm64-Debug-ASAN_Graphite
Bug: skia:12703
Change-Id: I0c41fb87dcaa3b6a4b880e4fb0e04603f1c9f867
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/483607
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
The widget layout shouldn't change when there are no variables.
Change-Id: Iedb48642486944127fa800072c1f4c57a574b513
Bug: skia:12666
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484836
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Bug: chromium:1280232
Change-Id: I66c5d36a0dfeac2d2a128eb8cf2798f0c02fbc86
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/484999
Commit-Queue: Greg Daniel <egdaniel@google.com>
Auto-Submit: Greg Daniel <egdaniel@google.com>
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
The issue was Skia would be in the middle of drawing when it
needed to lazy-load the image's texture. This would mess up the
bound texture in WebGL, but Skia didn't know that. As a result,
it would not realize that some of the work had been undone.
Calling resetContext() makes Skia aware of this fact, so it can
adjust its behavior.
Change-Id: I5e62987546be8d63d13c906dfab3bc92cf3120cd
Bug: skia:12740
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/485016
Reviewed-by: Brian Osman <brianosman@google.com>