Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.1

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.1

Beitrag von NoFake3D »

Ohne Probleme:

Verwendeter LED Monitor: Samsung U28D590D UHD
Verwendete Bildschirmauflösung in Windows 8.1 Pro: UHD Auflösung 3.840 x 2.160 Pixel - Bildschirmaktualisierungsrate: 60 Hertz

Bildschirmauflösungsprobleme bei:

Windows 8.1-Store-Apps:

Bei dem Microsoft-Beispiel How to pick and manipulate a 3D object using DirectX in Universal apps und in meiner eigenen Windows 8.1-Store-Engine ((D3D_FEATURE_LEVEL_11_1 mit MSAA 1 und MSAA 4-Kantenglättungen):

Maximale Bildschirm-Position: Breite: 2742 Höhe: 1542
Abgefragt in OnPointerPressed(CoreWindow ^...) - Getestet mit D3D_FEATURE_LEVEL_11_1 und D3D_FEATURE_LEVEL_9_3

Maximaler DXGI-Bildschirm-Modus: Breite: 3840 Höhe: 2160 - Bildschirmaktualisierungsrate: 60 Hertz (progressiv)
Abgefragt mit IDXGIOutput2: GetDisplayModeList1()


Windows 8.1-Destop-Anwendungen:

Maximale Bildschirm-Position: Breite: 2560 Höhe: 1440
Abgefragt in eigener Engine (D3D_FEATURE_LEVEL_11_1 mit MSAA 1 und MSAA 4-Kantenglättungen im Vollbild- und im Fenster-Modus):
mit GetSystemMetrics(SM_CXSCREEN) und GetSystemMetrics(SM_CYSCREEN)

Maximaler DXGI-Bildschirm-Modus: Breite: 3840 Höhe: 2160 - Bildschirmaktualisierungsrate: 60 Hertz (progressiv)
Abgefragt mit IDXGIOutput2: GetDisplayModeList1()


Könnte es an zu wenig Grafikkarten-Speicher meiner Grafikkarte liegen (AMD Radeon HD 7850 - Memory Size: 1024 MB)?

Gruß,
Daniel
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von Schrompf »

Ein Screen dieser Größe braucht 32MB VideoRAM. Selbst wenn davon x Kopien und ähnlich große Buffer für bildschirmfüllende Fenster existieren, bringt das 1GB VideoRAM noch nicht in Bedrängnis.

Ich habe allerdings noch nicht begriffen, was genau Dein Problem ist. Was ist eine Bildschirmposition? Oder ist Dein Problem, dass zwei APIs verschiedene Aussagen zum selben Thema machen?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NoFake3D »

Hi Thomas,
Oder ist Dein Problem, dass zwei APIs verschiedene Aussagen zum selben Thema machen?
Genau.

Also mein Ziel ist, dass ich in meinen DirectX 11.1-Engines (Win 8.1 Store und Win 8.1 Destop) im Vollbild-Modus die UHD-Auflösung mit 3.840 x 2.160 Pixel verwende.

Aktuell habe ich bei Windows 8.1-Destop-Apps: 2560 x 1440 Pixel statt 3.840 x 2.160 Pixel
und bei Windows 8.1-Store-Apps: 2742 x 1542 Pixel statt 3.840 x 2.160 Pixel
(unabhängig davon, ob ich das Micrsosoft Windows Store-Sample oder meine eigene Engine verwende).

Mit Bildschirmposition meine ich die maximale Mauszeiger-Position auf dem Bildschirm (wenn der Mauszeiger ganz nach rechts unten verschoben wird,
und dann die Maus-Position abgefragt wird).

Gruß,
Daniel
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NytroX »

Ich habs noch nicht verstanden.
Vielleicht kann ich ja helfen, hab den gleichen Bildschirm; UHD ftw... :-)

Wer zeigt denn jetzt was an? (Gehts bei dir grundsätzlich nicht, oder was genau war mit dem MS sample?)
Wie misst du die "maximale Bildschirmposition", und warum nimmst du dann nicht die DXGI-Daten?

Andere wichtige Fragen:
Wie hast du die Graka mit dem Monitor verbunden? (Hoffentlich per DisplayPort 1.2; alles andere geht AFAIK nämlich nicht mit der vollen Auflösung)
Kannst du denn die Desktop-Auflösung auf UHD setzen, also die vollen 3.840 x 2.160?
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NoFake3D »

