The vkd3d team is proud to announce that release 1.13 of vkd3d, the Direct3D to Vulkan translation library, is now available. This release contains improvements that are listed in the release notes below. The main highlights are: - Basic loop unrolling support in the HLSL compiler. - Effects compiler support for several version 4.0+ state objects. - Miscellaneous bug fixes. The source is available from the following location: The current source can also be pulled directly from the git repository: Vkd3d is available thanks to the work of multiple people. See the file AUTHORS for the complete list. # What's new in vkd3d 1.13 ### libvkd3d - The ID3D12CommandList6 interface is supported. - Block-compressed textures can be created with unaligned dimensions. This corresponds to D3D12_FEATURE_D3D12_OPTIONS8.UnalignedBlockTexturesSupported. - Some minor issues pointed out by the Vulkan validation layers have been addressed. These are not known to affect applications in practice, but should make libvkd3d slightly more well-behaved. ### libvkd3d-shader - New features for the HLSL source type: - Basic loop unrolling support. Some of the more complicated cases like loops containing conditional jumps are still unsupported. - Initialisation values for global variables, function parameters, and annotation variables are parsed and stored in output formats supporting them. - Shader model 5.1 register spaces are supported when using the corresponding target profiles, as well as shader model 5.1 reflection data. - Register reservations support expressions as offsets. For example: ‘float f : register(c0[1 + 1 * 2]);’ - The tex1D(), tex2D(), tex3D(), and texCUBE() intrinsic function variants with explicit derivatives are supported. - The following intrinsic functions are supported: - asint() - f16tof32() - faceforward() - GetRenderTargetSampleCount() - rcp() - tex2Dbias() - tex1Dgrad(), tex2Dgrad(), tex3Dgrad(), and texCUBEgrad() - The sin() and cos() intrinsic functions are supported in shader model 1-3 profiles. These were already supported in shader model 4+ profiles. - The following features specific to effects target profiles: - Types supported in version 4.0+: - BlendState - ComputeShader, DomainShader, GeometryShader, and HullShader - DepthStencilState - RasterizerState - State application functions implemented for version 4.0+ effects: - OMSetRenderTargets() - SetBlendState() - SetComputeShader(), SetDomainShader(), SetGeometryShader(), SetHullShader(), SetPixelShader(), and SetVertexShader() - SetDepthStencilState() - SetRasterizerState() - String types. These are mainly used for annotations. - Annotations on global variables. - Support for the ‘Texture’ field of the ‘SamplerState’ type. - Support for NULL values. - Stores to swizzled matrix variables. - The ‘unsigned’ type modifier is supported. (For example, ‘unsigned int’.) Note that ‘uint’ and related types were already supported. - ‘ConstantBuffer<>’ types. - The ‘SV_Coverage’ output semantic for fragment shaders. - The experimental DXIL source type supports quad group operations. - The Direct3D shader model 2-3 ‘texldb’ instruction is correctly disassembled when outputting Direct3D shader assembly. - New interfaces: - The vkd3d_shader_parameter_info structure extends the vkd3d_shader_compile_info structure, and can be used to specify shader parameters. This is a more generic version of the shader parameter interface for SPIR-V targets in struct vkd3d_shader_spirv_target_info. - The VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32 enumeration value specifies that a shader parameter contains 32-bit floating-point data. - The VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_FUNC shader parameter specifies the alpha test function. - The VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_REF shader parameter specifies the alpha test reference value. - The VKD3D_SHADER_PARAMETER_NAME_FLAT_INTERPOLATION shader parameter specifies the interpolation mode for colour inputs in Direct3D shader model 1-3 fragment shaders. - The VKD3D_SHADER_PARAMETER_TYPE_BUFFER enumeration value specifies that the value of a shader parameter is provided at run-time through a buffer resource. ### Changes since vkd3d 1.12: ``` Anna (navi) Figueiredo Gomes (6): vkd3d-shader/ir: Periodically flush buffers when tracing blocks. Add a .editorconfig file. vkd3d: Use D3D12_SHADER_VISIBILITY_ALL for 32-bit root constants when using vk_heaps. vkd3d-shader/spirv: Avoid decorating variables multiple times with NonReadable. vkd3d-shader/spirv: Use unique SPIR-V variables for descriptors where visibility differs. vkd3d-shader/spirv: Avoid decorating variables multiple times with Coherent. Atharva Nimbalkar (2): vkd3d-shader/glsl: Implement VKD3DSIH_MOV. vkd3d-shader/glsl: Implement support for VKD3DSPR_TEMP registers. Conor McCarthy (16): vkd3d-shader/dxil: Implement DX intrinsic QuadOp. vkd3d-shader/spirv: Implement the QUAD_READ_ACROSS_* instructions. vkd3d-shader/dxil: Implement DX intrinsic QuadReadLaneAt. vkd3d-shader/spirv: Implement the QUAD_READ_LANE_AT instruction. tests/d3d12: Check for unaligned block texture support in test_create_committed_resource(). vkd3d: Allow block compressed textures to have unaligned width and height. tests/d3d12: Test a null vertex buffer 'views' pointer on multiple slots. vkd3d: Interpret a null vertex buffer 'views' pointer as a null buffer. tests/shader-runner: Set the correct flag and format for raw UAVs. tests/shader-runner: Create a new runner object for the shader model 6 tests. vkd3d: Create a descriptor pool for static samplers when Vulkan-backed heaps are used. tests: Add a test for clearing a large buffer UAV. vkd3d: Limit the workgroup X count for buffer UAV clears to the supported max. vkd3d: Add support for the ID3D12CommandList6 interface. vkd3d-shader/spirv: Free the spirv parameter info. vkd3d: Free descriptor range information on error paths in d3d12_root_signature_info_from_desc(). (Valgrind) Elizabeth Figura (39): vkd3d-shader/hlsl: Add a hlsl_fixme() for 5.1 resource arrays. vkd3d-shader/hlsl: Put constant buffers into the extern_resources struct. vkd3d-shader: Write SM5.1 register indices. vkd3d-shader/hlsl: Allocate register spaces for constant buffers. vkd3d-shader/hlsl: Allocate register spaces for objects. vkd3d-shader: Write SM5.1 register spaces. vkd3d-shader/hlsl: Write SM5.1 binding reflection data. tests: Add reflection tests for register space. vkd3d-shader/hlsl: Always initialize $$ when parsing modifiers from an arbitrary string. tests: Stop probing all pixels when drawing a uniform colour. tests: Run combined-samplers.shader_test on sm1 as well. tests: Add another combined sampler test. vkd3d-shader/hlsl: Respect the coords writemask in write_sm1_resource_load(). vkd3d-shader/hlsl: Only allocate the aligned size for uniforms. vkd3d-shader/hlsl: Separate an "array" rule. vkd3d-shader/d3dbc: Use enum vkd3d_shader_register_type in struct sm1_instruction. tests/shader_runner: Use resource->width instead of resource->size for buffer width. tests/shader_runner: Factor out a resource_desc structure. tests: Implement multisampling in the Vulkan renderer. tests: Implement multisampling in the GL renderer. vkd3d-shader/hlsl: Implement the GetRenderTargetSampleCount() intrinsic. vkd3d-shader/hlsl: Implement output SV_Coverage. vkd3d-shader: Introduce struct vkd3d_shader_parameter_info and struct vkd3d_shader_parameter1. include: Document shader parameters. vkd3d-shader/spirv: Support passing shader parameters through uniform buffers. tests: Add a test for the vkd3d_shader_parameter APIs. vkd3d-shader/spirv: Respect VKD3D_SHADER_CONDITIONAL_OP_Z when discard has a bool argument. vkd3d-shader: Allow controlling alpha test through vkd3d-shader parameters. tests: Offset the viewport by 0.5 when running d3dbc shaders. tests: Factor out a set_default_target() helper. tests: Test alpha test. vkd3d-shader/spirv: Allocate output_info after normalization. vkd3d-shader: Factor out a vsir_program_get_parameter() helper. vkd3d-shader/spirv: Pass a vkd3d_data_type to spirv_compiler_emit_shader_parameter(). vkd3d-shader: Do not make the alpha test ref parameter VSIR_DIMENSION_VEC4. vkd3d-shader: Use the program parameters in spirv_compiler_alloc_spec_constant_id(). vkd3d-shader: Allow controlling d3d color shade mode through vkd3d-shader parameters. tests: Test shade mode. vkd3d-shader: Use an extended version of vkd3d_shader_immediate_constant in vkd3d_shader_parameter1. Francisco Casas (52): vkd3d-shader/hlsl: Record default values for uniforms and constant buffers. vkd3d-shader/hlsl: Initialize default values with braceless initializers. tests: Test default values using reflection. vkd3d-shader/tpf: Write default values for SM4. vkd3d-shader/d3dbc: Write default values for SM1. tests: Test matrix default value initializers. vkd3d-shader/hlsl: Fix numeric register offset for matrix components. vkd3d-shader/hlsl: Reorder default values for matrices for SM4. tests: Test register reservations on unused variables. vkd3d-shader/hlsl: Only error out on bind_count register reservation overlaps for SM1. vkd3d-shader/d3dbc: Split hlsl_sm1_write(). vkd3d-shader/hlsl: Generate CTAB outside d3dbc_compile(). vkd3d-shader/d3dbc: Introduce struct d3dbc_compiler. vkd3d-shader/d3dbc: Use program->shader_version instead of ctx->profile. vkd3d-shader/d3dbc: Don't require a hlsl_semantic to get register and usage. vkd3d-shader/d3dbc: Use vsir_program I/O signatures to write dcls. vkd3d-shader/d3dbc: Don't write inconsequential MOVs. vkd3d-shader/hlsl: Free array sizes on function parameters (Valgrind). tests: Separate the valid stateblock function names test from the string arg test. vkd3d-shader/hlsl: Parse function call syntax on state blocks. tests: Test whether valid state block function names are case-sensitive. vkd3d-shader/hlsl: Validate state block function calls. vkd3d-shader/hlsl: Add missing src1 and src2 constants to sincos on SM2. tests: Test string escape sequences. vkd3d-shader/hlsl: Parse string constants. vkd3d-shader/hlsl: Parse string escape sequences. vkd3d-shader/hlsl: Parse string type. tests: Add missing double precission require directives. tests: Report tests skipped because of missing capabilities. tests/shader-runner: Add missing trace for wave_ops caps. tests: Introduce VKD3D_TEST_DETAILED for the test driver. vkd3d-shader/hlsl: Avoid dereferencing rel_offset if it is NULL. tests: Add additional non-constant array indexing tests. vkd3d-shader/hlsl: Lower non-constant array loads for SM1. vkd3d-shader/hlsl: Remove SM1 fixme for matrix writemasks. vkd3d-shader/hlsl: Lower non-constant row_major matrix loads for SM1. tests: Add additional string tests. vkd3d-shader/hlsl: Parse string default values. vkd3d-shader/hlsl: Skip writing string default values. vkd3d-shader/hlsl: Always work with the extern resource's component type. vkd3d-shader: Avoid div by zero on assert in vkd3d_calloc() (ubsan). tests: Add additional tests for function calls in state block rhs. tests: Test shader compilation within function definitions. tests: Test compile syntax on effects. tests: Test shader compilation within braces. tests: Test shader compilation with default values. tests/shader_runner: Require explicit formats for UAV resources. tests/shader_runner: Move parse_format() up. tests/shader_runner: Replace spaces with dashes in format names. tests/shader_runner: Don't skip shader compilation on missing caps. tests/shader_runner: Explicitly require UAV load support. tests/test-driver: Avoid double space when printing details. Giovanni Mascellani (57): tests: Mark some root signature unbounded range failures as todo on MoltenVK. vkd3d: Do not request VK_EXT_debug_marker if debug is disabled. vkd3d: Enable VK_KHR_portability_subset if available. vkd3d: Do not synchronize with the geometry shader stage if it's not enabled. ci: Assume an Apple Silicon-based environment for the macOS CI job. tests: Skip sampling cube textures on Qualcomm. tests: Transition resources to PIXEL_SHADER_RESOURCE in test_sample_c_lz(). tests: Check that depth/stencil formats are supported before using them. vkd3d: Do not synchronize with the tessellation shader stages if they're not enabled. tests: Improve feedback when enabling d3d12 debug layers. tests: Enable the d3d12 debug layer message callbacks. tests: Support using the Agility SDK in the crosstests. vkd3d: Propagate a failure in d3d12_descriptor_heap_init(). tests: Define WIDL macros in utils.h. vkd3d: Allocate temporary arrays on the stack in d3d12_command_list_update_push_descriptors(). tests: Pad the constant buffer in test_update_compute_descriptor_tables() to 256 bytes. tests: Terminate the Agility SDK path with a slash. vkd3d: Document how to install "Graphics Tools" to use the Agility SDK. vkd3d: Rebuild the vkd3d_physical_device_info chain before creating the device. vkd3d: Remove the temporary pointers in vkd3d_physical_device_info_init(). vkd3d: Propagate errors out of d3d12_root_signature_append_vk_binding(). vkd3d: Disable WARN_ON() when VKD3D_NO_DEBUG_MESSAGES is defined. vkd3d: Disable FIXME_ONCE() when VKD3D_NO_DEBUG_MESSAGES is defined. vkd3d: Allow disabling ERR() by defining VKD3D_NO_ERROR_MESSAGES. vkd3d: Introduce debug severity MESSAGE. vkd3d: Introduce a softer form of assertion. vkd3d: Allow aborting on ERR(). vkd3d: Emit an ERR() when reaching unreachable code. ci: Abort on assertions on the CI. tests: Test register conflicts in a root signature. vkd3d: Replace assert() with VKD3D_ASSERT() in command.c. vkd3d: Replace assert() with VKD3D_ASSERT() in resource.c. vkd3d: Replace assert() with VKD3D_ASSERT() in state.c. vkd3d: Replace assert() with VKD3D_ASSERT() in utils.c. vkd3d: Replace assert() with VKD3D_ASSERT() in vkd3d_private.h. vkd3d-common: Remove an assertion in vkd3d_dbg_printf(). vkd3d-shader: Replace assert() with VKD3D_ASSERT() in checksum.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in d3d_asm.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in d3dbc.c vkd3d-shader: Replace assert() with VKD3D_ASSERT() in dxbc.c. tests: Mark a couple of tests as working on recent NVIDIA GPUs. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in dxil.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in fx.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in hlsl_codegen.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in hlsl_constant_ops.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in hlsl.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in hlsl.h. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in hlsl.y. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in ir.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in preproc.h. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in preproc.l. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in preproc.y. vkd3d: Check the entire root signature for register conflicts. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in spirv.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in tpf.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in vkd3d_shader_main.c. vkd3d-shader: Replace assert() with VKD3D_ASSERT() in vkd3d_shader_private.h. Henri Verbeet (9): vkd3d-shader/ir: Rename the "handler_idx" field of struct vkd3d_shader_instruction to "opcode". vkd3d: Always use UINT views to clear UAVs with integer formats. vkd3d-shader/ir: Remove VKD3DSIH_DCL instructions. vkd3d-shader/ir: Remove VKD3DSIH_DCL_SAMPLER instructions. vkd3d-common: Replace assert() with VKD3D_ASSERT(). vkd3d-shader/fx: Replace assert() with VKD3D_ASSERT(). vkd3d: Do not include assert.h. build: Actually run bitwise-assignment.shader_test. vkd3d-shader/spirv: Decorate non-array descriptor variables as well. Nikolay Sivov (66): vkd3d-shader/hlsl: Handle "unsigned int" type. tests: Add some basic tests for ConstantBuffer type. tests: Add a few tests for the NULL value. vkd3d-shader/fx: Do not write shared buffers block when not compiling as a child effect. vkd3d-shader/hlsl: Implement tex2Dbias(). vkd3d-shader/asm: Output 'bias' flag for 'texld'. vkd3d-shader/d3dbc: Write load instruction for tex2Dbias(). vkd3d-shader/hlsl: Store original semantic name. vkd3d-shader/fx: Use original full semantic name. vkd3d-shader/fx: Set EXPLICIT_BIND_POINT flag for packoffset() reservations as well. vkd3d-shader/fx: Fix variable buffer offset value. vkd3d-shader/hlsl: Add support for ConstantBuffer<> type. vkd3d-shader/fx: Cast state block field values to target type. vkd3d-shader/fx: Add support for writing DepthStencilState objects. vkd3d-shader/hlsl: Add RasterizerState type. vkd3d-shader/fx: Add support for writing RasterizerState objects. vkd3d-shader: Implement tex*() functions variants with gradient arguments. vkd3d-shader/hlsl: Implement tex*grad() functions. vkd3d-shader/fx: Fix structure type data written for fx_4. vkd3d-shader/fx: Write default numeric values. vkd3d-shader/fx: Fix packed size for fx_4+ types. vkd3d-shader/fx: Preserve parsing order of initializer components. vkd3d-shader/fx: Add missing fields for structure types on fx_5_0. vkd3d-shader/hlsl: Do not crash on initialization of a redefined variable. vkd3d-shader/hlsl: Set default values for annotations variables. vkd3d-shader/fx: Write annotations for fx_4+ profiles. tests: Add some fx profiles tests for structure types containing objects. vkd3d-shader: Disallow object structure fields for fx profiles. vkd3d-shader/fx: Do not output empty strings for missing semantics for fx_2_0. vkd3d-shader/hlsl: Allow annotations on global variables. vkd3d-shader/fx: Correct empty pass check. vkd3d-shader/fx: Set total pass count for fx_2_0. vkd3d-shader/fx: Correct one of the object counters in the fx_2_0 header. vkd3d-shader/fx: Decompose function-style state assignments to individual states. vkd3d-shader/fx: Handle SetRasterizerState(). vkd3d-shader/hlsl: Add parser support for ComputeShader, DomainShader, and HullShader types. vkd3d-shader/fx: Fix state block entry array shifting when decomposing. vkd3d-shader/fx: Add support for SetDomainShader(), SetComputeShader(), and SetHullShader() states. vkd3d-shader/fx: Handle "Texture" field of the sampler state objects. vkd3d-shader/fx: Use more descriptive names for FX-specific types. vkd3d-shader/fx: Add an array size field to the states description table. vkd3d-shader/fx: Add support for the OMSetRenderTargets() state. vkd3d-shader/hlsl: Add parser support for GeometryShader type. vkd3d-shader/fx: Check destination array index when checking for duplicate state entries. vkd3d-shader/hlsl: Add parser support for BlendState type. vkd3d-shader/fx: Enable writing BlendState variables. vkd3d-shader/fx: Run full set of constants passes on state block entries values. vkd3d-shader/fx: Handle states of a BlendState object. vkd3d-shader/fx: Explicitly handle bool values in state entries. vkd3d-shader/fx: Turn assignments to arrays to element assignments for certain states. vkd3d-shader/hlsl: Check MS texture declaration without sample count only for used variables. vkd3d-shader/hlsl: Handle NULL constants. vkd3d-shader/hlsl: Add a test for assigning to DSV and RTV variables. vkd3d-shader/hlsl: Tokenize 'String' the same as 'string'. vkd3d-shader/hlsl: Treat "string" type name as case-insensitive. vkd3d-shader/fx: Enable writing string objects for fx_4+. vkd3d-shader/fx: Support string annotations for fx_4+. vkd3d-shader/fx: Handle SetBlendState(). vkd3d-shader/fx: Handle SetPixelShader() and SetVertexShader(). vkd3d-shader/hlsl: Adjust NULL type properties to make it usable in transformations. vkd3d-shader/fx: Support NULL constants for object fields. vkd3d-shader/fx: Resolve NULL values for SamplerState.Texture field. vkd3d: Fix a few typos in the comments. vkd3d-shader/glsl: Fix a typo in a few messages. include: Fix a few typos in the IDL files. vkd3d-shader/fx: Fix the matrix type class for fx_2_0. Petrichor Park (5): vkd3d-shader/hlsl: Implement the faceforward() intrinsic. vkd3d-shader/hlsl: Implement tests for the rcp() intrinsic. vkd3d-shader/hlsl: Implement the rcp() intrinisic. vkd3d-shader/tpf: Implmenent HLSL_OP1_RCP. vkd3d-shader/hlsl: Factor out add_binary_expr() and use it for assignment operators. Shaun Ren (6): vkd3d-shader/ir: Lower SM1 SINCOS to SM4 SINCOS. vkd3d-shader/hlsl: Implement sin/cos for SM1. vkd3d-shader/d3dbc: Implement HLSL_OP3_MAD for SM1. vkd3d-shader/hlsl: Allocate registers for HLSL_OP1_{COS,SIN}_REDUCED with the required writemasks. vkd3d-shader/d3dbc: Implement HLSL_OP1_{COS,SIN}_REDUCED for SM1. vkd3d-shader/hlsl: Support default values for function parameters. Stefan Dösinger (2): include: Get rid of the RB_FOR_EACH* macros. vkd3d: Pass a proper struct shader_cache_key * to rb_put() in vkd3d_shader_cache_add_entry(). Victor Chiletto (20): tests: Add more register reservations tests. vkd3d-shader/hlsl: Support expressions as register offsets. vkd3d-shader/hlsl: Pass a pointer to struct hlsl_reg_reservation in parse_reservation_index. vkd3d-shader/hlsl: Ignore bracket offsets for 'b' register types prior to SM 5.1. vkd3d-shader/hlsl: Do not immediately fail parsing for malformed 'b' register reservations. vkd3d-shader/hlsl: Validate cbuffer register allocations. vkd3d-shader/hlsl: Reserve register slots for unused buffers. tests: Add reflection tests for register expressions. vkd3d-shader/d3dbc: Fix implicit enum conversion warning. tests/hlsl: Add a test for dynamically indexed multisampled texture loads. vkd3d-shader/hlsl: Use a switch in validate_static_object_references(). vkd3d-shader/hlsl: Defer bounds checks to after copy propagation. vkd3d-shader/hlsl: Pull evaluate_static_expression_as_uint() upwards. vkd3d-shader/hlsl: Parse loop and unroll loop attributes. vkd3d-shader/hlsl: Allow cloned blocks to contain external references. vkd3d-shader/hlsl: Implement loop unrolling. tests/hlsl: Test loop unrolling edge cases. vkd3d-shader/hlsl: Implement the asint() intrinsic. vkd3d-shader/hlsl: Push a new scope when compiling internal functions. vkd3d-shader/hlsl: Implement f16tof32 intrinsic. Yuxuan Shui (2): tests: Pass the correct buffer size to vsnprintf() in vkd3d_test_push_context(). vkd3d-shader/hlsl: Implement storing to a swizzled matrix. ```