All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Fix a few scheduling and merging issues found with specific workloads
- Add optional new-style Vulkan render passes when not on mobile or requested, see if that improves performance by reducing some of the inter-renderpass optimization steps - possibly a build feature
- Clean up graph pass API - the names of the methods are not all consistent or in line with the Vulkan-spec terminology
- Make all Info structs have the same properties: Copy, Exact parameter values sent to Vulkan not magically interpreted and changed by Screen-13
- New crate name to reflect the stability and functionality of this crate, retire "QBasic" references, sad face
0.13.0 - 2025-12-14
- Image format texel block size/extent support functions (
format_texel_block_size()/format_texel_block_extent()) Surface::capabilities()andSurface::present_modes()support functions
Swapchainallows configurable present modes- Custom
ImageTypeenum removed and replaced with existingvk::ImageType
- Issue where RenderDoc clears images between renderpasses ("undefined img") due to incorrect usage of image layout barriers
- Out-of-memory errors during image and buffer creation leaked vulkan resource handles
- Build error seen on error on Android and Raspberry Pi (See #105)
0.12.6 - 2025-05-10
- Support for more automatic vertex-layout type detection in vertex shaders
- Switch local fork of
vk-sync-forkto upstream crate (at v0.5)
ImageInfo::cube(..)now returns valid information (layers set to 6; auto-set CUBE flags)
0.12.5 - 2025-04-07
- Segmentation fault crash and flickering on MacOS when resizing the swapchain (See #99)
0.12.4 - 2025-03-30
- Support for MSAA sample rate shading (
GraphicPipelineInfo::min_sample_shading) - Initial support for MSAA coverage (
GraphicPipelineInfo::alpha_to_coverage/GraphicPipelineInfo::alpha_to_one)
0.12.3 - 2025-03-27
- Symbolic link to
vk-syncnow uses a path attribute (easier to build from source on Windows)
- Fix compilation issue on MacOS
- Remove incorrect debug assertion for swapchain desired image count
0.12.2 - 2025-03-24
RenderGraph::blit_image()internal offset logic was backwards; caused validation error
0.12.1 - 2025-03-23
- Swapchain image displays nothing after Window presentaion on linux Mesa drivers
0.12.0 - 2025-03-13
- Automatic
vk::PipelineCachefor compute, graphic and ray-trace pipelines Acceleration::build_structures()(and update/indirect variant commands)SampleCount::is_single()andis_multiple()helper methodsmip_compute.rsandmip_graphic.rsexamples of typical mip-map usage
- Use Rust 2024 edition
- Updated
ashto v0.38 - Updated
winitto v0.30 (and moved related functionality to newscreen-13-windowcrate) - Updated
ordered-floatto v5.0 ResolverPooltrait now requiresSendscreen_13_eguiallows creation usingraw_window_traitsinstead of requiring anEventLoopvk-syncbrought into source tree until an updated fork is created or existing PRs/fixes merged
- Handling of
u8andu16values used as push constants - Framebuffer attachments generated from certain valid configurations
- Resolving MSAA depth attachments
- Device feature detection issue which caused a validation layer error
- Performance during resize and overall correctness of swapchain handling
- Multiple issues related to subresource handling, extraneous pipeline barriers and render pass merge logic
logandwinitare no longer exported byuse screen_13::prelude::*
0.11.4 - 2024-07-16
- Validation error:
Attempted write update to an immutable sampler descriptor
0.11.3 - 2024-05-29
- Support for separate image samplers (
SamplerStatein HLSL,samplerin GLSL)
- Updated
eguito v0.26 - Updated
gpu-allocatorto v0.26 - Updated
spirqto v1.2- If you see errors such as
expected spirq_core::ty::Type, found spirq::prelude::Typeyou will need to runcargo updateor remove yourCargo.lockfile
- If you see errors such as
lazy_staticdependency
0.11.2 - 2024-02-26
parking_lot::Mutexis now an optional featurepooltypes now use more efficient internal caching
Resolver::submitwould sometimes drop and create command pools too often
0.11.1 - 2024-02-20
puffinprofiling to most example code - see getting started guide for more information
ResolveModemoved fromdrivertodriver::render_pass
Swapchain::present_imagechange introduced inv0.11needlessly spammed theWARNlog while waiting for presentation images to be ready- Vulkan validation error introduced in
v0.11: "All queue submission commands that refer to fence must have completed execution"
- Unnecessary explicit reset of Vulkan command pools
- Unnecessary
MutexguardingFramebufferandGraphicPipelineaccess
0.11.0 - 2024-02-18
- Min/max image sampler reduction mode - see
examples/min_max.rsPhysicalDevice::sampler_filter_minmax_propertiesadded to report propertiesSamplerInfo::reduction_modeadded to set mode
SamplerInfo::LINEARandNEARESTto make sampler creation easierComputePipeline::with_name,GraphicPipeline::with_nameandRayTracePipeline::with_namedebug helper functionsAccelerationStructureInfo::genericfunction
Device::image_format_propertiesreturns anOptionso that unsupported formats may returnNoneinstead of relying on user code to detectDriverError::Unsupported- Information struct trait implementations, field and function naming normalized:
- Constructors no longer return builders
- Use
to_builderto convert an info struct into a builder - Use
buildto convert a builder into an info struct
- Use
AccelerationStructureInfo- Function
new_blasrenamed toblas - Function
new_tlasrenamed totlas
- Function
BufferInfo- Function
newrenamed todevice_mem - Function
new_mappablerenamed tohost_mem
- Function
ComputePipelineInfonow implementsCopy,EqandHashDeviceInfonow implementsDefaultGraphicPipelineInfonow implementsCopyImageInfo- Constructor parameters reordered:
fmtnow after image size - Function
new_2drenamed toimage_2d(in addition tocube,image_1d, etc.) - Field
linear_tilingrenamed totiling(type changed frombooltovk::ImageTiling)
- Constructor parameters reordered:
ImageViewInfo::newfunction nowconstRayTracePipelineInfonow implementsCopySwapchainInfo- Function
newnow returnsSwapchainInfo(previously returnedSwapchainInfoBuilder) - Field
formatrenamed tosurface - Default values for
widthandheightfields removed
- Function
- Constructors no longer return builders
ComputePipelineInfo::name,GraphicPipelineInfo::nameandRayTracePipelineInfo::namehave each been moved to their respective pipeline structSampleCountenum members renamed fromX1toType1(etc.) to match Vulkan specEventLoopnow produces linear surfaces by default - usedesired_surface_formatandSurface::srgbto select sRGBSwapchain::present_imagenow uses event-based waiting for rendering operations instead of polling, greatly reducing CPU usage- Updated
ash-molten(Mac OS support) to v0.17
ComputePipelineInfo::defaultnow properly sets a default value forbindless_descriptor_count
GraphicPipelineInfo::newfunction: UseDefaultimplementation insteadRayTracePipelineInfo::newfunction: UseDefaultimplementation insteadSamplerInfo::newfunction: UseDefaultimplementation instead
0.10.0 - 2024-02-09
- Ray tracing support for
vkCmdTraceRaysIndirectKHRand dynamic stack size - Resource aliasing re-introduced - see
examples/aliasing.rs - Expanded the number of functions and scopes profiled by the
profilingcrate
- Information structs are now
#[non_exhaustive]in order to make future additions minor changes - update strategies:- Use
..Default::default()syntax during struct creation - Use associated constructor functions such as
ImageInfo::new_2d(..)
- Use
BufferInfo::can_maprenamed toBufferInfo::mappable- Increase
PoolInfo::DEFAULT_RESOURCE_CAPACITYfrom 4 to 16 in order to prevent excess resource creation
EventLoop: Resize swapchain in response to events instead of each frame (save 50 μs/frame)
input: This module did not support functionality unique to Screen 13 and did not have higher quality than existing solutions such aswinit_input_helperEventLoopBuilder::linear_surface_format/srgb_surface_format: UseSurface::linear/srgbinstead
0.9.4 - 2024-02-07
- Improved performance during render graph resolution:
vsm_omniexample now records frames 10% faster (~100 μs) and complex render graphs may be signifcantly more performant
0.9.3 - 2024-01-30
FifoPoolresource pool implementation- Memory management functions and configurable bucket sizes for
Poolimplementations
- Compilation bug for
rustcv1.75.0 on Mac OS
0.9.2 - 2024-01-23
- Deprecated
EventLoopsurface format functions - Updated
derive_builderto v0.13 - Updated
gpu-allocatorto v0.25 - Updated
winitto v0.29 - Updated
eguito v0.25 - Updated
imgui-rsto latestmain
0.9.1 - 2023-12-29
- Ability to select from available swapchain surface formats when creating an
EventLoop - Driver
surfaceandswapchainmodules (and their types) are now public API
- Changed
KeyBufimplementation functions to take values instead of borrows - Updated
gpu-allocatorto v0.24 - Updated
spirqto v1.0.2
0.9.0 - 2023-09-07
- Incorrect handling of images with multiple array layers during render passes
- Validation error related to
VK_KHR_surfacewhen using headless devices - Shader modules of graphic pipelines cached by a render pass were not considered during lookup
- Support for performance profiling crates
- Queue family index is now a part of the API and allows for submission of render graph work using secondary queue families
- Expose all Vulkan 1.0 properties via
PhysicalDevice::features_v1_0 Device::format_propertiesandDevice::image_format_propertiesso user code may avoid calling unsafeashfunctionsRenderGraph::node_device_addressfunctioncontrib/screen-13-hot: Shader compilation macro definition support- Virtual reality example using OpenXR - see
examples/vr - Support for
VK_EXT_index_type_uint8; usedevice.physical_device.index_type_uint8_features.index_type_uint8to check for support - Manually configurable image samplers - see
examples/image_sampler.rs
- Device creation (and
EventLoop::build()) no longer take a ray-tracing parameter; instead the device will be created and you should usedevice.physical_device.ray_trace_features.ray_tracing_pipelineto check for support - Logical device (
Device) structure has been moved toscreen_13::driver::device - Physical device feature and property structures have been moved to
screen_13::driver::physical_device - Re-ordered parameters of
RenderGraphfunctions:blit_image_region,blit_image_regions, andupdate_buffer_offset - Updated parameters of
RenderGraphfunctions to be more efficient (Into<Box<[_]>>is nowAsRef<[_]>and take values ofCopy-types instead of borrows) ResolverPooltrait has been moved from thescreen_13::graphmodule toscreen_13
Driverstructure; useDevice::create_headlessdirectlyPhysicalDeviceDescriptorIndexingFeaturesandFeatureFlagsas they are no longer required
0.8.1 - 2023-02-18
- Pipelines which use multiple descriptor sets (different
set =values) sometimes trigger validation errors contrib/screen-13-hot: build error on Windows platform
- Custom vertex layout support - see
examples/vertex_layout.rs - Enabled full set of Vulkan 1.1 and Vulkan 1.2 core features during device creation
- Ray query support with
ray_omni.rsexample - Exposed existing command buffer implementation so that programs may wait for render graph GPU
submissions to finish executing before reading the results with the CPU - see
examples/cpu_readback.rs KeyBuf::is_downhelper function
contrib/screen-13-egui: Updatedeguito v0.20
0.8.0 - 2022-12-28
- Shader hot-reload feature for compute, graphic and ray-trace pipelines (see examples)
Bufferobjects may be created with an alignment specified inBufferInfo(useful for shader binding tables)
ComputePipeline::createnow takes three arguments: the device, info, and shaderComputePipelineInfono longer contains shader information; useShader::new_computefor that instead
0.7.1 - 2022-12-17
- Soundness issue in
AccelerationStructure::instance_slicehelper function
- Skeletal mesh animation demonstration in
examples/skeletal-anim
0.7.0 - 2022-12-05
- Validation error caused by image blit operations
multipass.rsand other examples use unsupported image formats without checking for fallbacks
EventLoopmay be constructed with multiple hardware queues, seedesired_queue_countand the newmultithread.rsexample
Resolver::submit()now takes a queue index instead of an instance;Device::queue_countprovides the total number of queues available
0.6.5 - 2022-11-11
- Incorrectly skipped pipeline barriers on resources used in secondary render passes
- Semaphore in-use validation error when dropping swapchain
- Validation error caused by back-to-back image reads in auto-merged fragment shader passes
- Validation error caused by node access for the ALL_COMMANDS stage before graphic passes
- Multiple validation errors in the
example/andcontrib/code
bindless.rsexample using an unbounded image sampler array and draw indirect call
- Leased resources now reference their pool using
Weakreference counting to improve drop ordering
0.6.4 - 2022-10-31
- Framebuffer resolve functionality was implemented incorrectly, did not work
- Synchronization error when using compute written-resources in fragment shaders
- Validation error in
multipass.rsexample - Unnecessary depth buffer store operations in
vsm_omni.rsexample
- Mutlisampled anti-aliasing example (MSAA)
attach_colorandattach_depth_stencilfunctions onPipelinePassRefwhen bound to aGraphicPipelinefor attachments which would otherwise useVK_ATTACHMENT_LOAD_OP_DONT_CAREnode_infofunction onPassRefandPipelinePassRefwhich may be accessed while recording passes
0.6.3 - 2022-10-25
- Panic when setting exclusive fullscreen if the monitor is set to less than maximum resolution
- Panic when overlapping push constant ranges in graphic and ray trace pipelines
bind_nodefunction onPassRefandPipelinePassRefwhich may be accessed while recording passes
- Improved fullscreen experience: no extra decoration or briefly displayed small window
- Cursor re-displayed, if hidden, when event loop window loses focus
0.6.2 - 2022-10-20
- Crash/device lost while resizing the window
- Inconsistent frame timing on certain drivers
- Incorrect window size on certain drivers
- Fullscreen demostration in
vsm_omniexample using F11 and F12 keys - Configurable frames-in-flight setting
0.6.1 - 2022-10-16
- Depth/stencil images are now cleared properly
- Multi-layer framebuffers work as intended
- Render graph resolver orders renderpasses correctly
default_view_info()helper onImageInfoto assist in defining new views- Variance shadow mapping example using a filtered cubemap
0.6.0 - 2022-10-06
clear_colorandclear_depth_stencilfunctions now take the image being cleared: it is now possible to clear and attach, but not store or resolve, an imagerecord_-* methods now also provide aBindingsparameter to the recording closureRayTracePipeline::group_handleis now an associated function where previously it was a method- Many types have been moved betwen modules in order to document things cleary
attach_colorandattach_depth_stencilfunctions: replace with theload_andstore_functions for color or depth/stencil attachmentsdevice_api.rshelper functions: create resources directlyrunstand-alone function: UseEventLoopdirectly.- Various internal-only fields and other types within the
drivermodule
- Depth/stencil attachment clear requests are properly handled in cases where the image used is transient
0.5.0 - 2022-09-17
LazyPoolresource pool which tries to find acceptable resources before creating new onesinstance_slicefunction for acceleration structuresnew_blasandnew_tlashelper functions for acceleration structure info- Node-
_mutfunctions forPassRef: enables clearer code patterns when building passes rt_triangle.rsexample; similar totriangle.rsbut uses a ray trace pipeline
build_structureandupdate_structurenow take geometry info as a borrow instead of by value
input::Typingstruct; it has use valid cases but is not within the scope of this crate
prelude_arc: Usepreludemodule insteaddriver::BlendMode::Replaceand other camel-case constants; use screaming-snake versions, i.e.driver::BlendMode::REPLACE
- Windows platform:
EventLoopno longer panics if the window is minimized
0.4.2 - 2022-06-28
create_from_slicefunction for buffers
0.4.1 - 2022-06-24
update_structurefunction for acceleration structuresgroup_handlefunction for ray trace pipelines
0.4.0 - 2022-06-06
See #25 for migration details
- Resources may now be bound using
Arc<T>ofdriversmart pointers:Buffer,Image, etc
- Resource state is now held in the
driversmart pointers instead of the current graph
- "Binding" types, such as
ImageBindingandImageLeaseBinding: useArc<Image>instead - Dependency on the
archerycrate; see rationale
0.3.2 - 2022-06-01
- Additional memory mapping functions to
Bufferstructure
BlendModegraphic pipeline enumeration is now a structure with full options
0.3.1 - 2022-05-27
- Bindless descriptor support (unsized arrays in shader code) and example
- Improve swapchain image flag handling
0.3.0 - 2022-05-20
- Ray tracing support
- Subpass API, additional examples
- Pak file functionality moved to
pakcrate
- Dear ImGui library and example
- Bitmapped text rendering
- Pak file baking is now multi-threaded; assets still only get packed exactly once
CommandChainstructure functionality is now found on theRenderGraphstructure
0.2.0 - 2022-02-08
- Render Graph module, bindings, nodes, and executions: with render pass merging/re-ordering/etc
CommandChainstructure
- Driver now directly based on vulkan, having removed support for the deprecated Gfx-Hal library
- Lease/pool functionality simplified: leases are now obtained through a common interface using info
Engine/Programstructures have been merged into a simpler EventLoop structure
- Screen 13 file-based configuration: use DriverConfig now
GpuandRenderstructures: useRenderGraphandImageNodenow- Existing bitmap/draw/text/write/etc operations: functionality replaced and in some cases TODO
- Implementation of
drawfunctionality - Implementation of
textfunctionality
- Features:
auto-cull,debug-names,deferred-3d, andforward-3d - Selectable
ArcorRcshared types
- Allow
writefunction to specify multiple writes per call - Use builder pattern for all rendering commands
- Switched asset schema from JSON to TOML
0.1.0 - 2020-07-05
- Easy-to-use API designed to allow developers to create graphics programs which run on many platforms and require no bare-metal graphics API knowledge
- "Hello, world!" example using a bitmapped font