Skip to content

Releases: tgfrerer/island

v0.14.1: Swapchains, Screenshots, Wayland

01 Nov 09:46
7e6f1fa
Compare
Choose a tag to compare

This release improves infrastructure, notably swapchains (which are now thought more of as image-sinks). It adds some nice features, such as direct loading of mesh data, adds image input/output codecs for png and exr files, and a new screenshot module for saving renderpasses to disk on the fly. There's also a new way of printing debug text to screen from nearly anywhere, which uses a texture-less technique described in a separate blog post. Island applications now support Wayland on Linux, and are HiDPI aware.


There's also a new example app which reprojects a map on mouse click, and allows you to save it's screen contents to png (see image).

Why are screenshots from within the app a nice feature?

  • can save images more easily
  • can save images at the native bits-per-pixel resolution (you can save 32bit float-per-channel images if you use the new .exr image encoder adapter, for example)
  • can save images with alpha

New (highlights)

  • add le_exr #62 -- a module for loading and saving .EXR files
  • refactor le_mesh in #63 -- loading mesh data is now streamlined, mesh data may be uploaded to the GPU straight from disk
  • 33ed68c [le_mesh] implement attribute read
  • 9513349 [image codec] add image encoder interface - a generic interface that any file formats may choose to implement.
  • fca7736 [le_camera] implement orthographic zoom factor
  • 18d78d2 [le_png] add le_png -- a module for loading and saving PNG files -- on linux, optionally, using super fast lodepng / FPNGE encoder
  • b6367b1 [video] use video_maintenance_1
  • 8dd0c48 [backend] add helper to manage required/requested backend features
  • 7c487a9 [le_path] enable relative svg path operators, lots of additions here for parsing more svg commands
  • 294293a [screenshot] add le_screenshot module
  • 1916596 [le_debug_print_text] add texture-less printing of debug text.
  • b8b62b4 [examples] add screenshot example

What's Changed (highlights)

  • 2395eca [le_window] add get_content_scale so that applications may be aware of HiDPI
  • 5f14d06 [swapchain] refactor swapchain creation
  • cc77e1b [swapchain] delay destruction until present complete
  • 5265107 [swapchain] implement explicit resize
  • 856ba3e [examples] update examples for swapchain resize
  • c042927 [3rdparty] update spirv-reflect
  • 8784b23 [3rdparty] update glfw
  • b3f8762 le_resource_manager: add adapter for loading .tga files
  • 9aaca51 [examples] update le_imgui_example: draw into image which is then bound as a texture in ImGui -- this shows how you can preview textures, and how you can refer to
    textures from within imgui
  • cb63d8c video_decode lots of changes with video decode, notably implemented seek
  • ffb8c72 [le_window] respect content scale / HiDPI
  • Fix le_image_decoder_read_pixels in le_pixels module by @drsherluck in #65

New Contributors

Full Changelog: v0.13.0-image-hot-reload...v0.14.1-input-output

v0.13.0-image-hot-reload

02 Feb 10:43
25a85e4
Compare
Choose a tag to compare

New

This release adds a few quality-of-life improvements to dealing with images. The le_resource_manager has been rewritten so that it becomes very easy to hot-reload any images. If an image is added via the resource manager and tagged as watched, any changes to the original image will trigger a resource reload. This even works if the updated image has different file size, format, or dimensions.

le_pixels has been rewritten from the ground up - image decoders now must implement a generic interface, which means that the resource manager can interact with them in an abstract way (shout-out to Barbara Liskov) - and you can implement & register new image decoders with the resource manager at run-time and get all the benefits of resource hot-reloading for any new image format for free.

When you register an image decoder with a resource manager, you give a file extension for which to use this decoder. You can register new decoders for new filetypes, or override the defaults at runtime. The resource manager by defaults loads decoders from le_pixels for .jpg, jpeg, .png, ...

To make image loading more efficient, the renderer is now able to directly map GPU memory - this means that image decoders may read their pixels directly into GPU memory - and the new version of le_resource_manager certainly does.

