Skip to content
Snippets Groups Projects
ChangeLog.md 57.2 KiB
Newer Older
Henri Verbeet's avatar
Henri Verbeet committed
# What's new in vkd3d 1.14 (21 November 2024)

### libvkd3d

  - Depth bounds can be changed dynamically using the OMSetDepthBounds() method
    of the ID3D12GraphicsCommandList1 interface.

  - The new VKD3D_CAPS_OVERRIDE environment variable can be used to override the
    value of capabilities like the maximum feature level and resource binding
    tier reported to applications.

### libvkd3d-shader

  - New features for the HLSL source type:
    - Interstage I/O variable packing matches d3dcompiler/fxc more closely.
    - The following intrinsic functions are supported:
      - dst()
      - f32tof16()
      - mad()
      - modf()
      - sincos()
    - ‘discard’ support for shader model 1-3 target profiles.
    - The ‘SV_SampleIndex’ input semantic for fragment shaders.
    - The ‘SV_GroupIndex’ input semantic for compute shaders.
    - The ‘earlydepthstencil’ function attribute.
    - Constant folding of expressions like ‘x && c’ and ‘x || c’, where ‘c’ is a
      constant.
    - Preprocessor support for namespaces in macro identifiers. I.e., syntax
      like ‘#define NAME1::NAME2::NAME3 1’ works as intended now.
    - Structure inheritance. Multiple inheritance is not supported.
    - Register assignments for unused constant buffers are allowed to overlap
      register assignments for used constant buffers.
    - Instruction count reflection data for shader model 4+ target profiles.
      This data is contained in the ‘STAT’ DXBC section, and can be queried with
      the GetDesc() method of the ID3D11ShaderReflection and
      ID3D12ShaderReflection interfaces. Note that the ID3D12ShaderReflection
      implementation provided by vkd3d-utils does not currently correctly report
      this information.
    - ‘unorm’ and ‘snorm’ resource format modifiers. For example,
      ‘Texture2D<unorm float4> t;’
    - Parser support for ‘ByteAddressBuffer’ resources, as well as their
      Load()/Load2()/Load3()/Load4() methods.
    - Parser support for ‘RWByteAddressBuffer’ resources, as well as their
      Store()/Store2()/Store3()/Store4() methods.
    - Parser support for the ‘compile’ keyword, as well as the CompileShader()
      and ConstructGSWithSO() intrinsic functions. Actual compilation of
      embedded shaders is not implemented yet, but parser support is sufficient
      for allowing compilation of HLSL sources containing this syntax to succeed
      when targetting shader target profiles like ‘vs_5_0’ or ‘ps_5_0’.
    - Initial support for tessellation shaders. Only the most trivial shaders
      are supported in this release. Perhaps most notably, both ‘InputPatch’ and
      ‘OutputPatch’ are not implemented yet.

  - The new ‘fx’ source type can be used in combination with the ‘d3d-asm’
    target type to disassemble binary effects.

  - More complete support for fx_2_0 binary effect output, including support for
    annotations, default values, as well as object initialiser data used for e.g.
    string, texture, and shader objects.

  - A significant number of instructions have been implemented for the
    experimental GLSL target. The GLSL output currently targets version 4.40
    without extensions, but the intention is to make this configurable in a
    future release of vkd3d.

  - Experimental support for Metal Shading Language (MSL) output, enabled by
    building vkd3d with the ‘-DVKD3D_SHADER_UNSUPPORTED_MSL’ preprocessor
    option. The current release is only able to compile the most basic shaders
    when targetting MSL. Being an experimental feature, both the ABI and API may
    change in future releases; the feature may even go away completely.
    Nevertheless, we hope our users find this feature useful, and welcome
    feedback and contributions.

  - Shader code generation for various legacy fixed-function features, including
    clip planes, point sizes, and point sprites. This is mainly relevant for
    executing shader model 1-3 sources in modern target environments like
    Vulkan, because those target environments do not implement equivalent
    fixed-function features.

  - The amount of shader validation done by the internal validator has been
    greatly extended. The validator is enabled by the ‘force_validation’ option,
    specified through the VKD3D_SHADER_CONFIG environment variable.

  - New interfaces:
    - The VKD3D_SHADER_COMPILE_OPTION_DOUBLE_AS_FLOAT_ALIAS flag specifies that
      the ‘double’ type behaves as an alias for the ‘float’ type in HLSL sources
      with shader model 1-3 target profiles.
    - The VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32_VEC4 enumeration value
      specifies that a shader parameter contains a 4-dimensional vector of
      32-bit floating-point data.
    - The VKD3D_SHADER_PARAMETER_NAME_CLIP_PLANE_MASK shader parameter specifies
      which clip planes are enabled.
    - The VKD3D_SHADER_PARAMETER_NAME_CLIP_PLANE_[0-7] shader parameters specify
      the corresponding clip planes.
    - The VKD3D_SHADER_PARAMETER_NAME_POINT_SIZE shader parameter specifies the
      point size to output when the source shader does not explicitly output a
      point size.
    - The VKD3D_SHADER_PARAMETER_NAME_POINT_SIZE_MIN shader parameter specifies
      the minimum point size to clamp point size outputs to.
    - The VKD3D_SHADER_PARAMETER_NAME_POINT_SIZE_MAX shader parameter specifies
      the maximum point size to clamp point size outputs to.
    - The VKD3D_SHADER_PARAMETER_NAME_POINT_SPRITE shader parameter specifies
      whether texture coordinate inputs in fragment shaders should be replaced
      with point coordinates.
    - The VKD3D_SHADER_SOURCE_FX source type specifies binary Direct3D effects.
    - The VKD3D_SHADER_TARGET_MSL target type specifies Metal Shading Language
      shaders.

