Commit Graph

1053 Commits

Author SHA1 Message Date
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
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
Scott Violet
059bfe8909 metal(ish): Adds platform function for logging cache hits/misses
And adds call from metal.
This way chrome can log overall cache stats.

Bug: chromium:1423136
Change-Id: Iba5b3bd138adf15fe5e999d3dee0002f140edac1
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4484260
Commit-Queue: Scott Violet <sky@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
2023-04-28 13:43:45 +00:00
Alexey Knyazev
d37c97d18a Metal: Implement OES_shader_multisample_interpolation
* Added support for sample qualifier
  and shader interpolation functions

* Added MSL-specific AST transformations

* Adjusted minimum fragment interpolation offset state
  query test so that accurate limits could be reported

* Drive-by: Y-flip gl_SamplePosition adjustment

* Renamed ANGLESampleMaskEnabled function constant to
  ANGLEMultisampledRendering to correctly reflect its
  usage

Bug: angleproject:8097
Bug: angleproject:8131
Change-Id: I25c9f36487e29f05bb9fe874e146d06378fef975
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4440827
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2023-04-25 22:56:56 +00:00
Vikas Soni
b5fa872897 Add extension to skip texture renderability validation in ANGLE.
Add a new extension to skip the texture renderability
validation in ANGLE.

Bug: angleproject:0000
Change-Id: Ia9e5a1eff233f5aced4706b7d3c183058d474c41
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4455549
Auto-Submit: vikas soni <vikassoni@chromium.org>
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: vikas soni <vikassoni@chromium.org>
2023-04-25 22:28:47 +00:00
Kimmo Kinnunen
20b6624a88 Metal: Support compiling on iOS without EAGL
Makes EAGL and CGL compilation exclusive to each other. Catalyst would
compile with both on ARM64, but only use EAGL.

Remove use of GLSL generation in MSL. Generating GLSL for MSL
compute and geometry shaders do not make sense.

Remove compilation of RewriteRowMajorMatrices for Metal.
It was removed from Metal in:
  b23bf47c9e
  Reland "Metal: rewrite default uniforms and uniform blocks"

Remove use of ANGLE_ENABLE_APPLE_WORKAROUNDS and gn variable
angle_enable_apple_translator_workarounds. The workarounds are just
unconditional business-as-usual implementation of ANGLE when ANGLE is
compile for PLATFORM_APPLE.

Fixed: angleproject:8129
Change-Id: I3af249708803fba816e2a7c92c35dddb84ce6946
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4428875
Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com>
Reviewed-by: Kyle Piddington <kpiddington@apple.com>
Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>
Reviewed-by: Dan Glastonbury <djg@apple.com>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
2023-04-19 09:22:51 +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
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
Shahbaz Youssefi
8b79410b5f Vulkan: Treat readonly SSBOs as readonly!
Instead of assuming SSBOs are always written to, this change adds
plumbing for the backend to know when an SSBO is declared readonly and
marks the buffer readonly accordingly.

With this change, BufferVk can optimize uploads and copies to and from
the buffer with the knowledge that it can be safely mapped on the CPU
for read while it's being used by the GPU.

Bug: b/276002151
Change-Id: I75342148c07949a83436054a738395bbd88caec5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4392720
Reviewed-by: Charlie Lao <cclao@google.com>
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-04-04 18:34:43 +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
Alexey Knyazev
1ee27fcdbf Fix translation of noperspective interpolation qualifier
Auxiliary storage qualifiers used with 'noperspective'
interpolation must be retained during ESSL translation

* Added new qualifiers:
  * EvqNoPerspectiveCentroid
  * EvqNoPerspectiveCentroidIn
  * EvqNoPerspectiveCentroidOut
  * EvqNoPerspectiveSample
  * EvqNoPerspectiveSampleIn
  * EvqNoPerspectiveSampleOut

* Adjusted GLSL and SPIR-V output

* Adjusted 'sample' rank to be the same as 'centroid'

Fixed: angleproject:4388
Change-Id: Iffc80a7a3b057beffd3bcbbc9446eeed77183c99
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4368471
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2023-03-27 22:53:35 +00:00
Kramer Ge
888ca8d9e3 Bind FBO before timer query on Mali GL driver.
glBeginQuery(GL_TIME_ELAPSED/GL_TIMESTAMP) on Mali implementation
assumes a complete FrameBuffer. Without it glGetQueryObject will return
a meaningless value, causing some applications to misbehave.