Hi NytroX,

Von der Grafikkarte zum Monitor verwende ich das beim Monitor enthaltende Displayport-Kabel (welche Version weiß ich nicht).
Die Desktop-Auflösung ist auf UHD gesetzt (volle 3840 x 2160 Pixel) bei 60 Hertz.
Wer zeigt denn jetzt was an? (Gehts bei dir grundsätzlich nicht, oder was genau war mit dem MS sample?)
Wie misst du die "maximale Bildschirmposition", und warum nimmst du dann nicht die DXGI-Daten?
Da ich für meine Projekte DirectX 11.1 verwende, möchte ich gerne UHD-Auflösung für diese Projekte.
Da ich ein Windows 8.1-Store-Projekt habe und ein Windows 8.1-Desktop-Projekt sollte bei beiden Projekten UHD-Auflösung funktionieren.
Leider scheint es da Probleme zu geben. Die gleichen Probleme habe ich mit den Microsoft-Windows 8.1-Store-Beispielen. Da funktioniert die UHD-Auflösung ebenfalls nicht.
Auch nicht beim neuesten Microsoft-Sample How to pick and manipulate a 3D object using DirectX in Universal apps:

http://code.msdn.microsoft.com/windowsa ... e-089639ab

Falls Du Visual Studio 2013 verwendest: Könnest Du in diesem Fall das Microsoft-Sample runterladen, es in Visual Studio erstellen lassen, einen Breakpoint in der Methode OnPointerPressed(CoreWindow..)) setzen, Sample starten (ausführen), Mauszeiger ganz nach rechts verschieben und ganz nach unten und dann die linke Maus-Taste drücken (dann wird die Methode OnPointerPressed() ausgeführt)?

Code: Alles auswählen

void DirectXPage::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
{
	m_currentPoint = args->CurrentPoint->Position;
Also in der Zeile m_currentPoint = args->CurrentPoint->Position; einen Breakpoint setzen und mir dann Deine Werte für m_currentPoint mitteilen?

Falls als Ergebnis bei Dir ebenfalls 2742 als Breite und 1542 als Höhe rauskommen sollte, würde das bedeuten, dass die Microsoft-Windows-Store 8.1-Beispiele auch kein UHD darstellen können.

Gruß,
Daniel
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NytroX »

Hi,

ich werde es leider nächste Woche erst probieren können.

Hab gerade einige Zeit damit verbracht, das blöde Sample irgendwie zum laufen zu kriegen.
Da sieht man lustige Fehler wie "Sie benötigen eine Windows Store Entwicklerlizenz", über "Imported Project cannot be found" bis hin zu "Platform Toolset not found".
Soweit kommt man aber erst, nachdem man so lange im Project file rumgebastelt hat, sodass man ohne Exception mit einem Rechtsklick in die "Properties" kommt...
Und beim bauen kommen ganz viele tolle "warning C4838: conversion from 'const uint32_t' to 'int32_t' requires a narrowing conversion"; scheint aber trotzdem zu compilieren.
Umso mehr bin ich überrascht, dass das gebaute Etwas jetzt scheinbar irgendwie auch läuft :-)

Allerdings nur im Relase Mode, das Debuggen geht mal gar nicht (lustige Artefakte auf dem Bildschirm), und er hält auch am Breakpoint nicht an.
Ich versuch es nächste Woche mal weiter; Erfahrungsgemäß hat er irgendwo in den Properties noch schmerzen oder zieht irgendwelche temporären Dateien an statt alles neu zu erstellen.
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NoFake3D »

Hi NytroX,

Trotzdem schon mal Danke für die Mühe.
Da sieht man lustige Fehler wie "Sie benötigen eine Windows Store Entwicklerlizenz",
Microsoft will leider einmal im Monat, dass die Entwicklerlizenz durch erneutes Einloggen bei Microsoft erneuert bzw. verlängert wird.

Beim Kompilieren hatte ich keine Fehlermeldungen und keine Warnmeldungen.
Vermutlich wird bei Dir das Visual Studio 2013 Update 4 CTP 1 für Visual Studio 2013 benötigt (das ist zumindest bei mir installiert), da die Windows 8.1-Store-App eine Universal-App ist:

http://blogs.msdn.com/b/visualstudio/ar ... nload.aspx

Ich gehe davon aus, dass Du Windows 8.1 verwendest. Bei Windows 8.0 und dem Microsoft-Sample könnte es Probleme geben.

