Definiere "Desktop". Meinst du das Root-Window? Das ist ein Fenster wie jedes andere und erstreckt sich vollständig über einen Bildschirm (im Sinne meiner Abstraktion). Du hast also für jeden Bildschirm ein eigenes Root-Window.
Definiere "Root-Window"
Das war der X11-Sinn. Es handelt sich um das einzige Fenster (auf einem X11-Screen), welches kein "parent window" hat, was die Position (0|0) und die maximale Größe des Screens hat.
Wenn man allerdings mit Xinerama und XRandR betrachtet, ist das Root-Window das Fenster, welches über alle Bildschirme geht, also bei 3 1024x768-Bildschirmen nebeneinander 3072x768 groß ist und oben links auf dem linken Bildschirm beginnt.
Mit Desktop meine ich einen Desktop wie du ihn unter Windows kennst. Unter KDE und Konsorten ist es üblich mehrere virtuelle Desktops zu haben. Ich will darauf hinaus, das der Treiber ja einen großen Desktop dem System gegenüber anbieten kann, dieser wird aber z.B. auf 3 Monitore verteilt dargestellt, ohne das sich außer dem Treiber jemand darüber Gedanken machen muss.
Das ist das Xinerama-Prinzip. Dein Desktop ist somit das Root-Window und alle Fenster sind Kinder dieses Fensters (und können auch nur innerhalb dessen Abmessungen liegen).
Eine Graka kann nicht in den gesamten RAM schreiben, weil sie keinen Zugriff hat (insbesondere nicht auf den Grafikspeicher einer anderen Grafikkarte.
Deswegen meine Idee das die Daten erst an den GUI-Server geschickt werden und der ne Art Vermittler ist und die Daten an den richtigen Treiber weitersendet.
Ja, das wäre aber wieder indirektes Rendering. Wenn dein Treiber Multimonitoring kann, dann ist 3D-Fähigkeit nicht weit (es gibt kaum Grafikkarten mit mehreren Heads, aber ohne 3D-Hardware) und um das sinnvoll zu ermöglichen, braucht man direktes Rendering.
Du ordnest jedem Fenster einen Puffer zu, in den der Fensterinhalt gerendert wird. Zusätzlich besitzt jeder Puffer eine Grafikkarte, der er zugeordnet ist. Damit hast du indirekt alle Fenster einer Grafikkarte (und damit allen Bildschirmen, die an dieser Grafikkarte hängen!) zugeordnet. Das Umziehen im 2D ist kein Problem.
Ist ja alles richtig, aber wie du weiter oben schon sagtest kann eine Graka nicht auf den gesamten RAM zugreifen. Meine Frage ist dann halt, was macht man wenn der RAM auf den die Graka zugreifen kann voll ist?
Für 2D-Anwendungen wirfst du einfach alles nicht dargestellte weg. Ein FullHD-Schirm belegt 8 MB, alles weitere brauchst du nicht cachen. Die Anwendung muss neuzeichnen, wenn du ein Fenster in den Vordergrund bringst.
Bei 3D-Anwendungen ist das komplizierter, allerdings haben Spiele immer eine Mindestanforderung an den Grafikspeicher, weil man bei einem bestimmten Verbrauch halt keine Texturen o.ä. hochladen kann und das ist für Spiele schädlich. "Grafikspeicher voll" ist eine Bedingung, die ich nicht als Problem sehe. Zumal 2D-Anwendungen fast keinen brauchen.
Eine Lösung wäre das der Puffer vom Fenster in den Graka RAM kopiert wird, dort wird dann "gezeichnet" und dann kopierst du den Puffer wieder zurück in den normalen RAM. Der GUI-Server erstellt dann den fertigen Frame und kopiert das wieder in den Graka RAM.
Diese Variante ist aber verdammt langsam. Gibt es denn noch eine andere Möglichkeit?
Also Double Buffering (der gesamte dargestellte Bildschirminhalt) ist eine Möglichkeit, den VESA-Treiber enorm zu beschleunigen. Wenn du nämlich die MTRRs entsprechend gesetzt hast, ist ein Bulk-Upload der 8 MB Framebuffer wesentlich schneller, als viele Zugriffe (z.B. jedes Pixel) auf den Grafikspeicher einzeln durchzuführen.
Du hast definitiv genug Platz im Grafikspeicher, um den aktuellen Bildschirminhalt anzuzeigen (der wird vom CRTC ausgelesen, muss also im GrafikRAM liegen). Im Zweifelsfall kannst du immer direkt auf diesem Bereich arbeiten, um die gerenderten Fenster darzustellen. Der Puffer, den du der Anwendung bereitstellst, kann ja direkt im Framebuffer liegen. Allerdings verlierst du damit die Möglichkeit des VSync (führt zu tearing).
Ich wollte meine Interfaces was das betrifft so flexibel wie möglich halten, vielleicht will ich ja irgendwann mal mit solchen Sachen rumspielen und da will ich nicht alles neuschreiben müssen.
X11 war auch nie mit 3D im Gedanken entwickelt worden. Wenn du das wirklich implementieren möchtest, dann schau dir mal Wayland an, zumindest die Konzepte.
Für ein Hobby-OS halte ich gebrauchbare 3D-Beschleunigung jedenfalls für unrealistisch. Dazu ist die Hardware definitiv zu kompliziert (und für NVidia oder VIA auch viel zu schlecht dokumentiert).
Gruß,
Svenska