Das Wine-Projekt hat die Version vkd3d 1.13 veröffentlicht, die Direct3D 12 durch die Übersetzung von Aufrufen in die Grafik-API Vulkan implementiert. Das Paket enthält die Bibliotheken libvkd3d mit der Implementierung von Direct3D 12, libvkd3d-shader mit einem Übersetzer für Shader der Modelle 4 und 5 sowie libvkd3d-utils mit Funktionen zur Vereinfachung der Portierung von Direct3D 12-Anwendungen. Zudem gibt es eine Sammlung von Demobeispielen, darunter der Port von glxgears auf Direct3D 12. Der Code des Projekts ist unter der LGPLv2.1 Lizenz lizenziert.
Die libvkd3d-Bibliothek unterstützt die meisten Funktionen von Direct3D 12, einschließlich Grafik- und Rechenressourcen, Warteschlangen und Befehlssätze, Deskriptoren und Heap-Deskriptoren, Root-Signaturen, ungeordneten Zugriff, Sampler, Befehlssignaturen, Root-Konstanten, indirekte Renderaufrufe, sowie die Clear*() und Copy*()-Methoden. In libvkd3d-shader wird die Übersetzung des Bytecodes von Shader-Modellen in das Intermediate Representation SPIR-V implementiert. Es werden Vertex-, Pixel-, Tessellation-, Compute- und einfache Geometrieshader unterstützt, einschließlich der Serialisierung und Deserialisierung von Root-Signaturen. Von den Shader-Instruktionen sind arithmetische, atomare und bitweise Operationen, Vergleichsoperatoren und Datenflusssteuerungsanweisungen, sowie Instruktionen wie sample, gather und load implementiert, sowie operaciones für ungeordneten Zugriff (UAV, Unordered Access View).
In der neuen Version:
- Der HLSL-Compiler hat die Unterstützung für Loop Unrolling hinzugefügt, eine Optimierung, bei der zyklische Operationen durch mehrere aufeinanderfolgende Koden ersetzt werden, um die Effizienz des CPU-Caches zu nutzen und Verzweigungen zu reduzieren.
- Die Unterstützung des Effekt-Compilers für einige Statusobjekte des vierten Shader-Modells wurde hinzugefügt.
- Die Unterstützung der Typen des vierten Shader-Modells wie BlendState, ComputeShader, DomainShader, GeometryShader, HullShader, DepthStencilState und RasterizerState wurde sichergestellt, einschließlich der Funktionen OMSetRenderTargets(), SetBlendState(), SetComputeShader(), SetDomainShader(), SetGeometryShader(), SetHullShader(), SetPixelShader(), SetVertexShader(), SetDepthStencilState() und SetRasterizerState().
- Im Shader-Compiler wurde die Unterstützung für das Parsen und Speichern von Initialisierungswerten in verschiedenen Formaten für globale Variablen, Funktionsparameter und Anmerkungen implementiert.
- Unterstützung des Shader-Modells 5.1 für die Registerraumimplementierung wurde hinzugefügt.
- Es wurden eingebaute Funktionen wie tex1D(), tex2D(), tex3D(), texCUBE(), asint(), f16tof32(), faceforward(), GetRenderTargetSampleCount(), rcp(), tex2Dbias(), tex1Dgrad(), tex2Dgrad(), tex3Dgrad() und texCUBEgrad() implementiert.
- In libvkd3d wurde das Interface ID3D12CommandList6 hinzugefügt und die Möglichkeit zur Erstellung von Texturen implementiert, deren Kompression auf der Ebene einzelner Blöcke erfolgt (z. B. werden Blöcke mit einer Größe von 4×4 Pixeln separat komprimiert).
- Die Unterstützung für die Struktur vkd3d_shader_parameter_info sowie die Parameter VKD3D_SHADER_PARAMETER_DATA_TYPE_FLOAT32, VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_FUNC, VKD3D_SHADER_PARAMETER_NAME_ALPHA_TEST_REF, VKD3D_SHADER_PARAMETER_NAME_FLAT_INTERPOLATION und VKD3D_SHADER_PARAMETER_TYPE_BUFFER wurde hinzugefügt.
Quelle: opennet.ru