### libvkd3d-utils

  - The GetDesc() method of the ID3D12ShaderReflection interface returned by
    D3DReflect() returns shader version information.

  - New interfaces:
    - D3DCompile2VKD3D() is a variant of D3DCompile2() that allows targeting the
      behaviour of a specific d3dcompiler version.

### vkd3d-compiler

  - The ‘--alias-double-as-float’ option specifies that the ‘double’ type
    behaves as an alias for the ‘float’ type in HLSL sources with shader model
    1-3 target profiles.

  - The ‘fx’ source type specifies binary Direct3D effects.

  - The ‘msl’ target type specifies Metal Shading Language shaders.

Henri Verbeet's avatar
Henri Verbeet committed
# What's new in vkd3d 1.13 (29 August 2024)

### 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.

Henri Verbeet's avatar
Henri Verbeet committed
# What's new in vkd3d 1.12 (28 May 2024)

### libvkd3d

  - When the VK_EXT_fragment_shader_interlock extension is available, libvkd3d
    supports rasteriser-ordered views.

  - Compute pipeline state objects can be created from compute shaders with
    embedded root signatures.

  - When supported by the underlying Vulkan implementation, libvkd3d supports
    the DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM, and
    DXGI_FORMAT_B4G4R4A4_UNORM formats.

  - The ID3D12ShaderCacheSession interface is supported.

  - The ID3D12Device9 interface is supported.

  - The CreateCommittedResource2(), CreatePlacedResource1(),
    GetCopyableFootprints1(), and GetResourceAllocationInfo2() methods of the
    ID3D12Device8 interface are implemented.

  - Several new feature queries are supported:
    - D3D12_FEATURE_D3D12_OPTIONS14
    - D3D12_FEATURE_D3D12_OPTIONS15
    - D3D12_FEATURE_D3D12_OPTIONS16
    - D3D12_FEATURE_D3D12_OPTIONS17
    - D3D12_FEATURE_D3D12_OPTIONS18

### libvkd3d-shader

  - The experimental DXIL source type supports the majority of Direct3D shader
    model 6.0 instructions and features. Note that this is currently still an
    unsupported feature, enabled by building vkd3d with the
    ‘-DVKD3D_SHADER_UNSUPPORTED_DXIL’ preprocessor option. No API or ABI
    stability guarantees are provided for experimental features.

  - New features for the HLSL source type:
    - Support for compiling directly to Direct3D shader assembly and SPIR-V
      target types. This is primarily a convenience feature, as targeting
      these could previously be achieved by going through either the ‘Legacy
      Direct3D byte-code’ or ‘Tokenized Program Format’ formats as
      intermediates.
    - Improved support for shader model 1-3 profiles. In particular:
      - The ternary, comparison, and logical operators are now supported for
        these profiles.
      - Support for integer and Boolean types has been improved.
      - Shader constants are allocated in an order compatible with the
        Microsoft implementation.
    - More complex array size expressions. For example, matrix and vector
      swizzles are allowed, as well as (constant) array dereferences.
    - The following intrinsic functions are supported:
      - cosh()
      - determinant()
      - refract()
      - sinh()
      - tanh()
    - Reflection data for ‘Tokenized Program Format’ targets more accurately
      reflects the source shader.
    - Constant folding of expressions like ‘x + 0’ and ‘x * 1’.
    - Support for the ‘single’ qualifier on constant buffer declarations.
    - Parser support for annotations on constant buffer declarations.
    - Parser support for effect state objects.

  - When the SPV_EXT_fragment_shader_interlock extension is supported, SPIR-V
    targets support rasteriser-ordered views.

  - New interfaces:
    - The VKD3D_SHADER_PARSE_DXBC_IGNORE_CHECKSUM flag indicates that
      vkd3d_shader_parse_dxbc() should skip validating the checksum of the
      DXBC blob. This allows otherwise valid blobs with a missing or invalid
      checksum to be parsed.
    - The VKD3D_SHADER_SPIRV_ENVIRONMENT_VULKAN_1_1 enumeration value
      specifies the Vulkan 1.1 environment for SPIR-V targets. Most notably,
      the Vulkan 1.1 environment implies support for SPIR-V 1.3, which is a
      requirement for supporting Direct3D shader model 6 wave operations on
      SPIR-V targets.
    - The VKD3D_SHADER_SPIRV_EXTENSION_EXT_FRAGMENT_SHADER_INTERLOCK
      enumeration value indicates support for the
      SPV_EXT_fragment_shader_interlock extension in the SPIR-V target
      environment.
    - The VKD3D_SHADER_COMPILE_OPTION_FEATURE_WAVE_OPS flag indicates support
      for Direct3D shader model 6 wave operations in the SPIR-V target
      environment.
    - The VKD3D_SHADER_COMPILE_OPTION_FORMATTING_IO_SIGNATURES flag indicates
      that vkd3d_shader_compile() should include information about input,
      output, and patch constant shader signatures when targeting Direct3D
      shader assembly. Note that this is a libvkd3d-shader extension, and
      potentially makes the output incompatible with other implementations.
    - The VKD3D_SHADER_COMPILE_OPTION_CHILD_EFFECT compile option specifies
      whether libvkd3d-shader should produce child effects for ‘fx_4_0’ and
      ‘fx_4_1’ HLSL target profiles.
    - The VKD3D_SHADER_COMPILE_OPTION_INCLUDE_EMPTY_BUFFERS_IN_EFFECTS compile
      option specifies whether empty constant buffer descriptions should be
      included in the output for ‘fx_4_0’ and ‘fx_4_1’ HLSL target profiles.
    - The VKD3D_SHADER_COMPILE_OPTION_WARN_IMPLICIT_TRUNCATION compile option
      specifies whether the HLSL compiler should emit warnings for vector and
      matrix truncation in implicit type conversions.

