src/libANGLE


Log

Author Commit Date CI Message
Charlie Lao cfeea900 2025-08-12T17:23:32 Vulkan: Don't require COLOR_ATTACHMENT_BLEND_BIT for YUV format The only way to render to yuv texture is via EXT_yuv_target, but EXT_yuv_target spec https://registry.khronos.org/OpenGL/extensions/EXT/EXT_YUV_target.txt explicitly said you have to disable blend: "Blending applies only if the color buffer has a fixed-point format and non YUV space format color buffer.". Thus when we check if format supports rendering, we should exclude VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT if its YUV format. Bug: b/432398245 Change-Id: If5bfa58db30465ab707f63f34dd6487d8a03652f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6843926 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Xiang Wang 9d1edb4e 2025-08-08T18:21:03 Fix the assert on texture target to allow GL_TEXTURE_CUBE_MAP_ARRAY Add anend2end test to verify glCopyImageSubData works. Bug: b/419863436 Test: TextureCubeTestES32.CopyImageSubDataCubeMapArray Change-Id: I2a569680ed20f05b4182045cb4bdf08d4c66d8df Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6832639 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Xiang Wang <xwxw@google.com>
Shufen Ma 5fb77159 2025-08-12T15:21:25 Add stubs for GL_ARM_texture_unnormalized_coordinates Bug: angleproject:352345942 Change-Id: I05e2b0c83f07bfe35eb58fc657b834f6253d4cb9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6839660 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Shufen Ma <Shufen.Ma@arm.com> Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Charlie Lao <cclao@google.com>
Shahbaz Youssefi 316e6831 2025-08-08T14:14:20 Vulkan: Support KHR versions of surface/swapchain_maint1 They are straight promotions of the EXT versions of the extensions. Bug: angleproject:430106352 Change-Id: I889dfda99d8ad35de1672914e7cc73b2879be6a2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6832392 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Charlie Lao 555b2328 2025-08-08T13:32:13 BindVertexBuffer should pick up buffer change in other context Buffer is modified in the first context and calling glBindVertexBuffer() of the same buffer on the second context should pick up the buffer changes made in first context. Bug: b/433331119 Change-Id: I694f66b38b11b87e0efa8d9b939f8384120823af Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6830125 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao 41e44587 2025-08-06T20:04:23 BufferBindingMask in VertexArray::onBufferChanged are same buffer The bufferBiningMask bits received from VertexArray::onBufferChanged() must point to the same buffer, in case of one buffer is bound to multiple binding points. We can do some minor optimization here when we loop the BufferBindingMask bits: We only need to calculate hasConflict once when we call updateCachedTransformFeedbackBindingValidation(). Bug: b/433331119 Change-Id: I9f7cfa543deb46cd369915293b97f5d3122e1708 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6826782 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Charlie Lao d63cff37 2025-08-06T13:31:02 Fix bug when rebind the same buffer not pick up the change Buffer is modified in one context and rebind the same buffer on the second context should pick up the buffer changes. Bug: b/433331119 Change-Id: I8085fe826c339692881f2d3d6515efb19bbc4a88 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6825767 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Tingwei Guo 7c8e357c 2025-07-15T17:24:25 Fix NULL handling in glGetAttachedShaders and ShaderPrecisionFormat Fix the case where passing NULL to the shaders parameter in getAttachedShaders and to the range and precision parameters in getShaderPrecisionFormat would trigger assertions. Bug: angleproject:431900689 Change-Id: I0d01bbb0d13f9a4704b47066c85ac7c1368534a0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6733749 Auto-Submit: Tingwei Guo <tingwei.guo@arm.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao d8dc3cc2 2025-08-02T12:02:20 Remove shared context lock from glVertexAttrib{I}Format This CL removes shared context lock from glVertexAttribFormat() and glVertexAttribIFormat() APIs, since they no longer access anything outside VertexArrayPrivate. The main problem I had run into is validation code. Before this CL, ValidateIntegerVertexFormat() needs context's mStateCache for mCachedVertexAttribTypesValidation and mCachedIntegerVertexAttribTypesValidation. Given these two cached value are constant after initialization, in this CL, I have moved them to PrivateStateCache. PrivateStateCache argument is added to ValidateVertexAttribFormat() and ValidateVertexAttribIFormat() to get them access to mCachedIntegerVertexAttribTypesValidation. Bug: b/433331119 Change-Id: Ifc3fbed32b4d3722c335dd2c393bc6519ed0b544 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6822032 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao c39f1d0f 2025-08-01T15:44:11 Move updateCachedTransformFeedbackBindingVali* to VertexArray Since updateCachedTransformFeedbackBindingValidation needs buffer argument, this is now moved from VertexArrayPrivate to VertexArray class to make it obvious. Also mCachedTransformFeedbackConflictedBindingsMask is per bindingIndex, so I have changed it from AttributeMask to VertexArrayBufferBindingMask. Bug: b/433331119 Change-Id: I321267637ba661b18ef236260a17e6e8f7043eb9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6814158 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao ae4aead5 2025-07-24T16:35:38 Remove sharedContextLock from glVertexAttrib{Divisor|Binding} With prior CLs all the functions used by glVertexAttribDivisor*, glVertexBindingDivisor and glVertexAttribBinding only access VertexArrayPrivate. This CL removes shared context lock from these APIs. Bug: b/433331119 Change-Id: Ib1632797c53d2cd7a31c21e93c0e69385c71a27f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6814157 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao 328a205f 2025-08-07T11:02:12 Revert "Fix bug when reattach the same buffer not pick up the change" This reverts commit a93f4c8d29c8d214e4823032e6e2c061d5dab1b1. Reason for revert: https://issues.chromium.org/437092065 Bug: b/433331119 Original change's description: > Fix bug when reattach the same buffer not pick up the change > > Added a test that the same buffer is used in two contexts. Buffer is > modified in one context and reattached the same buffer on the second > context's vertex array should pick up the buffer changes. This test > exposed the bug and it is fixed in this CL. > > Bug: b/433331119 > Change-Id: Ia5675581857a642fe9727f196326da9af43d52cf > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6821923 > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> > Commit-Queue: Charlie Lao <cclao@google.com> Bug: b/433331119 No-Presubmit: true No-Tree-Checks: true No-Try: true Change-Id: Iaa14b5dbbdb02c69bb060d5073072ec6ddd473ce Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6827998 Auto-Submit: Charlie Lao <cclao@google.com> Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Charlie Lao a93f4c8d 2025-08-05T16:45:21 Fix bug when reattach the same buffer not pick up the change Added a test that the same buffer is used in two contexts. Buffer is modified in one context and reattached the same buffer on the second context's vertex array should pick up the buffer changes. This test exposed the bug and it is fixed in this CL. Bug: b/433331119 Change-Id: Ia5675581857a642fe9727f196326da9af43d52cf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6821923 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Shahbaz Youssefi 7a193b06 2025-08-06T13:50:50 Unthrottle validation error messages for all of Chromium Chromium uses the debug callback to check if there were any errors instead of glGetError(). With the previous change that throttled error messages, some webgl tests failed to correctly recognize that an invalid call did actually fail validation, as well as passthrough command decoder fuzzer tests. Bug: angleproject:423956139 Bug: chromium:436292490 Change-Id: Ida254c9bdd2137afcc9483cc1860254781338dbc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6823824 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Shahbaz Youssefi da8462d4 2025-08-06T05:44:28 Unthrottle validation error messages in WebGL Chromium uses the debug callback to check if there were any errors instead of glGetError(). With the previous change that throttled error messages, some webgl tests failed to correctly recognize that an invalid call did actually fail validation. Bug: angleproject:423956139 Bug: chromium:436354527 Change-Id: Ic65761f412d3548fedd63f48d36357c9568c0b53 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6822578 Commit-Queue: Cody Northrop <cnorthrop@google.com> Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Amirali Abdolrashidi f1c6e1a8 2025-08-04T19:55:02 Vulkan: Disable EXT_fragment_shading_rate Due to a few dEQP failures, this extension will be temporarily disabled. It can be reverted once the issues have been resolved. * Disabled fragmentShadingRateEXT for Vulkan. Bug: b/436169197 Bug: angleproject:420310117 Change-Id: I94fbbb8b0a0866465e8c67e34c214b465fc35558 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6820702 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Charlie Lao 394df705 2025-08-01T14:03:17 Cache per bufferIndex buffer properties in VertexArrayPrivate This is another preparation CL. This CL caches per bindingIndex buffer properties in VertexArrayPrivate: mCachedBufferPropertyMapped and mCachedBufferPropertyMutableOrImpersistent. The only difference between these and mCachedMappedArrayBuffers / mCachedMutableOrImpersistentArrayBuffers is that one indexed by attribIndex and another is indexed by bindingIndex. With this, when attribute binding changes, we no longer need to make buffer access. With this, we can move setVertexAttribBinding and setVertexBindingDivisor from VertexArray into VertexArrayPrivate class and Context argument is also removed. Bug: b/433331119 Change-Id: I666544ee0585727ca92d640f372f5a64d1d85576 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6814156 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Amirali Abdolrashidi bafe39e2 2025-07-14T16:07:51 Vulkan: Use BindIndexBuffer2 when available This Vulkan API becomes available with VK_KHR_maintenance5. In addition to the original args, it also takes the index buffer size. * Added the necessary functions to use the following API: vkCmdBindIndexBuffer2KHR() * handleDirtyGraphicsIndexBuffer() now uses this API if maintenance5 is available. Bug: angleproject:394337110 Change-Id: I9a650ac5a033b449da05e0c226e2cfb6df74a75c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6735725 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Charlie Lao <cclao@google.com>
Charlie Lao eca5244d 2025-07-30T16:59:16 Remove buffer from VertexArrayState::setAttribBinding In later CLs we try to remove shared lock from glVertexAttribBinding(). One of the lockers for that is right now setAttribBinding() references "buffer" for size. This CL caches the per binding index bufferSize in VertexArrayPrivate (i.e, std::vector<size_t> mCachedBufferSize). setAttribBinding() moved from VertexArray to VertexArrayPrivate since it no longer needs buffer access, but uses mCachedBufferSize instead. This CL also changes std::vector to std::array for mVertexArrayBuffers Bug: b/433331119 Change-Id: Ie34aef82379af8f04099cdc20ebdf354d2787a65 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6803592 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Shahbaz Youssefi 91fa29be 2025-08-04T11:08:20 Add a feature to force contexts into debug mode Bug: angleproject:423956139 Change-Id: Ie166b40eb9c241140daf4a35df3391829c64f84e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6817467 Commit-Queue: Cody Northrop <cnorthrop@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Aurora Zhang be43e317 2025-07-31T17:40:24 EXT_external_buffer should have DYNAMIC_DRAW usage EXT_buffer_storage requires that BUFFER_USAGE must be DYNAMIC_DRAW. EXT_external_buffer only mentions that the buffer can be sourced from an external EGLClientBuffer. Therefore, the BUFFER_USAGE should still be DYNAMIC_DRAW. Add an end2end test. Bug: angleproject:436046320 Change-Id: Ie79a1b1f8be0df4566bff26800599b192c4f70b1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6817076 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Aurora Zhang <Aurora.Zhang@arm.com> Commit-Queue: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Yuxin Hu <yuxinhu@google.com>
Shahbaz Youssefi 35023c8a 2025-07-31T17:40:45 Throttle validation error messages in release builds Some apps make invalid but harmless calls every frame. ANGLE inserts a debug message for each validation failure which comes with a performance cost. This change makes ANGLE stop reporting validation failure messages after a handful have already been reported. This is only done when assertions are disabled and when the context is not a debug context. Bug: angleproject:423956139 Change-Id: Ie3fb121b2686cddf7da98fc23422b5d12097c6fa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6805901 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org>
Charlie Lao fa29f604 2025-07-02T13:23:31 Remove sharedContextLock from {Enable|Disable}VertexAttribArray VertexArray objects are per context objects. In theory they do not need to protected by shared context lock. The reason we are taking locks because all these functions end up accessing Buffer object which are shared. In prior CLs we have removed subject observer usage from VertexArray which means VertexArray no longer accessed from other thread. In prior CLs we also split VertexArray into two classes: VertexArrayPrivate which has no buffer, and VertexArray which is subclass from VertexArrayPrivate and owns buffer. In this CL, glEnableVertexAttribArray and glDisableVertexAttribArray calls no longer take shared context lock. ContextPrivateEnableVertexAttribArray and ContextPrivateDisableVertexAttribArray are called from these two APIs and they only have access to StatePrivate. State Private holds a VertexArrayPrivate pointer, which means they do not have anyway to access buffer objects. The main challenge I run into here is mCachedActiveClientAttribsMask, mCachedActiveBufferedAttribsMask, mCachedActiveDefaultAttribsMask, mCachedHasAnyEnabledClientAttrib, mCachedNonInstancedVertexElementLimit, mCachedInstancedVertexElementLimit. These StateCache variable needs to be updated when these two APIs are called, and calculating these variable needs access to buffer object. The solution here is adding a bool mIsCachedActiveAttribMasksValid in the PrivateStateCache so that instead of immediately update these mCached* variable, we just set mIsCachedActiveAttribMasksValid to false. Then whenever any of these mCached* variable is needed, we will check mIsCachedActiveAttribMasksValid and calculate these cached variables. It adds one if check when accessing these caches, but the other benefit is that we may have avoided duplicated calculation when multiple states changed. Bug: b/433331119 Change-Id: I3227c72bc40501712db93fb3d540b835f07150b5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4514436 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Panfeng Hou 2ef85c24 2025-07-09T17:13:52 Vulkan: Add support for GL_EXT_fragment_shading_rate Add support for GL_EXT_fragment_shading_rate. Bug: angleproject:420310117 Change-Id: I7b368afc45baf8551c222b2569991269117d385b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6726817 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Panfeng Hou <panfeng.hou@arm.com> Reviewed-by: Charlie Lao <cclao@google.com>
Amirali Abdolrashidi 279652e3 2025-07-21T16:21:28 Vulkan: Flush more often due to render pass count Accumulating too much workload before submission can lead to stuttering and reduced quality in rendering. In this change, a threshold is set for the number of render passes in order to submit the command buffer. * Added the following to ContextVk: mRenderPassCountSinceSubmit * It is incremented every time a render pass begins in the command buffer. * When the count reaches the following threshold at the RP closure, there is a submission: kMaxRenderPassCountPerCommandBuffer * (Currently set to 128) Bug: b/426439980 Change-Id: I4cde223fb81e6a27a61f78c924d3c9f2a082e995 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6775626 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Matthew Denton a1d5d102 2025-07-22T02:15:43 WGSL: Allow matrices as in/out vars in shaders WGSL only supports scalars and vectors in in/out vars in shaders, matrices will need to be broken into column vectors and then put back together at the beginning (or end) of the shader. Arrays also need to be split, which will be done in another CL. Bug: angleproject:42267100 Change-Id: If1ba28c1b687ae0a3a5a554479f0ff0b5d9df39c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6777201 Commit-Queue: Matthew Denton <mpdenton@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Liza Burakova <liza@chromium.org>
Igor Nazarov 5fd368aa 2025-07-30T14:45:55 Replace Surface::getWidth/Height() with getSize() Most places in the code use both `getWidth/Height()` methods at the same time. On some back-ends it is more optimal to have single method. For example, `WindowSurfaceWGL` first uses `GetClientRect()` Win32 API inside each method to then calculate width and hight in each method, causing repeated `GetClientRect()` call. The only place where only one of the methods may be used is from `SurfaceImpl::getUserSize()` when one of the parameters is `nullptr`, which is only possible from `QuerySurfaceAttrib()` function. This method is rewritten to use new `getSize()` method and then use whatever dimensions is requested by the caller. This may cause `QuerySurfaceAttrib()` inefficiency on some back-ends that get width and height of the surface differently (`SurfaceEGL` for example). In such cases `getUserSize()` is overridden to avoid returning a dimension which is not required. After this change all places in the code that previously used both `getWidth/Height()` methods (like `Surface::getAttachmentSize()`) will be more efficient. The `QuerySurfaceAttrib()`, on the other hand, will have slightly more overhead on back-ends where base `SurfaceImpl::getUserSize()` method is used, which only happens on back-ends with trivial `getSize()` implementation. Bug: angleproject:397848903 Change-Id: I4a22701a1e62ee4e7d07e77cac5b388050d98e4d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6802440 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Igor Nazarov <i.nazarov@samsung.com>
Shahbaz Youssefi fa90dac8 2025-07-30T14:04:58 Revert "Vulkan: Disable VK_EXT_host_image_copy on Fuchsia" This reverts commit d62db89e1753ece99633143faf4c87b2ff23f96c. Reason for revert: It's been years, hopefully VVL is updated by now. Bug: angleproject:8341 Original change's description: > Vulkan: Disable VK_EXT_host_image_copy on Fuchsia > > An old version of VVL is used, causing incorrect failures. > > Bug: angleproject:8341 > Change-Id: I0fc605616671343a49fed6ff02ecd67eea672dca > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4873440 > Auto-Submit: Shahbaz Youssefi <syoussefi@chromium.org> > Commit-Queue: Yuxin Hu <yuxinhu@google.com> > Reviewed-by: Yuxin Hu <yuxinhu@google.com> Bug: angleproject:8341 Change-Id: Ia7a8875b955a120c80d59f2ae7566648e055eedc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6804001 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Eugene Zemtsov 4189fbb8 2025-07-29T17:50:24 Implement EGL_ANDROID_presentation_time for Vulkan backend The implementation leverages the VK_GOOGLE_display_timing Vulkan extension. Bug: chromium:434977616 Bug: angleproject:42261214 Change-Id: I7e6c64eca6c01e7eb79d41dc5ef63311a7792e2b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6799254 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Tim Van Patten 92089dce 2025-07-29T14:09:24 Vulkan: Limit maxPerStageTextures to 4096 Many devices support a huge number of samplers (millions) and every one needs a uniform location, either generated by ANGLE or assigned by the user. Limit the number of samplers per stage to something reasonable, which in turn also lowers the number of uniform locations. This isn't expected to have any practical effect on real apps/users, but is instead to keep tests for these limits (e.g., dEQP, end2end) within reason in terms of shader program sizes and compilation times. Test: KHR-GLES31.core.explicit_uniform_location.uniform-loc-mix-with-implicit-max Test: angle_end2end_tests --gtest_filter=GLSLTest.VerifyMaxVertexUniformVectorsWithSamplers* Bug: b/434763439 Change-Id: I378483fd869b9f5ebee21760eec4dec2dd793b92 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6798920 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Amirali Abdolrashidi cd969c3e 2025-07-28T16:27:12 Vulkan: Disable clipCullDistance ext if GS/TS The extension GL_EXT_clip_cull_distance also interacts with geometry and tessellation shaders. These features are currently in development. * Added temporary flag: supportsClipCullDistanceInGSAndTS * Currently disabled by default * clipCullDistanceEXT can only be enabled if this feature is enabled, or if the device does not support geometry or tessellation shaders. * After the features become available, this flag can be removed. Bug: angleproject:42264006 Bug: b/415288635 Change-Id: Iac5c672fd980710519407c482bc95d2b0019aea2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6795025 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Igor Nazarov 3e52318c 2025-06-26T10:46:00 Vulkan: Ensure always using resolved Window Surface size `WindowSurfaceVk::getWidth/Height()` methods return cached, previously resolved Surface size. Using these methods while current Window Surface size is unresolved may return stale values, causing undesired behavior. Appropriate ASSERTs were added to these methods to prevent such usage. Added ASSERTs revealed few places with incorrect usage: - In `Context::makeCurrent()` to set initial viewport or for capture. - In `IsPartialBlit()` and `ValidateReadPixelsBase()` validations. - In `SerializeFramebufferAttachment()` during capture. Rest of the code was thoroughly checked if it is possible to call `WindowSurfaceVk::getWidth/Height()` when size is unresolved. All other places always call these methods after framebuffer state synchronization, which acquires swapchain images and resolves the surface size. Added `ensureSizeResolved()` method that is called during validation and in the `SerializeFramebufferAttachment()` method. It is possible to use existing `Framebuffer::syncState()` method as alternative, but this solution was discarded since it may potentially interfere with `State::syncDirtyObjects()` method. The `Surface::getUserSize()` replaces old methods as optimization, to prevent calling relatively expensive method twice from `Context::makeCurrent()` to get width and height of the `drawSurface`. Test: angle_trace_tests --gtest_filter=EGLSurfaceTest.ResizeBeforeMakeCurrent/* Test: angle_trace_tests --gtest_filter=EGLSurfaceTest.ResizeBeforeMakeCurrentPostSizeQuery/* Test: angle_trace_tests --gtest_filter=EGLSurfaceTest.ResizeAndReadPixelsRobustANGLE/* Test: angle_trace_tests --gtest_filter=EGLSurfaceTest.ResizeAndBlitFramebufferANGLE/* Bug: angleproject:397848903 Change-Id: I082e13d0b8db5fd7d08ff25b102df1f283e1256d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6792928 Commit-Queue: Igor Nazarov <i.nazarov@samsung.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Charlie Lao b4d84458 2025-05-23T18:08:19 Move Buffer from VertexBinding to VertexArray In later CL we will not taking shared context lock for certain VertexArray API calls. VertexArray itself is per context, so this sounds reasonable to do. The main challenge here is a lot of VertexArray function end up accessing gl::Buffer object, which could be modified by other shared contexts. In order to safely not taking the shared context lock, we need to separate out Buffer object out of VertexArray itself so that these lockless APIs will take VertexArray that does not have access to buffer. In this CL, VertexArray is split into two classes: VertexArrayPrivate is everything in VertexArray except buffers. VertexArray is a subclass of VertexArrayPrivate and owns all the buffers. Buffer is removed from gl::VertexBinding class. In order to let back end access to buffers, VertexArrayImpl holds a weak reference to VertexArray::mVertexArrayBuffers (which is a vector of buffers). Further, VertexArrayBufferBindingMask mBufferBindingMask is moved from VertexArrayState into VertexArray class well, since it tracks which index has a non-null buffer. The bulk of change are due to the VertexARrayImpl constructor change, since it now takes vertexArrayBuffers argument. Other bulk of changes are due to VertexBinding no long has the buffer, but you need to get it directly from VertexArray or VertexArrayImpl. This CL also reverts some of the change in crrev.com/c/6758215 that mVertexBindings no longer contains kElementArrayBufferIndex. BYPASS_LARGE_CHANGE_WARNING Bug: b/433331119 Change-Id: I15f4576f7c5c8d8f4d9c9c07d38a60ce539bfeea Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6774702 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao 8dca0efe 2025-07-21T15:29:10 Replace VertexArray::DIRTY_BIT_LOST_OBSERVATION with API call This dirty bit was added so that back end can inspect buffers and set proper VertexArray::DirtyBitType. The same thing can achieved by add a virtual function on VertexArrayImpl class. The advantage of virtual function on VertexArrayImpl is that all back end essentially have the same implementation and we can just implemented in VertexArrayImpl instead of duplicate in each back end. The other advantage is after this CL DIRTY_BIT_BINDING_n and DIRTY_BIT_BUFFER_DATA_n will be well aligned instead of offset by 1 caused by DIRTY_BIT_LOST_OBSERVATION. The other motivation of this change is in later CL I want to move mBufferBindingMask out of VertexArrayState, which means back end will not have access to it. By using VertexArrayImpl API, I can pass mBufferBindingMask directly to the back end via function parameter. So, this CL removed DIRTY_BIT_LOST_OBSERVATION, added VertexArrayImpl::checkBufferForDirtyBits(). Bug: b/433331119 Change-Id: I5c8cbc9bace63db416e86c2ae3631f74a12b20b8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6775986 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Mohan Maiya 130fb2a1 2025-07-29T08:16:57 Vulkan: Don't allocate ExternalFormatIDs for sampling usecases Update the condition for allocating YUV ExternalFormatIDs to exclude sampling-only usecases. Also, rename "isYuvResolve()" to "isYuvExternalFormat()" to better reflect intent. Bug: angleproject:386749841 Change-Id: I0e4f5b79937ea8ad98b5d00fdc7531b34ffa7e16 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6797965 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: mohan maiya <m.maiya@samsung.com>
Charlie Lao 40a2a912 2025-07-15T14:39:10 Track mElementArrayBuffer in std::vector<VertexBinding> Right now mElementArrayBuffer are treated a little bit differently from other vertex buffers, mainly because of elementBuffer does not have corresponding "attributeIndex" to bind to. But a lot of logic in VertexArray are same for mElementArrayBuffer and mVertexBindings. In recent CLs, we are using mBufferBindingMask to track both mElementArrayBuffer and mVertexBindings with kElementArrayBufferIndex represents element buffer. With that, some of logic handling buffers can be merged, with looping of mBufferBindingMask bits. In later CL, we are going to separate "binding" from "buffer" so that we can move buffer out of VertexArrayState class. So this is also a preparation CL so that when we move buffers out of VertexArrayState class, it does so for all buffers (both element buffer and vertex buffers). In order to track how many vertex buffers in mVertexBindings, a new variable mMaxVertexAttribBindings is added. In later CL when we move buffers out of VertexBinding, some of this CL's change will be reverted back, mVertexBindings will be reverted back to track only bindings and mMaxVertexAttribBindings will be deleted. Bug: b/433331119 Change-Id: Idd2cfe4ce64bb22923bac70abb752e132fe1abd3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6758215 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com>
Tingwei Guo 4f4eab29 2025-06-30T14:58:28 Reset index buffer offset between indirect GL_LINE_LOOP draws In two consecutive glDrawArraysIndirect with GL_LINE_LOOP mode, and bound to a different Indirect Buffer, the variable value captured through TransformFeedback is the same as the first result when the second DrawArraysIndirect. When calling DrawArraysIndirect the second time, DIRTY_BIT_INDEX_BUFFER should be set to dirty so that it re-gets INDEX BUFFER to get the correct result. Bug: angleproject:428561247 Change-Id: I7f4ebb53e20cf8e362e67679b45185b8b68c56ef Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6687309 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com> Auto-Submit: Tingwei Guo <tingwei.guo@arm.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Mark Lobodzinski 866370dc 2025-07-28T22:12:00 Disable texture_compression_astc_decode_mode exts during capture The GL_EXT_texture_compression_astc_decode_mode and GL_EXT_texture_compression_astc_decode_mode_rgb9e5 extensions are not widely supported outside of ARM and Qualcomm. Disable while ANGLE capture is enabled. Test: angle_trace_tests --gtest_filter=*whiteout_survival Bug: b/434819166 Change-Id: I4cebf6942144c61a954dfd9dfe9bd9935638ff60 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6794776 Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Charlie Lao 9635df8e 2025-07-16T15:13:19 Move mCached*ArrayBuffers from VertexArrayState to VertexArray The three cached AttributeMasks variables are mCachedMappedArrayBuffers, mCachedMutableOrImpersistentArrayBuffers, mCachedInvalidMappedArrayBuffer. They are currently declared in VertexArrayState class. They are only accessed by VertexArray front end, back end does not use them, which means they do not need to be in VertexArrayState class. This CL moves these three variables to VertexArray class in preparation for later CLs that VertexArrayState will not have access to Buffer objects. This CL also removed unnecessary updateCachedMutableOrNonPersistentArrayBuffers call from VertexArray::enableAttribute, since mCachedMutableOrImpersistentArrayBuffers does not depend on any variables enableAttribute() is modifying. Bug: b/433331119 Change-Id: I8b1f0c7d511dbc6858d20f33863154e8fe3077f8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6762902 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com>
Mohan Maiya 214a48c4 2025-07-16T12:42:18 Vulkan: add support for yuv resolve with transient image Add support for the YUV_target extension in cases where the implementation supports VK_ANDROID_external_format_resolve without supporting nullColorAttachmentWithExternalFormatResolve. Bug: angleproject:386749841 Tests: ImageTest*YUV* Change-Id: Iebcb4f843b962f3d0d2f4e42db479902b6c1f849 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6761834 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com>
Geoff Lang e4007fff 2025-07-24T15:50:48 GL: Remove ARB_base_instance check for EXT_base_instance support This is a speculative fix for reported flickering issues on Linux. https://chromium-review.googlesource.com/c/angle/angle/+/6580170 changed EXT_base_instance to only be supported when it is not emulated and fixed the condition to include ARB_base_instance, possibly hitting driver bugs on some devices. Bug: angleproject:355645824 Bug: chromium:427956856 Change-Id: I869fa7f618e82ad46c1953f0bacef0767bbc793e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6777576 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Yuxiang Qian 6a03109f 2025-07-09T18:24:31 Refine getCompressionRate As Vulkan spec states, vkGetImageSubresourceLayout should not be called for the android swapchainimage when the image is not bound to memory. Refine the path of getCompressionRate to make sure at least swapchainimage[0] has been initialized when it is been called. Bug: angleproject:433057375 Change-Id: I80b68874686940c0ef77df97b928b0e153c5bbf8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6774721 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Shahbaz Youssefi d38531e8 2025-07-23T09:39:11 Fix extension check for xfb mode validation With geometry and tessellation shaders, it's possible to use different primitive modes between transform feedback and draw, as long as they are from the same class. The code accidentally allowed this only if both extensions are supported, but it should be allowed if either is. Bug: angleproject:428561247 Change-Id: Ia18d4ac15a3d0739ce18dc0e1f3d3f0b1aea621c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6780744 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Mark Lobodzinski 7181239d 2025-04-04T14:13:58 Add long ANGLE traces feature Enables very long Android captures by swapping binary data chunked buffers to/from disk. Bug: b/425728227 Change-Id: I539f72590eece03cfc69d42fc34be9825a9ff1fe Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6476924 Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Mark Łobodziński <mark@lunarg.com>
Tim Van Patten cf4c8c2a 2025-07-10T15:50:36 Add max sampler count to maxUniformLocations OpenGL ES 3.2 Spec: > ## 7.6. UNIFORM VARIABLES > > When a program is linked successfully, all active uniforms, except for > atomic counters, belonging to the program object’s default uniform > block are initialized as defined by the version of the OpenGL ES > Shading Language used to compile the program. A successful link will > also generate a location for each active uniform in the default > uniform block which doesn’t already have an explicit location defined > in the shader. The generated locations will never take the location of > a uniform with an explicit location defined in the shader, even if that > uniform is determined to be inactive. The values of active uniforms in > the default uniform block can be changed using this location and the > appropriate Uniform* or ProgramUniform* command (see section 7.6.1). > These generated locations are invalidated and new ones assigned after > each successful re-link. The explicitly defined locations and the > generated locations must be in the range of 0 to the value of > MAX_UNIFORM_LOCATIONS minus one. Currently, ANGLE sets the mNativeCaps.maxUniformLocations to the maximum number of supported uniform variables (maxUniformVectors). However, samplers are also uniforms and consume uniform locations during shader linking. This causes shader compilation to fail for context versions 3.1+ if a shader uses both the maximum number of uniform variables and maximum number of samplers because the number of uniform locations is exceeded. This specific edge case is being tested by the end2end test GLSLTest.VerifyMaxVertexUniformVectorsWithSamplers. Unfortunately, that test is only instantiated for GLES 2.0 and 3.0 and ANGLE's shader linker only validates the number of supported uniform locations are not exceeded for GLES 3.1+, so that error path is not being validated. 1. Include both the maximum number of supported uniform variables and maximum number of samplers whe calculating the supported maximum number of uniform locations. 2. Instantiate GLSLTest.VerifyMaxVertexUniformVectorsWithSamplers for GLES 2.0, 3.0, 3.1, and 3.2 so the edge cases are tested for all supported GLES versions. Bug: b/279980674 Test: angle_end2end_tests --gtest_filter=GLSLTest.VerifyMaxVertexUniformVectorsWithSamplers* Change-Id: I8ad1f4d2a040a189625d516b54bf2f79ef218edc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6724940 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Tim Van Patten bc9ff5e6 2025-07-11T13:43:05 Don't cache shaders/programs that are too large Currently, ANGLE compresses and caches every shader program, but can then fail to decompress the cached program because the uncompressed size is too large. Instead, check if the program size is too large before compressing and caching the program, so ANGLE doesn't generate an error later while attempting to decompress the cached program. This change is applied to both shaders and programs: * MemoryShaderCache::putShader() * MemoryProgramCache::putProgram() Bug: b/279980674 Change-Id: I67a3b542b460a41dbbc4a3d8bad4031a212223e0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6728876 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Tim Van Patten <timvp@google.com>
Geoff Lang b7582680 2025-02-24T18:04:32 Reland: GL: Allow untranslated shaders to pass through on GLES Add an EGL extension EGL_ANGLE_create_context_passthrough_shaders which uses the NULL translator and passes the original shader to the driver. The parser is still used for shader reflection. Always enable the null compiler backend. It has almost no binary size cost and is now potentially used when the null ANGLE backend is not enabled. Bug: angleproject:398857482 Change-Id: Id528189ccbbacb1c444eacb151baadfda9fcc04b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6488609 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Cody Northrop ab74884c 2025-07-22T20:46:05 FrameCapture: Check current state for indexed buffers When checking whether we need to set per draw buffer blend state, we don't care whether they differ from default, we only care if they differ from each other. The non-indexed commands will set the same state for all buffers. This CL removes default state from the check. Otherwise, we are getting a block of identical indexed commands: glBlendFuncSeparateiEXT(0, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparateiEXT(1, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparateiEXT(2, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparateiEXT(3, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparateiEXT(4, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparateiEXT(5, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Which is equivalent to: glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Test: Honkai Impact 3rd trace Bug: b/433331917 Change-Id: Ie6bd7549d69c1548aace92126312527b8e585046 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6780135 Reviewed-by: Mark Łobodziński <mark@lunarg.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Cody Northrop 4e81cd79 2025-07-21T10:45:02 FrameCapture: Update context limits We're seeing multiple titles run incorrectly without updating these two limits during capture. I've verified locally that these still fit within the limits of all modern devices we're looking at. If there are any problems with older devices, we can address them with: addIntegerPrerequisite(GL_MAX_DRAW_BUFFERS_EXT, 6); addIntegerPrerequisite(GL_MAX_VERTEX_UNIFORM_VECTORS, 4096); Bug: b/431854319 Bug: b/433331917 Change-Id: Id21de17acc4d24157dfe07de6b9de818561399ba Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6775624 Reviewed-by: Mark Łobodziński <mark@lunarg.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Charlie Lao cdffecb7 2025-07-21T11:30:45 Vulkan: Ensure FramebufferVk::mRasterizationSamples > 0 GraphicsPipelineDesc can't handle samples being zero. This CL ensures we always use at least one sample. Bug: angleproject:431250668 Change-Id: I7f6b14c6060585fe7ef6fb55ed6a4b9813634f3f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6431827 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Austin Annestrand 239763d9 2025-04-04T17:52:10 CL/VK: Fix ArgumentWorkgroup setArg logic Issue was that clSetKernelArg for ArgumentWorkgroup type arguments would blindly push new values into kernel's spec-constant FastVector on every clSetKernelArg (even on same arg updates). This would lead to over-pushing due to same arg updates, which caused all kinds of issues, mainly erroneous misses in compute pipeline cache since the key is based on VkSpecializationInfo. Since kernel object already keeps a vector of kernel args, we don't need a separate spec-constant FastVector in CLKernelVk to track this. Remove it and derive the spec-constant data from the kernel args themselves. Bug: angleproject:366415134 Tests-Passing: Geekbench-6.2.2 - Workloads: [ 401 & 601 ] Change-Id: Iab7f27fdfdfede33881e1dd717ba3b771cffb985 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6773615 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Panfeng Hou 251ffe62 2025-07-15T17:37:30 Vulkan: Add support for built-in gl_ShadingRateEXT Add support for built-in gl_ShadingRateEXT of GL_EXT_fragment_shading_rate Bug: angleproject:420310117 Change-Id: Ie11b139a0371b5995f1533a85e02c590cd36109c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6733750 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Yuxin Hu 9cd9a0d5 2025-07-18T10:28:12 Vulkan: Reformat VVL Error Message Remove the following members from the SkippedSyncvalMessage struct: const char *messageContents1 const char *messageContents2 Future VVL suppression message should use extraProperties list only. Bug: angleproject:391284743 Change-Id: I72ebaf86da667967681318dd69a181cc685f0805 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6769428 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Yuxin Hu <yuxinhu@google.com>
Takuto Ikuta 7b36840b 2025-07-17T18:12:53 Fix missing includes This is to fix some errors in https://ci.chromium.org/ui/p/chromium/builders/ci/linux-modules-compile-fyi-rel/42032/overview Bug: chromium:40263312 Change-Id: I278fd42062a52cbfe7e778f98d3e72cdd490847f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6765303 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Auto-Submit: Takuto Ikuta <tikuta@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Cody Northrop de6d58f4 2025-07-13T19:24:34 FrameCapture: Fix blend state per draw buffer in MEC Before this CL, we've never set starting state for draw buffers other than buffer zero. They've always remained at default values, or at least matching the values set for zero. Now when we detect the other buffers differ from buffer zero, we emit indexed calls that set them correctly. Turning a sequence like this: glEnable(GL_BLEND); glBlendFuncSeparate(GL_SRC_ALPHA, ...); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); into this: glEnableiEXT(GL_BLEND, 0); glBlendFuncSeparateiEXT(0, GL_SRC_ALPHA, ...); glBlendFuncSeparateiEXT(1, GL_SRC_ALPHA, ...); glEnableiEXT(GL_BLEND, 2); glBlendFuncSeparateiEXT(2, GL_SRC_ALPHA, ...); glColorMaskiEXT(2, GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); glEnableiEXT(GL_BLEND, 3); glBlendFuncSeparateiEXT(3, GL_SRC_ALPHA, ...); glColorMaskiEXT(3, GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); glColorMaskiEXT(4, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glColorMaskiEXT(5, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); Test: Wuthering Waves trace Bug: b/431854319 Change-Id: Ic91d4b8cf50defd8b69ecf6aac697d0df8f69692 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6735677 Reviewed-by: Mark Łobodziński <mark@lunarg.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Mohan Maiya 890b5d8f 2025-07-07T13:06:54 Vulkan: Encapsulate more descriptor set logic in ProgramExecutableVk - ProgramExecutableVk handles SharedDescriptorSetCacheKey updates - Inline most update*DescInfo methods - Add dedicated methods to handle uniform and storage buffers to remove some branches from frequently used code paths Bug: angleproject:426412564 Tests: UniformBufferTest31.UniformBufferBindingRangeChangeWith*FBF Change-Id: I54b8ae2bd8778231e4d187b2cfd30f4d71de7f3b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6733546 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com>
Shufen Ma d3119b0a 2025-07-07T09:35:04 Relax shader interface matching for program link ES spec 3.2 section 7.4.1 shader interface matching: With separable program objects, interfaces between shader stages may involve the outputs from one program object and the inputs from a second program object. For such interfaces, it is not possible to detect mismatches at link time, because the programs are linked separately. Before this CL, we are applying the the number of output varying and the number of input varyings must match requirement to both glProgram object as well as glPipelineProgram object which is incorrect. This CL removes such check from Program::linkVaryings. A new function LinkValidateInOutNumberMatching is added to handle the this program pipeline specific spec requirement. Bug: angleproject:424050949 Change-Id: I0d2e4360b37d175b2b998e341f15815915771413 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6704827 Reviewed-by: Charlie Lao <cclao@google.com> Auto-Submit: Shufen Ma <Shufen.Ma@arm.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Kai Ninomiya 3f170c17 2025-07-11T15:35:01 Roll third_party/dawn/ (1684 commits) and clean up WGPU_BREAKING_CHANGEs With this roll, Dawn has completed the WGPU_BREAKING_CHANGE_* changes, so the old paths are no longer used. The roll: https://dawn.googlesource.com/dawn.git/+log/7a8946456d49..d85fc050fef7 Created with: roll-dep third_party/dawn Bug: chromium:427242889 Change-Id: Ia17fbc1447944e7bcea20d5004367d94cf7be10e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6729918 Commit-Queue: Geoff Lang <geofflang@chromium.org> Auto-Submit: Kai Ninomiya <kainino@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Kimmo Kinnunen 93b659f9 2025-07-04T12:35:29 Remove PoolAllocator push/pop feature PoolAllocator would manage a stack of memory pools upon client calling push() and pop(). This made the code unnecessarily complicated. The feature was only used with nesting of one, to mark the memory unused after a shader compile. Fix by removing the push/pop feature. Instantiate PoolAllocator in places the previous push() was and uninstantiating instead of previous pop(). This removes the feature where the PoolAllocator would hold on to the allocated memory in order to reuse it. This is seen as a progression: the allocator is held by the compiler, the compiler is held by the shader and each shader typically see only one compile. Thus the free pages were just leaking unused until the shader was destroyed. Instead, destructing the PoolAllocator instead of pop() will donate the memory back to platform/OS, where it is likely more useful. To preserve existing Vulkan behavior, add PoolAllocator::reset() which would mark the memory unused but leave them reserved for the PoolAllocator. Removes UB where PageHeader::nextPage would be accessed after ~PageHeader. Bug: angleproject:429513168 Change-Id: I21e58b46e0887380db3a2cab5ce22f0042cfae9e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6701153 Reviewed-by: Geoff Lang <geofflang@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Cody Northrop 03356f06 2025-07-10T19:21:04 Vulkan: Skip VK_KHR_maintenance9 warning A warning has been added about behavior that will change if VK_KHR_maintenance9 is enabled. Since we can't make this change until drivers support the feature, let's add warning that will fire when we do decide to turn it on. This CL: - Adds a feature for maintenance9 - Adds a VVL skip if isn't enabled - Updates our skip code to check for message IDs Test: Traces Bug: angleproject:429339330 Change-Id: I5763cbc5f343ef165ff8810b9b60b8c809075b8f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6724905 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Amirali Abdolrashidi 065b80a6 2025-07-10T15:50:43 Vulkan: Remove the enum to indicate submitted CB Currently, the function ContextVk::submitCommands() takes the following enum to indicate whether all command buffers or only the outside command buffer is submitted: "Submit" However, ContextVk::submitCommands() is only called twice. Also, this enum is only used to manage a few things, such as garbage collection, and finalizing foreign image layouts. It is possible to move these operations to the respective callers and remove this enum completely. * Moved the operations relying on the enum "Submit" to the locations before submitCommands() as required. * Removed the enum "Submit". (Credit for the idea to move the ops up to the callers: cclao) Bug: b/425987310 Change-Id: Ic0e1c15ee3d2e7cf22a4f7a57b6ac31acc38c861 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6724899 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Yuxin Hu 68fa8169 2025-07-09T18:02:16 Vulkan: Reformat VVL error message Remove the VVL that is no longer observed on bots. Reformat the other VVL to use extraProperties only. Bug: angleproject:40644740 Change-Id: I57da1259754d5eba18c8c11385872b3ec9527e09 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6719618 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Mohan Maiya 3b90872b 2025-07-06T09:02:27 Vulkan: Selectively invalidate uniform buffers Call invalidateCurrentShaderUniformBuffers iff current program has active uniform buffers. Also add DIRTY_BIT_UNIFORM_BUFFERS bit to mNew*CommandBufferDirtyBits Bug: angleproject:426412564 Bug: angleproject:429585235 Tests: UniformBufferTest31.UniformBufferBinding*WithMultiplePrograms* Change-Id: I88c37c8317205aecad638553846ffe3beff87f11 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6706537 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com>
Tim Van Patten 6d18ed63 2025-07-08T16:26:53 ValidateGetTexLevelParameterBase: Remove ES 2.0 check This CL addresses review comments in: https://crrev.com/c/6710993 1. Remove the ES_2_0 check for GL_MEMORY_SIZE_ANGLE in ValidateGetTexLevelParameterBase() since the GL_ANGLE_memory_size extension already requires OpenGL ES 2.0, making the version check redundant. 2. Update the test MemorySizeTest.BasicUsageTexture to use the function glGetTexLevelParameterivANGLE() if the context version is below OpenGL ES 3.1 and the extension GL_ANGLE_get_tex_level_parameter is available. Bug: b/409384875 Change-Id: I831d4b35eec20fcb4aff331c5a642a749bd52e67 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6715885 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Jeff Vigil 41a5b397 2025-07-09T09:17:10 Vulkan: Fix checking if fds are identical This helps to decide whether it's really disjoint or not. Bug: angleproject:426480610 Change-Id: I8ec9b352195ab16a7e11d2dab30e98138d9f5a6c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6658648 Reviewed-by: mohan maiya <m.maiya@samsung.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Jisun Lee 7b5a8096 2025-07-09T06:26:21 Vulkan: Enable varyingsRequireMatchingPrecisionInSpirv for Samsung Bug: b/430501085 Change-Id: Iac5061c5d33642af1e53a990487833c26df45b30 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6717687 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Mohan Maiya 30a1cbc9 2025-07-03T13:00:05 Vulkan: Separate out descriptor set for uniform buffers Bug: angleproject:426412564 Change-Id: Icdbb1e634fc543714d1e3b9cdba0530d400cb153 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6705153 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com>
Mohan Maiya d44244ca 2025-07-03T11:36:37 Vulkan: Simplify default uniform WriteDescriptorDescs ProgramExecutableVk fully encapsulates interaction with DescriptorSetDescBuilder with https:://crrev.com/c/6702410 which allows us to keep WriteDescriptorDescs members private. Remove mDefaultUniformWriteDescriptorDescs and reuse mDefaultUniformAndXfbWriteDescriptorDescs for both emulated and extension based XFB codepaths Bug: angleproject:426412564 Change-Id: Icf76440b6efbda93eb8d48c36591a99ccd1a5750 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6705152 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Mohan Maiya ce289330 2025-07-01T19:41:46 Vulkan: Simplify descriptor set management - Descriptor logic is contained in ProgramExecutableVk and doesn't leak into ContextVk - Reduces CPU overhead by not having to constantly copy and resize the DescriptorSetDescBuilder - Simplifies decoupling of descriptor set of uniform buffers from that of other shader resources Bug: angleproject:426412564 Change-Id: Ic0926d0d466ea21f611c2b2c7b844e0bb9027c1b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6702410 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Neil Zhang 8a9fe208 2025-06-20T16:32:11 Vulkan: Fixed rate compression not work as expected on Android On Android C++ compiler do more optimization and results different with Linux, re-write code to correct the issue. Bug: angleproject:352364583 Change-Id: I1863d2d255cd831d4ca9dd866c85e419f410bd9a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6687014 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Neil Zhang <Neil.Zhang@arm.com> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Jisun Lee 18091004 2025-06-19T16:50:58 GLES1: Skip updating vertex attrib array when binding zero texture Previously, when usecases bind the zero texture, the vertex attrib array was disabled. This made the following bound textures lose the vertex attrib data. In this change, updating vertex attrib array in prepareForDraw() is skipped when the application binds zero texture but does not activate the corresponding texture unit. Also GLES1 tests using zero texture are added to make sure vertex attrib array is enabled correctly. Test: angle_end2end_tests --gtest_filter=DrawTextureTest.* Bug: b/426740680 Change-Id: Ic5aad0a60c9d987edcb1d05cdb6b68dd93eac309 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6659335 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Tim Van Patten 2e9de3c7 2025-07-07T16:58:18 ValidateGetTexLevelParameterBase: Support GL_MEMORY_SIZE_ANGLE ANGLE supports the extension GL_ANGLE_memory_size, which adds the new parameter GL_MEMORY_SIZE_ANGLE. However, the parameter value is not supported in ValidateGetTexLevelParameterBase(), so any calls using it always fail with GL_INVALID_ENUM. The parameter is supposed to be tested by MemorySizeTest.BasicUsageTexture/*, but the portion of the test validating GL_MEMORY_SIZE_ANGLE is never executed because it requires an OpenGL ES 3.1+ context, but the test is only instantiated for GLES 2.0 and 3.0. Based on all the above: 1. Add support for GL_MEMORY_SIZE_ANGLE to ValidateGetTexLevelParameterBase(), requiring GLES 2.0+ and the extension memorySizeANGLE is enabled. 2. Instantiate MemorySizeTest to run on GLES 2.0, 3.0, 3.1, and 3.2, so the entire test is run on devices that support GLES 3.1+ contexts. Bug: b/409384875 Test: angle_end2end_tests --gtest_filter=MemorySizeTest.* Change-Id: I70c5721c5da18cb8edbc9a7e18038d5d9fb486da Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6710993 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Kramer Ge 52005af1 2025-07-02T16:11:30 Define angle_use_gbm=false when !angle_has_build angle_use_gbm is not defined when !angle_has_build. This causes build to fail. Define it to false in this case. Bug: angleproject:425569857 Change-Id: I8ba66f528b3052725467aeafe046900ec06b8989 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6701310 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Kramer Ge <fangzhoug@chromium.org>
Charlie Lao 2269011c 2025-06-30T14:08:11 Remove BitSet::to_ulong and BitSetArray::to_ulong BitSet::to_ulong() is a bit redundant with bits(), and has a risk of losing upper bits on windows platform where unsigned long is 32 bit. This CL removes the usage of it and replaced with bits(). BitSetArray::to_ulong() method only captures up to 64 bits, all other bits are dropped silently which is wrong. This CL fix this and serialize it as a vector of uint64_t. BitSetArray::to_ulong() is removed in this CL. Bug: angleproject:42264163 Change-Id: I663b2cdacc0e930ee616e333131e831ec124a9d4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6691283 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Geoff Lang 2f8193ec 2025-06-25T13:17:47 Validate buffers bound for transform feedback are not modified. The ES spec says it is undefined to write to a buffer that is currently being used for transform feedback output but recommends generating an error. Generate INVALID_OPERATION in this case. Bug: chromium:427162086 Change-Id: I727d18c2035509fe2e5d60680eb5198e40a60e33 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6673310 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Charlie Lao 9a05a2b7 2025-06-23T16:24:13 Reland "Vulkan: Avoid some loops in VertexArray::onBufferChanged" This reverts commit 5df85793c602d64d47ef68e29542313be4116bc0. Reason for revert: the regression bug is fixed Some of the functionality related code has been merged into previous CL. This CL now mostly clean up. The old subject/observer code is been deleted from VertexArray. Bug: angleproject:400711938 Original change's description: > Revert "Vulkan: Avoid some loops in VertexArray::onBufferChanged" > > This reverts commit 8d6d127acc1072488e5b57ba4e7e93da2d94bfda. > > Reason for revert: https://issues.chromium.org/427064102 > > Bug: angleproject:400711938 > Original change's description: > > Vulkan: Avoid some loops in VertexArray::onBufferChanged > > > > Before this CL, VertexArray::onBufferChanged() loops over > > bufferBindingMask bits and calls onSubjectStateChange. In this CL, > > VertexArray::onSubjectStateChange is embedded into > > VertexArray::onBufferChanged(). DIRTY_BIT_ELEMENT_ARRAY_BUFFER and > > DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA is re-arranged so that we can map > > bufferBindingMask directly to VertexArray::mDirtyBits. This especially > > useful when one buffer is bound to multiple indices in the VertexArray. > > > > This CL also removes angle::ObserverInterface from VertexArray, since it > > no longer observes anything. > > > > ASSERT is added in gl::Buffer::mContentsObservers to ensure it only > > contains BufferTexture, since vertexArray is no longer using the > > subject/observer. > > > > Bug: angleproject:400711938 > > Change-Id: Ie6e7159d7a89f0da5e1b7ca0a9dbe60a1e6c682f > > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6569638 > > Reviewed-by: Geoff Lang <geofflang@chromium.org> > > Commit-Queue: Charlie Lao <cclao@google.com> > > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > > Bug: angleproject:400711938 > Change-Id: I3b8e77db7b3d06b9ed875bfe7787904ac753da11 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6664161 > Commit-Queue: Charlie Lao <cclao@google.com> > Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Bug: angleproject:400711938 Change-Id: If7989b26701dcccbb8e49c42d388c0217e2d0b7f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6663536 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com>
Charlie Lao 2ac49bb6 2025-07-01T12:11:12 Reland "Vulkan: Move VertexArray::ElementBuffer away from observer" This reverts commit 79ac1a8cd767a32cce6401203e20c4bd4ca4d539. Reason for revert: the regression bug is fixed in PS6 The regression bug with the original CL is caused by when we bind a vertex array without element buffer rebind, we missed to reset mIndexRangeInlineCache. The other bug is that VertexArray::mDiryBits is 64 bit but VertexArrayBufferBindingMask is 16 bit, in VertexArray::setDependentDirtyBits(), bufferBindingMask.to_ulong() << DIRTY_BIT_BUFFER_DATA_0 is only producing the 32 bit value on windows platform due to unsigned long is 32 bit value. bits() is used and bit shift is operated on to uint64_t here to avoid dropping high bits on windows. Two tests are added that reproduce the regression bug caused by the original CL. Bug: angleproject:400711938 Original change's description: > Revert "Vulkan: Move VertexArray::ElementBuffer away from observer" > > This reverts commit 3f012a43ee2c101543785720eedfeaa80708479d. > > Reason for revert: https://issues.chromium.org/427064102 > > Bug: angleproject:400711938 > Original change's description: > > Vulkan: Move VertexArray::ElementBuffer away from observer > > > > Right now, VertexArray's element buffer is always observing buffer's > > change. In previous CLs, we have moved vertex array away from > > subject/observer usage. This CL moves element buffer away from > > subject/observer as well. Since the gl::Buffer tracks buffer's binding > > to each context's current vertex array's binding point, > > kElementArrayBufferIndex is added to VertexArrayBufferBindingMask bits > > so that the element buffer is tracked exactly the same as other vertex > > array buffer bindings. The VerextArray code has been modified to handle > > this special bit, since element buffer has its own binding point > > VertexArrayState::mElementArrayBuffer as opposed to > > VertexArrayState::mVertexBindings. After this CL, VertexArray object > > should be completely off subject/observer usages. > > > > Bug: angleproject:400711938 > > Change-Id: I662ddfabc95034bdc7734939c944ab033f41801c > > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6552160 > > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > > Reviewed-by: Geoff Lang <geofflang@chromium.org> > > Commit-Queue: Charlie Lao <cclao@google.com> > > Bug: angleproject:400711938 > Change-Id: I9487ba8b108baaeda1c8a27189dba64f77616774 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6663539 > Commit-Queue: Charlie Lao <cclao@google.com> > Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Bug: angleproject:400711938 Change-Id: I3f47ad1238c41f12b5cbd7a59b84be3fce1e9562 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6664004 Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Shufen Ma 154e5711 2025-06-24T15:28:28 Refine validation for GetQueryObjectuiv Spec says that after a graphics reset has occurred on a context, subsequent GL commands on that context (or any context which shares with that context) will generate a CONTEXT_LOST error. Exceptions to this behavior include: Any commands which might cause a polling application to block indefinitely will generate a CONTEXT_LOST error, but will also return a value indicating completion to the application. Such commands include: - GetSynciv with pname SYNC_STATUS ignores the other parameters and returns SIGNALED in values - GetQueryObjectuiv with pname QUERY_RESULT_AVAILABLE ignores the other parameters and returns TRUE in params Bug: angleproject:427242336 Change-Id: I86fd6f93a2c2a4b60c6a1e19637ee6382fadac7b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6666083 Auto-Submit: Shufen Ma <Shufen.Ma@arm.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Charlie Lao <cclao@google.com>
Mohan Maiya bb3f79dc 2025-06-26T16:59:48 Reorder shader resource dirty bits Process storage and atomic buffer dirty bits before uniform dirty bits. This helps the vulkan backend avoid duplicate work when multiple shader resources are dirty Bug: angleproject:426412564 Change-Id: Ibab3da44ee32d22078df851bfed4967d1c2a605e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6680035 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com>
Zhuang Xu 3c8b492e 2025-06-26T09:39:29 Add histogram for DirectX device removal Bug: dawn:423964507 Change-Id: I22d40ede209797e759f4b4f9e4b86785df33dbe5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6665860 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
Avi Drissman d28c6adf 2025-06-19T09:41:26 Modernize for macOS 12 macOS 12 is the minimum OS requirement, so remove the "main port" workaround and do other modernization. Bug: b/40250210 Change-Id: I9638014732f0589fc6171c0fe617b3c563f00c28 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6655558 Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Alexey Knyazev 56e9bfff 2025-06-19T00:00:00 GL: Remove obsolete macOS workarounds Bug: angleproject:427600175 Change-Id: I8bfc062b71f1a34de09cbf76b504293ccd081fe0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6676022 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
Kramer Ge dcc715ee 2025-06-19T15:35:53 Enable EGL_PLATFORM_GBM_KHR platform with device selection FunctionsEGL.cpp: - Allow EGL_PLATFORM_GBM_KHR platform and explicit device selection. - Skip getPreferredDisplay if an explicit device is specified. Display.cpp: - Use DisplayEGL impl with EGL_PLATFORM_GBM_KHR. - Wayland can use GBM platform, and OPENGLES. angle.gni: - Rename ozone_platform_gbm to ozone_platform_drm since its deprecated. Bug: angleproject:425569857, b/396434686 Change-Id: I9493118f9dc95f78ebe46277bb4fcfeb7a29d465 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6663699 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Kramer Ge <fangzhoug@chromium.org>
Igor Nazarov d5babf99 2025-06-23T12:46:51 Vulkan: Fix unhandled deferred clears after glGetMultisamplefv Issue was introduced in the commit that implemented deferred clears. The `glGetMultisamplefv()` synchronizes draw framebuffer which defers possibly staged clears. Since API is not handling deferred clears they are left untouched, causing the ASSERT. This change fixes the issue by not deferring clears for the `glGetMultisamplefv()` command during flushing staged updates of dirty framebuffer attachments. Changes: - Add `gl::Command::GetMultisample` enumeration for clarity. - Add `gl::CommandBlitBuffer::CommandBlitBufferDepthStencil` enumeration to improve code readability. - Add `command` parameter into `gl::State::syncDirtyObject()` method to use actual command enum instead of `Other`. - Remove `previousDeferredClears` local variable and update ASSERT in the `FramebufferVk::syncState()` method. New assert ensures empty `mDeferredClears` instead of just checking dirty attachments, since it is easy to make all attachments dirty making old and new assertions act the same. - Replace logic in `FramebufferVk::syncState()` that decides whether need to defer attachments or not with switch-case. This makes the logic more clear regarding handling individual commands and simplify updating this handling in the future. Except of the bug fix with `GetMultisample` command, handling of other command is uncached. - Remove `flushDeferredClears()` from `FramebufferVk::readPixels()` because `mDeferredClears` are not expected (now it's more clear after the refactoring). And even if there are `mDeferredClears` (in case of a bug or after API failure), `flushDeferredClears()` only flushes clears for the draw framebuffer, while checking `mDeferredClears` of the read framebuffer. This is a problem in case if read and draw framebuffers are not the same. Bug: angleproject:40644727 Test: angle_end2end_tests --gtest_filter=TextureMultisampleTest.GetMultisamplefvAfterClear/* Test: angle_end2end_tests --gtest_filter=EGLSurfaceTest.GetMultisamplefvAfterClear/* Change-Id: I376a62de52de5e17dbc63cc7ddb0506741a69266 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6661958 Commit-Queue: Igor Nazarov <i.nazarov@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Mohan Maiya b3ec3a5f 2025-06-23T14:51:13 Track active uniform and storage buffer blocks Track active uniform and storage buffer block indices so we can process updates to only active buffer blocks Bug: angleproject:426412564 Change-Id: I54fa6fbe795073887646d672303d231ed4317b65 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6663825 Commit-Queue: mohan maiya <m.maiya@samsung.com> Reviewed-by: Charlie Lao <cclao@google.com>
Alexey Knyazev beae1b4a 2025-06-19T00:00:00 Metal: Remove obsolete workarounds Removed Intel-specific Metal workarounds that are not used on macOS 12 and later. Removed a redundant version check. Bug: angleproject:427600175 Change-Id: I34c7e53108f7e030512c9436ab2b9ae38ad17946 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6672312 Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>
Charlie Lao 79ac1a8c 2025-06-23T11:11:10 Revert "Vulkan: Move VertexArray::ElementBuffer away from observer" This reverts commit 3f012a43ee2c101543785720eedfeaa80708479d. Reason for revert: https://issues.chromium.org/427064102 Bug: angleproject:400711938 Original change's description: > Vulkan: Move VertexArray::ElementBuffer away from observer > > Right now, VertexArray's element buffer is always observing buffer's > change. In previous CLs, we have moved vertex array away from > subject/observer usage. This CL moves element buffer away from > subject/observer as well. Since the gl::Buffer tracks buffer's binding > to each context's current vertex array's binding point, > kElementArrayBufferIndex is added to VertexArrayBufferBindingMask bits > so that the element buffer is tracked exactly the same as other vertex > array buffer bindings. The VerextArray code has been modified to handle > this special bit, since element buffer has its own binding point > VertexArrayState::mElementArrayBuffer as opposed to > VertexArrayState::mVertexBindings. After this CL, VertexArray object > should be completely off subject/observer usages. > > Bug: angleproject:400711938 > Change-Id: I662ddfabc95034bdc7734939c944ab033f41801c > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6552160 > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Commit-Queue: Charlie Lao <cclao@google.com> Bug: angleproject:400711938 Change-Id: I9487ba8b108baaeda1c8a27189dba64f77616774 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6663539 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Charlie Lao 5df85793 2025-06-23T11:08:49 Revert "Vulkan: Avoid some loops in VertexArray::onBufferChanged" This reverts commit 8d6d127acc1072488e5b57ba4e7e93da2d94bfda. Reason for revert: https://issues.chromium.org/427064102 Bug: angleproject:400711938 Original change's description: > Vulkan: Avoid some loops in VertexArray::onBufferChanged > > Before this CL, VertexArray::onBufferChanged() loops over > bufferBindingMask bits and calls onSubjectStateChange. In this CL, > VertexArray::onSubjectStateChange is embedded into > VertexArray::onBufferChanged(). DIRTY_BIT_ELEMENT_ARRAY_BUFFER and > DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA is re-arranged so that we can map > bufferBindingMask directly to VertexArray::mDirtyBits. This especially > useful when one buffer is bound to multiple indices in the VertexArray. > > This CL also removes angle::ObserverInterface from VertexArray, since it > no longer observes anything. > > ASSERT is added in gl::Buffer::mContentsObservers to ensure it only > contains BufferTexture, since vertexArray is no longer using the > subject/observer. > > Bug: angleproject:400711938 > Change-Id: Ie6e7159d7a89f0da5e1b7ca0a9dbe60a1e6c682f > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6569638 > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Commit-Queue: Charlie Lao <cclao@google.com> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Bug: angleproject:400711938 Change-Id: I3b8e77db7b3d06b9ed875bfe7787904ac753da11 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6664161 Commit-Queue: Charlie Lao <cclao@google.com> Reviewed-by: Amirali Abdolrashidi <abdolrashidi@google.com>
Mohan Maiya 2fd033d0 2025-05-22T04:21:11 Vulkan: Optimize updates to uniform buffers ... when only the offset is modified. Most of the work done when handling dirty uniforms can be skipped since the buffer bindings haven't changed Bug: angleproject:386749841 Tests: UniformBufferTest31.UniformBufferBindingRangeChange*Vulkan Change-Id: Ic811bd71f0f2993f88ce9bcf93f9e8e46dfc6d99 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6581359 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: mohan maiya <m.maiya@samsung.com>
Yuxin Hu 5220e634 2025-06-16T11:14:22 Fix glCopyImageSubData validation check part 2 For compressed texture, we also need to check if the copy subregion starting points (offset) are aligned with the compressed block. This change also moves *FillsEntireMip check to the ValidateCompressedRegion() function, as it is easier to do a per-dimension check. Bug: b/419048313 Bug: angleproject:42264179 Bug: angleproject:42265887 Change-Id: I0f415e575bbc77bdf5178e2b5fc1260c43e7de4b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6648198 Commit-Queue: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com>
Amirali Abdolrashidi 6bb47e67 2025-06-17T13:42:47 Vulkan: Limit finalizing foreign image layouts Currently, any submission results in finalizing all foreign images. However, if the submission is only limited to the outside render pass command buffer, this would result in oldLayout VVL errors (01197), as it would be too early to finalize the layout of such images at those times. At this time, this type of submission can occur if the size of buffer-to-image updates exceeds the following threshold: kMaxBufferToImageCopySize In this change, finalizing the foreign image layouts would only occur when all commands are being submitted. * In ContextVk::submitCommands(), finalizeAllForeignImages() is now called only when the submission type is Submit::AllCommands. * Added new submit tests for foreign images to ImageTest: * UploadForeignUntilSubmitDoesNotBreakRenderPass * CopyToForeignUntilSubmitDoesNotBreakRenderPass Bug: b/425987310 Change-Id: Ia345e176be79017ba18ef52a57256eeeb298e39a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6653602 Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>
Geoff Lang 5d124404 2025-06-17T17:04:12 WebGPU: Fix bind groups leaking in CommandBuffer. Wrap all per-submission member variables in a struct so that we can reset everything at once using the default constructor. This avoids similar leaks in the future. Bug: chromium:413078308 Change-Id: I3f926c82905b73b27d6b751cfe2878a41ced916a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6652290 Reviewed-by: Matthew Denton <mpdenton@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Kai Ninomiya 41144603 2025-06-06T10:56:03 WebGPU: Handle Dawn breaking change in CreateInstance Needed in order to update Dawn to match the standard webgpu.h, here: https://dawn-review.googlesource.com/c/dawn/+/245242 Bug: chromium:414868137 Change-Id: I2bdf5bd5747a8da8ed0612a99d70eee8a3d09ecb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6652516 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org> Auto-Submit: Kai Ninomiya <kainino@chromium.org>
Charlie Lao 59281334 2025-05-22T17:13:22 Vulkan: Reduce kMaxEmptySlots for SharedDescriptorSetCacheKey There is report that addKey is still showing up in simpleperf. This CL breaks addKeyImpl into three functions so that SharedFramebufferCacheKey will still have the same behavior. SharedDescriptorSetCacheKey is changed to track 64 cache key at maximum, and updateEmptySlotBits() is never called in SharedDescriptorSetCacheKey. This means the shared cache key tracking is further limited to usage case where a buffer/texture is only involved in less than 64 descriptorSets. Otherwise we will not track the remaining DescriptorSets, which means if this buffer is released, the corresponding descriptorSet will not immediately destroyed, and we will rely on cache eviction code to take care of DS growing problem. Bug: b/384839847 Change-Id: I99abd17966446377babace6d06cc8f380a71c084 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6581492 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Charlie Lao <cclao@google.com>
Geoff Lang dea162cc 2025-06-09T15:43:05 WebGPU: Finalize command blocks when starting a new one The command buffer abstraction would not finalize blocks of commands when creating a new block, leading to possible infinite loops when processing the commands. Bug: chromium:413078308 Change-Id: Idf4e95a5ccc71f3ddc9a4202e5e000c0e2cd5f87 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6629473 Reviewed-by: Liza Burakova <liza@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
Mohan Maiya 9d70781f 2025-06-17T07:06:37 Vulkan: Bugfix in TextureVk::initImage(...) Account for compute based mipmap generation during initImage Bug: angleproject:405840226 Tests: ImageTestES3.SourceAHBTargetTexture2DGenerateMipmap* Change-Id: Ic2f6c4576ec8ff464a5d60c4a49aeb87be3a5785 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6650712 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com>
Amirali Abdolrashidi 9e000857 2025-02-04T16:12:47 Vulkan: Utilize VkBufferUsageFlags2 for bufferview * Added the following struct to bufferview createInfo in case of VK_KHR_maintenance5 support: VkBufferUsageFlags2CreateInfoKHR * Limited VVL 08779 to platforms without KHR_maintenance5 support. Bug: angleproject:394353300 Change-Id: I46beac693cda3216afc497c8ed74cbf51b72e549 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6231512 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
Matthew Denton 243ebfa7 2025-06-16T16:07:06 WebGPU: Allow glReadPixels from non-base mip levels. Before, the WebGPU backend always read from the base level of the texture attached to the current framebuffer. Bug: angleproject:42267090 Change-Id: Ibe5b8575f6fa90c1942ba566485b6175ee10f808 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6634558 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Auto-Submit: Matthew Denton <mpdenton@chromium.org>
Aurora Zhang dfefcbc6 2025-06-09T16:30:55 glGetProgramiv should return the properties in effect glProgramParameteri can set values to GL_PROGRAM_BINARY_RETRIEVABLE_HINT. However, this setting will not be in effect until the next time glLinkProgram or glProgramBinary has been called successfully. Also, glGetProgramiv returns the properties currently in effect for program. Therefore, we need to add a variable to record the ineffective value and copy it at the stage of glLinkProgram or glProgramBinary. Bug: angleproject:421219220 Change-Id: Ib564e6df03d34f3fc7389f926795cb3e64cbf687 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6606372 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Aurora Zhang <Aurora.Zhang@arm.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Kimmo Kinnunen 94ee620d 2025-05-22T10:07:05 Metal: Allow optimization of simple loops Reimplement the feature to avoid undefined behavior of infinite loops. Add EnsureLoopForwardProgress rewrite pass that inserts a volatile variable access to all loops that it cannot analyze as being finite. Detect loops of form `for (; i <op> x; ++i)` as being finite. The <op> can be any of <,<=,>,>=,==, != operator. The i can be int or uint. The ++i can be -- or ++, -=1, +=1. This assumes that backends using the feature emit signed int arithmetic with defined wraparound semantics. Uses volatile write instead of asm("") due to asm not forcing the behavior in some compiler versions. The volatile variable access is defined in C++ as forward progress, and by inheritance this works in MSL. Later commits may remove injectAsmStatementIntoLoopBodies if ensureLoopForwardProgress is appropriate for all use-cases. Bug: angleproject:418918522 Change-Id: Ic9c29f57044b792195386483208632354d24c854 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6575051 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>