Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Apr 28, 2024 23:02

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Sa Mär 16, 2024 13:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich wollte dieses kleine Demo ausprobieren.
https://github.com/abflett/SDLVulk
Nur da scheitert schon cmake.

Daher habe ich es manuell zu kompilieren versucht, was ich mit ein paar kleinen Änderungen hingekriegt habe.
Code:
  1. g++ main.cpp -o vulkan_demo -lSDL3 -lvulkan


Einzig was ich geändert habe ist folgendes:
Code:
  1. //    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
  2.     if (SDL_Init(SDL_INIT_VIDEO) < 0)
  3. ..
  4. //                         SDL_WindowFlags::SDL_WINDOW_VULKAN);
  5.                          SDL_WINDOW_VULKAN);
Und ein paar printf eingefügt un zus schauen wo es knallt.


Hier ist die Stelle wo es knallt.
Code:
  1. printf("vorher\n");
  2.     if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS)  // Knall
  3.     {
  4. printf("in if\n");
  5.         std::cerr << "Failed to create Vulkan instance!" << std::endl;
  6.         SDL_DestroyWindow(window);
  7.         SDL_Quit();
  8.         return EXIT_FAILURE;
  9.     }
  10. printf("nachher\n");

Ich muss in diesem Befehl passieren: vkCreateInstance(...);

So sieht die Fehlermeldung aus:
Code:
  1. $ ./vulkan_demo
  2. Creating Vulkan instance...
  3. vorher
  4. Speicherzugriffsfehler (Speicherabzug geschrieben)


Einer eine Idee woran es liegen könnte ?

Im Anhang die geänderte main.cpp

PS: SDL3 ist bei mir in /usr/local instaliert und funktioniert auch, wen kein vulkan verwendet wird. OpenGL Sachen laufen.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Mi Mär 20, 2024 07:12 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3827
Wohnort: Tespe (nahe Hamburg)
Klingt für mich eher nach einem Problem mit Vulkan selbst bzw. der Grafikkarte. Funktionieren den andere Vulkan-Anwendungen bei Dir? Was für eine Grafikkarte bzw. Treiber hast Du auf dem System drauf? Funktioniert "vulkaninfo" und liefert etwas sinnvolles zurück?

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Mi Mär 20, 2024 08:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Klingt für mich eher nach einem Problem mit Vulkan selbst bzw. der Grafikkarte. Funktionieren den andere Vulkan-Anwendungen bei Dir?

Es gibt Demo, die ich zum laufen kriegte.

Zitat:
Was für eine Grafikkarte bzw. Treiber hast Du auf dem System drauf? Funktioniert "vulkaninfo" und liefert etwas sinnvolles zurück?

Siehe Anhang


Was ich noch sagen muss, ich hatte mal bei einem funktionierenden C++ Beispiel versucht, diese abzuändern, so da was in der main() stand, als lib zu exportieren. Diese lib habe ich dann versucht mit FPC einzubinden. Aber da gab es dann auch mitten in der Inizialisation einen Speichercrash.
Somit war mein Gedanke, das es an einem Speichermodell lag.

Daher könnte ich mir vorstellen, das mit cmake etwas anderes eingestellt wird, als beim direkten Aufruf mit gcc.

PS:
Ich habe noch folgendes in der CMakeLists.txt gefunden.
Code:
  1. add_executable(game main.cpp)
  2. target_link_libraries(game PRIVATE external)
  3.  
  4. if (MSVC)
  5.     target_compile_options(game PRIVATE /W3 /sdl /external:anglebrackets /external:W2 /wd4068)
  6. else ()
  7.     target_compile_options(game PRIVATE -Wall -Wextra -Wpedantic -isystem)
  8. endif ()

Daher habe ich noch folgendes probiert:
Code:
  1. g++ main.cpp -o vulkan_demo -lSDL3 -lvulka  -Wall -Wextra -Wpedantic
und
Code:
  1. g++ main.cpp -o vulkan_demo -lSDL3 -lvulka  -Wall -Wextra -Wpedantic -isystem
  2.  
Das erste wird kompiliert, aber der SIGSEV bleibt.
Und das zweite geht gar nicht "g++: error: missing path after ‘-isystem"


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Mi Mär 20, 2024 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Nachtrag:
Ich habe es hingekriegt, das diese Demo mit cmake läuft. Somit ist alle im originalen, inklusive der SDL3 Bibliothek.

Aber der Fehler kommt immer noch.
Code:
  1. $ ./game
  2. Creating Vulkan instance...
  3. Speicherzugriffsfehler (Speicherabzug geschrieben)


Ich mache mal eine Issues beim Autor, vielleicht hat der eine Rat. Es könnte auch sein, das es bei ihm auch nicht läuft.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 05:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ändere mal zeile 77 in main.cpp von dem:

Code:
  1. VkInstanceCreateInfo createInfo{};


zu dem:

Code:
  1. VkInstanceCreateInfo createInfo = {};


Ich hab es nicht ausprobiert ob es hilft weil ich den code grad nur am Handy anschauen kann, aber evtl. könnte es helfen .. wobei ich bin mir nicht sicher ob da wirklich ein unterschied ist.

Wenn das nicht hilft, dann versuch das struct manuell zu nullen in der Zeile danach:

Code:
  1. VkInstanceCreateInfo createInfo = {};
  2. memset(&createInfo, 0, sizeof(VkInstanceCreateInfo));