### libvkd3d-utils

  - D3D12CreateDeviceVKD3D() and D3D12CreateDevice() no longer require the
    VK_KHR_surface and VK_KHR_swapchain extensions to be available. This
    allows them to be used in environments with a windowing system, for
    example for off-screen rendering and compute tasks.

  - The GetConstantBufferByIndex() and GetResourceBindingDesc() methods of the
    ID3D12ShaderReflection interface are implemented.

  - The GetVariableByIndex() method of the
    ID3D12ShaderReflectionConstantBuffer interface is implemented.

  - The GetMemberTypeByIndex() method of the ID3D12ShaderReflectionType
    interface is implemented.

  - The GetType() method of the ID3D12ShaderReflectionVariable interface is
    implemented.

### vkd3d-compiler

  - The ‘+signatures’ flag for the ‘--formatting’ option can be used to
    specify that vkd3d-compiler should include information about input,
    output, and patch constant shader signatures when outputting Direct3D
    shader assembly. Note that this is a vkd3d-compiler extension, and
    potentially makes the output incompatible with other implementations.

  - The ‘--child-effect’ option can be used to specify that vkd3d-compiler
    should produce child effects for ‘fx_4_0’ and ‘fx_4_1’ HLSL target
    profiles.

  - The ‘--fx-include-empty-buffers’ option can be used to specify that
    vkd3d-compiler should include empty constant buffer descriptions in the
    output for ‘fx_4_0’ and ‘fx_4_1’ HLSL target profiles.

### vkd3d-dxbc

  - The ‘--ignore-checksum’ option can be used to specify that vkd3d-dxbc
    should skip validating the checksum of the DXBC input blob. This allows
    vkd3d-dxbc to operate on otherwise valid blobs with missing or invalid
    checksums.

  - The ‘--emit’ option can be used to indicate that vkd3d-dxbc should output
    a new DXBC blob.

  - The ‘--extract’ option can be used to specify a section to extract out of
    the input blob. For example, ‘vkd3d-dxbc -x t:PRIV blob.dxbc > priv.bin’
    would extract the private data section of ‘blob.dxbc’ to ‘priv.bin’, and
    ‘vkd3d-dxbc -x t:RTS0 blob.dxbc > root_signature.bin’ would extract the
    root signature to ‘root_signature.bin’.

  - The ‘--output’ option can be used to specify where vkd3d-dxbc should write
    its output for the ‘--emit’ and ‘--extract’ options.

367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
# What's new in vkd3d 1.11 (5 Mar 2024)

### libvkd3d

  - Descriptor updates happen asynchronously on an internal worker thread, for
    a minor performance improvement in applications that update many
    descriptors per frame.

  - When the VK_EXT_mutable_descriptor_type extension is available, libvkd3d
    will make more efficient use of descriptor pools and sets.

  - When the VK_EXT_shader_viewport_index_layer extension is available,
    libvkd3d supports indexing viewport and render target arrays from vertex
    and tessellation evaluation shaders.

  - Support for standard (i.e., black and white) border colours is
    implemented.

  - The GetResourceAllocationInfo1() method of the ID3D12Device4 interface is
    implemented.

  - The ID3D12Device7 interface is supported.

  - The ID3D12Resource2 interface is supported.

  - Several new feature queries are supported:
    - D3D12_FEATURE_D3D12_OPTIONS6
    - D3D12_FEATURE_D3D12_OPTIONS7
    - D3D12_FEATURE_D3D12_OPTIONS8
    - D3D12_FEATURE_D3D12_OPTIONS9
    - D3D12_FEATURE_D3D12_OPTIONS10
    - D3D12_FEATURE_D3D12_OPTIONS11
    - D3D12_FEATURE_D3D12_OPTIONS12
    - D3D12_FEATURE_D3D12_OPTIONS13

