Skip to content

[shader] uniform vec4 array in Android emulator #180068

Description

@lesaff-r

Steps to reproduce

  1. Create a uniform vec4 array in .frag
  2. Use SetFloat 4 times in dart to initialize the vec4
  3. Launch app on Android emulator

Tested on :

  • Nexus 7 android-33 arm64-v8a
  • Nexus 10 android-33 arm64-v8a
  • Medium_phone android-36.1 arm64-v8a

Expected results

Each value is set for each vec4 component

Actual results

Each value is set for the r/x component of 4 vec4

Code sample

Code sample

main.dart

import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:flutter_shaders/flutter_shaders.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Simple Shader Demo',
      theme: ThemeData(colorSchemeSeed: Colors.blue),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Simple Shader Demo')),
      body: ShaderBuilder(
        assetKey: 'shaders/simple.frag',
        (context, shader, child) => CustomPaint(
          size: MediaQuery.of(context).size,
          painter: ShaderPainter(shader: shader),
        ),
        child: const Center(child: CircularProgressIndicator()),
      ),
    );
  }
}

class ShaderPainter extends CustomPainter {
  ShaderPainter({required this.shader});
  ui.FragmentShader shader;

  @override
  void paint(Canvas canvas, Size size) {
    shader.setFloat(0, size.width);
    shader.setFloat(1, size.height);
    shader.setFloat(2, 0.2); // Example value for values.r
    shader.setFloat(3, 0.4); // Example value for values.g
    shader.setFloat(4, 0.6); // Example value for values.b
    shader.setFloat(5, 0.8); // Example value for values.a

    final paint = Paint()..shader = shader;
    canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

expected correct shader.frag

#version 460 core

#include <flutter/runtime_effect.glsl>

precision mediump float;

uniform vec2 resolution;
uniform vec4 values[1];

out vec4 fragColor;

void main() {
  vec2 st = FlutterFragCoord().xy / resolution.xy;

  // Determine quadrant (0..1 in x and y)
  float cx = step(0.5, st.x); // 0 if x < 0.5 else 1
  float cy = step(0.5, st.y); // 0 if y < 0.5 else 1

  // Select value for each quadrant:
  // lower-left: values.r
  // lower-right: values.g
  // upper-left: values.b
  // upper-right: values.a
  float value = 0.0;
  if (cx == 0.0 && cy == 0.0) {
    value = values[0].r;
  } else if (cx == 1.0 && cy == 0.0) {
    value = values[0].g;
  } else if (cx == 0.0 && cy == 1.0) {
    value = values[0].b;
  } else {
    value = values[0].a;
  }

  value = clamp(value, 0.0, 1.0);
  vec3 color = vec3(value);

  fragColor = vec4(color, 1.0);
}

actual correct shader.frag

#version 460 core

#include <flutter/runtime_effect.glsl>

precision mediump float;

uniform vec2 resolution;
uniform vec4 values[4];

out vec4 fragColor;

void main() {
  vec2 st = FlutterFragCoord().xy / resolution.xy;

  // Determine quadrant (0..1 in x and y)
  float cx = step(0.5, st.x); // 0 if x < 0.5 else 1
  float cy = step(0.5, st.y); // 0 if y < 0.5 else 1

  // Select value for each quadrant:
  // lower-left: values.r
  // lower-right: values.g
  // upper-left: values.b
  // upper-right: values.a
  float value = 0.0;
  if (cx == 0.0 && cy == 0.0) {
    value = values[0].r;
  } else if (cx == 1.0 && cy == 0.0) {
    value = values[1].r;
  } else if (cx == 0.0 && cy == 1.0) {
    value = values[2].r;
  } else {
    value = values[3].r;
  }

  value = clamp(value, 0.0, 1.0);
  vec3 color = vec3(value);

  fragColor = vec4(color, 1.0);
}

Screenshots or Video

Screenshots / Video demonstration

Expected result
Image

Actual result

Image

Logs

Logs
I/flutter (19427): [IMPORTANT:flutter/shell/platform/android/android_context_gl_impeller.cc(104)] Using the Impeller rendering backend (OpenGLES).

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.38.5, on macOS 15.6.1 24G90 darwin-arm64, locale en-US) [188ms]
    • Flutter version 3.38.5 on channel stable at /Users/lesaff-r/repos/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision f6ff1529fd (7 days ago), 2025-12-11 11:50:07 -0500
    • Engine revision 1527ae0ec5
    • Dart version 3.10.4
    • DevTools version 2.51.1
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, omit-legacy-version-file,
      enable-lldb-debugging

[✓] Android toolchain - develop for Android devices (Android SDK version 36.1.0) [890ms]
    • Android SDK at /Users/lesaff-r/Library/Android/sdk
    • Emulator version 36.3.10.0 (build_id 14472402) (CL:N/A)
    • Platform android-36, build-tools 36.1.0
    • ANDROID_SDK_ROOT = /Users/lesaff-r/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
      This is the JDK bundled with the latest Android Studio installation on this machine.
      To manually set the JDK path, use: `flutter config --jdk-dir="path/to/jdk"`.
    • Java version OpenJDK Runtime Environment (build 21.0.8+-14018985-b1038.68)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 16.4) [615ms]
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 16F6
    • CocoaPods version 1.16.2

[✓] Chrome - develop for the web [4ms]
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Connected device (5 available) [5.8s]
    • POCOPHONE F1 (mobile)       • 82b7355a                  • android-arm64  • Android 10 (API 29)
    • sdk gphone64 arm64 (mobile) • emulator-5554             • android-arm64  • Android 16 (API 36) (emulator)
    • Rémi’s iPhone (mobile)      • 00008101-000259C63486001E • ios            • iOS 18.6.2 22G100
    • macOS (desktop)             • macos                     • darwin-arm64   • macOS 15.6.1 24G90 darwin-arm64
    • Chrome (web)                • chrome                    • web-javascript • Google Chrome 142.0.7444.176

[✓] Network resources [215ms]
    • All expected network resources are available.

• No issues found!

Metadata

Metadata

Assignees

Labels

P2Important issues not at the top of the work listengineflutter/engine related. See also e: labels.found in release: 3.38Found to occur in 3.38found in release: 3.40Found to occur in 3.40has reproducible stepsThe issue has been confirmed reproducible and is ready to work onplatform-androidAndroid applications specificallyr: fixedIssue is closed as already fixed in a newer versionteam-androidOwned by Android platform teamtriaged-androidTriaged by Android platform team

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions