platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

platform/windows: implement IDXGIOutput5 / Per Monitor v2 - #522

Closed
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5
Closed

platform/windows: implement IDXGIOutput5 / Per Monitor v2#522
psyke83 wants to merge 4 commits into
LizardByte:nightlyfrom
psyke83:output5

Conversation

@psyke83

@psyke83psyke83 commented Dec 1, 2022

Copy link
Copy Markdown
Contributor

Description

Implements IDXGIOutput5 with Per Monitor V2 DPI awareness support and additional fixes to fix mouse cursor rendering for hw encoding, and handle other screen formats that are used by exclusive fullscreen Vulkan and DX titles with "fullscreen optimizations" disabled.

Issues Fixed or Closed

Fixes: #553
May resolve error 0x887A0004 observed in DuplicateOutput on certain configurations and/or improve general capture performance.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@psyke83
psyke83 marked this pull request as draft December 2, 2022 04:49
DXGI_FORMAT_R8G8B8A8_UNORM,
DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R16G16B16A16_FLOAT,
DXGI_FORMAT_R10G10B10A2_UNORM,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we can fix #376 here by specifying the appropriate formats (DXGI_FORMAT_B8G8R8A8_UNORM for SDR and DXGI_FORMAT_R10G10B10A2_UNORM for HDR, when that is implemented).

As I understand the docs, DWM should convert the format to match what we've asked for (for example, doing HDR -> SDR conversion if requested).

@psyke83psyke83Dec 22, 2022

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately I don't have any HDR capable monitors to test HDR or HDR -> SDR conversion; I even tried a virtual monitor driver for Windows, but it refuses to enable HDR in the virtual monitor.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

Since my hands are tied in diagnosing/fixing HDR support due to lack of hardware, I would be more than happy to let you take over this PR (doesn't matter if you recommend this to be merged and then you continue, you cherry-pick some changes, or start over entirely, I don't mind).

In its present form, this PR will at minimum fix: #553

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specifying the expanded list of formats doesn't seem to automatically convert formats, but it has allowed me to fix some other issues (added as separate commits).

It actually does, but we just made an mistake in our interpretation of the MSDN docs on it. DXGI_OUTDUPL_DESC will always give us the actual desktop mode, not the format that our frames are being converted to. See #609

For IDXGIOutput5, I think we have to actually acquire a frame and call GetDesc() on it to determine the actual format that was chosen from our supported list (or maybe just provide a list with only one SDR or HDR format to ensure we'll get that one).

… format
Resolves Sunshine disconnect due to incompatible format type
(DXGI_FORMAT_R8G8B8A8_UNORM) used by Vulkan applications in exclusive fullscreen,
or standard DX11/DX12 applications in exclusive fullscreen with "fullscreen
optimizations" disabled.
Also resolves missing cursor issue in certain UI elements such
as Notepad's main window.
…ive fullscreen
When screen format is set to DXGI_FORMAT_R8G8B8A8_UNORM, red and blue need to
be swapped during software colour conversion.
This format is selected in Vulkan or DX11/DX12 exclusive fullscreen modes
(the latter two occurring only if "disable fullscreen optimizations" flag is
also enabled).
@psyke83
psyke83 marked this pull request as ready for review December 22, 2022 03:13
@@ -291,27 +291,51 @@ int display_base_t::init(int framerate, const std::string &display_name) {
}

//FIXME: Duplicate output on RX580 in combination with DOOM (2016) --> BSOD

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed this comment from loki. My host GPU is a newer AMD GPU (RX 6600), but perhaps this is related to my problem; DOOM 2016 runs in Vulkan, so it could be using DXGI_FORMAT_R8G8B8A8_UNORM just like DX11 titles in true fullscreen exclusive mode.

I've been testing a game (Dying Light) with "disable fullscreen optimizations" checked. Before this PR, it wasn't possible to run in true exclusive fullscreen; now it works. However, if you toggle between resolutions in the settings menu, eventually it will either cause a driver timeout or complete BSOD. I was able to reproduce the crash on both libx264 and amdvce, and it looks like #605 doesn't solve my issue (but I realize that it wasn't the focus).


this->device_ctx_p = device_ctx_p;

DXGI_FORMAT src_format = format;

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cgutman

Related to #609: I actually made an additional mistake here: I assumed that format was initialized with the correct value passed from display_base_t::init, but in fact it is just an uninitialized variable that resolves to DXGI_FORMAT_UNKNOWN, which coincidentally seems to handle both DXGI_FORMAT_R8G8B8A8_UNORM and DXGI_FORMAT_B8G8R8A8_UNORM. This is obviously not ideal and is supposed to select the proper format based on a similar img->is_bgr check as done here:

img->is_bgr = (format == DXGI_FORMAT_B8G8R8A8_UNORM ? true : false);

However, looking at #609, instead of fixing this, it looks like I should just remove both the vram and ram commits entirely in place of #609? I will not be able to edit the PR and verify in depth for a few hours, but I will be happy to back out those commits ASAP if you can verify my suspicion.

@cgutmancgutmanDec 22, 2022

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think DXGI_FORMAT_UNKNOWN tells D3D11 to use the actual format of the texture (which is what we want).

The base IDXGIOutput5 part needs more work to handle the proper surface format selection. I think we want to avoid the HDR formats if we're not in HDR mode (and the SDR formats in HDR mode). I'll take a stab at it after the holidays.

@psyke83
psyke83 marked this pull request as draft December 23, 2022 00:47
@psyke83psyke83 closed this Dec 26, 2022
@psyke83
psyke83 deleted the output5 branch February 15, 2026 18:08
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

No open projects
Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@psyke83@cgutman@ReenigneArcher