### libvkd3d-shader

  - Initial support for compiling legacy Direct3D bytecode to SPIR-V.

  - Experimental support for compiling DirectX Intermediate Language (DXIL) to
    SPIR-V and Direct3D shader assembly. Being an experimental feature, this
    requires building vkd3d with the ‘-DVKD3D_SHADER_UNSUPPORTED_DXIL’
    preprocessor option. Note that enabling this feature will affect the
    capabilities reported by libvkd3d as well, and may cause previously
    working applications to break due to attempting to use incomplete DXIL
    support. No API or ABI stability guarantees are provided for experimental
    features.

  - New features for the HLSL source type:
    - Initial support for the ‘fx_2_0’, ‘fx_4_0’, ‘fx_4_1’, and ‘fx_5_0’
      profiles, using the new ‘VKD3D_SHADER_TARGET_FX’ target type.
    - Support for ‘Buffer’ resources.
    - The acos(), asin(), atan(), and atan2() intrinsic functions are
      supported.
    - Explicit register assignment using the ‘register()’ keyword in shader
      model 1-3 profiles. This was previously only supported in shader model
      4+ profiles.
    - Casts from integer to floating-point types in shader model 1-3 profiles.
    - Support for various input/output semantics:
      - SV_InstanceID in shader model 4+ fragment shaders.
      - SV_PrimitiveID in shader model 4+ fragment shaders. In previous
        versions this was only supported in shader model 4+ geometry shaders.
      - SV_RenderTargetArrayIndex in shader model 4+ vertex and fragment shaders.
      - SV_ViewportArrayIndex in shader model 4+ vertex and fragment shaders.
    - Support for various rasteriser-ordered view types. Specifically:
      - RasterizerOrderedBuffer
      - RasterizerOrderedStructuredBuffer
      - RasterizerOrderedTexture1D
      - RasterizerOrderedTexture1DArray
      - RasterizerOrderedTexture2D
      - RasterizerOrderedTexture2DArray
      - RasterizerOrderedTexture3D

  - New features for the SPIR-V target type:
    - Support for globally coherent unordered access views. These have the
      ‘globallycoherent’ storage class in HLSL, and the ‘_glc’ suffix in
      Direct3D assembly.
    - Support for thread group unordered access view barriers. This
      corresponds to ‘sync_ugroup’ instructions in Direct3D assembly.
    - When the SPV_EXT_viewport_index_layer extension is supported, vertex and
      tessellation evaluation shaders can write render target and viewport
      array indices. This corresponds to the ‘SV_RenderTargetArrayIndex’ and
      ‘SV_ViewportArrayIndex’ HLSL output semantics.

  - New interfaces:
    - The VKD3D_SHADER_COMPILE_OPTION_FEATURE compile option can be used to
      specify features available in the target environment. The
      VKD3D_SHADER_COMPILE_OPTION_FEATURE_INT64 flag indicates support for
      64-bit integer types in the SPIR-V target environment. The
      VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64 flag indicates support for
      64-bit floating-point types in the SPIR-V target environment. For
      backward compatibility, VKD3D_SHADER_API_VERSION_1_10 and earlier also
      imply support for 64-bit floating-point types.
    - The VKD3D_SHADER_SPIRV_EXTENSION_EXT_VIEWPORT_INDEX_LAYER enumeration
      value indicates support for the SPV_EXT_viewport_index_layer extension
      in the SPIR-V target environment.

### libvkd3d-utils

  - When available, the following Vulkan extensions are enabled by
    D3D12CreateDeviceVKD3D() and D3D12CreateDevice():
    - VK_KHR_android_surface
    - VK_KHR_wayland_surface
    - VK_KHR_win32_surface
    - VK_KHR_xlib_surface
    - VK_EXT_metal_surface
    - VK_MVK_ios_surface

    Previous versions of vkd3d-utils enabled VK_KHR_xcb_surface and
    VK_MVK_macos_surface. In practice this means that
    D3D12CreateDevice()/D3D12CreateDeviceVKD3D() can be used on the
    corresponding additional window systems.

  - New interfaces:
    - D3DReflect() is used to retrieve information about shaders. It currently
      supports retrieving information about input, output, and patch constant
      parameters using the ID3D12ShaderReflection interface.
    - D3DDisassemble() is used to disassemble legacy Direct3D bytecode (shader
      model 1-3) and ‘Tokenized Program Format’ (shader model 4 and 5)
      shaders.

