#!/usr/bin/env python3 """Test WebGPU → Canvas → PNG precision loss Check if bgra8unorm → 2D canvas → PNG loses 2 LSBs. """ import numpy as np # Simulate WebGPU bgra8unorm conversion # Float [0, 1] → uint8 [0, 255] test_values = [ 1.0, # Perfect white 0.9999, # Near-white 254.5/255, # Exactly 254.5 253.5/255, # Exactly 253.5 ] for val in test_values: # WebGPU bgra8unorm: round(val * 255) gpu_u8 = int(np.round(val * 255)) # Convert back to normalized gpu_f32 = gpu_u8 / 255.0 # JavaScript canvas getImageData: uint8 canvas_u8 = int(np.round(gpu_f32 * 255)) print(f"Input: {val:.6f} → GPU u8: {gpu_u8} → Canvas: {canvas_u8}") if canvas_u8 != 255: print(f" ⚠️ Lost {255 - canvas_u8} LSBs") print("\nConclusion:") print("If WebGPU stores 1.0 as 255, canvas should read 255.") print("If user sees 253, likely:") print(" a) Not viewing CNN layer (viewing static features at scale=1.0)") print(" b) Value in texture is already 253/255 = 0.9921875") print(" c) F16 storage or unpacking issue")