<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=Vulkan</id>
	<title>Vulkan - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=Vulkan"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=Vulkan&amp;action=history"/>
	<updated>2026-10-30T19:31:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://open-iov.org/index.php?title=Vulkan&amp;diff=24006&amp;oldid=prev</id>
		<title>WikiBot: New page (2026-10-30 wiki refresh): Vulkan</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=Vulkan&amp;diff=24006&amp;oldid=prev"/>
		<updated>2026-10-30T17:05:01Z</updated>

		<summary type="html">&lt;p&gt;New page (2026-10-30 wiki refresh): Vulkan&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{About message}}&lt;br /&gt;
&lt;br /&gt;
= Vulkan =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''Scope.''' How a stock guest Vulkan application runs on the emulated vGPU: the guest-side stack, the submit/completion path, and the honest state of the work — including the one thing every Vulkan run on the emulated vGPU currently has in common: '''the pipeline completes, and the frames are black'''. The shared host machinery is on [[Graphics Execution|&amp;lt;code&amp;gt;Graphics-Execution.md&amp;lt;/code&amp;gt;]]; the CUDA compute chain (further along) is on [[The Execution Frontier|&amp;lt;code&amp;gt;Execution-Frontier.md&amp;lt;/code&amp;gt;]]. Canonical sources: [https://git.vgpu.io/open-iov.git/tree/docs/04-implementation/04-real-render-walls.md &amp;lt;code&amp;gt;../docs/04-implementation/04-real-render-walls.md&amp;lt;/code&amp;gt;] and [https://git.vgpu.io/open-iov.git/tree/docs/04-implementation/05-graphics-execution-plan.md &amp;lt;code&amp;gt;../docs/04-implementation/05-graphics-execution-plan.md&amp;lt;/code&amp;gt;]; the docs tree wins on disagreement.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Status: 2026-10-30, tree &amp;lt;code&amp;gt;master @ b4930168&amp;lt;/code&amp;gt;. Tags: &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt; observed with the stock guest driver; &amp;lt;code&amp;gt;[wip]&amp;lt;/code&amp;gt; partial; &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt; current blocker; &amp;lt;code&amp;gt;[target]&amp;lt;/code&amp;gt; defined success state.&lt;br /&gt;
&lt;br /&gt;
== 1. The guest Vulkan stack ==&lt;br /&gt;
&lt;br /&gt;
A Vulkan application loads the '''loader''' (&amp;lt;code&amp;gt;libvulkan.so&amp;lt;/code&amp;gt;), which dispatches to an '''installable client driver (ICD)''' — for NVIDIA GPUs, the NVIDIA Vulkan driver. On Linux, Vulkan compute does not require an X server; the display path does (through &amp;lt;code&amp;gt;nvidia-modeset&amp;lt;/code&amp;gt;/DRM for presentation). The kernel-side requirements are the same as CUDA's: &amp;lt;code&amp;gt;nvidia.ko&amp;lt;/code&amp;gt;, the GSP client, channels, memory objects and fences.&lt;br /&gt;
&lt;br /&gt;
At device creation the driver also walks the '''display/modeset device''' allocation path (the &amp;lt;code&amp;gt;ALLOC_DEVICE&amp;lt;/code&amp;gt; class family) — on a vGPU-style device the driver expects the host to provide those display classes, which the emulation must answer for &amp;lt;code&amp;gt;vkCreateDevice&amp;lt;/code&amp;gt; to succeed. Past that gate, the driver behaves much like the compute stack: memory types through its VidHeap classes, queues as channels, and work as method streams.&lt;br /&gt;
&lt;br /&gt;
== 2. The submit and completion path (observed) ==&lt;br /&gt;
&lt;br /&gt;
[[File:Open-IOV-vulkan-submit-path.png|frameless|center|upright=2.2|One Vulkan queue submit end to end on the emulated vGPU.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;app: vkQueueSubmit(fence)&lt;br /&gt;
  -&amp;amp;gt; NVIDIA driver: push buffer + GPFIFO entry + doorbell&lt;br /&gt;
  -&amp;amp;gt; vgsp.ko: capture section, translate to a vendor launch,&lt;br /&gt;
     relocate operands into shadow pages, submit on a real channel&lt;br /&gt;
  -&amp;amp;gt; physical GPU: front-end fetch, engine executes, authors release&lt;br /&gt;
  -&amp;amp;gt; vgsp.ko: completion relay (MSI-X + poller) back to the guest&lt;br /&gt;
  -&amp;amp;gt; app: fence releases; frame readback proceeds&lt;br /&gt;
ASCII fallback above; the sequence shows one queue submit end to end.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two mechanics make this work today: the emulation decodes the driver's compute-dispatch shape — a '''direct method stream''' (object bind, window runs, code runs, a subchannel data-port stream) with '''no inline launch descriptor''' — and ''translates'' it into a launch the real engine accepts, and it derives the submit's release groups from the driver's own push words so the fence value is released when the engine completes (the &amp;quot;fence fold&amp;quot;: the pre-built GPFIFO continuation beyond the put pointer is swept and the submit's release groups are applied forward-only).&lt;br /&gt;
&lt;br /&gt;
== 3. Status on the emulated vGPU ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Item&lt;br /&gt;
! State&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vkCreateDevice&amp;lt;/code&amp;gt; on the emulated vGPU (display/modeset allocation path answered)&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Full pipeline: instance, device, allocation, image/view/buffer/shader/descriptor, pipeline, command buffer, fence&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Queue submit, engine-side execution of the translated launch, fence release, frame readback&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| The client saves frames end to end (&amp;lt;code&amp;gt;VKFRAME&amp;lt;/code&amp;gt; evidence)&lt;br /&gt;
| &amp;lt;code&amp;gt;[live]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Non-black frames&lt;br /&gt;
| &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| The driver's program (SASS) upload materialised by the emulation&lt;br /&gt;
| &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| The engine's page tables mapping the program VA&lt;br /&gt;
| &amp;lt;code&amp;gt;[wall]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. Where the wall is, precisely ==&lt;br /&gt;
&lt;br /&gt;
The client ''believes'' it uploaded its shader and dispatches with a valid program address, but the bytes never appear in any source the emulation can see: the driver delivers programmed SASS and descriptors through an '''MME program + inline-to-memory stream''' on its copy/utility channel, and the inline-data writes are not yet materialised for the graphics clients. Two coupled facts define the remaining work:&lt;br /&gt;
&lt;br /&gt;
# '''Delivery''' — decode and execute the driver's inline upload so the program page becomes non-zero (the same machinery already works for CUDA's uploads; the graphics clients' shapes are the extension).&lt;br /&gt;
# '''Mapping''' — the engine's page tables must map the program VA. With the data-set gate bypassed, the engine fetches the launch and raises a real MMU fault (&amp;lt;code&amp;gt;FAULT_PDE&amp;lt;/code&amp;gt;) at the program VA — proof the channel, context and fetch path are alive, and that mapping plus content is the missing pair.&lt;br /&gt;
&lt;br /&gt;
When both land, the emulated vGPU should carry its first non-black Vulkan frame — the milestone the whole graphics effort is converging on ([[Graphics Execution|&amp;lt;code&amp;gt;Graphics-Execution.md&amp;lt;/code&amp;gt;]] §6).&lt;br /&gt;
&lt;br /&gt;
== 5. What this page is not claiming ==&lt;br /&gt;
&lt;br /&gt;
* No rendered pixels yet — every frame saved so far is black.&lt;br /&gt;
* No performance numbers.&lt;br /&gt;
* &amp;lt;code&amp;gt;vkCreateDevice&amp;lt;/code&amp;gt; success does not imply rendering; it means the device model answers the driver's device-view correctly.&lt;br /&gt;
&lt;br /&gt;
== 6. Related pages ==&lt;br /&gt;
&lt;br /&gt;
* [[Graphics Execution|&amp;lt;code&amp;gt;Graphics-Execution.md&amp;lt;/code&amp;gt;]] — the shared lanes, the &amp;lt;code&amp;gt;0xC597&amp;lt;/code&amp;gt; graphics stream and the ranked walls.&lt;br /&gt;
* [[OpenGL|&amp;lt;code&amp;gt;OpenGL.md&amp;lt;/code&amp;gt;]] — the GL path through the X server.&lt;br /&gt;
* [[DirectX|&amp;lt;code&amp;gt;DirectX.md&amp;lt;/code&amp;gt;]] — the Windows/DirectX target.&lt;br /&gt;
* [[CUDA Userspace Driver|&amp;lt;code&amp;gt;CUDA-Userspace-Driver.md&amp;lt;/code&amp;gt;]] — the userspace driver model the Vulkan ICD mirrors in structure.&lt;br /&gt;
* [[Introduction to GMMU|&amp;lt;code&amp;gt;Introduction-to-GMMU.md&amp;lt;/code&amp;gt;]] — translation and the engines.&lt;br /&gt;
* [https://git.vgpu.io/open-iov.git/tree/docs/04-implementation/04-real-render-walls.md &amp;lt;code&amp;gt;../docs/04-implementation/04-real-render-walls.md&amp;lt;/code&amp;gt;] — the measured wall ledger, with every experiment and its verdict.&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>