### vkd3d-compiler

  - The new ‘fx’ target is used for outputting Direct3D effects when compiling
    HLSL ‘fx_2_0’, ‘fx_4_0’, ‘fx_4_1’, and ‘fx_5_0’ profiles.

### build

  - The minimum required version of Vulkan-Headers for this release is version
    1.3.228.

# What's new in vkd3d 1.10 (6 Dec 2023)

### libvkd3d

  - Creating pipeline state objects from pipeline state stream descriptions is
    implemented.
  - Depth-bounds testing is implemented.
  - When the VK_KHR_maintenance2 extension is available, libvkd3d will
    explicitly specify the usage flags of Vulkan image views. This is
    particularly useful on MoltenVK, where 2D-array views of 3D textures are
    subject to usage restrictions.
  - The D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD and/or
    D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE feature flags are reported for
    UAV formats when the ‘shaderStorageImageReadWithoutFormat’ and/or
    ‘shaderStorageImageWriteWithoutFormat’ Vulkan device features are
    supported.
  - The ID3D12Device5 interface is supported.
  - The ID3D12GraphicsCommandList5 interface is supported.
  - The ID3D12Resource1 interface is supported.

### libvkd3d-shader

  - New features for the HLSL source type:
    - Support for the following intrinsic functions:
      - ceil()
      - degrees() and radians()
      - fwidth()
      - tan()
      - tex2Dlod(), tex2Dproj(), texCUBEproj(), and tex3Dproj()
    - Constant folding support for more expression types. In particular:
      - ternary operators and branches
      - reciprocal square roots
      - exponentials
      - logical ‘not’ on booleans
      - bitwise complements
      - left/right shifts
      - ceil(), floor(), frac(), and saturate()
    - Support for dynamic indexing of arrays.
    - Support for ‘break’ and ‘continue’ statements.
    - Support for ‘switch’ statements.
    - The ‘linear’, ‘centroid’, and ‘noperspective’ interpolation modifiers
      are supported.
    - The ‘RWTexture1DArray’ and ‘RWTexture2DArray’ unordered access view
      types are supported.
    -\[loop\]’ attributes are accepted on loops.
    - u/U and l/L suffixes on integer constants.

  - Floating-point values are explicitly clamped to the upper and lower bounds
    of the target type by ‘ftoi’ and ‘ftou’ instructions when targeting
    SPIR-V. Similarly, NaNs are flushed to zero. Some hardware/drivers would
    already do this implicitly, but behaviour for such inputs is undefined as
    far as SPIR-V is concerned.

  - The VKD3D_SHADER_CONFIG environment variable can be used to modify the
    behaviour of libvkd3d-shader at run-time, analogous to the existing
    VKD3D_CONFIG environment variable for libvkd3d. See the README for a list
    of supported options.

  - When scanning legacy Direct3D bytecode using vkd3d_shader_scan(),
    descriptor information for shader model 2 and 3 combined resource-sampler
    pairs is returned in the vkd3d_shader_scan_descriptor_info structure.
    Note that this information is not yet available for shader model 1
    sources, although this will likely be added in a future release.

  - The Direct3D shader assembly target supports the ‘rasteriser ordered view’
    flag (‘_rov’) on unordered access view declarations.

  - New interfaces:
    - The VKD3D_SHADER_COMPILE_OPTION_BACKWARD_COMPATIBILITY compile
      option can be used to specify backward compatibility options. The
      VKD3D_SHADER_COMPILE_OPTION_BACKCOMPAT_MAP_SEMANTIC_NAMES flag is
      the only currently supported flag, and can be used to specify that
      shader model 1-3 semantic names should be mapped to their shader model
      4+ system value equivalents when compiling HLSL sources.
    - The VKD3D_SHADER_COMPILE_OPTION_FRAGMENT_COORDINATE_ORIGIN compile
      option can be used to specify the origin of fragment coordinates for
      SPIR-V targets. This is especially useful in OpenGL environments, where
      the origin may be different than in Direct3D or Vulkan environments.
    - The vkd3d_shader_scan_combined_resource_sampler_info structure
      extends the vkd3d_shader_compile_info structure, and can be used to
      retrieve information about the combined resource-sampler pairs used by a
      shader. This is especially useful when compiling shaders for usage in
      environments without separate binding points for samplers and resources,
      like OpenGL.
    - vkd3d_shader_free_scan_combined_resource_sampler_info() is used
      to free vkd3d_shader_scan_combined_resource_sampler_info
      structures.

### libvkd3d-utils

  - Passing the D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY flag to
    D3DCompile() and D3DCompile2() will enable mapping shader model 1-3
    semantic names to their shader model 4+ system value equivalents.

  - New interfaces:
    - D3DGetBlobPart() is used to retrieve specific parts of DXBC blobs.
    - D3DGetDebugInfo() is used to retrieve debug information from DXBC blobs.
    - D3DGetInputAndOutputSignatureBlob() is used to retrieve input and output
      signatures from DXBC blobs.
    - D3DGetInputSignatureBlob() is used to retrieve input signatures from
      DXBC blobs.
    - D3DGetOutputSignatureBlob() is used to retrieve output signatures from
      DXBC blobs.
    - D3DStripShader() is used to remove specific parts from DXBC blobs.