This workaround caches and binds a default FBO in this case.

Bug: chromium:1356053,b/269068358
Change-Id: I756ded948c2c5aada744f9dd428ad77c37a009c6
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4359032
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Kramer Ge <fangzhoug@chromium.org>
2023-03-22 16:49:48 +00:00
Alexey Knyazev
ad52f12e59 Implement EXT_conservative_depth
Added translator frontend and GLSL backend
support for gl_FragDepth redeclaration and
layout qualifiers.

Added mappings to DepthGreater, DepthLess,
and DepthUnchanged SPIR-V execution modes.

Bug: angleproject:8046
Change-Id: I23f19ff54380741107970a44055ea269eef179f6
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4355028
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-03-22 16:41:58 +00:00
Chris Dalton
a491bbe3bb Add PLS utilities for interrupting a rendering pass
Adds two more simple commands to ANGLE_shader_pixel_local_storage that
allow WebGL and the command buffer to interrupt rendering passes without
having to either (1) make expensive queries, or (2) track lots of
complex state for validation that they are not currently equipped to
track.

Bug: chromium:1421437
Change-Id: I80eaef3ae6b0b4bbbecb9cd2268ac90b43675d1c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4355032
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Kenneth Russell <kbr@chromium.org>
2023-03-21 21:45:35 +00:00
Chris Dalton
513ca72369 Delete GL_LOAD_OP_DISABLE_ANGLE from PLS
This load op makes the PLS spec and WebGL implementations unnecessarily
complex.

Bug: chromium:1421437
Change-Id: Iab02a8b02083899c6cc345ecb25b88c5871611c9
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4335148
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Chris Dalton <chris@rive.app>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-03-14 15:03:44 +00:00
Chris Dalton
b468e4dd03 Add back "non-robust" PLS queries
Chrome doesn't have a codegen template for queries that model the
"robust" signature, so support both types.

Specify that the robust variants are only supported if
ANGLE_robust_client_memory is supported, so Chrome and other
implementations don't have to support them.

Bug: chromium:1421437
Change-Id: Icc69b69ce9ce0a2cfad0dbeed1f3b29bcfa92d20
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4321867
Commit-Queue: Chris Dalton <chris@rive.app>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-03-10 17:16:01 +00:00
Dan Glastonbury
aa5b97de88 ANGLE_metal_shared_event_sync: Control signaling external events
It was assumed that the external MTLSharedEvent passed to eglCreateSync
should be signaled by the GL. This change adds
EGL_SYNC_METAL_SHARED_EVENT_SIGNALED_ANGLE, which when passed as the
value for EGL_SYNC_CONDITION during eglCreateSync, changes the behavior
to not insert a fence command into the command stream.

Test: angle_end2end_tests --gtest_filter=EGLSyncTestMetalSharedEvent.AngleMetalSharedEventSync_WaitSync_ExternallySignaled
Bug: angleproject:8064
Change-Id: Ia1b8615b976f293d411b7d2be506b0ac87d64dee
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4307152
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Commit-Queue: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org>
2023-03-09 01:42:53 +00:00
Chris Dalton
a65f6a9dfe Make PLS queries robust
There's no reason not to mirror the ANGLE_robust_client_memory API here.

Bug: chromium:1421437
Change-Id: Ifb8b1a9675abe2ceb35272dc905f3c38f29dceda
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4317485
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Chris Dalton <chris@rive.app>
2023-03-08 06:43:21 +00:00
Alexey Knyazev
4256c02245 Metal: Implement ANGLE_stencil_texturing
Used texture views to sample stencil values
from combined depth/stencil textures.

Texture2DDepthStencilTestES3.TexSampleModes* tests
were split into swizzled and non-swizzled variants
to suppress only swizzled cases on some platforms.

Added a new avoidStencilTextureSwizzle workaround to
skip creating swizzled texture views of stencil-only
textures on platforms that fail to sample from them.

Fixed: angleproject:8051
Change-Id: I0b1148f8d30fc6459239efcdaeee6c0364633cc8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4304058
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-03-07 17:16:56 +00:00
Igor Nazarov
4f87f4e925 Vulkan: Add useResetCommandBufferBitForSecondaryPools feature.
Currently ANGLE does not use "vkResetCommandBuffer()" on Vulkan
Secondary Command Buffers. Instead it uses "vkFreeCommandBuffers()" and
"vkAllocateCommandBuffers".

According to spec, "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT" is
required only for command buffer reset operations.

