Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 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.
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# 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.
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# 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