pcbjam/tests/gal-regression
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi 6c2cf85177 feat(webgl): Fix GL initialization and add GLSL ES shader conversion
Progress on WEBGL_GAL rendering:

- Fix GLImmediateShim initialization by adding GL function dependencies
  (glBegin, glEnd, glVertex2f, etc.) to $GLImmediateShim__deps
- Add COLOR4D(EDA_COLOR_T) constructor stub to wasm_stubs.cpp
- Fix GAL context locking - add LockContext/UnlockContext calls
- Add exception catching to build (-sNO_DISABLE_EXCEPTION_CATCHING)
- Create GLSL ES 1.00 shader converter in generate_shaders.py:
  - Remove #version 120 directive (ES 1.00 default)
  - Add precision highp float/int qualifiers
  - Convert int * float to float literals (2 * x -> 2.0 * x)
- Update build script to clean output files for linker flag changes
- Add console capture to test spec for debugging

Current status:
- WASM builds and loads successfully
- GLImmediateShim initializes correctly
- WEBGL_GAL creates successfully
- Shader compilation fails due to Emscripten LEGACY_GL_EMULATION
  prepending code that conflicts with custom shader precision

Next: Investigate shader compilation with LEGACY_GL_EMULATION or
consider alternative approaches for GL compatibility.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 21:59:21 +01:00
..
baseline feat(gal-test): Add 100% GAL API test coverage (28 scenarios) 2026-01-07 12:27:06 +01:00
native docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00
scenarios docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00
wasm feat(webgl): Fix GL initialization and add GLSL ES shader conversion 2026-01-07 21:59:21 +01:00
README.md docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00

GAL Regression Test Harness

Native test harness for KiCad's OPENGL_GAL (Graphics Abstraction Layer) to enable visual regression testing of the WebGL port.

Purpose

This test suite exercises KiCad's actual OPENGL_GAL implementation to:

  • Generate baseline screenshots for visual regression testing
  • Verify GAL API coverage (70/70 methods tested)
  • Provide reference implementations for the WebGL port

Test Scenarios

28 scenarios covering all GAL drawing operations:

# Scenario Description
0 basic-lines DrawLine with various styles
1 line-widths SetLineWidth variations
2 circles DrawCircle filled/stroked
3 arcs DrawArc with different angles
4 rectangles DrawRectangle filled/stroked
5 polygons DrawPolygon with complex shapes
6 alpha-blending Transparency and blending
7 transforms Save/Restore/Translate/Rotate/Scale
8 grid-cursor Grid and cursor rendering
9 segments DrawSegment with endcaps
10 complex-scene Combined operations
11 bezier-curves DrawCurve (cubic Bezier)
12 arc-segments DrawArcSegment with widths
13 segment-chain DrawSegmentChain
14 group-caching BeginGroup/EndGroup/DrawGroup
15 polylines-multi DrawPolyline/DrawPolylines
16 hole-walls DrawHoleWalls from SHAPE_SEGMENT
17 grid-native DrawGrid (native grid rendering)
18 cursor-native DrawCursor (native cursor)
19 render-targets SetTarget/GetTarget/ClearTarget
20 screen-transform SetScreenSize/ComputeWorldScale
21 clear-colors ClearScreen with colors
22 depth-testing SetLayerDepth ordering
23 negative-mode SetNegativeDrawMode
24 text-attrs Text attribute methods (stub)
25 glyphs DrawGlyph/DrawGlyphs
26 bitmap DrawBitmap (see limitation below)
27 transform-api Transform() API documentation

Building

./scripts/build-gal-native-test.sh

Running

# Run all scenarios and save to baseline folder
./tests/gal-regression/native/build/gal_native_test \
    --output ./tests/gal-regression/baseline

# Run specific scenario (by number)
./tests/gal-regression/native/build/gal_native_test \
    --output ./tests/gal-regression/baseline 5

# Show window (non-headless)
./tests/gal-regression/native/build/gal_native_test --show

Known Limitations

DrawBitmap (Scenario 26)

The DrawBitmap test shows empty panels because OPENGL_GAL::DrawBitmap uses legacy OpenGL immediate mode (glBegin/glVertex3f/glEnd) which is incompatible with the shader-based rendering pipeline used by the test harness.

In KiCad's production code, DrawBitmap works because:

  1. The VIEW rendering system orchestrates buffer flushes between render targets
  2. GPU_MANAGER::DrawAll() deactivates the shader after flushing vertices
  3. The fixed-function pipeline can then render the textured quad

In our isolated test harness, the shader remains active throughout rendering, causing the legacy GL calls to fail silently.

This is acceptable because:

  • DrawBitmap is primarily used for reference images in schematics
  • The WebGL port will need its own bitmap rendering implementation anyway
  • All other 69 GAL methods are fully tested

Transform() API (Scenario 27)

The Transform() method is documented but not visually tested because it's dead code in KiCad - never called in production. It uses glMultMatrixd() which doesn't integrate with the VERTEX_MANAGER shader pipeline.

Directory Structure

tests/gal-regression/
├── README.md           # This file
├── baseline/           # Reference PNG screenshots
├── native/
│   ├── CMakeLists.txt
│   ├── gal_native_test.cpp      # Main test driver
│   ├── gal_test_accessor.cpp    # Private member accessors
│   ├── kicad_stubs.cpp          # KiCad symbol stubs
│   ├── bitmap_base_stub.h       # Bitmap test patterns
│   ├── kifont_stub.h            # Glyph factory helpers
│   └── generated/               # Shader source files
└── scenarios/
    ├── gal_test_scenarios.cpp   # Scenario registry
    └── scenario_*.cpp           # Individual test scenarios