However, some ARM drivers may not free memory in
"vkFreeCommandBuffers()" without this flag.

Bug: angleproject:8059
Change-Id: Ibfe45bca345dc48484b625c450369d30805cec77
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4306722
Reviewed-by: Charlie Lao <cclao@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Igor Nazarov <i.nazarov@samsung.com>
2023-03-06 19:06:29 +00:00
Alexey Knyazev
3fed0866a8 Implement EXT_texture_mirror_clamp_to_edge
Support GL_MIRROR_CLAMP_TO_EDGE_EXT address
mode when native support is available.

Adjusted validation, sorted switch cases by
target enums order.

Added new TextureMirrorClampToEdge* end2end
tests.

Drive-by: fixed texture address computation
for integer formats with GL_MIRRORED_REPEAT
on D3D11.

Fixed: angleproject:7968
Change-Id: Iaf29c8b4b32a7630c2a871f832d171f4bc4e2672
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4289137
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuxin Hu <yuxinhu@google.com>
2023-03-03 05:30:44 +00:00
Alexey Knyazev
a2efea13c9 Add ANGLE_stencil_texturing
This extension allows texturing of the stencil
component of a packed depth stencil texture on
OpenGL ES 3.0 contexts.

Trivially exposed on backends that support
OpenGL ES 3.1, which requires this feature.

Adjusted the tests to check for the new
extension string instead of the context
version.

Bug: angleproject:8051
Change-Id: I4d833acbc72e7374bde91d4c861598a0fdaf9b90
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4295312
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2023-03-01 18:17:38 +00:00
Charlie Lao
6d282d62b3 Vulkan: Move retireFinishedCommands/garbageCleanup to worker thread
This CL separate out the logic of mLastCompletedQueueSerial update and
retireFinishedCommands and garbage clean up into different functions. At
submission, previously we are always check fence and update
mLastCompletedQueueSerials and calling reset on finished commands and do
garbage clean up. With this CL, we only do the fence check and update
mLastCompletedQueueSerials. Then it request worker thread to do the
command buffer reset and garbage cleanup. We uses the CommandProcessor's
thread for the reset and cleanup, since async submission path needs to
handle this clean up anyway.

This CL also added a new feature flag asyncCommandBufferReset and it is
disabled right now. This will be enabled in the follow up CL.

Bug: b/255411748
Change-Id: I6da558f8d4c962eb038e2378ccc76c464101cde2
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4244823
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Auto-Submit: Charlie Lao <cclao@google.com>
Commit-Queue: Charlie Lao <cclao@google.com>
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
2023-02-28 19:17:06 +00:00
Alexey Knyazev
a1f9b9aaa6 Implement more texture border color adjustments
D3D11:
* Exposed EXT_texture_border_clamp extension string,
  to ensure that the relevant CTS tests are running.

* Updated StateManager11::setSamplerState to adjust
  the border color based on the texture format.

* Refactored ShaderConstants11::updateSamplerMetadata to
  correctly adjust the border color for integer formats.

* Removed unused SamplerMetadata.internalFormatBits

D3D9:
* Updated Renderer9::setSamplerState to adjust the border
  color value based on the current texture format.

* Added borderColorSrgb feature required for some drivers.

GL:
* Copy alpha value to green for A and LA legacy formats to
  workaround driver bugs when lumaWorkaround is not used.

Tests:
* Added ES 2.0 tests for texture formats
  that require border color adjustments.

Fixed: angleproject:7969
Change-Id: I3d36cce43e76e6d5069a51865152c2250ecbb017
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4291000
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-02-28 03:59:22 +00:00
Amirali Abdolrashidi
3a7904e137 Vulkan: Use VMA suballocation for images
There is a maximum limit for device memory object allocation. On some
platforms, there can be an error regarding too many object allocations
when 4096 device memory handles have been allocated. Suballocation can
help mitigate this issue. In this CL, some images will be allocated
using VMA API calls, which use suballocation.

* Added a new feature (useVmaForImageSuballocation).

  * Added VMA allocation for ImageHelper, which is used in initMemory().

    * Suballocation is used for VMA image allocation.

    * If enabled, mVmaAllocation will be initialized in the ImageHelper
      object (instead of mDeviceMemory).

  * It is currently used for all platforms.

* Minor change to the name of an arg in CreateBuffer() declaration.

* Added test to make sure we can allocate at least 4096 images on
  supported platforms (8000 in the test).

