734 Commits

Author SHA1 Message Date
Shahbaz Youssefi
2d5fb09d7f Stubs for EGL_ANGLE_external_context_and_surface
Bug: angleproject:5509
Change-Id: I8e2395784abcd2b4e3e1f888e70a879ef49287bc
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4706026
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-07-25 16:16:54 +00:00
Geoff Lang
9aadc7aacd Metal: Require MSL 2.1.
We had previously shipped both MSL 2.0 and 2.1 shaders to support
MacOS 10.13 (MSL 2.0 only) while also supporting the stencil blit
fast path that MSL 2.1 provides with the has_shader_stencil_output
feature.

Each configuration of precompiled shaders is ~300kb so we will drop
support for MacOS 10.13 and only ship the MSL 2.1 shaders.

Rework of the disablement for NVIDIA and GPU family 1 to be more
readable. The features themselves are always true because "disable on
NVIDIA" is always true and the check for "is NVIDIA" is moved to the
code which fails the initialization.

Bug: angleproject:8258
Change-Id: Icc8c69540e43fd2b0b237fffbfe170bb3422903f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4681130
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-07-17 22:00:36 +00:00
Geoff Lang
d40669bb4b Android: Use ALooper_pollOnce instead of ALooper_pollAll
ALooper_pollAll can cause potential deadlocks.

These calls are only made by our test suites.

Bug: chromium:1464077
Change-Id: Id56c0db67e10d6df00c3e6b9126952ffa1d40d48
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4690382
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
2023-07-17 20:42:37 +00:00
Phan Quang Minh
4cab5e94fc Vulkan: Enable timeline semaphores if supported by device
This is needed for a similar change in Chromium to function with
`--enable-features=VulkanFromANGLE`.

Bug: angleproject:8253
Change-Id: I422964ea010c650439dd4797ee8ba7b533f26a87
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4675807
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-07-12 11:11:51 +00:00
Geoff Lang
4e6124dae8 GL: Ensure all instanced attributes have a buffer with data
Apple OpenGL drivers sometimes crash when given an instanced draw with
a buffer that has never been given data.

It's not efficient to check if the attribute is both zero-sized and
instanced so just ensure that every time a zero-sized buffer is bound
to an attribute, it gets initialized with some data.

Bug: chromium:1456243
Change-Id: I66b7c7017843153db2df3bc50010cba765d03c5f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4642048
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-07-11 17:25:50 +00:00
Anne Redulla
66c2e4fca2 [ssci] Added Shipped field to READMEs
This CL adds the Shipped field (and may update the
License File field) in Chromium READMEs. Changes were
automatically created, so if you disagree with any of
them (e.g. a package is used only for testing purposes
and is not shipped), comment the suggested change and
why.

See the LSC doc at go/lsc-chrome-metadata.

Bug: b/285450740
Change-Id: I770554248e33c1e50938cc32daee36a83b643ec9
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4672125
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-07-07 13:44:43 +00:00
Steven Noonan
113f847be6 centralize basic OS/platform detection functions
We had multiple different places that defined these, and with varying
naming schemes. Centralize them to be defined in platform_helpers.h.

Also renaming the IsApple(uint32_t) functions to IsAppleGPU(uint32_t) to
avoid ambiguous meaning: "IsApple" should mean "is Apple-vended OS"
while "IsAppleGPU" should mean "is Apple GPU vendor ID".

Bug: angleproject:8229
Change-Id: If4e3fc5ac1b5b8ad416663950a1b2ee912ccad99
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4647291
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Steven Noonan <steven@uplinklabs.net>
Auto-Submit: Steven Noonan <steven@uplinklabs.net>
Reviewed-by: Roman Lavrov <romanl@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-06-27 18:21:04 +00:00
Steven Noonan
42c3a9fe3e Vulkan: support creating context with MoltenVK on macOS
The Vulkan loader somewhat recently introduced a requirement that
clients must opt-in to using portability implementations of Vulkan (such
as MoltenVK). Since there is no native Vulkan driver for macOS (and
therefore no alternative), unconditionally enable the portability
enumeration extension there.