Artefakte im Debug-Modus habe ich keine (auch nicht bei anderen Micrsoft-Samples).

Gruß,
Daniel
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NytroX »

Aaalso,

ich habe das jetzt hinbekommen, und bei mir gehts einfach.
Die Werte sehen völlig normal aus und sind jeweils so, wie ich die Desktop-Auflösung eingestellt habe.
Ich habe aber nun VisualStudio14CTP3 installiert, damit ging es irgendwie einfacher zum laufen zu kriegen.

Ich musste aber das Projekt neu machen.

Kannst du mal folgendes probieren: Setz' doch mal deine Desktop-Auflösung auf 1920x1080 (also "normales" HD).
Dann die Punkte nochmal messen.
Zeigt er dann die 1920 bei dir an, oder eher sowas wie 1280?

Setz' auch mal einen Breakpoint beim berechnen der DPIs, interessant wären da z.b. die Methoden:
DirectXPage::OnDpiChanged
DirectXBase::Initialize(CoreWindow^ window, SwapChainPanel^ panel, float dpi)
DirectXBase::UpdateForWindowSizeChange

Es könnte nämlich sein, dass der aus welchen Gründen auch immer bei dir an den DPIs rumpfuscht.
Und dann geben manche Funktionen (z.B. GetSystemMetrics(SM_CXSCREEN)) nämlich auch komische Werte zurück.

Siehe auch:
http://msdn.microsoft.com/en-us/library ... s.85).aspx
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NoFake3D »

Bei mir ist es leider nicht so:

OK: Desktop-Auflösung 1920 x 1080 - 60 Hertz: Initialize: dpi 96 - UpdateForWin: m_dpi: 96 - OnPointerPressed: 1916 x 1074
OK: Desktop-Auflösung 2560 x 1440 - 60 Hertz: Initialize: dpi 96 - UpdateForWin: m_dpi: 96 - OnPointerPressed: 2558 x 1436
Falsch: Desktop-Auflösung 3840 x 2160 - 60 Hertz: Initialize: dpi 134.399994 - UpdateForWin: m_dpi: 134.399994 - OnPointerPressed: 2742 x 1538

OnDpiChanged wird bei mir nicht ausgeführt.

dpiAware>true</dpiAware> ist in der Package.appxmanifest nicht vorhanden. Das Ändern der Package.appxmanifest habe ich noch nicht getestet. Vielleicht kann damit das Problem behoben werden.
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NytroX »

Ja, aber da hast du doch zumindest schon das Problem:

Die Funktionen geben einfach nicht die Pixel zurück, wie du erwarten würdest,, sondern die auflösungs-unabhängigen dots.
Denn 2742 / 96 * 134,5 = 3840 (ungefähr, ich hab jetzt stark gerundet :-)).

Im OP fragtest du ja auch die Position mit

Code: Alles auswählen

m_currentPoint = args->CurrentPoint->Position;
ab, diese Position ist einfach undabhängig von der Auflösung.


Du könntest versuchen, beim Start der App in DirectXBase::Initialize und ::HandleDeviceLost() die DPIs manuell zu setzen, aber das sollte man eigentlich nicht machen:

Code: Alles auswählen

void DirectXBase::Initialize(CoreWindow^ window, SwapChainPanel^ panel, float dpi)
{
	m_window = window;
	m_panel = panel;

	CreateDeviceIndependentResources();
	CreateDeviceResources();
	SetDpi(dpi); //hier
}
void DirectXBase::HandleDeviceLost()
{
	// Reset these member variables to ensure that SetDpi recreates all resources.
	float dpi = m_dpi;
	m_dpi = -1.0f;
	m_windowBounds.Width = 0;
	m_windowBounds.Height = 0;
	m_swapChain = nullptr;

	CreateDeviceResources();
	SetDpi(dpi); //und hier
}
Hier mal ein Link dazu:
http://msdn.microsoft.com/en-us/library ... s.85).aspx
Da steht unten auch wie du die DPIs setzen kannst; ich nehme an bei UHD hattest du die Schrift im Windows (Systemsteuerung) größer gestellt ;).

Dass Windows bei hohen Auflösungen die DPIs plötzlich umstellt (so wie bei dir), kann man auch abstellen:
http://www.howtogeek.com/175664/how-to- ... rry-fonts/
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Problem mit Ultra HD-Bildschirmauflösung und DirectX 11.