* Skipped the test "NonZeroBaseEmulatedClear" when run on Linux/Intel
  if this feature is enabled (due to output color mismatch).

* Skipped several tests for capture/replay on Windows.

Bug: b/218891184
Change-Id: Ibf80c9c8c485b301da7d23b5ba4bcbb1a8e3194f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4191202
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
2023-02-23 20:17:15 +00:00
Jonah Ryan-Davis
8105a8010a Change enum allocation for EGL_PLATFORM_ANGLE_DISPLAY_KEY_ANGLE
Changes EGL_PLATFORM_ANGLE_DISPLAY_KEY_ANGLE from 0x34DA to 0x34DC

Bug: chromium:1251724
Change-Id: I609d37abd622bf0c3bbab253d4d0dea31edd1774
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4287264
Commit-Queue: Jonah Ryan-Davis <jonahr@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-02-23 16:37:19 +00:00
Jonah Ryan-Davis
13e8dabc47 Add EGL_PLATFORM_ANGLE_DISPLAY_KEY_ANGLE
To allow the creation of multiple EGLDisplays on the same graphics
device, we need a value to key for the display cache. When the
display key is specified, the cache will return a new display for
that key, even if there is an existing display on the same graphics
device.

Bug: chromium:1251724
Change-Id: I55e169776770734fc33b8bc8e1265ea6f7472fe3
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4255730
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
2023-02-15 20:45:15 +00:00
Geoff Lang
5a77200b3b Metal: Implement parallel shader linking.
Update the Metal library cache to be thread safe. Change
absl::flat_hash_map back to std::unordered_map because the value types
now contain a mutex which must not move.

Only generate async compilation tasks for shaders that were not already
compiled and in the cache.

Collapse some of the link methods in ProgramMtl that only had one call
site. All linking is now done in ProgramMtl::link and
ProgramMtl::load.

Support disabling parallel linking using the new
enableParallelMtlLibraryCompilation feature.

Bug: chromium:1385510
Change-Id: I71ba71a34d994066729df7e4170911f88c89de4a
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4234153
Reviewed-by: Quyen Le <lehoangquyen@chromium.org>
Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
2023-02-14 22:05:11 +00:00
Kenneth Russell
ee64836f70 Revert "Metal: Optimized BufferSubData per device"
This reverts commit 968041b547.

Includes the following patches:

git revert -n 995db1f66b \
  9a6c90c8f8 \
  dbd47e3785 \
  369b320f92 \
  4abae6f975 \
  968041b547

Several conflicts with top-of-tree were resolved during this revert.

The aim is to reland this with additional code which will reduce the
amount of excess buffer memory allocated, and release the resources
associated with temporary buffer allocations.

Bug: angleproject:7544
Change-Id: Ib7a6bc2ab1c2f23cb43112cd980106e2898c3826
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4240556
Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com>
Reviewed-by: Gregg Tavares <gman@chromium.org>
Commit-Queue: Kenneth Russell <kbr@chromium.org>
2023-02-14 05:13:17 +00:00
Shahbaz Youssefi
54951da226 Vulkan: Refactor extension vs core version checks
Extensions are now grouped based on promotion-to-core status, and
initialization code is generally cleaned up.  ANGLE currently doesn't
attempt to use a core version above Vulkan 1.1, as extensions are always
assumed to be exposed even if promoted to core in later versions.

With this change, it would be simpler to use a newer core version if
ever necessary.

Bug: angleproject:7959
Change-Id: Ia5fd3e06c18f7289e9e5a63af0f039a6dc89c687
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4224582
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Ian Elliott <ianelliott@google.com>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-02-13 16:09:49 +00:00
Shahbaz Youssefi
b38467147b Vulkan: Feature to make async queue slow for testing
Bug: angleproject:6746
Change-Id: I2573cae2dcf42d177168c55bc2a6d8bb012dde18
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4227986
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
2023-02-07 21:05:22 +00:00
Geoff Lang
9b00af5260 Metal: Add an in-memory MTLLibrary cache.
Add a small cache for (msl + compile parameters) -> MTLLibrary at the
egl::Display level. In regular executions of Chrome, the same shaders
(particularly vertex) are compiled multiple times in different programs.

Tested for a regular Chrome startup + open wikipedia + motionmark 1.2:
112/282 (40%) cache hits.