Bug: angleproject:8229
Change-Id: I24f0f24e25abd277855ed9ac4de370cfb47d3266
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4639495
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Steven Noonan <steven@uplinklabs.net>
Reviewed-by: Charlie Lao <cclao@google.com>
Auto-Submit: Steven Noonan <steven@uplinklabs.net>
2023-06-27 02:25:34 +00:00
Amirali Abdolrashidi
5f9548c35b Vulkan: Free the garbage memory before realloc
Currently image allocations fall back to system memory in case of
a device OOM. However, in some cases, it is also possible to gain
some memory by freeing garbage memory from the device. This allows
us to keep the allocation on the device memory.

* Updated the image allocation fallback, so we will try cleaning the
  garbage memory through the renderer before retrying the allocation.

  * finishOneCommandBatchAndCleanup() in RendererVk, which will call a
    similar function in its CommandQueue. It will be called until there
    are no more in-flight submissions.

  * The existing finishOneCommandBatchAndCleanup() in CommandQueue has
    been renamed to finishOneCommandBatchAndCleanupImpl().

* Updated the flags used for VMA image allocations. If any device memory
  is freed after garbage cleanup to make enough space for the new
  allocation, it will take precedence over the system memory.

* Added unit tests in which a new image allocation could happen on the
  device after freeing the garbage memory.
  * They use a 2D texture and a 2D texture array for garbage.

Bug: b/280304441
Change-Id: Ia5e605e180833b44af8c77550ab1b0b8ba21724e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4547941
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
2023-06-27 00:23:23 +00:00
Steven Noonan
ac263582dd Vulkan: add workaround for VK_EXT_full_screen_exclusive on AMD
On outdated (but recent) AMD drivers, the Windows-only Vulkan extension
VK_EXT_full_screen_exclusive appeared to be implicitly enabled and set
to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT mode. Even though
ANGLE did not enable or interact with this extension at all, the driver
was incorrectly returning VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT
error codes on various swapchain operations when the full screen window
focus was lost (i.e. alt-tab out and back in). Naturally, ANGLE was not
expecting these error codes and did not know how to handle them.
Depending on where the errors occurred, ANGLE might crash or retry
creating the swapchain repeatedly.

Treating the unexpected VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT
error code as VK_ERROR_OUT_OF_DATE_KHR/VK_SUBOPTIMAL_KHR was not
sufficient, because the driver would repeat the error on every swapchain
operation, apparently expecting the error to be handled by
a vkAcquireFullScreenExclusiveModeEXT call (even though that would make
no sense, since the extension was not enabled).

The incorrect driver behavior was reported to AMD and was fixed in
recent driver releases. The earliest driver I've tested and know to be
working is AMD's Adrenaline driver version 23.5.2
(VkPhysicalDeviceProperties calls this driverVersion 2.0.262/0x800106).
The last known bad version was 0x8000e9.

The simplest workaround on these older AMD graphics drivers is to
explicitly enable the extension, but set it to
VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT mode. On newer drivers we do not
need to do anything with the extension and can ignore it.

Bug: angleproject:8215
Change-Id: I7c58d47a0350f4b0bc1a77f200c1e2f72fcde8d8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4627279
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
2023-06-21 20:37:29 +00:00
Kramer Ge
88c6dfcc7d Mali: Make the placeholder FBO complete for timer queries
Change the bindFramebufferForTimerQueries workaround to ensure
the framebuffer is complete.

Bug: chromium:1356053,b/269068358
Change-Id: Ief3198fdc4800468670a3f4323a1ffd3ca083c6f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4582606
Auto-Submit: Kramer Ge <fangzhoug@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
2023-06-15 15:26:04 +00:00
Roman Lavrov
21f16cb163 Disable clang-format on ANGLE features autogen outputs
Updates the script to produce reasonably formatted code without
clang-format.