Beitrag von NoFake3D »

Hi NitroX,

Ich hatte leider nur wenig freie Zeit (und die habe ich teilweise mit dem kostenlosen Rollenspiel Dragon Age: Origins „Auf's Haus“ genutzt).
Deshalb kann ich erst jetzt antworten.

Danke für die ganzen Erklärungen und Links!

Bei meiner Windows 8.1-Destop-Engine funktioniert nun die UHD Auflösung unabhängig davon, was in der Systemsteuerung bei - Darstellung und Anpassung - Anzeige: "Die Größe aller Elemente ändern" ausgewählt ist (bei mir war die Größe auf 150% gesetzt (wie von Microsoft empfohlen):

Dies funktioniert mit Hilfe der veralteten Methode SetProcessDPIAware():

Code: Alles auswählen

		if (SetProcessDPIAware() == FALSE)
		{
			return false;
		}
Dadurch ist meine Windows 8.1-Destop-Engine nun "DPI Aware" und der Desktop Window Manager (DWM) führt dann keine automatische UI-Skalierung in dem Anwendungsfenster aus (unabhängig von meinen DPI-Einstellungen).

Aber leider funktioniert dies nicht für Windows 8.1-Store-Apps (die neuere Methode SetProcessDpiAwareness(...) funktioniert dort ebenfalls nicht).

Das manuelle Setzen der DPI's mit SetDpi(...) brachte bei meiner Windows 8.1-Store-Engine nur eine Änderung der Größen bei Direct2D1 und DirectWrite und bei dem Microsoft-Sample eine Exception.

Microsoft empfiehlt eine zusätzliche *.manifest-Datei für das DPI Aware-Problem. Das habe ich ausprobiert, indem ich in den Projekt-Eigenschaften die Linker- und Manifesttool-Optionen geändert habe:

Linker-Optionen: Manifest generieren: Ja (/MANIFEST)
Manifesttool - Eingabe und Ausgabe: DPI: Keine
Manifesttool - Eingabe und Ausgabe: Zusätzliche Manifestdateien: Hinzugefügt: ProgramCompatibilityAssistant_DPIAwareness_UserAccountControlLevel.manifest

Das habe ich bei Windows 8.1-Store-Engine und bei meiner Windows 8.1-Desktop-Engine gemacht.

Beim Builden der Projekte wird temporär im Debug-Unterverzeichnis jeweils eine Engine.manifest-Standard-XML-Datei erzeugt und der Inhalt meiner zusätzlichen ProgramCompatibilityAssistant_DPIAwareness_UserAccountControlLevel.manifest-Datei eingefügt:

ProgramCompatibilityAssistant_DPIAwareness_UserAccountControlLevel.manifest:

Code: Alles auswählen

<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
  
	<assemblyIdentity version="1.0.0.0" name="Engine.app"/>

	
	<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">

		<application>

			<!-- Windows 8.1 -->
			<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 

			<!-- Windows 10 -->
			<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>		
			
		</application>
		
	</compatibility>

	
	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
	
		<security>
		
			<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
			
				<requestedExecutionLevel level="asInvoker" uiAccess="false" />
				
			</requestedPrivileges>
	
		</security>
	
	</trustInfo>

	
	<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
	
		<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2011/WindowsSettings">
		
			<dpiAware>True/PM</dpiAware>
			
		</asmv3:windowsSettings>
	
	</asmv3:application>

	
</asmv1:assembly>
Die Engine.manifest-Datei scheint korrekt zu sein, da ich beim Erstellen des Projektes einen Fehler bei der Manifest-Datei angezeigt bekam, diesen korrigierte und danach keinen Fehler mehr angezeigt bekam.

Trotzdem funktioniert das mit der UHD Auflösung und dem Manifest nicht. Ich vermute die Manifest-Datei wird nicht verwendet.

Da ich zusätzlich in der Manifest-Datei auch PCA (Program Compatibility Assistant) hinzugefügt habe (damit die Engine nur zu Windows 8.1 und neuer kompatibel ist), wollte ich dies testen mit IsWindows8Point1OrGreater().

Die Test-Abfrage ergab jedoch immer das gleiche Ergebnis unabhängig davon, ob ich in der Manifest-Datei den PCA-Eintrag drin hatte oder nicht: Die Engine ist kompatibel zu Windows 8.1 und neuer.

Gruß,
Daniel
Antworten