f31522130f
Build system (5 gaps hardened): - COOKBOOK_OFFLINE defaults to true (fork-mode) - normalize_patch handles diff -ruN format - New 'repo validate-patches' command (25/25 relibc patches) - 14 patched Qt/Wayland/display recipes added to protected list - relibc archive regenerated with current patch chain Boot fixes (fixable): - Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset) - D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped) - redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped) - daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch) - udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async) - relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs - greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait) - greeter-ui: built and linked (header guard unification, sem_compat stubs removed) - mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps - greeter config: removed stale keymapd dependency from display/greeter services - prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified Unfixable (diagnosed, upstream): - i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort - kded6/greeter-ui: page fault 0x8 — Qt library null deref - Thread panics fd != -1 — Rust std library on Redox - DHCP timeout / eth0 MAC — QEMU user-mode networking - hwrngd/thermald — no hardware RNG/thermal in VM - live preload allocation — BIOS memory fragmentation, continues on demand
49 lines
2.2 KiB
GLSL
49 lines
2.2 KiB
GLSL
// Copyright (C) 2025 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#version 440
|
|
precision highp float;
|
|
|
|
layout(location = 0) in vec2 qt_TexCoord0;
|
|
layout(location = 0) out vec4 fragColor;
|
|
|
|
layout(binding = 1) uniform sampler2D source;
|
|
|
|
layout(std140, binding = 0) uniform buf {
|
|
mat4 qt_Matrix; // reserved
|
|
float qt_Opacity; // reserved
|
|
vec2 sourceItemSize; // The size of the input item. The source is divided into a grid of cells.
|
|
vec4 borderColor; // The color of the border (to be masked away). Set to transparent to ignore.
|
|
vec4 particleColor; // The color of the noise particle
|
|
float borderMaskEnabled; // Enabled mask or not. If the bg and border color is the same, set this to 0
|
|
float borderMaskThreshold; // The threshold for determining if a pixel belongs to the border (taking anti-aliasing into account)
|
|
float particleSize; // The size of a dust particle (aka the cell size in the grid)
|
|
float particleOpacity; // The particleOpacity of the particle
|
|
float particleDensity; // The threshold deciding if a particle (aka cell in the grid) should be visible or not
|
|
float time; // time, for animating the noise
|
|
} args;
|
|
|
|
float random(vec2 st, float t) {
|
|
vec2 offsetSt = st + t;
|
|
return fract(sin(dot(offsetSt.xy, vec2(12.9898, 78.233))) * 43758.5453123);
|
|
}
|
|
|
|
void main() {
|
|
vec4 sourceColor = texture(source, qt_TexCoord0);
|
|
vec2 pixelCoord = qt_TexCoord0 * args.sourceItemSize;
|
|
vec2 noiseCoord = floor(pixelCoord / args.particleSize);
|
|
float randomValue = random(noiseCoord, args.time);
|
|
float noiseMix = step(randomValue, args.particleDensity);
|
|
|
|
float calculatedBorderMask = step(args.borderMaskThreshold, distance(sourceColor.rgba, args.borderColor.rgba));
|
|
float borderMask = mix(1.0, calculatedBorderMask, args.borderMaskEnabled);
|
|
float finalMask = sourceColor.a * borderMask;
|
|
float finalAlpha = sourceColor.a * args.qt_Opacity;
|
|
float maskedNoiseAlpha = noiseMix * args.particleOpacity * finalMask;
|
|
|
|
vec3 blendedColor = mix(sourceColor.rgb, args.particleColor.rgb, maskedNoiseAlpha);
|
|
vec3 preMultipliedColor = blendedColor * args.qt_Opacity;
|
|
|
|
fragColor = vec4(preMultipliedColor, finalAlpha);
|
|
}
|