src/libANGLE/renderer/metal/ContextMtl.mm


Log

Author Commit Date CI Message
Alexey Knyazev 239ef680 2024-11-21T00:00:00 Metal: Support ANGLE_texture_multisample * Added explicit multisample texture creation support * Added support for SAMPLE_MASK frontend state * Adjusted Metal backend caps Fixed: angleproject:380475003 Change-Id: I90250e14da52869cb954b5a61d9c670e958a526c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6048958 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Dan Glastonbury a0126d55 2024-09-06T11:58:58 Metal: Clear mRenderPassesSinceFlush to avoid infinite recursion When there is more than kMaxRenderPassesPerCommandBuffer render passes with active occlusion query, it's possible for the Metal backend to end up in infinite recursion of the following call sequence: `ensureCommandBufferReady` -> `flushCommandBufferIfNeeded` -> `flushCommandBuffer` -> `endEncoding` -> `endRenderEncoding` -> `prepareRenderPassVisibilityPoolBuffer` -> `getBlitCommandEncoderWithoutEndingRenderEncoder` -> `ensureCommandBufferReady` This recursion is caused by the checks in flushCommandBufferIfNeeded not being disarmed once the flush has started and is most likely caused by |mRenderPassesSinceFlush| exceeding |kMaxRenderPassesPerCommandBuffer|. This change moves the clearing of |mRenderPassesSinceFlush| to the top of of `flushCommandBuffer`, before any calls to `endEncoding`, breaking the need to call `flushCommandBuffer` via `getBlitCommandEncoderWithoutEndingRenderEncoder`. Additionally, |OcclusionQueryPool::mUsed| is set to false before the results are cleared. This will also break the recursion and is added for the `mCmdBuffer.needsFlushForDrawCallLimits` case in `flushCommandBufferIfNeeded`. Change-Id: Ib54c0a87ae9c5365ae56d487b6bef99b681d9f59 Fixed: chromium:362791944 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5839224 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Kimmo Kinnunen 8b8b3d4d 2024-09-02T21:04:11 Metal: Flush with NoWait on iOS when hitting renderpass count limits Avoid deviating between iOS and macOS in this regard. The behavior should be the same for the caller as well as the implementation. Bug: chromium:1466696 Bug: angleproject:363984104 Change-Id: I39160bcc0a54ea9c767e1109d80cb4d71ecdf207 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5830799 Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev 3f5ede8f 2024-08-20T00:00:00 Metal: Remove obsolete availability macros from context MTLSharedEvent * macOS 10.14 (min deploy 10.15) * iOS/tvOS 12.0 (min deploy 15.0) MTLDevice.hasUnifiedMemory * macOS 10.15 (min deploy 10.15) * iOS/tvOS 13.0 (min deploy 15.0) Bug: angleproject:360147119 Change-Id: I8c7e09b1fd9d16cf2bc9dcdca50a7fe577ad25a2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5816833 Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Alexey Knyazev 8cfb9ea2 2024-08-20T00:00:00 Metal: Align OS macro usage Consistenty used TARGET_OS_* macro instead of ANGLE_PLATFORM_* in the Metal backend code for better searchability. Bug: angleproject:360147119 Change-Id: I754ddc158daa6b1894b0b4fb0489d59f14605b66 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5816828 Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev a36c459e 2024-08-20T00:00:00 Metal: Remove redundant symbol redeclarations MTLBlitOptionRowLinearPVRTC - macOS 11.0 (min compile 12.0) - iOS/tvOS 9.0 (min compile 17.0) MTLBarrierScope - macOS 10.14 (min compile 12.0) - iOS/tvOS 12.0 (min compile 17.0) MTLBarrierScopeRenderTargets - Moved compile guards to call sites MTLRenderStages, MTLRenderStageVertex, MTLRenderStageFragment - macOS 10.13 (min compile 12.0) - iOS/tvOS 10.0 (min compile 17.0) Bug: angleproject:360147119 Change-Id: I7dac46accde63be486a7de918284bbd6e8367a4e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5806896 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Kimmo Kinnunen 5cf94ffa 2024-08-20T10:41:40 Metal: Use pipeline rasterSampleCount Use MTLRenderPipelineDescriptor rasterSampleCount instead of sampleCount. This avoids the use of the deprecation macro. Availability: iOS 8.0 (min: 15.0), mac Catalyst 13.1 (min: 16.5), macOS 10.11 (min: 10.15), tvOS 11.0 (min: 15.0), visionOS 1.0+ Bug: angleproject:360147118 Change-Id: I7009a7d7b39ecb763e23f4b97441fb45a64a891d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5797134 Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>
Kimmo Kinnunen 25237423 2024-08-20T15:22:32 Metal: Remove ifdefs for primitive topology class MTLPrimitiveTopologyClass availability iOS 12.0, minimum runtime 15.0. Remove the ifdefs. Hardcoding ANGLE_IOS_DEPLOY_TARGET is dangerous, likely it has never been correct. Remove. Should use __IPHONE_OS_VERSION_MIN_REQUIRED. Bug: angleproject:360147118 Change-Id: I43d7a364fa0237af1ee1f546015ae884fc373b15 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5797141 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com>
Kimmo Kinnunen 2758d4dc 2024-08-20T16:00:07 Metal: Remove shared event related ifdefs Shared events are supported by iOS 12, macOS 10.14, included in the minimum versions iOS 15, macOS 10.15. Bug: angleproject:360147118 Change-Id: I5b62dade045f9d50864ef1906cb22a18fd09e4da Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5797150 Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Le Hoang Quyen 1a191b1d 2024-08-16T17:31:38 Metal: add an option to emulate DontCare loadOp with randomized Clear. This is useful for testing undefined initial values caused by DontCare MTLLoadAction on non-tiled GPUs. Bug: angleproject:42261786 Change-Id: Id5c4a9ee8510a8a9143bdd67e276bfcf2bd7eaa5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5791386 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
Le Hoang Quyen a89ca6c8 2024-07-30T17:14:50 Metal: Fully implement unresolve step for MSRTT. This CL also uses memoryless for implicit MS textures in EXT_multisampled_render_to_texture render passes. Bug: angleproject:42261786 Change-Id: Ic20450574c4c670d05ca846587ced05488012270 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5746181 Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Le Hoang Quyen 2bc1519c 2024-07-28T05:16:07 Metal: fix base/max level change for mutable textures. Previously, the following scenario would accidentally delete and recreate the native texture storage for a non-immutable TextureMtl: 1. set a texture base/max level. 2. attach the texture to a FBO and clear it. - native storage is created. 3. sample the texture. - native storage is accidentally deleted and recreated. This happened because front-end only notifies the backend about the base/max level dirty bits at step 3. At this point, Metal backend thought that the native storage created at step 2 is no longer valid and attempted to recreate the storage. This CL fixes the bug by checking whether the base/max level is still compatible with the existing native texture storage. If it is then the dirty bits result in no-op. Bug: chromium:355605685 Change-Id: I1daac80a74219109631a101e18e944560606d926 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5741121 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev 12028222 2024-06-20T00:00:00 Metal: Clear visibility result buffer before use Ensured that the current visibility pool buffer does not contain previous results if it was used before. Fixed: angleproject:348206830 Change-Id: I8dbc36626ef8267d5466c96405dac0da2754cb6d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5643453 Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Shahbaz Youssefi d193d51b 2024-06-17T22:46:08 Replace issue ids post migration to new issue tracker This change replaces anglebug.com/NNNN links. Bug: None Change-Id: I8ac3aec8d2a8a844b3d7b99fc0a6b2be8da31761 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5637912 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Le Hoang Quyen 251067ed 2024-05-03T22:36:11 Metal: don't break render pass when uploading a texture. Bug: b/337214693 Change-Id: Ib2dc77c364a72f2973cbc3882f6125bffbc0a11b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5514948 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
Alexey Knyazev 18797bf2 2024-03-28T00:00:00 Metal: Handle incompatible attachments Metal runtime fails if the attachment pixel formats are not compatible with the program outputs or if the corresponding render pass and pipeline pixel formats do not match. Added Metal-specific state tracking and forced draw framebuffer syncronization for such cases. Cleaned up and reduced Framebuffer::setAttachmentImpl. Fixed: angleproject:5233 Change-Id: I4ee01889debe0e3cce54635e6cba62dbfdc02722 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5377813 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Alexey Knyazev 2b66694d 2024-03-28T00:00:00 Metal: Untangle public draw calls Do not call public Metal backend draw commands from itself. Bug: angleproject:8630 Change-Id: I7c0e016dc0eb3365520cdb39db215e4233e0d9fa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5401865 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Auto-Submit: Alexey Knyazev <lexa.knyazev@gmail.com>
Geoff Lang 33a09305 2024-03-22T11:10:05 Metal: Remove work texture and work buffer from ContextMtl These objects did not have lifetime management and would persist until the destruction of the context which added significant memory overhead when clients use many contexts. Allocate them specifically for the ReadPixels call and destroy them when finished. Bug: chromium:330163368 Change-Id: I95e2c11e14fb4ad0728850a7a0fabcf53916b9ad Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5388258 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Kimmo Kinnunen b9c6cf8e 2024-03-08T10:11:11 Metal: Stop blit encoder after render encoder Render encoder might resolve visibility query with blit encoder. Fixes an assert due to "Metal: Release prov. vertex buffers on event set". Bug: angleproject:8586 Change-Id: If3ede1771e5c72e2de0b6f78ce73fbdafb74cd22 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5352252 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com>
Kimmo Kinnunen e38cf95a 2024-03-06T16:26:54 Metal: Release prov. vertex buffers on event set Fixes a memory leak where provoking vertex buffers would never be released for sequence: 1. draw with flat shading 2. Create EGL fence sync object with Metal event 3. .. 4. Go to 1 Bug: angleproject:8586 Change-Id: I5b302cef82414e4a2886c4a7f570c1bf73a83238 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5349340 Reviewed-by: Kenneth Russell <kbr@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Shahbaz Youssefi 4e6fe5e0 2024-02-29T15:01:06 Vulkan: Cache ImageLoadContext in context This avoids the need to requery this from the display every time. Bug: angleproject:8564 Change-Id: Ied650e7789741f59b7662c0f97c55132b105778d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5332074 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev 9f148c41 2023-12-14T00:00:00 Metal: Fix triangle fan indices generation * Ensured that the second index is preserved when skipping leading primitive restart values * Restricted the search loop to the index count * Ensured that draw calls are skipped when the generated index buffer is empty to avoid Metal validation errors, also for line loops Fixed: angleproject:6458 Change-Id: I3194eb9db3e7e225448901edce167a2091563cd5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5132092 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Geoff Lang bd5dce9a 2023-11-21T15:39:04 Metal: Use MTLEvent instead of MTLSharedEvent when possible Refactor mtl::Sync to be abstract and have multiple implementations using either MTLEvent or MTLSharedEvent. Use MTLEvent in all cases except for EGL Syncs when the user sets the sync type to EGL_SYNC_METAL_SHARED_EVENT_ANGLE. Determine completion of the sync object by watching for completion of the command buffer where the event's signaling was enqueued. Avoid any sleep loops by waiting on a condition_variable which is notified when the completed queue serial is updated. Forked from CLs by sky@ and kbr@ Bug: angleproject:8153 Change-Id: I4547444b596366496c811cb9954872b85ab14ad8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5133706 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Le Hoang Quyen 9f9c35f3 2023-11-02T19:56:32 Metal: Don't map index buffer in drawArraysProvokingVertexImpl We don't need to map the provoking vertex's index buffer right after generating it on GPU. It caused GPU-CPU sync between every drawArrays call having flat shading. The only reason for mapping was to pass the indices data to setupDraw. However setupDraw only needs indices data for converting vertex attributes. Even then the converted attributes have the same order as the original vertices. Hence the conversion sill works fine with the original indices and there is no need for it to know about the generated indices. Bug: chromium:1496807 Change-Id: Ie69b3db78ead2160fd714ca04480625dded09062 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5000085 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Shahbaz Youssefi 48e2c605 2023-09-07T14:30:46 More instances of program usage converted to executable Bug: angleproject:8297 Change-Id: I8e4eeef8f4f20610bbe0f994ce1141c17d588765 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4850888 Reviewed-by: Shahbaz Youssefi <syoussefi@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Shahbaz Youssefi 7b0bb0f6 2023-09-01T13:52:28 Properly "install" program executables According to GL: - The program has an executable - The executable is overwritten during link. - After a failed link, queries of the executable may return half-linked information - On glUseProgram, the executable is installed in the context - On glUseProgramStages, the executable is installed in the program pipeline - After a successful link, the executable is updated wherever the previous executable of the program was installed. This change implements exactly the above: - The program's and the program pipeline's executables are now shared_ptr. References to an executable in the context and PPO are also through a shared_ptr. Installing an executable thus translates to sharing the executable. - The context and PPOs are made to not reference the program directly, but work solely through the executable. As a result, the program is free to create a new executable for link. With this change, the link job will be free to modify the executable as necessary because that will not be accessed until the link is done. Note that previous changes made the backend executable accessed through the frontend one, and moved all link results to the frontend and backend executables as appropriate. Bug: angleproject:6358 Bug: angleproject:8297 Change-Id: Ie636b23ff7420ad284d18b525ec4f5fb559dd9d1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4823089 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>
Shahbaz Youssefi d664543f 2023-09-01T23:11:59 Metal: Move setupDraw and associated code to executable Last bits of state left in ProgramMtl that are now moved to ProgramExecutableMtl, and now ContextMtl does not reference the program at all. This fix was necessary for a follow up change that allows the program to be modified while the executable is installed, and the metal backend was crashing after a failed relink due its direct access to the program. Bug: angleproject:8297 Change-Id: Iadf623bf6baf612767ff372adee2e7f4eeedb593 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4833624 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Shahbaz Youssefi ae67a24b 2023-08-25T14:51:50 Metal: Move program state to ProgramExecutableMtl Bug: angleproject:8297 Change-Id: I1d13f7aee1ff5b0ce799b486d8a57c83c4481983 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4812047 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Shahbaz Youssefi bb135f0e 2023-08-24T15:29:11 Make ProgramExecutableImpl managed by ProgramExecutable This change allows both parts of the program executable to be safely backed up and swapped on link. Bug: angleproject:8297 Change-Id: I17e4b6c05e4e481a66a227d6047dbf943d2c2603 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4812138 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev 27836f21 2023-08-21T00:00:00 Metal: Support incomplete integer textures Ensure that a compatible placeholder texture is created for sampling from an incomplete texture. Covered by these tests with Metal API Validation: * IncompleteTextureTestES3.IntegerType * IncompleteTextureTestES3.UnsignedIntegerType Bug: angleproject:5594 Change-Id: Ib7322b7cf32cadabf40eb6050476c1bde98ee404 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4801369 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Geoff Lang 84f5295c 2023-07-25T14:24:51 Metal: Flush with NoWait when hitting renderpass count limits This flush was added as an optimization to handle a specific use case where many expensive GPU operations (clears and uploads) were queued without being flushed. The GPU would be idle during these periods. WaitUntilScheduled forced CPU/GPU synchronization when it was not needed. We just want to make sure the work is flushed so the GPU can pick it up later, not synchronize with anything external. WaitUntilScheduled is used on iOS still because the Chrome waterfall does not have coverage of iOS performance. Bug: chromium:1466696 Change-Id: Ia8938eddf5be5ce586a91ad759d1563182176dba Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4717367 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Geoff Lang f586ec98 2023-07-20T17:24:09 Metal: Validate max render target size without an allocation We would allocate a MTLRenderPassDescriptor for validating an internal error case only to throw it away immediately afterwards. This happened on every new render pass. This allocation/release amounts to about 10% of ANGLE's CPU time when running Chrome. Bug: chromium:1466696 Change-Id: I0bbe086c0b8006d2ff15ae57f25b591f791acb60 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4706925 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Geoff Lang 3a0da09d 2023-06-22T15:07:11 Metal: Cache compute pipelines for provoking vertex emulation Remove ProvokingVertexComputePipelineCache and update ProvokingVertexHelper to use the PipelineCache. Bug: chromium:1329376 Change-Id: Ifca89fbb572d850c806b24f124fb86c65eec4f11 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4637204 Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Shahbaz Youssefi 5f581f87 2023-06-27T20:38:03 Pass dirty bits by value Split CL from follow up change where the dirty bits need to be passed by value as they are calculated from two sets. Many cached dirty bits are turned to constexpr as a result. Bug: angleproject:8224 Change-Id: Ibdb3090d6ee93788e1502b72bce55f4677937c58 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4650074 Reviewed-by: Roman Lavrov <romanl@google.com> Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Shahbaz Youssefi 2e209516 2023-06-26T11:58:50 Move state dirty bits definitions out of the class This is in preparation for a follow up change that splits the state class. Bug: angleproject:8224 Change-Id: Ic9b253583e40fcc93ff37605b6b6e1deb55a6e55 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4631843 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Geoff Lang ecf245ff 2023-06-14T16:24:17 Metal: Don't force all incomplete textures to initialize ensureIncompleteTexturesCreated is called in every syncState and initializes all types of incomplete textures, even when they are not used. Skip it entirely. ContextMtl::getIncompleteTexture already lazily creates the incomplete textures, per type. This saves about 1mb (~5% of ANGLE's allocations for Chrome) of malloc'd memory per context. Bug: chromium:1329376 Change-Id: I14ab7098ce2e486383d1d0d41039f0e526755878 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4615190 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org>
Geoff Lang bd5a7f24 2023-06-12T13:22:43 Metal: Set alphaToCoverageEnabled in checkIfPipelineChanged alphaToCoverageEnabled was tweaked to false for non-multisampled rendering cases in RenderPipelineCache::createRenderPipelineState but this caused a copy and could be done much earlier during context state syncing. Bug: chromium:1329376 Change-Id: I37a461554e1e2b162313b4a952baa1526356db3d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4608484 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Kenneth Russell aea88562 2023-05-19T16:52:43 Reland "Metal: Optimized BufferSubData per device" This reverts commit ee64836f702332adaca58d9f452063a04b2da955 , 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>
Alexey Knyazev 9c376a02 2023-03-31T00:00:00 Metal: Implement ANGLE_polygon_mode Bug: angleproject:1791 Change-Id: Iea1e10751ad8e853b4fb209952488211cfa4bac4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4497909 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Alexey Knyazev 7bc4b7e3 2023-03-27T00:00:00 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>
Geoff Lang c6ec59dc 2023-03-27T11:15:48 Explicitly pass the extended dirty bits to syncState. Add a the extended dirty bits and bit mask to syncState instead of calling gl::State::getAndResetExtendedDirtyBits when encountering DIRTY_BIT_EXTENDED. It disallowed us from masking the extended dirty bits and feels like an anti-pattern to modify the extended dirty bits in gl::State from the backend. This is a refactor only. Bug: chromium:1410191 Change-Id: I66fdec3eb57e3426cf0fda9ccb759700eafdda14 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4374100 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Alexey Knyazev ba845fcf 2023-03-20T00:00:00 Metal: Implement EXT_clip_control * Skipped vertex shader depth correction when clip depth mode is set to GL_ZERO_TO_ONE. * Adjusted front face mode and pre-fragment vertical flip driver uniform based on the clip origin state. * Added more clip control end2end tests. * D3D11: Fixed scissored draws with upper-left clip origin. Fixed: angleproject:8065 Change-Id: Ife82fa2ad39fad463c23ec10b49bff409272ebf2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4356661 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Kyle Piddington <kpiddington@apple.com>
Alexey Knyazev e809e7bd 2023-03-13T00:00:00 Reland "Implement EXT_depth_clamp" This is a reland of commit f8c1418319ac2aef4b3101e322005b1d0f73120f Host GPU bugs are observable in iOS Simulator Original change's description: > Implement EXT_depth_clamp > > * Added depthClamp to the RasterizerState > * Added DepthWriteTest end2end tests covering > both clipped and clamped depth writes > > Capture > * Updated serialized rasterizer state > * Updated CaptureMidExecutionSetup > > OpenGL > * Requires GL 3.2 or ARB_depth_clamp > on desktop contexts > * Maps to EXT_depth_clamp on ES > > D3D11 > * Maps to the opposite of > D3D11_RASTERIZER_DESC.DepthClipEnable > * The new tests uncover several edge cases where > a workaround is needed to implement unextended > OpenGL semantics on top of D3D > > Metal > * Maps to the setDepthClipMode command > > Bug: angleproject:8047 > Bug: angleproject:8077 > Change-Id: I1b3448e5b84443e4be18af9bc22d2f8495ac8267 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4347753 > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Bug: angleproject:8047 Bug: angleproject:8077 Change-Id: I8c5f8304276c97c51b2c3382cd2764592ee0c3fe Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4349938 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Yuxin Hu 4a77b0f5 2023-03-18T00:16:24 Revert "Implement EXT_depth_clamp" This reverts commit f8c1418319ac2aef4b3101e322005b1d0f73120f. Reason for revert: This change breaks angle_end2end_tests on Metal backend: https://ci.chromium.org/ui/p/chromium/builders/ci/ios-angle-intel/26035/overview Original change's description: > Implement EXT_depth_clamp > > * Added depthClamp to the RasterizerState > * Added DepthWriteTest end2end tests covering > both clipped and clamped depth writes > > Capture > * Updated serialized rasterizer state > * Updated CaptureMidExecutionSetup > > OpenGL > * Requires GL 3.2 or ARB_depth_clamp > on desktop contexts > * Maps to EXT_depth_clamp on ES > > D3D11 > * Maps to the opposite of > D3D11_RASTERIZER_DESC.DepthClipEnable > * The new tests uncover several edge cases where > a workaround is needed to implement unextended > OpenGL semantics on top of D3D > > Metal > * Maps to the setDepthClipMode command > > Bug: angleproject:8047 > Bug: angleproject:8077 > Change-Id: I1b3448e5b84443e4be18af9bc22d2f8495ac8267 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4347753 > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Bug: angleproject:8047 Bug: angleproject:8077 Change-Id: I829add68c006c72b7b4acf03aee3efa8a9a16fac No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4350876 Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Yuxin Hu <yuxinhu@google.com>
Alexey Knyazev f8c14183 2023-03-13T00:00:00 Implement EXT_depth_clamp * Added depthClamp to the RasterizerState * Added DepthWriteTest end2end tests covering both clipped and clamped depth writes Capture * Updated serialized rasterizer state * Updated CaptureMidExecutionSetup OpenGL * Requires GL 3.2 or ARB_depth_clamp on desktop contexts * Maps to EXT_depth_clamp on ES D3D11 * Maps to the opposite of D3D11_RASTERIZER_DESC.DepthClipEnable * The new tests uncover several edge cases where a workaround is needed to implement unextended OpenGL semantics on top of D3D Metal * Maps to the setDepthClipMode command Bug: angleproject:8047 Bug: angleproject:8077 Change-Id: I1b3448e5b84443e4be18af9bc22d2f8495ac8267 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4347753 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Kenneth Russell ee64836f 2023-02-11T17:56:06 Revert "Metal: Optimized BufferSubData per device" This reverts commit 968041b54770af8917001d8fe9b52a881cfed0b2. Includes the following patches: git revert -n 995db1f66bcf87fc9e47d908fb2a885e810d2567 \ 9a6c90c8f802b4d107a081bfccaf4be007e7af54 \ dbd47e378582ef86db52c7379cd220cf0b2c8193 \ 369b320f92f54774879e8b8faff834fc8db0793e \ 4abae6f97586448712e2dc1cced4a678b0901d7b \ 968041b54770af8917001d8fe9b52a881cfed0b2 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>
Kimmo Kinnunen 9a6c90c8 2023-01-26T14:26:49 Reland "Metal: Avoid leaking buffers for GPU access for non-discrete" The code would pass BufferManager::getBuffer(..,useShared=false,..) and use that as key to try to obtain a buffer from the cache. The BufferManager would store the returned buffers based on the actual storage mode of the buffer. The storage mode for the buffers for integrated / iOS devices is always shared. The above logic would lead the buffer manager always storing returned buffers to the cache, but never being able to consume any from the cache. The cache is designed to grow unbounded, and so it did. Remove the inconsistent logic of passing variation of "use shared bool" as the arguments. Various places consulted various different Feature options in inconsistent manner. Instead, add Buffer::Usage for the callers to express what kind of access pattern to expect a buffer to be used. Add explicit MTLStorageMode parameters to Buffer constructing functions. Remove redundant functions from Buffer. Remove dead code from BufferPool related to allocation policy. Reland: continue to allocate buffers with shared rather than managed mode in BufferPool, as otherwise bug angleproject:7997 is encountered. Bug: angleproject:7975 Change-Id: Iae4e75a85e6d49b20e724ed037a7c14cc0f7693f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4217712 Reviewed-by: Kenneth Russell <kbr@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Gregg Tavares <gman@chromium.org> Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Kenneth Russell c799074c 2023-02-06T21:52:41 Metal: Implement EXT_disjoint_timer_query. Time-elapsed query objects allocate and deallocate storage slots in the CommandQueue. Command buffers register themselves with these slots (if active) upon allocation, and upon completion, accumulate their execution time in the slot. Query objects accurately track completion and report the total accumulated execution time for all command buffers issued while the time-elapsed query was active. Timestamp queries are not implemented. A pointer to implementation suggestions has been added to the code. Tested with the WebGL conformance test: conformance/extensions/ext-disjoint-timer-query.html Fixed: angleproject:7828 Change-Id: Ia022d0f3a52f2098bd01cf96f7cc20e3d347197e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4226410 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Yuly Novikov dbd47e37 2023-01-30T20:54:24 Revert "Metal: Avoid leaking buffers for GPU access for non-discrete" This reverts commit 369b320f92f54774879e8b8faff834fc8db0793e. Reason for revert: WebGL 2.0 conformance tests failing on Mac/AMD per https://bugs.chromium.org/p/angleproject/issues/detail?id=7975#c4 Original change's description: > Metal: Avoid leaking buffers for GPU access for non-discrete > > The code would pass BufferManager::getBuffer(..,useShared=false,..) > and use that as key to try to obtain a buffer from the cache. > The BufferManager would store the returned buffers based on > the actual storage mode of the buffer. The storage mode for the > buffers for integrated / iOS devices is always shared. > > The above logic would lead the buffer manager always storing returned > buffers to the cache, but never being able to consume any from the > cache. The cache is designed to grow unbounded, and so it did. > > Remove the inconsistent logic of passing variation of "use shared bool" > as the arguments. Various places consulted various different Feature > options in inconsistent manner. > > Instead, add Buffer::AccessPattern for the callers to express what > kind of access pattern to expect a buffer to be used. Add explicit > MTLStorageMode parameters to Buffer constructing functions. > Remove redundant functions from Buffer. > Remove dead code from BufferPool related to allocation policy. > > Bug: angleproject:7975 > Change-Id: I0c4661c55e8c907b702160ae42690269c049f6db > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4194172 > Reviewed-by: Kenneth Russell <kbr@chromium.org> > Commit-Queue: Kenneth Russell <kbr@chromium.org> > Reviewed-by: Gregg Tavares <gman@chromium.org> > Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Bug: angleproject:7975 Change-Id: I094de8e5b06392fe36a9887d6a817023baa48735 No-Presubmit: true Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4206187 Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
Kimmo Kinnunen 369b320f 2023-01-26T14:26:49 Metal: Avoid leaking buffers for GPU access for non-discrete The code would pass BufferManager::getBuffer(..,useShared=false,..) and use that as key to try to obtain a buffer from the cache. The BufferManager would store the returned buffers based on the actual storage mode of the buffer. The storage mode for the buffers for integrated / iOS devices is always shared. The above logic would lead the buffer manager always storing returned buffers to the cache, but never being able to consume any from the cache. The cache is designed to grow unbounded, and so it did. Remove the inconsistent logic of passing variation of "use shared bool" as the arguments. Various places consulted various different Feature options in inconsistent manner. Instead, add Buffer::AccessPattern for the callers to express what kind of access pattern to expect a buffer to be used. Add explicit MTLStorageMode parameters to Buffer constructing functions. Remove redundant functions from Buffer. Remove dead code from BufferPool related to allocation policy. Bug: angleproject:7975 Change-Id: I0c4661c55e8c907b702160ae42690269c049f6db Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4194172 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Gregg Tavares <gman@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com>
Alexey Knyazev ef0fe638 2023-01-16T00:00:00 Implement EXT_polygon_offset_clamp * Added polygonOffsetClamp to the RasterizerState * Adjusted State::setPolygonOffsetParams * Added PolygonOffsetClampTest end2end tests * Added StateChangeTestES3.PolygonOffsetClamp test * Suppressed the affected dEQP test as it has a bug Capture * Updated serialized rasterizer state * Updated CaptureMidExecutionSetup OpenGL * Rely on the EXT extension defined both for desktop and ES contexts * On desktops, might as well use the ARB extension or GL 4.6 once ANGLE supports them D3D11 * Requires FL10_0 or higher * Maps to D3D11_RASTERIZER_DESC.DepthBiasClamp * Drive-by cleanup of extensions init code Vulkan * Requires depthBiasClamp physical device feature * Maps to the depthBiasClamp parameter of the vkCmdSetDepthBias command Metal * Maps to the clamp parameter of the setDepthBias command Bug: angleproject:7957 Change-Id: If6b28df4084f0a81db29f75fb434e75d394c8730 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4169945 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Tiago Vignatti 5ff1298c 2023-01-10T15:02:13 Metal: Fix MTLBarrierScope type availability Latest SDK doesn't provide MTLBarrierScopeRenderTargets for iOS and is very specific for macOS versions: MTLBarrierScopeRenderTargets API_AVAILABLE(macos(10.14), macCatalyst(13.0)) API_UNAVAILABLE(ios) = 1 << 2 This fixes MTLBarrierScopeRenderTargets availability according the latest SDK. Test: build ANGLE with Metal renderer enabled on iOS. Bug: None Change-Id: I101ccfe6ab77d7241ac4a925aeebce8801782428 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4126578 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Chris Dalton <chris@rive.app> Auto-Submit: Tiago Vignatti <tvignatti@igalia.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Dan Glastonbury bf5a007a 2022-06-16T14:21:08 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>
Gregg Tavares 91ff986c 2022-12-19T14:30:25 Metal:Switch to NoWait in eglReleaseTexImage Now that eglWaitUntilWorkScheduled is implemented in ANGLE and called in Chromium we can set this to NoWait Bug: angleproject:7890 Change-Id: Ib6fbda18b940873409653a968aa956bc728025a8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4117714 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Chris Dalton 8ee1b89f 2022-11-04T13:10:37 Refactor pixel local storage options The various different PLS options were getting scattered and unruly. We are also in need of more backend-specific PLS options that would be difficult to add as-is. This CL refactors them into a single "ShPixelLocalStorageOptions" struct that gets initialized all in one place, and shared between the compiler and the backends. Bug: angleproject:7279 Change-Id: Ic58dccb8d1ba350a0b6cc5848ce15bd687e30fad Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4006715 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Chris Dalton <chris@rive.app>
Chris Dalton a4db9477 2022-10-06T10:35:39 Implement pixel local storage with metal::read_write textures Metal's programmable blending feature isn't available on non-Apple Silicon, so on these devices we have to polyfill pixel local storage using read_write textures, which can also be coherent if raster_order_groups are supported. This change leverages the existing PLS transformation to images, and implements just enough shader image functionality in Metal to support the pixel local storage usecase. Missing shader image features are marked with UNIMPLEMENTED(). Bug: angleproject:7279 Bug: angleproject:7792 Bug: angleproject:7794 Bug: angleproject:7797 Bug: angleproject:7803 Change-Id: Ia96a714693d352d57351a1bae4f45437dde000e4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3993363 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: Chris Dalton <chris@rive.app> Reviewed-by: Kyle Piddington <kpiddington@apple.com>
Shahbaz Youssefi 5b218196 2022-11-06T11:39:23 Metal: Remove compilation through SPIR-V Direct metal generation is stable. Bug: angleproject:6081 Change-Id: If9e76f61ad38f2fc9963f0181dfd03c99ffa3e2b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4003675 Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org>
Kenneth Russell 3226cce3 2022-11-02T16:02:46 Update EGL_ANGLE_metal_shared_event_sync implementation. Rename the extension's .txt file to match the current name of the extension. Update function signatures to take EGLSync rather than EGLSyncKHR. The two types are conceptually incompatible. This extension requires the use of eglCreateSync rather than eglCreateSyncKHR because the latter takes an array of EGLInt, but EGLAttrib is needed to express pointers (to MTLSharedEvents) in the attribute list. Revise ContextMtl::flush to use WaitUntilScheduled on older operating systems not supporting MTLSharedEvent. Bug: angleproject:7809 Change-Id: I39197616dc3e1e7ec6dc68dd83b4fde05184debf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4000941 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Shahbaz Youssefi 025504b9 2022-10-17T17:03:03 Pass worker pools to image load functions In preparation for the ASTC decoder using threaded decoding. Bug: b/250688943 Change-Id: I70d669bcb57b900dbb633304182e174aec362203 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3961339 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Greg Schlomoff <gregschlom@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Gregg Tavares 968041b5 2022-08-19T12:11:23 Metal: Optimized BufferSubData per device Adds a staging buffer path which means there are 4 paths for bufferSubData. 1. direct copy * get a pointer to the buffer * copy the new data to the buffer * if the buffer is managed, tell metal which part was updated 2. use a shadow copy * copy the data to a shadow copy * copy the entire shadow to a new buffer * start using the new buffer 3. use a new buffer * get a new buffer (or unused) * put the new data in the new buffer * blit any unchanged data from the old buffer to the new buffer * start using the new buffer 4. use a staging buffer * get a staging buffer * put the new data in the staging buffer * blit from the staging buffer to the existing buffer. Further, there are 3 types of memory storage modes. Managed, Staged, Private. Based on the GPU type different storage modes and different paths in different sitatutions are more performant. So, add feature flags to select paths by GPU. Bug: angleproject:7544 Change-Id: I741dd1874201043416374194bd2001ded8dbd9b4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3842641 Reviewed-by: Kyle Piddington <kpiddington@apple.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares 7d712c47 2022-09-08T09:42:10 Metal: ProvokingVertexHelper stop using a separate cmdbuffer This simplifies the code. Without this you always need to be aware that the provoking vertex helper's command buffer might have commands in it that need to be committed before starting other operations. Bug: angleproject:7643 Change-Id: I1c73d451c12c268ecbdb6a1cd63a77c291949ef9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3884275 Commit-Queue: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com>
Chris Dalton 493bab09 2022-09-15T14:20:41 Add an ShPixelLocalStorageType enum Adds ShPixelLocalStorageType to ShCompileOptionsPLS and adds a getNativePixelLocalStorageType() call to ContextImpl. For now this enum only tells the translater whether PLS formats needs to be packed into r32 images, but it will soon also be able to select framebuffer fetch, native pixel local storage, and other PLS implementations. Bug: angleproject:7279 Change-Id: Ifbd419b20550b8711ae3044782177806796216f1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3900498 Commit-Queue: Chris Dalton <chris@rive.app> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Gregg Tavares 11fd8346 2022-08-29T18:08:28 Metal: Make flush NoWait Flush is was doing WaitUntilScheduled. I'm not sure why. This change increases the Motionmark "Leaves" test speed by about 50% (It's currently 2.5x slower than OpenGL) Bug: angleproject:7626 Change-Id: I9ff7c254957581ac2062906d8d715849365b9f67 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3863951 Commit-Queue: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
Peng Huang 79aa846e 2022-08-17T13:40:33 Reland "Not recreate Framebuffer for eglMakeCurrent() call" This is a reland of commit bf9c815263455403e587a9d2b0fdb9fb8e964208 Original change's description: > Not recreate Framebuffer for eglMakeCurrent() call > > Right now, in eglMakeCurrent() call, ANGLE always release the > default framebuffer object associated to the current context, > and create a new default framebuffer object for the new current > context. It impacts chrome performance, since chrome call > eglMakeCurrent() a lot. With this CL, the default framebuffer > will be created with gl::Context. When the surface is changed > by eglMakeCurrent() call, ANGLE will detach the previous surface > from the associated framebuffer, and attach the new surface to > the next current context's default framebuffer. > > Bug: chromium:1336126 > Change-Id: Iaa747669250ae250245db383a716b4634df59ea4 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3827751 > Commit-Queue: Peng Huang <penghuang@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> Bug: chromium:1336126 Change-Id: Iade19004a4335ac7bc6ca176a3c14d34afff8c9e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3877405 Auto-Submit: Peng Huang <penghuang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Peng Huang 02e8497f 2022-09-07T01:12:31 Revert "Not recreate Framebuffer for eglMakeCurrent() call" This reverts commit bf9c815263455403e587a9d2b0fdb9fb8e964208. Reason for revert: compile errors https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel/1303510/overview Original change's description: > Not recreate Framebuffer for eglMakeCurrent() call > > Right now, in eglMakeCurrent() call, ANGLE always release the > default framebuffer object associated to the current context, > and create a new default framebuffer object for the new current > context. It impacts chrome performance, since chrome call > eglMakeCurrent() a lot. With this CL, the default framebuffer > will be created with gl::Context. When the surface is changed > by eglMakeCurrent() call, ANGLE will detach the previous surface > from the associated framebuffer, and attach the new surface to > the next current context's default framebuffer. > > Bug: chromium:1336126 > Change-Id: Iaa747669250ae250245db383a716b4634df59ea4 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3827751 > Commit-Queue: Peng Huang <penghuang@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> Bug: chromium:1336126 Change-Id: I7c07f62236f57523b29c536c04f9a9de79da2f4b No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3877404 Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Auto-Submit: Peng Huang <penghuang@chromium.org> Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
Gregg Tavares 662226a3 2022-09-06T14:12:26 Metal: Preemptively Start Provoking Vertex CmdBuffer on AMD There seems to be a bug in older AMD drivers and this appears to work around it Bug: angleproject:7635 Change-Id: I1b22e4b7d5d1ce0d405e422d08d33eeeb731050a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3877666 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Gregg Tavares 2c4f7187 2022-08-30T11:33:56 Metal: Stop pre-creating the Provoking Vertex CmdBuffer The provoking vertex command buffer was being created regardless if whether or not it was used which is left over from when the backend used to pre-enqueue command buffers. That's no longer true so we don't need to pre-create this command buffer. I think this adds a 5% perf increase to the MotionMark "Leaves" test. Bug: angleproject:7619 Change-Id: Ic921911eeef0f063ea6eba8ba7c307157243b938 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3863739 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Peng Huang bf9c8152 2022-08-17T13:40:33 Not recreate Framebuffer for eglMakeCurrent() call Right now, in eglMakeCurrent() call, ANGLE always release the default framebuffer object associated to the current context, and create a new default framebuffer object for the new current context. It impacts chrome performance, since chrome call eglMakeCurrent() a lot. With this CL, the default framebuffer will be created with gl::Context. When the surface is changed by eglMakeCurrent() call, ANGLE will detach the previous surface from the associated framebuffer, and attach the new surface to the next current context's default framebuffer. Bug: chromium:1336126 Change-Id: Iaa747669250ae250245db383a716b4634df59ea4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3827751 Commit-Queue: Peng Huang <penghuang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Gregg Tavares 8a0351a5 2022-05-26T14:29:21 Metal:Dynamically choose max draw buffers. The code was hard coded to 4 which is lower than OpenGL's 8. This implementation keeps a hard coded array of size 8 in rx::mtl::RenderPassDesc and rx::mtl::RenderPipelineOutputDesc but only uses up to the display's limit. Bug: angleproject:7280 Bug: angleproject:5730 Change-Id: Idd7e64dc47697882b44540804159566158e1e924 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3671695 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares 17f9e941 2022-06-01T15:22:29 Metal: Upstream clear performance fix Restricts in-flight render passes per command buffer a predefined limit. The goal is to reduce the number of active render passes on the system at any one time. Patch is from: https://bugs.webkit.org/show_bug.cgi?id=234008 Bug: angleproject:7386 Change-Id: I6712bf38722e2685ed7d21f12ed0a680779b7a41 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3685190 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Shahbaz Youssefi 2df17a12 2022-05-25T16:18:37 Vulkan: Pack driver uniforms Previously 5 vec4s were used for driver uniforms + 2 vec4s if specialization constants couldn't be supported. The driver uniforms are rearranged and packed such that only 2 vec4s are normally used, which include fallback for specialization constants as well. In the future, most of the specialization constants may turn into uniforms, and this change prepares for that. Additional uniforms are used (3 vec4s) only if common extensions are missing; transform feedback and bresenham lines. This change makes it more practical for driver uniforms to be turned into push constants. Additionally, these uniforms could potentially be loaded and cached at the beginning of the shader for more efficient memory access. On Pixel6, with this change, the traces show no difference in wall time. On most traces, CPU time shows up to ~7% improvement. Bug: angleproject:7366 Change-Id: I0f47f863955af06a19c69d1f1d7c45b97d95476e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3668151 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>
Shahbaz Youssefi 98c2e169 2022-05-20T16:17:49 Vulkan: Reduce pre-rotation spec const to bool The specialization constant now only dictates whether x and y should be swapped. The complete 8 possible states of rotation and y-flip are achieved by using this swap in combination with a driver uniform for x and y flip. Swapping is still a specialization constant to avoid degrading performance of dFdx/dFdy which otherwise would need both to be evaluated instead of one. On platforms which don't support pre-rotation, the specialization constant will never change and driver uniforms entirely govern y-flip. On platforms that do support pre-rotation, only two variations of the pipeline are needed. Bug: angleproject:7366 Change-Id: I73f84e89fa9349d2098fa5b21573aee57d93a30c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3663151 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Lingfeng Yang <lfy@google.com> Reviewed-by: Charlie Lao <cclao@google.com>
Gregg Tavares cd80b511 2022-05-26T12:00:13 Metal: Upstream uniform limits from WebKit Increases the limit from 4k to 16k which matches OpenGL. Patches are from: https://bugs.webkit.org/show_bug.cgi?id=238914 https://bugs.webkit.org/show_bug.cgi?id=240896 Bug: angleproject:7280 Change-Id: I404adce0066680513e3eaa56bd4b1079c39a7f03 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3669602 Commit-Queue: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org>
Geoff Lang 6ddbfa39 2022-05-09T09:06:16 Metal: Log the shader source when a shader fails to translate Refactor Metal logging to include a message string. Bug: chromium:1322521 Change-Id: I3a7b5c36fcf140b3664ad96a9da924819326bf94 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3634725 Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org>
Gregg Tavares 1a144edf 2022-04-13T17:15:29 Metal:ReadPixels AMD Copy Texture to Buffer optimization On AMD GPUs it's faster to copy a texture to a buffer for read back than to read via a texture. For reading from a normal texture 24-27ms -> 6-9ms For reading from a IOSurface texture 17-20ms -> 7-10ms Bug: angleproject:7117 Change-Id: I7c7f276a3121e87f5c52a1a4287d13203a6b1b37 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3584423 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Gregg Tavares <gman@chromium.org>
Alexey Knyazev 62ca6449 2022-04-13T09:36:40 Reland "Fix BlendStateExt::mMaxColorMask initialization" This is a reland of commit 50d008a7efcab80f34eb742148d05389b2ed247e Besides fixing the BlendStateExt color mask initialization bug, the following changes were made: * All fields were made private with accessor functions. * A new assertion was added that ensures 64-bit storage for factors and equations. This allowed dropping one redundant mask. * Two new helper functions were added. * BlendStateExt::mMaxDrawBuffers was renamed to mDrawBufferCount. * The BlendStateExt class is now aligned to 8 bytes with an assertion. * Expanded test coverage. Also fixed incorrect usage of BlendStateExt fields in: * StateManagerGL::syncBlendFromNativeContext * StateManagerGL::restoreBlendNativeContext Original change's description: > Fix BlendStateExt::mMaxColorMask initialization > > This variable should not have its unused bits set. > > To avoid confusion with other masks of the same class, > the variable was renamed to mAllColorMask. > > Bug: angleproject:7200 > Change-Id: I72542d49ff8da3dbb8d61c5034ce37c1e8fcc6e1 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3581990 > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Bug: angleproject:7200 Change-Id: I87a5fe0f9dfbbf5e525b9120f772aa9adb39ce5f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3593234 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Gregg Tavares 87187835 2022-04-07T13:51:10 Metal: For readPixels copy IOSurface to non-IOSurface texture For intel GPU/Drivers, it's faster to copy an IOSurface texture to a non-IOSurface texture and read from the copy than it is to read directly from the IOSurface texture. Bug: angleproject:7117 Change-Id: I786009444480f75be6feb05f09f87fb45a3186b1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3573078 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares e79ed0dc 2022-03-25T17:15:30 Metal: Fix for not submitting command buffers in order First I added a check that CommandBuffers are committed in order as the design requires that they are. This showed several tests asserting including the angle end2end test, OcclusionQueriesNoSurfaceTestES3.SwitchingContextsWithQuery/ES3_Metal and also several others. The check is cheap and helps catch bugs so it seems prudent to have it. Unfortunately, AFAICT, there is no trival fix. The issue is ContextMtl::flushCommandBuffer commits the outstanding commandbuffers but then, if there is/was a query in progress, more work needs to be done. That work calls ContextMtl::getBlitCommandEncoder which calls ContextMtl::ensureCommandBufferReady which calls ProvokingVertexHelper::ensureCommandBufferReady which ends up making a new command buffer. That command buffer should be committed before switching to a new context but the code that would commit it has already executed. It's not at all clear to me how to refactor the code to do this correctly. The simplest solution is to call ContextMlt::flushCommandBuffer twice which I know is gross but at least it fixes the bug and optimizing and/or refactoring can be done separately. Bug: angleproject:7131 Change-Id: Idb11efb35f6ad2fd890a5db15d3791c07586bf34 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3553939 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Alexey Knyazev e56f185b 2022-03-19T10:41:50 Metal: clarify instance count assertions Bug: angleproject:6963 Change-Id: I5a686d560efb7912b3426560c8be2806a943158c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3536659 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Alexey Knyazev 7c616871 2022-02-01T15:12:53 Metal: Implement ANGLE_base_vertex_base_instance Includes command buffer and MSL translator updates. The DrawElementsInstancedBaseVertexBaseInstance tests from DrawBaseVertexVariantsTest suite fail for dynamic draw and stream draw buffer usages. Bug: angleproject:6963 Change-Id: I6caa144860356d5fc85948b72458bec282ea3a3b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3429819 Reviewed-by: Kyle Piddington <kpiddington@apple.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Shahbaz Youssefi 1e29ba62 2022-02-11T15:08:05 Vulkan: Enable overlay by default with debug layers Bug: angleproject:6976 Change-Id: I8fdd7546358fc1079525862cba0a4a6ff8357f78 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3457346 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Alexey Knyazev 49488710 2022-02-02T14:57:04 Metal: Remove emulatedInstanceID The uniform variable is no longer referenced. Bug: angleproject:5505 Change-Id: I8de518592e045707d024eaa1c07999caf4b5da66 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3431079 Reviewed-by: Kyle Piddington <kpiddington@apple.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Kyle Piddington 1bd1a3db 2022-01-06T15:08:48 Metal: Canvas resizing causes webpage to run out of memory For https://bugs.webkit.org/show_bug.cgi?id=232122 Introduce a maximum resident amount of memory that a single command buffer can use, before forcing a flush. As part of ensuring that a command buffer is ready, check to see if this limit is exceeded. if so, flush the command buffer, and create a new one. Bug: angleproject:6880 Change-Id: I5e89735d05adbc174237ab79b006a75bbe89e560 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3369922 Reviewed-by: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kyle Piddington <kpiddington@apple.com>
Gregg Tavares 6a255833 2022-01-07T16:13:58 Metal: Fix transform feedback issue The issue is if you issue 2 draw commands back to back, Metal partially ignores the 2nd. Bug: angleproject:6884 Change-Id: I702335ca06828bed1f553f1f5563ddc99f00bc99 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3373736 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Gregg Tavares <gman@chromium.org>
Kyle Piddington cfc4db34 2021-11-04T16:54:15 Metal: Provoking vertex support for Metal DrawArrays Add in provoking vertex rewrite support for drawArrays command, enabling 6 dEQP tests. GLES3/functional_rasterization_flatshading_line_loop GLES3/functional_rasterization_flatshading_line_strip GLES3/functional_rasterization_flatshading_lines GLES3/functional_rasterization_flatshading_triangle_fan GLES3/functional_rasterization_flatshading_triangle_strip GLES3/functional_rasterization_flatshading_triangles This patch adds a new shader to the Provoking Vertex helper that generates draw commands for all simple data types. Fix bug in provoking vertex helper that caused reused index buffers to suffer from allocation issues. Also fix Provoking vertex for triangle fan generation Bug: angleproject:5325 Change-Id: I7a1211dfcd99329868269ea0666eef1915d487b5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3261635 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kyle Piddington <kpiddington@apple.com>
Kenneth Russell 001221f0 2021-12-16T21:41:29 Metal: upstream fix from WebKit for texture leak. Upstream fix by Kimmo Kinnunen for a leak of MTLTexture instances for render targets from: REGRESSION (r287068): [macOS arm64] TestWebKitAPI.GraphicsContextGLCocoaTest. UnrecycledDisplayBuffersNoLeaks is failing https://bugs.webkit.org/show_bug.cgi?id=234356 The leak would happen through a temporary render pass descriptor that would ref the render target texture. The descriptor was created without an autoreleasepool in call stack. Also fixes the error string leaks. Bug: angleproject:6827 Bug: angleproject:6829 Change-Id: I07ec961886a9fb8caad6df334293358a175eaf15 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3346682 Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Gregg Tavares b26bb13a 2021-12-15T15:46:00 Metal: Remove references to xfbActiveUnpaused uniform Metal chooses a shader with or without support for transformfeedback so there's no point in checking in the shader if it's enabled or not. Bug: angleproject:6823 Change-Id: Iacd26b1e55b311a7cc7987dcd8b2f8c0c8727d62 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3343179 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares bda49325 2021-12-10T16:11:15 Add guards for 64 bit types on 32bit systems Bug: angleproject:6785 Change-Id: Iff043a22d398f5a7a1a46ae3cc4d2de5a6e3797e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3331639 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
John Cunningham 42bd4fc2 2021-12-10T14:58:17 Metal: add ANGLE_metal_create_context_ownership_identity. This Metal-specific EGL extension allows a given context and the GPU resources it allocates to be associated with a particular task ID on the system, for system-level bookkeeping purposes. Bug: angleproject:6795 Change-Id: I19ee0993564169b01c4a450e63dcfacd339b98b5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3335172 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Gregg Tavares 1642b4a3 2021-12-10T16:01:10 Metal: Fix Instanced Draw feature support on Simulator Bug: angleproject:6786 Change-Id: I4c567bf2ec61df581ae0e8eeb1c36c7d37e15d04 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3331637 Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares 2e669566 2021-12-09T18:21:02 Metal: Refactors from Webkit Mostly renaming, typos, cleanup bug: angleproject:6787 Change-Id: Ic71c296d7849244cae2ca29b264a10cb96bca612 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3329261 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Gregg Tavares <gman@chromium.org>
Gregg Tavares a0924015 2021-11-22T19:44:05 Metal:Fix GLSLTest_ES3.GLVertexIDIntegerTextureDrawElements Metal The test was failing if the "first" argument to glDrawElements was odd. When odd the offset was not a multiple of 2 bytes and the code was going down a different path than when the offset was event. The fix for that just removes a check for alignment to 4 bytes. Checking with UNSIGNED_BYTE indices though and it still failed. That was because it was encoding the index conversion path on one command buffer and the provoking index prep on another and so they were happening out of order. Putting both on the same command buffer fixes that. Bug: angleproject:6688 Change-Id: I89b68ba965d073e0fa70b6d5b444dc743b5e34a7 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3296631 Commit-Queue: Gregg Tavares <gman@chromium.org> Reviewed-by: Kyle Piddington <kpiddington@apple.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Amirali Abdolrashidi 17bf6e98 2021-11-11T20:53:31 Implement GL_EXT_multi_draw_indirect * Added the validation functions for multiDrawArraysIndirect() and multiDrawElementsIndirect() according to the specs. * Added generic implementation for the two functions that can be called by back-ends. * Added unit tests for the multiDrawIndirect functions. * Added flags for back-ends so they can enable the extension. * Minor cleanup in MultiDrawTest.cpp Bug: angleproject:6439 Change-Id: I4e5f1cab05c6de330aef82d115492dcc9d2fad44 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3276043 Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Jamie Madill bdc633a8 2021-10-20T12:33:42 Pass command type down to ContextImpl::syncState. This mirrors the command type passed to the object sync functions. It will be useful to determine if we're syncing for a draw or a dispatch call. Bug: angleproject:6595 Change-Id: Ia04bd14a3c2dd2eb211c47a6e55f8ddcbfedfaaa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3233904 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Kenneth Russell da3db87e 2021-07-06T14:00:58 Upstream latest changes to Metal backend from Apple to 7/1/2021 This CL merges in the ANGLE changes between these two WebKit commits: https://git.webkit.org/?p=WebKit.git;a=commit;h=8648b353ab1d7730438c2e08319e1a4d64982c31 https://git.webkit.org/?p=WebKit.git;a=commit;h=166e4924a52971d6a32ad48247a439b16c00e062 Include provoking vertex buffer out of bounds fix from https://bugs.webkit.org/show_bug.cgi?id=230107 Fix bad merge of resetting of dirty bits, breaking DepthStencilFormatsTest.DepthTextureRender test and perhaps others. Disable GL_APPLE_clip_distance when the direct-to-Metal compiler is active. It can not yet handle the gl_ClipDistance array. Disable use of rectangular textures for IOSurfaces. Metal can bind IOSurfaces to 2D textures, and this was passing all tests in the SPIR-V Metal backend. Introducing rectangular textures breaks the SPIR-V Metal backend, and the tests currently fail on the direct-to-Metal backend. Fix several bugs with ProvokingVertex, which was causing both the SpirV and Direct backends to incorrectly draw indices. (https://bugs.webkit.org/show_bug.cgi?id=230107) Skip the following tests on the Metal backend which is still failing RobustResourceInitTestES3.BlitDepthStencilAfterClearBuffer GLSLTest_ES3.GLVertexIDIntegerTextureDrawArrays/ES3_Metal With these changes, angle_end2end_tests again runs to completion. Bug: angleproject:6395 Change-Id: I3cc58f531426a95fc8f177a4ad87f56c1855a546 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3167010 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kyle Piddington <kpiddington@apple.com>
Kenneth Russell ff64d2c7 2021-08-06T21:24:09 Choose direct-to-Metal translator through a feature. Define directMetalGeneration in FeaturesMtl.h. If ANGLE_ENABLE_METAL_SPIRV is defined to 1 (still the default), directMetalGeneration defaults to false. It can be overridden via the standard ANGLE mechanism: ANGLE_FEATURE_OVERRIDES_ENABLED=directMetalGeneration It can also be overridden by instantiating angle_end2end_tests with the directives: WithDirectMetalGeneration(ES2_METAL()) WithDirectMetalGeneration(ES3_METAL()) These directives aren't working properly yet though. The direct-to-Metal compiler is instantiated, but the _DirectMetalGen versions of the tests fail. They pass when switching the Metal backend's default behavior using the above environment variable. This will be debugged in follow-on CLs. Thanks to syoussefi@ for the prototype of this CL: https://chromium-review.googlesource.com/3076129 Bug: angleproject:5505 Change-Id: I188ab89abc75bf89c5ed2d90102af311feaa1960 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3079083 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
Kenneth Russell 1654537d 2021-08-06T17:49:52 Fix default and driver uniforms' binding indices. These abstractions were introduced in the SymbolTable during upstreaming of the direct-to-Metal compiler and were accidentally swapped, leading to widespread test failures. Fix the comment reference in ContextMtl's DriverUniforms struct. Add missing emulatedInstance field, and add a TODO about its missing support in direct-to-Metal translator. Define it in SPIR-V Metal translator; the driver uniforms for the two must match. Bug: angleproject:6259 Change-Id: I0330ab4efca5b64a749b9cca90564fdbc84d7a80 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3078998 Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Kyle Piddington d33a2222 2021-04-26T16:56:15 Upstream Apple's direct-to-Metal backend: compile libANGLE. This change is meant to merge the metal backend changes from Apple's direct-to-Metal backend. Taken from Kyle Piddington's CL: https://chromium-review.googlesource.com/c/angle/angle/+/2857366/ The goal of this CL is to merge the metal backend code in a state that compiles, but not to switch the Metal backend over to using the direct-to-metal backend yet. Bug: angleproject:5505 Bug: angleproject:6127 Change-Id: If6783e06e0086b3a1dd25c6f53caca5cfc96cb86 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2950067 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Jonah Ryan-Davis <jonahr@google.com>
Geoff Lang b574643e 2021-04-19T12:47:05 D3D11: Skip blits if there is no intersection of dest areas Blit11 would clip the destination rectangle with the destination size but ignore the result. gl::ClipRectangle returns false when the rectangles do not intersect at all, indicating the blit can be skipped. This could lead to an out-of-bounds write to the GPU memory for the destination texture. Mark ClipRectangle as nodiscard to prevent future issues. Bug: chromium:1199402 Change-Id: I260e82d0917b8aa7e7887f2c9f7ed4b1a03ba785 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2836786 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Mohan Maiya 81dcf078 2021-03-08T11:21:31 Reland "Vulkan: Support EXT_sRGB_write_control" This is a reland of 6073af536cf627742696823edc82c9b0a481a8bc with 2 changes - 1. Don't enable the extension even in nonConformant mode 2. Don't enable VK_KHR_image_format_list for swiftshader Original change's description: > Vulkan: Support EXT_sRGB_write_control > > Implement support for EXT_sRGB_write_control. This extension > requires VK_KHR_image_format_list to be supported. > > The spec requires this functionality to work with glBlitFramebuffer > as well but support for that will be added in a follow up change. > As such, this extension is only exposed in non-conformant mode. > > Bug: angleproject:5075 > Tests: SRGBFramebufferTest.*Vulkan* > Change-Id: I59b38f6cd810a3d0d67ec29f4f19c25f65f70862 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2617243 > Commit-Queue: Mohan Maiya <m.maiya@samsung.com> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Bug: angleproject:5075 Change-Id: I8e149d196a39c3c4769bfa8690792f3c53831299 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2762647 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>