What's Changed

  • b19d116 [image_decoder] add an abstract interface for image decoders, which anyone may implement
  • 243ddde [core] core only zeroes out an api on initial load, which allows you to persist pointers throughout api reload if you choose - this can be useful to hold persistent references to singleton objects for example
  • 5a6b3e1 [image decoder] update stb_image to latest version
  • d7b6d3a [renderer] implement mapping image and buffer memory directly to GPU memory
  • 90fe8ec [resource_manager] use direct memory mapping when uploading resources
  • b82da59 [cmake] output build artifacts into ./bin --- this should keep things a bit cleaner
  • 53c403e [le_resource_manager] make image import format aware - attempt to find a matching vkFormat based on image data (e.g. eR8Unorm for a grayscale image)
  • e10cb7a [beauty] add constant width grid shaders
  • ee28fca [le_imgui] make le_imgui self-contained by using pre-compiled shaders, and by embedding default font (you don't have to add any resources anymore when using le_imgui)

Fixes

  • 79cf03d [le_renderer] fix issue where re-using renderpasses would generate wrong debug .dot graphs
  • 2102510 [le_tweaks] fixes to le_tweaks - making tweaks more robust after hot-reloading
  • 12ef73a [cmake] warn if the imgui submodule is missing

Full Changelog: v0.12.0-vk-video-decode...v0.13.0-image-hot-reload

v0.12.0-vk-video-decode

14 Dec 11:58
40d0a14
Compare
Choose a tag to compare

New

Hardware accelerated video decoding (H.264, for now) using Vulkan Video Decode.

Island's new le_video_decoder module allows you to use your GPU most efficiently by shifting video processing onto dedicated video decode hardware. Instead of using an extra dependency, le_video_decoder implements this by using the new Vulkan Video API, therefore keeping video decoding perfectly on the GPU.

The new video decoder module provides a simple API that aims to abstract away any gnarly sync issues: the latest decoded frame is made available as a plain image resource handle which synchronizes nicely and implicitly with Island's rendergraph. By default, videos will loop perfectly; YCrCb conversion happens automatically using specialized Vulkan samplers. A new example application shows the video player in action.

Adding and implementing Vulkan Video Decode has been a long time in the making; This release has been tested on Linux (ubuntu 22.04 LTS) and Windows (11) and an Nvidia 4090 GPU, where I got to comfortably decode and play 14 1920x1080@50fps videos simultaneously.

Other GPUs will most likely work, too as long as they support a Video Decode Queue (it's recommended to update drivers, as Vulkan Video is still fairly new). I'd love to find out how this fares on Intel and/or AMD GPUs - test reports, PRs or hardware donations (so I can test & implement fixes) are most welcome ;)

There are a lot more features and bug fixes in this release.

What's Changed

  • NEW Video decoder by @tgfrerer in #57
  • e383df6 NEW Video player example app: an Island example application that shows how to use the new video decoder module
  • 9704b25 NEW implement automatic hardware-accelerated YCbCr conversion for textures annotated with __ycbcr__ in sampler code
  • b4210f4 NEW add callback forwarding for Windows, so that callbacks can be hot-patched on all supported architectures now - one-file minimal POC here
  • d7ec70d Refactor TWEAKS: refactor near-instant code-tweak mechanism by putting it into its own module, le_tweaks -- see le_tweaks for usage hints
  • Update Vulkan struct scaffold generator helper: now even more interactive, and useful for Vulkan Video structs, too.
  • Update VOLK to version 250
  • Fix querying correct device properties from device list by @ldkuba in #55
  • Fix missing standard includes by @jopadan in #58

New Contributors - Thank you :)

Full Changelog: v0.11.0-tracy...v0.12.0-vk-video-decode

v0.11.0-tracy

23 May 09:06
1a39093
Compare
Choose a tag to compare

What's Changed

  • add support for nano-second resolution profiling with Tracy

You can profile any Island app by compiling it with the line add_compile_definitions( TRACY_ENABLE ) added to its project's top-most CMakeLists.txt file. When the app runs, it will connect to the Tracy Profiler. Tracy will give you real-time insight into where the app spends CPU time.

Profiling works with Debug and Release builds - both on Linux and Windows. Profiling works with hot-reloading - you can add and remove profiling primitives while hot-reloading and profiling.

The Tracy profiler is a standalone, separate app. You can build it from source from the code contained in the tracy submodule (found in modules/le_tracy/3rdparty/tracy/profiler/build/)

You can profile application code regions by adding the le_tracy module, and including the le_tracy.h header. This header gives access to all the Tracy profiling primitives, if tracing is enabled via TRACY_ENABLE (see above).

When tracing is not enabled (as is the default), tracing primitives melt away to no-ops.

Note

Tracy is included via a submodule - you need to invoke

git submodule init
git submodule update

for the tracy source code to be checked out.

Full Changelog: v0.10.0-renderpass-ergonomics...v0.11.0-tracy

v0.10.0-renderpass ergonomics

17 May 11:35
3356bae
Compare
Choose a tag to compare

What's Changed

Api breaking changes

  • refactor encoder facade: added new specializations for Encoders: le::GraphicsEncoder, le::TransferEncoder, le::ComputeEncoder, le::RtxEncoder. You must choose one of these instead of the deprecated general le::Encoder. Based on which specialization you choose, this narrows down the choice of operations that can be done with an encoder to whatever is allowed with this particular type of encoder; this makes it harder to accidentally issue an encoder command which is not allowed in the context of a particular type of Renderpass (e.g. issueing a compute command in a Draw Pass...

Features / Fixes

  • command stream storage may now dynamically adapt to number of commands issued, and grow as needed.
  • Fixed an issue with non-continuous bindings in shaders - if bindings get optimised away by the shader comiler because they are not used in the shader code, this will crash the app on shader reload.
  • update Asterisks example to use gamepad input - this example is now even more arcade ;)
  • performance improvement: reduce number of api calls when dealing with linear allocator
  • add a new Setting for whether the renderer should verify argument state on each draw: LE_SETTING_BACKEND_SHOULD_CHECK_ARGUMENT_STATE, false by default on Release builds
  • simplify CommandBindVertexBuffers implementation