Autogen files moved to autogen/ sub-directories because clang-format
does not support per-file settings ;(

This allows to run this codegen very quickly
(~50ms on my machine)

Bug: angleproject:8193
Change-Id: Ie84282090d574ebb4debe3edcfd82f983f27a5ff
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4604578
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-06-12 17:52:18 +00:00
Steven Noonan
a01a566c48 extension xmls: fix incorrect use of <ptype> tags
I was having trouble using some GL/EGL loader generators because of some
errors in the XML definitions for ANGLE.

The first major problem is the content of the <ptype> tags. Let's refer
to the Khronos registry XML schema (which is annoyingly a PDF rather
than an xsd that we can test against, though I don't know if an xsd
would catch this anyway):

    https://raw.githubusercontent.com/KhronosGroup/OpenGL-Registry/master/xml/readme.pdf

In section 12.4.2, "Contents of <param> tags" it states:

    The <ptype> tag is optional, and contains text which is a valid type
    name found in <type> tag, and indicates that this type must be
    previously defined for the definition of the command to succeed.
    Builtin C types, and any derived types which are expected to be
    found in other header files, should not be wrapped in <ptype> tags

Note that the above is repeated for the contents of <proto> tags as
well.

The extension XML files currently have a bunch of <ptype> tags which
don't meet the expectations described above. The correct transformation
for them would be, for example:

    <ptype>GLfloat *</ptype>      ->   <ptype>GLfloat</ptype> *
    <ptype>void *</ptype>         ->   void *
    <ptype>const char *</ptype>   ->   const char *
    <ptype>EGLAttrib *</ptype>    ->   <ptype>EGLAttrib</ptype> *

The next issue is that some tags have some typos, such as "<pytpe>"
instead of "<ptype>". (Now *that* is something an .xsd would catch...)

The last issue is the use of the typename "GLvoid" which is not as
serious a problem. It is still defined in Khronos' gl.xml <types> block,
but Khronos no longer uses it in their XML registries. The comment for
the "GLvoid" type in their <types> block states:

    <type comment="Not an actual GL type, though used in headers in the past">typedef void <name>GLvoid</name>;</type>

So we might as well replace those with just plain "void".

Anyway, long story short: to apply these transformations, I used Perl
regular expressions, and applied these expressions in order:

- Fix the tag misspellings:

    s#<(/?)pytpe>#<\1ptype>#g

- Move the const qualifiers (if present) and pointer asterisk(s) (if
  any) outside the <ptype> tag itself:

    s#<ptype>(const )?([A-Za-z0-9]+)[ ]?(\*\*?)</ptype> #\1<ptype>\2</ptype> \3#g

- Replace "GLvoid", "char", and "void" inside ptype tags to normal
  C types outside tags:

    s#<ptype>(GLvoid|void|char)</ptype>#\1#g

Bug: angleproject:8190
Change-Id: Ib0bea79fecb7e714910b6e92124bb9f52994d0fb
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4603709
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-06-09 21:15:16 +00:00
Cody Northrop
d8339e78db FrameCapture: Support EGLSync in MEC
This CL starts treating EGLSync as a tracked resource, such
that we can detect when they need to be created in Setup, or
regenerated in Reset.

Test: MEC of infinity_ops trace
Test: Replay new kentucky_route_zero trace without error
Bug: angleproject:8176
Change-Id: I130212f6edb78d9df29dd6e572843df25493ae09
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4566949
Reviewed-by: Roman Lavrov <romanl@google.com>
Commit-Queue: Cody Northrop <cnorthrop@google.com>
2023-06-08 22:07:41 +00:00
Roman Lavrov
5215293366 Add trace_interface: functions and callbacks for traces
Defines the interface between the test suite
(or an other TraceLibrary class user) and trace libraries.

TraceFunctions defines entry points for calls suite->trace, such as
SetupReplay() or SetBinaryDataDir().

TraceCallbacks defines entry points for calls trace->suite, for example
for loading .angledata.gz files.

These are set up via the exported SetupEntryPoints() call. Functions
like SetupReplay etc no longer need to be exported from the trace
library.

TraceInfo (parsed representation of the trace json) is moved to
trace_interface as is. This is convenient for further changes to the
fixture that will allow to easily move some of the captured parameters
to json.

This also moves Decompress functionality (and memory ownership) to test
suite entirely, which avoids Decompress/Delete callbacks - the trace
just calls LoadBinaryData via TraceCallbacks and TraceLibrary releases
the memory either on FinishReplay or in its destructor.
This should also take care of the memory leak described in
https://crrev.com/c/3858185

Bug: b/286072760
Change-Id: Ibc6f6f64156ad805b1917c8fc41a3b0d2c0d6375
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4594445
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-06-08 20:06:15 +00:00
Shahbaz Youssefi
b0e9bbd79f Vulkan: Split features for dynamic state
When a driver bug with dynamic state is encountered, it is hard to debug
which dynamic state exactly is causing an issue, due to the current
granularity of disabling all entire state from an extension.  With this
change, every dynamic state gets its own ANGLE feature, and can be
toggled as necessary.

Disabling the supportsExtendedDynamicState* features implicitly
disables all dependent features.

Bug: b/285124778
Bug: b/275210062
Bug: fuchsia:107106
Bug: angleproject:5906
Change-Id: Ic291279872df2d0eb58618ff364ab118bdcc4a9f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4577553
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
2023-06-01 00:37:50 +00:00
Yuxin Hu
dfb2bab0bb Apply Aliased Decorators To Image DataTypes
Bug: b/274478912
Bug: b/266235549
Change-Id: I2cd272a1e7481a8803be63efe0be11c61560b23e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4568287
Commit-Queue: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-05-31 16:25:55 +00:00
Roman Lavrov
16b9a16ae4 Add supports_legacy_dithering feature
VK_EXT_legacy_dithering =>
VkPhysicalDeviceLegacyDitheringFeaturesEXT.legacyDithering =>
supportsLegacyDithering

Now getting enabled=true on Android master.

Bug: b/284462263
Change-Id: Ibf43184c78d9847044b10413d2050b653e452c9b
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4567572
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-05-26 21:08:32 +00:00
Kenneth Russell
aea8856277 Reland "Metal: Optimized BufferSubData per device"
This reverts commit ee64836f70 ,
relanding the patch stack described there.

Between patchsets 1 and 5:

- The shadow buffer allocation has been replaced with a multimap of
  precisely-sized buffers, rather than rounding up buffer sizes.

- Garbage collection of shadow buffers is triggered in three situations:

  - A certain number of context switches have occurred; this number
    was hand-tuned to avoid GC every frame.

  - A certain number of command buffer submissions has occurred; this
    number was hand-tuned to GC no more often than every few seconds
    on representative workloads.

  - The total size of the allocated shadow buffers is more than 1 MB,
    and either more than twice the size at the last garbage
    collection, or 64 MB more than at the last garbage collection. In
    this case, aggressive GC is performed in order to reclaim shadow
    buffers more quickly.

Performance before and after these changes appears identical on
microbenchmarks. On one Figma test case, comparing GPU memory
allocated inside the BufferManager, peak consumption is decreased by
over 75%, and steady-state consumption decreases by over 88%.

Patchset 6 adds a needed workaround for a bug in the
AMDMTLBronzeDriver affecting uploads of client-side data, and
therefore some dEQP tests. It also streamlines the aggressive GC.

Bug: angleproject:7544
Change-Id: I81b061f0b33c27fa403527fa12d626f4e9c88ebe
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4497413
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-05-25 18:43:45 +00:00
Mark Lobodzinski
9e47cbd300 Capture/Replay: Rework trace EGLDisplay handling
Refactor the trace-replay EGLDisplay handling to allow
initializing the global EGLDisplay handle in the
InitializeReplay4() body. This included adding
support for eglGetCurrentDisplay() to the EGL-on-
WGL shim.

Test: angle_trace_tests --gtest_filter=infinity_ops
Bug: b/282725258
Change-Id: I2319fd9a35f8fb9c0a7f10547ca39f49ce402b8d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4546267
Reviewed-by: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Mark Łobodziński <mark@lunarg.com>
2023-05-23 23:58:34 +00:00
Geoff Lang
6d3e587004 Metal: Disable Metal support on NVIDIA GPUs
NVIDIA GPUs are in a very small number of Macs and we don't have have
adequate test coverage to properly support them.

Add the disable_metal_on_nvidia feature to control support for NVIDIA
at runtime. Also factor the support of GPU family 1 into a feature.

Bug: angleproject:8170
Change-Id: I160036d710cc9e278eb77e351a483b9f5b69e8ce
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4544659
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
2023-05-23 21:19:55 +00:00
Alexey Knyazev
7abc5248d8 Vulkan: Enable VK_EXT_depth_clamp_zero_one
Replaced the 'depth_clamping' workaround
with the dedicated extension or explicit
fragment depth clamping.

Fixed: angleproject:3970
Bug: angleproject:8077
Change-Id: Ia7666fcb3e0e949922c13a3fd11b818cbc5a8e26
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4545084
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-05-23 17:43:28 +00:00
Brian Ho
ea0b1b7b0e Selectively advertise base vertex and instance fns
On newer Mali GPUs (Valhall), the glDraw*BaseVertex* implementations
seem to be buggy and cause noticable artifacts. Chrome uses the
presence of baseVertexBaseInstanceANGLE and baseInstanceEXT
extensions to determine whether it can draw with a base vertex or to
fallback to manually offsetting the vbo.

This CL disables these extensions on Mali Valhall so that Chrome
takes the fallback path instead to fix the visual artifacts.

Bug: b/280931795
Change-Id: Ic27e37465283ca3338747b53aa7888c7eba4b7b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4549682
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
2023-05-19 21:05:57 +00:00
Roman Lavrov
5c28a74920 Print signal to stdout before calling crash handler
Doesn't fix anything but if deadlock described on the bug happens
locally and stdout is piped to console (or line-buffered file),
it's at least visible that a signal handler was invoked.

Bug: angleproject:8080
Change-Id: I27e1b22cc269082682fd639ef087f1b8b14b26eb
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4544588
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Auto-Submit: Roman Lavrov <romanl@google.com>
Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
2023-05-19 17:37:03 +00:00
Shahbaz Youssefi
b76166d027 Vulkan: Separate image and sampler 2D view of 3D features
The sampler feature is used to determine if EGL_KHR_gl_texture_3D_image
can be exposed.  The image feature is used to support base GLES 3.1
storage images.

Bug: b/274478146
Change-Id: Ifb283633078ace7ee65f8aafe756d0a02b727bd7
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4545005
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-05-19 01:32:44 +00:00
Cody Northrop
ec308b3555 Vulkan: Add feature to limit sample count to 2
This CL adds a feature called `limitSampleCountTo2`.  Using it will
have the Vulkan backend limit max samples to 2.

Why 2?  That's the minimum required in Vulkan to multisample without
error.  Here's an example validation error:

    vkCmdResolveImage: srcImage sample count is VK_SAMPLE_COUNT_1_BIT.
    The Vulkan spec states: srcImage must have a sample count equal to
    any valid sample count value other than VK_SAMPLE_COUNT_1_BIT.
    https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-00257

Using a limit as opposed to forcing a value allows non-multisampling
(sample count of 1) to continue working.

To see how tests fare when the feature is set, see the following test
results that force the value on:
https://chromium-review.googlesource.com/c/angle/angle/+/4534098/4

Test: adb shell setprop debug.angle.feature_overrides_enabled limitSampleCountTo2
Bug: b/279498079
Bug: angleproject:8162
Change-Id: I1df2822709151e6084c32055b5aff444e0b10db5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4518562
Commit-Queue: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Greg Schlomoff <gregschlom@google.com>
Reviewed-by: Charlie Lao <cclao@google.com>
2023-05-16 23:17:32 +00:00
Geoff Lang
b1395bcbac GL: Disable EXT_clip_control on Mali-G72 and G76.
Querying the clip control state from the driver when sychronizing
external contexts generates driver errors.

Simply disable this extension in this configuration for now.
Chrome is currently not using it for rasterization.

This issue was noticed on specific Huawei devices in the wild. It
hasn't been observed on other OEMs.

Bug: chromium:1434317
Change-Id: I88d9bff1933274f61020b75e68aee9c94b0b684a
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4518062
Reviewed-by: Peng Huang <penghuang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
2023-05-11 16:26:30 +00:00
Hailin Zhang
8b9440b630 Vulkan: add option to control pipeline cache data compression.
Bug: b/258207403
Change-Id: I487b1cadbacfa2f7ee889a8f58278307a126a391
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4497248
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Hailin Zhang <hailinzhang@google.com>
2023-05-11 02:26:49 +00:00
Scott Violet
b0f9c01ec3 metal: adds feature that minimizes generated shader differences
This adds a feature (enabled by default) that results in
generating the same code regardless of whether emulateAlphaToCoverage
is enabled or addExplicitBoolCasts. This is done to maximize
cache sharing.

Bug: chromium:1423136
Change-Id: Ia491f13469c750fc2c45aecf1f93fed53b782dc5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4496254
Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
2023-05-09 21:20:43 +00:00
Alexey Knyazev
b7a5714f11 Add polygon mode extension stubs
* Added NV_polygon_mode

* Specified a portable polygon mode extension
  implementable on all ANGLE backends

Bug: angleproject:1791
Bug: angleproject:8132
Change-Id: I018aaaf1fb43ec16910859b152049e02169ede91
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4492684
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2023-05-01 21:21:01 +00:00
Roman Lavrov
8be6700715 Capture/Replay: make failure to load a trace lib more clear
Before this CL, the logs would point to inability to find
SetTraceInfo, which is misleading as the actual issue is that the
library wasn't loaded in the first place.

Error handling is a bit obscure due to mTraceLibrary being set to a
non-null object wrapping a null library so we have to check if
getNative() is null. `loadError.empty()` can't be used to check this
because it's getting set in case of success as well ¯\_(ツ)_/¯

Bug: b/276742336
Change-Id: I90f2184c35461c16d04d6bef6d921706c010fefd
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4492532
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-05-01 18:42:59 +00:00
Scott Violet
3e28121912 Adds feature to output blob cache key and source for shader
Bug: chromium:1423136
Change-Id: Ic03e1b9971b2f1417c0b2e95c8d3846f28a01572
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4480976
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
2023-04-28 14:53:12 +00:00
Cody Northrop
35461e60bd Android: Build traces outside of APK
Our trace list has gotten too large for a single APK (2GB).

To continue supporting compiled traces, we can now place the
libraries in the test application's home directory, which
is discoverable and executable without root.

To build and run with all traces, use `angle_trace_perf_tests`
as your build target, then use the local Android helper script:

$ autoninja -C out/<config> angle_trace_perf_tests
$ (cd out/<config>; ../../src/tests/run_angle_android_test.py \
   angle_trace_tests --filter='*among_us' \
   --verbose --local-output --verbose-logging \
   --fixed-test-time-with-warmup 10)

To continue using bundled libraries, specify your trace list in
GN args using `angle_restricted_traces` and use steps that
match other platforms:

$ autoninja -C out/<config> angle_trace_tests
$ out/Android/angle_trace_tests --gtest_filter='*among_us*' \
   --verbose --local-output --verbose-logging \
   --fixed-test-time-with-warmup 10

Bug: b/276474703
Change-Id: I3829cf7016e21894eee8890e2b0d527e8214f04e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4420279
Reviewed-by: Roman Lavrov <romanl@google.com>
Commit-Queue: Cody Northrop <cnorthrop@google.com>
2023-04-25 22:15:49 +00:00
Yuxin Hu
6deca89e69 Add Spirv Instruction to explicitly cast mediump float to 16 bit
If the GLSL shader code expects the comparison between
two mediump float values returning true, but the SpirV
compiler treats one of them as 32-bit, and treats the
other one as 16-bit, the comparison would return false
instead. The SpirV compiler may not automatically cast
the mediump float values to 16 bits, because it may
utilize the RelaxedPrecision decoration to keep a mediump
float as 32-bit, so that the compiler can avoid the
type cast from 32-bit highp to 16-bit mediump.

This change adds an additional OpQuantizeToF16 SpirV
instruction to explicitly cast mediump float scalar
or mediump float vector to 16 bit, if they are assigned
with a highp float value. This ensures that if the
GLSL shader code ever compares two meiump float values,
the SpirV shader compiler is not accidentally comparing
a 16 bit with a 32 bit float value.

This fixe the deqp test failure on Pixel 6 and Pixel 7:
dEQP-GLES2.functional.shaders.algorithm.rgb_to_hsl_vertex.

Bug: b/274859104
Bug: b/274408172
Change-Id: Ifd996cea14c0f77f45ae90f38c8e53cf5035139f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4400404
Commit-Queue: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-04-18 21:42:19 +00:00
Scott Violet
65f4d2a45c Adds features to enable loading/saving metallibs to blobcache
CompileMetalShaders results in the appropriate command line tool
being run to generate metallib blobs from shader source.

DisableProgramCaching results in not saving programs to BlobCache

LoadMetalShadersFromBlobCache results in trying to load metallibs
from BlobCache.

Bug: chromium:1423136
Change-Id: I01a4d7a5d60ed5ac978fb99db01b741e0f19e76b
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4434293
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
2023-04-18 17:45:20 +00:00
Alexey Knyazev
7bc4b7e31f Metal: Implement OES_sample_variables
New ESSL built-ins are mapped to their Metal
counterparts and tweaked to follow OpenGL ES
semantics when needed.

Fixed A2C interaction with sample coverage
by emulating the former on non-Apple GPUs.

Bug: angleproject:8097
Fixed: angleproject:5087
Change-Id: I5d28a941af5cbc14743a3930731529f11f55febd
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4404896
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Kyle Piddington <kpiddington@apple.com>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2023-04-15 01:32:19 +00:00
Roman Lavrov
4e07335654 Trace Interpreter: gzip cpp and run gold tests.
New test step:
angle_restricted_trace_gold_interpreted_tests
similar to existing
angle_restricted_trace_gold_tests

but runs a subset of newest traces that have the right format.
Currently there are 8 of them and the filter is hard-coded in
test_suites.pyl. rise_of_empires can also be run interpreted but
happened to flake during testing so it's not included for now.

Trace cpp files are concatenated and gzipped
as a build step producing gen/tracegz_{trace}.gz
and these gz files are then distributed as part of the build

--trace-interpreter flag changes from boolean to string to support:
--trace-interpreter=gz:
* this uses the gz file above
* gold tests added in this CL use this option

--trace-interpreter=c:
* using uncompressed c/cpp file
* existing angle_trace_interpreter_tests runs a retrace
  saving .c files and uses this option

Bug: b/276742336
Change-Id: I69544f25bda873af191978195d02ffbdd34363c0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4424690
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Roman Lavrov <romanl@google.com>
2023-04-14 22:48:37 +00:00
Roman Lavrov
aac847223d Trace Interpreter: Allow running .cpp traces, not only .c
.cpp vs .c is just the file extension, what actually matters is the
trace format in which the trace was captured. For instance, fishdom is
.cpp but can be run interpreted as is:

    out/Debug/angle_trace_tests --gtest_filter=TraceTest.fishdom --trace-interpreter

Bug: b/276742336
Change-Id: I41b2bbc5ffe5ac7449913412b3eceb5c916b3803
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4423870
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Auto-Submit: Roman Lavrov <romanl@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-04-13 23:32:51 +00:00
Roman Lavrov
2c7f31af6f Trace Interpreter: Move to a shared library.
Based on https://crrev.com/c/4178024 but does only one thing:
makes trace interpreter a shared library (as if it was a compiled trace)

I am not sure what impact this actually has on the TracePerfTest
callbacks (mentioned in the CL above) as I see onEglMakeCurrent callback
getting called without this CL as well. Anyways, this makes things a bit
more consistent.

* Gets rid of TraceReplayInterface
* TraceInterpreter is now an implementation detail
* Need to additionally pass list of trace files to TraceLibrary
(new SetTraceInfo replay export)
* GetResourceIDMapValue is just moved as is to the right lib

Bug: b/276742336
Change-Id: I67ea9fbcb4f7db999ab71c8443ea91c5631df942
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4423869
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-04-13 21:37:38 +00:00
Jamie Madill
735fb48079 Trace Interpreter: Support \\ escape sequences.
This enables the 'catalyst_black' trace.

Cloned from https://crrev.com/c/4178022

Bug: b/276742336
Change-Id: I9df703150504e7fcf4e18ff0a538aa3f6caddfdb
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4423269
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-04-13 19:19:21 +00:00
Shahbaz Youssefi
c26011b866 Vulkan: Make advanced blend alpha div workaround permanent
This workaround turned out to affect pretty much every driver, and
numerous GL implementations were found to work around it similarly to
ANGLE.  It seems like this workaround may only be necessary for
colorburn and colordodge, but for now ANGLE applies it to all modes.

Bug: b/274528004
Bug: b/277777623
Change-Id: Id555c981a9775f949a3022b7e92c755accea7cea
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4416158
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-04-13 02:40:41 +00:00
Kimmo Kinnunen
f507fe05cd Rename PLATFORM_IOS to PLATFORM_IOS_FAMILY
The current define ANGLE_PLATFORM_IOS actually means
"iOS or tvOS or WatchOS or MacCatalyst".
The current define ANGLE_PLATFORM_WATCHOS means nothing.
The current define ANGLE_PLATFORM_APPLETV means nothing.

Replace PLATFORM_IOS and its uses with PLATFORM_IOS_FAMILY, so that
then PLATFORM_IOS can be reintroduced and others can be fixed.

Replace PLATFORM_IOS_SIMULATOR and its uses with
PLATFORM_IOS_FAMILY_SIMULATOR for consistency.

Use consistent `#if X` notation instead of `#if defined(X)`.

Bug: angleproject:8121
Change-Id: Ibe668c2ae9bb801d15e036fcf1dfd53f22c30787
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4404161
Reviewed-by: Dan Glastonbury <djg@apple.com>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>
2023-04-12 10:42:44 +00:00
Jamie Madill
f093a9b346 Trace Interpreter: Support gClientArrays
Needed to run cut_the_rope, fishdom, other traces.

Add cut_the_rope and fishdom to interpreter CI.

CL cloned from https://crrev.com/c/4178021

Bug: b/276742336
Change-Id: If7da78ba3fd7c19262692d1386c5eaa47df2ca6c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4415246
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Auto-Submit: Roman Lavrov <romanl@google.com>
Commit-Queue: Roman Lavrov <romanl@google.com>
2023-04-11 23:05:59 +00:00
Roman Lavrov
cef7dcbf52 Trace Interpreter: support harry_potter_hogwarts_mystery
Handling of calls like:
glGetBooleanv(GL_DEPTH_WRITEMASK, (GLboolean *)gReadBuffer);
glGetFloatv(GL_DEPTH_CLEAR_VALUE, (GLfloat *)gReadBuffer);

Add interpreted test to CI.

Bug: b/276742336
Change-Id: Iae3ff9035044461ca1a208980c170d5d48d1a424
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4416166
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
2023-04-11 21:46:27 +00:00
Ian Vollick
9199e77d26 [ios] simulator fixes for angle_unittests
Disables some tests that do not currently work in the
iOS simulator.

Bug: angleproject:8116
Change-Id: I66bb9a6e2a5d10a567824e9fac163e7fd6b6a474
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4393495
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Kenneth Russell <kbr@chromium.org>
2023-04-04 22:47:32 +00:00
Maksim Sisov
746798b2da Allocate buffer via malloc for demangle.
abi::__cxa_demangle requires that the output buffer passed for
demangling is malloced according to the documentation as (quote) -
"If output_buffer is not long enough, it is expanded using realloc".

Not doing that results in raising exceptions and calling the
angle's exception handler recursively many times. That results
in a huge stacktrace as a result, which is printed until the
program is terminated.

Bug: angleproject:8111
Change-Id: I7ddd1a623b55fef2c8b15f40136312dd0ff4ccaf
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4386396
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-04-04 16:15:27 +00:00
Shahbaz Youssefi
3aea3cfd1a Vulkan: Workaround depth bias constant factor on ANV
Bug: b/249380591
Change-Id: Iaeda7faf5eb40e0e2086674d3e63bf5bc9911ab4
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4392893
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-04-04 01:56:36 +00:00
Geoff Lang
f1f80e1e3f Metal: Always prefer staged GPU uploads for textures.
Uploading Metal texture data via MTLTexture::replaceRegion is a source
of lots of CPU hangs and jank. There may be better heuristics to
determine if we should do a CPU vs GPU upload but for now preferring
GPU uploads has better overall performance.

This also improves the MotionMark images test:
 - 40 -> 100 when using Metal.
 - 217 -> 235 when using Metal +
    https://chromium-review.googlesource.com/c/chromium/src/+/4091749

Bug: angleproject:8024, angleproject:8092, angleproject:8109
Change-Id: I36b5f585884391b4cc416365ae65f8542745beee
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4264963
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
2023-04-03 18:56:52 +00:00
Yuxin Hu
29abd5a295 Explicitly Add Aliased Memory Decoration in SpirV
In GLSL, aliased memory qualifier is implicitly available,
unless we explicitly specify the memory is restrict:
https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Memory_qualifiers.

However, in SpirV, aliased memory qualifier has to be
explicitly specified:
https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#AliasingSection

This change adds the aliased memory decorations to SSBO
if the GLSL does not specify the restrict memory qualifier.

This is a temporary workaround to fix the deqp test failures
on some android devices. Eventually we would like to waive this
test for ANGLE due to alised memory in Vulkan does not suppose
to affect SSBOs that have different set/binding, please refer
to this Khronos ticket for more details:
https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/4321

Bug: b/266235549
Change-Id: Ic7afc417a5d421664b60e0413a011314787e14e7
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4312130
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-03-29 19:56:11 +00:00
Shahbaz Youssefi
97897d92dc Vulkan: Work around driver bug with dynamic primitive restart
This CL forces the state to be static on buggy drivers.

Bug: b/275210062
Change-Id: Ia3391ecb19c3c9d19c05a83e11da8c718513a4e2
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4374104
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@google.com>
2023-03-29 15:26:32 +00:00