Skip to content

Releases: derfsss/VulkanOS4

VulkanOS4 v1.3

Choose a tag to compare

@derfsss derfsss released this 13 May 10:50

VulkanOS4 v1.3 -- Vulkan 1.3 for AmigaOS 4 PowerPC.

Verified end-to-end on real X5000 hardware with the Radeon GPU ICD
(ogles2_vk.library) and qemu-sam460 with the software ICD
(software_vk.library). 24/24 example programs run to clean exit;
the new 24_proc_addr regression test passes 23/23 assertions on both ICDs.

Install: download VulkanOS4.lha, extract, Execute Autoinstall from a Shell.
Build from source: make all then make dist-lha (requires Docker Desktop
and the walkero/amigagccondocker:os4-gcc11 image).


1.3 -- 2026-05-13

ABI and compatibility fixes; presentation correctness; build hygiene.
Many of the underlying issues were diagnosed by Andrea Palmate'
(afxgroup) in
PR #1.

ICD changes:

  • Fix vkGetDeviceProcAddr ABI: the GPU ICD's LookupRawProcAddr
    previously fell back to APICALL trampolines for unlisted names,
    which slid every argument by one register slot when called as raw
    PFN_vk*. Expanded the RAW table to mirror the full DISPATCH
    table (~210 entries) and replaced the fallback with return NULL.
    Also extended the SW ICD's RAW table with the four surface queries
    and five swapchain entry points it was missing.
  • Honour VK_PRESENT_MODE_FIFO_KHR in the GPU ICD via OGLES2 vsync.
    The OGLES2 context was previously created with OGLES2_CCT_VSYNC=0
    hard-coded, regardless of the swapchain's presentMode. With vsync
    off, aglSwapBuffers returned immediately, the CPU loop submitted
    thousands of frames per second, and the Warp3D Nova compositor's
    per-refresh sampling produced visible animation skipping on
    rotating-cube examples regardless of the display's actual refresh
    rate. Now vkCreateSwapchainKHR toggles vsync via aglSetParams2
    based on the swapchain's presentMode, so FIFO/FIFO_RELAXED/MAILBOX
    vsync pace to whatever refresh rate the W3D Nova driver reports.
  • Give vkWaitForFences real CPU/GPU sync via glFinish. The GPU
    ICD's fence wait was a no-op (just flipping a boolean) which let
    the CPU loop outrun the GPU and queue up frames the compositor
    never displays. Calling glFinish before marking fences signalled
    matches the standard Vulkan spec semantic and tightens up the
    frame-time distribution even in FIFO mode (max frame-time dropped
    from a 1.2 s outlier tail to ~14.7 ms).
  • Detect SPIR-V endianness from the magic word in the SW ICD, rather
    than unconditionally byte-swapping. Per the Vulkan spec, the magic
    word may be supplied in either endianness. The previous behaviour
    was wrong for callers that already produce host-byte-order SPIR-V
    (e.g. uint32_t array literals compiled on a big-endian host such
    as ImGui's __glsl_shader_*_spv arrays on PowerPC).
  • GPU ICD: force FORCE_FLATTENED_IO_BLOCKS in SPIRV-Cross and rename
    vertex/fragment interface-block instances to a common vary so
    Warp3D Nova's name-based GLSL ES linker can match varyings across
    stages.
  • GPU ICD: add VK_FORMAT_R8G8B8A8_UNORM (VkFormat 37) to the vertex
    attribute mapping with GL_TRUE for the normalised flag. ImGui
    packs vertex colour in this format.
  • GPU ICD: set non-zero defaults for bufferImageGranularity,
    nonCoherentAtomSize, the various min*OffsetAlignment and
    max*Range limits. VMA divides by some of these during init and
    on every allocation; zeroes caused vmaCreateImage to bail out
    with VK_ERROR_OUT_OF_DEVICE_MEMORY before calling
    vkAllocateMemory.
  • Add a D(...) debug-print macro to both ICDs (no-op when DEBUG
    is undefined) and convert the existing IExec->DebugPrintF call
    sites. Lets release builds skip the trace overhead.

Examples and tests:

  • New regression test example 24_proc_addr: 23 assertions across 7
    function categories verifying that vkGetDeviceProcAddr returns
    raw C-ABI pointers (no APICALL trampolines), so any future drift
    between the DISPATCH and RAW tables fails on first run.
  • All graphical examples accept -d N / --duration N to exit after
    N seconds. Default behaviour (no flag) unchanged. Animated examples
    check time(NULL) in the render loop; render-once examples use a
    multi-signal Wait on the window port + timer.device + CTRL-C.
  • 21_image_texture / 22_gltf_viewer now skip the -d N flag when
    scanning argv for their positional file argument, so they can be
    used in automated test sweeps without spurious "file not found"
    fallbacks.

Build / loader:

  • Wire $(DEBUG) into the Docker build recipes for the loader and
    both ICDs (previously the variable existed but never reached the
    compiler).
  • Refactor software_icd/Makefile.cross to use pattern rules instead
    of a single 80-line &&-chained shell pipeline; supports
    incremental builds and make -j.
  • Replace strncpy + manual null-terminate with snprintf in the
    loader ICD path tracking to silence a -Wstringop-truncation
    warning.

VulkanOS4 v1.1.0

Choose a tag to compare

@derfsss derfsss released this 21 Mar 01:16

VulkanOS4 v1.1.0

SPIRV-Cross GPU ICD fixes and new example. All 23 examples verified on AmigaOne X5000/20 (P5020 2GHz, RX 560, RadeonRX 2.12).

What's New

  • SPIRV-Cross GLSL backend enabled -- was compiled out in v1.0 (SPIRV_CROSS_C_API_GLSL not defined)
  • GPU ICD GLSL post-processing pipeline for Warp3D Nova shader compiler compatibility:
    • Const array initializers converted to runtime assignments in main()
    • Dynamic gl_VertexID array indexing replaced with if-else chains using temp variables
    • gl_InstanceID renamed to u_InstanceIndex (gl_ prefix reserved by OGLES2 compiler)
    • Integer modulo (%) replaced with (A - (A/B)*B) (not implemented in Warp3D Nova)
    • #ifdef GL_ARB_shader_draw_parameters blocks stripped
  • SPIRV-Cross static keyword set crash fix -- prevents DSI exception when library persists between program runs on AmigaOS
  • Push constant uniform name fixed to always use PushConstants (SPIRV-Cross flatten-UBO name)
  • Shader module transpile result caching -- fixes missing sampler uniforms when multiple pipelines share shader modules
  • New example: 23_cow3d -- port of Alain Thellier's Cow3D demo with textured rotating 3D cow and cosmos space background
  • Autoinstall runs Avail FLUSH before/after install for clean library updates
  • Build timestamp in GPU ICD debug output for version verification
  • Attribution added for ogles2.library (Daniel Muessener), Warp3DNova.library and RadeonRX/RadeonHD drivers (Hans de Ruiter)

Installation

Extract VulkanOS4.lha to RAM: and run Execute Autoinstall from the VulkanOS4 directory.

Requirements

  • AmigaOS 4.1 Final Edition or later
  • For GPU rendering: Radeon GPU + RadeonRX/RadeonHD driver + Warp3D Nova + ogles2.library

VulkanOS4 1.0.0

Choose a tag to compare

@derfsss derfsss released this 20 Mar 01:04

Initial release of VulkanOS4 -- Vulkan 1.3 for AmigaOS 4.

Included

  • vulkan.library -- Vulkan loader with automatic ICD discovery
  • software_vk.library -- Software ICD (CPU rendering, works on any AmigaOS 4 system)
  • ogles2_vk.library -- GPU ICD (OGLES2/Warp3D Nova backend, requires Radeon GPU)
  • SDK headers and link library for compiling Vulkan programs
  • 22 example programs with source code and pre-compiled binaries
  • Tools: vulkaninfo, VulkanPrefs, AmigaMark
  • Autoinstall script

Key specs

  • 218 Vulkan functions per ICD (100% Vulkan 1.3 core + WSI)
  • 210+ SPIR-V opcodes
  • SPIRV-Cross transpiler for GPU shader execution

Installation

Extract VulkanOS4.lha on your Amiga and run:

Execute Autoinstall

See the README for full installation and SDK setup instructions.