Several different caching methods were profiled (LinkProgram perf test)
 - struct key with std::map                             : 303309
 - struct key with std::unordered_map                   : 308090
 - binary blob key with std::map                        : 263595
 - binary blob key with std::unordered_map              : 286051
 - struct key + is_transparent with std::unordered_map  : 304877
 - struct key + is_transparent with absl::flat_hash_map : 335686

Using is_transparent allows us to search the hash map without
copying the shader source string to construct the key structure.

Bug: chromium:1385510
Change-Id: Ieec4ba526fe286276a4af7114d89cde32a8f9e1d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4214012
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
2023-02-02 20:35:03 +00:00
Mohan Maiya
1d9b8d802e Reland "Add support for glShaderBinary"
This is a reland of commit 228973e731
with the following fixes -

1. Apply patch from Yuly to fix chromium build errors
2. Fix ShaderBinaryTest instantiation call
3. Add ShaderBinaryTest to expectations file for IOS

Original change's description:
> Add support for glShaderBinary
>
> This patch adds the following -
> 1. ANGLE_shader_binary extension and GL_SHADER_BINARY_ANGLE token.
> 2. Compiler support to generate shader binaries.
> 3. Update compiler to use SH_SPIRV_VULKAN_OUTPUT as output type for
> Vulkan translator.
> 4. Support to load GL_SHADER_BINARY_ANGLE binaries.
> 5. end2end tests for glShaderBinary.
>
> Tests: ShaderBinaryTest*
> Bug: angleproject:7833
> Change-Id: I191d5ba7c4d5304696f5e743c851dc945fa57858
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4137306
> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
> Commit-Queue: mohan maiya <m.maiya@samsung.com>
> Reviewed-by: Charlie Lao <cclao@google.com>

Bug: angleproject:7833
Change-Id: I21135c52e2bae955342a99aff5631ba0e687eff1
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4195852
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
2023-01-27 00:27:14 +00:00
Geoff Lang
18657894ba Add features to dump and replace shader source.
dump_shader_source writes shader source strings to files named
with the hash of the source and shader type.

enable_shader_substitution allows subsituting the shader source
with the strings contained in a file. The same file naming scheme
as dump_shader_source is used so shaders can be dumped in one run,
modified and subsititued in the next run.

Use the ANGLE_SHADER_DUMP_PATH and debug.angle.shader_dump_path
environment variables to control where files are written. If they
are unspecified, write to the temp directory.

Based upon Cody's CLs:
https://chromium-review.googlesource.com/c/angle/angle/+/2755841
https://chromium-review.googlesource.com/c/angle/angle/+/3961670

Bug: angleproject:7760, chromium:1385510
Change-Id: I43b9827b977079b88daa794e867637f7a126b080
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4192347
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
2023-01-26 16:54:28 +00:00
Yuly Novikov
0c9cbf39f5 Revert "Add support for glShaderBinary"
This reverts commit 228973e731.

Reason for revert: breaks compile on ANGLE into Chromium roll
https://cr-buildbucket.appspot.com/build/8790942326644064097
https://cr-buildbucket.appspot.com/build/8790942759045412865
https://cr-buildbucket.appspot.com/build/8790942417069789217
Leaks detected on ASAN
https://cr-buildbucket.appspot.com/build/8790946657703508337

Original change's description:
> Add support for glShaderBinary
>
> This patch adds the following -
> 1. ANGLE_shader_binary extension and GL_SHADER_BINARY_ANGLE token.
> 2. Compiler support to generate shader binaries.
> 3. Update compiler to use SH_SPIRV_VULKAN_OUTPUT as output type for
> Vulkan translator.
> 4. Support to load GL_SHADER_BINARY_ANGLE binaries.
> 5. end2end tests for glShaderBinary.
>
> Tests: ShaderBinaryTest*
> Bug: angleproject:7833
> Change-Id: I191d5ba7c4d5304696f5e743c851dc945fa57858
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4137306
> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
> Commit-Queue: mohan maiya <m.maiya@samsung.com>
> Reviewed-by: Charlie Lao <cclao@google.com>

Bug: angleproject:7833
Change-Id: Ice19576acbc1351810ff0cd769ac17ad6c0abdf3
No-Try: true
No-Presubmit: true
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4197375
Auto-Submit: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
2023-01-26 12:15:06 +00:00
Mohan Maiya
228973e731 Add support for glShaderBinary
This patch adds the following -
1. ANGLE_shader_binary extension and GL_SHADER_BINARY_ANGLE token.
2. Compiler support to generate shader binaries.
3. Update compiler to use SH_SPIRV_VULKAN_OUTPUT as output type for
Vulkan translator.
4. Support to load GL_SHADER_BINARY_ANGLE binaries.
5. end2end tests for glShaderBinary.

