Skip to content

[Flutter GPU] Bind uniforms and textures by cached reflection index - #189820

Merged
auto-submit[bot] merged 6 commits into
flutter:masterfrom
bdero:bdero/flutter-gpu-bind-by-index
Jul 30, 2026
Merged

auto-submit[bot] merged 6 commits into
flutter:masterfrom
bdero:bdero/flutter-gpu-bind-by-index

Conversation

@bdero

@bdero bdero commented Jul 22, 2026 •

Copy link
Copy Markdown
Member

Fixes #189819.

RenderPass.bindUniform and RenderPass.bindTexture passed the uniform name across the FFI boundary as a string on every call, and the native side allocated a std::string and resolved the binding through a string-keyed map lookup per bind, per draw.

UniformSlot now resolves the binding's index in the shader's reflection data once, caches it, and binds through new index-taking entry points. Shader.getUniformSlot memoizes slots by name so per-draw lookups share the cache, and a reload epoch re-resolves cached indices after a shader library hot reload. The name-keyed entry points remain, and public API behavior is unchanged.

In a benchmark submitting ~10k draws per frame (flutter_scene's stress harness, macOS/Metal, profile engine, A/B at the same revision), CPU render time improves 7-12% at p50.

Pre-launch Checklist

RenderPass.bindUniform and bindTexture previously passed the uniform name as a string across the FFI boundary on every call, and the native side allocated a std::string and did a string-keyed map lookup per bind, per draw. UniformSlot now resolves the binding's position in the shader's stable reflection order once, caches it, and binds through new index-taking entry points that address a vector directly. Shader.getUniformSlot memoizes slots by name so repeat lookups share the cached index, and a reload epoch re-resolves indices when a shader library hot reloads in place. The name-keyed native entry points remain for compatibility.
@github-actions github-actions Bot added engine flutter/engine related. See also e: labels. flutter-gpu team-fluttergpu Owned by Flutter GPU team labels Jul 22, 2026
@bdero bdero added e: impeller Impeller rendering backend issues and features requests c: performance Relates to speed or footprint issues (see "perf:" labels) labels Jul 22, 2026
@github-project-automation github-project-automation Bot moved this to 🤔 Needs Triage in Flutter GPU Jul 22, 2026
@bdero
bdero requested a review from wolfenrain July 22, 2026 04:07
@bdero
bdero marked this pull request as ready for review July 22, 2026 04:07

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request optimizes shader uniform and texture binding by caching reflection indices on the Dart side and introducing indexed binding paths across the FFI boundary, avoiding string lookups on every draw. It also handles invalidating these cached indices during shader hot reloads. The review feedback suggests throwing ArgumentError instead of a generic Exception for missing uniform or texture slots to align with Dart style guidelines, and updating the tests to use throwsArgumentError assertions.

Comment thread engine/src/flutter/lib/gpu/lib/src/render_pass.dart
Comment thread engine/src/flutter/lib/gpu/lib/src/render_pass.dart
Comment thread engine/src/flutter/testing/dart/gpu_test.dart
wolfenrain
wolfenrain previously approved these changes Jul 23, 2026
@bdero bdero added the autosubmit Merge PR when tree becomes green via auto submit App label Jul 24, 2026
@auto-submit auto-submit Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jul 24, 2026
@auto-submit

auto-submit Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

autosubmit label was removed for flutter/flutter/189820, because - The status or check suite Tree_analyze has failed. Please fix the issues identified (or deflake) before re-applying this label.

@github-actions github-actions Bot removed the e: impeller Impeller rendering backend issues and features requests label Jul 24, 2026
@bdero bdero added the CICD Run CI/CD label Jul 29, 2026
@bdero bdero added the autosubmit Merge PR when tree becomes green via auto submit App label Jul 30, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Jul 30, 2026
Merged via the queue into flutter:master with commit f538bd7 Jul 30, 2026
22 checks passed
@github-project-automation github-project-automation Bot moved this from 🤔 Needs Triage to ✅ Done in Flutter GPU Jul 30, 2026
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Jul 30, 2026
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Aug 9, 2026
…12401)

Manual roll Flutter from 2757a77a73df to e52f01c920ad (47 revisions)

Manual roll requested by [email protected]

flutter/flutter@2757a77...e52f01c