### vkd3d-compiler

  - The ‘--fragment-coordinate-origin’ option can be used to specify the
    origin of fragment coordinates for SPIR-V targets.

  - The ‘--semantic-compat-map’ option can be used to specify that shader
    model 1-3 semantic names should be mapped to their shader model 4+ system
    value equivalents when compiling HLSL sources.

### vkd3d-dxbc

  - The ‘--list’ and ‘--list-data’ options now also output the offsets of
    sections inside the input data.

### build

  - The minimum required version of Vulkan-Headers for this release is version
    1.2.148.

  - When available, the libEGL and libOpenGL libraries are used to run the
    vkd3d tests in additional configurations. These libraries are not used by
    vkd3d itself.

  - The SONAME_LIBDXCOMPILER configure variable can be used specify the
    shared object name of the dxcompiler library. When available, it's used to
    run the vkd3d tests in additional configurations. The dxcompiler library
    is not used by vkd3d itself.


# What's new in vkd3d 1.9 (21 Sep 2023)

### libvkd3d

- Copying between depth/stencil and colour formats in
  ID3D12GraphicsCommandList::CopyResource() is supported.
- The ID3D12Fence1 interface is supported.


### libvkd3d-shader

- vkd3d_shader_scan() supports retrieving descriptor information for ‘d3dbc’
  shaders. This is one of the requirements for eventual SPIR-V generation from
  ‘d3dbc’ sources.

- New features for the HLSL source type:
  - Support for the following intrinsic functions:
    - clip()
    - ddx_coarse() and ddy_coarse()
    - ddx_fine() and ddy_fine()
    - tex1D(), tex2D(), texCUBE(), and tex3D()
  - Constant folding support for more expression types. In particular:
    - comparison operators
    - floating-point min() and max()
    - logical ‘and’ and ‘or’
    - dot products
    - square roots
    - logarithms
  - Support for multi-sample texture object declarations without explicit
    sample counts in shader model 4.1 and later shaders.
  - Support for using constant expressions as sample counts in multi-sample
    texture object declarations.
  - Support for variable initialisers using variables declared earlier in the
    same declaration list. E.g., ‘float a = 1, b = a, c = b + 1;’.
  - The GetDimensions() texture object method is implemented.
  - Matrix swizzles are implemented.
  - Parser support for if-statement attributes like ‘[branch]’ and
    ‘[flatten]’.
  - Support for the ‘inline’ function modifier.

- Previously, vkd3d_shader_compile() would in some cases return VKD3D_OK
  despite compilation failing when targeting legacy Direct3D bytecode. These
  cases have been fixed.

- Various HLSL preprocessor fixes for edge cases related to stringification.

- SPIR-V target support for the ‘linear noperspective centroid’ input
  interpolation mode.

- New interfaces:
  - The vkd3d_shader_scan_signature_info structure extends the
    vkd3d_shader_compile_info structure, and can be used to retrieve
    descriptions of ‘dxbc-tpf’ and ‘d3dbc’ shader inputs and outputs.
  - vkd3d_shader_free_scan_signature_info() is used to free
    vkd3d_shader_scan_signature_info structures.
  - The VKD3D_SHADER_COMPILE_OPTION_PACK_MATRIX_ORDER compile option can be
    used to specify the default matrix packing order for HLSL sources.
  - The vkd3d_shader_varying_map_info structure extends the
    vkd3d_shader_compile_info structure, and can be used to specify a mapping
    between the outputs of a shader stage and the inputs of the next shader
    stage.
  - vkd3d_shader_build_varying_map() is used to build a mapping between the
    outputs of a shader stage and the inputs of the next shader stage.
  - The VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER flag returned as part of
    the vkd3d_shader_descriptor_info structure indicates the descriptor refers
    to a byte-addressed (‘raw’) buffer resource.


### vkd3d-compiler

- The ‘--matrix-storage-order’ option can used to specify the default matrix
  storage order for HLSL sources.


### vkd3d-dxbc

- vkd3d-dxbc is a new utility that can be used to inspect the contents of DXBC
  blobs.


# What's new in vkd3d 1.8 (22 Jun 2023)

### libvkd3d

- Performance improvements have been made to the code that handles descriptor
  updates. In some applications the improvement can be quite significant.

- Host-visible descriptor heaps are persistently mapped on creation. Some
  applications access resource data from the CPU after calling Unmap(), and
  that's supposed to work in practice.

- 1-dimensional texture unordered-access views and shader resource views are
  implemented.

- Shader resource view, unordered access view, and constant buffer view root
  descriptors with NULL GPU addresses are supported.

- Direct3D 12 descriptor heap destruction is delayed until all contained
  resources are destroyed.


### libvkd3d-shader