EDIT: Und das gleiche mit dem VkApplicationInfo struct weiter oben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe es abgeändert, Der Speicherzugriffsfehler bleibt immer noch. :(

Code:
  1.     //    VkApplicationInfo appInfo{};
  2. VkApplicationInfo appInfo = {};
  3. memset(&appInfo, 0, sizeof(VkApplicationInfo));
  4. ...
  5.     //    VkInstanceCreateInfo createInfo{};
  6. VkInstanceCreateInfo createInfo = {};
  7. memset(&createInfo, 0, sizeof(VkInstanceCreateInfo));

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Wäre auch zu einfach gewesen, haha .. :)

Ein anderes Problem das ich in dem code sehe ist, es initialisiert den extensions array mit einer größe von 'extensionsCount', aber dann füllt diesen nie.

Später wird dann noch eine extension separat hinzugefügt.

Das bedeutet das vkCreateInstance aufgerufen wird mit z.B. 10 extensions, aber 9 davon sind invalid pointer.

Um es einfach zu testen, rufe mal extensions.clear() auf bevor der zeile wo die einzelne surface extension push_back'ed wird.

Alternativ musst du rausfinden wie du mit SDL die extensions bekommst um sie in den array hinzuzufügen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 18:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ich hab grad mal gegoogled, hier ist die dokumentation für SDL_Vulkan_GetInstanceExtensions.

Die Funktion returned die liste der extensions die benötigt werden.

Also würde ich diesen ganzen code block:
Code:
  1.  
  2.     uint32_t extensionCount = 0;
  3.     if (!SDL_Vulkan_GetInstanceExtensions(&extensionCount))
  4.     {
  5.         std::cerr << "Failed to get Vulkan instance extensions count: " << SDL_GetError() << std::endl;
  6.         SDL_DestroyWindow(window);
  7.         SDL_Quit();
  8.         return EXIT_FAILURE;
  9.     }
  10.  
  11.     std::vector<const char *> extensions(extensionCount);
  12.     if (!SDL_Vulkan_GetInstanceExtensions(&extensionCount))
  13.     {
  14.         std::cerr << "Failed to get Vulkan instance extensions: " << SDL_GetError() << std::endl;
  15.         SDL_DestroyWindow(window);
  16.         SDL_Quit();
  17.         return EXIT_FAILURE;
  18.     }
  19.  
  20.     // Add the VK_KHR_win32_surface extension
  21.     extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
  22.  
  23.     VkInstanceCreateInfo createInfo{};
  24.     createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  25.     createInfo.pApplicationInfo = &appInfo;
  26.     createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
  27.     createInfo.ppEnabledExtensionNames = extensions.data();
  28.  


ändern zu:

Code:
  1.  
  2.     uint32_t extensionCount = 0;
  3.     const char** extensions = SDL_Vulkan_GetInstanceExtensions(&extensionCount);
  4.     if (!extensions)
  5.     {
  6.         std::cerr << "Failed to get Vulkan instance extensions: " << SDL_GetError() << std::endl;
  7.         SDL_DestroyWindow(window);
  8.         SDL_Quit();
  9.         return EXIT_FAILURE;
  10.     }
  11.  
  12.     VkInstanceCreateInfo createInfo{};
  13.     createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  14.     createInfo.pApplicationInfo = &appInfo;
  15.     createInfo.enabledExtensionCount = extensionCount;
  16.     createInfo.ppEnabledExtensionNames = extensions;
  17.  



Habe nichts davon getestet, also evtl. sind compile Fehler drin etc. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe nun die Zeilen ausgetauscht, es gab aber ein Syntax-Fehler.

Code:
  1. // Alt
  2.  const char** extensions = SDL_Vulkan_GetInstanceExtensions(&extensionCount);
  3. // Neu
  4.     char const* const*  extensions;
  5.     extensions = SDL_Vulkan_GetInstanceExtensions(&extensionCount);


Jetzt läuft es ein wenig weiter und bleibt hier stecken.
Code:
  1. Failed to create Vulkan surface: The specified window isn't a Vulkan window


Aber jetzt habe ich was viel gravierenderes gesehen, auch wen keine Fehler mehr kommen, mit dem Programm wird man niemals ein Dreieck sehen, da hier noch ein ganzer Block fehlt mit Shader, etc.
Das ich dies vorher nicht gesehen habe. :roll:
Ich habe mich wohl viel zu fest auf den Speicherfehler konzentriert.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vulkan Demo Source mit SIGSEV
BeitragVerfasst: Fr Mär 22, 2024 19:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Das klingt nach einem SDL spezifischem error. Die dokumentation für SDL_Vulkan_CreateSurface sagt dass das Fenster mit dem SDL_WINDOW_VULKAN flag erzeugt sein muss. Aber das wird es soweit ich sehen kann.

Evtl. hat der original author doch absichtlich die VK_KHR_WIN32_SURFACE_EXTENSION_NAME extension manuell hinzugefügt? Vielleicht wird die aus irgendeinem Grund von der SDL Funktion nicht mit returned?

Du kannst versuchen die extensions die du von SDL bekommst manuell in ein eigenes array zu kopieren und dann noch die VK_KHR_WIN32_SURFACE_EXTENSION_NAME mit hinzufügen - evtl. klappt es dann :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.034s | 17 Queries | GZIP : On ]