2026-07-31 [email protected] [Impeller] Execute PipelineCompileQueue jobs in the order that they were added (flutter/flutter#190262)
2026-07-31 [email protected] Roll Packages from 7d17fc8 to 5351d8c (5 revisions) (flutter/flutter#190351)
2026-07-31 [email protected] Roll Skia from dcbd015c9646 to 7ef86a5b0eb9 (4 revisions) (flutter/flutter#190347)
2026-07-31 [email protected] [Impeller] Do not acquire an unneeded image in KHRSwapchainVK if the swapchain must be recreated due to a size change (flutter/flutter#190116)
2026-07-31 [email protected] Remove the --enable-serial-gc engine flag (flutter/flutter#190310)
2026-07-31 [email protected] Migrate platform_channel_swift example to material_ui (flutter/flutter#190308)
2026-07-31 [email protected] macOS: Set static text accessibility role for read-only text fields (flutter/flutter#190330)
2026-07-31 [email protected] Roll Dart SDK from 96f49fc43f59 to c3acfc2479f6 (1 revision) (flutter/flutter#190336)
2026-07-31 [email protected] Roll Skia from 07f08414dd66 to dcbd015c9646 (1 revision) (flutter/flutter#190333)
2026-07-31 [email protected] [web] Autofill all AutofillGroup fields in semantics mode (flutter/flutter#187108)
2026-07-31 [email protected] iOS: Configure test task runner thread at display QoS (flutter/flutter#190283)
2026-07-31 [email protected] Roll Skia from a1109355de78 to 07f08414dd66 (5 revisions) (flutter/flutter#190328)
2026-07-31 [email protected] Support reduceMotion accessibility feature in MediaQuery (flutter/flutter#190287)
2026-07-30 [email protected] Roll Dart SDK from 43f7de5f4977 to 96f49fc43f59 (4 revisions) (flutter/flutter#190312)
2026-07-30 [email protected] fix: text selection two handles directionality. (flutter/flutter#179928)
2026-07-30 [email protected] Add java/gradle check when gradle crashes (flutter/flutter#189997)
2026-07-30 [email protected] [Impeller] Add filterQuality support to ImageFilter.shader (flutter/flutter#188544)
2026-07-30 [email protected] [flutter/flutter] Migrate multiple_windows example to material_ui (flutter/flutter#190313)
2026-07-30 [email protected] Roll Skia from 50cf67910462 to a1109355de78 (6 revisions) (flutter/flutter#190306)
2026-07-30 [email protected] Migrate swift xctests to Swift testing tests (flutter/flutter#187801)
2026-07-30 [email protected] Migrates the platform_channel example to material_ui (flutter/flutter#190253)
2026-07-30 [email protected] iOS: Drop unnecessary @mainactor from VSyncClientTests (flutter/flutter#190285)
2026-07-30 [email protected] Add nullptr check to isOpaque (flutter/flutter#189796)
2026-07-30 [email protected] [Flutter GPU] Bind uniforms and textures by cached reflection index (flutter/flutter#189820)
2026-07-30 [email protected] Migrate layers example to material_ui (flutter/flutter#190237)
2026-07-30 [email protected] Add `ShapeBorder` hit test fast paths (flutter/flutter#187962)
2026-07-30 [email protected] ci: mac-must-wait part duex (flutter/flutter#190295)
2026-07-30 [email protected] Roll Skia from 491301f393d1 to 50cf67910462 (3 revisions) (flutter/flutter#190294)
2026-07-30 [email protected] Roll Packages from dd11626 to 7d17fc8 (1 revision) (flutter/flutter#190293)
2026-07-30 [email protected] Roll Skia from 177de1940bf2 to 491301f393d1 (1 revision) (flutter/flutter#190279)
2026-07-30 [email protected] Roll Skia from b8bda91f02db to 177de1940bf2 (5 revisions) (flutter/flutter#190272)
2026-07-30 [email protected] Roll Fuchsia Linux SDK from J8rVTlBnjnUpuHYk3... to _J8wM3kyQpLN9wvRD... (flutter/flutter#190273)
2026-07-30 [email protected] Roll Skia from 78afc18c9ba0 to b8bda91f02db (3 revisions) (flutter/flutter#190268)
2026-07-30 [email protected] Revert: Split the platform and cpuArch part of TargetPlatform (flutter/flutter#190258)
2026-07-30 [email protected] Return null from RenderProxyBoxMixin.computeDryBaseline when the child has no baseline (flutter/flutter#189723)
2026-07-30 [email protected] Roll Skia from 6fea713d32ec to 78afc18c9ba0 (4 revisions) (flutter/flutter#190257)
2026-07-30 [email protected] Roll pub packages (flutter/flutter#190259)
2026-07-29 [email protected] [cross imports] Check examples cross imports (flutter/flutter#187662)
2026-07-29 [email protected] ci: mac verify binaries still has to wait on linux_host_engine (flutter/flutter#190239)
2026-07-29 [email protected] Adds analytics to macos impeller opt in/out (flutter/flutter#190220)
2026-07-29 [email protected] Roll Skia from 0f35bba4945c to 6fea713d32ec (6 revisions) (flutter/flutter#190230)
2026-07-29 [email protected] iOS: Fix Swift warning in TracingTests (flutter/flutter#190203)
2026-07-29 [email protected] Convert all gradle-wrapper.properties in /dev to use distribution 'bin' (flutter/flutter#190226)
2026-07-29 [email protected] Roll Packages from 3e63635 to dd11626 (11 revisions) (flutter/flutter#190216)
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c: performance Relates to speed or footprint issues (see "perf:" labels) CICD Run CI/CD engine flutter/engine related. See also e: labels. flutter-gpu team-fluttergpu Owned by Flutter GPU team

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

[Flutter GPU] Uniform and texture binds marshal the slot name across the FFI boundary on every call

2 participants