AI prompts
base on āØ Perfect virtual display for game streaming <!-- tracking -->
<img src="https://i.imgur.com/dDUa6GH.png" width="0" height="0" />
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/74e7db71-6166-49ae-b6c5-7543b15c60eb">
<img alt="Parsec Virtual Display Driver" src="https://github.com/user-attachments/assets/57202381-021c-428a-ae38-0fc4b2e0ee0c">
</picture>
</p>
<p align="center">
āØ Perfect <strong>virtual display</strong> for game streaming
</p>
<p align="center">
<a href="#">
<img src="https://img.shields.io/github/stars/nomi-san/parsec-vdd?style=for-the-badge&logo=github" />
</a>
<a href="https://github.com/nomi-san/parsec-vdd/releases">
<img src="https://img.shields.io/github/downloads/nomi-san/parsec-vdd/total?style=for-the-badge" />
</a>
</p>
<br>
## ā¹ About
This project provides a **standalone solution for creating virtual displays** on
a Windows host using the **Parsec Virtual Display Driver** (VDD), independent of
the **Parsec app**.
The Parsec VDD enables virtual displays on Windows 10+ systems, a feature
available to Parsec Teams and Warp customers. With VDD, users can add up to
three virtual displays to a host machine they connect to, ideal for setups where
physical monitors may be unavailable or when additional displays are beneficial.
Built by Parsec, the VDD leverages the IddCx API (Indirect Display Driver) to
generate virtual displays with support for high resolutions and refresh rates,
including up to 4K and 240 Hz. This capability makes it a versatile tool for
gaming, streaming, or remote work, allowing users to simulate multiple screens
for an enhanced, flexible visual experience.
## šŗ ParsecVDisplay App
ParsecVDisplay is a comprehensive virtual display manager for Parsec VDD, built
with C# and WPF. The app provides an intuitive interface to manage virtual
displays, showing the number of active displays and allowing users to add or
remove specific virtual displays. It also supports features like changing
display resolution, capturing screenshots, and more, making it a versatile tool
for flexible display management.
š Check out [Releases](https://github.com/nomi-san/parsec-vdd/releases) to
download it.
<p align="center">
<img src="https://github.com/nomi-san/parsec-vdd/assets/38210249/71b25bc6-eee1-4d80-94e0-e39eab7f8fb9" />
</p>
## š Using Core API
### Design notes
Parsec VDD is designed to work with Parsec client-connection sessions. When the
user connects to the host, the app will start controlling the driver, it sends
IO control codes and gets results. When adding a virtual display, you will get
its index to be used for unplugging, the maximum number of displays could be
added up to 16 per adapter. You have to ping the driver periodically to keep
added displays alive, otherwise all of them will be unplugged after a second.
There's no direct way to manipulate added displays, you should call Win32
Display API to change their display mode (see the ParsecVDisplay source).
```mermaid
flowchart LR
A(app)
B(vdd)
A <--->|ioctl| B
A ..->|ping| B
B --- X(display1)
B --- Y(display2)
B --- Z(display3)
winapi -->|manipulate| X
```
### Using the code
- The core API is designed as single C/C++ header that can be added to any
project, š [core/parsec-vdd.h](./core/parsec-vdd.h)
- There is also a simple demo program, š [core/vdd-demo.cc](./core/vdd-demo.cc)
### Picking a driver
You have to install the driver to make them work.
| Version | Minimum OS | IddCx | Notes |
| :---------------- | :-------------- | :---: | :-------------------------------------------------------- |
| [parsec-vdd-0.38] | Windows 10 1607 | 1.0 | Obsolete, may crash randomly. |
| [parsec-vdd-0.41] | Windows 10 19H2 | 1.4 | Stable. |
| [parsec-vdd-0.45] | Windows 10 21H2 | 1.5 | Better streaming color, but may not work on some Windows. |
[parsec-vdd-0.38]: https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe
[parsec-vdd-0.41]: https://builds.parsec.app/vdd/parsec-vdd-0.41.0.0.exe
[parsec-vdd-0.45]: https://builds.parsec.app/vdd/parsec-vdd-0.45.0.0.exe
> All of them also work on Windows Server 2019 or higher.
You can unzip (using 7z) the driver setup above to obtain the driver files and
`nefconw` CLI.
```
vdd-0.45/
|__ nefconw.exe
|__ driver/
|__ mm.cat
|__ mm.dll
|__ mm.inf
```
Command line method to install the driver using `nefconw` (admin required):
```
start /wait .\nefconw.exe --remove-device-node --hardware-id Root\Parsec\VDA --class-guid "4D36E968-E325-11CE-BFC1-08002BE10318"
start /wait .\nefconw.exe --create-device-node --class-name Display --class-guid "4D36E968-E325-11CE-BFC1-08002BE10318" --hardware-id Root\Parsec\VDA
start /wait .\nefconw.exe --install-driver --inf-path ".\driver\mm.inf"
```
In addition, you can run the driver setup in silent mode to install it quickly.
```
.\parsec-vdd-0.45.0.0.exe /S
```
## š„ Known Limitations
> This list shows the known limitations of Parsec VDD.
### 1. HDR support
Parsec VDD does not support HDR on its displays (see the EDID below).
Theoretically, you can unlock support by editing the EDID, then adding HDR
metadata and setting 10-bit+ color depth. Unfortunately, you cannot flash its
firmware like a physical device, or modify the registry value.
All IDDs have their own fixed EDID block inside the driver binary to initialize
the monitor specs. So the solution is to modify this block in the driver DLL
(mm.dll), then reinstall it with `nefconw` CLI (see above).
### 2. Custom resolutions
Before connecting, the virtual display looks in the `HKLM\SOFTWARE\Parsec\vdd`
registry for additional preset resolutions. Currently this supports a maximum of
5 values.
```yaml
HKLM\SOFTWARE\Parsec\vdd:
- key: [0 -> 5]
value: { width, height, hz }
```
To unlock this limit, you need to patch the driver DLL the same way as above,
but **5 is enough** for personal use.
## š Known Bugs
> This is a list of known issues when working with standalone Parsec VDD.
### 1. Incompatible with Parsec Privacy Mode
![Alt text](https://i.imgur.com/C74IRgC.png)
If you have enabled "Privacy Mode" in Parsec Host settings, please disable it
and clear the connected display configurations in the following Registry path.
```
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity
```
This option causes your main display to turn off when virtual displays are
added, making it difficult to turn the display on and disrupting the remote
desktop session.
### 2. // todo
## š¤ Comparison with other IDDs
The table below shows a comparison with other popular Indirect Display Driver
projects.
| Project | Iddcx version | Signed | Gaming | HDR | H-Cursor | Tweakable | Controller |
| :----------------------------- | :-----------: | :----: | :----: | :-: | :------------------------------------------------------------------: | :-------: | :--------: |
| [usbmmidd_v2] | | ā
| ā | ā | ā | | |
| [IddSampleDriver] | 1.2 | ā | ā | ā | ā | | |
| [RustDeskIddDriver] | 1.2 | ā | ā | ā | ā | | |
| [Virtual-Display-Driver (HDR)] | 1.10 | ā | | ā
| ā | | |
| [virtual-display-rs] | 1.5 | ā | | ā | [#81](https://github.com/MolotovCherry/virtual-display-rs/issues/81) | ā
| ā
|
| parsec-vdd | 1.5 | ā
| ā
| ā | ā
| š | ā
|
ā
- full support, š - limited support
[usbmmidd_v2]: https://www.amyuni.com/forum/viewtopic.php?t=3030
[IddSampleDriver]: https://github.com/roshkins/IddSampleDriver
[RustDeskIddDriver]: https://github.com/fufesou/RustDeskIddDriver
[virtual-display-rs]: https://github.com/MolotovCherry/virtual-display-rs
[Virtual-Display-Driver (HDR)]: https://github.com/itsmikethetech/Virtual-Display-Driver
**Signed** means that the driver files have a valid digital signature.
**H-Cursor** means hardware cursor support, without it, you will get a double
cursor on some remote desktop apps. **Tweakable** is the ability to customize
display modes. Visit
[MSDN IddCx versions](https://learn.microsoft.com/en-us/windows-hardware/drivers/display/iddcx-versions)
to check the minimum supported Windows version.
## š Parsec VDD Specs
Common preset display modes:
| Resolution | Common Name | Aspect Ratio | Refresh Rates (Hz) |
| ----------- | ----------- | ------------ | ------------------ |
| 3840 x 2160 | 4K UHD | 16:9 | 24/30/60/144/240 |
| 3440 x 1440 | UltraWide | 21.5:9 | 24/30/60/144/240 |
| 2560 x 1440 | 2K | 16:9 | 24/30/60/144/240 |
| 2560 x 1080 | UltraWide | 21:9 | 24/30/60/144/240 |
| 1920 x 1080 | FHD | 16:9 | 24/30/60/144/240 |
| 1600 x 900 | HD+ | 16:9 | 60/144/240 |
| 1280 x 720 | HD | 16:9 | 60/144/240 |
Check out [docs/PARSEC_VDD_SPECS](./docs/PARSEC_VDD_SPECS.md) to see full of
preset display modes the driver specs.
## š¤ Sponsors
<table>
<tr>
<td><img src="https://github.com/user-attachments/assets/58e9a6f4-6630-437d-a758-b284c0ed41e7" /></td>
<td>Free code signing on Windows provided by <a href="https://signpath.io">SignPath.io</a>, certificate by <a href="https://signpath.org">SignPath Foundation</a></td>
</tr>
</table>
## š» Credits
- Thanks to Parsec for the driver
- The app's background was from old parsecgaming.com
", Assign "at most 3 tags" to the expected json: {"id":"10650","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"