Full Changelog: v0.9.0-gamepad...v0.10.0-renderpass-ergonomics

v0.9.0-gamepad

27 Mar 16:47
b7f6022
Compare
Choose a tag to compare

What's Changed

Implement gamepad support

  • add gamepad events to events stream
  • app windows can automatically subscribe to gamepad events if a gamepad is connected
  • default camera is steerable via gamepad if a gamepad is connected
  • up to 16 gamepads can be connected - le_window_settings allow windows to opt in/out of event stream for specific gamepad ids

Gamepad control for the default camera controller is a no-code change; any apps that use the default camera controller can now additionally be controlled via gamepad, if a gamepad is detected. You just need to connect a gamepad, that's all.

Full Changelog: 0.8.0-dynamic-swapchains...v0.9.0-gamepad

v0.8.0-dynamic swapchains

08 Feb 12:04
0.8.0-dynamic-swapchains
dd35ffd
Compare
Choose a tag to compare

What's Changed

  • NEW: dynamic swapchains swapchains may now be added or removed at runtime. See updated multi_window_example, and take a look what happens when you close one window...
  • remove index-based swapchain getters: you must now pass an (opaque) swapchain handle to query swapchains. You will receive a swapchain handle when adding a swapchain, and you can query the renderer for available swapchain handles.

  • refactor shader pipeline generator - shader handle is now generated via parameters fingerprint, which makes for better cache hits and fewer shader recompilations.

  • improved compilation times (about 3-4s for full recompile using clang) by separating renderer.hpp and renderer.h:

    renderer.hpp contains the c++ façades which are templated, and only of use to application code, while renderer.h may be used by others who depend on renderer. Application code should include renderer.hpp. remove unused header includes

  • updated to vulkan version 1.3.236

  • updated volk to 1.3.236

  • updated vk_mem_alloc

  • updated spirv_reflect

  • updated codegen scripts, and generated code for vk 1.3.236

  • cleanup api to better conform c-header style: deprecate const & passing in public api parameters

Full Changelog: v0.7.0...0.8.0-dynamic-swapchains

v0.7.0-console-and-settings

28 Nov 16:30
v0.7.0
9a53088
Compare
Choose a tag to compare

What's Changed

  • le_console : Add support for an interactive console to Island apps via le_console. Add this module to your app and it will listen on localhost:3535 once you start its server. If you connect to the console via telnet or similar and then type tty, you enter an interactive console, from where you can interact with the app by setting or reading LE_SETTINGS, and by monitoring le_log logging events.
  • LE_SETTING Add, set and get global settings anywhere in an Island app. Settings are type-aware, and are especially useful for debugging, and for setting startup options such as LE_SETTING_SHOULD_USE_VALIDATION_LAYERS.

Full Changelog: v0.6.0...v0.7.0

v0.6.0-multiqueue

07 Oct 16:10
93cae01
Compare
Choose a tag to compare

What's Changed

  • Refactor Rendergraph - see blog post for details.
  • Automatic multi-queue, automatic resource queue ownership transfers - see blog post for details.
  • Generate .dot files for multi-queue, and Rendergraph - this is dependent on LE_SETTING
  • add LE_GET_SETTING - persistent settings that can be set/tweaked and accessed across all modules.
  • add le_settings module - a module which allows you to list all global settings and their respective type information (unstable)
  • bugfix: add logic to release and recycle callback forwarders (this was causing an issue when running out of forwarders after reloading a shader more than 255 times)
  • lots of under-the-api-surface refactors in backend
  • BREAKING: le_camera remove inclusion of glm from le_camera.h
  • BREAKING: renderpasses must now declare resource access flag bits when using a resource (this might get simpler in the future)
  • BREAKING: Update project generator script to be self-contained in python: rename to: create_project.py, relative paths are now relative to current directory
  • various optimisations & bug fixes

Full Changelog: v0.5.0...v0.6.0

v0.5.0

07 Jun 10:38
0529e7d
Compare
Choose a tag to compare

What's Changed

  • compile time improvements: reduce compile times by factor 3 by using vulkan.h in favour of vulkan.hpp
  • refactor le::RenderGraph
  • bump vulkan version to 1.3
  • use synchronisation2 for synchronisation, clarify synchronisation in comments
  • add windows continuous integration by @tgfrerer in #34
  • move to github workflows for ci
  • better consistency in how le:: namespace is used
  • codegen for vulkan enums, interactive codegen tools for vulkan structs

Full Changelog: v0.4.0...v0.5.0