tx00100xt / SeriousSamClassic-VK

Open source game engine version developed by Croteam for Serious Sam Classic with Vulkan support (Windows, Linux, FreeBSD, OpenBSD, macOS, Raspberry Pi OS). Based on https://github.com/sultim-t/Serious-Engine-Vk and linux port https://github.com/icculus/Serious-Engine
GNU General Public License v2.0
101 stars 12 forks source link

raspberry pi #3

Closed xboxones1 closed 2 years ago

xboxones1 commented 2 years ago

Предложенный патч для raspberry pi никак не повлиял на сборку кода, ошибка в Timer.cpp. Попробовал заменить из репы ptitSeb, версия без вулкана собралась и работает, а вот версия с вулканом собралась, но не работает, ошибка сегментирования.

Running Run Serious Sam TFE Classic (Lock 60fps)
STUBBED: load window icon in /home/user/SeriousSamClassic-VK/SamTFE/Sources/SeriousSam/MainWindow.cpp, line 172.
STUBBED: Need SDL invisible window or something in /home/user/SeriousSamClassic-VK/SamTFE/Sources/SeriousSam/MainWindow.cpp, line 353.
STUBBED: !!! FIXME: get the code back in from Ryan's original port. in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp, line 928.
STUBBED: Report actual SDL device name? in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Sound/SoundLibrary.cpp, line 269.
STUBBED: co-opt the existing T-buffer support for multisampling? in /home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Graphics/SDL/SDLOpenGL.cpp, line 113.
./run_game.sh: строка 13: 23434 Ошибка сегментирования                   "./SeriousSam"
tx00100xt commented 2 years ago

Желательно взглянуть на лог сборки с патчем где-нибудь на pastebin. И на лог игры при старте игры с vulkan, он тут: .local/share/Serious Engine/serioussam/SeriousSam.log И желательно запустить с gdb, будет видно где происходит сегфолт. Информации из консоли явно недостаточно.

tx00100xt commented 2 years ago

Чтобы не использовать Timer.cpp из ptitSeb вот патч. (вложение rpi4.patch.txt). Если с ним соберется то сделаю commit. Понять что не так с первым патчем можно только увидел лог сборки. Не забываем указывать -DRPI4=TRUE при сборке

xboxones1 commented 2 years ago

Нет с этим патчем тоже не собирается. Лог сборки где-то сохраняется? (Пробовал выводить в файл, но там минимум информации) При сборке скопировал:

[ 46%] Building CXX object CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:97:4: error: #error Please implement for your platform/compiler.
   97 |   #error Please implement for your platform/compiler.
      |    ^~~~~
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:146:6: error: #error "Unsupported compiler"
  146 | #    error "Unsupported compiler"
      |      ^~~~~
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/Pendulum.cpp.o
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp: In function ‘__int64 ReadTSC()’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:99:1: warning: no return statement in function returning non-void [-Wreturn-type]
   99 | }
      | ^
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/Pipebomb.cpp.o
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…
[ 47%] Building CXX object CMakeFiles/Entities.dir/Entities/PlayerActionMarker.cpp.o
make[1]: *** [CMakeFiles/Makefile2:261: CMakeFiles/Engine.dir/all] Ошибка 2
make[1]: *** Ожидание завершения заданий…
tx00100xt commented 2 years ago

97 | #error Please implement for your platform/compiler. 146 | # error "Unsupported compiler"

Значит не сработал ключ -DRPI4=TRUE, Патчи то сделал, а место для второй переменной в build-linux64.sh забыл добавить. Надо в build-linux64.sh строчку: cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. $1

заменить на cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. $1 $2

и попробовать собрать с первым патчем а потом со вторым.

xboxones1 commented 2 years ago

С первым патчем ошибка:

/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp: In function ‘void cpu_rdtsc(uint64_t*)’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Timer.cpp:164:25: error: ‘сс’ was not declared in this scope
  164 |     *result = (uint64_t)сс;
      |                         ^~
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…
[ 46%] Building CXX object CMakeFiles/Entities.dir/Entities/ModelHolder.cpp.o
[ 46%] Building CXX object CMakeFiles/Entities.dir/Entities/MovingBrush.cpp.o
make[1]: *** [CMakeFiles/Makefile2:261: CMakeFiles/Engine.dir/all] Ошибка 2
make[1]: *** Ожидание завершения заданий…

Он скорее всего актуален для armhf.

Со вторым собралось без проблем, но опять же вываливается в Ошибку сегментирования

tx00100xt commented 2 years ago