Tests: ShaderBinaryTest*
Bug: angleproject:7833
Change-Id: I191d5ba7c4d5304696f5e743c851dc945fa57858
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4137306
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: mohan maiya <m.maiya@samsung.com>
Reviewed-by: Charlie Lao <cclao@google.com>
2023-01-25 22:13:01 +00:00
Shahbaz Youssefi
ffbb65bc9e Vulkan: Use VK_EXT_swapchain_maintenance1 for present fences
Bug: angleproject:7878
Change-Id: Ic3a43c663789a6489cff261848d9ad4a408ca53a
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4088905
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Charlie Lao <cclao@google.com>
Reviewed-by: Ian Elliott <ianelliott@google.com>
2023-01-19 20:13:01 +00:00
Dan Glastonbury
bf5a007afc Metal: Ensure render pass has at least one valid render target.
Extend MTLRenderPipelineDescriptor validation to ensure that there is at
least one valid render target set for the the render pipeline. This is
required for certain families of metal devices to avoid a validation
failure inside the metal framework. Moving the failure here will cause
the app using ANGLE to return a GL error instead of crashing the
process.

Bug: angleproject:7436
Change-Id: I594d92492a22a61a720dbe7021843c8460b389b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4109310
Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com>
Commit-Queue: Kyle Piddington <kpiddington@apple.com>
2023-01-19 02:45:23 +00:00
Shahbaz Youssefi
5d1ac2e0d5 Add missing include to ShaderVars.h
Patch by mcatanza@redhat.com

Bug: angleproject:7963
Change-Id: I1466ab227ae4e8b5703bd68bafbf12c31d441c2e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4174172
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
2023-01-17 23:41:03 +00:00
Qin Jiajia
e58e77f52b Support timestamp behind flag enableTimestampQueries
All timestamp queries happen in the same disjoint query in one
Context11.

The whole design is that we start a disjoint query in D3D11 at the first
timestamp request and keep it continuously running in current context.
Only end it and read it back when the user queries if there is a
disjoint. We cache the frequency and assume it doesn't change. For the
first timestamp, we create a temporary D3D disjoint query and end it so
we have a frequency to convert the ticks to nanoseconds.

This task is taken over from
https://chromium-review.googlesource.com/c/angle/angle/+/3694732

Bug: angleproject:7367
Change-Id: I747c9b00e10ac58362df66332efd01a24aa395f2
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4021139
Commit-Queue: Jiajia Qin <jiajia.qin@intel.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
2023-01-13 10:21:07 +00:00
Alexey Knyazev
067ace47d0 Add ANGLE_clip_cull_distance extension
Added an extension spec.

Trivially exposed it on GL, Vulkan, and D3D11.

Adjusted tests and validation to allow no cull
distance support for this extension string.

Removed extra built-in variable definitions.

Bug: angleproject:7904
Change-Id: Ic60772dfe28132c316eaa29aadc1afd66e3b0fa7
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4114290
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2022-12-23 01:57:59 +00:00
Shahbaz Youssefi
301ed54556 Vulkan: Pass context to layout getters
In preparation for a change that optionally uses read/write
depth/stencil layouts.  Context is used to test for the
supportsMixedReadWriteDepthStencilLayouts feature to know whether those
layouts are supported or that a fallback must be chosen.

Bug: angleproject:7899
Bug: b/192477489
Change-Id: I1453dc9d060453a3806ad0f261b94368fe01fb29
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4116735
Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Reviewed-by: Charlie Lao <cclao@google.com>
Commit-Queue: Charlie Lao <cclao@google.com>
2022-12-21 23:06:42 +00:00
Alexey Knyazev
91a5635a2e Support arbitrary clip and cull distance array sizes
Removed limitSimultaneousClipAndCullDistanceUsage cap.

Enhanced HLSL translator to support all valid combinations
of clip and cull distances.

Validate that these arrays are sized explicitly or by using
only constant indices; adjusted link program error message.

Enhanced tests to cover all possible combinations of
implicit and explicit array sizes for both built-ins.

Bug: angleproject:4452
Change-Id: I704db6dc3c8951e5ba482a3e4dad09e5b0182f9c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4111645
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
2022-12-20 06:04:32 +00:00