Der Plan des Tickets ist, eine Grundlage des Fensters zu schaffen aus mit dem weitergearbeitet, sowie erweitert werden kann und schonmal grundlegende Funktionalitäten zu bieten.
Zur Diskussion steht ob sowas wie die Swapchain und Events in der Window-Klasse gehandelt werden oder in dem eigentlichen Programm gehandelt werden soll.
Extensions + GLFW
Fenster erstellen
simpler Eventpoll, damit man das Fenster schließen kann
Beim Verändern der Größe eines Fensters muss die Swapchain neu erzeugt und ersetzt werden. Ich würde tatsächlich raten, die Events von GLFW alle in separate Event-Handler zu überführen, so dass man sich kaum mit Pointern wie GLFWwindow* oder void* rumschlagen muss. Hilfreich dafür ist std::function um sich z.B. eine Liste an Lambdas oder Funktionen anzulegen, welche bei einem Event aufgerufen werden sollen.
Eine Frage zum VkSurfaceKHR und ob dieses in der Window-Klasse angelegt werden soll.
So wie ich das gerade gesehen habe ist das VkSurfaceKHR nur relevant für die Swapchain und kann auch erst für die Swapchain erstellt werden.
Da das VkSurfaceKHR und die Swapchain die Instance benötigt würde es deshalb erst nach dem Erstellen des Context erstellen. Der Context wiederum benötigt die Extensions für GLFW, deshalb würde ich vorschlagen, das glfwInit() in die Window-Klasse zu legen, welche vor dem Context aufgerufen werden sollte.
-> nicht aufrufen würde bedeuten, dass man Offscreen-Rendering machen möchte oder sollte das glfwInit() immer in der Context-Klasse aufgerufen werden?
Das war auch so eine Sache, worüber @kkraemer4 und ich uns Gedanken gemacht haben. Eventuell könnte man auch in der create Funktion vom Context einen bool mitgeben, z.B. bool enableWindow. Falls diese Variable auf true steht, könnten wir das auch so machen, dass dann die Window class gecalled wird und dabei GLFW initialisiert und weitergibt. Über das Window könnten wir dann die benötigten Extensions getten und dann der Instance übergeben. Wir waren uns noch unsicher, wie viele Argumente man der create Funktion mitgeben sollte ^^; Im Grunde genommen, würde das bisher nicht wirklich viel an unserem Code ändern. Man hätte dann wie ein windowInit(), welches dann die Window class aufruft und GLFW initialisiert. Jeglicher Rest würde dann in der Window class passieren, I guess. :)
Ich find die Idee des Einbinden sehr gut, da es alle Probleme löst die ich mit dem Konzept habe.
Da das VkSurfaceKHR unabhängig ist kann man das hervorragend trennen.
Ich würde vorschlagen Aufrufe wie glfwInit() und andere globale Initialisierungen auszulagern in eine Funktion, die nicht Instanz-abhängig ist. Also möglichst weder bei Erzeugung eines Fensters noch bei Erzeugung eines Contextes. Ansonsten bräuchte man da definitiv noch eine Sicherung, dass es bloß einmal aufgerufen wird.
Es sollte auch überprüft werden, ob die Initialisierung erfolgreich ist.
Vielleicht eine CoreManager-Datei nur mit globalen Funktionen. Die würden wir dann nicht in die Client-side API einbinden. Also am besten diese auch nur in den Source-Files includen, statt in den Headern.