Лучше бы конечно с первым патчем. Компилятор ругается что "cc" вне зоне видимости

А сегфолт происходит, потому что vulkan не запускается, и идет попытка запуска в режиме OpenGL с неправильным созданием окна для OpenGL

Vulkan: Suitable physical device is present. Vulkan error: Can't create VkDevice. Vulkan error: Init Driver Vulkan Error! Нельзя установить требуемый режим дисплея!

Trying recovery mode 0... Starting display mode: 640x480xdesktop (Оконный режим) Multimonitor is not supported on this platform. SDL: CreateWindow with flag (SDL_WINDOW_VULKAN) Done. OpenGL context creation: The specified window isn't an OpenGL window

Это я профиксирую, а вот почему не создаётся VkDevice, это уже другой вопрос

tx00100xt commented 2 years ago

С первым патчем ошибка:

Ясно - сс написано по русски :). Я подсветил синтаксис и увидел что все сс на английском а *result = (uint64_t)сс;

на русском. Да и такое бывает. То есть надо просто прописать в этом месте точно английские сс, и попробовать снова

Сегфолт должен исчезнуть https://github.com/tx00100xt/SeriousSamClassic-VK/commit/f0f520ddcfdd9cb186546b6c72c28dfc34e06a94

xboxones1 commented 2 years ago
[ 41%] Building CXX object CMakeFiles/Entities.dir/Entities/Fishman.cpp.o
{стандартный ввод}: Сообщения ассемблера:
{стандартный ввод}:106: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,2»
{стандартный ввод}:113: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x3,c9,c12,0»
{стандартный ввод}:117: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,1»
{стандартный ввод}:128: Ошибка: неизвестная мнемоника «mrc» — «mrc p15,0,x1,c9,c13,0»
{стандартный ввод}:1003: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x1,c9,c12,2»
{стандартный ввод}:1010: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x2,c9,c12,0»
{стандартный ввод}:1014: Ошибка: неизвестная мнемоника «mcr» — «mcr p15,0,x1,c9,c12,1»
{стандартный ввод}:1025: Ошибка: неизвестная мнемоника «mrc» — «mrc p15,0,x0,c9,c13,0»
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp: In member function ‘virtual void CTFileStream::Read_t(void*, SLONG)’:
/home/user/SeriousSamClassic-VK/SamTFE/Sources/Engine/Base/Stream.cpp:1040:8: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 1040 |   fread(pvBuffer, slSize, 1, fstrm_pFile);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/Engine.dir/build.make:539: CMakeFiles/Engine.dir/Engine/Base/Timer.cpp.o] Ошибка 1
make[2]: *** Ожидание завершения заданий…
tx00100xt commented 2 years ago

Понятно, тогда добавлю второй патч следующим коммитом. Готово https://github.com/tx00100xt/SeriousSamClassic-VK/commit/c8b89070fde991a45434cbd0f988244ac3aaf7b8 https://github.com/tx00100xt/SeriousSamClassic/commit/f4e66dce65fc3cc0c645cf67213f4f1caf9945a8

xboxones1 commented 2 years ago

Да, теперь запускается, но на vulkan не переключается.

tx00100xt commented 2 years ago

Ошибка в логе

Vulkan error: Init Driver Vulkan Error! Нельзя установить требуемый режим дисплея!

вот здесь стопорится vkCreateDevice

Для того чтобы было больше информации нужно собрать с SVK_ENABLE_VALIDATION 1 и посмотреть что в логе игры. Проще сделать так, в файле SamTFE/Sources/Engine/Graphics/Gfx_Vulkan.cpp заменить

ifndef NDEBUG

define SVK_ENABLE_VALIDATION 1

else

define SVK_ENABLE_VALIDATION 0

endif // !NDEBUG

на

ifndef NDEBUG

define SVK_ENABLE_VALIDATION 1

else

define SVK_ENABLE_VALIDATION 1

endif // !NDEBUG

Пересобрать, запустить игру, а здесь прикрепить лог игры.

tx00100xt commented 2 years ago

Вроде ничего нового.

Новое есть. Уже тут ошибка Vulkan error: Can't create instance.

Что раньше, чем vkCreateDevice. Vulkan Validation layer: loader_validate_layers: Layer 2 does not exist in the list of available layers

надо строчку
gl_VkLayers[2] = "VK_LAYER_MANGOHUD_overlay";

в Gfx_Vulkan.cpp закомментировать при SVK_ENABLE_VALIDATION 1, и
gl_VkLayers.New(3);

на пару строк вверху заменить на
gl_VkLayers.New(2);