- New features for the HLSL source type:
  - Support for the ternary conditional operator "?:".
  - Support for "discard" statements.
  - Support for the "packoffset" keyword.
  - Support for semantics on array types.
  - Support for RWBuffer loads and stores.
  - Register allocation for arrays and structures of resources and samplers
    is implemented.
  - Support for the SV_IsFrontFace pixel shader system-value semantics.
  - Support for using constant expressions as array sizes and indices.
  - Support for dynamic selection of vector components.
  - Support for the following intrinsic functions:
    - D3DCOLORtoUBYTE4()
    - any()
    - asfloat()
    - ddx() and ddy()
    - fmod()
    - log(), log2(), and log10()
    - sign()
    - trunc()
  - The SampleBias(), SampleCmp(), SampleCmpLevelZero(), and SampleGrad()
    texture object methods are implemented.
  - Support for the case-insensitive variants of the "vector" and "matrix"
    data types.
  - Parser support for the "unroll" loop attribute. A warning is output for
    "unroll" without iteration count, and an error is output when an iteration
    count is specified. Actual unrolling is not implemented yet.
  - Parser support for RWStructuredBuffer resources.
  - Parser support for SamplerComparisonState objects. Note that outputting
    compiled effects is not supported yet, but parsing these allows shaders
    containing SamplerComparisonState state objects to be compiled.

- More improvements to HLSL support for the Direct3D shader model 1/2/3
  profiles.

- The section alignment of DXBC blobs produced by
  vkd3d_shader_serialize_dxbc() matches those produced by d3dcompiler more
  closely.

- The "main" function for shaders produced by the SPIR-V target is always
  terminated, even when the source was a TPF shader without explicit "ret"
  instruction.

- Relative addressing of shader input registers is supported by SPIR-V
  targets.


# What's new in vkd3d 1.7 (23 Mar 2023)

### libvkd3d-shader

- New features for the HLSL source type:
  - Support for calling user-defined functions.
  - Support for array parameters to user-defined functions.
  - Much improved support for the Direct3D shader model 1/2/3 profiles.
  - Support for the SV_DispatchThreadID, SV_GroupID, and SV_GroupThreadID
    compute shader system-value semantics.
  - Support for the optional "offset" parameter of the texture object Load()
    method.
  - Support for the all() intrinsic function.
  - Support for the distance() intrinsic function.
  - Support for the exp() and exp2() intrinsic functions.
  - Support for the frac() intrinsic function.
  - Support for the lit() intrinsic function.
  - Support for the reflect() intrinsic function.
  - Support for the sin() and cos() intrinsic functions.
  - Support for the smoothstep() intrinsic function.
  - Support for the sqrt() and rsqrt() intrinsic functions.
  - Support for the step() intrinsic function.
  - Support for the transpose() intrinsic function.
  - Support for the case-insensitive variants of the "float" and "dword" data
    types.
  - Partial support for minimum precision data types like "min16float". These
    are currently interpreted as their regular counterparts.
  - Improved constant propagation support, in particular to constant
    propagation through swizzles.

- HLSL static variables are now properly zero-initialised.

- The Direct3D shader model 4 and 5 disassembler outputs sample counts for
  multi-sampled resource declarations.

- New interfaces:
  - vkd3d_shader_parse_dxbc() provides support for parsing DXBC blobs.
  - vkd3d_shader_serialize_dxbc() provides support for serialising DXBC blobs.
  - vkd3d_shader_free_dxbc() is used to free vkd3d_shader_dxbc_desc
    structures, as returned by vkd3d_shader_parse_dxbc().
  - The VKD3D_SHADER_COMPILE_OPTION_WRITE_TESS_GEOM_POINT_SIZE compile option
    can be used to specify whether SPIR-V shaders targeting Vulkan
    environments should write point sizes for geometry and tessellation
    shaders. If left unspecified, point sizes will be written.


# What's new in vkd3d 1.6 (7 Dec 2022)

### libvkd3d-shader

- New features for the HLSL source type:
  - Initial support for compute shaders.
  - Improved support for initialisation and assignment of compound objects
    like structures and arrays, including casts and implicit conversions.
  - Support for loads and stores of texture resource unordered-access views.
  - Support for function attributes. In particular, the required "numthreads"
    attribute for compute shader entry points is now supported.
  - Support for the asuint() intrinsic function.
  - Support for the length() intrinsic function.
  - Support for the normalize() intrinsic function.
  - Support for integer division and modulus.
  - Support for taking the absolute value of integers.
  - Support for floating-point modulus.


- New interfaces:
  - The VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS descriptor info flag is
    used to indicate that atomic operations are used on unordered-access view
    descriptors.


### libvkd3d-common

- vkd3d debug output is prefixed with "vkd3d:" in order to make it easier to
  distinguish from output produced by applications or other libraries.


### demos

- The demos now use libvkd3d-shader to compile HLSL shaders at run-time.


# What's new in vkd3d 1.5 (22 Sep 2022)

### libvkd3d-shader

- New features for the HLSL source type:
  - Improved support for HLSL object types (like e.g. ‘Texture2D’) inside
    structures and arrays.
  - Implicitly sized array initialisers.
  - Support for the dot() intrinsic function.
  - Support for the ldexp() intrinsic function.
  - Support for the lerp() intrinsic function.
  - Support for the logical ‘and’, ‘or’, and ‘not’ operators in shader model 4
    and 5 targets.
  - Support for casts from ‘bool’ types in shader model 4 and 5 targets.
  - Constant folding for integer bitwise operations.
  - Constant folding for integer min() and max().

- New interfaces:
  - The VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV compile option can be used to
    specify the SPIR-V format to use for typed unordered access view loads.
    When set to ‘Unknown’, and the ‘shaderStorageImageReadWithoutFormat’
    feature is enabled in the target environment, this allows typed loads from
    multicomponent format unordered access views. If left unspecified, a R32
    format will be used, like in previous versions of libvkd3d-shader.


# What's new in vkd3d 1.4 (22 Jun 2022)

### libvkd3d

- A new descriptor heap implementation using the VK_EXT_descriptor_indexing
  extension. In particular, the new implementation is more efficient when
  large descriptor heaps are used by multiple command lists. The new
  ‘virtual_heaps’ configuration option can be used to select the original
  implementation even when the VK_EXT_descriptor_indexing extension is
  available.

- A new fence implementation using the VK_KHR_timeline_semaphore extension.
  The new implementation addresses a number of edge cases the original
  implementation was unable to, as well as being somewhat more efficient.

- When the VK_EXT_robustness2 extension is available, it is used to implement
  null views. This more accurately matches Direct3D 12 behaviour. For example,
  all reads from such a null view return zeroes, while that isn't necessarily
  the case for out-of-bounds reads with the original implementation.

- New interfaces:
  - vkd3d_set_log_callback() allows writing log output via a custom callback.
    This can be used to integrate vkd3d's log output with other logging
    systems.


### libvkd3d-shader

- New features for the HLSL source type:
  - Support for integer arithmetic, bitwise and shift operations.
  - Support for matrix and vector subscripting.
  - Support for the mul() intrinsic function.
  - Support for matrix copying, casting, and entry-wise operations.
  - Support for complex initialisers.
  - Support for the ‘nointerpolation’ modifier. This modifier is applied by
    default to integer variables.
  - Support for the SV_VertexID semantic.
  - Support for matrix-typed varyings.
  - Constant folding for a number of operators.
  - Copy propagation across branches and loops. This allows use of non-numeric
    variables anywhere in a program, as well as more optimised code for
    accessing numeric variables within branches and loops.

- The disassembler supports the shader model 5 ‘msad’ instruction.

- New interfaces:
  - vkd3d_shader_set_log_callback() allows writing log output via a custom
    callback.


### libvkd3d-utils

- New interfaces:
  - vkd3d_utils_set_log_callback() allows writing log output via a custom
    callback.


### build

- The minimum required version of Vulkan-Headers and SPIRV-Headers for this
  release is version 1.2.139.

- The SONAME_LIBVULKAN configure variable can be used to specify the shared
  object name of the Vulkan library. Because vkd3d loads the Vulkan library
  dynamically, specifying this removes the need for a Vulkan import library at
  build time.

- The ‘crosstests’ target no longer builds Win32/PE demos or tests when these
  were not enabled at configure time.


# What's new in vkd3d 1.3 (2 Mar 2022)

### libvkd3d

- Newly implemented Direct3D 12 features:
  - Root signature support for unbounded descriptor tables.
  - Unordered-access view counters in pixel shaders. These were previously
    only supported in compute shaders.
  - Output merger logical operations.
  - Retrieving CPU/GPU timestamp calibration values. This requires support for
    the VK_EXT_calibrated_timestamps extension.
  - The ‘mirror_once’ texture addressing mode. This requires support for the
    VK_KHR_sampler_mirror_clamp_to_edge extension.

- New interfaces:
  - The vkd3d_host_time_domain_info structure extends the
    vkd3d_instance_create_info structure, and can be used to specify how to
    convert between timestamps and tick counts. If left unspecified, a tick
    is assumed to take 100 nanoseconds.

- Various bug fixes.


### libvkd3d-shader

- New features:
  - Initial support for HLSL compilation and preprocessing. This is an ongoing
    effort; although support for many features is already implemented, support
    for many more isn't yet.
  - Support for disassembling Direct3D byte-code shaders to Direct3D assembly.
  - Support for parsing the legacy Direct3D byte-code format used by Direct3D
    shader model 1, 2, and 3 shaders. In the current vkd3d-shader release,
    only Direct3D assembly is supported as a target for these; we intend to
    support SPIR-V as a target in a future release.

- New features for the SPIR-V target:
  - Support for various aspects of Direct3D shader model 5.1 descriptor
    arrays, including unbounded descriptor arrays, UAV counter arrays, dynamic
    indexing of descriptor arrays, and non-uniform indexing of descriptor
    arrays. With the exception of some special cases, this requires support