тогда не должно обрываться на создании vkCreateInstance.

Я добавил код для вывода ошибки при вызове vkCreateDevice https://github.com/tx00100xt/SeriousSamClassic-VK/commit/f92e991e22f58fe95f89b295e3e883d4cd60b699 Теперь в логе игры должна прописаться возвращаемая ошибка. И убрал VK_LAYER_MANGOHUD_overlay из validation layers https://github.com/tx00100xt/SeriousSamClassic-VK/commit/95c69ce0070ba57c0ac1e0ee2b2d30c88f95a110 Можно пересобрать и посмотреть на результат, Вывод с SVK_ENABLE_VALIDATION 1 должен по идее быть информативным. Потом выставить SVK_ENABLE_VALIDATION 0 и посмотреть что выдаст в лог vkCreateDevice Если будет видна возвращаемая ошибка https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDevice.html то от этого уже можно будет отталкиваться.

tx00100xt commented 2 years ago

Из vulkan.txt видно, что установлены два драйвера

driverName = llvmpipe driverName = V3DV Mesa

У меня тоже установлено два драйвера RADV и AMDVLK. Я могу запустить SeriousSam с любым из них. $ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.x86_64.json (RADV) или $ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/amd_icd64.json (AMDVLK) С обоими драйверами SeriousSam работает одинаково хорошо. В новой версии драйвера еще проще AMD_VULKAN_ICD=RADV или AMD_VULKAN_ICD=AMDVLK

Посмотреть какой драйвер запускается по дефолту можно просто $ VK_INSTANCE_LAYERS=VK_LAYER_MESA_overlay vkcube Mesa overlay покажет информацию.

Далее смотрим vulkan.txt и видим

Device Extensions: count = 67

для llvmpipe Device Extensions: count = 44

для V3DV Mesa

Смотрим VALIDATION.0.log или VALIDATION.1.log

Vulkan: --- found 44 device extensions ---

Делаем вывод что выбрался V3DV Mesa

Смотрим ошибку VkCreateDevice в VALIDATION.0.log или VALIDATION.1.log

Vulkan error: VK_ERROR_FEATURE_NOT_PRESENT!

https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDevice.html#_description If any requested feature is not supported, vkCreateDevice must return VK_ERROR_FEATURE_NOT_PRESENT Support for features can be checked by querying vkGetPhysicalDeviceFeatures.

Смотрим SvkUtils.cpp, BOOL SvkMain::PickPhysicalDevice() Видим вызов vkGetPhysicalDeviceFeatures(physDevice, &gl_VkPhFeatures); Устройств два, VALIDATION.0.log Vulkan: Physical Devices Count: 2

Потом видим что глобальная структура gl_VkPhFeatures не используется в Gfx_Vulkan.cpp vkCreateDevice а видим фиксированные

VkPhysicalDeviceFeatures features = {}; features.samplerAnisotropy = VK_TRUE; features.depthBounds = VK_TRUE;

createInfo.pEnabledFeatures = &features;

Смотрим опять vulkan.txt для llvmpipe

VkPhysicalDeviceFeatures: samplerAnisotropy = true depthBounds = false

для V3DV Mesa

VkPhysicalDeviceFeatures: samplerAnisotropy = true depthBounds = false

Решение: Первое(универсальное) - создать структуру VkDeviceCreateInfo createInfo с использованием gl_VkPhFeatures, тут следует учесть количество Device, и немного переписать код. Второе - прописать VkPhysicalDeviceFeatures для Rsperry Pi из vulkaminfo для V3DV.

Первый вариант я сделаю попозже, когда появиться время. Патч для второго варианта приложен. Думаю теперь vkCreateDevice отработает корректно. rpi4_vilkan_features.patch.txt

xboxones1 commented 2 years ago

Vulkan заработал, но производительноть к сожалению хуже чем на OpenGL. Я думал будет наоборот куда веселее, но в любом случае круто.

tx00100xt commented 2 years ago

По разному бывает. Конкретно у меня на встройке Vega7 на windows тоже медленней, а на linux одинаково, что vulkan - что opengl. А кто-то в теме linux.org.ru написал что на rx580 vulkan у него гораздо быстрей чем opengl на SeriousSam.

Я пока не буду закрывать issue, когда доделаю нормальное определение VkPhysicalDeviceFeatures - закрою

tx00100xt commented 2 years ago

Готово, сделал универсальный вариант https://github.com/tx00100xt/SeriousSamClassic-VK/commit/40bfc9a0cebc5a49a371d99d1164502f2de28b7f